常用 Normalization 方法的總結(jié)與思考:BN、LN、IN、GN

作者:G-kdom 知乎鏈接:https://zhuanlan.zhihu.com/p/72589565 本文僅供學習參考,如有侵權(quán),請聯(lián)系刪除!
常用的Normalization方法主要有:Batch Normalization(BN,2015年)、Layer Normalization(LN,2016年)、Instance Normalization(IN,2017年)、Group Normalization(GN,2018年)。它們都是從激活函數(shù)的輸入來考慮、做文章的,以不同的方式對激活函數(shù)的輸入進行 Norm?的。
我們將輸入的?feature map shape?記為[N, C, H, W],其中N表示batch size,即N個樣本;C表示通道數(shù);H、W分別表示特征圖的高度、寬度。這幾個方法主要的區(qū)別就是在:
1. BN是在batch上,對N、H、W做歸一化,而保留通道 C 的維度。BN對較小的batch size效果不好。BN適用于固定深度的前向神經(jīng)網(wǎng)絡,如CNN,不適用于RNN;
2. LN在通道方向上,對C、H、W歸一化,主要對RNN效果明顯;
3. IN在圖像像素上,對H、W做歸一化,用在風格化遷移;
4. GN將channel分組,然后再做歸一化。

如果把特征圖比喻成一摞書,這摞書總共有 N 本,每本有 C 頁,每頁有 H 行,每行 有W 個字符。
1. BN 求均值時,相當于把這些書按頁碼一一對應地加起來(例如第1本書第36頁,第2本書第36頁......),再除以每個頁碼下的字符總數(shù):N×H×W,因此可以把 BN 看成求“平均書”的操作(注意這個“平均書”每頁只有一個字),求標準差時也是同理。
2. LN 求均值時,相當于把每一本書的所有字加起來,再除以這本書的字符總數(shù):C×H×W,即求整本書的“平均字”,求標準差時也是同理。
3. IN 求均值時,相當于把一頁書中所有字加起來,再除以該頁的總字數(shù):H×W,即求每頁書的“平均字”,求標準差時也是同理。
4. GN 相當于把一本 C 頁的書平均分成 G 份,每份成為有 C/G 頁的小冊子,求每個小冊子的“平均字”和字的“標準差”。
一、 Batch Normalization, BN ??
論文鏈接:https://arxiv.org/pdf/1502.03167.pdf
為什么要進行BN呢?
(1)在深度神經(jīng)網(wǎng)絡訓練的過程中,通常以輸入網(wǎng)絡的每一個mini-batch進行訓練,這樣每個batch具有不同的分布,使模型訓練起來特別困難。
(2)Internal Covariate Shift (ICS) 問題:在訓練的過程中,激活函數(shù)會改變各層數(shù)據(jù)的分布,隨著網(wǎng)絡的加深,這種改變(差異)會越來越大,使模型訓練起來特別困難,收斂速度很慢,會出現(xiàn)梯度消失的問題。
BN的主要思想:針對每個神經(jīng)元,使數(shù)據(jù)在進入激活函數(shù)之前,沿著通道計算每個batch的均值、方差,‘強迫’數(shù)據(jù)保持均值為0,方差為1的正態(tài)分布,避免發(fā)生梯度消失。具體來說,就是把第1個樣本的第1個通道,加上第2個樣本第1個通道 ...... 加上第 N 個樣本第1個通道,求平均,得到通道 1 的均值(注意是除以 N×H×W 而不是單純除以 N,最后得到的是一個代表這個 batch 第1個通道平均值的數(shù)字,而不是一個 H×W 的矩陣)。求通道 1 的方差也是同理。對所有通道都施加一遍這個操作,就得到了所有通道的均值和方差。
BN的使用位置:全連接層或卷積操作之后,激活函數(shù)之前。
BN算法過程:
沿著通道計算每個batch的均值? 沿著通道計算每個batch的方差? 做歸一化 加入縮放和平移變量??和?

其中??是一個很小的正值,比如??。加入縮放和平移變量的原因是:保證每一次數(shù)據(jù)經(jīng)過歸一化后還保留原有學習來的特征,同時又能完成歸一化操作,加速訓練。?這兩個參數(shù)是用來學習的參數(shù)。
BN的作用:
(1)允許較大的學習率;
(2)減弱對初始化的強依賴性
(3)保持隱藏層中數(shù)值的均值、方差不變,讓數(shù)值更穩(wěn)定,為后面網(wǎng)絡提供堅實的基礎;
(4)有輕微的正則化作用(相當于給隱藏層加入噪聲,類似Dropout)
BN存在的問題:
(1)每次是在一個batch上計算均值、方差,如果batch size太小,則計算的均值、方差不足以代表整個數(shù)據(jù)分布。
(2)batch size太大:會超過內(nèi)存容量;需要跑更多的epoch,導致總訓練時間變長;會直接固定梯度下降的方向,導致很難更新。
二、 Layer Normalization, LN
論文鏈接:https://arxiv.org/pdf/1607.06450v1.pdf
針對BN不適用于深度不固定的網(wǎng)絡(sequence長度不一致,如RNN),LN對深度網(wǎng)絡的某一層的所有神經(jīng)元的輸入按以下公式進行normalization操作。

