batch normalization學習理解筆記

碌碌無為的人發表於2019-06-09

batch normalization學習理解筆記

最近在Andrew Ng課程中學到了Batch Normalization相關內容,通過查閱資料和原始paper,基本上弄懂了一些演算法的細節部分,現在總結一下.

1. batch normalization演算法思想的來源

不妨先看看原文的標題:Batch normalization:acclerating deep network training by reducing internal covariate shift.字面意思即:Batch Normalization演算法是通過減小內部協變數偏移來加速深度神經網路訓練.不難看出,作者明確指出Batch Normalization是一種加速深度神經網路訓練的方法.什麼原理呢,就是通過減小內部協變數偏移.原文中明確給出變數的定義:we refer to change in the distributions of internal nodes of a deep networks,in the course of training, as Internal Covariate Shift.其實意思就是神經網路內部layer的輸入(即上一layer的輸出)分佈的變化.

Internal Covariate Shift的定義是相對於Covariate Shift而言的,Covariate Shift是指神經網路輸入(X)分佈發生改變的現象.大家都知道神經網路之所以具有泛化能力,一個基本的假設就是訓練樣本集與測試樣本集是獨立同分布的(iid),如果兩者分佈不同(或者說兩者分佈之間存在Covariate Shift現象),則網路的效能就沒有了保證.而Internal Covariate Shift是將這一概念進行了擴充套件,神經網路內部上一層的輸出傳遞給下一層作為輸入,每一層的輸入是否存在Covariate Shift現象呢,答案是顯而易見的.因為在神經網路訓練過程中,w,b等引數是一直進行調整的,導致網路的輸出也是不斷變化的,而這一層的輸出將作為下一層的輸入,即輸入也是不斷變化的,即神經網路內部也存在著Covariate Shift現象,這種神經網路內部的Covariate Shift現象,就稱為Internal Covariate Shift.

Batch normalization的想法來源正式通過減小Internal Covariate Shift來加速網路訓練.因為對於Covariate Shift現象,通過白化操作能起到改善作用,以此類推,將相似的操作引入神經網路內部,也能起到加速每一層訓練的效果.

2. 如何進行Batch Normalization

首先想到了是同樣在每層使用白化操作,但是白化操作有兩個缺點:

  • 一是白化計算量很大,因為白化過程中要計算隨機向量的協方差矩陣,然後求逆運算(要使得輸入向量各維度不相關),而且還要在每層中計算,這在深度神經網路中是十分費時的;
  • 二是白化結果不能保證處處可微,不能保證後向梯度下降法的順利進行.

因此文中進行了兩個簡化:

  • 一是對輸入向量的各個維度單獨進行均值為0,方差為1的標準化處理,不進行去相關操作,這樣就避免了協方差矩陣和矩陣求逆運算,這一操作也能起到加速訓練的效果,已有文獻作證.
  • 二是結合深度神經網路訓練常用的mini-batch,在計算均值和方差時利用一個mini-batch中的樣本,而不是整個訓練集中的樣本.

同時,為了保證進行了歸一化後的輸入能夠包含處理前的輸入(即不會損失前層網路的訓練成果),又新增了一個仿射變換,引入了兩個網路學習的引數\(\gamma\)\(\beta\).Batch Normalization的計算過程如下:
batch normalization學習理解筆記

\(\beta = \mu_B\),\(\gamma = \sqrt{\sigma^{2}_B+\varepsilon}\)時,\(y_i=x_i\),即Batch Normalization進行了恆等變換.

注意在測試過程中,當測試單個樣本時,無法估計均值和方差,文中給出的解決辦法是利用訓練過程中mini-batch得到的均值和方差,求均值(指數加權平均)得到.具體的實現過程請參考原文獻,此處不在累述.

3. Batch Normalization有那些作用

最主要的一點,也是原文中多次出現的就是加速網路訓練,即達到相同的誤差率,使用Batch Normalization可以大大減小所需要的迭代次數.

  • 在原文試驗中證實了,在原有網路結構中僅僅新增Batch Normalization,就可以大大加速網路的訓練過程.個人認為有兩點原因.一方面是因為經過Batch Normalization各層網路輸入的均值和方差保持固定,因此後面的網路有了一個相對穩定的基礎(Andrew Ng的觀點),後面的網路減少了不斷調整的過程;另外一點,經過歸一化,輸入向量各個維度保持了相同的尺度,這樣也能加速後續網路的訓練過程(類似於將原本橢圓狀的損失函式變換為接近圓形的函式,即黑塞矩陣的條件數減小了)
  • 另外,因為Batch Nomalization能夠有效抑制梯度爆炸/消失問題,因此可以使用更大的學習率,用以加快訓練.原文中對於使用更大的學習率進行了專門介紹:一般情況下,大的學習率會增加模型引數(W,b)的尺度,這在反向傳播過程中會放大梯度,然後導致梯度爆炸問題.但是由於Batch Normalization能夠使反向傳播過程中梯度不受引數尺度的影響,因此可以有效防止這種問題的發生.對於一個尺度a,Batch Normalization過程具有以下特性:\[BN(Wu)=BN((aW)u)\]
    其中W為模型引數,u為模型輸入.上式的結果說明,Batch Normalization的結果不受模型引數尺度的影響,因為BN會對線性運算的輸出進行歸一化,即均值為0,方差為1,該過程會抵消掉a的影響.同時,對於傳播過程,具有如下特性:\[\frac{\partial BN((aW)u)}{\partial u} = \frac{\partial BN(Wu)}{\partial u}\]
    \[\frac{\partial BN((aW)u)}{\partial aW} = \frac{1}{a}\cdot\frac{\partial BN(Wu)}{\partial W}\]
    上面第一個式子表明(用本節第一個等式替換即可得到),在反向傳播過程中,梯度由本層向前一層傳遞時,梯度的大小不受模型引數尺度的影響.第二個式子表明,反向傳播過程中,引數的尺度越大,其梯度越小,這可以抑制梯度增長過大.

其實,對於抑制深度神經網路中梯度消失/爆炸問題,採用的方法主要有使用relu啟用函式,小心初始化模型引數等,BN同樣提供了一種有力的工具.

原文中通過實驗證明了BN可以有效防止非線性飽和問題,對於sigmoid啟用函式,由於BN操作,可以避免輸入落入梯度很小的兩端範圍內.

文中同樣提到了BN自帶一定的regularization作用,可以替代/減弱dropout的使用.這主要是因為平均是和方差為模型引入了隨機誤差,從而增添了不確定性.Andrew Ng認為,應該將BN的regulatization作用作為一種副作用,真正的正則化還是應該使用L2,dropout等通用方法.

相關文章