post Image
シンプルなNNで 学習失敗時の挙動と Batch Normalization の効果を見る

正解率が 1/クラス数 のままでロスも下がらない状況(学習失敗)になる挙動を見ました。
結果をここにまとめ公開します。参考になれば幸いです。

背景・経緯

  • 深層学習の理解を深めようと、自前で実装を行っています。
  • 学習開始直後に、正解率が 1/クラス数 のまま ロスも下がらない 学習失敗になる状況に遭遇しました。
  • バグを疑い涙目になる。
  • 勘で与えた 学習率の値 が大きかったのが原因。(学習率の値 を小さくすると学習が進む)
  • 学習失敗と 学習が進む場合で、重みとバイアスの推移がどう違うのか関心がわき、グラフ化し、見比べました。
  • MNIST 、隠れ層1の全結合NN のシンプルなNNで見比べました。

得た知見(結論)

  • ReLU と LeakyReLU で、異なる 学習失敗経緯 を見れた。
  •  ReLU にて、全てのパーセプトロンが 負の領域で反応しなくなる推移 を見れた。
  •  Leaky ReLUにて、正負を行き来しながら発散し無効な数値(nan)化する推移を 見れた。
  •   学習率が大きいと、Bias と Weight がともにバタつき 収集つかなくなる。
  • Batch Normalization (以後 BN)すごい。
  •  BNなしで学習失敗した学習率より一桁大きい値でも、BNありだと学習が進む。

ReLU での挙動

NNの構成とパラメータ

B01__ReLU.PNG

  • 乱数種値は 20170523 固定
  • 学習率3つで比較。「学習が失敗する場合」と 「順調に進む場合」 と その中間 「なんか調子悪い」 とで比較する。
  • ミニバッチ600回 (1 epoche) 期間での測定。
  • 「①学習時正解率」は、学習時の正解率。 横軸はミニバッチ回数、縦軸は正解率。グラフは上に行くほど良く正解率が高い。
  • 「②層2 Weight」は、層2の10個のパーセプトロンへのweight(10個) の平均値の推移のグラフ。横軸はミニバッチ回数、縦軸はWeight値。振動していれば学習の進行中で、横線(振動がない)状態はdying 状態。 
  • 「③層2 Bias」は、層2の10個のパーセプトロンへの Bias 値の推移のグラフ。横軸はミニバッチ回数、縦軸はBiasの値。
  • 「④層1 Weight]は、層1の64個のパーセプトロン中の10個に注目し、各注目パーセプトロンへのWeight(768個)の平均値の推移のグラフ。横軸はミニバッチ回数、縦軸はWeight値。振動していれば学習の進行中で、横線(振動がない)状態はdying 状態。
  • 「⑤層1 Bias」は、④で注目したパーセプトロンへの Bias 値の推移のグラフ。横軸はミニバッチ回数、縦軸はBiasの値。

グラフ

(クリックすると拡大します)

学習率 0.05 0.01 0.001
備考 全滅 約半数がdying 順調
①学習時正解率 NNL2_L1P64_AF0_20170614-133836-225_01_correct.png NNL2_L1P64_AF0_20170613-011603-394_01_correct.png NNL2_L1P64_AF0_20170613-011842-720_01_correct.png
②層2 Weight NNL2_L1P64_AF0_20170614-133836-225_02_W_Mean.png NNL2_L1P64_AF0_20170613-011603-394_02_W_Mean.png NNL2_L1P64_AF0_20170613-011842-720_02_W_Mean.png
③層2 Bias NNL2_L1P64_AF0_20170614-133836-225_03_Bias.png NNL2_L1P64_AF0_20170613-011603-394_03_Bias.png NNL2_L1P64_AF0_20170613-011842-720_L1_0_9_Bias.png
④層1 Weight NNL2_L1P64_AF0_20170614-133836-225_L1_0_9_W_Mean.png NNL2_L1P64_AF0_20170613-011603-394_L1_0_9_W_Mean.png NNL2_L1P64_AF0_20170613-011842-720_L1_0_9_W_Mean.png
⑤層1 Bias NNL2_L1P64_AF0_20170614-133836-225_L1_0_9_Bias.png NNL2_L1P64_AF0_20170613-011603-394_L1_0_9_Bias.png NNL2_L1P64_AF0_20170613-011842-720_L1_0_9_Bias.png

グラフから読み取ったこと

  • 学習率 0.05 の時には 全数が、学習率 0.01 の時には半数が、無反応のパーセプトロン(dying ReLU)と化している。
  • Bias と Weight がともに負に振れる→ReLUでの活性化がなくなる→逆伝播もなくなる→変化がなくなる(dying)。の過程が見えた。

Leaky ReLU

NNの構成とパラメータ