LN中同層神經(jīng)元的輸入擁有相同的均值和方差,不同的輸入樣本有不同的均值和方差。
對于特征圖??,LN 對每個樣本的 C、H、W 維度上的數(shù)據(jù)求均值和標準差,保留 N 維度。其均值和標準差公式為:

Layer Normalization (LN) 的一個優(yōu)勢是不需要批訓練,在單條數(shù)據(jù)內(nèi)部就能歸一化。LN不依賴于batch size和輸入sequence的長度,因此可以用于batch size為1和RNN中。LN用于RNN效果比較明顯,但是在CNN上,效果不如BN。
三、 ?Instance Normalization, IN
論文鏈接:https://arxiv.org/pdf/1607.08022.pdf
IN針對圖像像素做normalization,最初用于圖像的風格化遷移。在圖像風格化中,生成結(jié)果主要依賴于某個圖像實例,feature map 的各個 channel 的均值和方差會影響到最終生成圖像的風格。所以對整個batch歸一化不適合圖像風格化中,因而對H、W做歸一化。可以加速模型收斂,并且保持每個圖像實例之間的獨立。
對于,IN 對每個樣本的 H、W 維度的數(shù)據(jù)求均值和標準差,保留 N 、C 維度,也就是說,它只在 channel 內(nèi)部求均值和標準差,其公式如下:

四、 Group Normalization, GN
論文鏈接:https://arxiv.org/pdf/1803.08494.pdf
GN是為了解決BN對較小的mini-batch size效果差的問題。GN適用于占用顯存比較大的任務,例如圖像分割。對這類任務,可能 batch size 只能是個位數(shù),再大顯存就不夠用了。而當 batch size 是個位數(shù)時,BN 的表現(xiàn)很差,因為沒辦法通過幾個樣本的數(shù)據(jù)量,來近似總體的均值和標準差。GN 也是獨立于 batch 的,它是 LN 和 IN 的折中。
GN的主要思想:在 channel 方向 group,然后每個 group 內(nèi)做 Norm,計算??的均值和方差,這樣就與batch size無關,不受其約束。
具體方法:GN 計算均值和標準差時,把每一個樣本 feature map 的 channel 分成 G 組,每組將有 C/G 個 channel,然后將這些 channel 中的元素求均值和標準差。各組 channel 用其對應的歸一化參數(shù)獨立地歸一化。

偽代碼如下:

代碼如下:
def GroupNorm(x, gamma, beta, G=16):
# x_shape:[N, C, H, W]
results = 0.
eps = 1e-5
x = np.reshape(x, (x.shape[0], G, x.shape[1]/16, x.shape[2], x.shape[3]))
x_mean = np.mean(x, axis=(2, 3, 4), keepdims=True)
x_var = np.var(x, axis=(2, 3, 4), keepdims=True0)
x_normalized = (x - x_mean) / np.sqrt(x_var + eps)
results = gamma * x_normalized + beta
return results
總結(jié)
我們將feature map shape 記為[N, C, H, W]。如果把特征圖比喻成一摞書,這摞書總共有 N 本,每本有 C 頁,每頁有 H 行,每行 有W 個字符。

1. BN是在batch上,對N、H、W做歸一化,而保留通道 C 的維度。BN 相當于把這些書按頁碼一一對應地加起來,再除以每個頁碼下的字符總數(shù):N×H×W。
2. LN在通道方向上,對C、H、W歸一化。LN 相當于把每一本書的所有字加起來,再除以這本書的字符總數(shù):C×H×W。
3. IN在圖像像素上,對H、W做歸一化。IN 相當于把一頁書中所有字加起來,再除以該頁的總字數(shù):H×W。
4. GN將channel分組,然后再做歸一化。GN 相當于把一本 C 頁的書平均分成 G 份,每份成為有 C/G 頁的小冊子,對每個小冊子做Norm。
另外,還需要注意它們的映射參數(shù)和的區(qū)別:對于?BN,IN,GN, 其和都是維度等于通道數(shù) C 的向量。而對于?LN,其和都是維度等于 normalized_shape 的矩陣。
最后,BN 和 IN 可以設置參數(shù):momentum和track_running_stats來獲得在整體數(shù)據(jù)上更準確的均值和標準差。LN 和 GN 只能計算當前 batch 內(nèi)數(shù)據(jù)的真實均值和標準差。

