No (refractory) title : spectrally stable

本、アニメ、映画の感想。時々まじめに物理。ごくたまに日記。

研究記録まとめ

全く書くことがなかったので、学生時代の研究の雰囲気メモを記事に書いておく。

最初の論文の投稿までの流れ

2017/02/09で連分数の計算の仕方を勉強した後、2017/02/16に例のJ. Chem. Phys. 10,161(1974) Adelman and Dollを読んで計算を理解した。02/17、色々試行錯誤していた中で、後に本論で議論する例のモデルを考え計算しだした。数値計算と比較することを覚えて2017/02/20で計算結果と比較してみたら、スペクトルに変な発散が見えた。なんじゃこりゃと思って解析計算と見比べたら解析計算の結果、実は極があるということがわかった。それから色々と他の似たような系を手計算している。05/08の段階で日本物理学会秋季大会に同時にやっていた別の模型の内容と一緒に発表しようとして、漠然としたタイトルで申し込みしている。その後迷走が続き、06/09に厳密対角化で固有モードを調べることにする。おそらくこの辺で厳密対角化ライブラリを導入した。日本物理学会秋季大会予稿の提出で07/18の段階では予稿第一校が書かれている。この時、概要にはすでにモードについて言及している。07/26で散乱法によってこのモードの中身がわかり、物理がわかった。08/22で孤立固有値を理解し、08/28でFox(1977)の遷移確率、Adelman and Dollの方法で揺動散逸関係の成立を確認している。ここで非減衰からくる破れについて言及していていて、投稿論文で議論の的にする先行論文について言及している。08/30でその議論を本格的に始める。多分この辺りで指導教官に「論文にしてもいいよ」みたいなことを言われた気がする。日本物理学会が09/21にあって発表を終え、確か論文執筆に入ったのが11月頃。2018/05/08に投稿。2018/07/11に全てのrefereeコメントが来る。その後インターンに行ってしまって10/15にresubmit。12/04にaccept通知となった。

博論完成までの流れ

ニューラルネットワークを応用しよう、という話はおそらく2019/10/25 あたりで助教さんと雑談していた時に出てきた。就職先などを考えて機械学習に関連した題材をやれば、モチベーションも保てるのではないか、というようなことを考えた記憶。そこでまず本論で使う3つの先行研究のうちの1つ目を読んだ。その中で使われている手法を足掛かりにまず深層学習の勉強と実装をやった。ニューラルネットの物理への応用は以前から興味があって、10/08あたりにpytorchのチュートリアルを試しにやっていた。他にも他研究科の深層学習の授業を受講して実装方法について色々と情報を集めていた。この授業は2019年の前期にやっていたもので、授業でtensorflowの実装が配布される授業だった。tensorflowの実装よりpytorchの方がより直感的に使えるように思えたのと、学術系の実装の多くがpytorchでされていたように見えたので、こちらを採用することにした。当初の目標は古典物理系における難しい逆変換をニューラルネットで代用し、ある種のサンプリングを効率化しよう、というのがその目標だった。そのためまず逆変換を学習するタスクをクリアすることが必要だった。

それと並行して以前議論していた内容も懲りずに考えていた。そのため数理的な手法や方法を学ぶために解析的計算を勉強していた。11月中はまだ深層学習なんて邪道で以前やっていた方が王道だと思っていたので、なんとか以前の研究を形にしようとしていた。11月中は上記の先行研究を再現するためのコードと解析手法の勉強をどうやら並行してやっていたようだ。すげぇ気力。たぶんpytorchの実装を早めに終わらせて解析手法の勉強をやるという日々だったんだろうと研究ノートから読み取れる。12/6に確か先行研究を再現した結果とその応用先について粒子数2など小さい系で予備的実験をした結果をポスター発表している。

