Normalization in Pytorch

吳政龍
9 min readJun 23, 2019

--

這篇介紹Pytorch內建的Normalization的東西。內容有Batch Normalization, Layer Normalization, Instance Normalization以及另外兩個沒有寫在nn.Layer 裏頭的 Weight Normalization和Spectral Normalization。在寫這篇的時候有發現到之前pytorch Taoyuan meetup 06 沒注意到的部分,這篇也一並補上.

Batch Normalization

論文連結:

以下為筆者個人的解釋,並非原文翻譯,各位大德姑枉聽之。

由於一般訓練數據並不是像是給定的數學方程式那樣,會乖乖地照著一個路徑收斂。(如圖一)

圖一

更多時候是第一個訓練樣本落在A點,往某個local minimal a收斂,而第二個樣本落在差很遠的B點,又往另一個local minimal b收斂,這種在訓練上互相干擾的現象,這個現象在論文中定義成internal covariate shift.如果初始權重和學習速率沒有細心設定的話,會導致模型很容易飽和(簡單來說就是不管輸入是什麼,輸出都沒什麼變化)。

附上原文,以免讀者被我的解釋誤導:

Training Deep Neural Networks is complicated by the fact that the distribution of each layer’s inputs changes during training, as the parameters of the previous layers change. This slows down the training by requiring lower learning rates and careful parameter initialization, and makes it notoriously hard to train models with saturating nonlinearities. We refer to this phenomenon as internal covariate shift, and address the problem by normalizing layer inputs.

為了緩解上述的問題,該論文的作者提出了batch normalization的方法,目的是讓一批量的訓練樣本能夠彼此之間更能夠落在接近的local minimal上頭,以加快收斂速度以及避免飽和。

來講一下它的數學推導:

由於batch normalization也有需要學習的參數,所以它也有所謂forward和backward propagation:

Forward of Batch Normalization

輸入是一個批次B,B裡頭包含m個數據,這些數據可以是純量也可以是向量.首先我們會先計算這個批次數據的平均𝛍,接著計算這個批次數據的母體標準差𝛔,然後計算出normalized x(有^符號的x),接著把normalized x乘上scale參數𝛄以及加上shift參數𝛃(這兩個參數是BN的反向傳遞所更新的參數),就是BN的輸出y,如圖二所示.

圖二

Backward of Batch Normalization

在這篇論文裡頭有提到,BN的參數訓練是使用gradient based method,BN的反向傳遞如圖三,分別是Loss對BN的每個分項的偏微分:

圖三

和一般神經網路的訓練有所不同,一般的網路是每處理過一個樣本就更新一次,但BN的輸入樣本並不是各自獨立的,而是一個批次的樣本的平均和母體標準差的組合,所以在做反向傳播時,必須額外儲存每個批次的資料.

Inference of Batch Normalization

在訓練階段,使用批次資料可以讓訓練變得有效率,但在推論階段時,我們不希望輸出還得根據批次化才能有結果(這樣的話,訓練/驗證/測試資料集的batch size就得一樣了,很沒彈性),我們希望輸出只和輸入相依,所以在推論階段,論文把𝛄和𝛃的值維持不變,利用移動平均的概念來計算normalized output:

假設驗證/測試資料集的batch size為m,有多個批次(batches),我們把E[x]替換成多個批次的平均值(移動平均,會隨著輸入的批次和歷史資料做權重平均),Var[x]也從母體標準差替換成樣本標準差的計算方式,計算各個批次的母體標準差的樣本標準差的平均,把output y計算出來,如圖四.

圖四

以上就是BN的運作過程

Batch Normalization的限制

主要有兩個:

  1. batch size不能太小,太小基本上就沒什麼效果
  2. 沒有明確的方法用在RNN上(論文作者當時還沒測試)

Layer Normalization

論文連結

其實數學方法和Batch Normalization一樣,只是它的樣本從一個批次的數據變成一整層的神經元輸出數據,比方某一層有6個神經元,每個神經元的輸出是長寬28*28的圖,那要取平均和標準差的量就是6*28*28.這篇論文的作者指出Layer Normalization用在RNN上面有很好的效果,如圖五.

圖五

由於數學方法是和BN一樣,所以就不多介紹了.

Instance Normalization

論文連結

這篇主要是論文作者提出BN在做快速風格化上並不適用,因此自己提出了一個專門針對快速風格化的Normalization方法.

數學方法和BN一樣,這次取的樣本只針對單一張圖片做Normalization.

圖六是論文中的範例圖片和風格圖片.

圖六

圖七則是使用batch normalization和 Instance normalization 的差異,上面兩張是BN的效果,下面兩張是IN的效果.

圖七

Group Normalization

論文連結

這篇提出分群的概念,主要是從傳統影像辨識的靈感而來,比如某些filter專門分辨某些特徵這樣.也算是把前三個Normalization做一個統整.

其方法是把輸入的channel分成多個group,(可以想成batch size=1的操作,並且把layer normalization的計算分割成數個這樣),各group之間做各自的Normalization,和BN的數學方法一樣.其數學方法如圖八.圖九和圖十則是解釋group normalization和其他normalization的互換關係.

圖八
圖九
圖十
圖十一

圖十(BN,LN,IN)和圖十一(GN)在解釋各種normalization在向量空間上的設定,比如說:kc=ic代表vector c上面的向量數目和channel 的數目一樣.在數學上的設定則可以想成每次只處理一個channel而已(或者想成只有一個channel需要處理也行).

圖十二

圖十二則是圖十和圖十一的視覺化呈現.

圖十三

圖十三則是以不同的batch size來執行,可以發現BN如果batch size過小,會有誤差增加的現象.

圖十四

圖十四則是feature distribution的分佈圖,none normalization, BN,GN最後的錯誤率差不多,但是feature收斂程度是差很多的,在使用Normalization的狀況下,可以把整個網路的值分布集中.

Weight Normalization

論文連結

這篇論文並非把輸出normalized,而是把權重 normalized,所以它無法變成一個layer來使用,其用意是要處理BN不好處理的狀況,比如說batch size過小或是RNN,因為其計算和batch size無關.其數學方法如下:

圖十五

g是一個純量

v是一個k維的向量

這種處理方法可以讓w權重的大小維持在g這個純量的大小.

其反向傳播更新的是g以及v,如圖十六所示.

圖十六

論文作者的說法是這樣可以修正權重的歐幾里德法線方向,以加速權重的收斂.

Spectral Normalization

論文連結

是為了處理GAN而特別設計的Normalization方法,也是專門針對權重做normalization,而不是輸出.

由於我對GAN不熟,所以這篇我看不太懂,因此等我把GAN摸熟的時候,再把這部分補上~

以上是針對Pytorch Taoyuan 6th meetup: Normalization的重點以及補充,如有錯誤,還請各位大德指正,感謝!

--

--