https://arxiv.org/abs/1806.07366
neural ODEがわからない.この理由として考えるのは,
- のfがどうなってるのかわからない
- tがどのようにfの中でパラメータ化されてるかがわからない
neural ODEがResNetやニューラルネットの拡張であることを考えれば, fについて次のように考えた:
- f自体は活性化関数?
- fの中でとして積をとる? ←z(t)と\thetaの絡みがよくわからない
- それ以外の要素としてtが影響する? ←f()と\thetaの絡みがよくわからない
- というかResNetからneural ODEに変形するときは,みたいに,はの関数だったんじゃないのか
- f()自体がtで形を変える?
調べてみた
https://github.com/rtqichen/torchdiffeq/blob/master/examples/latent_ode.py のソースを読むとわかった.
https://arxiv.org/abs/2006.00712 Koji Hashimoto, Hong-Ye Hu, Yi-Zhuang You. Neural ODE and Holographic QCD (2020) arXiv:2006.00712v1 [hep-th] の式の表記がわかりやすかった.
上の箇条書きに対する答え
のfがどうなってるのかわからない→fの中にtが含まれない場合,fは基本的にはニューラルネット.しかしfがtに依存するように設計すれば,単純なニューラルネット(多層パーセプトロンや畳み込みニューラルネット)よりも広い範囲を扱えそう
- tがどのようにfの中でパラメータ化されてるかがわからない→fとして単純なニューラルネット(resnetにおける残差ブロック)を用いるなら,fにtは含まれない.fの中にtが含まれることはひとまず考えなくてもよい.
f自体は活性化関数?→活性化関数ではなく,ResNetにおける残差ブロック(1層以上のニューラルネット)に相当する
- fの中でとして積をとる? →はパラメータ全般を指すから一部は積を取り,バイアスパラメータとして加算されることもある
わかったっぽいことについて列挙
- (Hashimoto et.al. , 2020)論文ではやと表記されていて,があくまでも訓練されるパラメータであることが示されている
- "latent_ode.py"のほうでも,に相当するのは"class LatentODEfunc"中の重みパラメータになるはず(ソースを見ても明示的には重み変数は出てこないがpytorchの処理の中でたぶん更新されてる?)
- さらに,同class内で"def forward(self, t, x):"という関数がありここでResNetに置ける残差ブロックに相当する関数(式のf())が定義される
- しかし,同関数中ではtは使用されないことから,neural odeを普通のresnetの拡張と考えた場合は,f()はtによらない関数になるようだ
- neural odeの式を見た通り,ニューラルネットf()の値は微分値を表しているだけ
- 例えばf()が(全結合層+活性化関数ReLU)が2層だったら→ になる?
- resnetのように重みが層ごとに変化するなら となる?
- 関数g()をどうにか決める必要があるけど,g()自体もニューラルネットにすればいいのか
- べつにg()を使わなくてもf()を十分複雑にすれば,tに依存して変化するパラメータみたいな振る舞いを学習できるのかな
- 関数g()をどうにか決める必要があるけど,g()自体もニューラルネットにすればいいのか
- f()がtを含むか否かについて
- tを含まないなら,層単位でパラメータを持つネットワークを表現できない→resnet以下の表現力になる?
- tを含ませるなら,resnet同様の表現力になる?
- tを含ませる場合のニューラルネットの表現として,y=Ax+bをダミー入力1の導入でy=Axとして置きなおせるように,ダミー入力みたいにtを入力にすればいい?
- Figure 3: Statistics of a trained ODE-Net. (NFE = number of function evaluations.)が示すように関数の評価回数が変わるのはなぜか