rtokの日記

露頭に迷ってしまいそうな大学院生が、どこかに書かなければ忘れてしまいそうな大切なことをここに残していきます。

研究用のフレームワークを作ってみる計画 Part1

背景

情報理論のある分野でかなり素晴らしい結果を出したとあるアルゴリズムの汎化に向けての研究をしています。当然僕は天才ではないので汎化のために別の条件でも同じような性能を出す方法を提案する研究を行っています。結果がある程度出ていますが、ある理由によりやる気がほとんど消滅してしまいました。

 

そこで、僕の研究生活を振り返ってみると、

  • 発想力と直感力
  • 多次元データの管理
  • 何通りもののアルゴリズムの管理
  • それによる莫大な組み合わせの結果の管理
  • 多次元データの可視化による解釈

これらを同時に行う必要がありました。実際、研究の面白いところは、この赤色の部分のみです。個人的には青色の部分にも興味はありますが、ほとんど興味は持たれていないといってもいいでしょう。

近い分野で流行っているディープラーニングの研究では、パラメータを調整するだけでいいのでソースの管理は、こちらからしてみるとかなり簡単に見えます。

しかし、複雑な式を組み合わせたアルゴリズムを系統的に管理する必要があるのですが、コーディングスキルがそれほど高くない場合(特にこの分野の研究者はコーディングスキルがほとんど求められない)、コードは研究を重ねていくほど煩雑になっていきます。そして結果が出る頃にはその結果をまとめられなくなります。

そこで、フレームワーク作成の勉強を兼ねて、組合せ爆発に耐えうる試行錯誤用のフレームワーク(仮名:trython)Pythonで作成することにしました。

概要

そもそも、なぜこの発想に至ったかというと、3ヶ月ぶりにコードを眺めていたら、この実験用のスクリプトがある程度汎化できるのではないかということに気づいたからです。まだ論文にしていなので実際のコードの公開はできませんが、ある程度のスクリプト群を説明します。

  • 先行研究により提案されたアルゴリズムを実現するクラス
  • 研究で示したい条件を満たすようなナイーブな実装による子クラス
  • パラメータを改変させながらトレードオフ関係を計算する実験クラス
  • 実験結果を読んで可視化処理するスクリプト

これに加えて子クラスを大量に作ることで試行錯誤の実験を行っていましたが、それでは子クラスを定義するファイルが大量にできるだけで特に実験の内容を保持しておくことができませんでした。

そこで、どんな実験を行ったかをひと目でみてわかるよう、実験スクリプト定義クラスを分離することで管理を行ってみてはどうかとひらめきました。

 

実験スクリプト

実験そのものを記述するためのスクリプトです。設計思想としては、

  • 高い可読性を維持
  • どんな実験を行ったのかが実験スクリプトを見ただけでわかる。(コメントの記述は不要)
  • 実験は実験スクリプトからしか実行できない
  • 入出力、可視化に関して強い関係を保つ

 

定義クラス

実験に必要な概念を定義するためのクラスです。設計思想としては、

  • 概念の記述に関して、適当な汎化を要求(これを怠るとコードが非常に煩雑になる)
  • データの次元、パラメータ、組み合わせパターンなどを管理

 

こんな感じで修論の研究に備えて作ってみようと思います。

アルゴリズムの研究、数値実験を伴う研究をしている大学院生で同じような悩みを持っている方がもしこの記事を見かけたら連絡をください。一緒にやりましょう。