1. 程式人生 > >[論文閱讀] Batch Normalization: Accelerating Deep Network Training By Reducing Internal Covariate Shift

[論文閱讀] Batch Normalization: Accelerating Deep Network Training By Reducing Internal Covariate Shift

Background

  • 存在什麼問題?
    • 訓練深度神經網路是比較複雜的,因為每層輸入的分佈在訓練過程中都在變化。如果每層輸入的分佈在不停的變化,那我們就需要不停的調整我們的引數去補償這部分變化,這就使得訓練過程更加緩慢。
    • 此外,由於分佈的變化使得使用saturating nonlinearity function變得更加難以訓練。
      • 首先我們區分什麼是saturating,什麼是non-saturating
        • non-saturating:如果一個函式 lim
          x
          f ( x )
          {\lim_{x \to -\infty}f(x)\to-\infty}
          或者是 lim x + f ( x ) + {\lim_{x \to +\infty}f(x) \to +\infty} f ( x ) f(x) 是non-saturating的。比如,ReLU
        • saturating:如果函式 f ( x ) f(x) 不是non-saturating,則他就是saturating。比如,sigmoid
      • 接下來,為什麼saturating nonlinearity 難以訓練?因為他會面臨梯度消失問題。
        • 考慮以sigmoid為啟用函式的一層。 z = g ( W u + b ) , g = 1 1 + e x p ( x ) z = g(Wu+b), g=\frac{1}{1+exp(-x)}
        • 當我們 x |x| 增長的時候,我們 g ( x ) g^{'}(x) 趨近於0。這時候就可能會出現梯度消失問題。
        • 但是 x x 又被 W , b W, b 和之前layer的引數影響,所以有很大可能性梯度會比較小。
  • 現存的有什麼解決方法?
    • 資料分佈—白化操作,PCA Whitening
      • 我們可以在每一層輸入之前都使用白化操作將資料對映到0為中心, 不同特徵之間具有相同方差的空間。
      • 但是這樣操作計算量很大,並且有時候是不可導的。因為在計算PCA Whitening的過程中,我們需要計算協方差矩陣 Σ = i = 1 i = m x i x i T \Sigma=\sum_{i=1}^{i=m}{x_i*x_i^T} ,然後再進行特徵值分解。這樣提取得到了特徵之間無關(decorrelated)的新特徵向量空間。
      • 所以,目前我們一般只在預處理階段使用白化操作。
    • non-saturating nonlinearity—ReLU
      • 上面提到,我們使用saturating nonlinearity會導致梯度消失的問題,所以我們可以使用non-saturating nonlinearity來代替saturating nonlinearity。但是這樣並沒有從本質上改變資料的分佈。我們還是要調整parameter來補償輸入分佈的變化,這就使得我們的訓練更慢。

Method

  • 為了normalized 資料分佈,並且簡化計算,使得處處可導。相對於PCA計算向量不同緯度之間的correlation,Batch Normalization 單獨normalized 特徵向量的每個緯度。這是Batch Normalization和PCA 白化的一個重要不同。
  • LeCun et al.提出了 x ^ ( k ) = x ( k ) E [ x ( k ) ] V a r [ x ( k ) ] \hat{x}^{(k)}=\frac{x^{(k)} - E[x^{(k)}]}{\sqrt{Var[x^{(k)}]}} ,但是隻使用這個可能會降低模型的表達能力。比如說我們使用non-linear的sigmoid,在輸入之前經過這個transform處理後,會使得我們的sigmoid有點趨近於linear的transform。
  • 為了解決該問題,作者定義了 i d e n t i t y    t r a n s f o r m identity\space \space transform y ( k ) = γ ( k ) x ^ ( k ) + β ( k ) y^{(k)}=\gamma^{(k)}\hat{x}^{(k)}+\beta^{(k)} 來強化模型的表達能力。
  • 總結一下,在訓練過程中,我們使用如下的流程來計算normalization。
    在這裡插入圖片描述
  • 此外,作者也給出了反向傳播的公式,如下所示。
    在這裡插入圖片描述
  • 上面描述了在訓練階段normalization的過程。但是在測試(inference)階段我們應該怎麼處理呢?關鍵在於怎麼計算 x ^ \hat{x} ,我們知道在訓練階段我們通過減去batch 內的均值除以方差可以得到 x ^ \hat{x} ,但是在測試階段我們沒有batch,或者batch的分佈和訓練時候不一樣。那麼我們怎麼處理呢?作者提出了同樣的處理方式 x ^ ( k ) = x ( k ) E [ x ( k ) ] V a r [ x ( k ) ] \hat{x}^{(k)}=\frac{x^{(k)} - E[x^{(k)}]}{\sqrt{Var[x^{(k)}]}} ,不過 V a r [ x ] = m m 1 E β [ σ 2 ] Var[x]=\frac{m}{m-1}E_{\beta}[\sigma^2] 無偏估計量來表示。然後再 y ( k ) = γ ( k ) x ^ ( k ) + β ( k ) y^{(k)}=\gamma^{(k)}\hat{x}^{(k)}+\beta^{(k)}
  • 此外還有以下幾點需要注意
    • 文中說為了避免saturating 啟用函式的梯度消失問題,BN一般放在啟用函式之前
    • γ \gamma β \beta 是針對每一個特徵有一對。比如說我們通過全連線層的輸出是512緯的,那麼BN層就有512對 γ \gamma β \beta 。針對卷積層的情況, γ \gamma β \beta 也是針對每一個特徵有一對。假設說我們Convolutional layer的輸出是 m W H 512 m*W*H*512 ,那麼BN層就有512對 γ \gamma β \beta 。不過計算均值 μ B \mu_{B}