【深度學(xué)習(xí)】Batch Normalization(BN)超詳細解析
單層視角
神經(jīng)網(wǎng)絡(luò)可以看成是上圖形式,對于中間的某一層,其前面的層可以看成是對輸入的處理,后面的層可以看成是損失函數(shù)。一次反向傳播過程會同時更新所有層的權(quán)重W1,W2,…,WL,前面層權(quán)重的更新會改變當前層輸入的分布,而跟據(jù)反向傳播的計算方式,我們知道,對Wk的更新是在假定其輸入不變的情況下進行的。如果假定第k層的輸入節(jié)點只有2個,對第k層的某個輸出節(jié)點而言,相當于一個線性模型y=w1x1+w2x2+b,如下圖所示,
假定當前輸入x1和x2的分布如圖中圓點所示,本次更新的方向是將直線H1更新成H2,本以為切分得不錯,但是當前面層的權(quán)重更新完畢,當前層輸入的分布換成了另外一番樣子,直線相對輸入分布的位置可能變成了H3,下一次更新又要根據(jù)新的分布重新調(diào)整。直線調(diào)整了位置,輸入分布又在發(fā)生變化,直線再調(diào)整位置,就像是直線和分布之間的“追逐游戲”。對于淺層模型,比如SVM,輸入特征的分布是固定的,即使拆分成不同的batch,每個batch的統(tǒng)計特性也是相近的,因此只需調(diào)整直線位置來適應(yīng)輸入分布,顯然要容易得多。而深層模型,每層輸入的分布和權(quán)重在同時變化,訓(xùn)練相對困難。
多層視角
上面是從網(wǎng)絡(luò)中單拿出一層分析,下面看一下多層的情況。在反向傳播過程中,每層權(quán)重的更新是在假定其他權(quán)重不變的情況下,向損失函數(shù)降低的方向調(diào)整自己。問題在于,在一次反向傳播過程中,所有的權(quán)重會同時更新,導(dǎo)致層間配合“缺乏默契”,每層都在進行上節(jié)所說的“追逐游戲”,而且層數(shù)越多,相互配合越困難,文中把這個現(xiàn)象稱之為 Internal Covariate Shift,示意圖如下。為了避免過于震蕩,學(xué)習(xí)率不得不設(shè)置得足夠小,足夠小就意味著學(xué)習(xí)緩慢。
為此,希望對每層輸入的分布有所控制,于是就有了Batch Normalization,其出發(fā)點是對每層的輸入做Normalization,只有一個數(shù)據(jù)是談不上Normalization的,所以是對一個batch的數(shù)據(jù)進行Normalization。
Batch Normalization原理
Batch Normalization,簡稱BatchNorm或BN,翻譯為“批歸一化”,是神經(jīng)網(wǎng)絡(luò)中一種特殊的層,如今已是各種流行網(wǎng)絡(luò)的標配。在原paper中,BN被建議插入在(每個)ReLU激活層前面,如下所示,
如果batch size為m,則在前向傳播過程中,網(wǎng)絡(luò)中每個節(jié)點都有m個輸出,所謂的Batch Normalization,就是對該層每個節(jié)點的這m個輸出進行歸一化再輸出.
我們在圖像預(yù)處理過程中通常會對圖像進行標準化處理,這樣能夠加速網(wǎng)絡(luò)的收斂,如下圖所示,對于Conv1來說輸入的就是滿足某一分布的特征矩陣,但對于Conv2而言輸入的feature map就不一定滿足某一分布規(guī)律了**(注意這里所說滿足某一分布規(guī)律并不是指某一個feature map的數(shù)據(jù)要滿足分布規(guī)律,理論上是指整個訓(xùn)練樣本集所對應(yīng)feature map的數(shù)據(jù)要滿足分布規(guī)律)**。而我們Batch Normalization的目的就是使我們的feature map滿足均值為0,方差為1的分布規(guī)律。
下面是從原論文中截取的原話,注意標黃的部分:
“對于一個擁有d維的輸入x,我們將對它的每一個維度進行標準化處理。” ?假設(shè)我們輸入的x是RGB三通道的彩色圖像,那么這里的d就是輸入圖像的channels即d=3,,其中就代表我們的R通道所對應(yīng)的特征矩陣,依此類推。標準化處理也就是分別對我們的R通道,G通道,B通道進行處理。上面的公式不用看,原文提供了更加詳細的計算公式:
其操作可以分成2步,
Standardization:首先對m個x進行 Standardization,得到 zero mean unit variance的分布x^。 scale and shift:然后再對x^進行scale and shift,縮放并平移到新的分布y,具有新的均值β方差γ。
假設(shè)BN層有d個輸入節(jié)點,則x可構(gòu)成d×m大小的矩陣X,BN層相當于通過行操作將其映射為另一個d×m大小的矩陣Y,如下所示,
將2個過程寫在一個公式里如下
其中,x(b)i表示輸入當前batch的b-th樣本時該層i-th輸入節(jié)點的值,xi為[x(1)i,x(2)i,…,x(m)i]構(gòu)成的行向量,長度為batch size m,μ和σ為該行的均值和標準差,?為防止除零引入的極小量(可忽略),γ和β為該行的scale和shift參數(shù),可知
μ和σ為當前行的統(tǒng)計量,不可學(xué)習(xí)。 γ和β為待學(xué)習(xí)的scale和shift參數(shù),用于控制yi的方差和均值 BN層中,xi和xj之間不存在信息交流(i≠j)
可見,無論xi原本的均值和方差是多少,通過BatchNorm后其均值和方差分別變?yōu)榇龑W(xué)習(xí)的β和γ。
Batch Normalization的反向傳播
對于目前的神經(jīng)網(wǎng)絡(luò)計算框架,一個層要想加入到網(wǎng)絡(luò)中,要保證其是可微的,即可以求梯度。BatchNorm的梯度該如何求取?
反向傳播求梯度只需抓住一個關(guān)鍵點,如果一個變量對另一個變量有影響,那么他們之間就存在偏導(dǎo)數(shù),找到直接相關(guān)的變量,再配合鏈式法則,公式就很容易寫出了。
根據(jù)反向傳播的順序,首先求取損失?對BN層輸出yi的偏導(dǎo)?? / ?yi,然后是對可學(xué)習(xí)參數(shù)的偏導(dǎo)?? / ?γ和?? / ?β,用于對參數(shù)進行更新,想繼續(xù)回傳的話還需要求對輸入 x偏導(dǎo),于是引出對變量μ、σ2和x^的偏導(dǎo),根據(jù)鏈式法則再求這些變量對x的偏導(dǎo)。
Batch Normalization的預(yù)測階段
在預(yù)測階段,所有參數(shù)的取值是固定的,對BN層而言,意味著μ、σ、γ、β都是固定值。
γ和β比較好理解,隨著訓(xùn)練結(jié)束,兩者最終收斂,預(yù)測階段使用訓(xùn)練結(jié)束時的值即可。
對于μ和σ,在訓(xùn)練階段,它們?yōu)楫斍癿ini batch的統(tǒng)計量,隨著輸入batch的不同,μ和σ一直在變化。在預(yù)測階段,輸入數(shù)據(jù)可能只有1條,該使用哪個μ和σ,或者說,每個BN層的μ和σ該如何取值?可以采用訓(xùn)練收斂最后幾批mini batch的 μ和σ的期望,作為預(yù)測階段的μ和σ,如下所示,
因為Standardization和scale and shift均為線性變換,在預(yù)測階段所有參數(shù)均固定的情況下,參數(shù)可以合并成y=kx+b的形式,如上圖中行號11所示。
Batch Normalization的作用
使用Batch Normalization,可以獲得如下好處,
可以使用更大的學(xué)習(xí)率,訓(xùn)練過程更加穩(wěn)定,極大提高了訓(xùn)練速度。 可以將bias置為0,因為Batch Normalization的Standardization過程會移除直流分量,所以不再需要bias。 對權(quán)重初始化不再敏感,通常權(quán)重采樣自0均值某方差的高斯分布,以往對高斯分布的方差設(shè)置十分重要,有了Batch Normalization后,對與同一個輸出節(jié)點相連的權(quán)重進行放縮,其標準差σ也會放縮同樣的倍數(shù),相除抵消。 對權(quán)重的尺度不再敏感,理由同上,尺度統(tǒng)一由γ參數(shù)控制,在訓(xùn)練中決定。 深層網(wǎng)絡(luò)可以使用sigmoid和tanh了,理由同上,BN抑制了梯度消失。 Batch Normalization具有某種正則作用,不需要太依賴dropout,減少過擬合。
幾個常見問題
卷積層如何使用BatchNorm?
For convolutional layers, we additionally want the normalization to obey the convolutional property – so that different elements of the same feature map, at different locations, are normalized in the same way. To achieve this, we jointly normalize all the activations in a mini-batch, over all locations.
...
so for a mini-batch of size m and feature maps of size p × q, we use the effective mini-batch of size m′
= |B| = m · pq. We learn a pair of parameters γ(k) and β(k) per feature map, rather than per activation.
—— Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
1個卷積核產(chǎn)生1個feature map,1個feature map有1對γ和β參數(shù),同一batch同channel的feature map共享同一對γ和β參數(shù),若卷積層有n個卷積核,則有n對γ和β參數(shù)。
沒有scale and shift過程可不可以?BatchNorm有兩個過程,Standardization和scale and shift,前者是機器學(xué)習(xí)常用的數(shù)據(jù)預(yù)處理技術(shù),在淺層模型中,只需對數(shù)據(jù)進行Standardization即可,Batch Normalization可不可以只有Standardization呢?
答案是可以,但網(wǎng)絡(luò)的表達能力會下降。
直覺上理解,淺層模型中,只需要模型適應(yīng)數(shù)據(jù)分布即可。對深度神經(jīng)網(wǎng)絡(luò),每層的輸入分布和權(quán)重要相互協(xié)調(diào),強制把分布限制在zero mean unit variance并不見得是最好的選擇,加入?yún)?shù)γ和β,對輸入進行scale and shift,有利于分布與權(quán)重的相互協(xié)調(diào),特別地,令γ=1,β=0等價于只用Standardization,令γ=σ,β=μ等價于沒有BN層,scale and shift涵蓋了這2種特殊情況,在訓(xùn)練過程中決定什么樣的分布是適合的,所以使用scale and shift增強了網(wǎng)絡(luò)的表達能力。
表達能力更強,在實踐中性能就會更好嗎?并不見得,就像曾經(jīng)參數(shù)越多不見得性能越好一樣。在caffenet-benchmark-batchnorm中,作者實驗發(fā)現(xiàn)沒有scale and shift性能可能還更好一些。
BN層放在ReLU前面還是后面?原paper建議將BN層放置在ReLU前,因為ReLU激活函數(shù)的輸出非負,不能近似為高斯分布。
The goal of Batch Normalization is to achieve a stable distribution of activation values throughout training, and in our experiments we apply it before the nonlinearity since that is where matching the first and second moments is more likely to result in a stable distribution.
—— Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
但是,在caffenet-benchmark-batchnorm中,作者基于caffenet在ImageNet2012上做了如下對比實驗,
實驗表明,放在前后的差異似乎不大,甚至放在ReLU后還好一些。
放在ReLU后相當于直接對每層的輸入進行歸一化,如下圖所示,這與淺層模型的Standardization是一致的。
caffenet-benchmark-batchnorm中,還有BN層與不同激活函數(shù)、不同初始化方法、dropout等排列組合的對比實驗,可以看看。
所以,BN究竟應(yīng)該放在激活的前面還是后面?以及,BN與其他變量,如激活函數(shù)、初始化方法、dropout等,如何組合才是最優(yōu)?可能只有直覺和經(jīng)驗性的指導(dǎo)意見,具體問題的具體答案可能還是得實驗說了算(微笑)。
BN層為什么有效?
BN層的有效性已有目共睹,但為什么有效可能還需要進一步研究,這里有一些解釋,
BN層讓損失函數(shù)更平滑。論文How Does Batch Normalization Help Optimization中,通過分析訓(xùn)練過程中每步梯度方向上步長變化引起的損失變化范圍、梯度幅值的變化范圍、光滑度的變化,認為添加BN層后,損失函數(shù)的landscape(losssurface)變得更平滑,相比高低不平上下起伏的loss surface,平滑losssurface的梯度預(yù)測性更好,可以選取較大的步長。如下圖所示, 
BN更有利于梯度下降。論文An empirical analysis of the optimization of deep network loss surfaces中,繪制了VGG和NIN網(wǎng)絡(luò)在有無BN層的情況下,loss surface的差異,包含初始點位置以及不同優(yōu)化算法最終收斂到的local minima位置,如下圖所示。沒有BN層的,其loss surface存在較大的高原,有BN層的則沒有高原,而是山峰,因此更容易下降。 
這里再提供一個直覺上的理解,沒有BN層的情況下,網(wǎng)絡(luò)沒辦法直接控制每層輸入的分布,其分布前面層的權(quán)重共同決定,或者說分布的均值和方差“隱藏”在前面層的每個權(quán)重中,網(wǎng)絡(luò)若想調(diào)整其分布,需要通過復(fù)雜的反向傳播過程調(diào)整前面的每個權(quán)重實現(xiàn),BN層的存在相當于將分布的均值和方差從權(quán)重中剝離了出來,只需調(diào)整γ和β兩個參數(shù)就可以直接調(diào)整分布,讓分布和權(quán)重的配合變得更加容易。
這里多說一句,論文How Does Batch Normalization Help Optimization中對比了標準VGG以及加了BN層的VGG每層分布隨訓(xùn)練過程的變化,發(fā)現(xiàn)兩者并無明顯差異,認為BatchNorm并沒有改善 Internal Covariate Shift。
往期精彩回顧
獲取一折本站知識星球優(yōu)惠券,復(fù)制鏈接直接打開:
https://t.zsxq.com/662nyZF
本站qq群1003271085。
加入微信群請掃碼進群(如果是博士或者準備讀博士請說明):
