旅行好きなソフトエンジニアの備忘録

プログラミングや技術関連のメモを始めました

【ディープラーニング】 "37 Reasons why your Neural Network is not working"のまとめ

下記の記事がためになったため、まとめてみました。 blog.slavv.com

まず調べる事

  • 上手くいくことが分かっている事から始める。例えば画像であればVGGを使ってみる等。ロスも独自の定義ではなく標準のものを使う

  • 正則化やデータ拡張等のオプションを全て止めてみる

  • ファインチューニングを行おうとしているのであれば、元のモデルと前処理の方法が同じか確認する

  • 入力が正しいか確認する

  • 小さなデータセット(2~20)で始めて過学習させる。その後徐々にデータを増やす

  • 正則化、データ拡張、カスタムロス、複雑なモデル等、止めたオプションを徐々に加えていく

次に調べる事

1. データセットの問題

  1. 入力の中身が正しいか調べる

  2. でたらめな入力を入れてみて症状が変わらなければネットワーク側の問題かもしれない

  3. データローダーをチェックする。入力は問題無くてもネットワークに渡す過程に間違いがあるかも。ネットワーク側で受け取った入力をprintしてみる

  4. 入力と出力の対応が取れているか確認する。誤って入力だけシャッフルして入力と出力の対応がでたらめになるケースがある

  5. 入力と出力に関係が存在するか確認する。入力と出力の関係がランダムの場合は学習できない

  6. 出力のラベルミスが無いか確認する

  7. データをシャッフルしてみる

  8. ロス関数を工夫する等、不均衡データ問題を解消する(8 Tactics to Combat Imbalanced Classes in Your Machine Learning Dataset - Machine Learning Mastery

  9. 十分な学習データがあるか?一般的にクラス分類では各クラスに1000個はデータが必要と言われている

  10. バッチ内に複数のラベルが含まれているか確認する

  11. 大きすぎるバッチサイズは汎化性能を劣化させる([1609.04836] On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima)(メモ:ここまで大きなバッチサイズで学習させることは無いから気にしなくて大丈夫そう)

Addition1. ネットワークの正しさを検証するため、MNIST, CIFAR10等既知のデータセットでまず試す

2. データ正規化/拡張

  1. 入力を標準化してみる

  2. データ拡張した画像枚数が多すぎないか?データ拡張は正則化の効果があり、L2正則化ドロップアウトと組み合わせることでアンダーフィットする可能性がある

  3. 転移学習を行う場合、事前トレーニングしたモデルの前処理と同じ前処理を施しているかを確認する

  4. 学習用/検証用/テスト用画像への前処理を確認する。統計処理は学習用データに対して行い、その値を検証用/テスト用画像に用いる

3. 実装の問題

  1. 問題設定を簡単にする。例えばモデルがクラスと座標を予測しようとしているのであれば、クラスのみを予測するよう変更してみる等

  2. Look for correct loss “at chance"(メモ:意味が分からず)

  3. ロス関数にバグが無いか調べる(独自ロス関数を作成した場合)

  4. ロス関数に正しい入力が渡っているか調べる

  5. 複数のロス関数を適用している場合、それらの重みを調べてみる

  6. ロス値以外のメトリクスを観察してみる

  7. 自作のレイヤーがあればそれを調べてみる

  8. 意図せず重みを更新しない設定のレイヤーが無いか調べてみる

  9. 問題が複雑すぎる場合、レイヤーの数を増やしてみる

  10. 次元のミスを疑ってみる。入力サイズが(64, 64, 64)といった場合、どれが何を表すのかは容易に間違えてしまう

  11. 自作の最適化を適用している場合、そこを見直してみる

4. トレーニングの問題

  1. 小さなデータセットで試してモデルが過学習を起こすか確認する(過学習しない場合は何かがおかしい)

  2. 重みの初期化方法を確認する。良く分からない場合、"Xavier"か"He"の初期化を利用する。

  3. ハイパーパラメータを変えてみる

  4. 正則化を緩める。ドロップアウト、バッチノーマライゼーション、L2正則化等を弱めてみる。“Practical Deep Learning for Corders”では、まずはアンダーフィットをさせないようアドバイスしている

  5. 時間をかける。もしロス値が下がり続けているようであれば学習を続けてみる

  6. 学習からテストモードへ変更してみる。ディープラーニングフレームワークの中には学習モードとテストモードでバッチノーマライゼーションドロップアウトの振る舞いが変わるものがある

  7. 学習を視覚化してみる。TensorboardやCrayonを利用してみる。活性化関数にあまりに大きな値が流れ込んでいる場合はバッチノーマライゼーションやELUsを試す。

  8. 異なる最適化手法を適用する

  9. 大きすぎる勾配、もしくは勾配消失が起こっていないか確認する

  10. 学習係数を変えてみる

  11. NaNが出たら、①学習の初期段階でNaNが出たら学習係数を下げてみる ②ゼロ割もしくは自然対数に0以下が入力されていないか確認する ③ここを参考にする ④レイヤー毎にどこでNaNが発生したか確認する