機械学習
DeepLearning
MNIST

シンプルなNNで SeLU と eLU と ReLU を見比べてみる

More than 1 year has passed since last update.

先日 twitter にて SeLU がホットな話題として交わされていたので 関心がわき、シンプルなNN で 見てみました。
結果をここにまとめ公開します。参考になれば幸いです。

背景・経緯

  • 深層学習の理解を深めようと、自前で実装を行ってます。
  • 先日(2017/6 上旬) にて、twitter の TL で SeLU がホットな話題として交わされてるの見て、関心わきました。
  • SeLU と eLU は 似てるらしい。
  • SeLU と eLU と ReLU とで見比べます。

eLU

def eLU(x):
    alpha = 1.0
    return np.where(x>=0.0, x, alpha*np.exp(x)-alpha)

eLU.png

SeLU

def SeLU(x):
    alpha = 1.6732632423543772848170429916717
    scale = 1.0507009873554804934193349852946
    return scale*np.where(x>=0.0, x, alpha*np.exp(x)-alpha)

SeLU.png

  • $X=0$ にエッジがあるんですね。

MNIST 300epoch での比較

C01__xeLU.PNG

  • 300 epoch までのテスト画像での正解率の推移
  • 乱数種値は 20170523 で固定
  • SGD の学習率は 0.001 で固定
  • LeakyReLU の負側の傾きは 0.01

300epoch_test_correct.png

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

  • LeakyReLU が 正解率 98.1% で健闘してます。
  • eLU は ReLU と 同等、LeakyReLUから だいたい 0.1% 位下がる。
  •  負側の傾きの有無の差が 0.1%位の差と出ている様に見える。
  • SeLU と BN+ReLU は 97.9%位 で だいたい同じ。
  •  (もっと際立った特徴でるかと期待してました...)

学習率を大きくした場合での比較

先日の記事シンプルなNNで 学習失敗時の挙動と Batch Normalization の効果を見る と同様に、学習率が大きく学習失敗した時と、学習が進む場合で、重みとバイアスの推移を比較しました。

C02__xeLU_64.PNG

  • 乱数種値は 20170523 固定
  • 学習率2つで比較。「学習が失敗する場合」と 「順調に進む場合」 で比較する。
  • ミニバッチ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の値。

eLU

学習率 0.01 0.001
備考 学習失敗 順調
①学習時正解率 NNL2_L1P64_AF3_20170614-233636-977_01_correct.png NNL2_L1P64_AF3_20170614-232749-995_01_correct.png
②層2Weight NNL2_L1P64_AF3_20170614-233636-977_02_W_Mean.png NNL2_L1P64_AF3_20170614-232749-995_02_W_Mean.png
③層2Bias NNL2_L1P64_AF3_20170614-233636-977_03_Bias.png NNL2_L1P64_AF3_20170614-232749-995_03_Bias.png
④層1Weight NNL2_L1P64_AF3_20170614-233636-977_L1_0_9_W_Mean.png NNL2_L1P64_AF3_20170614-232749-995_L1_0_9_W_Mean.png
⑤層1Bias NNL2_L1P64_AF3_20170614-233636-977_L1_0_9_Bias.png NNL2_L1P64_AF3_20170614-232749-995_L1_0_9_Bias.png

SeLU

学習率 0.01 0.001
備考 学習失敗 順調
①学習時正解率 NNL2_L1P64_AF2_20170614-233607-753_01_correct.png NNL2_L1P64_AF2_20170614-232049-267_01_correct.png
②層2Weight NNL2_L1P64_AF2_20170614-233607-753_02_W_Mean.png NNL2_L1P64_AF2_20170614-232049-267_02_W_Mean.png
③層2Bias NNL2_L1P64_AF2_20170614-233607-753_03_Bias.png NNL2_L1P64_AF2_20170614-232049-267_03_Bias.png
④層1Weight NNL2_L1P64_AF2_20170614-233607-753_L1_0_9_W_Mean.png NNL2_L1P64_AF2_20170614-232049-267_L1_0_9_W_Mean.png
⑤層1Bias NNL2_L1P64_AF2_20170614-233607-753_L1_0_9_Bias.png NNL2_L1P64_AF2_20170614-232049-267_L1_0_9_Bias.png

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

  • 学習率 0.01 では、eLU と SeLU ともに学習失敗している。
  •  ReLU と LeakyReLU も 0.01 の学習率にて、一応学習は進んでいた。 →先日の記事
  • 層1のWeightとBiasをみるに、負側に大きく振れた場合に、横線で反応がなくなる状態(dying)が目立つ。
  •  発散よりも、負側の傾きがなくなるところで無反応な状態になりやすそう。

まとめ

  • eLU SeLU の良さは シンプルはNNでは目立たず、もっと多層や、複雑なデータを扱うときに発揮されるのでしょうか......