BN、LN、IN、GN

常用的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做歸一化,用在風格化遷移;
  4. GN將channel分組,然後再做歸一化。

            

 每個子圖表示一個特徵圖,其中N爲批量,C爲通道,(H,W)爲特徵圖的高度和寬度。 通過藍色部分的值來計算均值和方差,從而進行歸一化,即爲藍色像素代表相同的均值和方差歸一化。

如果把特徵圖x \in \mathbb{R}^{N \times C \times H \times 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 

(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的使用位置:全連接層或卷積操作之後,激活函數之前。

BN算法過程:

  • 沿着通道計算每個batch的均值\mu
  • 沿着通道計算每個batch的方差\sigma ^2
  • 做歸一化
  • 加入縮放和平移變量和\gamma\beta

                                                                                  \begin{aligned} \mu &=\frac{1}{m} \sum_{i=1}^{m} z^{(i)} \\ \sigma^{2} &=\frac{1}{m} \sum_{i=1}^{m}\left(z^{(i)}-\mu\right)^{2} \\ z_{\text {Norm }}^{(i)} &=\frac{z^{(t)}-\mu}{\sqrt{\sigma^{2}+\varepsilon}} \\ \tilde{z}^{(i)} &=\gamma_{\text {Norn }}^{(i)}+\beta \end{aligned}

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

BN的作用:

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

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

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

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

BN存在的問題:

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

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

二、 Layer Normalization, LN

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

                                                               \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}}

 

LN中同層神經元的輸入擁有相同的均值和方差,不同的輸入樣本有不同的均值和方差。

對於特徵圖x \in \mathbb{R}^{N \times C \times H \times W},LN 對每個樣本的 C、H、W 維度上的數據求均值和標準差,保留 N 維度。其均值和標準差公式爲:

                                                                     \mu_{n}(x)=\frac{1}{C H W} \sum_{c=1}^{C} \sum_{h=1}^{H} \sum_{w=1}^{W} x_{n c h w}

                                                   \sigma_{n}(x)=\sqrt{\frac{1}{C H W} \sum_{c=1}^{C} \sum_{h=1}^{H} \sum_{w=1}^{W}\left(x_{n c h w}-\mu_{n}(x)\right)^{2}+\epsilon}

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

三、 Instance Normalization, IN

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

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

                  

最終對於每一個樣本,得到C個均值和方差,一共batch_size個樣本。

四、 Group Normalization, GN

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

GN的主要思想:在 channel 方向 group,然後每個 group 內做 Norm,計算(C / G) * H * W的均值和方差,這樣就與batch size無關,不受其約束。

具體方法:GN 計算均值和標準差時,把每一個樣本 feature map 的 channel 分成 G 組,每組將有 C/G 個 channel,然後將這些 channel 中的元素求均值和標準差。各組 channel 用其對應的歸一化參數獨立地歸一化。

                                                         \mu_{n g}(x)=\frac{1}{(C / G) H W} \sum_{c=g C / G}^{(g+1) C / G} \sum_{h=1}^{H} \sum_{w=1}^{W} x_{n c h w}

                                      \sigma_{n g}(x)=\sqrt{\frac{1}{(C / G) H W} \sum_{c=g C / G}^{(g+1) C / G} \sum_{h=1}^{H} \sum_{w=1}^{W}\left(x_{n c h w}-\mu_{n g}(x)\right)^{2}+\epsilon} 

代碼如下:

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

如果我們將組號設置爲G = 1,則GN變爲LN 。LN假設層中的所有通道都做出“類似的貢獻”。GN比LN受限制更少,因爲假設每組通道(而不是所有通道)都受共享均值和方差的影響; 該模型仍然具有爲每個羣體學習不同分佈的靈活性。這導致GN相對於LN的代表能力提高。

如果我們將組號設置爲G = C(即每組一個通道),則GN變爲IN。 但是IN只能依靠空間維度來計算均值和方差,並且錯過了利用信道依賴的機會

總結

需要注意它們的映射參和\beta的區別:對於 BN,IN,GN, 其\gamma\beta都是維度等於通道數 C 的向量(因爲其均值和方差都是矩陣)。而對於 LN,其\gamma\beta都是維度等於 normalized_shape 的矩陣(因爲其均值和方差都是向量)

最後,BN 和 IN 可以設置參數:momentumtrack_running_stats來獲得在整體數據上更準確的均值和標準差LN 和 GN 只能計算當前 batch 內數據的真實均值和標準差。

  • BatchNorm:batch方向做歸一化,計算N*H*W的均值
  • LayerNorm:channel方向做歸一化,計算C*H*W的均值
  • InstanceNorm:一個channel內做歸一化,計算H*W的均值
  • GroupNorm:先將channel方向分group,然後每個group內做歸一化,計算(C//G)*H*W的均值
  • GN與LN和IN有關,這兩種標準化方法在訓練循環(RNN / LSTM)或生成(GAN)模型方面特別成功。

、 補充

BN全名是Batch Normalization,見名知意,其是一種歸一化方式,而且是以batch的維度做歸一化,那麼問題就來了,此歸一化方式對batch是independent的,過小的batch size會導致其性能下降,一般來說每GPU上batch設爲32最合適,但是對於一些其他深度學習任務batch size往往只有1-2,比如目標檢測,圖像分割,視頻分類上,輸入的圖像數據很大,較大的batchsize顯存喫不消。那麼,對於較小的batch size,其performance是什麼樣的呢?如下圖:

                        

橫軸表示每個GPU上的batch size大小,從左到右一次遞減,縱軸是誤差率,可見,在batch較小的時候,GN較BN有少於10%的誤差率。

另外,Batch Normalization是在batch這個維度上Normalization,但是這個維度並不是固定不變的,比如訓練和測試時一般不一樣,一般都是訓練的時候在訓練集上通過滑動平均預先計算好平均-mean,和方差-variance參數,在測試的時候,不在計算這些值,而是直接調用這些預計算好的來用,但是,當訓練數據和測試數據分佈有差別是時,訓練機上預計算好的數據並不能代表測試數據,這就導致在訓練,驗證,測試這三個階段存在inconsistency。

既然明確了問題,解決起來就簡單了,歸一化的時候避開batch這個維度是不是可行呢,於是就出現了layer normalization和instance normalization等工作,但是仍比不上本篇介紹的工作GN。

  • BN在batch的維度上norm,歸一化維度爲[N,H,W],對batch中對應的channel歸一化;
  • LN避開了batch維度,歸一化的維度爲[C,H,W];
  • IN 歸一化的維度爲[H,W];
  • 而GN介於LN和IN之間,其首先將channel分爲許多組(group),對每一組做歸一化,及先將feature的維度由[N, C, H, W]reshape爲[N, G,C//G , H, W],歸一化的維度爲[C//G , H, W]

事實上,GN的極端情況就是LN和I N,分別對應G等於C和G等於1,作者在論文中給出G設爲32較好。

那麼GN爲什麼可以work呢?

傳統角度來講,在深度學習沒有火起來之前,提取特徵通常是使用SIFT,HOG和GIST特徵,這些特徵有一個共性,都具有按group表示的特性,每一個group由相同種類直方圖的構建而成,這些特徵通常是對在每個直方圖(histogram)或每個方向(orientation)上進行組歸一化(group-wise norm)而得到。而更高維的特徵比如VLAD和Fisher Vectors(FV)也可以看作是group-wise feature,此處的group可以被認爲是每個聚類(cluster)下的子向量sub-vector。

從深度學習上來講,完全可以認爲卷積提取的特徵是一種非結構化的特徵或者向量,拿網絡的第一層卷積爲例,卷積層中的的卷積核filter1和此卷積核的其他經過transform過的版本filter2(transform可以是horizontal flipping等),在同一張圖像上學習到的特徵應該是具有相同的分佈,那麼,具有相同的特徵可以被分到同一個group中,按照個人理解,每一層有很多的卷積核,這些核學習到的特徵並不完全是獨立的,某些特徵具有相同的分佈,因此可以被group。

導致分組(group)的因素有很多,比如頻率、形狀、亮度和紋理等,HOG特徵根據orientation分組,而對神經網絡來講,其提取特徵的機制更加複雜,也更加難以描述,變得不那麼直觀。另在神經科學領域,一種被廣泛接受的計算模型是對cell的響應做歸一化,此現象存在於淺層視覺皮層和整個視覺系統。

作者基於此,提出了組歸一化(Group Normalization)的方式,且效果表明,顯著優於BN、LN、IN等。

GN的歸一化方式避開了batch size對模型的影響,特徵的group歸一化同樣可以解決$Internal$ $Covariate$ $Shift$的問題,並取得較好的效果。

GN具體的效果如下:

                    

以resnet50爲base model,batchsize設置爲32在imagenet數據集上的訓練誤差(左)和測試誤差(右)

GN沒有表現出很大的優勢,在測試誤差上稍大於使用BN的結果。

                      

 可以很容易的看出,GN對batch size的魯棒性更強

同時,作者以VGG16爲例,分析了某一層卷積後的特徵分佈學習情況,分別根據不使用Norm 和使用BN,GN做了實驗,實驗結果如下:

                        

統一batch size設置的是32,最左圖是不使用norm的conv5的特徵學習情況,中間是使用了BN結果,最右是使用了GN的學習情況,相比較不使用norm,使用norm的學習效果顯著,而後兩者學習情況相似,不過更改小的batch size後,BN是比不上GN的。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章