聊聊Batch Normalization在网络结构中的位置
Batch Normalization在網(wǎng)絡(luò)結(jié)構(gòu)中的位置
1. 什么是Batch Normalization?
谷歌在2015年就提出了Batch Normalization(BN),該方法對每個(gè)mini-batch都進(jìn)行normalize,下圖是BN的計(jì)算方式,會把mini-batch中的數(shù)據(jù)正規(guī)化到均值為0,標(biāo)準(zhǔn)差為1,同時(shí)還引入了兩個(gè)可以學(xué)的參數(shù),分別為scale和shift,讓模型學(xué)習(xí)其適合的分布。
那么為什么在做過正規(guī)化后,又要scale和shift呢?當(dāng)通過正規(guī)化后,把尺度縮放到0均值,再scale和shift,不是有可能把數(shù)據(jù)變回"原樣"?因?yàn)閟cale和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í)過程就變的愈加困難,要解決這個(gè)問題需要使用較低的學(xué)習(xí)率,由此又產(chǎn)生收斂速度慢,因此引入BN可以很有效的解決這個(gè)問題。
(3)加速了模型的收斂
和對原始特征做歸一化類似,BN使得每一維數(shù)據(jù)對結(jié)果的影響是相同的,由此就能加速模型的收斂速度。
(4)具有正則化效果
BN層和正規(guī)化/歸一化不同,BN層是在mini-batch中計(jì)算均值方差,因此會帶來一些較小的噪聲,在神經(jīng)網(wǎng)絡(luò)中添加隨機(jī)噪聲可以帶來正則化的效果。
3. Batch Normalization添加在哪?
所以實(shí)際使用上,BatchNorm層應(yīng)該放在哪呢?層與層直接都要加嗎?加在激活函數(shù)前還是激活函數(shù)后?卷積層和pooling層要不要加?有人說這個(gè)應(yīng)該加在非線性層后,如下順序。
Linear->Relu->BatchNorm->Dropout
論文里有提到,BN層常常被加到Relu之前,但是沒有明確的標(biāo)準(zhǔn),需要嘗試不同配置,通過實(shí)驗(yàn)得出結(jié)論(很多實(shí)驗(yàn)結(jié)果偏向于Relu在BN之前)。
那BN層和dropout層的順序呢?
我們可以看到這樣的代碼,BN在dropout之后。
也可以看到這樣的代碼,BN在dropout之前。
實(shí)際上,BN消除了對dropout的依賴,因?yàn)锽N也有和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
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的聊聊Batch Normalization在网络结构中的位置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 个性化推荐系统该如何评估,四种不同策略的
- 下一篇: 隐式反馈的去噪,模型取得巨大提升