聊聊Batch Normalization在网络结构中的位置
Batch Normalization在網絡結構中的位置
1. 什么是Batch Normalization?
谷歌在2015年就提出了Batch Normalization(BN),該方法對每個mini-batch都進行normalize,下圖是BN的計算方式,會把mini-batch中的數據正規化到均值為0,標準差為1,同時還引入了兩個可以學的參數,分別為scale和shift,讓模型學習其適合的分布。
那么為什么在做過正規化后,又要scale和shift呢?當通過正規化后,把尺度縮放到0均值,再scale和shift,不是有可能把數據變回"原樣"?因為scale和shift是模型自動學習的,神經網絡可以自己琢磨前面的正規化有沒有起到優化作用,沒有的話就"反"正規化,抵消之前的正規化操作帶來的影響。
2. 為什么要用Batch Normalization?
(1) 解決梯度消失問題
拿sigmoid激活函數距離,從圖中,我們很容易知道,數據值越靠近0梯度越大,越遠離0梯度越接近0,我們通過BN改變數據分布到0附近,從而解決梯度消失問題。
(2) 解決了Internal Covariate Shift(ICS)問題
先看看paper里對ICS的定義:
由于訓練過程中參數的變化,導致各層數據分布變化較大,神經網絡就要學習新的分布,隨著層數的加深,學習過程就變的愈加困難,要解決這個問題需要使用較低的學習率,由此又產生收斂速度慢,因此引入BN可以很有效的解決這個問題。
(3)加速了模型的收斂
和對原始特征做歸一化類似,BN使得每一維數據對結果的影響是相同的,由此就能加速模型的收斂速度。
(4)具有正則化效果
BN層和正規化/歸一化不同,BN層是在mini-batch中計算均值方差,因此會帶來一些較小的噪聲,在神經網絡中添加隨機噪聲可以帶來正則化的效果。
3. Batch Normalization添加在哪?
所以實際使用上,BatchNorm層應該放在哪呢?層與層直接都要加嗎?加在激活函數前還是激活函數后?卷積層和pooling層要不要加?有人說這個應該加在非線性層后,如下順序。
Linear->Relu->BatchNorm->Dropout
論文里有提到,BN層常常被加到Relu之前,但是沒有明確的標準,需要嘗試不同配置,通過實驗得出結論(很多實驗結果偏向于Relu在BN之前)。
那BN層和dropout層的順序呢?
我們可以看到這樣的代碼,BN在dropout之后。
也可以看到這樣的代碼,BN在dropout之前。
實際上,BN消除了對dropout的依賴,因為BN也有和dropout本質一樣的正則化的效果,像是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
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的聊聊Batch Normalization在网络结构中的位置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 个性化推荐系统该如何评估,四种不同策略的
- 下一篇: 隐式反馈的去噪,模型取得巨大提升