[Survey]All you need is a good init

Layer sequential unit variance ([LSUV](http://arxiv.org/pdf/1511.06422v7.pdf)) initilizaiton

1. **convolution layer**か**fully connected layer**を**直交行列**でプレ初期化する
2. first layerからlast layerに向けて、各Layerの出力の分散値が１になるように正規化する

ネットワークが深くなると学習が難しくなる。
・一様初期化だと、５layer以上でBack Propが困難になる。

最近だと**BN**が学習に有効で、これはBatchごとにLayerの出力を平均０、分散１にする手法です。
ただし、これにより計算のOverheadが**３０％**増えるという新たな問題があります。

IVSRC2012のCNNでは、重みの初期化を平均0, 分散0.01のGaussian noiseとbiasの初期値を１にするのが一般的だった。
ただこれだとネットワークが深くなると学習が難しいという問題がある。
これはもし仮にここのLayerで入力がk倍されるとした時に、kが１より大きければ出力は発散するし、ｋが１より小さいと信号と勾配が消失する。

# Initialization in neural networks
下記は、各activation functionに関して、重みのScaling量ごとのIteration回数と相対的重み更新量のグラフです。
Scalingが大きい値だと発散し、Scalingが小さいと１更新あたり変化量0.0001%で初期値から変わっていないのでネットワークの学習ができていないのがわかる。ReLU-netの最適なScaling値は1.4ぐらいで、これは[Heら](http://arxiv.org/pdf/1502.01852v1.pdf)によって理論的に得られた値と一致している。
![範囲を選択_165.png](https://qiita-image-store.s3.amazonaws.com/0/100523/1f60c758-99bb-760b-cf9f-0c4886aa3f86.png)


# Layer sequential unit variance initialization

LSUVは、othonormal initialization＋最初のmini batchだけのbatch normalizationとみなせる。
otho-normalizationは、Layerのactivationを**無相関**にする効果があります。

```
1. [Saxeら](http://arxiv.org/pdf/1312.6120v3.pdf)の手法により直交行列でネットワークを初期化　　
    1. 分散が1のGaussian noiseで重みを初期化
    2. QR分解かSVDで直交基底を求めて、重みを成分で置き換える
2. loop 各Layer
     「Layerの出力の分散$Var(B_L)-1$が$Tol_{var}$以上でこのwhileを$T_{max}$回まだ繰り返してない」この条件満たしている間続ける
　　　　　Mini-batchをForward Passして、Layerの出力$B_L$を得る
        $Var(B_L)$を計算する
        $W_L$を正規化する$W_L=W_L/\sqrt{Var(B_L)}$
```
![範囲を選択_166.png](https://qiita-image-store.s3.amazonaws.com/0/100523/ceb75527-3ab2-fc48-30ec-f4f1aa22755a.png)

# Experimental Validation
実験に使ったネットワークは以下の通り。
![範囲を選択_167.png](https://qiita-image-store.s3.amazonaws.com/0/100523/c405f623-2247-92d2-856d-3bfbbab01ef0.png)

## MNIST
・60,000個 28x28
・data augmentationはなし
・Error Rate0.38%で一番よい

## CIFAR-10/100
・60,000個 32x32 RGB
・Optimizer SGD
・momentum 0.9
・learning rate 0.01, 100回、150回、２００回でそれぞれ1/10で最後230回まで
・最新手法の同等かそれ以上の性能が出ている。

![範囲を選択_168.png](https://qiita-image-store.s3.amazonaws.com/0/100523/f9656cd1-1713-8c5a-b6f1-7102e165e5f2.png)

# Analysis of empirical results
## 
![範囲を選択_169.png](https://qiita-image-store.s3.amazonaws.com/0/100523/ba91ab10-928d-0dda-ad8b-c82e49eb45db.png)

LSUVだけが収束する手法です。（sigmoid以外）
![範囲を選択_170.png](https://qiita-image-store.s3.amazonaws.com/0/100523/ab2db2c6-9646-8860-8ad8-38b7adf20ad3.png)

![範囲を選択_171.png](https://qiita-image-store.s3.amazonaws.com/0/100523/d4e602b7-3c6f-4b4b-aece-75955bbfb116.png)

## Comparison to Batch Normalization
BNはIoffe&Szegedy(2015)の論文では、各Layerの入力の前か、非線形処理の前ということになっています。Table5をみると、非線形処理の後の方が性能がよい。
![範囲を選択_172.png](https://qiita-image-store.s3.amazonaws.com/0/100523/916d790a-0b8b-0d1a-5c6e-324020e275b0.png)

BNは収束がはやくなるけど、計算コストが上がるからIteration自体の処理時間が長くなる。

## ImageNet Trainning
・最初の0.5epochで0.05LSUVの方がよい。30epochだと1.3%
・現状すべてでDataSet（MNIST, CIFAR-10）でのがBNを使うより、収束がはやく、性能も若干良い。
![範囲を選択_173.png](https://qiita-image-store.s3.amazonaws.com/0/100523/82c796b0-cf9b-f313-94b1-ee94fc4aa3e2.png)

![範囲を選択_174.png](https://qiita-image-store.s3.amazonaws.com/0/100523/8a9d7bc3-098b-ab7a-57d0-f64d5cd06da1.png)

![範囲を選択_175.png](https://qiita-image-store.s3.amazonaws.com/0/100523/8aeaa3c1-7806-153e-fd31-71212322e2d3.png)

## Timings
処理時間はLSUVが一番良い。
![範囲を選択_176.png](https://qiita-image-store.s3.amazonaws.com/0/100523/c7f3bec8-0a8e-e850-b28b-90f4aad71440.png)

# 最後に
LSUVは、重みを直交行列によって無相関にして、Batch Normalizationでbias shiftを抑える効果を狙っているように見えます。
無相関にすることで重みの効率を良くしているのかなという気がします。
Batch Normalizationが必要なくなるのであれば、計算コストも抑えられて良さそうです。
LSUVの主張(Batch Normalizationは計算コストがあがるという主張）からすると、Batch Normalizationと併用は意味がなさそうです。

コードが[Github](https://github.com/ducha-aiki/LSUVinit)にあります。