話を戻して最初のタスクをクリアする手法についての話は、学習データをある多粒子のボルツマン分布からサンプリングする必要があるため、まずサンプリングの手法の実装と妥当性の確認が必要だった。そのためのコードを書き、妥当性のためのある解析計算の先行研究を調べた。12/03に先行研究を見つけ読んでいる。気分転換にニューラルネットの構造について考え始めている。12/10には上記で行っていた最初に参照した先行研究や関連ニューラルネットのreviewを読んで、応用を考えていた。ここで後ほど使うNeuralODEについて勉強している。確かNeuralODEが出た時期にTwitterでその話題を見つけて、面白いなぁと思った記憶(2018年の6月らしい)。12/17あたりで解析計算について完全に理解し、合わせて多分この段階でコードの妥当性も確認できたよう。つまり学習データの生成ができるようになったので、学習方法やネットの構造について本格的に考え始めている。12/19には損失関数を考えていて、(後から考えれば)的外れなことを書いている。この辺りで重要な先行研究の3つのうちの2つ目の論文を実装しようとした記憶。

2020/01辺りはとにかく迷走していて、ニューラルネットを使う意味はあるのか、そもそも逆変換を考える必要はあるのか、学習結果から何か別のことも読み取れるのか、みたいなことを延々と考えていた。もともと対象にしていた模型(系)について理解していないこともあったので、その点をさらに徹底的に勉強している。1月中は11月、12月で急ピッチでやったことを再度きちんと詰めて理解することに時間を使っていたようだ。2020/01/29に研究室内発表で進捗具合についてまとめて発表。この時の資料を見ると、やはりどうしても多粒子の場合には上手く言っておらず、どうやって大きくするべきか、みたいなことを悩んでいたようだ。なんとかニューラルネットの表現力をあげようと試行錯誤をしている。GlowだったりRevNetsだったりを勉強して実装してを繰り返す。ただ、2月前半はTAの仕事で忙殺されているのが伺える。3月中は完全に就活に時間を裂いていた。連日のように面接、面談、説明会、SPIテストとそのためのSE、スライド作りに明け暮れていた。最初の内定が2020/03/23に出た。

4月あたりから就活が落ち着き始め、またニューラルネットや損失関数の改良を行っていた。この辺りで大体粒子数が5ぐらいまではできるようになっていた。しかし、多粒子系をやりたいというモチベーションがあったため、なんとかして多粒子でも精度が高くできるようにと努力している。5月はハイパーパラメータの調整や必要な学習データがどれくらいかを試行錯誤で調べている。全ては多粒子系でもできるように、という気持ちでやっているようだ。この辺り(2020/05/16)で2つ目の内定が出る。最終的にこちらを内定先に選ぶ。なので5月で就活が終わり、6月中から本格的に研究を再開する。この辺りで、やはり最初の目標が間違った問題設定なのではないか、という議論を助教や指導教官とする。逆変換を作れたところで多粒子系に応用できないのでは当初の目的をクリアすることができない、という議論をした記憶がある。6月中のミーティング用スライドでは作ったニューラルネットの応用先を議論している。

上手い問題設定が見つからないまま、07/06で同じ分野の研究グループ全体での中間発表があり、そこで当初の問題設定のままストーリーを作って報告した。そこでコテンパにやられて「このままでは卒業できなさそうだな」と考える。焦っていたのでニューラルネットから離れて違う研究テーマが設定できないかと考え、量子系のダイナミクスの一分野で修士で使えた技術を応用できる分野をやり始める。助教さんは深層学習の応用に力を入れていたので、ここで道を違えてしまう。以降は指導教官と二人で議論をする。この分野は解析計算、つまりは手計算で調べることができ、ガリガリノートを消費しまくった。しかしこのテーマもざっと調べてみると、何も面白いことが言えないなと感じ始める。重要そうな先行研究を一通り調べたところで「こいつら何が面白くてやってんだろ」という気持ちになりモチベが続かなくなる。絶望感で机の前に座るしか出来なくなりかけていた。結局、後ほどわかるが、07/07~08/18と約1ヶ月使って取り組んだこの分野については「こいつを研究してもあまり面白いことはできそうにない」という結論に至る。

