「映像も物理も、微分可能になるとすごいことが起きる」ということの意味を文系にもわかるように説明しようと試みる
2021.07.26
Updated by Ryo Shimizu on July 26, 2021, 07:12 am JST
2021.07.26
Updated by Ryo Shimizu on July 26, 2021, 07:12 am JST
最近のプログラミングの新しい波は微分可能プログラミング(differentiable programming)である。
微分可能プログラミングとは、簡単に言うと・・・と思ったが、簡単に言うのは結構難しい。
まず「微分」という言葉があまり簡単ではない印象がある。
まずは微分と積分の関係性を説明しておこう。文系の読者に向けた記事であるので、非常にざっくりと説明してみよう(そのかわり、元々数学が得意な読者にとっては直感的ではない説明になるかもしれない)。
まず、瓶からコップにジュースを移すような状況を想定してみる。
瓶からコップが一杯になるまで60秒で注ぐとしよう。
その時、ある時点でコップが満たされた割合をaと呼ぶことにする。
aは、60秒後に100%になる。
コップに注がれたジュースの割合aはいきなり100%になることはなく、瓶から少しずつ注がれる。このグラフを見ると、最初は瓶の傾け方が甘くて少しずつ慎重に入れていたが、中盤で一気に勢いよく瓶に注ぎ、最後に少し慎重に調整するようにコップが満たされていることがわかる。
この時のaは、「その時点で積分された値」である。
しまった。これでもよくわからなくなってしまう。
もう少し、情緒的に理解できるように試みてみよう。
というか、実の所、「微分」と「積分」という日本語が話をややこしくしてる可能性が高い。
微分は英語では「differential」であり、積分は英語では「integral」だ。微分と積分と言う単語は元々日本語にはなく、数学の概念とともに輸入された言葉である。
differentialは言うまでもなく「difference(違い/差分)」から来ている言葉で、ともにラテン語の「differentia(違い)」を語源として持つ。
コップにジュースを注ぎ始めてから、45秒時点でコップ全体がどのくらい満たされているか、つまり0秒時点から45秒時点でコップ全体がどのように満たされているかは、グラフを見れば、95%程度だと読み取れる。
これは、0秒から45秒まで、一度に注ぐ量(注ぐ速度)は変化しながらも、45秒時点のコップの満たされた割合は結局「全体で95%」である、という結果を「積分された値」と呼ぶのである。
積分、つまりintegralとは、「全体」と言う意味だ。似た英単語では「integrate(統合)」と言う言葉の仲間であると考えると捉えやすいだろうか。
「インテグレート」は、たとえばSI(System Integrater)にも使われているし、半導体大手Intelの由来も「Integrated Electronics」であるといえば少しイメージが湧きやすいだろうか。
では微分とは何か?
微分(differential)とは、別の訳を当てれば「差分」なので、「ある時点とある時点の差分」を指す。
たとえば30秒時点から45秒時点のコップに注がれたジュースの割合aの微分(differential)はどうだろうか。
このグラフでは45秒時点で95%、30秒時点で60%なので、この区間の微分を取ると35%と言うことになる。
「それを知ってどうするの?」
と混乱する前にもう少し我慢して読んでほしい。
この例では、重要な性質が一つある。それは、我々の世界は積分的にしか観測不可能であり、微分とは、過去に向かってしかできないと言うことだ。
たとえば、30秒の時点で、その先の未来がどうなるかは誰にもわからない。
30秒の時点で、45秒と30秒の間の微分を取ることはできない。当たり前だ。もしかしたらこのジュースがどこかで詰まるかもしれない。瓶を誤って落としてしまうかもしれない。何が起きるかわからない。
唯一できるとすれば、注いでいる人間が「このペースをもう少し維持しよう」という未来への意志を持つことくらいである。
この前提では、60秒で100%満たせばいいわけだから、この時点で注ぐスピードを緩めても全く問題ない。あるのは、「未来へのイメージ」だけで、未来へのイメージを具体的に描くことができれば、「未来の記憶」から過去である現在へと微分することで自分の果たすべき振る舞い、つまり今どのくらいのスピードで注げばいいのか調整できる。
つまり、「未来から現在へ微分可能ならば今どうすればいいのかわかる」ということでもある。
これまでのコンピュータにおけるプログラミング言語は構造的に微分不可能だった。
少なくとも微分されることを想定して作っていなかった。
数値は常に演繹的に変化し、一方通行だった。
たとえば、a+b=cという状況の時、cの時点で、なぜcがその値なのか後から知ることはできなかった。
そんなことに意味があるとは誰も思っていなかったのだ。
ところが、たとえばcは本来、dであってほしいと言う「あるべき未来の記憶」があったとする。その時、cとdの間には理想と現実の「差分(difference)」が生まれる。
この差分をもとに、計算の過程を逆戻りして、少しずつ原因を探り、cとdの差分を小さくするのが微分可能プログラミングと言うパラダイムの正体だ。
ディープラーニングにおいては、この「微分可能」という性質を最大限に用いる。
この計算プロセスは、メモリと計算能力の許す限り、いくらでも連鎖させることが可能で、かつ、逆戻りできる。
たとえば、画像を入力して、途中にランダムな数値パラメータによるネットワークを置き、最後に出力された数値と、本来欲しかった数値の差分を取り、逆伝搬させて諸々の数値を調整する、と言うのがディープラーニングの根本的な原理である。
元々、微分可能プログラミングというのは、ディープラーニングの副産物であった。したがって、これまでは微分可能プログラミングの適用範囲は、ニューラルネットワークの中だけに制限されているのが普通だった。
しかしここ数年で、ニューラルネットという範囲を超えた、「微分可能な○○」が次々に登場している。
たとえばFacebookのPyTorch3Dは、微分可能な3Dレンダラーを提供する。
本来、コンピュータグラフィックスの世界でしか用いられないレンダラー(レンダリングエンジン)を微分可能にするとどうなるか。
これまで、コンピュータグラフィックスでは、ものの形(メッシュ)や色(マテリアル)、カメラの位置やライティングなどは、全て「先に決めて」積分的にしか表現できなかった。
しかし、微分可能なレンダラーを使うと、最終的な画像イメージから「あるべき理想の画像」との差分を逆算し、元の形状を変更して理想的な形状に近づけることができる。
これを繰り返すと、下図のアニメーションのように、単純な球形からスタートして微調整を重ねていくことで理想とする形に持っていくことができる。
また、GoogleのBRAXは、微分可能な物理シミュレーションを提供する。
応用例として示された例はまだ少ないが、これまでの単純な強化学習とは異なり、物理シミュレーションにおける微分可能性とは形状そのものの進化や変化を促す可能性がある。
また、柔らかい物体や液体のシミュレーションも、微分可能にするDiffTaichiというシミュレータもあり、TensorFlowの188倍高速なシミュレーションができるケースもあるという。
たとえば微分可能な流体シミュレータならば、増水が起きた時に守りたい場所を守るためにはどのように水門や堤防を設計するかといったことまで遡及して求めることができる可能性がある。もしくはもっと効率的なプロペラやオールなどの設計、もっと汚れが落ちるスポンジや、もっと楽に走れるスニーカーの設計なんかもできるかもしれない。
微分可能プログラミングの研究はまだ始まって数年の若い分野だが、これが後々大きなインパクトを生む可能性は高い。
筆者がいくつかの微分可能プログラミングのフレームワークを触ってみて感じたのは、人間にとって微分と言う道具は非常に非力であるということだった。
ある数式を微分することによってより複雑な数式の性質の一部を垣間見ることはできるが、それによってわかることは本当にごく一部であって、「わかる」のがせいぜいで、そこから何か具体的なアクションにつなげていくと言うのは絶望的に大変だった。
ところが微分可能プログラミングによって、「理想と現実の差分」をもとに膨大なパラメータを逆算していくことで、我々自身が理解の及ばない構造までをも探索し、「わかる」と言う段階を超えて「理想に近づける」と言うことまでもが自動化できることが確かめられた。
すると、非常に簡単に言えば我々の世界を構成する様々な道具、たとえばハサミやカッターや包丁やカバンや靴やノートや鉛筆やメガネといったごく身近な「構造を利用した道具」の形状が大きく変化する可能性がある。
この「構造の変化による劇的な効果の改善」は、これまで、人類は「一瞬のひらめき」などといった極めて不確かなものに頼って進めてきた。
たとえば缶詰が発明されてから缶切りが発明されるまでに半世紀を必要としたのも、「缶詰」の利便性は認められたものの、それを簡単に開けることができる価値の高さは認められていなかったからだ。
そうした「一瞬のひらめき」が合っているのか間違っているのか、それを作るべきか作るべきでないのかと言う判断をするためには相応のコストがかかるため、おそらく日の目を見ない発明品のほうが圧倒的に多いはずである。
それは、人間は根本的に「積み上げられた(積分された)量しか測ることができず、過去に向かってしか微分できず、しかもざっくりとした微分しかできない」という欠点を持っているからだ。
しかし、物理エンジンやレンダリングエンジンが微分可能になるということは、数値シミュレーション可能なものは原理的に全て微分可能にすることができることを示唆している。
ということは、これまでシミュレータは、もっぱら仮説を検証するために使われていたのだが、シミュレータを微分可能にすることによって、シミュレーションの仮説そのものを微調整し、あるべき理想の姿に近づけていくことができるようになるだろう。
おすすめ記事と編集部のお知らせをお送りします。(毎週月曜日配信)
登録はこちら新潟県長岡市生まれ。1990年代よりプログラマーとしてゲーム業界、モバイル業界などで数社の立ち上げに関わる。現在も現役のプログラマーとして日夜AI開発に情熱を捧げている。