深度學習剖根問底:BN中的協方差偏移

今天給大家帶來深度學習的優化策略篇的第一篇Batch NormalizationBN)。BN可以看做對輸入樣本的一種約束,最大作用是加速收斂,減少模型對dropoutcareful weight initialnization依賴,可以adopt higher learning rate的優勢,收斂速度可以提高10倍以上。

 

問題提出:

深度網絡參數訓練時內部存在協方差偏移Internal Covariate Shift現象:深度網絡內部數據分佈在訓練過程中發生變化的現象。

爲什麼會帶來不好影響:訓練深度網絡時,神經網絡隱層參數更新會導致網絡輸出層輸出數據的分佈發生變化,而且隨着層數的增加,根據鏈式規則,這種偏移現象會逐漸被放大。這對於網絡參數學習來說是個問題:因爲神經網絡本質學習的就是數據分佈(representation learning),如果數據分佈變化了,神經網絡又不得不學習新的分佈。爲保證網絡參數訓練的穩定性和收斂性,往往需要選擇比較小的學習速率(learning rate),同時參數初始化的好壞也明顯影響訓練出的模型精度,特別是在訓練具有飽和非線性(死區特性)的網絡,比如即採用S或雙S激活函數網絡,比如LSTMGRU

 

解決辦法:引入Batch Normalization,作爲深度網絡模型的一個層,每次先對input數據進行歸一化,再送入神經網絡輸入層。

 

Batch normalization實現:

1、使網絡某一層的輸入樣本做白化處理(最後發現等價於零均值化(Normalization)處理,擁有零均值,方差爲1),輸入樣本之間不相關。通過零均值化每一層的輸入,使每一層擁有服從相同分佈的輸入樣本,因此克服內部協方差偏移的影響。

  

EX)是輸入樣本X的期望,Var是輸入樣本X的方差。注意,對於一個d維的輸入樣本X=x1,x2,....xd),要對某一層所有的維度一起進行零均值化處理,計算量大,且部分地方不可導,因此,這裏的是針對每個維度k分別處理

2、數據簡化:輸入樣本X規模可能上億,直接計算幾乎是不可能的。因此,選擇每個batch來進行Normalization,得出Batch NormalizationBN)的處理方式:

 

從上圖可以看出,因爲簡單的對數據進行normalize處理會降低,把數據限制在[0,1]的範圍內,對於型激活函數來說,只使用了其線性部分,會限制模型的表達能力。所以,還需要對normalize之後的進行變換:

 

rB做爲參數,可以通過網絡訓練學到。

3、BN的參數求導:輸入樣本進行變換之後,要進行梯度反向傳播,就必須計算BN各個參數的梯度,梯度計算公式如下:


 

可見,通過BN對輸入樣本進行變換是可導的,不會對梯度反向傳播造成影響。

4、爲了加快訓練,我們在模型訓練階段使用BN,但是在推理階段並不一定要使用一樣的。訓練一個BN網絡完整的流程:

 

Batch Normalization的優勢總結:

ad1減少梯度對參數大小或初始值的依賴,使網絡在使用較大學習速率訓練網絡參數時,也不會出現參數發散的情況。過高的學習速率會導致梯度爆炸或梯度消失,或者陷入局部極小值,BN可以幫助處理這個問題:通過把梯度映射到一個值大但次優的變化位置來阻止梯度過小變化:比如,阻止訓練陷入飽和死區。

BN使參數在訓練時更加靈活。過大的學習速率會增加參數的規模,導致反向傳播時發生梯度爆炸。BN中,反向傳播時不會受梯度規模影響。


可見,權重越大,梯度越小,BN時參數變化更穩定。可以推測,當輸入樣本X服從高斯分佈且輸入元素之間相互獨立時,BN可以使層參數的Jacobian擁有接近於1的單值,能夠完整保留梯度的值在反向傳播時不衰減。

 

ad2:正則化模型,減少對dropout的依賴。

BN正則化模型:使用BN訓練時,一個樣本只與minibatch中其他樣本有相互關係;對於同一個訓練樣本,網絡的輸出會發生變化。這些效果有助於提升網絡泛化能力,像dropout一樣防止網絡過擬合,同時BN的使用,可以減少或者去掉dropout類似的策略。

 

ad3:網絡可以採用具有非線性飽和特性的激活函數(比如:s型激活函數),因爲它可以避免網絡陷入飽和狀態。