08/18、指導教官から最近出た深層学習を使った物理の研究論文を教えてもらう。気分転換にと思ってこの論文を読みながら、ふと以前やっていた方針と全く全然違う(しかもこの読んでいる論文ともほぼ関係ない)観点で、これまで作ってきたニューラルネットの手法が活かせる問題設定を思いつく。この問題設定なら「逆変換を作って何かをさせるのではなく、逆変換そのものが見つかることに意義がある」ので、機械学習の内挿外挿の問題に苦しまなくて済むとわかった。つまり、機械学習の問題点は「学習させた以上のことは基本的に望むべきではない(精度が保証できない)」という点にある。これを解消するために機械学習の予測に補正を入れたりして妥当性を確保するのが常だった。それ以上のことは結局憶測に過ぎないので新しい知識が増えるわけではない。しかし逆に言えば「データ内で見つけられる」こと自体に新しい知識を与えることができるのであれば、これは意義があると考えた。この研究テーマを設定すると、最終目標を含め2つの目標をクリアする必要があった。1つ目は既知の事実を再現できるというテスト的目標。2つ目は未知の事柄を提案手法で見つけるという目標だった。

この方針を実現するために、いくつかの論文を再度調べて読み直す。ここで冒頭に述べた3つの論文のうちの最後3つ目の論文を読む。あとはとにかく実装し、損失関数を設計し、ただただ試行錯誤を行った。09/22に3つある重要な実装の1つ目をやる。これは、もともと数値積分をRunge-Kutta法でやっている部分を2019/05/28に以前の研究のために勉強した積分法に置き換えただけなのだが、これでかなり性能が上がった。この積分法を応用するだけで成果になるかと思って調べてみたら、すでに2018年により一般的な方法で報告されていた。まぁ別にそれを目標にしていたわけじゃないしと、モチベーションは下がらなかった。加えてモチベーションを維持できたのが、意外にもこの時友達からお勧めされたBEATLESSだった。これは原作ありのSFアニメなのだけど、めちゃくちゃに面白くて、しかも自分の研究に近かったこともあってモチベが爆上がりした。Twitterによると10/02から見始めて10/11に見終わったらしい。ずいぶん励まされた。一方で博論を提出するかどうかを10/14あたりまでに決める必要があった。このまま行って目標まで到達するかは定かではなかったが、内定も決まっていたし出さない選択肢はないと考え、とにかく提出を決めた。そこからとにかく試行錯誤をしていて、11/02に2つ目の重要な実装をやる。これは最初からやるべきだった実装で、変換の頭にフーリエ変換を挟むというだけの話だった。これでかなり性能が上がり、まず1つ目の目標をクリアした。ただこれでも最後の2つ目の目標を達成するには性能が足りなかった。この辺りで博論を書き始めないとやばいと思い、とにかく結果が出てなくても書ける導入知識の部分や付録の部分だけひたすら埋めていた。11/24に損失関数に対してある改良を施す。これが3つある重要な実装の最後の3つ目だった。この改良がかなり学習を改善したので、11/02で出ていた結果をさらに改善していた。これをもとに11/29、研究室内発表をする。ここで無理にでも一度発表しておいたことがよかった。ここでもらった指摘や疑問をもとに再度全体の論理を見直した。先の改良で一応うまくいくということがわかってきたので、今度は未知な事柄を発見するためとにかくまた試行錯誤した。12/08、未知と思われるものを学習していることがわかった。この辺りから大詰めで、細かい部分を詰めながら結果をまとめて行った。博論全体としてどういう論理にするか、どういうモチベーションになるのか、何がわかったのかをストーリーとしてまとめていった。最後の1週間は10時間睡眠と2時間睡眠を交互にやっていた。吐きそうになりながら書き上げ、指導教官に1時間睡眠を強いり、12/23になんとか博論を提出した。

結局、完全に未知な事柄を見つけることはできなかったが、手法自体の有用性、独自性、可能性が示せたと評価され、それで審査は通ったようだ。

振り返ってみると、08/18 ~ 12/24の約4ヶ月間が大学院の5年間で一番楽しかったと思う。

追記 長く苦しい博士論文の出版は8月あたりで済みました。これで身軽な体に……