Juliaを用いたタンパク質のエントロピー計算

omi_dev氏(以下、omi_dev):では『Juliaを用いたタンパク質のエントロピー計算』という題で発表させていただきます。サトウタカアキと申します。

Twitterはomi_devというアカウントでいろいろやってまして。今大学院のM1です。先ほど発表されたサトウさんのラボ見学に行ったら「Juliaはいいぞ」と言われてJuliaを始めました。

やっていることとして、研究は生物物理です。主にタンパク質のシミュレーションとか、あとは趣味で競技プログラミングを多少やっていて。今度のコドフェスの本選に出場が決定いたしました。

今回発表するテーマが、下のほうの細々した論文のエントロピーを解析するので、理論だけ載ってるから実装してくれ、ということで実装します。

したものがこちらになります。ちょっと出すと時間があれなんですけど。GitHubで大文字でBILABって検索していただければたぶん出るんじゃないかなと思います。

私が書いたんですけど助教に渡したら助教がコミットしました。

(会場笑)

今回画期的だったこと

なにをしたかと言うと、エントロピー計算って非常にガバガバな部分が多くて。今までのやり方はいろいろと改善手法があったんですが、どれも温度安定性が非常に良くないという問題がありました。今回めちゃくちゃいい方法が出たのでそれをやってみます。

どこが画期的だったかと言うと、シミュレーションって三次元で行うので、当たり前ですが三次元座標で出てきます。それをタンパク質の内部座標、つまり結合の長さと角度と二面角で表すと、系全体としての並進・回転以外の3n-六次元をキープできます。

結果として、物理的にある程度正しい座標計を導入することができるというのが、タンパク質業界で内部座標と表現されます。ここからエントロピーの式にぶち込んで計算すると良いよっていう話でした。

ところがこれをJuliaでやろうとすると非常に大変です。なんでかと言うと、そのシミュレーションの結果が100ギガくらいあって、前処理かましてもギガバイト単位から落ちません。

このパーサを書きたくないので、PythonのライブラリにMDAnalysisというのがありまして、こちらをPyCall経由で使ってJuliaを数値型で無理やり持ってきました。

あえてJuliaで書いた理由

ではなぜわざわざJuliaで書いたのか、Pythonで書かなかったのかと言うと、1つにはやはり競技プログラミングの趣味に由来します。

使えなくはないんですよ。Juliaが存在するところがあって。ところが制限時間2秒なんですね。Juliaを起動すると1秒ちょっとかかるので、わりと無理です。

(会場笑)

なので今回論文を読んでみてちょっと競プロ的なことを使えそうだな。例えばBFSやったりとか。累積和を書いてたんですけど、なんか気づいたら消えてたんですけど。ここらへんをJuliaで書きたかったというのが趣味のほう。

実益としましては、やはり内積外積の計算が山ほどあって、それをサクサク書ける。あとはforループを回してもPythonとは違ってわりと早いです。

あと1番びっくりしたのが、対称行列の行列式のlogという補正項の部分が2行で書ける。

上の行でSymmetricでパタンってやって、下の行でlogabsdetっていう行列式の内部関数を使って行列式のlogのほうだけを持ってくるみたいなことを。ただこの2行がたぶん1番重い部分ですね。

結果を振り返って

結果としましては、ごめんなさい、まだ論文が出てないので具体的な数値が一切書けないんですけど。とりあえず動きました。

手法からして内部座標使ったりしてぜんぜん違ったんですけど、普通に2、3倍速くらい速くて、BILAB一同かなり驚きました。Juliaはすばらしいと。

ただ1番大事な妥当性なんですが、既存手法よりはマシで、最初の図で出しましたここの1番いいほうで1パーセント切るくらいの誤差っていうところまではちょっと再現しきれなくて。

いろいろ見てみたんですが、補正する項がうまくいってないと。バージョン0.6だと動いてたんですけど、0.7以降でここが0に飛んじゃうっていうのが潰せてなくて。たぶんここを潰せばもうちょいマシになるのですが、まだ手がつけられてない状況です。

まとめとしましてはJuliaの売りである数値計算の速さというのを自分の研究のうえで役立たせることができました。

ただ、こういう非常にマイナーな、とりあえず実装するみたいなのは誰もやっていないことなので欲しけりゃ自分でやるしかないな、っていうのは実務上でも体感した次第です。

以上です。ありがとうございました。

(会場拍手)