1. 程式人生 > >深度學習之Batch Normalization

深度學習之Batch Normalization

cal ati 階段 idt 影響 ima 隨機梯度下降 新的 left

原文鏈接:https://www.cnblogs.com/Luv-GEM/p/10756382.html

在機器學習領域中,有一個重要的假設:獨立同分布假設,也就是假設訓練數據和測試數據是滿足相同分布的,否則在訓練集上學習到的模型在測試集上的表現會比較差。而在深層神經網絡的訓練中,當中間神經層的前一層參數發生改變時,該層的輸入分布也會發生改變,也就是存在內部協變量偏移問題(Internal Covariate Shift),從而造成神經層的梯度消失,模型收斂過慢的問題。

Batch Normalization(BN,批量標準化)就是一種解決內部協變量偏移問題的方法,它通過對神經網絡的中間層進行逐層歸一化,讓每一個中間層輸入的分布保持穩定,即保持同一分布。

下面從以下四個方面來深入理解Batch Normalization的原理。

1、內部協變量偏移問題

2、訓練時的Batch Normalization

3、推斷時的Batch Normalization

4、Batch Normalization的優點

一、內部協變量偏移問題

1、內部協變量偏移問題的產生

在傳統機器學習中,一個常見的問題是協變量偏移(Covariate Shift),大致的意思就是數據會隨著時間而變化,用舊數據訓練好的模型去預測新數據時,結果可能會不準確。輸入數據可以看做是協變量,機器學習算法要求輸入數據在訓練集和測試集上滿足同分布,這樣把模型用來預測新的數據,才能有較好的結果。

技術分享圖片

而深層神經網絡中的內部協變量偏移(Internel Covarian Shift)可以拆分為“中間”和“協變量偏移”兩部分來理解。中間二字指的是神經網絡的中間層(隱藏層),協變量偏移則與傳統機器學習中的概念類似。在深層神經網絡中,中間層的輸入也就是前一層的輸出,前一層的參數變化會導致該中間層的輸入(WU+b)的分布發生較大的差異。在用隨機梯度下降來訓練網絡時,每次參數更新都會導致神經網絡中間層的輸入分布發生變化。這就會造成同一次叠代時中間層與中間層之間的輸入分布不一致,在不同的叠代輪次中同一中間層的輸入分布也發生變化。而這就是內部協變量偏移問題。

傳統機器學習的協變量偏移問題是源於測試集與訓練集中輸入分布的不一致,而深層神經網絡中的內部協變量偏移問題的含義稍有不同,是不同中間層的輸入分布不一致。

那麽內部協變量偏移問題又是如何導致梯度消失的呢?

2、內部協變量偏移導致梯度消失

我們換一種說法,深層神經網絡在做非線性變換之前的輸入值(WU+b)隨著網絡深度的加深,或者在每一輪叠代中,其分布逐漸發生變動,一般是整體分布逐漸往非線性激活函數的y值區間的上下限兩端靠近,從而導致反向傳播時底層神經網絡的梯度消失,從而使得神經網絡收斂得越來越慢。

以sigmoid激活函數來舉例,sigmoid函數是個兩端飽和函數,也就是輸入值(WU+b)是非常大的負值或者非常大的正值時,其導數會接近於0;而當輸入值在0附近時,sigmoid函數近似於一個線性函數,導數在0.25以下,但遠離0值。下面是sigmoid函數的導數。

技術分享圖片

首先假設輸入值的分布在沒有發生改變之前服從標準正態分布,即均值為0,方差為1,那麽由概率論的知識可以得到,有95%的概率這個輸入值落在[-2,2]的範圍內,也就是sigmoid函數接近於線性變換的區域,從上圖中目測(簡陋點哈哈)導數在(0.1, 0.25)的範圍內,因此不會發生梯度消失問題。

然後如果輸入值的分布發生了偏移,服從均值為-6,方差為1的正態分布,那麽有95%的概率輸入值落在[-8, -4]的區間中(均值加減兩倍方差),從上圖可以看到,sigmoid函數的導數在這個區間上明顯趨近於0,也就是落在了梯度飽和區。那麽梯度變化就會很小乃至消失。

同樣,如果輸入值的分布偏移到正態分布的右邊,比如服從均值為6,方差為1的正態分布,則sigmoid函數的值接近於1,同樣其導數值也趨近於0。

好,明白了內部協變量偏移會導致梯度消失的原理,並且明白了如果輸入值的分布滿足均值為0,方差為1的條件,那麽就可以比較好地解決梯度消失問題,那麽一個當然的想法就是,對神經網絡的每一個中間層進行標準歸一化,把每一個中間層的輸入值強行從越來越偏的畫風中拉回到又紅又專的狀態(均值為0,方差為1的標準分布) ,使得輸入值落在非線性函數對輸入比較敏感的區域。這樣就能讓梯度保持在比較大的水平,加快學習和收斂的速度。

二、訓練時的Batch Normalization

先聲奪人,首先說明四點:

第一點是Batch Normalization是基於小批量隨機梯度下降(Mini-Batch SGB)的;

第二點是Batch Normalization是放在激活函數之前,可以視為一層;

第三點是Batch Normalization在標準歸一化之後,減弱了神經網絡的非線性表示,需要附加縮放和平移來變換取值區間;

第四點是由於附加了平移變換(加上一個常數),相當於給神經層加了偏置,因此標準歸一化之前的輸入值不用再加偏置(本來是WU+b,現在只要WU就行)。

