文章轉(zhuǎn)載自多個博主,再次表示感謝,學(xué)習(xí)用途,侵刪
論文:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
normalization
1.數(shù)值問題。
? ? 輸入變量的數(shù)量級不一致可能會引起數(shù)值問題。因?yàn)閠ansig的非線性區(qū)間大約在[-1.7,1.7]。意味著要使神經(jīng)元有效,tansig( w1*x1 + w2*x2 +b) 里的 w1*x1 +w2*x2 +b 數(shù)量級應(yīng)該在 1 (1.7所在的數(shù)量級)左右。這時輸入較大,就意味著權(quán)值必須較小,一個較大,一個較小,兩者相乘,就引起數(shù)值問題了。
2.求解需要
? ? 在訓(xùn)練前我們將數(shù)據(jù)歸一化是為了更方便的求解。
????那么,究竟給求解帶來了什么方便呢?
????這個問題不能一概而論,不同的算法,在歸一化中得到的好處各不相同。目前大部算法,都比較需要?dú)w一化,特別是常用的梯度下降法(或梯度下降的衍生方法),歸一化和不歸一化,對梯度下降法的影響非常大。不同的算法,對歸一化的依賴程序不同。
? ? ?? 以梯度下降法舉例。梯度法一般初始化一個初始解,然后求梯度,再用新解=舊解-梯度*學(xué)習(xí)率 的方式來迭代更新解。直到滿足終止迭代條件,退出循環(huán)。
(1)初始化
?????過初始化的同學(xué)會發(fā)現(xiàn),輸入數(shù)據(jù)的范圍會影響我們初始化的效果。例如,某個神經(jīng)元的值為tansig(w1*x1+w2*x2+b),由于tansig函數(shù)只有在[-1.7,1.7]的范圍才有較好的非線性,所以w1*x1+w2*x2+b的取值范圍就要與 [-1.7,1.7]有交集(實(shí)際上需要更細(xì)膩的條件),這個神經(jīng)元才能利用到非線性部分。我們希望初始化的時候,就把每個神經(jīng)元初始化成有效的狀態(tài),所以,需要知道w1*x1+w2*x2+b的取值范圍,也就需要知道輸入輸出數(shù)據(jù)的范圍。輸入數(shù)據(jù)的范圍對初始化的影響是無法避免的,一般討論初始化方法時,我們都假設(shè)它的范圍就是[0,1]或者[-1,1],這樣討論起來會方便很多。就這樣,若果數(shù)據(jù)已經(jīng)歸一化的話,能給初始化模塊帶來更簡便,清晰的處理思路。(2)梯度
????以輸入-隱層-輸出這樣的三層BP為例,我們知道對于輸入-隱層權(quán)值的梯度有2e*w*(1-a^2)*x的形式(e是誤差,w是隱層到輸出層的權(quán)重,a是隱層神經(jīng)元的值,x是輸入),若果輸出層的數(shù)量級很大,會引起e的數(shù)量級很大,同理,w為了將隱層(數(shù)量級為1)映身到輸出層,w也會很大,再加上x也很大的話,從梯度公式可以看出,三者相乘,梯度就非常大了。這時會給梯度的更新帶來數(shù)值問題。(3)學(xué)習(xí)率
????由(2)中,知道梯度非常大,學(xué)習(xí)率就必須非常小,因此,學(xué)習(xí)率(學(xué)習(xí)率初始值)的選擇需要參考輸入的范圍,不如直接將數(shù)據(jù)歸一化,這樣學(xué)習(xí)率就不必再根據(jù)數(shù)據(jù)范圍作調(diào)整。
????隱層到輸出層的權(quán)值梯度可以寫成 2e*a,而輸入層到隱層的權(quán)值梯度為?2e *w*(1-a^2)*x ,受 x 和 w 的影響,各個梯度的數(shù)量級不相同,因此,它們需要的學(xué)習(xí)率數(shù)量級也就不相同。對w1適合的學(xué)習(xí)率,可能相對于w2來說會太小,若果使用適合w1的學(xué)習(xí)率,會導(dǎo)致在w2方向上步進(jìn)非常慢,會消耗非常多的時間,而使用適合w2的學(xué)習(xí)率,對w1來說又太大,搜索不到適合w1的解。(4)搜索軌跡
????前面已說過,輸入范圍不同,對應(yīng)的 w 的有效范圍就不同。假設(shè) w1 的范圍在 [-10,10],而w2的范圍在[-100,100],梯度每次都前進(jìn)1單位,那么在w1方向上每次相當(dāng)于前進(jìn)了 1/20,而在w2上只相當(dāng)于 1/200!某種意義上來說,在w2上前進(jìn)的步長更小一些,而w1在搜索過程中會比w2“走”得更快。這樣會導(dǎo)致,在搜索過程中更偏向于w1的方向。
????拋開哪種路線更有效于找到最佳解的問題不談,兩點(diǎn)之間直線距離最短,這種直角路線明顯會更耗時間,所以不歸一化,時間會明顯增加。
batch normalization(BN)
啟發(fā)來源的:之前的研究表明如果在圖像處理中對輸入圖像進(jìn)行白化(Whiten)操作的話——所謂白化,就是對輸入數(shù)據(jù)分布變換到0均值,單位方差的正態(tài)分布——那么神經(jīng)網(wǎng)絡(luò)會較快收斂,那么BN作者就開始推論了:圖像是深度神經(jīng)網(wǎng)絡(luò)的輸入層,做白化能加快收斂,那么其實(shí)對于深度網(wǎng)絡(luò)來說,其中某個隱層的神經(jīng)元是下一層的輸入,意思是其實(shí)深度神經(jīng)網(wǎng)絡(luò)的每一個隱層都是輸入層,不過是相對下一層來說而已,那么能不能對每個隱層都做白化呢?這就是啟發(fā)BN產(chǎn)生的原初想法,而BN也確實(shí)就是這么做的,可以理解為對深層神經(jīng)網(wǎng)絡(luò)每個隱層神經(jīng)元的激活值做簡化版本的白化操作。
????Batch Normalization(簡稱BN)就是對每一批數(shù)據(jù)進(jìn)行歸一化,確實(shí)如此,對于訓(xùn)練中某一個batch的數(shù)據(jù){x1,x2,...,xn},注意這個數(shù)據(jù)是可以輸入也可以是網(wǎng)絡(luò)中間的某一層輸出。在BN出現(xiàn)之前,我們的歸一化操作一般都在數(shù)據(jù)輸入層,對輸入的數(shù)據(jù)進(jìn)行求均值以及求方差做歸一化,但是BN的出現(xiàn)打破了這一個規(guī)定,我們可以在網(wǎng)絡(luò)中任意一層進(jìn)行歸一化處理,因?yàn)槲覀儸F(xiàn)在所用的優(yōu)化方法大多都是min-batch SGD,所以我們的歸一化操作就成為Batch Normalization。
????因?yàn)樯顚由窠?jīng)網(wǎng)絡(luò)在做非線性變換前的激活輸入值(就是那個x=WU+B,U是輸入)隨著網(wǎng)絡(luò)深度加深或者在訓(xùn)練過程中,其分布逐漸發(fā)生偏移或者變動,之所以訓(xùn)練收斂慢,一般是整體分布逐漸往非線性函數(shù)的取值區(qū)間的上下限兩端靠近(對于Sigmoid函數(shù)來說,意味著激活輸入值WU+B是大的負(fù)值或正值),所以這導(dǎo)致反向傳播時低層神經(jīng)網(wǎng)絡(luò)的梯度消失,這是訓(xùn)練深層神經(jīng)網(wǎng)絡(luò)收斂越來越慢的本質(zhì)原因,而BN就是通過一定的規(guī)范化手段,把每層神經(jīng)網(wǎng)絡(luò)任意神經(jīng)元這個輸入值的分布強(qiáng)行拉回到均值為0方差為1的標(biāo)準(zhǔn)正態(tài)分布,其實(shí)就是把越來越偏的分布強(qiáng)制拉回比較標(biāo)準(zhǔn)的分布,這樣使得激活輸入值落在非線性函數(shù)對輸入比較敏感的區(qū)域,這樣輸入的小變化就會導(dǎo)致?lián)p失函數(shù)較大的變化,意思是這樣讓梯度變大,避免梯度消失問題產(chǎn)生,而且梯度變大意味著學(xué)習(xí)收斂速度快,能大大加快訓(xùn)練速度。
對于每個隱層神經(jīng)元,把逐漸向非線性函數(shù)映射后向取值區(qū)間極限飽和區(qū)靠攏的輸入分布強(qiáng)制拉回到均值為0方差為1的比較標(biāo)準(zhǔn)的正態(tài)分布,使得非線性變換函數(shù)的輸入值落入對輸入比較敏感的區(qū)域,以此避免梯度消失問題。
我們把網(wǎng)絡(luò)中間層在訓(xùn)練過程中,數(shù)據(jù)分布的改變稱之為:“Internal Covariate Shift”。BN的提出,就是要解決在訓(xùn)練過程中,中間層數(shù)據(jù)分布發(fā)生改變的情況。BatchNorm就是在深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練過程中使得每一層神經(jīng)網(wǎng)絡(luò)的輸入保持相同分布的。
機(jī)器學(xué)習(xí)領(lǐng)域有個很重要的假設(shè):IID獨(dú)立同分布假設(shè),就是假設(shè)訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)是滿足相同分布的,這是通過訓(xùn)練數(shù)據(jù)獲得的模型能夠在測試集獲得好的效果的一個基本保障。
怎么做?
1、求每一個訓(xùn)練批次數(shù)據(jù)的均值和方差
2、使用求得的均值和方差對該批次的訓(xùn)練數(shù)據(jù)做歸一化,獲得0-1分布。其中ε是為了避免除數(shù)為0時所使用的微小正數(shù)。
3、尺度變換和偏移:將xi乘以γ調(diào)整數(shù)值大小,再加上β增加偏移后得到y(tǒng)i,這里的γ是尺度因子,β是平移因子。這一步是BN的精髓,由于歸一化后的xi基本會被限制在正態(tài)分布下,使得網(wǎng)絡(luò)的表達(dá)能力下降。為解決該問題,我們引入兩個新的參數(shù):γ,β。γ和β是在訓(xùn)練時網(wǎng)絡(luò)自己學(xué)習(xí)得到的。
????如果都通過BN,那么不就跟把非線性函數(shù)替換成線性函數(shù)效果相同了?這意味著什么?我們知道,如果是多層的線性函數(shù)變換其實(shí)這個深層是沒有意義的,因?yàn)槎鄬泳€性網(wǎng)絡(luò)跟一層線性網(wǎng)絡(luò)是等價的。這意味著網(wǎng)絡(luò)的表達(dá)能力下降了,這也意味著深度的意義就沒有了。所以BN為了保證非線性的獲得,對變換后的滿足均值為0方差為1的x又進(jìn)行了scale加上shift操作(y=scale*x+shift),每個神經(jīng)元增加了兩個參數(shù)scale和shift參數(shù),這兩個參數(shù)是通過訓(xùn)練學(xué)習(xí)到的,意思是通過scale和shift把這個值從標(biāo)準(zhǔn)正態(tài)分布左移或者右移一點(diǎn)并長胖一點(diǎn)或者變瘦一點(diǎn),每個實(shí)例挪動的程度不一樣,這樣等價于非線性函數(shù)的值從正中心周圍的線性區(qū)往非線性區(qū)動了動。核心思想應(yīng)該是想找到一個線性和非線性的較好平衡點(diǎn),既能享受非線性的較強(qiáng)表達(dá)能力的好處,又避免太靠非線性區(qū)兩頭使得網(wǎng)絡(luò)收斂速度太慢。

解決了什么?
一個標(biāo)準(zhǔn)的歸一化步驟就是減均值除方差,在這種歸一化中引入了兩個需要學(xué)習(xí)的參數(shù)。

????a中左圖是沒有經(jīng)過任何處理的輸入數(shù)據(jù),曲線是sigmoid函數(shù),如果數(shù)據(jù)在梯度很小的區(qū)域,那么學(xué)習(xí)率就會很慢甚至陷入長時間的停滯。減均值除方差后,數(shù)據(jù)就被移到中心區(qū)域如右圖所示,對于大多數(shù)激活函數(shù)而言,這個區(qū)域的梯度都是最大的或者是有梯度的(比如ReLU),這可以看做是一種對抗梯度消失的有效手段。對于一層如此,如果對于每一層數(shù)據(jù)都那么做的話,數(shù)據(jù)的分布總是在隨著變化敏感的區(qū)域,相當(dāng)于不用考慮數(shù)據(jù)分布變化了,這樣訓(xùn)練起來更有效率。
? ? 減均值除方差得到的分布是正態(tài)分布。如果數(shù)據(jù)本身就很不對稱,或者激活函數(shù)未必是對方差為1的數(shù)據(jù)最好的效果,比如Sigmoid激活函數(shù),在-1~1之間的梯度變化不大,那么非線性變換的作用就不能很好的體現(xiàn),換言之就是,減均值除方差操作后可能會削弱網(wǎng)絡(luò)的性能。針對該情況,在前面三步之后加入第4步完成真正的batch normalization。
????BN的本質(zhì)就是利用優(yōu)化變一下方差大小和均值位置,使得新的分布更切合數(shù)據(jù)的真實(shí)分布,保證模型的非線性表達(dá)能力。
BN的極端的情況就是這兩個參數(shù)等于mini-batch的均值和方差,那么經(jīng)過batch normalization之后的數(shù)據(jù)和輸入完全一樣,當(dāng)然一般的情況是不同的。
如何在驗(yàn)證集中使用?
????對于預(yù)測階段時所使用的均值和方差,其實(shí)也是來源于訓(xùn)練集。比如我們在模型訓(xùn)練時我們就記錄下每個batch下的均值和方差,待訓(xùn)練完畢后,我們求整個訓(xùn)練樣本的均值和方差期望值,作為我們進(jìn)行預(yù)測時進(jìn)行BN的的均值和方差
CNN中的BN
????卷積神經(jīng)網(wǎng)絡(luò)的特征是對應(yīng)到一整張?zhí)卣黜憫?yīng)圖上的,所以做BN時也應(yīng)以響應(yīng)圖為單位而不是按照各個維度。比如在某一層,batch大小為m,響應(yīng)圖大小為w×h,則做BN的數(shù)據(jù)量為m×w×h。
????BN在深層神經(jīng)網(wǎng)絡(luò)的作用非常明顯:若神經(jīng)網(wǎng)絡(luò)訓(xùn)練時遇到收斂速度較慢,或者“梯度爆炸”等無法訓(xùn)練的情況發(fā)生時都可以嘗試用BN來解決。同時,常規(guī)使用情況下同樣可以加入BN來加速模型訓(xùn)練,甚至提升模型精度。
BN所產(chǎn)生的問題
????BN對batch是independent的,過小的batch size會導(dǎo)致其性能下降,一般來說每GPU上batch設(shè)為32最合適。但是對于一些其他深度學(xué)習(xí)任務(wù)batch size往往只有1-2,比如目標(biāo)檢測,圖像分割,視頻分類上,輸入的圖像數(shù)據(jù)很大,較大的batchsize顯存吃不消。
group normalization(GN)

