雑感等

音楽,数学,語学,その他に関するメモを記す.

neural ODEを理解したい

https://arxiv.org/abs/1806.07366

neural ODEがわからない.この理由として考えるのは,

  •  \frac{dz}{dt}=f(z(t),t,\theta) のfがどうなってるのかわからない
    • tがどのようにfの中でパラメータ化されてるかがわからない

neural ODEがResNetやニューラルネットの拡張であることを考えれば, fについて次のように考えた:

  • f自体は活性化関数?
  • fの中で z(t)\cdot \thetaとして積をとる? ←z(t)と\thetaの絡みがよくわからない
    • それ以外の要素としてtが影響する? ←f()と\thetaの絡みがよくわからない
    • というかResNetからneural ODEに変形するときは,\theta_tみたいに,\thetatの関数だったんじゃないのか
    • 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] の式の表記がわかりやすかった.

上の箇条書きに対する答え

  •  \frac{dz}{dt}=f(z(t),t,\theta) のfがどうなってるのかわからない→fの中にtが含まれない場合,fは基本的にはニューラルネット.しかしfがtに依存するように設計すれば,単純なニューラルネット(多層パーセプトロンや畳み込みニューラルネット)よりも広い範囲を扱えそう

    • tがどのようにfの中でパラメータ化されてるかがわからない→fとして単純なニューラルネット(resnetにおける残差ブロック)を用いるなら,fにtは含まれない.fの中にtが含まれることはひとまず考えなくてもよい.
  • f自体は活性化関数?→活性化関数ではなく,ResNetにおける残差ブロック(1層以上のニューラルネット)に相当する

  • fの中で z(t)\cdot \thetaとして積をとる? →\thetaはパラメータ全般を指すから一部は積を取り,バイアスパラメータとして加算されることもある
    • それ以外の要素としてtが影響する? →f()が普通のニューラルネットMLPとかCNN)ならtは影響しない
    • というかResNetからneural ODEに変形するときは,\theta_tみたいに,\thetatの関数だったんじゃないのか→neural odeでは\thetatのパラメータではなく,単一の関数f()(f()がニューラルネットなら複雑な形を表現しうる関数)になる.関数は一定だからf()を決定するパラメータである\thetaは定数でtに依存しない.
    • f()自体がtで形を変える?→f()はtに依存するため値は変わるが,f()の形・数式やf()に相当するニューラルネットの構成は変わらない

わかったっぽいことについて列挙

  • (Hashimoto et.al. , 2020)論文では \frac{dz}{dt}=f_{\theta}(z(t),t) \frac{dx_i}{dt}=v_i(\vec{x}(t),t;\theta)と表記されていて,\thetaがあくまでも訓練されるパラメータであることが示されている
    • "latent_ode.py"のほうでも,\thetaに相当するのは"class LatentODEfunc"中の重みパラメータになるはず(ソースを見ても明示的には重み変数は出てこないがpytorchの処理の中でたぶん更新されてる?)
  • さらに,同class内で"def forward(self, t, x):"という関数がありここでResNetに置ける残差ブロックに相当する関数(式のf())が定義される
    • しかし,同関数中ではtは使用されないことから,neural odeを普通のresnetの拡張と考えた場合は,f()はtによらない関数になるようだ
  • neural odeの式を見た通り,ニューラルネットf()の値は微分値を表しているだけ
    • 例えばf()が(全結合層+活性化関数ReLU)が2層だったら→ \displaystyle \frac{d\boldsymbol{z}(t)}{dt}=\mathrm{ReLU}( \boldsymbol{ \theta }_1 +\boldsymbol{ \theta }_2  \cdot \mathrm{ReLU}(\boldsymbol{ \theta }_3 +\boldsymbol{ \theta }_4   \boldsymbol{z} (t) ) )になる?
    • resnetのように重みが層ごとに変化するなら \displaystyle \frac{d\boldsymbol{z}(t)}{dt}=\mathrm{ReLU}( \boldsymbol{g}_1(\boldsymbol{ \theta }_1 ,t)+\boldsymbol{g}_2(\boldsymbol{ \theta }_2,t)  \cdot \mathrm{ReLU}(\boldsymbol{g}_3(\boldsymbol{ \theta }_3,t) +\boldsymbol{g}_4(\boldsymbol{ \theta }_4,t)   \boldsymbol{z} (t) ) )となる?
      • 関数g()をどうにか決める必要があるけど,g()自体もニューラルネットにすればいいのか
        • べつにg()を使わなくてもf()を十分複雑にすれば,tに依存して変化するパラメータ \boldsymbol{\theta}(t)みたいな振る舞いを学習できるのかな
  • 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.)が示すように関数の評価回数が変わるのはなぜか