[Survey]Fast and Accurate Deep Network Learning by Exponential Linear Units (ELUs)

# Exponential Linear Units

## 問題、解決法、効果
**解決したい問題**は、勾配が消失して学習が進まなくなること(**vanishing gradient problem**)
↓
**ELU**は、activation関数を通ったあとの出力の平均を０に近づけることで、**bias shift**を軽減している
↓
学習が速く収束する（効率がよい）

## ReLUの問題点（bias shift)
・**ReLU**は、非負の関数（**non-negative**）なので、その出力の平均は０より大きくなる傾向になる（**bias shift**)。
・それが次の層の入力となるので、Cancelする機能がないと、さらにbias shiftが起こる
・Unit毎の相関が高いほど、bias shiftが大きくなる

![範囲を選択_029.png](https://qiita-image-store.s3.amazonaws.com/0/100523/cab5b4f1-d340-6cfb-7bf6-4d4f5068e899.png)


## その他のActivation関数 
ReLUを改良したものには、
・**"Leaky ReLUs"(LReLUs)**
・**"Parametric ReLUs"(PReLUs)**
・**"Randomized Leaky ReLUs"(RReLUs)**
がある。

**LReLUs**, **PReLUs**, **RReLUs**は、非活性領域でNoiseに**robust**ではない。
これは、非活性領域（負の領域）で値が**Saturation**しないため。

## Exponential Linear Units(ELU）

```math
f(x)= \left\{ \begin{array}{ll}
x & {\rm if}\: x > 0\\
\alpha (exp(x)-1) & {\rm if}\: x \le 0
\end{array} \right.
```
```math
f'(x)= \left\{ \begin{array}{ll}
1 & {\rm if}\: x > 0\\
f(x) + \alpha & {\rm if}\: x \le 0
\end{array} \right.
```
![範囲を選択_029.png](https://qiita-image-store.s3.amazonaws.com/0/100523/95b971f7-30de-cb64-3b0d-4c39860306b1.png)

・Bias Shiftを軽減するために、負の値を取るようにした
・非活性領域でNoiseにRobustになるように、一定の値でSaturationするようにした
・正の領域では入力の大きさによって出力が変わるようにし、負の領域では値の大きさは重要ではないので一定値でSaturationさせる

# Experiments
## Activation Function
**Rectified Linear Units(ReLUs)**

```math
f(x) = {\rm max}(0,x)
```
**Leaky ReLUs(LReLUs)**

```math
f(x) = {\rm max}(\alpha x,x)\:(0 < \alpha < 1)
```
**Shifted ReLUS(SReLUs)**

```math
f(x) = {\rm max}(-1,x)
```
**Exponential Linear Units(ELUs）**

```math
f(x)= \left\{ \begin{array}{ll}
x & {\rm if}\: x > 0\\
\alpha (exp(x)-1) & {\rm if}\: x \le 0
\end{array} \right.
```

## DataSet
|Dataset|image |# of class |# of training data|# of test data|
|:-----:|:---|------:|------:|------:|
|MNIST  |gray image| 10 | 60k | 10k |
|CIFAR-10|color image|10|50k|10k|
|CIFAR-100|color image|100|50k|10k|
|ImageNet|color image|1000|1.3M|100k|

## MNIST

### Learning

**Structure & Parameter**
 ・ Dataset：MNIST
 ・ ８ hidden layer
 ・ SGD learning rate = 0.01
 ・ Minibatch size = 64
 ・ 300 epoch

![範囲を選択_030.png](https://qiita-image-store.s3.amazonaws.com/0/100523/fdcc5181-e043-8bd7-05c8-1bb4d4fff5fb.png)
※左のグラフ：５回テストしたので薄い色で幅を表現し、平均を実線で表示
※右のグラフ：実線...Training Set、破線...Validation Set

左のグラフを見ると、activationの出力平均が他のactivation関数より０に近くなっている。
右のグラフから他のactivation関数より速く収束しているのがわかる。

### Autoencoder

**Structure & Parameter**
 ・ Dataset：MNIST
 ・ ４ fully connected hidden layer
 ・ Unit Size L1:1000, L2:500, L3:250, L4:30
 ・ DecoderはEncoderを反対にしたもの
 ・ SGD Learning Rate=$10^{-2},10^{-3},10^{-4},10^{-5}$
 ・ Minibatch size = 64
 ・ 500 epoch

![範囲を選択_031.png](https://qiita-image-store.s3.amazonaws.com/0/100523/505088ea-27e9-337e-b503-273ba28d3134.png)
ELUが速く収束している。
負の値をとり、SaturationするSReLUもいい結果になっている。

### Activation関数毎の比較
**Structure & Parameter**
 ・ Dataset：CIFAR-100
 ・ 11 convolutional layer
[1 × 192 × 5], [1 × 192 × 1, 1 × 240 × 3], [1 × 240 × 1, 1 × 260 × 2], [1 × 260 × 1, 1 × 280 ×
2], [1 × 280 × 1, 1 × 300 × 2], [1 × 300 × 1], [1 × 100 × 1]  

[]の中の意味は、[layers x units x receptive fields(kernel size)]
 ・ 2×2 max-pooling with a stride of 2
 ・ drop-out rate = (0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.0)
 ・ L2-weight decay regularization term 0.0005
 ・ learning rate schedule 0 − 35k[0.01], 35k − 85k[0.005], 85k − 135k[0.0005], 135k − 165k[0.00005]
 ・ Preprocessing: global contrast, ZCA whitening
 ・ image padding 4 zero pixels at all borders
 ・ 32 × 32 random crop
 ・ random horizontal flipping

![範囲を選択_032.png](https://qiita-image-store.s3.amazonaws.com/0/100523/30103389-be17-740e-bb4a-0180450fce7c.png)

|Activation Function | Test Error |
|:-------------------|-----------:|
|ELUs  |$28.75(\pm0.24)%$|
|SReLUs|$29.35(\pm0.29)%$|
|ReLUs |$31.56(\pm0.37)%$|
|LReLUs|$30.59(\pm0.29)%$|

ELUsが収束が速く、Test Errorも一番いい結果になっている。
負の値をとり、SaturationするSReLUもいい結果になっている。

![範囲を選択_033.png](https://qiita-image-store.s3.amazonaws.com/0/100523/2e923d42-9855-53d9-78e9-cdd1924e603f.png)

## CIFAR-10/CIFAR100
**Structure & Parameter**
 ・ Dataset：CIFAR-100
 ・ 18 convolutional layer
[1×384×3], [1×384×1, 1×384×2, 2×640×2], [1×640×1, 3 × 768 × 2], [1 × 768 × 1, 2 × 896 × 2], [1 × 896 × 3, 2 × 1024 × 2], [1 × 1024 × 1, 1 × 1152 × 2], [1 × 1152 × 1], [1 × 100 × 1]

 ・ Initial drop-out rate, Max-pooling after each stack, L2-weight decay, momentum term, data preprocessing, paddingは前と同じ
 ・ Learning Rateは初期値０．０１を35K回まで、そのあとは0.01を1/10
 ・ Minibatch Size = 100
 ・ 最後の５０K回のdrop out rateは、(0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.0)、さらにそのあと40K回はdrop out rateを１．５倍

Learning RateとDrop out rateを学習回数により変えているがたしかに、Test Error Rateのグラフがそのあたりで変化している。

![範囲を選択_034.png](https://qiita-image-store.s3.amazonaws.com/0/100523/9e2dfd04-4d41-7138-92f7-502bfc80d8da.png)

CIFAR-10では２番、CIFAR-100では１番の結果になっている

## ImageNet
**Structure & Parameter**
 ・ Dataset：ImageNet
 ・ 15 layer CNN
 1 × 96 × 6, 3 × 512 × 3, 5 × 768 × 3, 3 × 1024 × 3, 2 × 4096 × F C, 1 × 1000 × F C
 ・ 2×2 max-pooling with a stride of 2
 ・ 最初のFully Connected Layerの前で、３ levelのspatial pyramid pooling (SPP)
 ・ L2-weight decay term　０．０００５
 ・ FC Layerでdrop out 50%
 ・ 画像を２５６ｘ２５６にResizeして、224x224 random crop と random horizontal flipping 

![範囲を選択_035.png](https://qiita-image-store.s3.amazonaws.com/0/100523/746afc6f-b166-9efd-6fc0-13517338977d.png)

・ReLUと比較して収束も速く、Error Rateも低い
・ReLUと比較してELUは５％遅い
１０ｋ回に要する時間：ELUｓ １２．１５h, ReLUs 11.48h

# 最後に
Batch Normalizationも平均０、分散１になるようにしているので、次のLayerでbias Shiftを軽減する効果がありそうです。
ELUとBatch Normalizationは効果がかぶっている部分があるのかな思います。
なので、併用してもそれほど効果がないと言うことなのかな？
一緒に使っても別に悪い影響は無いとは思いますが。
(On CIFAR-100 ELUs networks significantly outperform ReLU networks with batch normalization while batch normalization does not improve ELU networks.)