【深度學(xué)習(xí)】聊聊Batch Normalization在網(wǎng)絡(luò)結(jié)構(gòu)中的位置

“葡萄是一點一點成熟的,知識是一天一天積累的。”

Batch Normalization
1. 什么是Batch Normalization?
谷歌在2015年就提出了Batch Normalization(BN),該方法對每個mini-batch都進(jìn)行normalize,下圖是BN的計算方式,會把mini-batch中的數(shù)據(jù)正規(guī)化到均值為0,標(biāo)準(zhǔn)差為1,同時還引入了兩個可以學(xué)的參數(shù),分別為scale和shift,讓模型學(xué)習(xí)其適合的分布。

那么為什么在做過正規(guī)化后,又要scale和shift呢?當(dāng)通過正規(guī)化后,把尺度縮放到0均值,再scale和shift,不是有可能把數(shù)據(jù)變回"原樣"?因為scale和shift是模型自動學(xué)習(xí)的,神經(jīng)網(wǎng)絡(luò)可以自己琢磨前面的正規(guī)化有沒有起到優(yōu)化作用,沒有的話就"反"正規(guī)化,抵消之前的正規(guī)化操作帶來的影響。
2. 為什么要用Batch Normalization?
(1) 解決梯度消失問題
拿sigmoid激活函數(shù)距離,從圖中,我們很容易知道,數(shù)據(jù)值越靠近0梯度越大,越遠(yuǎn)離0梯度越接近0,我們通過BN改變數(shù)據(jù)分布到0附近,從而解決梯度消失問題。

(2) 解決了Internal Covariate Shift(ICS)問題
先看看paper里對ICS的定義:

由于訓(xùn)練過程中參數(shù)的變化,導(dǎo)致各層數(shù)據(jù)分布變化較大,神經(jīng)網(wǎng)絡(luò)就要學(xué)習(xí)新的分布,隨著層數(shù)的加深,學(xué)習(xí)過程就變的愈加困難,要解決這個問題需要使用較低的學(xué)習(xí)率,由此又產(chǎn)生收斂速度慢,因此引入BN可以很有效的解決這個問題。
(3)加速了模型的收斂
和對原始特征做歸一化類似,BN使得每一維數(shù)據(jù)對結(jié)果的影響是相同的,由此就能加速模型的收斂速度。

(4)具有正則化效果
BN層和正規(guī)化/歸一化不同,BN層是在mini-batch中計算均值方差,因此會帶來一些較小的噪聲,在神經(jīng)網(wǎng)絡(luò)中添加隨機(jī)噪聲可以帶來正則化的效果。
3. Batch Normalization添加在哪?
所以實際使用上,BatchNorm層應(yīng)該放在哪呢?層與層直接都要加嗎?加在激活函數(shù)前還是激活函數(shù)后?卷積層和pooling層要不要加?有人說這個應(yīng)該加在非線性層后,如下順序。
Linear->Relu->BatchNorm->Dropout
論文里有提到,BN層常常被加到Relu之前,但是沒有明確的標(biāo)準(zhǔn),需要嘗試不同配置,通過實驗得出結(jié)論(很多實驗結(jié)果偏向于Relu在BN之前)。
那BN層和dropout層的順序呢?
我們可以看到這樣的代碼,BN在dropout之后。

也可以看到這樣的代碼,BN在dropout之前。

實際上,BN消除了對dropout的依賴,因為BN也有和dropout本質(zhì)一樣的正則化的效果,像是ResNet, DenseNet等等并沒有使用dropout,如果要用并用BN和dropout,還是建議BN放在dropout之前。
注:對BN和dropout感興趣的可以看下這篇論文《Understanding the Disharmony between Dropout and Batch Normalization by
Variance Shif》
https://arxiv.org/pdf/1801.05134.pdf

敲黑板,記重點!
1、BN層可以緩解梯度消失,解決ICS問題,加速模型的收斂,并且具有正則化效果。
2、 BN層往往添加在Relu層后,Dropout層之前。

往期精彩回顧
本站qq群851320808,加入微信群請掃碼:
