この記事は、NTTコミュニケーションズ Advent Calendar 2019の18日目の記事です。
昨日は @yusuke84 さんの記事、Hoge Fuge でした。
はじめに
会社のAdvent Calendarということで、当初はある程度流れに忖度して技術的なTipsを書こう!
とか考えて、Neural Networkについてネタ探ししてたのですが、結局自分が興味のある話、それも実装よりも理論一辺倒な話に落ち着いてしまった、本記事はそんな成れの果てです。
(まあ1人くらい暴走しても良いですよね、きっと)
というわけで、Neural Networkを用いた物理系の表現について、少し前から気になってる話をツラツラと書いていきます。そのうちに、この辺の話を端緒に新規性のある手法を論文化するから、それ相応の評価を会社から頂戴したい、そんなことを妄想しております。(チラッ
おまえ誰やねん!?
普段は技術開発部でデータサイエンス&AIに資する基礎技術を研究開発している入社2年目社員です。
本垢(ほぼROM専)の方が汚染されているため、こちらの垢@BootCamp_2019からの投稿です。
こちらの垢名から察するに、弊社の社内研修である「BootCamp」の、本年度データサイエンス&AIコースの講師をしていました。
あとはコトあるごとに「統計検定1級」「数学検定1級」とか、研究業界では差して役に立たない資格を見せびらかしてるアイツです。
会社では多変量時系列解析、スパース推定、要因分析などをメインに研究開発していますが、個人的には非線形力学、縮約理論、情報統計力学とかが好きです。
本記事も結果的に個人の趣味に立脚したものになってしまいました。(てへぺろ
モチベ
最近、いえ少し前から、様々な分野でDeep Learningの応用が議論されるようになってきました。
これは大変喜ばしいコトで、元々数理科学の理論系にいた自分にとってはDeep Learningに本腰を入れる素晴らしいモチベーションになります。
異分野で大切にされている理論やスキームをDeep Learningに取り込むことは、一部で幻滅期に入ったと噂?されるDeep Learningに新しい風を取り込むことと同義であり、多くの視点で次の進化を模索することは素敵なことだと思います。
本記事は、その辺を少し共感して欲しくて書いたものです。
できるだけ平易なモデルと説明でまとめたつもりなので、雰囲気面白いと思ってもらえればありがたいです。
(よく知ってる方は、ぜひ多体位相振動子モデルのHamilton力学を教えてください。今一番気になっています。)
Neural Networkを使った力学系表現
Neural Networkと微分方程式
世界は微分方程式でできている。
例えば、高校物理で学ぶバネ単振動の運動方程式は以下のように記述されます。
(は質量、は加速度、はバネ定数、は物体の位置で、釣り合いの位置は原点の、シンプルな1次元運動を考えるとします。)
この先、実はもう少し深く掘り下げて学習すると、物体の速度は位置の1階時間微分であり、また加速度は速度の1階時間微分を意味することを学びます。すなわち、加速度は位置の2階時間微分を意味します。
これを位置が時間の関数であることを明示し丁寧に記述すると、先ほどの運動方程式は以下のように書き直すことができます。
微分方程式(Differential Equation)とは、未知関数とその導関数の関係式として記述される関数方程式のことです。バネ単振動の運動方程式もまさに微分方程式です。
より良い物理現象の理論的解釈には、より良い数学モデルが必要不可欠です。
微分方程式を用いることで、現実世界の現象を(何らかの仮定と近似に基づいて)数学の問題として定式化することができ、その問題の解の意味を解釈することで、元の現象それ自体に理論的な解釈を与えうるものです。
例えば、先ほどのバネ単振動を表現する微分方程式を数学的に解くと、以下のような解を得ます。
(ただし、は振幅、は初期位相で、いずれも初期位置と初期速度から決定されます。)
そしてこの解は、下図のように時間と位置の平面でプロットすると、実際の単振動の挙動と見事に一致することが見て取れます。
実は微分方程式を用いた数学モデルへの定式化は、何も物理現象のみが対象というわけではなく、生物、化学、政治、経済、社会といった多岐に渡る現象に有用です。
言い換えれば、世の中的な現象は意外すぎるほど微分方程式で表現でき、逆に妥当な微分方程式の発見は現象の理論的解釈と等価な問題と言うことができます。(夢を持って言い切って良いはず!)
とは言え、残念なことに日本の高等教育では、微分方程式の解き方は教えても、微分方程式の作り方はあまり教えられません。解くのは適当なツールを使えば誰でも簡単にできる一方、作るのは難しくよっぽど重要です。
微分方程式作りに興味のある方は、こちらの書籍3がおすすめです。応用例が非常に多く掲載され、モデル・ビルディングの訓練にも最適な良書です。
微分方程式とResNet
言い忘れましたが本記事で取り扱う微分方程式は、厳密には常微分方程式と呼ばれるグループです。しかし、常微分方程式が何たるか?は長くなるので他所に譲り、メンドくさいので以降も常微分方程式を微分方程式と連呼することとします。
さて、基本の1階微分方程式は一般に以下の形式で与えられます。
ところで微分は、その定義より以下の極限で求めることができます。
なので微分方程式の挙動を計算機でシミュレーションしたい場合、最も単純には以下のように時間を間隔で離散化して、離散時刻に基づいて数値計算を行います。
これを少し式変形します。
そして少々天下り的ですがと新しく置き直せば、最終的に以下のように表現することができます。
この形式、勘の良いディープラーニング術者はどこかで見たことありませんか?
実はこれ、じっと睨めば画像認識タスクで一世を風靡したResNet4と同じ形式の方程式と見ることができます。
逆にニューラルネットワーク側から、順を追ってこの方程式に辿り着いてみます。
以下はResNet4のFigure 2.から引用した図です。
任意のアーキテクチャの各層では、結局のところ何某かの入力に対して、線形変換(Afiine変換など)と非線形変換(活性化関数など)を適当に組み合わせて構成されている、柔軟な非線形変換を出力とし、次の層へ伝播しています。
図の中央鉛直矢印の伝播経路は、まさにこれを模式的に示しています。(図はReluとありますが、一般にはRelu以外も可です。)
ResNetの肝は右側の「 identity」と記載された伝播経路(迂回路)にあります。
詳細は原論文4に譲りますが、この伝播経路(迂回路)は恒等写像で、入力をそのまま出力に合流させます。
それにより、非常に層数の多いネットワークでも効率的に学習を進むことが知られており、その理由は誤差逆伝播が効率的に進むからではないかと考えられています。
ここで、番目ResNetブロックについて入力を、出力をとすると、先ほどの図は以下のように書き直すこともできます。
これはまさに、先ほど示した離散化された微分方程式そのものと同じ形式の方程式だと言えます。
より明示的に示せば微分方程式内のとResNetブロックのを対応させれば、わかりやすいと思います。
さらにResNetの一般化として知られるRevNet5では、各ブロックは以下のような対称的な構造をしています。
先ほどまでと同様の議論で考えれば、これは次の連立微分方程式を離散化したものとなっていることがわかります。
ここまでの議論から察するに、ResNet(あるいはRevNet)で全ての微分方程式を記述できるわけではないことに注意が必要です。
この辺の詳細は、最近巷を賑わせているこちらの書籍6が詳しいです。この書籍は非常に良書なので、ディープラーニングと物理学の深淵なる関係を探求したい方は、ぜひ手に取ってもらえたら嬉しいです。
特に本記事では議論の簡単化のために、ユニット数などについての考察を端折ったので、こちらの書籍などで詳細は確認してください。
ODENet (Neural Ordinary Differential Equations)
NeurIPS 20187のベストペーパーに選ばれたこちらの論文8は、まさに微分方程式で駆動される時間発展方程式とニューラルネットワークを結びつける画期的な手法を提案しています。なお著者実装がGithub9で公開されています。
ODENetでは、ResNetやRNNの隠れ層などの層毎の処理を、時間方向に連続極限を取った時間発展方程式と考え、それを(常)微分方程式として陽に解くことでニューラルネットワークを構築するお話です。
連続化することで、深層学習の層という概念がなくなり、メモリや計算量の効率が良く、またBack Propagationに相当する最適化として、(常)微分方程式のソルバーが使えるなど、様々な革新的な手法を提案しています。
こちらはODENet8のFigure 1.から引用した図です。左図は通常のResNetで離散的な時間発展を記述している一方で、右図のODENetでは連続的な時間発展を表現できている。もはや離散的な層の概念がなく、雰囲気矢印(ベクトル場)多いなあ、と感じていただけると完璧です。
他にも、 Normalizing Flow10(NF)を拡張した手法Continuous Normalizing Flow(CNF)で効率的に確率密度が学習できたり、潜在変数の時間発展を連続化することで時系列データを効率的に学習する手法が提案されています。
ODENetについての細かい理論説明はこちらのサイト111213がわかりやすいので、ぜひ参照してください。
余談ですが、このNormalizing Flow、同じ著者の別のレポジトリ14でコードが公開されています。実際にヘンテコな確率密度を構成してみると楽しいです。
例えば、我々をいつも暖かく見守ってくれるアイツの確率密度も、こんな風にわりときれいに求めることができます。