看mnist數據集上其他人的CNN模型時了解到了Batch Normalization 這種操作。效果還不錯,至少對於訓練速度提升了很多。
batch normalization的做法是把數據轉換為0均值和單位方差
1. What is BN?
顧名思義,batch normalization嘛,就是“批規范化”咯。Google在ICML文中描述的非常清晰,即在每次SGD時,通過mini-batch來對相應的activation做規范化操作,使得結果(輸出信號各個維度)的均值為0,方差為1. 而最后的“scale and shift”操作則是為了讓因訓練所需而“刻意”加入的BN能夠有可能還原最初的輸入(即當
![\gamma^{(k)}=\sqrt{Var[x^{(k)}]}, \beta^{(k)}=E[x^{(k)}]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD0lNUNnYW1tYSU1RSU3QiUyOGslMjklN0QlM0QlNUNzcXJ0JTdCVmFyJTVCeCU1RSU3QiUyOGslMjklN0QlNUQlN0QlMkMrJTVDYmV0YSU1RSU3QiUyOGslMjklN0QlM0RFJTVCeCU1RSU3QiUyOGslMjklN0QlNUQ=.png)

2. How to Batch Normalize?
怎樣學BN的參數在此就不贅述了,就是經典的chain rule:

3. Where to use BN?
BN可以應用於網絡中任意的activation set。文中還特別指出在CNN中,BN應作用在非線性映射前,即對做規范化。另外對CNN的“權值共享”策略,BN還有其對應的做法(詳見文中3.2節)。
4. Why BN?
好了,現在才是重頭戲--為什么要用BN?BN work的原因是什么?
說到底,BN的提出還是為了克服深度神經網絡難以訓練的弊病。其實BN背后的insight非常簡單,只是在文章中被Google復雜化了。
首先來說說“Internal Covariate Shift”。文章的title除了BN這樣一個關鍵詞,還有一個便是“ICS”。大家都知道在統計機器學習中的一個經典假設是“源空間(source domain)和目標空間(target domain)的數據分布(distribution)是一致的”。如果不一致,那么就出現了新的機器學習問題,如,transfer learning/domain adaptation等。而covariate shift就是分布不一致假設之下的一個分支問題,它是指源空間和目標空間的條件概率是一致的,但是其邊緣概率不同,即:對所有,
,但是
. 大家細想便會發現,的確,對於神經網絡的各層輸出,由於它們經過了層內操作作用,其分布顯然與各層對應的輸入信號分布不同,而且差異會隨着網絡深度增大而增大,可是它們所能“指示”的樣本標記(label)仍然是不變的,這便符合了covariate shift的定義。由於是對層間信號的分析,也即是“internal”的來由。
那BN到底是什么原理呢?說到底還是為了防止“梯度彌散”。關於梯度彌散,大家都知道一個簡單的栗子:。在BN中,是通過將activation規范為均值和方差一致的手段使得原本會減小的activation的scale變大。可以說是一種更有效的local response normalization方法(見4.2.1節)。
5. When to use BN?
OK,說完BN的優勢,自然可以知道什么時候用BN比較好。例如,在神經網絡訓練時遇到收斂速度很慢,或梯度爆炸等無法訓練的狀況時可以嘗試BN來解決。另外,在一般使用情況下也可以加入BN來加快訓練速度,提高模型精度。
誠然,在DL中還有許多除BN之外的“小trick”。別看是“小trick”,實則是“大殺器”,正所謂“The devil is in the details”。希望了解其它DL trick(特別是CNN)的各位請移步我之前總結的:Must Know Tips/Tricks in Deep Neural Networks
以上。
作者:魏秀參
鏈接:https://www.zhihu.com/question/38102762/answer/85238569
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
參考資料:
https://blog.csdn.net/shuzfan/article/details/50723877
https://www.zhihu.com/question/38102762
https://arxiv.org/pdf/1502.03167.pdf