ラベル Dissipative Lagrangian Neural Networks の投稿を表示しています。 すべての投稿を表示
ラベル Dissipative Lagrangian Neural Networks の投稿を表示しています。 すべての投稿を表示

2023年3月26日日曜日

Dissipative Lagrangian Neural Networksについて

最近まで学業で研究をしていました。

その内容がDissipative Lagrangian Neural Networks(github)という先行研究のDissipative Hamiltonian Neural Networks(arxiv.org,github.com)とLagrangian Neural Networks(arxiv.org,github) を合体したものです。

具体的にどういうものかというと

ラグランジュ方程式に基づき、エネルギー散逸を考慮した力学系の学習が可能なニューラルネットワーク

  • Dissipative Hamiltonian Neural Networksでは必要であった正準座標系に依存しない
    • つまり、重さを知らなくても良い。 
  • Lagrangian Neural Networksでは考慮できない散逸を考慮できる
    • 保存場のみの計算が可能であるが、散逸場を含むと計算できない。
    • 空気抵抗などの粘性抵抗、摩擦などのエネルギーロスがあっても良い。

という感じです。
物理屋ではないので間違っていたら、書き換えると思います。たぶん。


ここでは苦労話を書こうと思います。


  1. DLNNで予測するモデル構造には複数のモデルが存在する

    ラグランジュ方程式を解くのですが、
    $$ \ddot{q} = - {\nabla _q \nabla _\dot{q} \cal{L}} + {\nabla _q \cal{L}} - {\nabla _\dot{q} \cal{D}} $$
    という微分方程式で表現することが最終的に求めることなのですが、この過程でヘッシアンで直接求めるか、頑張って二階微分するかです。
    ここで頑張って二階微分するとモデルとしての柔軟性が失われますが、一括で処理することができ、大幅な高速化が見込まれます。
    しかし、今回はvmapで並列化するという手法を取りました。
    これはすべての計算をニューラルネットワークのもつ自動微分で行わないので追跡性(backward?)を損なうと考えております。
    実際にはこのヘッシアンを使っています。
    なぜかそのほうが精度が良かったです。

  2. optimizerなにが良いのかがわからない
    投稿した現在もたくさんのoptimizerが出てきており、投稿時点ではLionというものがここ数週間で出てきた感じとなります。
    最初から備え付けのAdam,AdamW,自分でインストールしたDadapAdam,Lionを試しました。めんどくさくなって、サンプル結果だけAdanとかSGDとか見ました。
    他の方の検証によってはAdamWが良かったり、Adanが良かったり、Lionのタイパが良かったりするなどありました。

  3. optimizerやschedulerの扱いがよくわからない。

    今はdadaptationのAdamとtimmのCosineLRSchedulerを使っています。
    ただ、使用方法に書いてあるとおりに使用しておりません。
    何故かその通りに使用するとあまり芳しい結果が得られませんでした。
    dadaptationは
    「dadaptationがlrも管理するのでスケジューラーは使わないでね。それとd0は1r-6、lr=1でお願いね。」
    というふうに書いてあるように読み取れましたが、そのとおりにするとあんまり芳しくないんですよね。
    なんか試行錯誤の末、選んだ感じになりました。

  4. dadaptationはエポック数を稼ぎにくい

    試行回数が増えるほどnanやなんかdadaptのパラメータがおかしくなります。
    やだねぇ...。

  5. Lossの取り方がよくわからない

    一般的にMSE、平均二乗誤差を取るかと思います。
    これは一般的に有用であると考えます。バッチサイズにも影響を受けず、安定した値を返します。
    ただ、逆に細かな値の調整や外れ値に弱いと考えております。
    今回のような小さな値(0~100)を取り扱い、外れ値のような結果も外れではないという場合にはあまり良くないのではないかと考えております。
    $$ sum(abs(predict-train)) $$ という形でLossを取る場合、ノイズに弱くなると思うところがあるので、今後の課題の一つであるかと思います。

  6. バッチサイズが一般論とは違う
    リソースが許す限り、一般的にバッチサイズは大きければ大きいほど良いみたいな感じがあるのですが、これはそうではないです。
    なぜならば、Lossの取り方が$$ sum(abs(predict-train)) $$になっている場合、バッチサイズが大きくなればなるほどLossが大きくなります。
    しかし、エポック数を無闇矢鱈に増やす訳にはいかない...普通のものと比べるとエポック数を多少増やす必要があるようには思います。

  7. 活性化関数がよくわからない
    結局swishを使っているのですが、形としてはtanhshrinkが合いそうな気がするんですよね。
    結局は使っている活性化関数が答えですね。理由はわからないです。

  8. 隠れ層やその種類について
    現状はdenseで512次元です。
    これは最近になってどうするか考え出したので、結局答えはわからずじまいです。

以上より、なかなかに苦労したところでもあり、今後の参考になる部分ではないかと思います。

 

まとめ

 最近は力学系ニューラルネットワークが盛んになってきている傾向があると思います。これはHamiltonian Neural Networks(arxiv.org,github.com)を提案したSam Greydanus氏が恐ろしいほどすごい人であるからと考えております。

普通こんな事考えないよねと思ったりもしますが、いつの日かこういうニューラルネットワークが普通になるのかもしれない日が来るのかもしれないですし、来ないのかもしれないです...。 


余談

LNNは自身の環境では再現できませんでした。

再現できた方はおめでとうございます。

再現できた環境をネットの海に放流してください。