Batch Normalization
1.基本原理
現在一般採用批梯度下降方法對深度學習進行優化,這種方法把數據分爲若干組,按組來更新參數,一組中的數據共同決定了本次梯度的方向,下降時減少了隨機性。另一方面因爲批的樣本數與整個數據集相比小了很多,計算量也下降了很多。
Batch Normalization(簡稱BN)中的batch就是批量數據,即每一次優化時的樣本數目,通常BN網絡層用在卷積層後,用於重新調整數據分佈。假設神經網絡某層一個batch的輸入爲X=[x1,x2,…,xn],其中xi代表一個樣本,n爲batch size。
首先,我們需要求得mini-batch裏元素的 均值:
接下來,求取mini-batch的 方差:
這樣我們就可以對每個元素進行 歸一化。
最後進行尺度縮放和偏移操作,這樣可以變換回原始的分佈,實現恆等變換,這樣的目的是爲了補償網絡的非線性表達能力,因爲經過標準化之後,偏移量丟失。具體的表達如下,yi就是網絡的最終輸出。
假如gamma等於方差,beta等於均值,就實現了恆等變換。
從某種意義上來說,gamma和beta代表的其實是輸入數據分佈的方差和偏移。對於沒有BN的網絡,這兩個值與前一層網絡帶來的非線性性質有關,而經過變換後,就跟前面一層無關,變成了當前層的一個學習參數,這更加有利於優化並且不會降低網絡的能力。
對於CNN,BN的操作是在 各個特徵維度之間單獨進行,也就是說各個通道是分別進行Batch Normalization操作的。
如果輸出的blob大小爲(N,C,H,W),那麼在每一層normalization就是基於N* H*W個數值進行求平均以及方差的操作,記住這裏我們後面會進行比較。
2.BN帶來的好處。
-
(1) 減輕了對參數初始化的依賴,這是利於調參的朋友們的。
-
(2) 訓練更快,可以使用更高的學習率。
-
(3) BN一定程度上增加了泛化能力,dropout等技術可以去掉。
3.BN的缺陷
從上面可以看出,batch normalization依賴於batch的大小,當batch值很小時,計算的均值和方差不穩定。研究表明對於ResNet類模型在ImageNet數據集上,batch從16降低到8時開始有非常明顯的性能下降,在訓練過程中計算的均值和方差不準確,而在測試的時候使用的就是訓練過程中保持下來的均值和方差。
這一個特性,導致batch normalization不適合以下的幾種場景。
-
(1)batch非常小,比如訓練資源有限無法應用較大的batch,也比如在線學習等使用單例進行模型參數更新的場景。
-
(2)rnn,因爲它是一個動態的網絡結構,同一個batch中訓練實例有長有短,導致每一個時間步長必須維持各自的統計量,這使得BN並不能正確的使用。在rnn中,對bn進行改進也非常的困難。不過,困難並不意味着沒人做,事實上現在仍然可以使用的,不過這超出了咱們初識境的學習範圍。
4.BN的改進
針對BN依賴於batch的這個問題,BN的作者親自現身提供了改進,即在原來的基礎上增加了一個仿射變換。
其中參數r,d就是仿射變換參數,它們本身是通過如下的方式進行計算的
其中參數都是通過滑動平均的方法進行更新
所以r和d就是一個跟樣本有關的參數,通過這樣的變換來進行學習,這兩個參數在訓練的時候並不參與訓練。
在實際使用的時候,先使用BN進行訓練得到一個相對穩定的移動平均,網絡迭代的後期再使用剛纔的方法,稱爲Batch Renormalization,當然r和d的大小必須進行限制。
5.Batch Normalization的變種
Normalization思想非常簡單,爲深層網絡的訓練做出了很大貢獻。因爲有依賴於樣本數目的缺陷,所以也被研究人員盯上進行改進。說的比較多的就是 Layer Normalization與Instance Normalization,Group Normalization 了。
前面說了Batch Normalization各個通道之間是獨立進行計算,如果拋棄對batch的依賴,也就是每一個樣本都單獨進行normalization,同時各個通道都要用到,就得到了Layer Normalization。
跟Batch Normalization僅針對單個神經元不同,Layer Normalization考慮了神經網絡中一層的神經元。如果輸出的blob大小爲(N,C,H,W),那麼在每一層Layer Normalization就是基於CHW個數值進行求平均以及方差的操作。
Layer Normalization把每一層的特徵通道一起用於歸一化,如果每一個特徵層單獨進行歸一化呢?也就是限制在某一個特徵通道內,那就是instance normalization了。
如果輸出的blob大小爲(N,C,H,W),那麼在每一層Instance Normalization就是基於H*W個數值進行求平均以及方差的操作。對於風格化類的圖像應用,Instance Normalization通常能取得更好的結果,它的使用本來就是風格遷移應用中提出。
Group Normalization 是Layer Normalization和Instance Normalization 的中間體, Group Normalization將channel方向分group,然後對每個Group內做歸一化,算其均值與方差。
如果輸出的blob大小爲(N,C,H,W),將通道C分爲G個組,那麼Group Normalization就是基於GHW個數值進行求平均以及方差的操作。我只想說,你們真會玩,要榨乾所有可能性。
在Batch Normalization之外,有人提出了通用版本Generalized Batch Normalization,有人提出了硬件更加友好的L1-Norm Batch Normalization等,不再一一講述。
另一方面,以上的Batch Normalization,Layer Normalization,Instance Normalization都是將規範化應用於輸入數據x,Weight normalization則是對權重進行規範化,感興趣的可以自行了解,使用比較少,也不在我們的討論範圍。
這麼多的Normalization怎麼使用呢?有一些基本的建議吧,不一定是正確答案。
-
(1) 正常的處理圖片的CNN模型都應該使用Batch Normalization。只要保證batch size較大(不低於32),並且打亂了輸入樣本的順序。如果batch太小,則優先用Group Normalization替代。
-
(2)對於RNN等時序模型,有時候同一個batch內部的訓練實例長度不一(不同長度的句子),則不同的時態下需要保存不同的統計量,無法正確使用BN層,只能使用Layer Normalization。
-
(3) 對於圖像生成以及風格遷移類應用,使用Instance Normalization更加合適。