常用的 Normalization 方法:BN、LN、IN、GN

2021-02-20 機器學習算法與自然語言處理

作者 | G-kdom
編輯 | 唐裡

公眾號 | AI科技評論

本文轉自知乎作者G-kdom文章:常用的 Normalization 方法:BN、LN、IN、GN。AI科技評論獲授權轉載,如需轉載請聯繫原作者。

文章地址:
https://zhuanlan.zhihu.com/p/72589565

常用的Normalization方法主要有:Batch Normalization(BN,2015年)、Layer Normalization(LN,2016年)、Instance Normalization(IN,2017年)、Group Normalization(GN,2018年)。它們都是從激活函數的輸入來考慮、做文章的,以不同的方式對激活函數的輸入進行 Norm 的。
我們將輸入的 feature map shape 記為[N, C, H, W],其中N表示batch size,即N個樣本;C表示通道數;H、W分別表示特徵圖的高度、寬度。這幾個方法主要的區別就是在:1. BN是在batch上,對N、H、W做歸一化,而保留通道 C 的維度。BN對較小的batch size效果不好。BN適用於固定深度的前向神經網絡,如CNN,不適用於RNN;2. LN在通道方向上,對C、H、W歸一化,主要對RNN效果明顯;3. IN在圖像像素上,對H、W做歸一化,用在風格化遷移;每個子圖表示一個特徵圖,其中N為批量,C為通道,(H,W)為特徵圖的高度和寬度。通過藍色部分的值來計算均值和方差,從而進行歸一化。如果把特徵圖比喻成一摞書,這摞書總共有 N 本,每本有 C 頁,每頁有 H 行,每行 有W 個字符。1. BN 求均值時,相當於把這些書按頁碼一一對應地加起來(例如第1本書第36頁,第2本書第36頁.),再除以每個頁碼下的字符總數:N×H×W,因此可以把 BN 看成求「平均書」的操作(注意這個「平均書」每頁只有一個字),求標準差時也是同理。2. LN 求均值時,相當於把每一本書的所有字加起來,再除以這本書的字符總數:C×H×W,即求整本書的「平均字」,求標準差時也是同理。3. IN 求均值時,相當於把一頁書中所有字加起來,再除以該頁的總字數:H×W,即求每頁書的「平均字」,求標準差時也是同理。4. GN 相當於把一本 C 頁的書平均分成 G 份,每份成為有 C/G 頁的小冊子,求每個小冊子的「平均字」和字的「標準差」。  一、 Batch Normalization, BN (『重點、重點、重點』,重要的事情說三遍)論文連結:https://arxiv.org/pdf/1502.03167.pdf(1)在深度神經網絡訓練的過程中,通常以輸入網絡的每一個mini-batch進行訓練,這樣每個batch具有不同的分布,使模型訓練起來特別困難。(2)Internal Covariate Shift (ICS) 問題:在訓練的過程中,激活函數會改變各層數據的分布,隨著網絡的加深,這種改變(差異)會越來越大,使模型訓練起來特別困難,收斂速度很慢,會出現梯度消失的問題。BN的主要思想:針對每個神經元,使數據在進入激活函數之前,沿著通道計算每個batch的均值、方差,『強迫』數據保持均值為0,方差為1的正態分布,避免發生梯度消失。具體來說,就是把第1個樣本的第1個通道,加上第2個樣本第1個通道 . 加上第 N 個樣本第1個通道,求平均,得到通道 1 的均值(注意是除以 N×H×W 而不是單純除以 N,最後得到的是一個代表這個 batch 第1個通道平均值的數字,而不是一個 H×W 的矩陣)。求通道 1 的方差也是同理。對所有通道都施加一遍這個操作,就得到了所有通道的均值和方差。BN的使用位置:全連接層或卷積操作之後,激活函數之前。

沿著通道計算每個batch的均值μ 

沿著通道計算每個batch的方差σ² 

做歸一化

加入縮放和平移變量 γ 和 β

其中 ε 是一個很小的正值,比如 。加入縮放和平移變量的原因是:保證每一次數據經過歸一化後還保留原有學習來的特徵,同時又能完成歸一化操作,加速訓練。 這兩個參數是用來學習的參數。

BN的作用:

(1)允許較大的學習率;

(2)減弱對初始化的強依賴性

(3)保持隱藏層中數值的均值、方差不變,讓數值更穩定,為後面網絡提供堅實的基礎;

(4)有輕微的正則化作用(相當於給隱藏層加入噪聲,類似Dropout)

BN存在的問題:

(1)每次是在一個batch上計算均值、方差,如果batch size太小,則計算的均值、方差不足以代表整個數據分布。

(2)batch size太大:會超過內存容量;需要跑更多的epoch,導致總訓練時間變長;會直接固定梯度下降的方向,導致很難更新。

  二、 Layer Normalization, LN

論文連結:https://arxiv.org/pdf/1607.06450v1.pdf

