批量處理Batch Normalization(BN)

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更加合適。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章