卷積神經網絡之BN層

BN層,即所謂的Batch Normalization,現已經成為神經網絡種的標配,它有什麼樣的魅力以致人們對它如此青睞呢?就讓我們一起來看看BN的前因後世吧。歡迎大家一起交流~~~

提出的背景:

隨機梯度下降法訓練網絡的缺點:

1、需要人為的去選擇合適的參數,比如學習率、參數初始化、權重衰減係數、Dropout等

2、網絡在訓練時,存在梯度消失和梯度爆炸的問題:

梯度消失:以sigmoid函數為例

卷積神經網絡之BN層

卷積神經網絡之BN層

sigmoid激活函數使得輸出值在[0,1]之間,如果輸入很大,其對應的斜率就很小;而梯度(斜率)在反向傳播中時權值學習速率,所以在深度網絡中,如果網絡激活輸出很大,其梯度就很小,學習速率就很慢。假設每層的梯度都小於最大值0.25,網絡由n層,因為鏈式求導的原因,第一層的梯度小於0.25的n次方,所以學習速率很小,對應最後一層只需要對自身求導一次,梯度就大,學習速率就快。這就導致淺層基本不學習,後面幾層一直在學習,失去了深層的意義。

梯度爆炸:

第一層偏移量的梯度=激活層斜率1*權值1*激活層斜率2*...激活層斜率(n-1)*權值(n-1)*激活層斜率n;假設激活層的斜率均為最大值0.25,所有層的權值為100,這樣梯度就會指數增加。

Why為什麼在神經網絡訓練開始之前,都要對輸入數據做一個歸一化處理:

神經網絡的本質就是學習數據的分佈,一旦訓練數據與測試數據的分佈不同,那麼網絡的泛化能力也就大大降低;另外一個方面,一旦每批訓練數據的分佈各不相同(batch的梯度不同),那麼網絡每次迭代都要去學習適應不同的分佈,這樣會大大降低網絡徐熙的訓練速度;而歸一化可以使得訓練數據和測試數據的分佈趨於相同。

對於深度網絡的訓練是一個複雜的過程,只要網絡的前面幾層發生微小的改變,那麼後面幾層就會被累積放大下去。一旦網絡某一層的輸入數據的分佈發生改變,那麼這一層網絡就需要去適應學習這個新的數據分佈,所以如果訓練過程中,訓練數據的分佈一直在發生變化,那麼將會影響網絡的訓練速度。

網絡中間層在訓練過程中,數據分佈的改變稱之為“Internal Covariate Shift”。Paper所提出的算法,就是要解決在訓練過程中,中間層數據分佈發生改變的情況,於是就有了Batch Normalization,這個算法的誕生。

BN層的優勢:

1、網絡學習的收斂速度大幅上升,可以選擇比較大的初始學習率

2、BN層可以提高網絡的泛化能力,採用BN算法後,可以在網絡中去除過擬閤中的dropout層和L2的正則化參數的選擇問題

3、不需要再使用局部響應歸一化層(AlexNet所提出的)

BN概述:

BN(Batch Normalization)也屬於網絡的一層, 算法本質原理:在網絡的每一層輸入的時候,又插入了一個歸一化層,也就是先做一個歸一化處理,然後再進入網絡的下一層。不過文獻歸一化層,可不像我們想象的那麼簡單,它是一個可學習、有參數的網絡層。

常見的歸一化處理:白化

卷積神經網絡之BN層

如果是僅僅使用上面的歸一化公式,對網絡某一層A的輸出數據做歸一化,然後送入網絡下一層B,這樣會影響到本層網絡A所學習到的特徵的。比如網絡中間某一層學習到特徵數據,本身就分佈在S型激活函數的兩側,你強制把它歸一化處理、標準差也限制在了1,等同於把數據變換成分佈於s函數的中間部分;這相當於該層網絡所學習到的特徵分佈被你搞壞了,這可怎麼辦?於是文獻使出了一招驚天地泣鬼神的招式:

變換重構,引入了可學習參數γ、β,這就是算法關鍵之處:

卷積神經網絡之BN層

每一個神經元xk都會有一對這樣的參數γ、β。 這樣其實當:

卷積神經網絡之BN層

