Background
Covariance shift
——when the input distribution to a learning system changes, it is said to experience covariance shift.
當這種現象發生在多層神經網絡之間時,即前面層參數的改變,使得後面層的輸入分佈發生改變時,就叫Internal covariance shift。
前面層的參數變化會影響當前層的輸入分佈,缺點有二:
1.大大減慢當前層的參數學習速度(當前層也是一個learning system,一旦其輸入的分佈改變,就要調整參數來適應這種分佈);
2.若使用sigmoid激活函數,當前層的輸入可能會處於sigmoid函數的非線性飽和區域,進而導致梯度消失現象。在BN出現以前,通常採用ReLU(x)=max(0,x)激活函數或使用較小的learning rate來解決這個問題。
因此我們想到,如果前面層的輸出activation(即當前層的輸入input)的分佈是一定的呢?那樣就會減少下一層輸入陷入sigmoid飽和非線性區域的可能,梯度不再容易消失,從而加快訓練速度。
Whitening
對某一層的輸出activations進行白化操作(零均值、單位方差、去相關),可以使得這些activations的分佈保持恆定,從而減小internal covariance shift對下一層的影響。
其缺點在於:
1.expensive computation
2.not everywhere differentiable
爲了解決這個問題,作者在Batch_normalization中提出了兩個簡化做法。
Normalization via Mini-batch statistics
BN包括兩個重要的操作:
1.normalization:零均值化、單位方差
2.scale and shift:引入兩個參數,從而使得BN操作可以代表一個恆等變換(相當於BN transform的輸入和輸出是一樣的,也就是不改變輸入分佈)
表示如下:
對某一layer,其輸入x的維度(即前一層的activations個數)爲d,則需要對每一維(即每一個activation)分別進行normalization:
然而,僅僅對每個輸入進行normalization會改變輸入的分佈,例如,若使用的是sigmoid激活函數,則對輸入的normalization會將其限制在sigmoid函數的線性區域,爲了解決這個問題,我們在normalization操作後面加上一個如下所示的線性變換(linear transform),使得整個Batch normalization具有表達恆等變換的能力。
對每一個前一層的輸出activation,都要學習自己的gama、beta。
當每個activation的gama和beta都按如下當時取值時,輸入的activations經過BN操作後分布不變,此時,BN就相當於一個恆等變換了。
整個BN算法框架如下:
反向傳播
推導過程如下:
Testing
Batch-Normalized Convolutional Networks
正如卷積神經網絡裏,同一個feature map裏面的多個units是由同一個kernel在input image的不同區域滑動得到的,當在卷積神經網絡里加入BN操作時,同一個feature map的activations也用同樣的normalization方式,也就是說,對一個具有n個feature maps的activation layer,只需要學習n個gama-beta參數對。
加入BN後
加入BN操作的神經網絡,可以設置更大的learning rate、去掉dropout層、減少L2正則化。
實驗
某一層的輸出activations的分佈隨着訓練時間的增長而變化的曲線:
可以看出,加入BN後,分佈更加穩定,減弱了internal covariance shift。