那麽,接下來慢慢說明。

1、標準歸一化

對每個中間層的神經元的輸入值做BN,可以視為在每個中間層之前加上了一個BN層,它位於計算輸入值WU(第三點說明了這裏不加偏置)之後,進行非線性變換之前。

技術分享圖片

用小批量梯度下降來訓練神經網絡,假設batch size是m,在第t層的輸入值x=WU的維度是d,也就是一個輸入值表示為x = (x(1), x(2),..., x(d)),那麽首先對x的每一個維度的值都進行標準歸一化:

技術分享圖片

這個標準歸一化的含義是:第t層中第k個神經元(即x的第k個維度)的輸入值,減去m個樣本在該層的輸入值第k個維度的均值E(xk),並且除以其標準差(Var(xk)開方)來進行轉換。

要註意的是,本來E(xk)和Var(xk)表示x的第k維度在整個數據集上的期望和方差,可是由於是使用小批量梯度下降算法,所以用m個樣本在第k維度的均值和方差來估計。計算的方程如下:

技術分享圖片

2、縮放和平移變換

對輸入值x進行標準歸一化會使得取值集中在0附近,如果使用sigmoid函數或者tanh激活函數,那麽這個取值區間剛好是接近線性變換的區間,這會減弱非線性激活函數的表示能力。因此,為了不讓標準歸一化對網絡的表示能力產生不良影響,就需要附加縮放(scale)和平移(shift)變換來改變標準歸一化後值的區間,在一定程度上恢復網絡的非線性表示能力。那麽每個神經元就會增加兩個調節參數技術分享圖片,分別用來進行縮放和平移操作,可以通過訓練來學習這兩個參數。

技術分享圖片

有意思的是,這個縮放和平移變換其實是標準歸一化的反向操作,當縮放參數為技術分享圖片,平移參數為技術分享圖片時,可以把值恢復到標準歸一化之前的值x。

還要因為標準歸一化後加了平移變換,相當於在計算輸入值時加了偏置,因此在進行標準歸一化之前的輸入值不需要再加偏置,也就是輸入值為WU,而不是WU+b。

那麽Batch Normalization的算法流程如下:

技術分享圖片

當然,得到這個BN操作之後的值yi,後面該幹嘛幹嘛,把它輸入到非線性激活函數中得到該中間層的輸出。

三、推斷時的Batch Normalization

運用Batch Normalization對輸入值進行調整的深層神經網絡,在訓練階段,是用小批量梯度下降來進行優化的,也就是每輪叠代都把batch size 個樣本餵給模型,通過計算這若幹個樣本的均值和方差,來進行BN操作。那麽在推斷(Inference,我覺得測試和預測都算推斷吧)階段,每次只輸入一個樣本,沒有多個樣本可以求均值和方差,那麽如何對輸入值做Batch Normalization呢?

也比較簡單,因為幸運的是此時模型已經訓練完畢了,那我們可以用整個數據集上的均值μ和方差σ來代替每次小批量樣本的均值和方差,然後在推斷階段就使用這兩個全局統計量來進行BN操作。

那整個數據集上的均值和方差如何得到呢?這樣做,在小批量梯度下降的每輪叠代中,都會輸入batch size 個樣本,然後得到這些樣本的均值和方差,那麽每次都把這些樣本的均值和方差記錄下來。整個數據集都叠代完畢後,再對得到的所有均值和方差求數學期望,就可以得到全局的均值和方差:

技術分享圖片

用全局的均值和方差來進行標準歸一化,就完成了BN操作的第一步。

那麽還有第二步啊,對標準歸一化後的輸入值進行縮放和平移變換。由於在訓練階段結束後,中間層中每個神經元對應的縮放參數γ和平移參數β都已經求出來了,那麽就可以直接用來進行變換。由於在推斷階段,無論是樣本的均值和方差,還是縮放參數和平移參數都已經是常數了,不再變化了,那麽為了計算更快速,就把標準歸一化和縮放、平移變換這兩步的參數整合到一起,存放起來,當輸入新樣本時,直接調用就好了。這也就是把公式進行了以下變換:

技術分享圖片

四、Batch Normalization的優點

1、通過標準歸一化,使得輸入值的均值為0,方差為1,而不是絕對值非常大的數,就可以大大提升訓練速度,加快模型收斂;

2、帶有輕微的正則化效果,與Dropout類似。Dropout通過給隱藏層的神經元以一定的概率乘以0或者1,而給隱藏層的激活值增加了噪音。相比之下,BN操作通過對輸入值減去均值和進行縮放,也給隱藏層的神經元添加了輕微的噪音。

3、使得調參過程簡單了不少。使用梯度下降法對參數進行優化學習時,非常關鍵的一個問題是如何合理地初始化參數值,為此提出了Xavier初始化和He初始化等方法,而使用BN操作後,對於參數初始化的要求就沒那麽高了。而且也可以使用大的學習率。

4、使用飽和型激活函數,比如sigmoid函數和tanh函數,也不怕出現梯度消失問題了。

一句話,媽媽再也不用擔心我在訓練神經網絡時出現梯度消失問題啦!

以上這句話是假的,還需要配合其他方法,來得到更好的效果。

參考資料:

1、邱錫鵬:《神經網絡與深度學習》

2、深入理解Batch Normalization批標準化

https://i.cnblogs.com/EditPosts.aspx?postid=10756382

3、《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift 》

https://arxiv.org/pdf/1502.03167.pdf

深度學習之Batch Normalization