てすと

たかろぐ

自分のログを刻みます。

研究快適ライフが送りたい

こんばんは、今日はすごく暖かくて、とても気持ちの良い日でした。(花粉さんはどこかへ行ってどうぞ)

今日は、研究について少し。

僕は、自然言語処理機械学習辺りをボチボチやっているのですが、 この辺りのテーマはプログラム組んだとしても、膨大な計算能力が必要で実行に時間が掛かるんですよね。

大学生活も残すところ1年で、貴重な時間をどれだけ効率良く使えるかって大切なので、研究に関しても効率的に進めていきたいと思っています。

計算リソースを増やせば当然効率は上がりますが、そこは変えようが無いので諦めます。東工大TSUBAMEが使えるそうですね。羨ましいです。)

そこで今回は、プログラムの切り分けに着目して、保守性を上げたいと思います。 適切に切り分けが出来ていると、自分の考えた手法をパッと実装でき、 暫くコードを見ない期間があったとしてもコードの内容すぐ理解できるようになるので、 無駄に時間を食うことが無くなりますし、リソースの節約にも繋がるかもと思ったからです。

処理の流れを見てみる

上述しましたが、僕は自然言語処理の研究をしています。

日本語とか英語を機械的に処理させるやつですね。 一般人にイメージ付きやすいのは、翻訳とか要約とかでしょうか? 僕は違うタスクで、評判分析をやってます。

そして、そのタスクをやるに当たって、どのような流れで処理していくのか?っていうところを見て、まとめた図が下のやつ。 青文字は処理の概要赤文字は実行によって変化するものです。

f:id:g-knk-9410:20180314182249p:plain

軽く追記すると、

  • 形態素解析
    • 文章の流れから、単語分割や品詞等を推定
  • ベクトル変換
    • 「文字」のままでは学習できないので、数値の羅列である「ベクトル」に変換
  • 学習データ生成
    • 前処理で得たベクトルはそのまま使うのではなく、分割してみたり、情報を追加したりして「より良い学習が行えそうなベクトル」に変換します。
  • モデル学習
    • 単にDeepLearningと言っても、色んなモデルがある
  • テスト
    • 学習したモデルが上手くいくのか検証
    • 僕の場合、1つの文章から複数のベクトルが得られることがあるので、それらを文章に対応する出力としてまとめる

これくらいの粒度でプログラムを分割すれば、保守しやすいプログラムができそうだと感じました。

無駄を省く

このままでも処理の流れは分かるので良いと思うのですが、もっと良くなると思いました。

上述していなかったのですが、僕の研究のポイントは

  • 学習データ生成
  • モデル学習

の部分で、それ以外の所の変化部分の組み合わせ数は、実はそこまで多くありません。 そして、実はベクトル変換の所は、かなりメモリを食います。

僕は変換の為に、GoogleNewsVectorというベクトル辞書を読み込んで使っているのですが、 これ読み込むだけで10GB弱くらいになるんですよね。 読み込むだけで数分掛かったりします。

何が言いたいのかというと、プログラム実行中にずっとこのベクトル辞書(10GB)を読み込んだままでモデル学習に入るのは、良くないんじゃないかな?ということです。

なので、ベクトル変換の所でプログラムを切り分けることにしました。

f:id:g-knk-9410:20180314192849p:plain

このようにすることで、メモリにベクトル辞書を乗せたままディープラーニングを動かすことも無くなるし、 研究生活全体を通してとても重いベクトル辞書を読み込む回数も減って、時間を有効活用できるようになると思います。

因みに、今回はこの粒度で分割しましたが、記事を書いている途中で、モデル学習とテストは分けた方が良いと思ったので、そこも変えていきたいです。

まとめ

今回は、プログラムの切り分けに着目して、快適研究ライフを送るためにどうしたら良いか考えて、前より保守性の高い設計ができてきたかなと思います。

プログラム以外でも、もっと快適に過ごせる案(ex. このツールを導入するともっと良くなるよ!)は、 いつでもどこでもゆるく募集しているので気軽にお願いします〜。