dying ReLU について学ぶ (その3) Batch Normalization

dying ReLU の発生が Batch Normarization を用いると どう変わるかが気になり調査しました。結果をここにまとめます。参考になれば幸いです。

[「dying ReLU について学ぶ」](http://qiita.com/t-tkd3a/items/243b523f962f26281037)　と　[「dying ReLU について学ぶ(その２)」](http://qiita.com/t-tkd3a/items/a8453368aae7813b2508) の続きです。
[「Batch Normalization の理解」]( http://qiita.com/t-tkd3a/items/14950dbf55f7a3095600) も参考になれば幸いです。
以下、本文中では Batch Normalization を BN と略します。

# BNありで MiniBatchSize を変化させた場合
## NNの構成 と 測定内容

![04_BN_MiniBatch.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/3b537810-08a4-053b-3a04-0049bc88dd84.png)

## 測定結果
![Matome_MiniBatchSize.png](https://qiita-image-store.s3.amazonaws.com/0/169589/558c99a5-67e0-4d9d-dffb-33059e7e8c64.png)

* グラフ上側は 横軸がepoch数、縦軸が正解率
* グラフ下側は 横軸がepoch数、縦軸はdying ReLU発生数
* 乱数初期値は前回同様 20170523 固定。

### dying ReLU 発生数
* MiniBatchSize がいずれの場合でも 発生しなかった。

### 正解率
* MiniBatchSize 10 が他と比べ 1～1.5%程 正解率が低い。
* 　BN で 正規化するには、MiniBatchSize 10 は少なく、正規化が機能しなく、正解率を下げてると解釈してます。


## dW 変化動画
* 画像は四角一つが１パーセプトロンの重みの変化（dW）を示してます。
* パーセプトロンの四角は、一辺が28ピクセルの計784（＝MNIST）
* 各パーセプトロン内の max～min を 輝度255～0 と変換し表示してます。
* 変換式
　　$xはdwの各値$
　　$yは変換後の輝度値$
　　$iは1～784$

```math
y_i = \frac{x_i - min}{max-min+ 0.0001} × 255 
```

* 0.0001 は0除算防止。　
* max-min が 0.0255未満になると、max値でも 輝度255にならないが、max-minが小さい事が見た目でわかるのでそれはそれで。

* 動画容量の都合で、100epochまでの尺がなく、60epoch まで位しかありません...。

### miniBatchSiza 100にて BN の有無での比較
<!-- NNL2_L1P256_AF0_20170526-143350-101 -->

#### BN あり 動画 
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ht" dir="ltr">BN MiniBatchSize 100 <a href="https://t.co/kH3WU7LIzO">pic.twitter.com/kH3WU7LIzO</a></p>&mdash; t-tkd3a (@t_tkd3a) <a href="https://twitter.com/t_tkd3a/status/869725777616486400">2017年5月31日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

* どのパーセプトロンのも、まんべんなく変化している。 = dWが存在 = 重みが変化している。
* 　（真っ黒なまま変化なしのパーセプトロンが 発生してない）
* 背景部分(文字部分でない場所）が 中間値のグレーになっている。
 　

#### BN なし 動画 
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">MNIST DW 可視化 100epoch <a href="https://t.co/Guy62oA3lH">pic.twitter.com/Guy62oA3lH</a></p>&mdash; t-tkd3a (@t_tkd3a) <a href="https://twitter.com/t_tkd3a/status/867434498463485952">2017年5月24日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

* BNなしでは、背景部分は 白(最大値) または 黒(最小値) が目立つ。 
* Weight に 白(最大値) または 黒(最小値) での　更新が続くと、初期値によっては、ReLUが反応しなくなる……のかな。

#### BN あり 正解率 推移グラフ
![NNL2_L1P256_AF0_20170526-143350-101.png](https://qiita-image-store.s3.amazonaws.com/0/169589/cfd9bf09-28a9-19c8-7089-56310b7a743a.png)

#### BN なし 正解率 推移グラフ
![NNL2_L1P256_AF0_20170523-161328-96.png](https://qiita-image-store.s3.amazonaws.com/0/169589/4c9ac418-e78e-71f7-679f-8e4d7e798161.png)

* BNなしは学習時に正解率が100％に張りつくのが目立つ。
* BNありは学習時に100枚中１～２枚の誤判定が目立つ。
* その影響か、BNありは、テスト時の正解率も、「BNなし」よりも低くなってる。

* 入力画像の使用順は、epoch毎にシャッフルしているのも要因の一つと想像。
* 　「BNなし」の時は、シャッフル済みでも、すでに覚えていて順番関係なく、判別できる……と想像。
* 　「BNあり」では、シャッフルによってMiniBatch内の画像の組み合わせが変わると、平均・分散が変わり、出力値も変動するため、学習データを覚えきるには至らなく、学習データでも誤る……と想像。

以下の MiniBatchSize 500,200,50,10 は BN のみです。

 
### MiniBatchSize 500
<!-- NNL2_L1P256_AF0_20170526-193825-793 -->

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ht" dir="ltr">BN MiniBatchSize 500 <a href="https://t.co/zFyRVITQPv">pic.twitter.com/zFyRVITQPv</a></p>&mdash; t-tkd3a (@t_tkd3a) <a href="https://twitter.com/t_tkd3a/status/869724773231714304">2017年5月31日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

![NNL2_L1P256_AF0_20170526-193825-793.png](https://qiita-image-store.s3.amazonaws.com/0/169589/8c0abb84-2f45-a9c5-c2ab-46aefda35d01.png)


### MiniBatchSize 200
<!-- NNL2_L1P256_AF0_20170526-192346-798 -->

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ht" dir="ltr">BN MiniBatchSize 200 <a href="https://t.co/CV84Up9QVj">pic.twitter.com/CV84Up9QVj</a></p>&mdash; t-tkd3a (@t_tkd3a) <a href="https://twitter.com/t_tkd3a/status/869725085141159936">2017年5月31日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

![NNL2_L1P256_AF0_20170526-192346-798.png](https://qiita-image-store.s3.amazonaws.com/0/169589/4622c876-9312-694f-4a35-cee761184028.png)


### MiniBatchSize 50
<!-- NNL2_L1P256_AF0_20170526-184002-817 -->

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ht" dir="ltr">BN MiniBatchSize 50 <a href="https://t.co/JOICNYkZps">pic.twitter.com/JOICNYkZps</a></p>&mdash; t-tkd3a (@t_tkd3a) <a href="https://twitter.com/t_tkd3a/status/869726360700297216">2017年5月31日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

![NNL2_L1P256_AF0_20170526-184002-817.png](https://qiita-image-store.s3.amazonaws.com/0/169589/7c20f780-d2ec-28c8-ca7f-6970d2102ef3.png)


### MiniBatchSize 10
<!-- NNL2_L1P256_AF0_20170526-145935-674 -->

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ht" dir="ltr">BN MiniBatchSize 10 <a href="https://t.co/LMNTGJouk2">pic.twitter.com/LMNTGJouk2</a></p>&mdash; t-tkd3a (@t_tkd3a) <a href="https://twitter.com/t_tkd3a/status/869726688770277376">2017年5月31日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

* MiniBatchSize 10 にても、まんべんなくｄWが伝達さてきているように見える。

![NNL2_L1P256_AF0_20170526-145935-674.png](https://qiita-image-store.s3.amazonaws.com/0/169589/d0a419b7-7248-309d-e9cb-7867a7b3e2e4.png)

* グラフが真っ青...。　MiniBatchSize 10 では 学習時に１枚を誤ると 正解率90% ですものね...。
 

# BN と LeakyReLU を併用した場合
## NNの構成 と 測定内容
![05_BN_LeakyReLU.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/f355c50b-e808-67c0-4263-b1526c45f70f.png)

## 測定結果
![Matome_Leaky.png](https://qiita-image-store.s3.amazonaws.com/0/169589/ef4c261c-64ed-9d10-5fb7-2fec5eac9727.png)

* 20 epoch 以降では 、0.001 0.01 0.18 0.5 のどれも 正解率はほぼ同じように見える。
* dying ReLUは発生していない。
* 先の ReLU の場合と比べても、正解率はほぼ同じように見える。

## dW 変化動画

### Leaky ReLU 負側傾き 0.001 BNの有無で比較
#### BN あり 動画
<!-- NNL2_L1P256_AF1_20170526-201339-837 -->

<blockquote class="twitter-tweet" data-lang="ja"><p lang="lt" dir="ltr">BN LeakyReLU 0.001 <a href="https://t.co/mgzu2otBsq">pic.twitter.com/mgzu2otBsq</a></p>&mdash; t-tkd3a (@t_tkd3a) <a href="https://twitter.com/t_tkd3a/status/869727424568635392">2017年5月31日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

#### BN なし 動画

<blockquote class="twitter-tweet" data-lang="ja"><p lang="lt" dir="ltr">K:20170523 mb:100 LeakyReLU:0.01 <a href="https://t.co/uJaSY5D5HH">pic.twitter.com/uJaSY5D5HH</a></p>&mdash; t-tkd3a (@t_tkd3a) <a href="https://twitter.com/t_tkd3a/status/868398533040234496">2017年5月27日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

* BN なしでは、dying ReLU判定とはなってないが、真っ黒のまま無反応になっているパーセプトロンが存在するように見える。
* BN ありでは、上記のようなパーセプトロンは発生していないように見える。


#### BN あり グラフ
![NNL2_L1P256_AF1_20170526-201339-837.png](https://qiita-image-store.s3.amazonaws.com/0/169589/d9f6616f-f619-fc94-62f5-fd97ccf6d96f.png)

#### BN なし グラフ
![NNL2_L1P256_AF1_20170523-180754-496.png](https://qiita-image-store.s3.amazonaws.com/0/169589/19cd8c63-53d6-c24e-d0bd-75a5f919c0c0.png)

* ReLUと同様に、LeakyReLUでも、BN なしの方が、正解率が高い。

### Leaky ReLU 負側傾き 0.01
<!-- NNL2_L1P256_AF1_20170526-211126-466 -->

<blockquote class="twitter-tweet" data-lang="ja"><p lang="lt" dir="ltr">BN LeakyReLU 0.01 <a href="https://t.co/Jxlg4ZzRge">pic.twitter.com/Jxlg4ZzRge</a></p>&mdash; t-tkd3a (@t_tkd3a) <a href="https://twitter.com/t_tkd3a/status/869728246933315584">2017年5月31日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

![NNL2_L1P256_AF1_20170526-211126-466.png](https://qiita-image-store.s3.amazonaws.com/0/169589/214e566d-9fd8-04f0-c4c2-e623a891b5ac.png)


### Leaky ReLU 負側傾き 0.18
<!-- NNL2_L1P256_AF1_20170526-204206-63 -->

<blockquote class="twitter-tweet" data-lang="ja"><p lang="lt" dir="ltr">BN LeakyReLU 0.18 <a href="https://t.co/vKAl7lzzJZ">pic.twitter.com/vKAl7lzzJZ</a></p>&mdash; t-tkd3a (@t_tkd3a) <a href="https://twitter.com/t_tkd3a/status/869728972321431552">2017年5月31日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

![NNL2_L1P256_AF1_20170526-204206-63.png](https://qiita-image-store.s3.amazonaws.com/0/169589/cf23618c-3ad6-5d10-110b-2be5266f94a1.png)


### Leaky ReLU 負側傾き 0.5
<!-- NNL2_L1P256_AF1_20170526-213941-908 -->

<blockquote class="twitter-tweet" data-lang="ja"><p lang="lt" dir="ltr">BN LeakyReLU 0.5 <a href="https://t.co/7CEpvvdFB2">pic.twitter.com/7CEpvvdFB2</a></p>&mdash; t-tkd3a (@t_tkd3a) <a href="https://twitter.com/t_tkd3a/status/869729308343812098">2017年5月31日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

![NNL2_L1P256_AF1_20170526-213941-908.png](https://qiita-image-store.s3.amazonaws.com/0/169589/4c0c59f0-4107-0fcb-068e-4c2ea7f5f7f6.png)


# 考察
* dyingReLU よりも BNの効果を見た感あるけども、これはこれで。
* MNISTでは 隠れ層1のシンプルなNNでも、98％程の正解率がでている。残りの２％の誤る要因は、BNを入れる事で解消できる性質のものではなさそう。
* 今回は、Adamを用いたが、SGDでの挙動もみてみたくなってきた。

* BNの効果は、CIFAR-10, CIFAR-100 で CNNを用いてのもう少し深いネットワークで見てみます。