[解決済み] トレーニング中のナンの原因
質問
トレーニング中に頻繁に発生するのは
NAN
が導入されていることに気づきました。
多くの場合、内積/完全連結または畳み込み層の重みが吹き飛ぶことによって導入されるようです。
これは勾配計算が吹っ飛ぶから発生しているのでしょうか?それとも重みの初期化が原因なのでしょうか (もしそうなら、なぜ重みの初期化がこのような影響を及ぼすのでしょうか)。あるいは、入力データの性質が原因でしょうか。
ここでの包括的な疑問は、単純に トレーニング中に NAN が発生する最も一般的な理由は何でしょうか。 そして第二に、これに対抗するためのいくつかの方法(そして、なぜそれが有効なのか)は何でしょうか?
どのように解決するのですか?
私はこの現象に何度か遭遇しました。以下は私の観察結果です。
グラデーションのブローアップ
理由 大きな勾配は学習プロセスを狂わせます。
期待すること
実行時ログを見ると、反復ごとの損失値を見る必要があります。損失が大きくなり始めていることに気がつくでしょう。
著しく
になり、最終的に損失は浮動小数点変数で表せないほど大きくなってしまい、その結果
nan
.
何ができるのか。
を減らす。
base_lr
(solver.prototxtにある)を一桁減らす(少なくとも)。複数のロスレイヤがある場合、ログを調べてどのレイヤがグラデーションの吹き上げの原因になっているかを確認し、そのレイヤの
loss_weight
(train_val.prototxtの)特定のレイヤーのために、一般的な
base_lr
.
学習率の悪いポリシーとパラメータ
理由
caffeは有効な学習率を計算することに失敗し、以下のようになります。
'inf'
または
'nan'
を使用する代わりに、この無効なレートはすべての更新を乗算するため、すべてのパラメータが無効となります。
期待すること
実行時ログを見ると、学習率そのものが
'nan'
となっていることがわかる。
... sgd_solver.cpp:106] Iteration 0, lr = -nan
何ができるのか。
学習率に影響するすべてのパラメータを
'solver.prototxt'
ファイルに記述します。
例えば、もしあなたが
lr_policy: "poly"
を使っていて
max_iter
パラメータを定義し忘れた場合、最終的に
lr = nan
...
caffeの学習率について詳しくは
このスレッド
.
ロス機能の不具合
理由
時々、損失層での損失の計算が原因で
nan
が表示されることがあります。例えば、フィーディング
InfogainLoss
レイヤーに正規化されていない値
バグを含むカスタム損失レイヤーを使用する、など。
期待すること
実行時ログを見ると、おそらく何も異常はないでしょう。損失は徐々に減少し、突然
nan
が表示されます。
何ができるのか。 エラーの再現性を確認し、損失レイヤーにプリントアウトを追加し、エラーをデバッグしてください。
たとえば、次のような場合です。かつて私は、バッチ内のラベルの出現頻度によってペナルティを正規化する損失を使用しました。たまたま、学習ラベルの1つがバッチに全く現れなかった場合、計算された損失は、以下のようになります。
nan
s. その場合、(セット内のラベルの数に関して)十分に大きなバッチで作業することが、このエラーを回避するのに十分でした。
欠陥のある入力
理由
で入力されています。
nan
が入っています。
期待すること
学習プロセスがこの欠陥のある入力にぶつかると、出力は次のようになります。
nan
. 実行時ログを見ると、おそらく何も異常はないだろう:損失は徐々に減少し、突然
nan
が表示されます。
何ができるのか。
入力データセット(lmdb/leveldn/hdf5...)を再ビルドし、トレーニング/バリデーションセットに悪い画像ファイルがないことを確認することです。デバッグのために、入力層を読み込む簡単なネットを構築し、その上にダミーの損失を乗せて、すべての入力を実行することができます:それらのいずれかに欠陥がある場合、このダミーネットも生成する必要があります
nan
.
でカーネルサイズより大きなストライドを
"Pooling"
層
なぜか
stride
>
kernel_size
で結果をプーリングすることができます。
nan
s. 例えば
layer {
name: "faulty_pooling"
type: "Pooling"
bottom: "x"
top: "y"
pooling_param {
pool: AVE
stride: 5
kernel: 3
}
}
の結果は
nan
の中に
y
.
の不安定さ
"BatchNorm"
一部の設定において
"BatchNorm"
レイヤーの出力が
nan
を出力することがあります。
これは
問題
は、bvlc/caffe で提起され
PR #5136
がそれを修正しようとしています。
最近、私は
debug_info
フラグ: 設定
debug_info: true
で
'solver.prototxt'
は、学習中のデバッグ情報(勾配の大きさや活性化値など)をより多く記録するためにcaffe printを行います。この情報は
この情報は、学習過程における勾配の爆発やその他の問題を発見するのに役立ちます。
.
関連
-
[解決済み】TensorFlowでtf.gradientsが動作する方法
-
[解決済み】Keras - KerasRegressorを使用して予測を実行する方法は?
-
[解決済み] Kerasにおける "Flatten "の役割とは?
-
[解決済み] エアフローとKubeflowパイプラインの違いは何ですか?
-
[解決済み] kerasのtrain_on_batch()の使い道は?
-
[解決済み】データセットをトレーニングセットとバリデーションセットに分割する方法には法則性があるのでしょうか?[クローズド]
-
[解決済み】同じ問題で binary_crossentropy と categorical_crossentropy が異なる性能を示すのはなぜか?
-
[解決済み】機械学習モデルの損失と精度の解釈の仕方【終了しました
-
[解決済み] Kerasにおける多対一および多対多のLSTMの例
-
[解決済み] Appleはどのように電子メールの日付、時間、アドレスを見つけるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Keras - KerasRegressorを使用して予測を実行する方法は?
-
[解決済み] PyTorchのバックワード関数
-
[解決済み] イプシロン貪欲q学習におけるイプシロンと学習率の減衰について
-
[解決済み] エアフローとKubeflowパイプラインの違いは何ですか?
-
[解決済み] tf.reset_default_graph() の使用方法
-
[解決済み] サポートベクターマシンに対する人工ニューラルネットワークの優位性は何ですか?[終了しました]
-
[解決済み】線形回帰とロジスティック回帰の違いは何ですか?[クローズド]
-
[解決済み】データセットをトレーニングセットとバリデーションセットに分割する方法には法則性があるのでしょうか?[クローズド]
-
[解決済み】同じ問題で binary_crossentropy と categorical_crossentropy が異なる性能を示すのはなぜか?
-
[解決済み] 期待値最大化手法の直感的な説明とは?[クローズド]