天天看點

深度學習【2】Batch Normalization 論文翻譯

注:本文翻譯的原文為Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift中的BN理論知識(到3.1小節),同時會在翻譯過程中加入一些自己的了解。目的是加深對提出BN的目的及其原理的了解。英語水準以及知識水準有待提高,有不足之處請大家提出來。

http://blog.csdn.net/linmingan/article/details/50780761

Abstract:目前神經網絡層之前的神經網絡層的參數變化,引起神經網絡每一層輸入資料的分布産生了變化,這使得訓練一個深度神經網絡(Deep Neural Networks)變得複雜。這樣就要求使用更小的學習率,參數初始化也需要更為謹慎的設定。并且由于非線性飽和(注:如sigmoid激活函數的非線性飽和問題),訓練一個深度神經網絡會非常困難。我們稱這個現象為:internal covariate shif;同時利用歸一化層輸入解決這個問題。我們将歸一化層輸入作為神經網絡的結構,并且對每一個小批量訓練資料執行這一操作。Batch Normalization(BN) 能使用更高的學習率,并且不需要過多的注重參數初始化問題。BN 的過程與正則化相似,在某些情況下可以去除Dropout。将BN應用到一個state-of-the-art的圖檔分類模型中時,使用BN隻要1/14的訓練次數就能夠達到同樣的精度。使用含有BN神經網絡模型能提升現有最好的ImageNet分類結果:在top-5 驗證集中達到4.9%的錯誤率(測試集為4.8%),超出了人類的分類精度。

1 Introduction

  深度學習極大的促進了許多領域的發展,如視覺、語音以及其他領域。随機梯度下降法(SGD)已經證明能夠有效的訓練深度神經網絡,并且在SGD中加入momentum和Adgrad變量也達到了最好的性能。SGD優化參數 θ θ 來最小化損失函數

θ=argminθ1N∑i=1Nl(Xi,θ) θ = a r g m i n θ ⁡ 1 N ∑ i = 1 N l ( X i , θ )

,其中 X1…N X 1 … N 為訓練資料集。在使用SGD時,每次疊代我們使用一個大小為 m m 的小批量資料X1…mX1…m 。通過計算 1m∂l(Xi,θ)∂θ 1 m ∂ l ( X i , θ ) ∂ θ

來逼近損失函數關于權值的梯度。在疊代過程中使用小批量資料相比使用一個樣本有幾個好處。首先,由小批量資料計算而來的損失函數梯度是由整個訓練資料集的損失函數梯度的估計。并且随着小批量資料大小的增加,其性能會越好。其次,由于現代計算平台的并行性,小批量訓練會比單個樣例訓練更高效。

  盡管随機梯度下降法簡單有效,但卻需要謹慎的調整模型的參數,特别是在優化過程中加入學習率和參數初始化方式的選擇。每一層的輸入都會受之前所有層的參數影響,并且随着網絡越深,即使參數的變化很小也為對每一層的輸入産生很大的影響。這使得訓練一個網絡變得十分複雜。

神經網絡層輸入分布的改變,使得神經網絡層必須不停的适應新的資料分布。當一個學習系統的輸入資料分布産生變化,我們稱這種現象為:Experience Covariate Shift. 解決這種現象的典型方法是領域适應。然而,Covariate Shift的概念的适用性能夠從整個學習系統擴充到該系統的一部分,比如一個子網絡或者其中的一層。考慮一個網絡計算 l=F2(F1(u,θ1),θ2) l = F 2 ( F 1 ( u , θ 1 ) , θ 2 )

其中 F1 F 1 和 F2 F 2 是任意的變換函數。通過學習參數 θ1 θ 1 和 θ2 θ 2 來最小化 l l 。θ2θ2 的學習:如果 X=F1(u,θ1) X = F 1 ( u , θ 1 ) 為子網絡的輸入,那麼 l=F2(X,θ2). l = F 2 ( X , θ 2 ) .

則 θ2 θ 2 的更新為 ( m m :批量資料的樣本數;αα :學習率) θ2←θ2−αm∑i=1m∂F2(Xi,θ2)∂θ2 θ 2 ← θ 2 − α m ∑ i = 1 m ∂ F 2 ( X i , θ 2 ) ∂ θ 2

是以,輸入資料分布相同這一特性,使得子網絡更容易訓練。這與訓練資料和測試資料有相同的分布是相似的。是以保持 X X 的分布不變是有利的。這樣,θ2θ2 就不需要為了彌補 X X 的分布的改變而重新進行調整。

  保持一個子網絡的輸入資料分布不變,對該子網絡以外的隐藏層也有積極的作用。考慮一層激活函數為sigmoid函數的神經網絡層 z=g(Wu+b)z=g(Wu+b) ,其中 u u 為該層的輸入,權值矩陣 WW 和偏置 b b 為該層需要學習的參數,g(x)=11+exp(−x)g(x)=11+exp(−x). 随着 |x| | x | 的增大, g′(x) g ′ ( x ) 趨向0 (因為 g(x)→1 g ( x ) → 1 )。這意味着在 x=Wu+b x = W u + b 的每一維中除了絕對值較小的,其他的流向 u u 的誤差會消失,同時模型的訓練變得很緩慢。而同時 xx 是由 W,b W , b 以及該層以下的全部神經網絡層的參數決定的,所有在訓練期間改變這些參數有可能使 x x 中許多元偏移到非線性飽和端,進而降低了收斂速度。并且這個影響會随着網絡層數的增加而加劇。在實際中非線性飽和端問題以及梯度彌散問題經常用ReLU,合适的初始化以及較小的學習率。如果我們能夠確定非線性輸入的資料分布更穩當的話,那麼出現非線性飽和端問題的機率則會更小,并且能夠加速網絡的訓練。

  我們稱在訓練深度神經網絡的過程中,網絡内部節點的分布發生變換這一現象為,Internal Covariate Shift.。而消除這個現象能夠加速網絡的訓練。我們提出了Batch Normalization ,通過減少依賴參數縮放和初始化,進而緩解Internal Covariate Shift,并動态的加速深度神經網絡的訓練速度。BN 允許使用更高的學習率,而不會有發散的風險。進一步的,BN能夠正則化模型,并且不需要Dropout。最後,BN能夠使用s型激活函數,同時不會陷入飽和端。

  在4.2小節我們将BN加入一個分類模型,該模型在ImageNet中的表現最好。結果顯示BN隻需要使用之前的7%訓練數次,就能夠達到該模型的分類精度,并且最終能夠明顯的提高分類精度。通過利用嵌有 BN 的已訓練好的模型,我們獲得top-5的錯誤率,這超出了在 ImageNet 的已知分類精度。

2 Towards Reducing Internal Covariate Shift

  我們将 Internal Covariate Shift 定義為:在神經網絡的訓練過程中,由于參數改變,而引起的神經網絡激活值分布的改變。我們通過緩解 Internal Covariate Shift 來提高訓練。在訓練的過程中保持神經網絡層輸入的分布不變,來提高訓練資料。我們已經知道,在訓練的過程中加入白化處理能,如0均值1方差化和去相關化,能夠加速模型的收斂。當每一層的輸入來自該層之前的神經網絡層,對于每一層的輸入來說很容易獲得相同的白化。通過對每一層的輸入進行白化處理,我們能夠保持輸入的分布,進而消除 Internal Covariate Shift 的病态影響。

  我們可以在每一步的訓練中白化激活值,也可以通過直接調整模型的結構或者依照激活值來修改優化函數的參數進行白化。然而,如果這些方法在優化步驟中執行,那麼在更新參數的時候,必須先計算歸一化後的激活值的誤差,這降低了梯度下降法的效果。(個人了解:歸一化不能在求的激活值之後進行,不然流到上一層參數的誤內插補點會越來越小,進而影響模型的學習,也就是梯度彌散問題。)舉個例子,考慮一層神經網絡層, uu 為輸入, b b 為偏置值。并且對該神經網絡層的激活值減均值歸一化:x̂ =x−E[x]x^=x−E[x],其中 x=u+b,χ={x1...N} x = u + b , χ = { x 1... N } 為由訓練資料集生成的該神經網絡層輸入的一個集合(訓練資料集 X X 前向傳播到該層), E[x]=1N∑Ni=1xiE[x]=1N∑i=1Nxi。如果 b b 的梯度與 E[x]E[x] 無關,有 b←b+∇b,∇b∝−∂l/∂x̂  b ← b + ∇ b , ∇ b ∝ − ∂ l / ∂ x ^ 。則 u+(b+∇b)−E[u+(b+∇b)]=u+b−E[u+b](注:=x−E[x]) u + ( b + ∇ b ) − E [ u + ( b + ∇ b ) ] = u + b − E [ u + b ] ( 注 : = x − E [ x ] ) 。是以當歸一化和參數 b b 的更新同時進行的時候,會使該神經網絡層的輸出沒有變化,進一步的導緻損失函數的值沒有變化。随着訓練的繼續,bb 一直在增長而損失函數的值卻一直不變。當歸一化操作不僅中心化激活值,同時對其進行縮放,這個現象會更嚴重。在初步的實驗中我們觀察到,如果歸一化參數不在梯度下降中計算的話,會使模型參數膨脹。

  上述方法的問題在于,梯度下降沒有考慮歸一化的情況。為了處理該問題,我們要確定對于任何參數,神經網絡都由期望分布産生激活值。這樣就能使模型參數的損失函數梯度都把歸一化的情況考慮進去。與之前的例子相同,向量 x x 為一層神經網絡層的輸入,χχ 為由訓練資料集生成的該神經網絡層輸入的一個集合。那麼歸一化操作為 x̂ =Norm(x,χ) x ^ = N o r m ( x , χ )

該歸一化操作不僅考慮了 x x ,同時還考慮了所有的訓練樣本 χχ 。如果 x x 是由其他層産生的,那麼 χχ 中的所有樣例都依賴于 θ θ 。對于反向傳播算法,我們就需要計算 ∂Norm(x,χ)∂x和∂Norm(x,χ)∂χ; ∂ N o r m ( x , χ ) ∂ x 和 ∂ N o r m ( x , χ ) ∂ χ ;

如果忽略了後面那一項,就會出現之前描述的模型參數膨脹問題。根據這個架構,白化操作的計算量非常大。因為白化需要計算協方差矩陣 Cov[x]=Ex∈χ[xxT]−E[x]E[xT] C o v [ x ] = E x ∈ χ [ x x T ] − E [ x ] E [ x T ] 、協方差矩陣的負平方根來産生白化激活值 Cov[x]−1/2(x−E[x]) C o v [ x ] − 1 / 2 ( x − E [ x ] ) 以及歸一化相對于的梯度。這就驅使我們尋找一種可微,并且在參數更新的時候不需要對整個訓練資料集進行分析的神經網絡層輸入歸一化方法。

前人的一些方法,如利用統計學計算單個訓練樣本,或者在用于圖像處理的神經網絡中,根據不同的局部區域選擇不同的特征圖。然而,由于去掉了激活值的絕對值縮放,而改變了網絡的表征能力。我們希望通過同時考慮單個訓練樣本和整個訓練樣本集的統計資訊來歸一化激活值,進而在網絡中保留更多的資訊。

3 Normalization via Mini-Batch Statistics

  因為對于每一層的輸入進行白化花費較高,并且也不是處處可微,所有我們做了兩個必要的簡化。第一是,我們對标量特征進行單獨的進行零均值一方差歸一化,來代替白化同時對層的輸入和輸出同時進行歸一化。對于有 d d 維輸入 x=(x(1)...x(d))x=(x(1)...x(d)) 的神經網絡層,我們将利用下試歸一化每一維: x̂ (k)=x(k)−E[x(k)]Var[x(k)]‾‾‾‾‾‾‾‾√ x ^ ( k ) = x ( k ) − E [ x ( k ) ] V a r [ x ( k ) ]

上式中的期望和方差由訓練資料集計算得到。根據 LeCun 的一篇論文,該歸一化能夠加速收斂,甚至是特征之間沒有相關性。

  簡單的歸一化神經網絡層的輸入,可能會改變該層的表征能力。例如,對 sigmoid 函數的輸入進行歸一化,會使歸一化後的輸入趨向 s 型函數的線性端。為了避免這樣的情況出現,我們確定穿插在網絡内部的變換能夠表示同樣的變換。為了達到這樣的目的,我們對每一個激活值 x(k) x ( k ) 都引入一對參數 γ(k) γ ( k ) 和 β(k) β ( k ) ,這兩個參數能夠縮放和平移歸一化後的輸入: y(k)=γ(k)x̂ (k)+β(k). y ( k ) = γ ( k ) x ^ ( k ) + β ( k ) .

這兩個參數與模型原始的參數一起學習,并恢複了模型的表征能力。當 γ(k)=Var[x(k)]‾‾‾‾‾‾‾‾√,β(k)=E[x(k)] γ ( k ) = V a r [ x ( k ) ] , β ( k ) = E [ x ( k ) ] 就能夠求得原來的激活值。

  神經網絡的訓練是基于整個訓練資料集的,在batch的設定中,我們可以用整個訓練資料集來歸一化激活值。但是,當我們使用随機梯度下降法的時候這一選擇是不實際的。是以我們做了第二個簡化:在随機梯度下降中我們采用mini-batch的方式,這樣我們就能夠通過每個mini-batch為每個激活值計算出對應的均值和方差。通過這樣的方式,歸一化所需統計資訊就能夠完全被考慮到梯度下降中去。利用mini-batch就能計算每一維激活值的方差,而不是計算所有激活值的協方差矩陣。如果是計算協方差矩陣的話,batch的數量可能比激活值向量的大小還要小,這樣就會産生奇異協方差矩陣。

假設有一個mini-batch  B ,其大小為 m m 。因為是對激活值的每一維進行歸一化,所有我們隻考慮其中的一個激活值 x(k)x(k) ,同時在下文中忽略 k k 。那麼在一個mini-batch中我們有 mm 個激活值, ={x1...m}. B = { x 1... m } .

x̂ 1...m x ^ 1... m 為歸一化後的值,同時 y1...m y 1... m 為 x̂ 1...m x ^ 1... m 的線性變換。于是有BN變換: BNγ,β:x1...m→y1...m B N γ , β : x 1... m → y 1... m

算法1為BN變換,其中 ε ε 是一個常數(趨于0),為了保證計算方差時的穩定性。

深度學習【2】Batch Normalization 論文翻譯

  BN變換能被加入網絡中,并對任何的激活值執行BN變換。在等式 y=BNγ,β(x) y = B N γ , β ( x ) 中,我們引入了兩個需要學習的參數 γ,β γ , β 。但需要注意的是,BN變換不僅僅與單個訓練樣本相關,也與mini-batch中的其他訓練樣本有關。由縮放和平移變換而來的 y y 作為下一層的輸入。雖然歸一化激活值 x̂ x^ 被包含在BN變換中,但确實非常重要的存在。由于mini-batch中的樣本都來自同一個分布,是以在忽略 ε ε 的情況下, x̂  x ^ 中的每一個元素都為0均值1方差分布。即 ∑mi=1x̂ i=0,1m∑mi=1x̂ 2i=1 ∑ i = 1 m x ^ i = 0 , 1 m ∑ i = 1 m x ^ i 2 = 1 。每個 x̂ (k) x ^ ( k ) 可看做含有線性變換 y(k)=γ(k)x̂ (k)+β(k) y ( k ) = γ ( k ) x ^ ( k ) + β ( k ) 以及原始網絡其他操作的子網絡的輸入。子網絡的輸入保持着相同的均值和方差,并允許歸一化後不同的 x̂ (k) x ^ ( k ) 之間的聯合機率分布在訓練過程中可變。我們希望這一歸一化能夠加速子網的訓練,并最終加速整個網絡的訓練。

  在訓練過程中我們需要計算流過BN變換的誤差,同時也要計算BN變換中涉及到的參數的誤差。利用鍊式規則:

∂l∂x̂ i=∂l∂yi⋅γ ∂ l ∂ x ^ i = ∂ l ∂ y i ⋅ γ

∂l∂σ2=∑i=1m∂l∂x̂ i⋅(xi−u)⋅−12(σ2+ε)−3/2 ∂ l ∂ σ B 2 = ∑ i = 1 m ∂ l ∂ x ^ i ⋅ ( x i − u B ) ⋅ − 1 2 ( σ B 2 + ε ) − 3 / 2

(個人了解: ∂l∂σ2=∑mi=1∂l∂x̂ i⋅∂x̂ i∂σ2 ∂ l ∂ σ B 2 = ∑ i = 1 m ∂ l ∂ x ^ i ⋅ ∂ x ^ i ∂ σ B 2 ,因為方差是由mini-batch中的每一個樣本計算而來的,所有求方差的梯度時候必須考慮到所有的樣本,即有前面的求和。) ∂l∂u=⎛⎝⎜⎜⎜∑i=1m∂l∂x̂ i⋅−1σ2+ε‾‾‾‾‾‾‾√⎞⎠⎟⎟⎟+∂l∂σ2⋅∑mi=1−2(xi−u)m ∂ l ∂ u B = ( ∑ i = 1 m ∂ l ∂ x ^ i ⋅ − 1 σ B 2 + ε ) + ∂ l ∂ σ B 2 ⋅ ∑ i = 1 m − 2 ( x i − u B ) m

(個人了解: ∂l∂u=(∑mi=1∂l∂x̂ i⋅∂x̂ i∂u)+∂l∂σ2⋅∂σ2∂u ∂ l ∂ u B = ( ∑ i = 1 m ∂ l ∂ x ^ i ⋅ ∂ x ^ i ∂ u B ) + ∂ l ∂ σ B 2 ⋅ ∂ σ B 2 ∂ u B ,因為均值是由mini-batch中的每一個樣本計算而來的,所有求方差的梯度時候必須考慮到所有的樣本,即有前面的求和;另外由于方差的計算需要用到均值也就有了加号後面的項。) ∂l∂xi=∂l∂x̂ i⋅1σ2+ε‾‾‾‾‾‾‾√+∂l∂σ2⋅2(xi−u)m+∂l∂u⋅1m ∂ l ∂ x i = ∂ l ∂ x ^ i ⋅ 1 σ B 2 + ε + ∂ l ∂ σ B 2 ⋅ 2 ( x i − u B ) m + ∂ l ∂ u B ⋅ 1 m

(個人了解: ∂l∂xi=∂l∂x̂ i⋅∂x̂ i∂xi+∂l∂σ2⋅∂σ2∂xi+∂l∂u⋅∂u∂xi ∂ l ∂ x i = ∂ l ∂ x ^ i ⋅ ∂ x ^ i ∂ x i + ∂ l ∂ σ B 2 ⋅ ∂ σ B 2 ∂ x i + ∂ l ∂ u B ⋅ ∂ u B ∂ x i ,因為 x̂ i x ^ i 、方差和均值均與 xi x i 有關,是以求其梯度時必須考慮上述三個變量。) ∂l∂γ=∑i=1m∂l∂yi⋅x̂ i ∂ l ∂ γ = ∑ i = 1 m ∂ l ∂ y i ⋅ x ^ i

∂l∂β=∑i=1m∂l∂yi ∂ l ∂ β = ∑ i = 1 m ∂ l ∂ y i

( γ,β γ , β 與偏置 b b <script type="math/tex" id="MathJax-Element-100">b</script> 相似。)

   是以BN變換是将歸一化激活值引入神經網絡的一種可微變換。這確定了網絡可訓練性,以及神經網絡層能夠持續學習輸入資料分布。進而能夠減少Internal Covariate Shift發生,同時加速網絡的訓練。進一步的,将學習好的仿射變換應用到歸一化激活值中,能夠允許BN變換比表示同樣的變換,進而儲存神經網絡的表征能力。

  好了,關于BN的翻譯先到此。原文後面的内容主要是針對CNN的BN使用,以及說明BN能夠使用更高的學習率,可以去掉Dropout,能夠正則化模型等等。作者也介紹了加速BN訓練的一些小技巧。

  最後說一下自己在BN的實驗上的效果。在我自己關于語音處理的資料集中利用BN的分類正确率能提升到68%,而不用的時候隻能53%。同時收斂速度非常快,原來需要200次疊代的訓練,利用BN隻需要20次。這在大資料集訓練的時候大大減少了實驗周期。

繼續閱讀