【關(guān)于 BatchNorm vs LayerNorm】那些你不知道的事
作者:楊夕、芙蕖、李玲、陳海順、twilight、LeoLRH、JimmyDU、艾春輝、張永泰、金金金
面筋地址:https://github.com/km1994/NLP-Interview-Notes
個人筆記:https://github.com/km1994/nlp_paper_study

一、動機(jī)篇
1.1 獨立同分布(independent and identically distributed)與白化
獨立同分布 強(qiáng)相關(guān):Naive Bayes 模型就建立在特征彼此獨立的基礎(chǔ)之 弱相關(guān):Logistic Regression 和 神經(jīng)網(wǎng)絡(luò) 則在非獨立的特征數(shù)據(jù)上依然可以訓(xùn)練出很好的模型 獨立同分布的數(shù)據(jù)可以簡化常規(guī)機(jī)器學(xué)習(xí)模型的訓(xùn)練、提升機(jī)器學(xué)習(xí)模型的預(yù)測能力 為什么? 相關(guān)性: 白化【數(shù)據(jù)預(yù)處理步驟】 去除特征間的相關(guān)性 -> 獨立; 使所有特征具有相同的均值和方差 -> 同分布 作用:
1.2 ( Internal Covariate Shift,ICS)
動機(jī):深度神經(jīng)網(wǎng)絡(luò)涉及到很多層的疊加,而每一層的參數(shù)更新會導(dǎo)致上層的輸入數(shù)據(jù)分布發(fā)生變化,通過層層疊加,高層的輸入分布變化會非常劇烈,這就使得高層需要不斷去重新適應(yīng)底層的參數(shù)更新。為了訓(xùn)好模型,我們需要非常謹(jǐn)慎地去設(shè)定學(xué)習(xí)率、初始化權(quán)重、以及盡可能細(xì)致的參數(shù)更新策略。 模型訓(xùn)練對于數(shù)據(jù)的一個假設(shè):“源空間(source domain)和目標(biāo)空間(target domain)的數(shù)據(jù)分布(distribution)是一致的”。如果不一致,那么就出現(xiàn)了新的機(jī)器學(xué)習(xí)問題,如 transfer learning / domain adaptation 等。而 covariate shift 就是分布不一致假設(shè)之下的一個分支問題,它是指源空間和目標(biāo)空間的條件概率是一致的,但是其邊緣概率不同; ICS 【每個神經(jīng)元的輸入數(shù)據(jù)不再是“獨立同分布”】導(dǎo)致的后果: 上層參數(shù)需要不斷適應(yīng)新的輸入數(shù)據(jù)分布,降低學(xué)習(xí)速度; 下層輸入的變化可能趨向于變大或者變小,導(dǎo)致上層落入飽和區(qū),使得學(xué)習(xí)過早停止; 每層的更新都會影響到其它層,因此每層的參數(shù)更新策略需要盡可能的謹(jǐn)慎;
1.3 ICS問題帶來的后果是什么?
上層參數(shù)需要不斷適應(yīng)新的輸入數(shù)據(jù)分布,導(dǎo)致學(xué)習(xí)速度下降; 下層輸入的變化可能趨于變大或變小,導(dǎo)致上層落入飽和區(qū),從而學(xué)習(xí)過早停止; 每層的更新都會影響到其他層,因此每層參數(shù)更新策略需要盡可能謹(jǐn)慎;
二、Normalization 篇
2.1 Normalization 的通用框架與基本思想
前言
假設(shè) 神經(jīng)元的輸入:

輸出的結(jié)果:

ICS 問題:X 的 分布可能相差很大
解決方法:
方法:對每一層的數(shù)據(jù)做白化操作 存在問題:成本高,因為要保證 白化操作是可微的 基本思想:在將 x 送給神經(jīng)元之前,先對其做平移和伸縮變換, 將 x 的分布規(guī)范化成在固定區(qū)間范圍的標(biāo)準(zhǔn)分布;
變換框架:

參數(shù)介紹:
μ:平移參數(shù)
δ:縮放參數(shù)
步驟:
對 x 進(jìn)行 shift 和 scale 變換

得到的數(shù)據(jù)符合均值為 0、方差為 1 的標(biāo)準(zhǔn)分布
b 是再平移參數(shù)(re-shift parameter), g 是再縮放參數(shù)(re-scale parameter),再進(jìn)一步變換為

得到的數(shù)據(jù)符合均值為 b 、方差為
的分布
三、Batch Normalization 篇
3.1 Batch Normalization(縱向規(guī)范化)是什么?

方式:針對單個神經(jīng)元進(jìn)行,利用網(wǎng)絡(luò)訓(xùn)練時一個 mini-batch 的數(shù)據(jù)來計算該神經(jīng)元 的均值和方差,因而稱為 Batch Normalization。

其中 M 是 mini-batch 的大小。
3.2 Batch Normalization(縱向規(guī)范化)存在什么問題?
BN 獨立地規(guī)范化每一個輸入維度 ,但規(guī)范化的參數(shù)是一個 mini-batch 的一階統(tǒng)計量和二階統(tǒng)計量。這就要求 每一個 mini-batch 的統(tǒng)計量是整體統(tǒng)計量的近似估計,或者說每一個 mini-batch 彼此之間,以及和整體數(shù)據(jù),都應(yīng)該是近似同分布的。分布差距較小的 mini-batch 可以看做是為規(guī)范化操作和模型訓(xùn)練引入了噪聲,可以增加模型的魯棒性;但如果每個 mini-batch的原始分布差別很大,那么不同 mini-batch 的數(shù)據(jù)將會進(jìn)行不一樣的數(shù)據(jù)變換,這就增加了模型訓(xùn)練的難度。 由于 BN 需要在運行過程中統(tǒng)計每個 mini-batch 的一階統(tǒng)計量和二階統(tǒng)計量,因此不適用于 動態(tài)的網(wǎng)絡(luò)結(jié)構(gòu) 和 RNN 網(wǎng)絡(luò)
3.3 Batch Normalization(縱向規(guī)范化)適用的場景是什么?
每個 mini-batch 比較大,數(shù)據(jù)分布比較接近。在進(jìn)行訓(xùn)練之前,要做好充分的 shuffle. 否則效果會差很多。
3.4 BatchNorm 存在什么問題?
BN特別依賴Batch Size;當(dāng)Batch size很小的時候,BN的效果就非常不理想了。在很多情況下,Batch size大不了,因為你GPU的顯存不夠。所以,通常會有其他比較麻煩的手段去解決這個問題,比如MegDet的CGBN等; BN對處理序列化數(shù)據(jù)的網(wǎng)絡(luò)比如RNN是不太適用的;So,BN的應(yīng)用領(lǐng)域減少了一半; BN只在訓(xùn)練的時候用,inference的時候不會用到,因為inference的輸入不是批量輸入。
四、Layer Normalization(橫向規(guī)范化) 篇
4.1 Layer Normalization(橫向規(guī)范化)是什么?

方式:綜合考慮一層所有維度的輸入,計算該層的平均輸入值和輸入方差,然后用同一個規(guī)范化操作來轉(zhuǎn)換各個維度的輸入。

其中 i 枚舉了該層所有的輸入神經(jīng)元。對應(yīng)到標(biāo)準(zhǔn)公式中,四大參數(shù) μ, δ, g, b 均為標(biāo)量(BN中是向量),所有輸入共享一個規(guī)范化變換。
4.2 Layer Normalization(橫向規(guī)范化)有什么用?
LN 針對單個訓(xùn)練樣本進(jìn)行,不依賴于其他數(shù)據(jù),因此可以避免 BN 中受 mini-batch 數(shù)據(jù)分布影響的問題,可以用于 小mini-batch場景、動態(tài)網(wǎng)絡(luò)場景和 RNN,特別是自然語言處理領(lǐng)域。此外,LN 不需要保存 mini-batch 的均值和方差,節(jié)省了額外的存儲空間。
五、BN vs LN 篇
BN 的轉(zhuǎn)換是針對單個神經(jīng)元可訓(xùn)練的——不同神經(jīng)元的輸入經(jīng)過再平移和再縮放后分布在不同的區(qū)間,而 LN 對于一整層的神經(jīng)元訓(xùn)練得到同一個轉(zhuǎn)換——所有的輸入都在同一個區(qū)間范圍內(nèi)。如果不同輸入特征不屬于相似的類別(比如顏色和大?。敲?LN 的處理可能會降低模型的表達(dá)能力。
六、主流 Normalization 方法為什么有效?

Normalization 的權(quán)重伸縮不變性
介紹:權(quán)重 W 按照常量 λ 進(jìn)行伸縮時,得到的規(guī)范化后的值保持不變

其中:W' = λW
原因:當(dāng)權(quán)重 W 伸縮時,對應(yīng)的均值和標(biāo)準(zhǔn)差均等比例伸縮,分子分母相抵。

優(yōu)點: 權(quán)重伸縮不變性可以有效地提高反向傳播的效率

注:因此,權(quán)重的伸縮變化不會影響反向梯度的 Jacobian 矩陣,因此也就對反向傳播沒有影響,避免了反向傳播時因為權(quán)重過大或過小導(dǎo)致的梯度消失或梯度爆炸問題,從而加速了神經(jīng)網(wǎng)絡(luò)的訓(xùn)練。
權(quán)重伸縮不變性還具有參數(shù)正則化的效果,可以使用更高的學(xué)習(xí)率。

因此,下層的權(quán)重值越大,其梯度就越小。這樣,參數(shù)的變化就越穩(wěn)定,相當(dāng)于實現(xiàn)了參數(shù)正則化的效果,避免參數(shù)的大幅震蕩,提高網(wǎng)絡(luò)的泛化性能。
Normalization 的數(shù)據(jù)伸縮不變性
介紹:當(dāng)數(shù)據(jù) x 按照常量 λ 進(jìn)行伸縮時,得到的規(guī)范化后的值保持不變

注:x'= λx
優(yōu)點: 數(shù)據(jù)伸縮不變性可以有效地減少梯度彌散,簡化對學(xué)習(xí)率的選擇
對于某一層神經(jīng)元 :

可得:

每一層神經(jīng)元的輸出依賴于底下各層的計算結(jié)果。如果沒有正則化,當(dāng)下層輸入發(fā)生伸縮變化時,經(jīng)過層層傳遞,可能會導(dǎo)致數(shù)據(jù)發(fā)生劇烈的膨脹或者彌散,從而也導(dǎo)致了反向計算時的梯度爆炸或梯度彌散。
加入 Normalization 之后,不論底層的數(shù)據(jù)如何變化,對于某一層神經(jīng)元 而言,其輸入

數(shù)據(jù)的伸縮變化也不會影響到對該層的權(quán)重參數(shù)更新,使得訓(xùn)練過程更加魯棒,簡化了對學(xué)習(xí)率的選擇。