B02__LeakyReLU.PNG

  • 乱数種値は 20170523 固定
  • 学習率3つで比較。「値が発散して失敗する場合」と その近傍で「ギリギリ発散しない値」 と 「順調に学習が進む」 とで比較する。
  • ミニバッチ600回 (1 epoche) 期間での測定。
  • ②と④ の 学習率 0.057 のグラフの縦軸は 対数。(対数グラフには絶対値をプロット)
  • 他は ReLU の場合と同じ。

グラフ

学習率 0.057 0.056 0.001
備考 発散   きわどい  順調
①学習時正解率 NNL2_L1P64_AF1_20170612-223219-179_01_correct.png NNL2_L1P64_AF1_20170612-223148-128_01_correct.png NNL2_L1P64_AF1_20170614-133901-570_01_correct.png
②層2 Weight NNL2_L1P64_AF1_20170612-223219-179_02_W_Mean.png NNL2_L1P64_AF1_20170612-223148-128_02_W_Mean.png NNL2_L1P64_AF1_20170614-133901-570_02_W_Mean.png
③層2 Bias NNL2_L1P64_AF1_20170612-223219-179_03_Bias.png NNL2_L1P64_AF1_20170612-223148-128_03_Bias.png NNL2_L1P64_AF1_20170614-133901-570_03_Bias.png
④層1 Weight NNL2_L1P64_AF1_20170612-223219-179_L1_0_9_W_Mean.png NNL2_L1P64_AF1_20170612-223148-128_L1_0_9_W_Mean.png NNL2_L1P64_AF1_20170614-133901-570_L1_0_9_W_Mean.png
⑤層1 Bias NNL2_L1P64_AF1_20170612-223219-179_L1_0_9_Bias.png NNL2_L1P64_AF1_20170612-223148-128_L1_0_9_Bias.png NNL2_L1P64_AF1_20170614-133901-570_L1_0_9_Bias.png
  • 学習率0.057 は、ミニバッチ回数350以降は 無効数値(nan)化し、無意味な計算をおこなっている。

グラフから読み取ったこと

  • Bias と Weight が負に振れた後も、負側でも逆伝播はあり、値は変化していっている。
  • 学習率0.057 の層1にて、Bias と Weight が 正負を繰り返しながら発散する状況が見れた。
  • あるパーセプトロンで発散が始まると、他のパーセプトロンにも影響あたえ発散させていく。

Batch Normalization + ReLU

NNの構成とパラメータ

B03_BN_ReLU.PNG

  • 乱数種値は 20170523 固定
  • 学習率3つで比較。「ReLUで学習失敗した値」と それより10倍大きい「無茶そうな値」 と 「順調に学習が進みそうな値」を用いる。
  • 他は、ReLUの時と同様。

グラフ

学習率 0.5 0.05 0.01
①学習時正解率 NNL2_L1P64_AF0_20170613-181233-465_01_correct.png NNL2_L1P64_AF0_20170613-181202-354_01_correct.png NNL2_L1P64_AF0_20170613-181131-294_01_correct.png
②層2 Weight NNL2_L1P64_AF0_20170613-181233-465_02_W_Mean.png NNL2_L1P64_AF0_20170613-181202-354_02_W_Mean.png NNL2_L1P64_AF0_20170613-181131-294_02_W_Mean.png
③層2 Bias NNL2_L1P64_AF0_20170613-181233-465_03_Bias.png NNL2_L1P64_AF0_20170613-181202-354_03_Bias.png NNL2_L1P64_AF0_20170613-181131-294_03_Bias.png
④層1 Weight NNL2_L1P64_AF0_20170613-181233-465_L1_0_9_W_Mean.png NNL2_L1P64_AF0_20170613-181202-354_L1_0_9_W_Mean.png NNL2_L1P64_AF0_20170613-181131-294_L1_0_9_W_Mean.png
⑤層1 Bias NNL2_L1P64_AF0_20170613-181233-465_L1_0_9_Bias.png NNL2_L1P64_AF0_20170613-181202-354_L1_0_9_Bias.png NNL2_L1P64_AF0_20170613-181131-294_L1_0_9_Bias.png

グラフから読み取ったこと

(Batch Normarizationについては このリンク先の記事も参考になれば幸いです

  • 学習率 0.5 (ReLU で 学習失敗を確認した値の10倍)でも、学習は進んでいるように見える。
  •  BN は順伝播時には、正規化した値を次層に伝達する。  
  •  BNは逆伝播も平均を0にする→ ΔBiasは逆伝播の合計のため0になる → Bias 変動なし。
  •  ↑の特性により、発散しにくく、WeightとBiasがそろって負に偏ることもなりにくく、大きい学習率でも、学習が進むみたい。
      
       

『 機械学習 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。