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

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

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

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


# ReLU での挙動
### NNの構成とパラメータ
![B01__ReLU.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/ab8597a8-619b-80b2-6f53-eb796b459b10.png)

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

### グラフ
(クリックすると拡大します)

|学習率|0.05 |0.01 |0.001 |
|:---:|:---:|:---:|:----:|
|備考|全滅 |約半数がdying |順調 |
|①学習時正解率| ![NNL2_L1P64_AF0_20170614-133836-225_01_correct.png](https://qiita-image-store.s3.amazonaws.com/0/169589/ccc3eef4-f977-7f76-7d70-5ff3a4c4ac3c.png) |  ![NNL2_L1P64_AF0_20170613-011603-394_01_correct.png](https://qiita-image-store.s3.amazonaws.com/0/169589/27101b0a-ae22-1f3c-62b1-e69707c861a8.png)       | ![NNL2_L1P64_AF0_20170613-011842-720_01_correct.png](https://qiita-image-store.s3.amazonaws.com/0/169589/878a71bf-16cf-1cd2-ef1c-6fbda4b86477.png)     |
|②層2 Weight| ![NNL2_L1P64_AF0_20170614-133836-225_02_W_Mean.png](https://qiita-image-store.s3.amazonaws.com/0/169589/d5dbcfe6-1cf0-0d76-91b7-ce8aec811741.png)| ![NNL2_L1P64_AF0_20170613-011603-394_02_W_Mean.png](https://qiita-image-store.s3.amazonaws.com/0/169589/47f95958-ae4f-4b8f-3334-a96b09eea6fb.png)         |  ![NNL2_L1P64_AF0_20170613-011842-720_02_W_Mean.png](https://qiita-image-store.s3.amazonaws.com/0/169589/06875db0-c1c2-9bcd-17b5-b5e45a618e51.png)|
|③層2 Bias| ![NNL2_L1P64_AF0_20170614-133836-225_03_Bias.png](https://qiita-image-store.s3.amazonaws.com/0/169589/44d142b0-47da-c6c5-9a8b-9ad81adc9c07.png)|![NNL2_L1P64_AF0_20170613-011603-394_03_Bias.png](https://qiita-image-store.s3.amazonaws.com/0/169589/20582022-a805-278a-13f7-bd45c7381236.png)      |![NNL2_L1P64_AF0_20170613-011842-720_L1_0_9_Bias.png](https://qiita-image-store.s3.amazonaws.com/0/169589/a1b3d791-4c4c-0504-6315-bde3d7c664b3.png)    |
|④層1 Weight|![NNL2_L1P64_AF0_20170614-133836-225_L1_0_9_W_Mean.png](https://qiita-image-store.s3.amazonaws.com/0/169589/8b46b922-27ac-fdbb-315f-8158d0ae02c0.png)|![NNL2_L1P64_AF0_20170613-011603-394_L1_0_9_W_Mean.png](https://qiita-image-store.s3.amazonaws.com/0/169589/ccc52977-a866-95fa-2ef5-876c79e2815e.png) |![NNL2_L1P64_AF0_20170613-011842-720_L1_0_9_W_Mean.png](https://qiita-image-store.s3.amazonaws.com/0/169589/6cd251b8-1dfa-c282-a7dc-b0913cb77576.png)   |
|⑤層1 Bias |![NNL2_L1P64_AF0_20170614-133836-225_L1_0_9_Bias.png](https://qiita-image-store.s3.amazonaws.com/0/169589/4ff9146a-d0a6-81dc-fbbe-c5998af64e61.png)  |![NNL2_L1P64_AF0_20170613-011603-394_L1_0_9_Bias.png](https://qiita-image-store.s3.amazonaws.com/0/169589/8b2e7255-3c08-ffc9-f240-585838716979.png)        |![NNL2_L1P64_AF0_20170613-011842-720_L1_0_9_Bias.png](https://qiita-image-store.s3.amazonaws.com/0/169589/00d73147-b2eb-9c88-ceaf-904906729b1b.png)     |

#### グラフから読み取ったこと
* 学習率 0.05 の時には 全数が、学習率 0.01 の時には半数が、無反応のパーセプトロン(dying ReLU)と化している。
* Bias と Weight がともに負に振れる→ReLUでの活性化がなくなる→逆伝播もなくなる→変化がなくなる（dying）。の過程が見えた。



# Leaky ReLU
### NNの構成とパラメータ
![B02__LeakyReLU.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/bf1848e7-77cb-5792-7577-b00c74cdfafb.png)

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

### グラフ

|学習率|0.057 |0.056 |0.001 |
|:---:|:---:|:---:|:----:|
|備考|発散 　| きわどい　| 順調 |
|①学習時正解率    |![NNL2_L1P64_AF1_20170612-223219-179_01_correct.png](https://qiita-image-store.s3.amazonaws.com/0/169589/4b3cee37-f39e-6e13-c291-e589af5f61af.png)|![NNL2_L1P64_AF1_20170612-223148-128_01_correct.png](https://qiita-image-store.s3.amazonaws.com/0/169589/ba6adb83-b326-d151-fc8d-98675367720a.png)|![NNL2_L1P64_AF1_20170614-133901-570_01_correct.png](https://qiita-image-store.s3.amazonaws.com/0/169589/030228b7-4477-1a6a-81d8-536ae8bba5e4.png)|
|②層2 Weight     |![NNL2_L1P64_AF1_20170612-223219-179_02_W_Mean.png](https://qiita-image-store.s3.amazonaws.com/0/169589/e6f2d50c-5f49-c30d-bda7-5f4568901f03.png)  |![NNL2_L1P64_AF1_20170612-223148-128_02_W_Mean.png](https://qiita-image-store.s3.amazonaws.com/0/169589/faf8a45a-3169-5a2c-5c70-2a5c5640a245.png)|  ![NNL2_L1P64_AF1_20170614-133901-570_02_W_Mean.png](https://qiita-image-store.s3.amazonaws.com/0/169589/c852e037-084f-b102-8b0e-eaa377c7bd9c.png)|
|③層2 Bias     |![NNL2_L1P64_AF1_20170612-223219-179_03_Bias.png](https://qiita-image-store.s3.amazonaws.com/0/169589/d1b9a8c9-1199-972e-5b57-a27320aa8f1d.png)|![NNL2_L1P64_AF1_20170612-223148-128_03_Bias.png](https://qiita-image-store.s3.amazonaws.com/0/169589/c600047b-b515-86a0-df63-d8b547f6807d.png)| ![NNL2_L1P64_AF1_20170614-133901-570_03_Bias.png](https://qiita-image-store.s3.amazonaws.com/0/169589/eee2d0e7-ad1b-e067-ae4a-5f7a05e1cb25.png)|
|④層1 Weight    |![NNL2_L1P64_AF1_20170612-223219-179_L1_0_9_W_Mean.png](https://qiita-image-store.s3.amazonaws.com/0/169589/6f6adc6f-dcd2-c1ff-cb70-d5545b296ef8.png)|![NNL2_L1P64_AF1_20170612-223148-128_L1_0_9_W_Mean.png](https://qiita-image-store.s3.amazonaws.com/0/169589/767456af-16b5-ba83-2ba6-9b23c56cb6c8.png)|  ![NNL2_L1P64_AF1_20170614-133901-570_L1_0_9_W_Mean.png](https://qiita-image-store.s3.amazonaws.com/0/169589/47ceba55-9f2a-62d3-fbd1-15ae50b08ae0.png)|
|⑤層1 Bias  |![NNL2_L1P64_AF1_20170612-223219-179_L1_0_9_Bias.png](https://qiita-image-store.s3.amazonaws.com/0/169589/d80a5899-d790-3d34-c200-3da8562d9aae.png)|![NNL2_L1P64_AF1_20170612-223148-128_L1_0_9_Bias.png](https://qiita-image-store.s3.amazonaws.com/0/169589/26e2c49c-c365-fab4-2b13-f6d45452576f.png)| ![NNL2_L1P64_AF1_20170614-133901-570_L1_0_9_Bias.png](https://qiita-image-store.s3.amazonaws.com/0/169589/8afa64e1-bb8d-8367-2100-c4c1a03180c5.png)|

* 学習率0.057 は、ミニバッチ回数350以降は 無効数値(nan)化し、無意味な計算をおこなっている。  

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


# Batch Normalization + ReLU
### NNの構成とパラメータ
![B03_BN_ReLU.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/93ea3a21-3709-6845-d667-dca2ca6712b7.png)

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

### グラフ

|学習率|0.5 |0.05 |0.01 |
|:---:|:---:|:---:|:----:|
|①学習時正解率|![NNL2_L1P64_AF0_20170613-181233-465_01_correct.png](https://qiita-image-store.s3.amazonaws.com/0/169589/4025d191-3ed8-d251-b186-c28c2e9c3ff8.png)|![NNL2_L1P64_AF0_20170613-181202-354_01_correct.png](https://qiita-image-store.s3.amazonaws.com/0/169589/2b5a4e9f-6701-7de3-2b12-cd4df1f080b1.png) |![NNL2_L1P64_AF0_20170613-181131-294_01_correct.png](https://qiita-image-store.s3.amazonaws.com/0/169589/f385d7d1-7cf6-1b0a-4d95-9de564239a0f.png)|
|②層2 Weight|![NNL2_L1P64_AF0_20170613-181233-465_02_W_Mean.png](https://qiita-image-store.s3.amazonaws.com/0/169589/16dcdad7-ee0e-72b9-ffc8-e3eff3577029.png)|![NNL2_L1P64_AF0_20170613-181202-354_02_W_Mean.png](https://qiita-image-store.s3.amazonaws.com/0/169589/463f5a62-56d0-99ec-2f2f-cb66ac010971.png)|![NNL2_L1P64_AF0_20170613-181131-294_02_W_Mean.png](https://qiita-image-store.s3.amazonaws.com/0/169589/9ff1fb20-e675-bdf9-f767-4781bb25f21c.png)|
|③層2 Bias|![NNL2_L1P64_AF0_20170613-181233-465_03_Bias.png](https://qiita-image-store.s3.amazonaws.com/0/169589/6cd66fe1-545f-6a6d-a885-3bd8e82c8453.png)|![NNL2_L1P64_AF0_20170613-181202-354_03_Bias.png](https://qiita-image-store.s3.amazonaws.com/0/169589/895ef60b-5ff7-cc1e-206f-0e813220ad0f.png)|![NNL2_L1P64_AF0_20170613-181131-294_03_Bias.png](https://qiita-image-store.s3.amazonaws.com/0/169589/ced78d36-4a78-82ac-6f4c-94368ae03ff9.png)|
|④層1 Weight|![NNL2_L1P64_AF0_20170613-181233-465_L1_0_9_W_Mean.png](https://qiita-image-store.s3.amazonaws.com/0/169589/54432c1e-fb71-a288-1811-c9a09cdf20ce.png)|![NNL2_L1P64_AF0_20170613-181202-354_L1_0_9_W_Mean.png](https://qiita-image-store.s3.amazonaws.com/0/169589/7b23d037-185f-aa6d-ca26-60af660e91e5.png)|![NNL2_L1P64_AF0_20170613-181131-294_L1_0_9_W_Mean.png](https://qiita-image-store.s3.amazonaws.com/0/169589/322e7af4-d243-310a-262d-bbaae0032f10.png)|
|⑤層1 Bias |![NNL2_L1P64_AF0_20170613-181233-465_L1_0_9_Bias.png](https://qiita-image-store.s3.amazonaws.com/0/169589/874a7475-61a8-390d-205d-37a7e4199904.png)|![NNL2_L1P64_AF0_20170613-181202-354_L1_0_9_Bias.png](https://qiita-image-store.s3.amazonaws.com/0/169589/b140753b-6538-7d34-b503-48620ba14133.png)|![NNL2_L1P64_AF0_20170613-181131-294_L1_0_9_Bias.png](https://qiita-image-store.s3.amazonaws.com/0/169589/bc84a978-d7a7-8c65-04aa-dd5988252a37.png) |

### グラフから読み取ったこと
([Batch Normarizationについては このリンク先の記事も参考になれば幸いです](http://qiita.com/t-tkd3a/items/14950dbf55f7a3095600) ）

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