天天看點

【DL】Normalization總結

版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協定,轉載請附上原文出處連結和本聲明。 本文連結: https://blog.csdn.net/ft_sunshine/article/details/99203548

文章目錄

    • 簡介
      • 獨立同分布(i.i.d)
      • Internal Covariate Shift
      • Normalization的通用公式
    • Batch-Normalization —— 縱向規範化
      • 為什麼用BN
      • BN怎麼操作
      • Inference
      • BatchNorm的優勢與局限
    • Layer normalization —— 橫向規範化
      • 計算方式
      • LN vs BN
    • Weight Normalization —— 參數規範化
    • Instance Normalization —— 執行個體規範化
    • Group Normalization —— 組規範化
    • 總結
    • 題外話:normalization 有效的原因?
    • References

簡介

在深度學習領域,Normalization用得很多,最近在學習各種Normalization方法的時候頗有感悟和收獲,特此記錄。

BN(Batch Normalization)于2015年由 Google 提出,開創了Normalization 先河;2016年出了LN(layer normalization)和IN(Instance Normalization);2018年也就是今年,Kaiming提出了GN(Group normalization),成為了ECCV 2018最佳論文提名。(其實還有很多Normalization的方法,因為用得也不是很多,這裡隻重點介紹這四種。)

獨立同分布(i.i.d)

首先我們需要知道,機器學習領域有個很重要的假設:IID獨立同分布假設,就是假設訓練資料和測試資料是滿足相同分布的,這是通過訓練資料獲得的模型能夠在測試集獲得好的效果的一個基本保障。那BatchNorm的作用是什麼呢?BatchNorm就是在深度神經網絡訓練過程中使得每一層神經網絡的輸入保持相同分布的。(獨立同分布的資料可以簡化正常機器學習模型的訓練、提升機器學習模型的預測能力,這已經是一個共識。)

為了得到服從i.i.d獨立同分布的資料,在把資料喂給機器學習模型之前,“白化(whitening)”是一個重要的資料預處理步驟。白化一般包含兩個目的:(得到獨立同分布資料)

  • 去除特征之間的相關性 —> 獨立;
  • 使得所有特征具有相同的均值和方差 —> 同分布。

白化最典型的方法就是PCA白化,在此不再贅述。(摘自文章)

Internal Covariate Shift

各種Normalization方法的提出基本都是為了解決“Internal Covariate Shift”問題的,那麼什麼是“Internal Covariate Shift”呢?

下面引入“Internal Covariate Shift”的概念:如果ML系統執行個體集合<X,Y>中的輸入值X的分布老是變,這不符合IID假設,網絡模型很難穩定地學規律,這不得引入遷移學習才能搞定嗎,我們的ML系統還得去學習怎麼迎合這種分布變化啊。對于深度學習這種包含很多隐層的網絡結構,在訓練過程中,因為各層參數不停在變化,是以每個隐層都會面臨covariate shift的問題,也就是在訓練過程中,隐層的輸入分布老是變來變去,這就是所謂的“Internal Covariate Shift”。Internal指的是深層網絡的隐層,是發生在網絡内部的事情,而不是covariate shift問題隻發生在輸入層。(摘自文章)

換一種說法:,對于神經網絡的各層輸出,由于它們經過了層内操作(比如激活函數)作用,其分布顯然與各層對應的輸入信号分布不同,而且差異會随着網絡深度增大而增大,可是它們所能“訓示”的樣本标記(label)仍然是不變的,這便符合了covariate shift的定義。由于是對層間信号的分析,也即是“internal”的來由。

簡而言之,每個神經元的輸入資料不再是“獨立同分布”的。是以“Internal Covariate Shift”會導緻什麼問題呢?

  • 各層參數需要不斷适應新的輸入資料分布,降低學習速度。(學習率不能大,訓練速度緩慢)
  • 深層輸入的變化可能趨向于變大或者變小,導緻淺層落入飽和區,使得學習過早停止。(容易梯度飽和、消失。)
  • 每層的更新都會影響到其它層,是以每層的參數更新政策需要盡可能謹慎地選擇。(調參困難)

Normalization的通用公式

我們首先給出Normalization的通用公式:

h = f ( g ⋅ x − μ σ + b ) h = f ( g ⋅ x − μ σ + b ) h = f ( g ⋅ σ x − μ ​ + b ) h=f(g⋅x−μσ+b)h=f\left(\mathbf{g} \cdot \frac{\mathbf{x}-\mu}{\sigma}+\mathbf{b}\right)h=f(g⋅σx−μ​+b) h=f(g⋅x−μσ+b)h=f(g⋅σx−μ​+b)h=f(g⋅σx−μ​+b)

其中 x x x x\mathbf{x}x xxx代表某個神經元處在過激活函數之前的值。對照于這一公式,下面我們來梳理主流的幾種規範化方法。

Batch-Normalization —— 縱向規範化

BN目前已經成為了調參師面試必問題之一了。同時,BN層也慢慢變成了神經網絡不可分割的一部分了,相比其他優化操作比如dropout,L1、L2正則化, momentum,影子變量等等,BN是最無可替代的。

首先我們先定義一個概念:激活輸入值(就是深度神經網絡中每個隐層在進行非線性變換處理前的資料,即BN一定是用在激活函數之前的!!)

為什麼用BN

BN的提出是為了解決“Internal Covariate Shift”問題的,其基本思想為:能不能讓每個隐層節點的激活輸入值的分布固定下來呢?這樣就避免了“Internal Covariate Shift”問題了。(可以了解為對深層神經網絡每個隐層神經元的激活輸入值做簡化版本的白化操作)

BN的基本思想其實相當直覺:因為深層神經網絡在做非線性變換前的激活輸入值(就是那個X=WU+B,U是輸入)随着網絡深度加深或者在訓練過程中,其分布逐漸發生偏移或者變動,之是以訓練收斂慢,一般是整體分布逐漸往非線性函數的取值區間的上下限兩端靠近(對于Sigmoid函數來說,在極大或極小的值處函數的導數接近0),是以這導緻反向傳播時低層神經網絡的梯度消失,這是訓練深層神經網絡收斂越來越慢的本質原因。而BN就是通過一定的規範化手段,把每層神經網絡任意神經元這個激活輸入值的分布強行拉回到均值為0方差為1的标準正态分布,這樣使得激活輸入值落在非線性函數對輸入比較敏感的區域(例如sigmoid函數的中間的部分),這樣輸入的小變化就會導緻損失函數較大的變化,意思是這樣讓梯度變大,避免梯度消失問題産生,而且梯度變大意味着學習收斂速度快,能大大加快訓練速度。

【DL】Normalization總結

經過BN後,目前大部分激活輸入值都落入非線性函數的線性區内(近似線性區域),其對應的導數遠離導數飽和區,這樣來加速訓練收斂過程。

但是很明顯,看到這裡,稍微了解神經網絡的讀者一般會提出一個疑問:如果都通過BN,那麼不就跟把非線性函數替換成線性函數效果相同了?這意味着什麼?我們知道,如果是多層的線性函數變換其實這個深層是沒有意義的,因為多層線性網絡跟一層線性網絡是等價的。這意味着網絡的表達能力下降了,這也意味着深度的意義就沒有了。是以BN為了保證非線性的獲得,對變換後的滿足均值為 000 000 000方差為 111 111 111的 x x x xxx xxx又進行了scale加上shift操作( y = s c a l e ∗ x + s h i f t y = s c a l e ∗ x + s h i f t y = s c a l e ∗ x + s h i f t y=scale∗x+shifty=scale*x+shifty=scale∗x+shift y=scale∗x+shifty=scale∗x+shifty=scale∗x+shift),每個神經元增加了scale和shift參數,這兩個參數是通過訓練學習到的(可學習參數),意思是通過scale和shift參數把激活輸入值從标準正态分布左移或者右移一點并長胖一點或者變瘦一點,每個執行個體挪動的程度不一樣,這樣等價于把非線性函數的值從正中心周圍的線性區往非線性區動了動。核心思想應該是想找到一個線性和非線性的較好平衡點,既能享受非線性的較強表達能力的好處,又避免太靠非線性區兩頭使得網絡收斂速度太慢。

BN怎麼操作

對于Mini-Batch SGD(一定是針對batch資料)來說,一次訓練過程裡面包含m個訓練執行個體,其具體BN操作就是對于隐層内每個神經元(BN層是對于每個神經元做歸一化處理,甚至隻需要對某一個神經元進行歸一化,而不是對一整層網絡的神經元進行歸一化。)的激活輸入值來說,進行如下變換:

x ( k ) = x ( k ) − E [ x ( k ) ] V a r ⁡ [ x ( k ) ] x ^ ( k ) = x ( k ) − E [ x ( k ) ] Var ⁡ [ x ( k ) ] x ( k ) = V a r [ x ( k ) ] ​ x ( k ) − E [ x ( k ) ] ​ x^(k)=x(k)−E[x(k)]Var⁡[x(k)]\hat{x}^{(k)}=\frac{x^{(k)}-E\left[x^{(k)}\right]}{\sqrt{\operatorname{Var}\left[x^{(k)}\right]}}x^(k)=Var[x(k)]​x(k)−E[x(k)]​ x(k)=x(k)−E[x(k)]Var⁡[x(k)]x^(k)=Var[x(k)]

​x(k)−E[x(k)]​x(k)=Var[x(k)]​x(k)−E[x(k)]​

變換的意思是:某個神經元對應的原始的激活輸入值x通過減去mini-Batch内m個執行個體獲得的m個激活輸入值的均值E(x)并除以求得的方差Var(x)來進行轉換。

上文說過經過這個變換後某個神經元的激活x變成了均值為0,方差為1的正态分布,目的是把激活輸入值往後續要進行的非線性變換的線性區拉動,增大導數值,增強反向傳播資訊流動性,加快訓練收斂速度。但是這樣會導緻網絡表達能力下降,為了防止這一點,每個神經元增加**兩個調節參數(scale和shift)**來進行“再變換”,這兩個參數是通過訓練來學習到的,用來對變換後的激活反變換,使得網絡表達能力增強,即對變換後的激活進行如下的scale和shift操作,這其實是變換的反操作:

y ( k ) = γ ( k ) x ( k ) + β ( k ) y ( k ) = γ ( k ) x ^ ( k ) + β ( k ) y ( k ) = γ ( k ) x ( k ) + β ( k ) y(k)=γ(k)x^(k)+β(k)y^{(k)}=\gamma^{(k)} \hat{x}^{(k)}+\beta^{(k)}y(k)=γ(k)x^(k)+β(k) y(k)=γ(k)x(k)+β(k)y(k)=γ(k)x^(k)+β(k)y(k)=γ(k)x(k)+β(k)

上述過程論文中的描述為:

【DL】Normalization總結

注:第三步多了一個 ε ε ε ε\varepsilonε εεε,這裡的 ε ε ε ε\varepsilonε εεε是一個很小的數,目的是為了避免由分母等于0帶來的系統錯誤。

Inference

在Inference階段,因為沒有mini-batch,看似好像無法求得執行個體集合的均值和方差。但是我們還是有辦法的。既然沒有從Mini-Batch資料裡可以得到的統計量,那就想其它辦法來獲得這個統計量,就是均值和方差。

可以用從所有訓練執行個體中獲得的統計量來代替Mini-Batch裡面m個訓練執行個體獲得的均值和方差統計量,那麼在推理的時候直接用全局統計量即可:因為每次做Mini-Batch訓練時,都會有那個Mini-Batch裡m個訓練執行個體獲得的均值和方差,現在要全局統計量,隻要把每個Mini-Batch的均值和方差統計量記住,然後對這些均值和方差求其對應的數學期望即可得出全局統計量,即:

E [ x ] ← E B [ μ B ] E [ x ] ← E B [ μ B ] E [ x ] ← E B ​ [ μ B ​ ] E[x]←EB[μB]{E[x] \leftarrow E_{\mathrm{B}}\left[\mu_{\mathrm{B}}\right]}E[x]←EB​[μB​] E[x]←EB[μB]E[x]←EB​[μB​]E[x]←EB​[μB​]

V a r ⁡ [ x ] ← m m − 1 E B [ σ B 2 ] Var ⁡ [ x ] ← m m − 1 E B [ σ B 2 ] V a r [ x ] ← m − 1 m ​ E B ​ [ σ B 2 ​ ] Var⁡[x]←mm−1EB[σB2]{\operatorname{Var}[x] \leftarrow \frac{m}{m-1} E_{\mathrm{B}}\left[\sigma_{\mathrm{B}}^{2}\right]}Var[x]←m−1m​EB​[σB2​] Var⁡[x]←mm−1EB[σB2]Var[x]←m−1m​EB​[σB2​]Var[x]←m−1m​EB​[σB2​]

有了均值 E [ x ] E [ x ] E [ x ] E[x]E[x]E[x] E[x]E[x]E[x]和方差 V a r [ x ] V a r [ x ] V a r [ x ] Var[x]{Var}[x]Var[x] Var[x]Var[x]Var[x],每個隐層神經元也已經有對應訓練好的Scaling參數 γ γ γ γ\gammaγ γγγ和Shift參數 ε ε ε ε\varepsilonε εεε,那麼在推理過程中進行BN采取如下方式:(通過簡單的合并計算推導就可以得出這個結論)

y = γ V a r ⁡ [ x ] + ε ⋅ x + ( β − γ ⋅ E [ x ] V a r ⁡ [ x ] + ε ) ) y = γ Var ⁡ [ x ] + ε ⋅ x + ( β − γ ⋅ E [ x ] Var ⁡ [ x ] + ε ) ) y = V a r [ x ] + ε ​ γ ​ ⋅ x + ( β − V a r [ x ] + ε ​ ) γ ⋅ E [ x ] ​ ) y=γVar⁡[x]+ε⋅x+(β−γ⋅E[x]Var⁡[x]+ε))y=\frac{\gamma}{\sqrt{\operatorname{Var}[x]+\varepsilon}} \cdot x+\left(\beta-\frac{\gamma \cdot E[x]}{\sqrt{\operatorname{Var}[x]+\varepsilon} )}\right)y=Var[x]+ε​γ​⋅x+(β−Var[x]+ε​)γ⋅E[x]​) y=γVar⁡[x]+ε⋅x+(β−γ⋅E[x]Var⁡[x]+ε))y=Var[x]+ε

​γ​⋅x+(β−Var[x]+ε

​)γ⋅E[x]​)y=Var[x]+ε​γ​⋅x+(β−Var[x]+ε​)γ⋅E[x]​)

BatchNorm的優勢與局限

BatchNorm的優勢如下:

  • 極大提升了訓練速度,收斂過程大大加快;
  • 還能增加分類效果,一種解釋是這是類似于Dropout的一種防止過拟合的正則化表達方式,是以不用Dropout也能達到相當的效果;
  • 另外調參過程也簡單多了,對于初始化要求沒那麼高,而且可以使用大的學習率等;

局限:由于BN與mini-batch的資料分布緊密相關,故而mini-batch的資料分布需要與總體的資料分布近似相等。是以BN适用于batch size較大且各mini-batch分布相近似的場景下(訓練前需進行充分的shuffle)。不适用于動态網絡結構和RNN。其次,BN隻在訓練的時候用,inference的時候不會用到,因為inference的輸入不是批量輸入。這也不一定是BN的缺點,但這是BN的特點。

Layer normalization —— 橫向規範化

在前面談到,标準化的作用就是改良資料分布。

BN的操作是,對同一批次的資料分布進行标準化,得出的均值方差,其可信度受batch size影響。很容易可以想到,如果我們對小batch size得出均值方差,那勢必和總資料的均值方差有所偏差。這樣就解釋了BN的第一個缺點:BN特别依賴batch Size;

與BN僅針對單個神經元不同,LN綜合考慮整個一層的資訊,計算該層輸出的平均值和方差作為規範化标準,對該層的所有輸出施行同一個規範化操作,即對同一層網絡的輸出做一個标準化。注意,同一層的輸出是單個圖檔的輸出,比如對于一個batch size為32的神經網絡訓練,會有32個均值和方差被得出,每個均值和方差都是由單張圖檔的所有channel之間做一個标準化得到的。這麼操作,就使得LN不受batch size的影響。同時,LN可以很好地用到序列型網絡如RNN中。同時,LN在訓練過程和inference過程都會用到,這就是和BN有很大的差别了。

計算方式

LN的計算方式如下:

μ l = 1 H ∑ i = 1 H a i l         σ l = 1 H ∑ i = 1 H ( a i l − μ l ) 2 μ l = 1 H ∑ i = 1 H a i l      σ l = 1 H ∑ i = 1 H ( a i l − μ l ) 2 μ l = H 1 ​ i = 1 ∑ H ​ a i l ​         σ l = H 1 ​ i = 1 ∑ H ​ ( a i l ​ − μ l ) 2 ​ μl=1H∑i=1Hail    σl=1H∑i=1H(ail−μl)2\mu^{l}=\frac{1}{H} \sum_{i=1}^{H} a_{i}^{l} \ \ \ \ \quad \sigma^{l}=\sqrt{\frac{1}{H} \sum_{i=1}^{H}\left(a_{i}^{l}-\mu^{l}\right)^{2}}μl=H1​i=1∑H​ail​    σl=H1​i=1∑H​(ail​−μl)2​ μl=1H∑i=1Hail    σl=1H∑i=1H(ail−μl)2μl=H1​i=1∑H​ail​    σl=H1​i=1∑H​(ail​−μl)2

​μl=H1​i=1∑H​ail​    σl=H1​i=1∑H​(ail​−μl)2​

H H H HHH HHH是某個隐藏層的神經元數量

LN vs BN

BN 的一個缺點是需要較大的 batchsize 才能合理估訓練資料的均值和方差,這導緻記憶體很可能不夠用,同時它也很難應用在訓練資料長度不同的 RNN 模型上。Layer Normalization (LN) 的一個優勢是不需要批訓練,在單條資料内部就能歸一化。

更形象一點的描述如下:

  • BN是“豎”着來的,各個次元分别做規範化,是以與batch size有關系;
  • LN是“橫”着來的,對于一個樣本,不同的神經元neuron間做規範化;

圖示如下:

【DL】Normalization總結

相較于BN,LN不受mini-batch的均值和方差的影響,可用于mini-batch較小時的場景、動态網絡結構和RNN。此外,由于無需儲存mini-batch的均值和方差,節省了存儲空間。然而,對于相似度相差較大的特征(比如顔色和大小),LN會降低模型的表示能力,此種情形下BN更好(因為BN可對單個神經元訓練得到)。

Weight Normalization —— 參數規範化

BN和LN将規範化應用于輸入資料x,WN則對權重進行規範化。WN是在訓練過程中,對網絡參數進行标準化。這也是一個很神奇的操作。不過效果表現上,是被BN、LN虐了。還不足以成為主流的标準化方法,是以在這裡隻是稍微提一下。(效果不是很好,僅提一下。)

WN将權重向量分解為權重大小和方向兩部分:

w = g ⋅ v = g ⋅ v ∥ v ∥ w = g ⋅ v ^ = g ⋅ v ∥ v ∥ w = g ⋅ v = g ⋅ ∥ v ∥ v ​ w=g⋅v^=g⋅v∥v∥\mathbf{w}=g \cdot \hat{\mathbf{v}}=g \cdot \frac{\mathbf{v}}{\|\mathbf{v}\|}w=g⋅v^=g⋅∥v∥v​ w=g⋅v=g⋅v∥v∥w=g⋅v^=g⋅∥v∥v​w=g⋅v=g⋅∥v∥v​

WN不依賴于輸入資料的分布,故可應用于mini-batch較小的情景且可用于動态網絡結構。此外,WN還避免了LN中對每一層使用同一個規範化公式的不足。

總的來看,LN、BN屬于将特征規範化,WN是将參數規範化。三種規範化方式盡管對輸入資料的尺度化(scale)參數來源不同,但其本質上都實作了資料的規範化操作。

Instance Normalization —— 執行個體規範化

Instance norm和Batch norm的差別隻有一點不同,那就是BN是作用于一個batch,而IN則是作用于單個樣本。也就是說,BN是同一個batch中所有樣本的同一層特征圖抽出來一起求mean和variance,而IN隻是對一個樣本中的每一層特征圖求mean和variance。這麼說的話似乎Instance norm隻對3D特征有用,也就是隻對圖像特征有用。(如果是一維特征,那麼用了instance norm結果還是自身,因為參與計算的值隻有1個,毫無意義.。。。)

這裡就不展開了,後面會有具體的圖來形象描述。

Group Normalization —— 組規範化

又是何恺明大佬的巨作,ECCV2018最佳論文提名,膜呀。。。

現狀:目前LN和IN都沒做到完全代替BN(其實作在看來GN也沒法取代BN)。GN的提出,就解決了BN所遇到的問題(batch size太大的話會out of memory)。GN對系統的優化程度完全不依賴Batch size有多大。我們來看一張圖:

【DL】Normalization總結

GN在很小的batch size就是穩定的,而BN在batch size不大的情況下,效果就會差很多。這看起來是令人興奮的。先看看GN是怎麼操作的:

【DL】Normalization總結

上圖描述了BN, LN, IN和GN四種norm方式。用更簡單的語言來講,各種Norm之間的差别隻是針對的次元不同而已。

  • BatchNorm:batch方向做歸一化,算NHW的均值;
  • LayerNorm:channel方向做歸一化,算CHW的均值;
  • InstanceNorm:一個channel内做歸一化,算H*W的均值;
  • GroupNorm:将channel方向分group,然後每個group内做歸一化,算(C//G)HW的均值;

總結

從最廣為人知的BN着手講解:

在一層層的網絡之間傳遞的資料,我們叫做hidden feature,即隐藏特征圖。我們的隐藏特征圖通常有4個次元,包括長、寬、depth和batch數。hidden feature的深度由上一參數層的filters數量決定,batch數就是我們設的batch size。

那麼,我們的hidden feature就可以看作一個4維張量,包含(N, C,H, W)這四個次元。N對應的就是batch數,而C對應的就是channel數,即depth。注意區分四個次元分别的含義。

如上圖所示,BN是在N次元上做的Norm,N越大那麼,N次元上Norm的效果就越好。實際上,我認為上圖畫得不夠好,因為一開始我看這張圖的時候,就被迷惑了好久,是以為了更好解釋這些次元之間的差别,我重新畫了一遍上圖,用我自己的方式:(摘自大佬部落格)

【DL】Normalization總結

對于BN來講,norm的操作range是下圖:

【DL】Normalization總結

紅色标記就是norm的操作range,通過這種方法,可以簡單标出LN和IN:

【DL】Normalization總結

我相信,通過上面這幾張圖,BN/LN/IN之間的差别是一目了然的。以此來引導出我們今天的主角——Group Norm.

GN也隻是在操作次元上進行了一丢丢改進而已。他的做法比較貼近LN,可是比LN成功得多。 看一下圖就知道了:

【DL】Normalization總結

GN并不像LN那樣把channel次元所有channel進行一個Normalization,而是以分組的形式獲得一個組的Norm即Group Normalization。就像作者自己比較的說法:

LN和IN隻是GN的兩種極端形式。

我們對channel進行分組,分組數為G,即一共分G組。 當G=1時,GN就是LN了;當G=C時,GN就是IN了。這也是一個有趣的比較,類似于GN是LN和IN的一個tradeoff。文章裡對G的預設值是32。

題外話:normalization 有效的原因?

我們以下面這個簡化的神經網絡為例來分析。(摘自知乎大佬文章)

【DL】Normalization總結
  1. 權重伸縮不變性

    權重伸縮不變性(weight scale invariance) 指的是:當權重 W W W W\mathbf{W}W WWW按照常量 λ λ λ λ\lambdaλ λλλ進行伸縮時,得到的規範化後的值保持不變,即:

    N o r m ⁡ ( W ′ x ) = N o r m ⁡ ( W x ) Norm ⁡ ( W ′ x ) = Norm ⁡ ( W x ) N o r m ( W ′ x ) = N o r m ( W x ) Norm⁡(W′x)=Norm⁡(Wx)\operatorname{Norm}\left(\mathbf{W}^{\prime} \mathbf{x}\right)=\operatorname{Norm}(\mathbf{W} \mathbf{x})Norm(W′x)=Norm(Wx) Norm⁡(W′x)=Norm⁡(Wx)Norm(W′x)=Norm(Wx)Norm(W′x)=Norm(Wx)

    其中 W ′ = λ W W ′ = λ W W ′ = λ W W′=λW\mathbf{W}^{\prime} = \lambda \mathbf{W}W′=λW W′=λWW′=λWW′=λW

    上述規範化方法均有這一性質,這是因為,當權重 W W W W\mathbf{W}W WWW伸縮時,對應的均值和标準差均等比例伸縮,分子分母相抵。

    【DL】Normalization總結

    權重伸縮不變性可以有效地提高反向傳播的效率。

    由于

    ∂ N o r m ⁡ ( W ′ x ) ∂ x = ∂ N o r m ⁡ ( W x ) ∂ x ∂ Norm ⁡ ( W ′ x ) ∂ x = ∂ Norm ⁡ ( W x ) ∂ x ∂ x ∂ N o r m ( W ′ x ) ​ = ∂ x ∂ N o r m ( W x ) ​ ∂Norm⁡(W′x)∂x=∂Norm⁡(Wx)∂x\frac{\partial \operatorname{Norm}\left(\mathbf{W}^{\prime} \mathbf{x}\right)}{\partial \mathbf{x}}=\frac{\partial \operatorname{Norm}(\mathbf{W} \mathbf{x})}{\partial \mathbf{x}}∂x∂Norm(W′x)​=∂x∂Norm(Wx)​ ∂Norm⁡(W′x)∂x=∂Norm⁡(Wx)∂x∂x∂Norm(W′x)​=∂x∂Norm(Wx)​∂x∂Norm(W′x)​=∂x∂Norm(Wx)​

    是以,權重的伸縮變化不會影響反向梯度的 Jacobian 矩陣,是以也就對反向傳播沒有影響,避免了反向傳播時因為權重過大或過小導緻的梯度消失或梯度爆炸問題,進而加速了神經網絡的訓練。

    權重伸縮不變性還具有參數正則化的效果,可以使用更高的學習率。

    由于

    ∂ N o r m ( W ′ x ) ∂ W ′ = 1 λ ⋅ ∂ N o r m ( W x ) ∂ W ∂ N o r m ( W ′ x ) ∂ W ′ = 1 λ ⋅ ∂ N o r m ( W x ) ∂ W ∂ W ′ ∂ N o r m ( W ′ x ) ​ = λ 1 ​ ⋅ ∂ W ∂ N o r m ( W x ) ​ ∂Norm(W′x)∂W′=1λ⋅∂Norm(Wx)∂W\frac{\partial N o r m\left(\mathbf{W}^{\prime} \mathbf{x}\right)}{\partial \mathbf{W}^{\prime}}=\frac{1}{\lambda} \cdot \frac{\partial N o r m(\mathbf{W} \mathbf{x})}{\partial \mathbf{W}}∂W′∂Norm(W′x)​=λ1​⋅∂W∂Norm(Wx)​ ∂Norm(W′x)∂W′=1λ⋅∂Norm(Wx)∂W∂W′∂Norm(W′x)​=λ1​⋅∂W∂Norm(Wx)​∂W′∂Norm(W′x)​=λ1​⋅∂W∂Norm(Wx)​

    是以,淺層的權重值越大,其梯度就越小。這樣,參數的變化就越穩定,相當于實作了參數正則化的效果,避免參數的大幅震蕩,提高網絡的泛化性能。

  2. Normalization 的資料伸縮不變性

    資料伸縮不變性(data scale invariance) 指的是,當資料 x x x x\mathbf{x}x xxx按照常量 λ λ λ λ\mathbf{\lambda}λ λλλ進行伸縮時,得到的規範化後的值保持不變,即:

    N o r m ⁡ ( W x ′ ) = N o r m ⁡ ( W x ) Norm ⁡ ( W x ′ ) = Norm ⁡ ( W x ) N o r m ( W x ′ ) = N o r m ( W x ) Norm⁡(Wx′)=Norm⁡(Wx)\operatorname{Norm}\left(\mathbf{W} \mathbf{x}^{\prime}\right)=\operatorname{Norm}(\mathbf{W} \mathbf{x})Norm(Wx′)=Norm(Wx) Norm⁡(Wx′)=Norm⁡(Wx)Norm(Wx′)=Norm(Wx)Norm(Wx′)=Norm(Wx)

    其中 x ′ = λ x x ′ = λ x x ′ = λ x x′=λx\mathbf{x}^{\prime} = \mathbf{\lambda} \mathbf{x}x′=λx x′=λxx′=λxx′=λx。

    資料伸縮不變性僅對 BN、LN 和 IN和GN成立。因為這四者對輸入資料進行規範化,是以當資料進行常量伸縮時,其均值和方差都會相應變化,分子分母互相抵消。而 WN 不具有這一性質。

    資料伸縮不變性可以有效地減少梯度彌散,簡化對學習率的選擇。

    對于某一層神經元 h l = f W l ( x l ) h l = f W l ( x l ) h l ​ = f W l ​ ​ ( x l ​ ) hl=fWl(xl)h_{l}=f_{\mathbf{W}_{l}}\left(\mathbf{x}_{l}\right)hl​=fWl​​(xl​) hl=fWl(xl)hl​=fWl​​(xl​)hl​=fWl​​(xl​)而言,展開可得:

    h l = f W l ( x l ) = f W l ( f W l − 1 ( x l − 1 ) ) = ⋯ = x 0 ∏ k = 0 l W k h l = f W l ( x l ) = f W l ( f W l − 1 ( x l − 1 ) ) = ⋯ = x 0 ∏ k = 0 l W k h l ​ = f W l ​ ​ ( x l ​ ) = f W l ​ ​ ( f W l − 1 ​ ​ ( x l − 1 ​ ) ) = ⋯ = x 0 ​ k = 0 ∏ l ​ W k ​ hl=fWl(xl)=fWl(fWl−1(xl−1))=⋯=x0∏k=0lWkh_{l}=f_{\mathbf{W}_{l}}\left(\mathbf{x}_{l}\right)=f_{\mathbf{W}_{l}}\left(f_{\mathbf{W}_{l-1}}\left(\mathbf{x}_{l-1}\right)\right)=\cdots=\mathbf{x}_{0} \prod_{k=0}^{l} \mathbf{W}_{k}hl​=fWl​​(xl​)=fWl​​(fWl−1​​(xl−1​))=⋯=x0​k=0∏l​Wk​ hl=fWl(xl)=fWl(fWl−1(xl−1))=⋯=x0∏k=0lWkhl​=fWl​​(xl​)=fWl​​(fWl−1​​(xl−1​))=⋯=x0​k=0∏l​Wk​hl​=fWl​​(xl​)=fWl​​(fWl−1​​(xl−1​))=⋯=x0​k=0∏l​Wk​

    每一層神經元的輸出依賴于底下各層的計算結果。如果沒有正則化,當下層輸入發生伸縮變化時,經過層層傳遞,可能會導緻資料發生劇烈的膨脹或者彌散,進而也導緻了反向計算時的梯度爆炸或梯度彌散。

    加入 Normalization 之後,不論底層的資料如何變化,對于某一層神經元 h l = f W l ( x l ) h l = f W l ( x l ) h l ​ = f W l ​ ​ ( x l ​ ) hl=fWl(xl)h_{l}=f_{\mathbf{W}_{l}}\left(\mathbf{x}_{l}\right)hl​=fWl​​(xl​) hl=fWl(xl)hl​=fWl​​(xl​)hl​=fWl​​(xl​)而言,其輸入 x l x l x l ​ xl\mathbf{x}_{l}xl​ xlxl​xl​永遠保持标準的分布,這就使得高層的訓練更加簡單。從梯度的計算公式來看:

    ∂ N o r m ( W x ′ ) ∂ W = ∂ N o r m ( W x ) ∂ W ∂ N o r m ( W x ′ ) ∂ W = ∂ N o r m ( W x ) ∂ W ∂ W ∂ N o r m ( W x ′ ) ​ = ∂ W ∂ N o r m ( W x ) ​ ∂Norm(Wx′)∂W=∂Norm(Wx)∂W\frac{\partial N o r m\left(\mathbf{W} \mathbf{x}^{\prime}\right)}{\partial \mathbf{W}}=\frac{\partial N o r m(\mathbf{W} \mathbf{x})}{\partial \mathbf{W}}∂W∂Norm(Wx′)​=∂W∂Norm(Wx)​ ∂Norm(Wx′)∂W=∂Norm(Wx)∂W∂W∂Norm(Wx′)​=∂W∂Norm(Wx)​∂W∂Norm(Wx′)​=∂W∂Norm(Wx)​

    資料的伸縮變化也不會影響到對該層的權重參數更新,使得訓練過程更加魯棒,簡化了對學習率的選擇。

References

  • https://www.cnblogs.com/guoyaohua/p/8724433.html
  • https://zhuanlan.zhihu.com/p/33173246
  • https://zhuanlan.zhihu.com/p/24810318
  • https://zhuanlan.zhihu.com/p/69659844
  • https://www.cnblogs.com/hellcat/p/9735041.html
  • https://zhuanlan.zhihu.com/p/52749286
  • https://blog.csdn.net/hjimce/article/details/50866313
  • https://blog.csdn.net/leviopku/article/details/83109422
  • https://blog.csdn.net/leviopku/article/details/83182194
  • https://blog.csdn.net/leviopku/article/details/83213123?utm_source=app
  • https://blog.csdn.net/qq_24153697/article/details/79880202
  • https://blog.csdn.net/malefactor/article/details/82154224
  • https://blog.csdn.net/siyue0211/article/details/82670452
</div>
            <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-095d4a0b23.css" target="_blank" rel="external nofollow"  rel="stylesheet">
                </div>
           

文章目錄

    • 簡介
      • 獨立同分布(i.i.d)
      • Internal Covariate Shift
      • Normalization的通用公式
    • Batch-Normalization —— 縱向規範化
      • 為什麼用BN
      • BN怎麼操作
      • Inference
      • BatchNorm的優勢與局限
    • Layer normalization —— 橫向規範化
      • 計算方式
      • LN vs BN
    • Weight Normalization —— 參數規範化
    • Instance Normalization —— 執行個體規範化
    • Group Normalization —— 組規範化
    • 總結
    • 題外話:normalization 有效的原因?
    • References

簡介

在深度學習領域,Normalization用得很多,最近在學習各種Normalization方法的時候頗有感悟和收獲,特此記錄。

BN(Batch Normalization)于2015年由 Google 提出,開創了Normalization 先河;2016年出了LN(layer normalization)和IN(Instance Normalization);2018年也就是今年,Kaiming提出了GN(Group normalization),成為了ECCV 2018最佳論文提名。(其實還有很多Normalization的方法,因為用得也不是很多,這裡隻重點介紹這四種。)

獨立同分布(i.i.d)

首先我們需要知道,機器學習領域有個很重要的假設:IID獨立同分布假設,就是假設訓練資料和測試資料是滿足相同分布的,這是通過訓練資料獲得的模型能夠在測試集獲得好的效果的一個基本保障。那BatchNorm的作用是什麼呢?BatchNorm就是在深度神經網絡訓練過程中使得每一層神經網絡的輸入保持相同分布的。(獨立同分布的資料可以簡化正常機器學習模型的訓練、提升機器學習模型的預測能力,這已經是一個共識。)

為了得到服從i.i.d獨立同分布的資料,在把資料喂給機器學習模型之前,“白化(whitening)”是一個重要的資料預處理步驟。白化一般包含兩個目的:(得到獨立同分布資料)

  • 去除特征之間的相關性 —> 獨立;
  • 使得所有特征具有相同的均值和方差 —> 同分布。

白化最典型的方法就是PCA白化,在此不再贅述。(摘自文章)

Internal Covariate Shift

各種Normalization方法的提出基本都是為了解決“Internal Covariate Shift”問題的,那麼什麼是“Internal Covariate Shift”呢?

下面引入“Internal Covariate Shift”的概念:如果ML系統執行個體集合<X,Y>中的輸入值X的分布老是變,這不符合IID假設,網絡模型很難穩定地學規律,這不得引入遷移學習才能搞定嗎,我們的ML系統還得去學習怎麼迎合這種分布變化啊。對于深度學習這種包含很多隐層的網絡結構,在訓練過程中,因為各層參數不停在變化,是以每個隐層都會面臨covariate shift的問題,也就是在訓練過程中,隐層的輸入分布老是變來變去,這就是所謂的“Internal Covariate Shift”。Internal指的是深層網絡的隐層,是發生在網絡内部的事情,而不是covariate shift問題隻發生在輸入層。(摘自文章)

換一種說法:,對于神經網絡的各層輸出,由于它們經過了層内操作(比如激活函數)作用,其分布顯然與各層對應的輸入信号分布不同,而且差異會随着網絡深度增大而增大,可是它們所能“訓示”的樣本标記(label)仍然是不變的,這便符合了covariate shift的定義。由于是對層間信号的分析,也即是“internal”的來由。

簡而言之,每個神經元的輸入資料不再是“獨立同分布”的。是以“Internal Covariate Shift”會導緻什麼問題呢?

  • 各層參數需要不斷适應新的輸入資料分布,降低學習速度。(學習率不能大,訓練速度緩慢)
  • 深層輸入的變化可能趨向于變大或者變小,導緻淺層落入飽和區,使得學習過早停止。(容易梯度飽和、消失。)
  • 每層的更新都會影響到其它層,是以每層的參數更新政策需要盡可能謹慎地選擇。(調參困難)

Normalization的通用公式

我們首先給出Normalization的通用公式:

h = f ( g ⋅ x − μ σ + b ) h = f ( g ⋅ x − μ σ + b ) h = f ( g ⋅ σ x − μ ​ + b ) h=f(g⋅x−μσ+b)h=f\left(\mathbf{g} \cdot \frac{\mathbf{x}-\mu}{\sigma}+\mathbf{b}\right)h=f(g⋅σx−μ​+b) h=f(g⋅x−μσ+b)h=f(g⋅σx−μ​+b)h=f(g⋅σx−μ​+b)

其中 x x x x\mathbf{x}x xxx代表某個神經元處在過激活函數之前的值。對照于這一公式,下面我們來梳理主流的幾種規範化方法。

Batch-Normalization —— 縱向規範化

BN目前已經成為了調參師面試必問題之一了。同時,BN層也慢慢變成了神經網絡不可分割的一部分了,相比其他優化操作比如dropout,L1、L2正則化, momentum,影子變量等等,BN是最無可替代的。

首先我們先定義一個概念:激活輸入值(就是深度神經網絡中每個隐層在進行非線性變換處理前的資料,即BN一定是用在激活函數之前的!!)

為什麼用BN

BN的提出是為了解決“Internal Covariate Shift”問題的,其基本思想為:能不能讓每個隐層節點的激活輸入值的分布固定下來呢?這樣就避免了“Internal Covariate Shift”問題了。(可以了解為對深層神經網絡每個隐層神經元的激活輸入值做簡化版本的白化操作)

BN的基本思想其實相當直覺:因為深層神經網絡在做非線性變換前的激活輸入值(就是那個X=WU+B,U是輸入)随着網絡深度加深或者在訓練過程中,其分布逐漸發生偏移或者變動,之是以訓練收斂慢,一般是整體分布逐漸往非線性函數的取值區間的上下限兩端靠近(對于Sigmoid函數來說,在極大或極小的值處函數的導數接近0),是以這導緻反向傳播時低層神經網絡的梯度消失,這是訓練深層神經網絡收斂越來越慢的本質原因。而BN就是通過一定的規範化手段,把每層神經網絡任意神經元這個激活輸入值的分布強行拉回到均值為0方差為1的标準正态分布,這樣使得激活輸入值落在非線性函數對輸入比較敏感的區域(例如sigmoid函數的中間的部分),這樣輸入的小變化就會導緻損失函數較大的變化,意思是這樣讓梯度變大,避免梯度消失問題産生,而且梯度變大意味着學習收斂速度快,能大大加快訓練速度。

【DL】Normalization總結

經過BN後,目前大部分激活輸入值都落入非線性函數的線性區内(近似線性區域),其對應的導數遠離導數飽和區,這樣來加速訓練收斂過程。

但是很明顯,看到這裡,稍微了解神經網絡的讀者一般會提出一個疑問:如果都通過BN,那麼不就跟把非線性函數替換成線性函數效果相同了?這意味着什麼?我們知道,如果是多層的線性函數變換其實這個深層是沒有意義的,因為多層線性網絡跟一層線性網絡是等價的。這意味着網絡的表達能力下降了,這也意味着深度的意義就沒有了。是以BN為了保證非線性的獲得,對變換後的滿足均值為 000 000 000方差為 111 111 111的 x x x xxx xxx又進行了scale加上shift操作( y = s c a l e ∗ x + s h i f t y = s c a l e ∗ x + s h i f t y = s c a l e ∗ x + s h i f t y=scale∗x+shifty=scale*x+shifty=scale∗x+shift y=scale∗x+shifty=scale∗x+shifty=scale∗x+shift),每個神經元增加了scale和shift參數,這兩個參數是通過訓練學習到的(可學習參數),意思是通過scale和shift參數把激活輸入值從标準正态分布左移或者右移一點并長胖一點或者變瘦一點,每個執行個體挪動的程度不一樣,這樣等價于把非線性函數的值從正中心周圍的線性區往非線性區動了動。核心思想應該是想找到一個線性和非線性的較好平衡點,既能享受非線性的較強表達能力的好處,又避免太靠非線性區兩頭使得網絡收斂速度太慢。

BN怎麼操作

對于Mini-Batch SGD(一定是針對batch資料)來說,一次訓練過程裡面包含m個訓練執行個體,其具體BN操作就是對于隐層内每個神經元(BN層是對于每個神經元做歸一化處理,甚至隻需要對某一個神經元進行歸一化,而不是對一整層網絡的神經元進行歸一化。)的激活輸入值來說,進行如下變換:

x ( k ) = x ( k ) − E [ x ( k ) ] V a r ⁡ [ x ( k ) ] x ^ ( k ) = x ( k ) − E [ x ( k ) ] Var ⁡ [ x ( k ) ] x ( k ) = V a r [ x ( k ) ] ​ x ( k ) − E [ x ( k ) ] ​ x^(k)=x(k)−E[x(k)]Var⁡[x(k)]\hat{x}^{(k)}=\frac{x^{(k)}-E\left[x^{(k)}\right]}{\sqrt{\operatorname{Var}\left[x^{(k)}\right]}}x^(k)=Var[x(k)]​x(k)−E[x(k)]​ x(k)=x(k)−E[x(k)]Var⁡[x(k)]x^(k)=Var[x(k)]

​x(k)−E[x(k)]​x(k)=Var[x(k)]​x(k)−E[x(k)]​

變換的意思是:某個神經元對應的原始的激活輸入值x通過減去mini-Batch内m個執行個體獲得的m個激活輸入值的均值E(x)并除以求得的方差Var(x)來進行轉換。

上文說過經過這個變換後某個神經元的激活x變成了均值為0,方差為1的正态分布,目的是把激活輸入值往後續要進行的非線性變換的線性區拉動,增大導數值,增強反向傳播資訊流動性,加快訓練收斂速度。但是這樣會導緻網絡表達能力下降,為了防止這一點,每個神經元增加**兩個調節參數(scale和shift)**來進行“再變換”,這兩個參數是通過訓練來學習到的,用來對變換後的激活反變換,使得網絡表達能力增強,即對變換後的激活進行如下的scale和shift操作,這其實是變換的反操作:

y ( k ) = γ ( k ) x ( k ) + β ( k ) y ( k ) = γ ( k ) x ^ ( k ) + β ( k ) y ( k ) = γ ( k ) x ( k ) + β ( k ) y(k)=γ(k)x^(k)+β(k)y^{(k)}=\gamma^{(k)} \hat{x}^{(k)}+\beta^{(k)}y(k)=γ(k)x^(k)+β(k) y(k)=γ(k)x(k)+β(k)y(k)=γ(k)x^(k)+β(k)y(k)=γ(k)x(k)+β(k)

上述過程論文中的描述為:

【DL】Normalization總結

注:第三步多了一個 ε ε ε ε\varepsilonε εεε,這裡的 ε ε ε ε\varepsilonε εεε是一個很小的數,目的是為了避免由分母等于0帶來的系統錯誤。

Inference

在Inference階段,因為沒有mini-batch,看似好像無法求得執行個體集合的均值和方差。但是我們還是有辦法的。既然沒有從Mini-Batch資料裡可以得到的統計量,那就想其它辦法來獲得這個統計量,就是均值和方差。

可以用從所有訓練執行個體中獲得的統計量來代替Mini-Batch裡面m個訓練執行個體獲得的均值和方差統計量,那麼在推理的時候直接用全局統計量即可:因為每次做Mini-Batch訓練時,都會有那個Mini-Batch裡m個訓練執行個體獲得的均值和方差,現在要全局統計量,隻要把每個Mini-Batch的均值和方差統計量記住,然後對這些均值和方差求其對應的數學期望即可得出全局統計量,即:

E [ x ] ← E B [ μ B ] E [ x ] ← E B [ μ B ] E [ x ] ← E B ​ [ μ B ​ ] E[x]←EB[μB]{E[x] \leftarrow E_{\mathrm{B}}\left[\mu_{\mathrm{B}}\right]}E[x]←EB​[μB​] E[x]←EB[μB]E[x]←EB​[μB​]E[x]←EB​[μB​]

V a r ⁡ [ x ] ← m m − 1 E B [ σ B 2 ] Var ⁡ [ x ] ← m m − 1 E B [ σ B 2 ] V a r [ x ] ← m − 1 m ​ E B ​ [ σ B 2 ​ ] Var⁡[x]←mm−1EB[σB2]{\operatorname{Var}[x] \leftarrow \frac{m}{m-1} E_{\mathrm{B}}\left[\sigma_{\mathrm{B}}^{2}\right]}Var[x]←m−1m​EB​[σB2​] Var⁡[x]←mm−1EB[σB2]Var[x]←m−1m​EB​[σB2​]Var[x]←m−1m​EB​[σB2​]

有了均值 E [ x ] E [ x ] E [ x ] E[x]E[x]E[x] E[x]E[x]E[x]和方差 V a r [ x ] V a r [ x ] V a r [ x ] Var[x]{Var}[x]Var[x] Var[x]Var[x]Var[x],每個隐層神經元也已經有對應訓練好的Scaling參數 γ γ γ γ\gammaγ γγγ和Shift參數 ε ε ε ε\varepsilonε εεε,那麼在推理過程中進行BN采取如下方式:(通過簡單的合并計算推導就可以得出這個結論)

y = γ V a r ⁡ [ x ] + ε ⋅ x + ( β − γ ⋅ E [ x ] V a r ⁡ [ x ] + ε ) ) y = γ Var ⁡ [ x ] + ε ⋅ x + ( β − γ ⋅ E [ x ] Var ⁡ [ x ] + ε ) ) y = V a r [ x ] + ε ​ γ ​ ⋅ x + ( β − V a r [ x ] + ε ​ ) γ ⋅ E [ x ] ​ ) y=γVar⁡[x]+ε⋅x+(β−γ⋅E[x]Var⁡[x]+ε))y=\frac{\gamma}{\sqrt{\operatorname{Var}[x]+\varepsilon}} \cdot x+\left(\beta-\frac{\gamma \cdot E[x]}{\sqrt{\operatorname{Var}[x]+\varepsilon} )}\right)y=Var[x]+ε​γ​⋅x+(β−Var[x]+ε​)γ⋅E[x]​) y=γVar⁡[x]+ε⋅x+(β−γ⋅E[x]Var⁡[x]+ε))y=Var[x]+ε

​γ​⋅x+(β−Var[x]+ε

​)γ⋅E[x]​)y=Var[x]+ε​γ​⋅x+(β−Var[x]+ε​)γ⋅E[x]​)

BatchNorm的優勢與局限

BatchNorm的優勢如下:

  • 極大提升了訓練速度,收斂過程大大加快;
  • 還能增加分類效果,一種解釋是這是類似于Dropout的一種防止過拟合的正則化表達方式,是以不用Dropout也能達到相當的效果;
  • 另外調參過程也簡單多了,對于初始化要求沒那麼高,而且可以使用大的學習率等;

局限:由于BN與mini-batch的資料分布緊密相關,故而mini-batch的資料分布需要與總體的資料分布近似相等。是以BN适用于batch size較大且各mini-batch分布相近似的場景下(訓練前需進行充分的shuffle)。不适用于動态網絡結構和RNN。其次,BN隻在訓練的時候用,inference的時候不會用到,因為inference的輸入不是批量輸入。這也不一定是BN的缺點,但這是BN的特點。

Layer normalization —— 橫向規範化

在前面談到,标準化的作用就是改良資料分布。

BN的操作是,對同一批次的資料分布進行标準化,得出的均值方差,其可信度受batch size影響。很容易可以想到,如果我們對小batch size得出均值方差,那勢必和總資料的均值方差有所偏差。這樣就解釋了BN的第一個缺點:BN特别依賴batch Size;

與BN僅針對單個神經元不同,LN綜合考慮整個一層的資訊,計算該層輸出的平均值和方差作為規範化标準,對該層的所有輸出施行同一個規範化操作,即對同一層網絡的輸出做一個标準化。注意,同一層的輸出是單個圖檔的輸出,比如對于一個batch size為32的神經網絡訓練,會有32個均值和方差被得出,每個均值和方差都是由單張圖檔的所有channel之間做一個标準化得到的。這麼操作,就使得LN不受batch size的影響。同時,LN可以很好地用到序列型網絡如RNN中。同時,LN在訓練過程和inference過程都會用到,這就是和BN有很大的差别了。

計算方式

LN的計算方式如下:

μ l = 1 H ∑ i = 1 H a i l         σ l = 1 H ∑ i = 1 H ( a i l − μ l ) 2 μ l = 1 H ∑ i = 1 H a i l      σ l = 1 H ∑ i = 1 H ( a i l − μ l ) 2 μ l = H 1 ​ i = 1 ∑ H ​ a i l ​         σ l = H 1 ​ i = 1 ∑ H ​ ( a i l ​ − μ l ) 2 ​ μl=1H∑i=1Hail    σl=1H∑i=1H(ail−μl)2\mu^{l}=\frac{1}{H} \sum_{i=1}^{H} a_{i}^{l} \ \ \ \ \quad \sigma^{l}=\sqrt{\frac{1}{H} \sum_{i=1}^{H}\left(a_{i}^{l}-\mu^{l}\right)^{2}}μl=H1​i=1∑H​ail​    σl=H1​i=1∑H​(ail​−μl)2​ μl=1H∑i=1Hail    σl=1H∑i=1H(ail−μl)2μl=H1​i=1∑H​ail​    σl=H1​i=1∑H​(ail​−μl)2

​μl=H1​i=1∑H​ail​    σl=H1​i=1∑H​(ail​−μl)2​

H H H HHH HHH是某個隐藏層的神經元數量

LN vs BN

BN 的一個缺點是需要較大的 batchsize 才能合理估訓練資料的均值和方差,這導緻記憶體很可能不夠用,同時它也很難應用在訓練資料長度不同的 RNN 模型上。Layer Normalization (LN) 的一個優勢是不需要批訓練,在單條資料内部就能歸一化。

更形象一點的描述如下:

  • BN是“豎”着來的,各個次元分别做規範化,是以與batch size有關系;
  • LN是“橫”着來的,對于一個樣本,不同的神經元neuron間做規範化;

圖示如下:

【DL】Normalization總結

相較于BN,LN不受mini-batch的均值和方差的影響,可用于mini-batch較小時的場景、動态網絡結構和RNN。此外,由于無需儲存mini-batch的均值和方差,節省了存儲空間。然而,對于相似度相差較大的特征(比如顔色和大小),LN會降低模型的表示能力,此種情形下BN更好(因為BN可對單個神經元訓練得到)。

Weight Normalization —— 參數規範化

BN和LN将規範化應用于輸入資料x,WN則對權重進行規範化。WN是在訓練過程中,對網絡參數進行标準化。這也是一個很神奇的操作。不過效果表現上,是被BN、LN虐了。還不足以成為主流的标準化方法,是以在這裡隻是稍微提一下。(效果不是很好,僅提一下。)

WN将權重向量分解為權重大小和方向兩部分:

w = g ⋅ v = g ⋅ v ∥ v ∥ w = g ⋅ v ^ = g ⋅ v ∥ v ∥ w = g ⋅ v = g ⋅ ∥ v ∥ v ​ w=g⋅v^=g⋅v∥v∥\mathbf{w}=g \cdot \hat{\mathbf{v}}=g \cdot \frac{\mathbf{v}}{\|\mathbf{v}\|}w=g⋅v^=g⋅∥v∥v​ w=g⋅v=g⋅v∥v∥w=g⋅v^=g⋅∥v∥v​w=g⋅v=g⋅∥v∥v​

WN不依賴于輸入資料的分布,故可應用于mini-batch較小的情景且可用于動态網絡結構。此外,WN還避免了LN中對每一層使用同一個規範化公式的不足。

總的來看,LN、BN屬于将特征規範化,WN是将參數規範化。三種規範化方式盡管對輸入資料的尺度化(scale)參數來源不同,但其本質上都實作了資料的規範化操作。

Instance Normalization —— 執行個體規範化

Instance norm和Batch norm的差別隻有一點不同,那就是BN是作用于一個batch,而IN則是作用于單個樣本。也就是說,BN是同一個batch中所有樣本的同一層特征圖抽出來一起求mean和variance,而IN隻是對一個樣本中的每一層特征圖求mean和variance。這麼說的話似乎Instance norm隻對3D特征有用,也就是隻對圖像特征有用。(如果是一維特征,那麼用了instance norm結果還是自身,因為參與計算的值隻有1個,毫無意義.。。。)

這裡就不展開了,後面會有具體的圖來形象描述。

Group Normalization —— 組規範化

又是何恺明大佬的巨作,ECCV2018最佳論文提名,膜呀。。。

現狀:目前LN和IN都沒做到完全代替BN(其實作在看來GN也沒法取代BN)。GN的提出,就解決了BN所遇到的問題(batch size太大的話會out of memory)。GN對系統的優化程度完全不依賴Batch size有多大。我們來看一張圖:

【DL】Normalization總結

GN在很小的batch size就是穩定的,而BN在batch size不大的情況下,效果就會差很多。這看起來是令人興奮的。先看看GN是怎麼操作的:

【DL】Normalization總結