我們是可以恢復出原始的某一層所學到的特徵的。因此引入了這個可學習重構參數γ、β,讓網絡可以學習恢復出原始網絡所要學習的特徵分佈。最後Batch Normalization網絡層的前向傳導過程公式就是:

卷積神經網絡之BN層

BN層源碼的實現:

卷積神經網絡之BN層

實際使用:

1、一個網絡一旦訓練結束,就沒有了min-batch這個概念了。測試階段一般只輸入一個測試樣本。因此測試樣本,前向傳導的時候,上面的均值u、標準差σ,哪裡來?其實網絡一旦訓練完畢,參數都是固定的,這個時候即使是每批訓練樣本進入網絡,那麼BN層計算的均值u、和標準差都是固定不變的。我們可以採用這些數值來作為測試樣本所需要的均值、標準差,於是最後測試階段的u和σ計算公式如下:

卷積神經網絡之BN層

對於均值來說直接計算所有batch u值的平均值;然後對於標準偏差採用每個batch,σB的無偏估計。最後測試階段,BN的使用公式就是:

卷積神經網絡之BN層

2、BN可以應用於一個神經網絡的任何神經元上。文獻主要是把BN變換,置於網絡激活函數層的前面。在沒有采用BN的時候,激活函數層是這樣的:

z=g(Wu+b)

也就是我們希望一個激活函數,比如s型函數s(x)的自變量x是經過BN處理後的結果。因此前向傳導的計算公式就應該是:

z=g(BN(Wu+b))

其實因為偏置參數b經過BN層後其實是沒有用的,最後也會被均值歸一化,當然BN層後面還有個β參數作為偏置項,所以b這個參數就可以不用了。因此最後把BN層+激活函數層就變成了:

z=g(BN(Wu))

Batch Normalization在CNN中的使用:

BN層是對於每個神經元做歸一化處理,而不是對一整層網絡的神經元進行歸一化。既然BN是對單個神經元的運算,那麼在CNN中卷積層上要怎麼運算?假如某一層卷積層有6個特徵圖,每個特徵圖的大小是100*100,這樣就相當於這一層網絡有6*100*100個神經元,如果採用BN,就會有6*100*100個參數γ、β。因此卷積層上的BN使用,其實也是使用了類似權值共享的策略,把一整張特徵圖當做一個神經元進行處理。

卷積神經網絡經過卷積後得到的是一系列的特徵圖,如果網絡某一層輸入數據可以表示為四維矩陣(m,f,p,q),m為min-batch sizes,f為特徵圖個數,p、q分別為特徵圖的寬高。在cnn中,可以把每個特徵圖看成是一個特徵處理(一個神經元),因此在使用Batch Normalization,mini-batch size 的大小就是:m*p*q,於是對於每個特徵圖都只有一對可學習參數:γ、β。這就是相當於求所有樣本所對應的一個特徵圖的所有神經元的平均值、方差,然後對這個特徵圖神經元做歸一化。

閱讀paper的難點主要在兩個:

1.為什麼通過歸一化,減少內部斜變量轉移就可以減少梯度消失,加快收斂速度呢?

大神們發現內部斜變量轉移(也就是激活值隨著參數的變化分佈發生變化)會使得輸出層的分佈趨近激活函數的非線性飽和區域,如sigmoid函數的兩端,這樣會使得梯度趨於0,從而無法訓練網絡,LeCun在文章Gradient based learning applied to document recognition中提出過如果輸入數據白化可加速網絡訓練。於是BN的提出者就想出能不能將每一層的激活值歸一化,將他們拉回到均值為0,方差為1的分佈區域,這樣大部分數據都從梯度趨近於0的區域變換至激活函數中梯度較大的區域,從而加快收斂速度。

2.歸一化後又引入了兩個新的參數 gamma與beta,而這兩個參數最極端的情況是把分佈拉回到原分佈,這是為啥?

這是因為歸一化後會影響原始網絡輸出層的表達能力,因此引入兩個參數進行調整,而這兩個參數是網絡自己學習的,因為在歸一化後大部分數據都集中分佈在激活函數中間的線性區域,但對於深層網絡來說多層線性激活等價於一層沒有意義,因此需要在非線性和梯度較大這兩個點之間做個權衡,人為設定可能不合適,因此由網絡自行學習去衡量激活值的位置。


分享到:


相關文章: