優化深度神經網絡(三)Batch Normalization


Coursera吳恩達《優化深度神經網絡》課程筆記(3)-- 超參數調試、Batch正則化和編程框架

1. Tuning Process

深度神經網絡需要調試的超參數(Hyperparameters)較多,包括:

  • \alpha :學習因子
  • \beta :動量梯度下降因子
  • \beta_1,\beta_2,\varepsilon :Adam算法參數
  • #layers:神經網絡層數
  • #hidden units:各隱藏層神經元個數
  • learning rate decay:學習因子下降參數
  • mini-batch size:批量訓練樣本包含的樣本個數

超參數之間也有重要性差異。

1.通常來說,學習因子 \alpha 是最重要的超參數,也是需要重點調試的超參數。

2.動量梯度下降因子 \beta 、各隱藏層神經元個數#hidden units和mini-batch size的重要性僅次於 \alpha

3.神經網絡層數#layers和學習因子下降參數learning rate decay。

4.Adam算法的三個參數 \beta_1,\beta_2,\varepsilon 一般常設置為0.9,0.999和 10^{-8} ,不需要反復調試。

當然,這里超參數重要性的排名並不是絕對的,具體情況,具體分析。

4. Batch Normalization

 在訓練神經網絡時,標准化輸入可以提高訓練的速度。方法是對訓練數據集進行歸一化的操作,即將原始數據減去其均值 \mu 后,再除以其方差 \sigma^2

但是標准化輸入只是對輸入進行了處理,那么對於神經網絡,又該如何對各隱藏層的輸入進行標准化處理呢?

其實在神經網絡中,第 l 層隱藏層的輸入就是第 l-1 層隱藏層的輸出 A^{[l-1]} 。對 A^{[l-1]} 進行標准化處理,從原理上來說可以提高 W^{[l]}b^{[l]} 的訓練速度和准確度。這種對各隱藏層的標准化處理就是Batch Normalization。值得注意的是,實際應用中,一般是對 Z^{[l-1]} 進行標准化處理而不是 A^{[l-1]} ,其實差別不是很大。

Batch Normalization對第 l 層隱藏層的輸入 Z^{[l-1]} 做如下標准化處理,忽略上標 [l-1]單層

 

\mu=\frac1m\sum_iz^{(i)}

 

\sigma^2=\frac1m\sum_i(z_i-\mu)^2

 

z^{(i)}_{norm}=\frac{z^{(i)}-\mu}{\sqrt{\sigma^2+\varepsilon}}

 

其中,m是單個mini-batch包含樣本個數, \varepsilon 是為了防止分母為零,可取值 10^{-8} 。這樣,使得該隱藏層的所有輸入 z^{(i)} 均值為0,方差為1。

但是,大部分情況下並不希望所有的 z^{(i)} 均值都為0,方差都為1,也不太合理。通常需要對 z^{(i)} 進行進一步處理:

 

\tilde z^{(i)}=\gamma\cdot z^{(i)}_{norm}+\beta

 

上式中, \gamma\beta 是可學習參數,類似於W和b一樣,可以通過梯度下降等算法求得。這里, \gamma\beta 的作用是讓 \tilde z^{(i)} 的均值和方差為任意值,只需調整其值就可以了。

 

例如,令:

\gamma=\sqrt{\sigma^2+\varepsilon},\ \ \beta=u , 則 \tilde z^{(i)}=z^{(i)} ,即他們兩恆等。

可見,設置 \gamma\beta 為不同的值,可以得到任意的均值和方差。

這樣,通過Batch Normalization,對隱藏層的各個 z^{[l](i)} 進行標准化處理,得到 \tilde z^{[l](i)} ,替代 z^{[l](i)}

 

輸入的標准化處理Normalizing inputs和隱藏層的標准化處理Batch Normalization是有區別的:

Normalizing inputs使所有輸入的均值為0,方差為1。而Batch Normalization可使各隱藏層輸入的均值和方差為任意值。實際上,從激活函數的角度來說,如果各隱藏層的輸入均值在靠近0的區域即處於激活函數的線性區域,這樣不利於訓練好的非線性神經網絡,得到的模型效果也不會太好。這也解釋了為什么需要用 \gamma\beta 來對 z^{[l](i)} 作進一步處理。

 

Batch Norm經常使用在mini-batch上,這也是其名稱的由來。

值得注意的是,因為Batch Norm對各隱藏層 Z^{[l]}=W^{[l]}A^{[l-1]}+b^{[l]} 有去均值的操作,所以這里的常數項 b^{[l]} 可以消去,其數值效果完全可以由 \tilde Z^{[l]} 中的 \beta 來實現。因此,我們在使用Batch Norm的時候,可以忽略各隱藏層的常數項 b^{[l]} 。在使用梯度下降算法時,分別對 W^{[l]}\beta^{[l]}\gamma^{[l]} 進行迭代更新。

除了傳統的梯度下降算法之外,還可以使用我們之前介紹過的動量梯度下降、RMSprop或者Adam等優化算法。

BN算法 在訓練中對於一個mini-batch  

Algorithm 1: Batch Normalizing Transform, applied to activation x over a mini-batch.

 

在訓練過程中,我們還需要計算反向傳播損失函數l的梯度,並且計算每個參數(注意:\gamma 和 \beta)。 我們使用鏈式法則,如下所示:

推導過程:

Batch Normalization學習筆記及其實現

 

BN算法在訓練和測試時的應用

BN算法在訓練時的操作就如我們上面所說,首先提取每次迭代時的每個mini-batch的平均值和方差進行歸一化,再通過兩個可學習的變量恢復要學習的特征。 
但是在實際應用時就沒有mini-batch了,那么BN算法怎樣進行歸一化呢?實際上在測試的過程中,BN算法的參數就已經固定好了,首先進行歸一化時的平均值和方差分別為:

方法1:即平均值為所有mini-batch的平均值的平均值,而方差為每個batch的方差的無偏估計

方法2:估計的方法有很多,理論上我們可以將所有訓練集放入最終的神經網絡模型中,然后將每個隱藏層計算得到的 \mu^{[l]} 和 \sigma^{2[l]} 直接作為測試過程的 \mu 和 \sigma^2 來使用。但是,實際應用中一般不使用這種方法,而是使用我們之前介紹過的指數加權平均(exponentially weighted average)的方法來預測測試過程單個樣本的 \mu 和 \sigma^2 。

指數加權平均的做法很簡單,對於第 l 層隱藏層,考慮所有mini-batch在該隱藏層下的 \mu^{[l]} 和 \sigma^{2[l]} ,然后用指數加權平均的方式來預測得到當前單個樣本的 \mu^{[l]} 和 \sigma^{2[l]} 。這樣就實現了對測試過程單個樣本的均值和方差估計。最后,再利用訓練過程得到的 \gamma 和 \beta 值計算出各層的 \tilde z^{(i)} 值。

 

最終BN算法的訓練和測試的流程如下圖所示: 

 

第11步就是將代入  μ和σ要換成算法中的Ex和Varx

 

Batch Norm讓模型更加健壯

如果實際應用的樣本與訓練樣本分布不同,即發生了covariate shift,則一般是要對模型重新進行訓練的。在神經網絡,尤其是深度神經網絡中,covariate shift會導致模型預測效果變差,重新訓練的模型各隱藏層的 W^{[l]}B^{[l]} 均產生偏移、變化。

Batch Norm的作用恰恰是減小covariate shift的影響,讓模型變得更加健壯,魯棒性更強。

Batch Norm減少了各層 W^{[l]}B^{[l]} 之間的耦合性,讓各層更加獨立,實現自我訓練學習的效果。

也就是說,如果輸入發生covariate shift,那么因為Batch Norm的作用,對個隱藏層輸出 Z^{[l]} 進行均值和方差的歸一化處理, W^{[l]}B^{[l]} 更加穩定,使得原來的模型也有不錯的表現。

論文筆記-Batch Normalization

BN優點

 (1)神經網絡本質是學習數據分布,如果尋來你數據與測試數據分布不同,網絡的泛化能力將降低,batchnorm就是通過對每一層的計算做scale和shift的方法,通過規范化手段,把每層神經網絡任意神經元這個輸入值的分布強行拉回到正太分布,減小其影響,讓模型更加健壯。
(2)使用BN就可以使得不同層不同scale的權重變化整體步調更一致,可以使用更高的學習率,加快訓練速度。
(3) 防止過擬合。此時可以移除或使用較低的dropout,降低L2權重衰減系數等防止過擬合的手段。論文中最后的模型分別使用10%、5%和0%的dropout訓練模型,與之前的40%-50%相比,可以大大提高訓練速度。
 (4) 取消Local Response Normalization層。 對局部神經元的活動創建競爭機制,使其中響應比較大對值變得相對更大,並抑制其他反饋較小的神經元,增強了模型的泛化能力。有了dropout,bn等手段沒必要用了,而且2012一篇文章說這個lrn沒有用處。

 

專欄 | 深度學習中的Normalization模型

CNN 網絡中的 BN

我們知道,常規的 CNN 一般由卷積層、下采樣層及全連接層構成。全連接層形式上與前向神經網絡是一樣的,所以可以采取前向神經網絡中的 BatchNorm 方式,而下采樣層本身不帶參數所以可以忽略,所以 CNN 中主要關注卷積層如何計算 BatchNorm。

CNN 中的某個卷積層由 m 個卷積核構成,每個卷積核對三維的輸入(通道數*長*寬)進行計算,激活及輸出值是個二維平面(長*寬),對應一個輸出通道(參考圖 7),由於存在 m 個卷積核,所以輸出仍然是三維的,由 m 個通道及每個通道的二維平面構成。

那么在卷積層中,如果要對通道激活二維平面中某個激活值進行 Normalization 操作,怎么確定集合 S(BN的E和Var是通過神經元集合S中包含的 m 個神經元各自的激活值求出的,集合S指求均值方差使用的激活值的范圍) 的范圍呢?圖 8 給出了示意圖。

類似於前向神經網絡中的 BatchNorm 計算過程,對於 Mini-Batch 訓練方法來說,反向傳播更新梯度使用 Batch 中所有實例的梯度方向來進行,所以對於 CNN 某個卷積層對應的輸出通道 k 來說,假設某個 Batch 包含 n 個訓練實例,那么每個訓練實例在這個通道 k 都會產生一個二維激活平面,也就是說 Batch 中 n 個訓練實例分別通過同一個卷積核的輸出通道 k 的時候產生了 n 個激活平面。假設激活平面長為 5,寬為 4,則激活平面包含 20 個激活值,n 個不同實例的激活平面共包含 20*n 個激活值。那么 BatchNorm 的集合 S 的范圍就是由這 20*n 個同一個通道被 Batch 不同訓練實例激發的激活平面中包含的所有激活值構成(對應圖 8 中所有標為藍色的激活值)。

(對於訓練集的一個batch,batch的所有訓練實例(一個實例是一張圖片)經過同一個卷積核的輸出 求均值和方差 就是BN的E和Var)

划定集合 S 的范圍后,激活平面中任意一個激活值都需進行 Normalization 操作,其 Normalization 的具體計算過程與前文所述計算過程一樣,采用公式 3 即可完成規范化操作。這樣即完成 CNN 卷積層的 BatchNorm 轉換過程。

 

公式3:\tilde z^{(i)}=\gamma\cdot z^{(i)}_{norm}+\beta

 

////////////////////////////////////////////////////////////////////////////////////////////////////

  The first is that instead of whitening the features in layer inputs and outputs jointly, we will normalize each scalar feature independently, by making it have the mean of zero and the variance of 1.  

每一維

we make the second simplification: since we use mini-batches in stochastic gradient training, each mini-batch produces estimates of the mean and variance of each activation.  

 minibatch中每一維有多個xk 簡寫x

γ and β are to be learned

測試時是固定的參數

在測試時,對每一維 E和Var哪里來?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM