1. 程式人生 > >Batch Normalization原理與優點總結

Batch Normalization原理與優點總結

1. 引言

    隨著深度學習的發展,神經網路的模型的深度越來越大,雖然可以提取到資料中更加深層的特徵資訊,但是,也容易引起梯度消失或梯度爆炸等問題。當使用SGD優化函式時,我們經常會遇到以下兩個問題:

  • 模型對引數初始化方式、學習率的設定特別敏感。
  • 隨著網路深度的加深,引數的微小變動都會不斷被放大。

    為了解決這兩個問題,Sergey Ioffe等人在《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》 一文提出了Batch Normalization,本文將基於該文章,對Batch Normalization的原理進行解析,並對其優點進行總結和歸納。

2. Batch Normalization

2.1 mini-batch Normalization

    在介紹Batch Normalization的思想之前,先明確一個概念,即作者在文中提出的Internal Covariate Shift,其意思是:在訓練過程中,深層網路內部節點分佈的變化稱為Internal Covariate Shift。

    假設某一層的輸入為\mathrm { x } = \left( x ^ { ( 1 ) } \ldots x ^ { ( d ) } \right),其中d表示輸入的維度,則對每一維進行標準化,有:

                                                                             \widehat { x } ^ { ( k ) } = \frac { x ^ { ( k ) } - \mathrm { E } \left[ x ^ { ( k ) } \right] } { \sqrt { \operatorname { Var } \left[ x ^ { ( k ) } \right] } }

其中,E \left[ x ^ { ( k ) } \right]\operatorname { Var } \left[ x ^ { ( k ) } \right]都是在整個訓練集上計算得到的期望和方差。但是這種簡單的標準化會存在一個問題,即可能會使得啟用函式的非線效能力失效,導致整個網路的表現能力降低,因此,為例克服這個問題,作者對每一個維度的標準化引入了一對引數\gamma ^ { ( k ) } , \beta ^ { ( k ) },對標準化後的值進行變換和移動,即:

                                                                             y ^ { ( k ) } = \gamma ^ { ( k ) } \widehat { x } ^ { ( k ) } + \beta ^ { ( k ) }

特別地,當\gamma ^ { ( k ) } = \sqrt { \operatorname { Var } \left[ x ^ { ( k ) } \right] }\beta ^ { ( k ) } = \mathrm { E } \left[ x ^ { ( k ) } \right]時,則模型的表現能力與不採用Batch Normalization相同。

     由於在全部訓練集上進行Batch Normalization是不實際的,因此,作者提出了在mini-batch上進行Batch Normalization。記\mathcal { B }為一個batch大小為m的資料集,為了便於表示,將k進行省略,即第k個維度一個batch資料的表示為:

                                                                                \mathcal { B } = \left\{ x _ { 1 \ldots m } \right\}

記Batch Normalization轉換為:

                                                                           \mathrm { BN } _ { \gamma , \beta } : x _ { 1 \ldots m } \rightarrow y _ { 1 \dots m } 

其中,y _ { 1 \dots m }表示對每一維進行Batch Normalization後的結果,則Batch Normalization的演算法步驟如下:

其中,\epsilon為一個常數,主要為了確保計算的穩定。 

2.2 推理階段

   由於在訓練時,Batch Normalization是基於每一個mini-batch計算的,所以在預測或推理階段,怎麼對單個數據進行標準化呢?因為這時沒法計算資料的均值和方差。針對這個問題,作者提出了演算法2,即將訓練時每個batch資料對應的均值和方差記錄下來,利用他們來推算整個訓練集的均值和方差,公式如下:

                                                                                   \begin{array} { r l } { \mathrm { E } [ x ] } & { \leftarrow \mathrm { E } _ { \mathcal { B } } \left[ \mu _ { \mathcal { B } } \right] } \\ { \operatorname { Var } [ x ] } & { \leftarrow \frac { m } { m - 1 } \mathrm { E } _ { \mathcal { B } } \left[ \sigma _ { \mathcal { B } } ^ { 2 } \right] } \end{array}

其中,\mu_{\mathcal { B }}\sigma _ { \mathcal { B } } ^ { 2 }分別對應每個mini-batch的均值和方差。這樣就可以對預測資料進行Batch Normalization,具體的演算法過程如下:

2.3 對於卷積神經網路的Batch Normalization

    對於卷積神經網路,為了保持卷積的特性,標準化是對每個feature-map進行,即每個feature-map不同位置的標準化採取同樣的操作,令\mathcal { B }是大小為m的mini-batch對應的某個feature-map的所有資料的集合,假設feature-map的大小為p \times q,則對該feature-map的Batch Normalization則相當於對大小為m ^ { \prime } = | \mathcal { B } | = m \cdot p q的特徵的標準化。

2.4 為什麼Batch Normalization可以使用更高的學習率

    當使用Batch Normalization後,假設引數W變化為a W,則容易得到: 

                                                                                \mathrm { BN } ( W \mathrm { u } ) = \mathrm { BN } ( ( a W ) \mathrm { u } )

即引數的更新對每一層的輸出不影響,另外,在反向傳播時,有:

                                                                           \begin{aligned} \frac { \partial \mathrm { BN } ( ( a W ) \mathrm { u } ) } { \partial \mathrm { u } } & = \frac { \partial \mathrm { BN } ( W \mathrm { u } ) } { \partial \mathrm { u } } \\ \frac { \partial \mathrm { BN } ( ( a W ) \mathrm { u } ) } { \partial ( a W ) } & = \frac { 1 } { a } \cdot \frac { \partial \mathrm { BN } ( W \mathrm { u } ) } { \partial W } \end{aligned}

即當設定不同大小的學習率時,在反向傳播時,都會被抵消掉,使得引數的更新相對穩定,因此,可以使用較大的學習率。

3.Batch Normalization的優點

    最後,對Batch Normalization的優點進行總結,大概有以下幾個方面:

  • 可以採用更高的學習率,提高模型訓練的速度,並且可以有效避免梯度的消失和爆炸
  • 起到正則化的作用,類似dropout的功能
  • 不用太在意引數的初始化