上圖描述了BN, LN, IN和GN四種norm方式。用更簡單的語言來講,各種Norm之間的差别隻是針對的次元不同而已。

  • BatchNorm:batch方向做歸一化,算NHW的均值;
  • LayerNorm:channel方向做歸一化,算CHW的均值;
  • InstanceNorm:一個channel内做歸一化,算H*W的均值;
  • GroupNorm:将channel方向分group,然後每個group内做歸一化,算(C//G)HW的均值;

總結

從最廣為人知的BN着手講解:

在一層層的網絡之間傳遞的資料,我們叫做hidden feature,即隐藏特征圖。我們的隐藏特征圖通常有4個次元,包括長、寬、depth和batch數。hidden feature的深度由上一參數層的filters數量決定,batch數就是我們設的batch size。

那麼,我們的hidden feature就可以看作一個4維張量,包含(N, C,H, W)這四個次元。N對應的就是batch數,而C對應的就是channel數,即depth。注意區分四個次元分别的含義。

如上圖所示,BN是在N次元上做的Norm,N越大那麼,N次元上Norm的效果就越好。實際上,我認為上圖畫得不夠好,因為一開始我看這張圖的時候,就被迷惑了好久,是以為了更好解釋這些次元之間的差别,我重新畫了一遍上圖,用我自己的方式:(摘自大佬部落格)

【DL】Normalization總結

對于BN來講,norm的操作range是下圖:

【DL】Normalization總結

紅色标記就是norm的操作range,通過這種方法,可以簡單标出LN和IN:

【DL】Normalization總結

我相信,通過上面這幾張圖,BN/LN/IN之間的差别是一目了然的。以此來引導出我們今天的主角——Group Norm.

GN也隻是在操作次元上進行了一丢丢改進而已。他的做法比較貼近LN,可是比LN成功得多。 看一下圖就知道了:

【DL】Normalization總結

GN并不像LN那樣把channel次元所有channel進行一個Normalization,而是以分組的形式獲得一個組的Norm即Group Normalization。就像作者自己比較的說法:

LN和IN隻是GN的兩種極端形式。

我們對channel進行分組,分組數為G,即一共分G組。 當G=1時,GN就是LN了;當G=C時,GN就是IN了。這也是一個有趣的比較,類似于GN是LN和IN的一個tradeoff。文章裡對G的預設值是32。

題外話:normalization 有效的原因?

我們以下面這個簡化的神經網絡為例來分析。(摘自知乎大佬文章)

【DL】Normalization總結
  1. 權重伸縮不變性

    權重伸縮不變性(weight scale invariance) 指的是:當權重 W W W W\mathbf{W}W WWW按照常量 λ λ λ λ\lambdaλ λλλ進行伸縮時,得到的規範化後的值保持不變,即:

    N o r m ⁡ ( W ′ x ) = N o r m ⁡ ( W x ) Norm ⁡ ( W ′ x ) = Norm ⁡ ( W x ) N o r m ( W ′ x ) = N o r m ( W x ) Norm⁡(W′x)=Norm⁡(Wx)\operatorname{Norm}\left(\mathbf{W}^{\prime} \mathbf{x}\right)=\operatorname{Norm}(\mathbf{W} \mathbf{x})Norm(W′x)=Norm(Wx) Norm⁡(W′x)=Norm⁡(Wx)Norm(W′x)=Norm(Wx)Norm(W′x)=Norm(Wx)

    其中 W ′ = λ W W ′ = λ W W ′ = λ W W′=λW\mathbf{W}^{\prime} = \lambda \mathbf{W}W′=λW W′=λWW′=λWW′=λW

    上述規範化方法均有這一性質,這是因為,當權重 W W W W\mathbf{W}W WWW伸縮時,對應的均值和标準差均等比例伸縮,分子分母相抵。

    【DL】Normalization總結

    權重伸縮不變性可以有效地提高反向傳播的效率。

    由于

    ∂ N o r m ⁡ ( W ′ x ) ∂ x = ∂ N o r m ⁡ ( W x ) ∂ x ∂ Norm ⁡ ( W ′ x ) ∂ x = ∂ Norm ⁡ ( W x ) ∂ x ∂ x ∂ N o r m ( W ′ x ) ​ = ∂ x ∂ N o r m ( W x ) ​ ∂Norm⁡(W′x)∂x=∂Norm⁡(Wx)∂x\frac{\partial \operatorname{Norm}\left(\mathbf{W}^{\prime} \mathbf{x}\right)}{\partial \mathbf{x}}=\frac{\partial \operatorname{Norm}(\mathbf{W} \mathbf{x})}{\partial \mathbf{x}}∂x∂Norm(W′x)​=∂x∂Norm(Wx)​ ∂Norm⁡(W′x)∂x=∂Norm⁡(Wx)∂x∂x∂Norm(W′x)​=∂x∂Norm(Wx)​∂x∂Norm(W′x)​=∂x∂Norm(Wx)​

    是以,權重的伸縮變化不會影響反向梯度的 Jacobian 矩陣,是以也就對反向傳播沒有影響,避免了反向傳播時因為權重過大或過小導緻的梯度消失或梯度爆炸問題,進而加速了神經網絡的訓練。

    權重伸縮不變性還具有參數正則化的效果,可以使用更高的學習率。

    由于

    ∂ N o r m ( W ′ x ) ∂ W ′ = 1 λ ⋅ ∂ N o r m ( W x ) ∂ W ∂ N o r m ( W ′ x ) ∂ W ′ = 1 λ ⋅ ∂ N o r m ( W x ) ∂ W ∂ W ′ ∂ N o r m ( W ′ x ) ​ = λ 1 ​ ⋅ ∂ W ∂ N o r m ( W x ) ​ ∂Norm(W′x)∂W′=1λ⋅∂Norm(Wx)∂W\frac{\partial N o r m\left(\mathbf{W}^{\prime} \mathbf{x}\right)}{\partial \mathbf{W}^{\prime}}=\frac{1}{\lambda} \cdot \frac{\partial N o r m(\mathbf{W} \mathbf{x})}{\partial \mathbf{W}}∂W′∂Norm(W′x)​=λ1​⋅∂W∂Norm(Wx)​ ∂Norm(W′x)∂W′=1λ⋅∂Norm(Wx)∂W∂W′∂Norm(W′x)​=λ1​⋅∂W∂Norm(Wx)​∂W′∂Norm(W′x)​=λ1​⋅∂W∂Norm(Wx)​

    是以,淺層的權重值越大,其梯度就越小。這樣,參數的變化就越穩定,相當于實作了參數正則化的效果,避免參數的大幅震蕩,提高網絡的泛化性能。

  2. Normalization 的資料伸縮不變性

    資料伸縮不變性(data scale invariance) 指的是,當資料 x x x x\mathbf{x}x xxx按照常量 λ λ λ λ\mathbf{\lambda}λ λλλ進行伸縮時,得到的規範化後的值保持不變,即:

    N o r m ⁡ ( W x ′ ) = N o r m ⁡ ( W x ) Norm ⁡ ( W x ′ ) = Norm ⁡ ( W x ) N o r m ( W x ′ ) = N o r m ( W x ) Norm⁡(Wx′)=Norm⁡(Wx)\operatorname{Norm}\left(\mathbf{W} \mathbf{x}^{\prime}\right)=\operatorname{Norm}(\mathbf{W} \mathbf{x})Norm(Wx′)=Norm(Wx) Norm⁡(Wx′)=Norm⁡(Wx)Norm(Wx′)=Norm(Wx)Norm(Wx′)=Norm(Wx)

    其中 x ′ = λ x x ′ = λ x x ′ = λ x x′=λx\mathbf{x}^{\prime} = \mathbf{\lambda} \mathbf{x}x′=λx x′=λxx′=λxx′=λx。

    資料伸縮不變性僅對 BN、LN 和 IN和GN成立。因為這四者對輸入資料進行規範化,是以當資料進行常量伸縮時,其均值和方差都會相應變化,分子分母互相抵消。而 WN 不具有這一性質。

    資料伸縮不變性可以有效地減少梯度彌散,簡化對學習率的選擇。

    對于某一層神經元 h l = f W l ( x l ) h l = f W l ( x l ) h l ​ = f W l ​ ​ ( x l ​ ) hl=fWl(xl)h_{l}=f_{\mathbf{W}_{l}}\left(\mathbf{x}_{l}\right)hl​=fWl​​(xl​) hl=fWl(xl)hl​=fWl​​(xl​)hl​=fWl​​(xl​)而言,展開可得:

    h l = f W l ( x l ) = f W l ( f W l − 1 ( x l − 1 ) ) = ⋯ = x 0 ∏ k = 0 l W k h l = f W l ( x l ) = f W l ( f W l − 1 ( x l − 1 ) ) = ⋯ = x 0 ∏ k = 0 l W k h l ​ = f W l ​ ​ ( x l ​ ) = f W l ​ ​ ( f W l − 1 ​ ​ ( x l − 1 ​ ) ) = ⋯ = x 0 ​ k = 0 ∏ l ​ W k ​ hl=fWl(xl)=fWl(fWl−1(xl−1))=⋯=x0∏k=0lWkh_{l}=f_{\mathbf{W}_{l}}\left(\mathbf{x}_{l}\right)=f_{\mathbf{W}_{l}}\left(f_{\mathbf{W}_{l-1}}\left(\mathbf{x}_{l-1}\right)\right)=\cdots=\mathbf{x}_{0} \prod_{k=0}^{l} \mathbf{W}_{k}hl​=fWl​​(xl​)=fWl​​(fWl−1​​(xl−1​))=⋯=x0​k=0∏l​Wk​ hl=fWl(xl)=fWl(fWl−1(xl−1))=⋯=x0∏k=0lWkhl​=fWl​​(xl​)=fWl​​(fWl−1​​(xl−1​))=⋯=x0​k=0∏l​Wk​hl​=fWl​​(xl​)=fWl​​(fWl−1​​(xl−1​))=⋯=x0​k=0∏l​Wk​

    每一層神經元的輸出依賴于底下各層的計算結果。如果沒有正則化,當下層輸入發生伸縮變化時,經過層層傳遞,可能會導緻資料發生劇烈的膨脹或者彌散,進而也導緻了反向計算時的梯度爆炸或梯度彌散。

    加入 Normalization 之後,不論底層的資料如何變化,對于某一層神經元 h l = f W l ( x l ) h l = f W l ( x l ) h l ​ = f W l ​ ​ ( x l ​ ) hl=fWl(xl)h_{l}=f_{\mathbf{W}_{l}}\left(\mathbf{x}_{l}\right)hl​=fWl​​(xl​) hl=fWl(xl)hl​=fWl​​(xl​)hl​=fWl​​(xl​)而言,其輸入 x l x l x l ​ xl\mathbf{x}_{l}xl​ xlxl​xl​永遠保持标準的分布,這就使得高層的訓練更加簡單。從梯度的計算公式來看:

    ∂ N o r m ( W x ′ ) ∂ W = ∂ N o r m ( W x ) ∂ W ∂ N o r m ( W x ′ ) ∂ W = ∂ N o r m ( W x ) ∂ W ∂ W ∂ N o r m ( W x ′ ) ​ = ∂ W ∂ N o r m ( W x ) ​ ∂Norm(Wx′)∂W=∂Norm(Wx)∂W\frac{\partial N o r m\left(\mathbf{W} \mathbf{x}^{\prime}\right)}{\partial \mathbf{W}}=\frac{\partial N o r m(\mathbf{W} \mathbf{x})}{\partial \mathbf{W}}∂W∂Norm(Wx′)​=∂W∂Norm(Wx)​ ∂Norm(Wx′)∂W=∂Norm(Wx)∂W∂W∂Norm(Wx′)​=∂W∂Norm(Wx)​∂W∂Norm(Wx′)​=∂W∂Norm(Wx)​

    資料的伸縮變化也不會影響到對該層的權重參數更新,使得訓練過程更加魯棒,簡化了對學習率的選擇。

References

  • https://www.cnblogs.com/guoyaohua/p/8724433.html
  • https://zhuanlan.zhihu.com/p/33173246
  • https://zhuanlan.zhihu.com/p/24810318
  • https://zhuanlan.zhihu.com/p/69659844
  • https://www.cnblogs.com/hellcat/p/9735041.html
  • https://zhuanlan.zhihu.com/p/52749286
  • https://blog.csdn.net/hjimce/article/details/50866313
  • https://blog.csdn.net/leviopku/article/details/83109422
  • https://blog.csdn.net/leviopku/article/details/83182194
  • https://blog.csdn.net/leviopku/article/details/83213123?utm_source=app
  • https://blog.csdn.net/qq_24153697/article/details/79880202
  • https://blog.csdn.net/malefactor/article/details/82154224
  • https://blog.csdn.net/siyue0211/article/details/82670452
</div>
            <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-095d4a0b23.css" target="_blank" rel="external nofollow"  rel="stylesheet">
                </div>
           
dl