深度網(wǎng)絡(luò)中的數(shù)據(jù)維度一般是[N, C, H, W]或者[N, H, W,C]格式,N是batch size,H/W是feature的高/寬,C是feature的channel,壓縮H/W至一個維度,其三維的表示如上圖,假設(shè)單個方格的長度是1,那么其表示的是[6, 6,*, * ]
BN在batch的維度上norm,歸一化維度為[N,H,W],對batch中對應(yīng)的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能取得較好的效果
????傳統(tǒng)角度來講,在深度學(xué)習(xí)沒有火起來之前,提取特征通常是使用SIFT,HOG和GIST特征,這些特征有一個共性,都具有按group表示的特性,每一個group由相同種類直方圖的構(gòu)建而成,這些特征通常是對在每個直方圖(histogram)或每個方向(orientation)上進(jìn)行組歸一化(group-wise norm)而得到。而更高維的特征比如VLAD和Fisher Vectors(FV)也可以看作是group-wise feature,此處的group可以被認(rèn)為是每個聚類(cluster)下的子向量sub-vector。
????從深度學(xué)習(xí)上來講,完全可以認(rèn)為卷積提取的特征是一種非結(jié)構(gòu)化的特征或者向量,拿網(wǎng)絡(luò)的第一層卷積為例,卷積層中的的卷積核filter1和此卷積核的其他經(jīng)過transform過的版本filter2(transform可以是horizontal flipping等),在同一張圖像上學(xué)習(xí)到的特征應(yīng)該是具有相同的分布,那么,具有相同的特征可以被分到同一個group中,按照個人理解,每一層有很多的卷積核,這些核學(xué)習(xí)到的特征并不完全是獨(dú)立的,某些特征具有相同的分布,因此可以被group。
????導(dǎo)致分組(group)的因素有很多,比如頻率、形狀、亮度和紋理等,HOG特征根據(jù)orientation分組,而對神經(jīng)網(wǎng)絡(luò)來講,其提取特征的機(jī)制更加復(fù)雜,也更加難以描述,變得不那么直觀。
????另在神經(jīng)科學(xué)領(lǐng)域,一種被廣泛接受的計(jì)算模型是對cell的響應(yīng)做歸一化,此現(xiàn)象存在于淺層視覺皮層和整個視覺系統(tǒng)。
????作者基于此,提出了組歸一化(Group Normalization)的方式,且效果表明,顯著優(yōu)于BN、LN、IN等。GN的歸一化方式避開了batch size對模型的影響,特征的group歸一化同樣可以解決$Internal$ $Covariate$ $Shift$的問題,并取得較好的效果。