針對BN不適用於深度不固定的網絡(sequence長度不一致,如RNN),LN對深度網絡的某一層的所有神經元的輸入按以下公式進行normalization操作。

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

Layer Normalization (LN) 的一個優勢是不需要批訓練,在單條數據內部就能歸一化。LN不依賴於batch size和輸入sequence的長度,因此可以用於batch size為1和RNN中。LN用於RNN效果比較明顯,但是在CNN上,效果不如BN。

   三、 Instance Normalization, IN

論文連結:https://arxiv.org/pdf/1607.08022.pdf

IN針對圖像像素做normalization,最初用於圖像的風格化遷移。在圖像風格化中,生成結果主要依賴於某個圖像實例,feature map 的各個 channel 的均值和方差會影響到最終生成圖像的風格。所以對整個batch歸一化不適合圖像風格化中,因而對H、W做歸一化。可以加速模型收斂,並且保持每個圖像實例之間的獨立。

對於,IN 對每個樣本的 H、W 維度的數據求均值和標準差,保留 N 、C 維度,也就是說,它只在 channel 內部求均值和標準差,其公式如下:

  四、 Group Normalization, GN(拿小本本get一下)

論文連結:https://arxiv.org/pdf/1803.08494.pdf

GN是為了解決BN對較小的mini-batch size效果差的問題。GN適用於佔用顯存比較大的任務,例如圖像分割。對這類任務,可能 batch size 只能是個位數,再大顯存就不夠用了。而當 batch size 是個位數時,BN 的表現很差,因為沒辦法通過幾個樣本的數據量,來近似總體的均值和標準差。GN 也是獨立於 batch 的,它是 LN 和 IN 的折中。

GN的主要思想:在 channel 方向 group,然後每個 group 內做 Norm,計算的均值和方差,這樣就與batch size無關,不受其約束。具體方法:GN 計算均值和標準差時,把每一個樣本 feature map 的 channel 分成 G 組,每組將有 C/G 個 channel,然後將這些 channel 中的元素求均值和標準差。各組 channel 用其對應的歸一化參數獨立地歸一化。

代碼如下:

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

我們將feature map shape 記為[N, C, H, W]。如果把特徵圖比喻成一摞書,這摞書總共有 N 本,每本有 C 頁,每頁有 H 行,每行 有W 個字符。

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

推薦閱讀:

嚮往的GAT(圖注意力模型)

如何評價Word2Vec作者提出的fastText算法?深度學習是否在文本分類等簡單任務上沒有優勢?

從Word2Vec到Bert,聊聊詞向量的前世今生(一)

