論文レビュー: Neural Ordinary Differential Equations
📂機械学習 論文レビュー: Neural Ordinary Differential Equations 概要および要約 「Neural Ordinary Differential Equations 」はRicky T. Q. Chenら3名が2018年に発表した論文であり、2018 NeurIPS Best Papers に選ばれた。以下のように簡単な1階常微分方程式 である非自律システム をニューラルネットワークで近似する方法を提案している。
d y d t = f ( y , t )
\dfrac{\mathrm{d}y}{\mathrm{d}t} = f(y, t)
d t d y = f ( y , t )
注目すべきは、ニューラルネットワークが近似(予測)するのはy y y ではなく、変化率f f f であるということだ。この式の両辺を0 0 0 から任意のT T T まで積分すると次のようになる。
y ( T ) − y ( 0 ) = ∫ 0 T f ( y , t ) d t ⟹ y ( T ) = y ( 0 ) + ∫ 0 T f ( y , t ) d t
y(T) - y(0) = \int\limits_{0}^{T} f(y, t) \mathrm{d}t \implies y(T) = y(0) + \int\limits_{0}^{T} f(y, t) \mathrm{d}t
y ( T ) − y ( 0 ) = 0 ∫ T f ( y , t ) d t ⟹ y ( T ) = y ( 0 ) + 0 ∫ T f ( y , t ) d t
したがって、f f f を正確に近似できさえすれば、任意のT T T に対してy ( T ) y(T) y ( T ) を得ることができる。
1 はじめに 下の図のように、等間隔の時間である8つのデータポイントから成る時系列データ が与えられているとする。
このような状況で、通常我々がやりたいことは、t 9 t_{9} t 9 、t 10 t_{10} t 10 、t 11 t_{11} t 11 、… \dots … に対するデータh 9 \mathbf{h}_{9} h 9 、h 10 \mathbf{h}_{10} h 10 、h 11 \mathbf{h}_{11} h 11 、… \dots … を予測することである。これを実現するための簡単に考えられる方法の一つは、残差ニューラルネットワーク、RNN 、ノーマライジングフロー などを使用して以下のようにモデリングするものである。
h t + 1 = h t + f ( h t ; θ ) (1)
\mathbf{h}_{t+1} = \mathbf{h}_{t} + f(\mathbf{h}_{t}; \theta) \tag{1}
h t + 1 = h t + f ( h t ; θ ) ( 1 )
ここでf f f はニューラルネットワーク であり、θ \theta θ はf f f の学習すべきパラメータ (重み)である。こういった方法はシンプルで直感的であり、最初に試してみることのできる方法の一つだが、次のような欠点がある。
データを補間 することが難しい。( 1 ) (1) ( 1 ) のようなモデルではt 3 t_{3} t 3 とt 4 t_{4} t 4 の間のデータを予測することが難しい。特に任意の時間t 3.472 t_{3.472} t 3.472 に対するデータを予測することが簡単でない。 時間間隔が均等でないデータに対しては適用が難しい。( 1 ) (1) ( 1 ) でh t + 1 \mathbf{h}_{t+1} h t + 1 を更新するルールはf f f を1回、2回、整数回足していくものであるため、時間間隔が均等でなければ( 1 ) (1) ( 1 ) の等式は成立しない。 この論文で提案する方法は、離散自律システム である( 1 ) (1) ( 1 ) を次のように連続な非自律システム に変えて考えるものである。
d h d t = f ( h ( t ) , t ; θ ) (2)
\dfrac{\mathrm{d}\mathbf{h}}{\mathrm{d}t} = f(\mathbf{h}(t), t; \theta) \tag{2}
d t d h = f ( h ( t ) , t ; θ ) ( 2 )
「非自律システムで外力(あるいは速度)f f f をパラメータθ \theta θ を持つ人工ニューラルネットワークで定義した( 2 ) (2) ( 2 ) 」をNeural Ordinary Differential Equations(Neural ODE, NODE)という。
このようなODEを解いてくれるソルバー (すなわちf f f を積分してくれるもの)はすでに多く研究されており、性能の良いさまざまな方法が提案されている。したがってニューラルネットワークを通じてf f f をうまく近似したならば、以下の式を通じて任意の時間t t t についてh ( t ) \mathbf{h}(t) h ( t ) を予測することができる。両辺を積分すると、
h ( t ) = h ( 0 ) + ∫ 0 t f ( h ( t ) , s ; θ ) d s (3)
\mathbf{h}(t) = \mathbf{h}(0) + \int\limits_{0}^{t} f(\mathbf{h}(t), s; \theta) \mathrm{d}s \tag{3}
h ( t ) = h ( 0 ) + 0 ∫ t f ( h ( t ) , s ; θ ) d s ( 3 )
右辺は初期値h ( 0 ) \mathbf{h}(0) h ( 0 ) とf f f が与えられているならばODEソルバーを通して得られる値であるため、論文では次のように表記する。
h ( t 1 ) = ODESolve ( h ( t 0 ) , f , t 0 , t 1 , θ )
\mathbf{h}(t_{1}) = \operatorname{ODESolve}(\mathbf{h}(t_{0}), f, t_{0}, t_{1}, \theta)
h ( t 1 ) = ODESolve ( h ( t 0 ) , f , t 0 , t 1 , θ )
論文ではODEソルバーによってモデルを定義し値を計算することによって得られるメリットを以下のように説明している。
Memory efficiencyメモリ効率 :
下記の2章で、逆伝播アルゴリズム を使用せずに損失関数の勾配 を計算する方法を紹介する。したがってモデルの関数値を計算するときに中間計算結果を保存 する必要がなく、これはメモリ使用量がモデルのサイズに依存せず一定に維持されることを意味する。
Adaptive computation適応計算 :
オイラー法 以来120年が経過する間に、より正確で効率的なODEソルバーが多く開発されてきた。特に最近のODEソルバーは、誤差のモニタリングおよび高精度達成を目的として実行中に評価戦略evaluation strategy を動的に調整する機能を提供する。
Scalable and invertible normalizing flowsノーマライジングフローの一般化 :
連続的なモデルの副次的利点の一つは、変数変換の公式を計算しやすいということであり(4章で説明する)、これは効率の良いノーマライジングフロー モデルを構築できることを意味する。
Continuous time-series models連続時系列モデル :
訓練および予測データが等間隔に離散化されている必要があるRNNとは異なり、連続で定義されたNeural ODEは任意の時間t t t に対して予測を行うことができる。この内容は5章で詳しく説明される。
2 ODEソリューションのリバースモード自動微分 Neural ODEに関する核心的なアイデアと原理ははじめに で全て説明された。2章では学習法について扱う。著者はNeural ODEを実装する方法を開発し、GitHubで公開 している。直接実装するわけではないので、学習に関する内容が特に気にならなければ飛ばしても構わないと思う。3〜5章はNeural ODEがどのように応用されるかを扱っているため、自分のフィールドでNeural ODEを活用したいならば3〜5章を詳しく読むことをお勧めする。特に4章の内容はディフュージョンモデルの次に生成モデルの主流を引っ張っているフローマッチングにもつながる。
観測値(正解データ)はニューラルネットワークのパラメータθ \theta θ に依存しない定数であるため、損失関数を次のように簡単に表現しよう。
L ( z ( t 1 ) ) = L ( z ( t 0 ) + ∫ t 0 t 1 f ( z ( t ) , t ; θ ) d t ) = L ( OSESolve ( z ( t 0 ) , f θ , t 0 , t 1 ) )
L(\mathbf{z}(t_{1})) = L \left( \mathbf{z}(t_{0}) + \int_{t_{0}}^{t_{1}} f(\mathbf{z}(t), t; \theta) \mathrm{d}t \right) = L \left( \operatorname{OSESolve}(\mathbf{z}(t_{0}), f_{\theta}, t_{0}, t_{1}) \right)
L ( z ( t 1 )) = L ( z ( t 0 ) + ∫ t 0 t 1 f ( z ( t ) , t ; θ ) d t ) = L ( OSESolve ( z ( t 0 ) , f θ , t 0 , t 1 ) )
論文で損失関数の勾配 を計算するための方法はadjoint sensitivity methodであり、これは別のODEを時間逆順に積分することだ。その結果だけを見ると次のようになる。
d L d θ = ∫ t 1 t 0 ( ∂ L ∂ z ( t ) ) T ∂ f ( z ( t ) , t ; θ ) ∂ θ d t
\dfrac{\mathrm{d}L}{\mathrm{d}\theta} = \int\limits_{t_{1}}^{t_{0}} \left( \dfrac{\partial L}{\partial \mathbf{z}(t)} \right)^{\mathsf{T}} \dfrac{\partial f(\mathbf{z}(t), t; \theta)}{\partial \theta} \mathrm{d}t
d θ d L = t 1 ∫ t 0 ( ∂ z ( t ) ∂ L ) T ∂ θ ∂ f ( z ( t ) , t ; θ ) d t
詳細はAppendix B、C、Dで確認できる。(ダウンロードリンク) また下記の例で説明したコードと学習に関連するメソッドは torchdiffeq
パッケージに含まれており GitHub で公開されている。
3 監督学習のための残差ネットワークをODEに置き換える Neural ODEは( 1 ) (1) ( 1 ) を( 3 ) (3) ( 3 ) として置き換えたものであると考えれば、残差ネットワークの一般化として見ることができる。
residual: h t + 1 = h t + f ( h t ; θ ) ⟹ generalization d h d t = f ( h ( t ) , t ; θ )
\text{residual: } \mathbf{h}_{t+1} = \mathbf{h}_{t} + f(\mathbf{h}_{t}; \theta) \quad\overset{\text{generalization}}{\implies}\quad \dfrac{\mathrm{d}\mathbf{h}}{\mathrm{d}t} = f(\mathbf{h}(t), t; \theta)
residual: h t + 1 = h t + f ( h t ; θ ) ⟹ generalization d t d h = f ( h ( t ) , t ; θ )
したがってResNetを利用した監督学習においてNeural ODEを活用できる。著者たちはMNISTデータセット の判別問題でResNetの部分をそのままNeural ODEで置き換えて性能を比較した。
ODEの初期値問題を数値的に解くために選ばれたソルバー はアダムズメソッド であり、scipy.integrate
パッケージで提供される陰的メソッド を使用した。最適化手法であるadjoint sensitivity methodを pytorch.autograd
で実装した。
実験結果としてODE-NetはResNetに比べて1 / 3 1/3 1/3 程度のパラメータを持つにもかかわらず、ほぼ同じ性能を示した。L L L はResNetの層数を意味し、ResNetの計算時間と逆伝播に必要なメモリはL L L に比例する。L ~ \tilde{L} L ~ はODEソルバーのnumber of function evaluations (NFE)であり、積分区間をどれだけ分割して計算するかを意味する。ODEソルバーは数値積分を行うので積分区間を分割する ことになり、NFEはこの区間の数を示す。例えば[ 0 , 1 ] [0, 1] [ 0 , 1 ] 区間を0.05 0.05 0.05 の間隔で積分を行うとNFE = 1 0.05 = 20 \text{NFE} = \dfrac{1}{0.05} = 20 NFE = 0.05 1 = 20 である。論文ではこれをODE-Netの層数と解釈することができると述べている。NFEが大きいほど正確に計算できるが、計算に時間がかかるため、適度な数を選ぶことが重要である。Neural ODEではNFEをモデルが自動で選択する。
Figure 3a、3bではそれぞれ順方向計算におけるNFEに応じた誤差と計算時間を示し、直感に矛盾しない結果と言える。Figure 3cを見ると逆方向計算が順方向計算に比べておおよそ半分のレベルであることがわかる。これは提案する学習方法であるadjoint sensitivity methodが非常に効率的であることを示している。Figure 3dは訓練が進むにつれてNFEが増加することを示しており、これはモデルが訓練されるにつれて徐々に複雑になり、それをよく表現するために精巧になっていると説明している。
4 連続ノーマライジングフロー ( 1 ) (1) ( 1 ) のような離散的なモデリングはノーマライジングフロー normalizing flow (NF) においても見受けられる。
z 1 = f ( z 0 )
\mathbf{z}_{1} = f(\mathbf{z}_{0})
z 1 = f ( z 0 )
log p ( z 1 ) = log p ( z 0 ) − log ∣ det ∂ f ∂ z 0 ∣ (a4)
\log p(\mathbf{z}_{1}) = \log p(\mathbf{z}_{0}) - \log \left| \det \dfrac{\partial f}{\partial \mathbf{z}_{0}} \right| \tag{a4}
log p ( z 1 ) = log p ( z 0 ) − log det ∂ z 0 ∂ f ( a4 )
簡単にplanar flowを例として挙げると、
z t + 1 = z t + u tanh ( w T z t + b )
\mathbf{z}_{t+1} = \mathbf{z}_{t} + \mathbf{u} \tanh (\mathbf{w}^{\mathsf{T}}\mathbf{z}_{t} + b)
z t + 1 = z t + u tanh ( w T z t + b )
log p ( z t + 1 ) = log p ( z t ) − log ∣ 1 + u T ∂ tanh ∂ z ∣
\log p(\mathbf{z}_{t+1}) = \log p(\mathbf{z}_{t}) - \log \left| 1 + \mathbf{u}^{\mathsf{T}} \dfrac{\partial \tanh}{\partial \mathbf{z}} \right|
log p ( z t + 1 ) = log p ( z t ) − log 1 + u T ∂ z ∂ tanh
ノーマルフローを学習する上で最も重要な考慮点は、( a 4 ) (a4) ( a 4 ) の行列式 の計算である。これはz \mathbf{z} z の次元や重みの数に対して三乗の計算コストを持つ。興味深いことに離散的な構造( 1 ) (1) ( 1 ) を連続的構造( 3 ) (3) ( 3 ) に変えるとそれに関連する計算がさらに簡素化される。
Theorem 1 (Instantaneous Change of Variables). \textbf{Theorem 1 }\text{(Instantaneous Change of Variables).} Theorem 1 (Instantaneous Change of Variables).
z ( t ) \mathbf{z}(t) z ( t ) を連続確率変数 、p ( z ( t ) ) p(\mathbf{z}(t)) p ( z ( t )) をそれに対する確率密度関数 としよう。また非自律微分方程式 が次のように与えられたとしよう。
d z d t = f ( z ( t ) , t ) (a5)
\dfrac{\mathrm{d} \mathbf{z}}{\mathrm{d}t} = f(\mathbf{z}(t), t) \tag{a5}
d t d z = f ( z ( t ) , t ) ( a5 )
f f f が変数z \mathbf{z} z に関してリプシッツ連続 であり、変数t t t に関して連続 であるとしよう。すると、対数確率密度の導関数は次のようになる。
∂ log p ( z ( t ) ) ∂ t = − Tr ( ∂ f ∂ z ( t ) )
\dfrac{\partial \log p(\mathbf{z}(t))}{\partial t} = -\Tr \left( \dfrac{\partial f}{\partial \mathbf{z}(t)} \right)
∂ t ∂ log p ( z ( t )) = − Tr ( ∂ z ( t ) ∂ f )
ここでTr \Tr Tr はトレース である。
( a 4 ) (a4) ( a 4 ) の行列式計算が単純なトレース計算に変わった。また標準的な離散ノーマライジングフローでは、今回はf f f が変数分離可能 である必要がない。上記で例として挙げたplanar flowを上記Theorem 1 \textbf{Theorem 1} Theorem 1 に合わせて連続的形態に変えれば次のようになる。
d z ( t ) d t = u tanh ( w T z ( t ) + b ) , ∂ log p ( z ( t ) ) ∂ t = − Tr ( u ∂ tanh ( w T z ( t ) + b ) ∂ z ( t ) )
\dfrac{\mathrm{d}\mathbf{z}(t)}{\mathrm{d}t} = \mathbf{u} \tanh(\mathbf{w}^{\mathsf{T}}\mathbf{z}(t) + b), \qquad \dfrac{\partial \log p (\mathbf{z}(t))}{\partial t} = -\Tr \left( \mathbf{u} \dfrac{\partial \tanh(\mathbf{w}^{\mathsf{T}}\mathbf{z}(t) + b)}{\partial \mathbf{z}(t)} \right)
d t d z ( t ) = u tanh ( w T z ( t ) + b ) , ∂ t ∂ log p ( z ( t )) = − Tr ( u ∂ z ( t ) ∂ tanh ( w T z ( t ) + b ) )
複数の隠れユニットを線形コストで使用する
行列式は線形ではないが、トレースは線形 であるためTr ∑ n J n = ∑ n Tr J n \Tr \sum\limits_{n} J_{n} = \sum\limits_{n} \Tr J_{n} Tr n ∑ J n = n ∑ Tr J n が成立する。したがって( a 5 ) (a5) ( a 5 ) のf f f を線形結合で表しても、対数確率密度の導関数は次のように簡単に表現できる。
d z ( t ) d t = ∑ n = 1 M f n ( z ( t ) ) , d log p ( z ( t ) ) d t = − ∑ n = 1 M Tr ( ∂ f n ∂ z ( t ) )
\dfrac{\mathrm{d} \mathbf{z}(t)}{\mathrm{d}t} = \sum\limits_{n=1}^{M} f_{n}(\mathbf{z}(t)), \qquad \dfrac{\mathrm{d}\log p(\mathbf{z}(t))}{\mathrm{d}t} = -\sum\limits_{n=1}^{M} \Tr \left( \dfrac{\partial f_{n}}{\partial \mathbf{z}(t)} \right)
d t d z ( t ) = n = 1 ∑ M f n ( z ( t )) , d t d log p ( z ( t )) = − n = 1 ∑ M Tr ( ∂ z ( t ) ∂ f n )
これは隠れ層のノード数M M M に対して計算コストが線形的に増加することを意味する。既存のノーマライジングフローはO ( M 3 ) \mathcal{O}(M^{3}) O ( M 3 ) の計算コストのために多くの場合、一つのノードを多くの層で使用する構造をしている。
時間依存ダイナミクス
論文ではgatingと呼ばれる方法を使用してフローを以下のように定義する。
d z d t = ∑ n σ n ( t ) f n ( z ) , σ n ( t ) ∈ ( 01 )
\dfrac{\mathrm{d} \mathbf{z}}{\mathrm{d}t} = \sum\limits_{n} \sigma_{n}(t)f_{n}(\mathbf{z}), \qquad \sigma_{n}(t) \in (0 1)
d t d z = n ∑ σ n ( t ) f n ( z ) , σ n ( t ) ∈ ( 01 )
すなわち、f ( z , t ) f(\mathbf{z}, t) f ( z , t ) が変数分離可能 であると仮定する。ここでσ n \sigma_{n} σ n もf n f_{n} f n も全て学習する必要があるニューラルネットワークである。論文ではこれを連続ノーマライジングフロー continuous normalizing flow (CNF) と呼ぶ。[フローマッチング]はこのCNFをより効率的に学習することができる一つの方法である。
4.1 連続ノーマライジングフローを用いた実験 CNFとNFを比較する。CNFは上記で説明した通りに実装され、Adam オプティマイザーを用いて10,000回の反復を行い訓練された。NFは初提案された論文 と同様に実装され、RMSprop オプティマイザーを用いて500,000回の反復で訓練された。CNF側の反復回数は顕著に少ない。結果は以下の図から確認できる。
下のFigure 5の上の2行はCNF、最後の行はNFに対する結果として見られる。CNFは滑らかに変換される一方で、NFはそうではなく、Two Moonsデータに対して正しくモデル化ができていない。
5 ジェネレーティブ潜在関数時系列モデル Neural ODEは非自律システムをニューラルネットワークで近似する方法であるため、時系列データ の予測、補間、欠損値生成などにも使用できる。論文が提案する訓練方法は以下の通りである。
時系列データ{ x i , t i } i = 1 N \left\{ \mathbf{x}_{i}, t_{i} \right\}_{i=1}^{N} { x i , t i } i = 1 N が与えられているとする。
RNNをエンコーダー として利用し、潜在変数 μ \boldsymbol{\mu} μ およびσ \boldsymbol{\sigma} σ を抽出する。
( μ , log σ 2 ) = RNNencoder ( { x i , t i } )
(\boldsymbol{\mu}, \log\boldsymbol{\sigma}^{2}) = \operatorname{RNNencoder}\left( \left\{ \mathbf{x}_{i}, t_{i} \right\} \right)
( μ , log σ 2 ) = RNNencoder ( { x i , t i } )
正規分布N ( 0 , I ) N(\mathbf{0}, I) N ( 0 , I ) からϵ \boldsymbol{\epsilon} ϵ を抽出 し、μ \boldsymbol{\mu} μ とσ \boldsymbol{\sigma} σ を使用して潜在変数の初期値z t 0 \mathbf{z}_{t_{0}} z t 0 を生成する。
z t 0 = exp ( 0.5 log σ 2 ) ⊙ ϵ + μ
\mathbf{z}_{t_{0}} = \exp(0.5 \log\boldsymbol{\sigma}^{2}) \odot \boldsymbol{\epsilon} + \boldsymbol{\mu}
z t 0 = exp ( 0.5 log σ 2 ) ⊙ ϵ + μ
こうすることで、あたかもRNNencoder \operatorname{RNNencoder} RNNencoder が時系列データを潜在空間 N ( μ , diag ( σ 2 ) ) N(\boldsymbol{\mu}, \diag(\boldsymbol{\sigma}^{2})) N ( μ , diag ( σ 2 )) にマッピングするように見せるが、逆伝播が可能である。
潜在変数の初期値z t 0 \mathbf{z}_{t_{0}} z t 0 とNeural ODEを通じてz t i \mathbf{z}_{t_{i}} z t i を計算する。
( z t 1 , z t 2 , … , z t N ) = ODESolve ( z t 0 , f , t 0 , … , t N , θ )
(\mathbf{z}_{t_{1}}, \mathbf{z}_{t_{2}}, \dots, \mathbf{z}_{t_{N}})
= \operatorname{ODESolve}(\mathbf{z}_{t_{0}}, f, t_{0}, \dots, t_{N}, \theta)
( z t 1 , z t 2 , … , z t N ) = ODESolve ( z t 0 , f , t 0 , … , t N , θ )
z t i \mathbf{z}_{t_{i}} z t i をFCN として定義されたデコーダー に入力し、予測された時系列データx i \mathbf{x}_{i} x i を得る。
x t i = FCNdecoder ( z t i )
\mathbf{x}_{t_{i}} = \operatorname{FCNdecoder}(\mathbf{z}_{t_{i}})
x t i = FCNdecoder ( z t i )
ELBOを最大化する。
ELBO = ∑ i log p ( x t i ∣ z t i ) + log p ( z t 0 ) − log q ( z t 0 ∣ { x t i , t i } )
\text{ELBO} = \sum\limits_{i} \log p(\mathbf{x}_{t_{i}} | \mathbf{z}_{t_{i}}) + \log p(\mathbf{z}_{t_{0}}) - \log q(\mathbf{z}_{t_{0}} | \left\{ \mathbf{x}_{t_{i}}, t_{i} \right\})
ELBO = i ∑ log p ( x t i ∣ z t i ) + log p ( z t 0 ) − log q ( z t 0 ∣ { x t i , t i } )
5.1 時系列潜在ODE実験 実験に使用したニューラルネットワークは次のとおりである。
RNNencoder \operatorname{RNNencoder} RNNencoder : ノードが25個のRNN潜在空間は4次元。( μ ) , ( σ ) ∈ R 2 × 2 (\boldsymbol{\mu}), (\boldsymbol{\sigma}) \in \mathbb{R}^{2 \times 2} ( μ ) , ( σ ) ∈ R 2 × 2 NeuralODE f f f : ノードが20個の隠れ層を1つ持つMLP FCNdecoder \operatorname{FCNdecoder} FCNdecoder : ノードが20個の隠れ層を1つ持つ別のMLPデータセットに関する条件は以下の通りである。
2次元螺旋データ1000個を生成。 半分は時計回り、残りは反時計回り。 各軌道は異なる初期値から始まり等間隔な時間で100個の点をサンプリング。 観測値にガウシアンノイズを追加した。 学習時には各軌道の100個の点から重複なしで無作為に30/50/100個を抽出して使用した。 以下の表を見るとNeuralODEの性能が明らかに優れていることが分かり、さらにデータが少ない時も多い時に比べて性能が大幅に落ちないということが確認できる。
以下の図はRNNとNeuralODEの予測結果である。NeuralODEの結果の方が滑らかで、学習しなかった外部領域での予測もより優れていることが示されている。
以下の図は潜在変数の軌道を最初の2次元について描いたものである。軌道は時計回りの螺旋と反時計回りの螺旋という2つのクラスタに分かれており、これは提案する方法が潜在変数 をうまく表現していることを意味する。