免責事項
- この記事はThe Official Blog of Kaggle.comに掲載されたHelp! I can’t reproduce a machine learning project!という記事をおおざっぱにエッセンスだけ和訳した記事です。
- きちんと精査した上で投稿すべきかもしれませんが、誤訳や何かしらの問題を発見された場合は、コメント欄や編集リクエストにてお知らせいただけると幸いです。
イントロ
- 機械学習プロジェクトでは、他人の結果や自分自身の過去の結果を再現することができず、フラストレーションがたまる。
- 再現性の鍵は"コード"・"データ"・"環境"。
非決定論的コード
- 機械学習や統計的アルゴリズムはランダムであることが動作するために不可欠な要素である
- ランダム要素の例
- バギング:ランダムにサンプリングされたデータでたくさんの小さなモデルを学習する。
- ブースティング:最初の(モデルに与える)データサブセットは完全にランダムで、残りはそれに依存する。
- ニューラルネットワークでの重みの初期化は、特定の分布で行われる。
- 学習/クロスバリデーション/テストのデータサブセットの分け方。
- サンプリングに依存するいくつかのメソッド(マルコフ連鎖モンテカルロ法)。
- "ランダム","確率的","サンプル","標準","分散"というワードについてドキュメントで言及しているアルゴリズムは何らかのランダム要素をはらんでいるかもしれない。
- 機械学習の結果を再現可能にするためには、ランダム要素が毎回一致していることを確認した上で、コードを走らせる。
- ランダムに同じランダムナンバーを生成するには、ランダムシードの設定を毎回確認しておくことが必要。(ランダムシード: 疑似乱数ジェネレータが乱数を生成する際に使用する設定値。同じシードを与えれば、毎回同じ乱数が生成される。)
- ランダムシードが最初に設定されていないプロジェクトの場合、同じ結果を得ることはできない。
- その場合、いちばんいいのはシードセットを持った新しいモデルを再び学習させること。
データの違い
- データの違いは、潜在的に再現性を損なう可能性がある。
- バージョン管理されたデータセットを使う場合、オリジナルのデータファイルにアクセスできるなら、オリジナルデータと一致するかどうかをチェックする方法はいくつかある。
- Bashのcmpコマンドで二つのファイルが同じであることを確認する。
- データセットファイルのハッシュ値を比較する。(pythonならhashlibライブラリかUNFパッケージ)
-
ワープロソフトやスプレッドシートは重大な犯罪者である
- 自動データフォーマット
- キャラクタエンコーディング
- ワープロソフトやスプレッドシートを使わないか、使うならコピーしたデータでやれ。
- テキストエディタならGeditかNotepad++がおすすめだけど、まあ他にもたくさんあるから人ぞれぞれで。
環境の違い
- 計算環境の違いというのは、コードを走らせるために必要なものすべて(パッケージ、パッケージバージョン、ファイルディレクトリ構造など)を含む。
-
"File not found"エラーが大量発生した場合、コードが参照しているディレクトリ構造が以前と異なるためかもしれない。これを直すのはとても簡単:
- 相対パスではなく絶対パスを使用しているかチェック
- ディレクトリ構造が元の構造と同じかチェック
- 依存関係の不一致による問題を修正するのはもっと難しい。
- 何のパッケージの何のバージョンを使っていたか確認する。
- 言語のバージョンも確認する。
- 環境に関してどれだけの情報を持っているかによって、再現性の難易度が決まる。
- initファイルや要件書などがあるか。
- コンテナや仮想マシンを使った環境があるか。
- 完全にホストされた実行可能な環境があるか。(Kaggle Kernelみたいな)
- こういった情報が一切ない状況で、他人が過去に出した結果を再現しようとする場合、結果を再現しようとしている作業をした人に連絡を取るというのが私のできる最善のアドバイスです。(訳注:ごめんなさい。この訳は怪しく、正確な意味を理解できていません。原文は次の通り。
If you’re trying to reproduce someone else’s work, through, the best advice I can give you is to reach out to the person whose work you’re trying to reproduce.'
->@epsilonさんからご指摘頂いた内容で修正いたしました。"reach out to"は"援助を求める"という成句でした。
まとめ
- 大半のケースにおいて、再現性の問題は"コード"・"データ"・"環境"のいずれかにたどり着く。
- モデリングの結果を再現できないケースはほんのわずかで、そのベストな例はcuDNNライブラリ(NVIDIAのディープラーニングSDKに含まれる)に依存したディープラーニングプロジェクトである。
- 畳み込みニューラルネットワークで使われるいくつかのキーメソッドやbi-directional LSTMsは現状非決定論的である。(ただし最新の情報を得るにはドキュメントを確認して)
- もし再現性が重要である場合、CUDAを使わないことを考えた方が良い。
- この場合トレードオフとなるのは、学習に時間がかかることで、スピードを優先する場合はこれが重要な考慮事項となる。