相關焦點

  • 常用 Normalization 方法的總結與思考:BN、LN、IN、GN
    常用的Normalization方法主要有:Batch Normalization(BN,2015年)、Layer Normalization(LN,2016年)、Instance Normalization(IN,2017年)、Group Normalization(GN,2018年)。
  • [PyTorch 學習筆記] 6.2 Normalization
    批標準化的優點有如下:可以不用 dropout 或者較小的 dropout可以不用 L2 或者較小的 weight decay可以不用 LRN (local response normalization)假設輸入的 mini-batch 數據是
  • 詳解深度學習中的Normalization,BN/LN/WN
    Normalization 的通用框架與基本思想——從主流 Normalization 方法中提煉出的抽象框架3. 主流 Normalization 方法梳理——結合上述框架,將 BatchNorm / LayerNorm / WeightNorm / CosineNorm 對號入座,各種方法之間的異同水落石出。4.
  • 深入理解Batch Normalization
    什麼是 Local Response Normalization(LRN)我們都知道,Normalization是深度神經網絡中一項最常用也是最終要的技術之一。早在Alexnet時代,Normalization便已經被應用到了視覺分類任務中,也就是本節所要介紹的LRN。雖然後來的BN的出現,逐漸替代了LRN,但是在這裡也簡單地介紹以下。
  • BN,LN,IN,GN都是什麼?不同歸一化方法的比較
    組歸一化(GN)是一種最新的規範化方法,可以避免利用批處理維,因此與批處理大小無關。不同的歸一化方法為了促進GN的表述,我們將首先看一下以前的一些標準化方法。x ← (x - ) / √( + )對於每個係數x輸入特性。
  • Batch Normalization 的實戰使用
    前言Batch normalization 有多好用我就不多說了,一般來說,做卷積神經網絡加上batch normalization,效果會得到一定的提升的。具體的batch normalization的原理可以參照(https://zhuanlan.zhihu.com/p/34879333)我在他的基礎上補充關於卷積神經網絡使用Batch normalization的一些代碼實現。
  • Batch Normalization應該放在ReLU非線性激活層的前面還是後面?
    BN,也就是Batch-Normalization,這名字就能讓我們想到普通的normalization(歸一化),也就是將輸入傳給神經網絡之前對輸入做的normalization。這個normalization是對輸入操作的,是在輸入層之前進行的。
  • 理解Batch Normalization(含實現代碼)
    bn: whether to include batch normalization or not.     = 5, bn=False, activation = "sigmoid")sigmoid_without_bn = compile_model(sigmoid_without_bn)sigmoid_with_bn = build_model(blocks = 5, bn=True, activation = "sigmoid")sigmoid_with_bn = compile_model
  • 詳解Batch Normalization及其反向傳播
    所以,對於一般的統計學習問題,在訓練前將數據進行歸一化或者白化(whitening)是一個很常用的trick。但這個問題在深度神經網絡中變得更加難以解決。在神經網絡中,網絡是分層的,可以把每一層視為一個單獨的分類器,將一個網絡看成分類器的串聯。
  • 數列bn和an的關係2^bn=a1a2a3……an求bn?重在指數和對數的轉化
    原題原題:等比數列「an」的首項為2,數列「bn」滿足2^(bn)=a1a2a3…an,b4=b3+4,則bn=?為了保證等式2^(bn)=a1·a2·a3…an不變,我們可以將式子2^(bn)=a1·a2·a3…an等號左右兩邊都放入對數之中。又因為式子2^(bn)=a1·a2·a3…an中的指數涉及了底數是2的情況,所以可以將該式子放入以底數為2的對數之中。
  • 什麼是批標準化 (Batch Normalization)
    Batch Normalization, 批標準化, 和普通的數據標準化類似, 是將分散的數據統一的一種做法, 也是優化神經網絡的一種方法.BN 添加位置Batch normalization 的 batch 是批數據, 把數據分成小批小批進行 stochastic gradient descent. 而且在每批數據進行前向傳遞 forward propagation 的時候, 對每一層都進行 normalization 的處理,
  • PyTorch 源碼解讀之 BN & SyncBN
    BatchNorm 的 PyTorch 實現PyTorch 中與 BN 相關的幾個類放在 torch.nn.modules.batchnorm 中,包含以下幾個類:_NormBase:nn.Module 的子類,定義了 BN 中的一系列屬性與初始化、讀數據的方法;_BatchNorm:_NormBase 的子類,定義了 forward 方法;BatchNorm1d
  • Layer Normalization
    我在第一篇推文裡也提到過,normalization也可以看成一種廣義的數據增強,防止過擬合。考慮到每次前項傳播時要遍歷所有數據是不現實的,實際應用的時候,只計算了一個minibatch 的均值和方差,當作整個數據集在相應層的均值和方差。BN十分強大,但是也有一些問題。
  • <優化策略-2>深度學習加速器Layer Normalization-LN
    Jimmy Lei Ba,Jamie Ryan Kiros[2] Batch normalization: Accelerating deep network training by reducing internal covariate shift. Sergey Ioffe and Christian Szegedy.
  • 「新高一」高考數學40條秒殺型公式與方法,強烈推薦
    二階有點麻煩,且不常用。所以不贅述。希望同學們牢記上述公式。8、常用數列bn=n×(2²n)求和Sn=(n-1)×(2²(n+1))+2記憶方法:前面減去一個1,後面加一個,再整體加一個29、適用於標準方程(焦點在x軸)爆強公式:k橢=-{(b²)xo}/{(a²)yo}k雙={(b²)xo}/{(a²)yo}k拋=p/
  • 2020高考數學複習方法:50種快速做題方法匯總
    常用數列bn=n×(22n)求和Sn=(n-1)×(22(n+1))+2記憶方法  前面減去一個1,後面加一個,再整體加一個2  9 .關於解決證明含ln的不等式的一種思路  舉例說明:證明1+1/2+1/3+…+1/n>ln(n+1)  把左邊看成是1/n求和,右邊看成是Sn。  解:令an=1/n,令Sn=ln(n+1),則bn=ln(n+1)-lnn,  那麼只需證an>bn即可,根據定積分知識畫出y=1/x的圖。
  • 高中數學48種快速做題的方法,個個都是經典!
    常用數列bn=n×(2²n)求和Sn=(n-1)×(2²(n+1))+2記憶方法前面減去一個1,後面加一個,再整體加一個29 .關於解決證明含ln的不等式的思路舉例說明:證明1+1/2+1/3+…+1/n>ln(n+1)把左邊看成是1/n求和,右邊看成是Sn。解:令an=1/n,令Sn=ln(n+1),則bn=ln(n+1)-lnn,那麼只需證an>bn即可,根據定積分知識畫出y=1/x的圖。
  • 高考數學48條秒殺型公式與方法
    8.常用數列bn=n×(2²n)求和Sn=(n-1)×(2²(n+1))+2記憶方法:前面減去一個1,後面加一個,再整體加一個2k橢=-{(b²)xo}/{(a²)yo}k雙={(b²)xo}/{(a²)yo}註:(xo,yo)均為直線過圓錐曲線所截段的中點。