Help us understand the problem. What is going on with this article?

Makeを研究に使う

TL;DR

  • 機械学習の研究をするときにmakeを使うと再現性が担保出来て便利
  • makeは各ファイル依存関係との作り方を指定すると自動で欲しいファイルを作ってくれるので、「このファイルどうやって作ったんだっけ?」ってならない
  • makeに詳しい人のアドバイスがほしいです!

背景

機械学習を使った研究では、元データ(公開されてるデータセットなど)、前処理したデータ、生成物など様々なファイルを扱います。そして、研究が進むにつれ、不必要なファイルや、生成方法が変わったファイルなどが生まれてきます。これらのファイルが、いつどの様に生成されたものかを管理しないと、実験の再現性がなくなり、論文を執筆する際に非常に困ります(数回やりました)。

そこで最近、makeを使って実験を行うことで最大限の再現性を確保する様にしてます。今回は、研究にmakeを使う際の注意点やコツなどをまとめていきます。

同時に、普段makeを使っている方々からアドバイスがほしいです!

Makeの仕組み

makeを使うにはそのディレクトリにMakefileという名前のファイルがおいておきます。その中には生成したいファイル(target)、依存ファイル(prereq)と、その生成方法をまとめて書きます。すると、欲しいファイルを指定すると自動的にその依存関係を解消し指定したファイルを作成してくれます。

シンプルな例

Makefile
fogefoge.txt:
    echo "Hello World" > $@

hugahuga.txt: fogefoge.txt
    cat $< | tr '[A-Z]' '[a-z]' > $@

ここで、fogefoge.txthugahuga.txttarget)のprereqになっています($@$<はそれぞれtargetprereqに置換されます)。
おなじdirectory内で

$ make fugafuga.txt

とすれば、自動的にhugahuga.txtが作成されます。

自然言語処理の例

生コーパスをtokenizeして全てlower caseにしたあと、そのコーパス上でfasttextを学習する場合を考えます。
data/input/rawcorpus.txtに生コーパスが置かれているとします。

Makefile

Makefile
data/output/preprocessed.txt: data/input/rawcorpus.txt
    mkdir -p $$(dirname $@)
    cat $<| mecab -Owakati| tr '[A-Z]' '[a-z]' > $@

data/output/fasttext.bin: data/output/preprocessed.txt
    fasttext skipgram -input $< -output $@

とすれば

$ make data/output/fasttext.bin

と実行するだけで、データの前処理から分散表現の学習まで自動でやってくれます。
後で、前処理ってどうやってたっけ?と思ってもMakefileを見返せば明白です。

実際の研究ではさらに様々なファイルを扱うので、それら全ての生成方法を覚えておくのはほぼ不可能になると思います。そういったときに強力なツールです。

良かった点

各ファイルの意味を覚えておく必要がなくなった

2日前に書いたコードは他人が書いたコードと同じくらい読めなくなる記憶力の持ち主なので、研究が進むに連れて膨大に増えていくファイルの生成経緯を覚えておく必要がなくなったのは大きかったです。

この実験再現するのかな?と不安にならずに実験できる(精神的な安定)

これまでに実験が再現せず困ったことがあるので、これはすごく大きかったです。ただし、makeを使っておけば再現性が完全に確保されるわけではなく、環境(バージョン)やランダム初期値の差なども考慮する必要があります。

Linuxのコマンドに慣れた

makeではlinuxのコマンドでのファイルの生成方法を記述するので、自然とlinuxコマンドを書く機会が増えました。これまではpythonのスクリプトを書いていた処理も、linuxコマンドに置換され、全体的に見やすくなりました。

悪かった(不満な)点

Makefileのシンタックスが気持ち悪すぎる

ゾットするくらい気持ち悪いので、makeと似た機能のシンタックスがまともなツールがあったら教えてほしいです(懇願)。

複数のワイルドカードが使えない

少しずつ設定を変えて実験を行うときに、maketargetprereqの記述にワイルドカードが使えると便利です。しかし、makeでは複数のワイルドカードが許されないのでループなどを使って書いています。

まだどうしたらいいかわからない点

どこまでmakeで書くか?

研究をすすめる上で、どこまでの処理をmakeで管理するかが悩みです。論文に挿入するtexのテーブル生成までMakefile内に書く人もいるようですが、表の形は論文全体の体裁を整えるために提出直前まで変更することが多いので、Makefileを書き換えている暇はない気もします。(計画的に論文執筆ができれば大丈夫?)

まとめ

「研究にmakeを使うと良いよ」という記事を書こうと思ったら、「makeの使い方教えて下さい!」という記事になってしまいました。
makeの使い方教えて下さい。

jyori112
大学院で自然言語処理の研究をしています。
https://jyori112.github.io
ousia
”賢い”コンピュータを実現するための自然言語処理や質問応答に関する研究及び製品開発を行っています。
http://ousia.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした