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

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

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


# eLU
* [Fast and Accurate Deep Network Learning by Exponential Linear Units (ELUs) (arxiv.org/abs/1511.07289)](https://arxiv.org/abs/1511.07289)

```python:
def eLU(x):
    alpha = 1.0
    return np.where(x>=0.0, x, alpha*np.exp(x)-alpha)
```
![eLU.png](https://qiita-image-store.s3.amazonaws.com/0/169589/dbae86db-8f30-7d98-f3b7-adc20a0edacf.png)

# SeLU
* [Self-Normalizing Neural Networks  (arxiv.org/abs/1706.02515) ](https://arxiv.org/abs/1706.02515)

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

![SeLU.png](https://qiita-image-store.s3.amazonaws.com/0/169589/e1b5731b-5b43-0db5-779f-7b8cd7acbf21.png)

* $X=0$ にエッジがあるんですね。
 
# MNIST 300epoch での比較
![C01__xeLU.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/447995ee-90fb-55d9-298f-8df96855440d.png)

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

![300epoch_test_correct.png](https://qiita-image-store.s3.amazonaws.com/0/169589/c642ddda-0cb4-18d5-7268-c932ea7147f4.png)

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


# 学習率を大きくした場合での比較
先日の記事[シンプルなNNで 学習失敗時の挙動と Batch Normalization の効果を見る](http://qiita.com/t-tkd3a/items/fc0c9f7923847a44962c) と同様に、学習率が大きく学習失敗した時と、学習が進む場合で、重みとバイアスの推移を比較しました。

![C02__xeLU_64.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/b988a7eb-a4ff-ae81-137b-40043c97e8e6.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の値。


## eLU

|学習率|0.01|0.001|
|:---:|:---:|:---:|
|備考|学習失敗|順調|
|①学習時正解率|![NNL2_L1P64_AF3_20170614-233636-977_01_correct.png](https://qiita-image-store.s3.amazonaws.com/0/169589/22139839-0cb9-a526-dc66-bb54ab496ef2.png)|![NNL2_L1P64_AF3_20170614-232749-995_01_correct.png](https://qiita-image-store.s3.amazonaws.com/0/169589/cb8759f6-6657-308c-631e-d7c6ab3c15a9.png)|
|②層２Weight|![NNL2_L1P64_AF3_20170614-233636-977_02_W_Mean.png](https://qiita-image-store.s3.amazonaws.com/0/169589/d466a89c-f5c9-7ea5-9799-55eb070df4c2.png)|![NNL2_L1P64_AF3_20170614-232749-995_02_W_Mean.png](https://qiita-image-store.s3.amazonaws.com/0/169589/95c01b3d-98dd-3594-2cb2-a239adbd2094.png)|
|③層２Bias|![NNL2_L1P64_AF3_20170614-233636-977_03_Bias.png](https://qiita-image-store.s3.amazonaws.com/0/169589/894ceb7d-0df9-0cee-a383-652fe9567f45.png)|![NNL2_L1P64_AF3_20170614-232749-995_03_Bias.png](https://qiita-image-store.s3.amazonaws.com/0/169589/f56bd8fe-b821-4785-052f-f4522f445611.png)|
|④層1Weight|![NNL2_L1P64_AF3_20170614-233636-977_L1_0_9_W_Mean.png](https://qiita-image-store.s3.amazonaws.com/0/169589/93576371-2dac-b6fe-8197-f1097bc7f91e.png)|![NNL2_L1P64_AF3_20170614-232749-995_L1_0_9_W_Mean.png](https://qiita-image-store.s3.amazonaws.com/0/169589/d8572f4d-f440-dd62-31e8-1efb4e797ffa.png)|
|⑤層1Bias|![NNL2_L1P64_AF3_20170614-233636-977_L1_0_9_Bias.png](https://qiita-image-store.s3.amazonaws.com/0/169589/b9d84904-63f5-f1d9-4e12-e147a84454b5.png)|![NNL2_L1P64_AF3_20170614-232749-995_L1_0_9_Bias.png](https://qiita-image-store.s3.amazonaws.com/0/169589/c403902a-7da0-638b-9788-848eab413730.png)|

## SeLU

|学習率|0.01|0.001|
|:---:|:---:|:---:|
|備考|学習失敗|順調|
|①学習時正解率|![NNL2_L1P64_AF2_20170614-233607-753_01_correct.png](https://qiita-image-store.s3.amazonaws.com/0/169589/286b7272-ce8d-95b1-bb24-af6ea9d824f3.png)|![NNL2_L1P64_AF2_20170614-232049-267_01_correct.png](https://qiita-image-store.s3.amazonaws.com/0/169589/5e7d9ec2-e428-163e-7593-44166c98f200.png)|
|②層２Weight|![NNL2_L1P64_AF2_20170614-233607-753_02_W_Mean.png](https://qiita-image-store.s3.amazonaws.com/0/169589/05cfc908-b934-0e79-f98b-01edb34a6951.png)|![NNL2_L1P64_AF2_20170614-232049-267_02_W_Mean.png](https://qiita-image-store.s3.amazonaws.com/0/169589/afe40fbb-1d27-ad47-c264-584a9a4a9cf0.png)|
|③層２Bias|![NNL2_L1P64_AF2_20170614-233607-753_03_Bias.png](https://qiita-image-store.s3.amazonaws.com/0/169589/76dc9148-8b22-831e-fc9f-5cc8d9452bc2.png)|![NNL2_L1P64_AF2_20170614-232049-267_03_Bias.png](https://qiita-image-store.s3.amazonaws.com/0/169589/acb99153-6f65-0b11-1f26-1a9bba141906.png)|
|④層1Weight|![NNL2_L1P64_AF2_20170614-233607-753_L1_0_9_W_Mean.png](https://qiita-image-store.s3.amazonaws.com/0/169589/b25e3fd8-d658-5aa5-29a6-4a45643d3cff.png)|![NNL2_L1P64_AF2_20170614-232049-267_L1_0_9_W_Mean.png](https://qiita-image-store.s3.amazonaws.com/0/169589/0451c247-1e1f-0b32-716e-720ba0e00298.png)|
|⑤層1Bias|![NNL2_L1P64_AF2_20170614-233607-753_L1_0_9_Bias.png](https://qiita-image-store.s3.amazonaws.com/0/169589/924545c8-4536-8b80-37c1-ee8363ce6950.png)|![NNL2_L1P64_AF2_20170614-232049-267_L1_0_9_Bias.png](https://qiita-image-store.s3.amazonaws.com/0/169589/d8ce3e26-aa02-f485-3a3a-67fd8bee61a2.png)|

### グラフから読み取ったこと
* 学習率 0.01 では、eLU と SeLU ともに学習失敗している。
* 　ReLU と LeakyReLU も 0.01 の学習率にて、一応学習は進んでいた。　→[先日の記事](http://qiita.com/t-tkd3a/items/fc0c9f7923847a44962c)  
* 層１のWeightとBiasをみるに、負側に大きく振れた場合に、横線で反応がなくなる状態（dying)が目立つ。
* 　発散よりも、負側の傾きがなくなるところで無反応な状態になりやすそう。

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