每日一問之 Batch Normalization

Batch Normalization 的好處是什麼?

這麼久了,早就忘記了 Batch Normalization 的具體內容了,只依稀記得是有點正則化的效果的。之前學習吳恩達課程的時候,採用的是手寫筆記的方式,但是我並沒有把它帶到學校來,無法及時查看及複習。這就是手寫筆記的弊端。所以,今天特意再次整理 Batch Normalization 的相關知識,如下幾點所示:

  • 什麼是 Batch Normalization ?
  • 爲什麼使用 Batch Normalization ?

什麼是 Batch Normalization

從名字上可以看出,是一種批(batch)歸一化的操作。就像對輸入層的輸入特徵進行歸一化一樣,BN 也可以加速模型學習的過程。具體操作是:通常在使用 SGD 算法的時候,在 mini-batch 中計算每一隱藏層輸入的均值和方差。即在每個 mini-batch 中,在對每個隱藏層的輸入 x 或者 z 使用激活函數之前(學術界有過爭論,但通常是在使用激活函數之前進行操作)進行 Normalize 操作,如下圖所示。

其中 \gamma\beta,都是從模型中學習到的參數。如果當 \gamma ^{(k)} = \sqrt{Var[x^{(k)}]}\beta ^{(k)}=E[x^{(k)}]時,可以恢復原始的(激活)值。在反向傳播中的計算會如下所示:

爲什麼使用 Batch Normalization

使用 Batch Normalization 也是爲了解決訓練深層神經網絡的一些弊端。

消除 Internal Covariate Shift

在訓練神經網絡的過程中會存在 Internal Covariate Shift 的問題。

在 Batch Normalization 的論文中,作者將 Internal Covariate Shift 問題定義爲由於訓練期間網絡參數的變化導致的網絡激活分佈的變化。在 LeCun,Wiesler & Ney 等人的論文中可以知道,如果對神經網絡的輸入進行白化(whitened,zero means and unit variances)及去相關操作,那麼可以消除 Internal Covariate Shift 的不良影響,從而加快神經網絡的訓練。而 Batch Normalization 的操作和上述類似,也能起到消除 Internal Covariate Shift 的作用。

防止梯度消失

衆所周知,在使用 sigmoid 和 tanh 等激活函數的時候,如果輸入過大,將會造成梯度消失的後果。而在使用激活函數之前。對輸入進行歸一化,則將特徵進行了縮減,使其分佈集中在非線性激活區域。如下圖,可以很直觀的看出,該圖來自莫煩的文章,強烈建議大家去讀,講解的很直觀明瞭。

起到輕微的正則化效果

在 Batch Normalization 的過程中,在每個 mini-batch 中,在神經網絡的每一層計算均值和方差。這個過程只是在該 mini-batch 中計算,而不是在整個數據集上,所以均值和方差會帶來一些噪音,以及在後面的計算中也會帶來一些噪音。這和 Dropout 的操作很相似。Dropout 增加噪音的過程是,它使隱藏單元,以一定的概率乘以 0,以一定的概率乘以 1,這樣後面的隱藏單元就不會過分的依賴前面的單元。和 Dropout 類似,BN 往隱藏層代入了噪音,也使得後面的單元不依賴前面的單元。所以,BN 也能夠起到輕微的正則化作用。

P.S: Andrew Ng 在其課程中建議,可以同時使用 Batch Normalization 和 Dropout ,這樣會帶來更強的正則化效果。但是不要把 BN 的這個小作用當做很重要的 trick 來使用。因爲 Batch Normalization 的真正作用是歸一化每一激活層。

參考

[1]. Batch Normalization Paper
[2]. 深度學習中 Batch Normalization爲什麼效果好?
[3]. 莫煩 - 什麼是批標準化 (Batch Normalization)
[4]. 吳恩達-深度學習課程

P.S:文中有錯歡迎指出,互相學習。以及歡迎關注我的公衆號 :)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章