文章轉(zhuǎn)載自多個博主映之,再次表示感謝怀大,學習用途,侵刪
論文:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
normalization
1.數(shù)值問題八孝。
? ? 輸入變量的數(shù)量級不一致可能會引起數(shù)值問題欲逃。因為tansig的非線性區(qū)間大約在[-1.7,1.7]猿诸。意味著要使神經(jīng)元有效婚被,tansig( w1*x1 + w2*x2 +b) 里的 w1*x1 +w2*x2 +b 數(shù)量級應該在 1 (1.7所在的數(shù)量級)左右。這時輸入較大梳虽,就意味著權(quán)值必須較小址芯,一個較大,一個較小窜觉,兩者相乘谷炸,就引起數(shù)值問題了。
2.求解需要
? ? 在訓練前我們將數(shù)據(jù)歸一化是為了更方便的求解禀挫。
????那么旬陡,究竟給求解帶來了什么方便呢?
????這個問題不能一概而論语婴,不同的算法描孟,在歸一化中得到的好處各不相同。目前大部算法砰左,都比較需要歸一化匿醒,特別是常用的梯度下降法(或梯度下降的衍生方法),歸一化和不歸一化缠导,對梯度下降法的影響非常大廉羔。不同的算法,對歸一化的依賴程序不同酬核。
? ? ?? 以梯度下降法舉例蜜另。梯度法一般初始化一個初始解,然后求梯度嫡意,再用新解=舊解-梯度*學習率 的方式來迭代更新解举瑰。直到滿足終止迭代條件,退出循環(huán)蔬螟。
(1)初始化
?????過初始化的同學會發(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]有交集(實際上需要更細膩的條件)罢坝,這個神經(jīng)元才能利用到非線性部分。我們希望初始化的時候搅窿,就把每個神經(jīng)元初始化成有效的狀態(tài)嘁酿,所以,需要知道w1*x1+w2*x2+b的取值范圍男应,也就需要知道輸入輸出數(shù)據(jù)的范圍闹司。輸入數(shù)據(jù)的范圍對初始化的影響是無法避免的,一般討論初始化方法時沐飘,我們都假設它的范圍就是[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)學習率
????由(2)中侥衬,知道梯度非常大,學習率就必須非常小,因此轴总,學習率(學習率初始值)的選擇需要參考輸入的范圍直颅,不如直接將數(shù)據(jù)歸一化,這樣學習率就不必再根據(jù)數(shù)據(jù)范圍作調(diào)整怀樟。
????隱層到輸出層的權(quán)值梯度可以寫成 2e*a功偿,而輸入層到隱層的權(quán)值梯度為?2e *w*(1-a^2)*x ,受 x 和 w 的影響往堡,各個梯度的數(shù)量級不相同脖含,因此,它們需要的學習率數(shù)量級也就不相同投蝉。對w1適合的學習率养葵,可能相對于w2來說會太小,若果使用適合w1的學習率瘩缆,會導致在w2方向上步進非常慢关拒,會消耗非常多的時間,而使用適合w2的學習率庸娱,對w1來說又太大着绊,搜索不到適合w1的解。(4)搜索軌跡
????前面已說過熟尉,輸入范圍不同归露,對應的 w 的有效范圍就不同。假設 w1 的范圍在 [-10斤儿,10]剧包,而w2的范圍在[-100,100]往果,梯度每次都前進1單位疆液,那么在w1方向上每次相當于前進了 1/20,而在w2上只相當于 1/200陕贮!某種意義上來說堕油,在w2上前進的步長更小一些,而w1在搜索過程中會比w2“走”得更快。這樣會導致肮之,在搜索過程中更偏向于w1的方向掉缺。
????拋開哪種路線更有效于找到最佳解的問題不談,兩點之間直線距離最短戈擒,這種直角路線明顯會更耗時間眶明,所以不歸一化,時間會明顯增加峦甩。
batch normalization(BN)
啟發(fā)來源的:之前的研究表明如果在圖像處理中對輸入圖像進行白化(Whiten)操作的話——所謂白化赘来,就是對輸入數(shù)據(jù)分布變換到0均值现喳,單位方差的正態(tài)分布——那么神經(jīng)網(wǎng)絡會較快收斂,那么BN作者就開始推論了:圖像是深度神經(jīng)網(wǎng)絡的輸入層犬辰,做白化能加快收斂嗦篱,那么其實對于深度網(wǎng)絡來說,其中某個隱層的神經(jīng)元是下一層的輸入幌缝,意思是其實深度神經(jīng)網(wǎng)絡的每一個隱層都是輸入層灸促,不過是相對下一層來說而已,那么能不能對每個隱層都做白化呢涵卵?這就是啟發(fā)BN產(chǎn)生的原初想法浴栽,而BN也確實就是這么做的,可以理解為對深層神經(jīng)網(wǎng)絡每個隱層神經(jīng)元的激活值做簡化版本的白化操作轿偎。
????Batch Normalization(簡稱BN)就是對每一批數(shù)據(jù)進行歸一化典鸡,確實如此,對于訓練中某一個batch的數(shù)據(jù){x1,x2,...,xn}坏晦,注意這個數(shù)據(jù)是可以輸入也可以是網(wǎng)絡中間的某一層輸出萝玷。在BN出現(xiàn)之前,我們的歸一化操作一般都在數(shù)據(jù)輸入層昆婿,對輸入的數(shù)據(jù)進行求均值以及求方差做歸一化球碉,但是BN的出現(xiàn)打破了這一個規(guī)定,我們可以在網(wǎng)絡中任意一層進行歸一化處理仓蛆,因為我們現(xiàn)在所用的優(yōu)化方法大多都是min-batch SGD睁冬,所以我們的歸一化操作就成為Batch Normalization。
????因為深層神經(jīng)網(wǎng)絡在做非線性變換前的激活輸入值(就是那個x=WU+B看疙,U是輸入)隨著網(wǎng)絡深度加深或者在訓練過程中豆拨,其分布逐漸發(fā)生偏移或者變動,之所以訓練收斂慢狼荞,一般是整體分布逐漸往非線性函數(shù)的取值區(qū)間的上下限兩端靠近(對于Sigmoid函數(shù)來說辽装,意味著激活輸入值WU+B是大的負值或正值)帮碰,所以這導致反向傳播時低層神經(jīng)網(wǎng)絡的梯度消失相味,這是訓練深層神經(jīng)網(wǎng)絡收斂越來越慢的本質(zhì)原因,而BN就是通過一定的規(guī)范化手段殉挽,把每層神經(jīng)網(wǎng)絡任意神經(jīng)元這個輸入值的分布強行拉回到均值為0方差為1的標準正態(tài)分布丰涉,其實就是把越來越偏的分布強制拉回比較標準的分布,這樣使得激活輸入值落在非線性函數(shù)對輸入比較敏感的區(qū)域斯碌,這樣輸入的小變化就會導致?lián)p失函數(shù)較大的變化一死,意思是這樣讓梯度變大,避免梯度消失問題產(chǎn)生傻唾,而且梯度變大意味著學習收斂速度快投慈,能大大加快訓練速度承耿。
對于每個隱層神經(jīng)元,把逐漸向非線性函數(shù)映射后向取值區(qū)間極限飽和區(qū)靠攏的輸入分布強制拉回到均值為0方差為1的比較標準的正態(tài)分布伪煤,使得非線性變換函數(shù)的輸入值落入對輸入比較敏感的區(qū)域加袋,以此避免梯度消失問題。
我們把網(wǎng)絡中間層在訓練過程中抱既,數(shù)據(jù)分布的改變稱之為:“Internal Covariate Shift”职烧。BN的提出,就是要解決在訓練過程中防泵,中間層數(shù)據(jù)分布發(fā)生改變的情況蚀之。BatchNorm就是在深度神經(jīng)網(wǎng)絡訓練過程中使得每一層神經(jīng)網(wǎng)絡的輸入保持相同分布的。
機器學習領域有個很重要的假設:IID獨立同分布假設捷泞,就是假設訓練數(shù)據(jù)和測試數(shù)據(jù)是滿足相同分布的足删,這是通過訓練數(shù)據(jù)獲得的模型能夠在測試集獲得好的效果的一個基本保障。
怎么做锁右?
1壹堰、求每一個訓練批次數(shù)據(jù)的均值和方差
2、使用求得的均值和方差對該批次的訓練數(shù)據(jù)做歸一化骡湖,獲得0-1分布贱纠。其中ε是為了避免除數(shù)為0時所使用的微小正數(shù)。
3响蕴、尺度變換和偏移:將xi乘以γ調(diào)整數(shù)值大小谆焊,再加上β增加偏移后得到y(tǒng)i,這里的γ是尺度因子浦夷,β是平移因子辖试。這一步是BN的精髓,由于歸一化后的xi基本會被限制在正態(tài)分布下劈狐,使得網(wǎng)絡的表達能力下降罐孝。為解決該問題,我們引入兩個新的參數(shù):γ肥缔,β莲兢。γ和β是在訓練時網(wǎng)絡自己學習得到的。
????如果都通過BN续膳,那么不就跟把非線性函數(shù)替換成線性函數(shù)效果相同了改艇?這意味著什么?我們知道坟岔,如果是多層的線性函數(shù)變換其實這個深層是沒有意義的谒兄,因為多層線性網(wǎng)絡跟一層線性網(wǎng)絡是等價的。這意味著網(wǎng)絡的表達能力下降了社付,這也意味著深度的意義就沒有了承疲。所以BN為了保證非線性的獲得邻耕,對變換后的滿足均值為0方差為1的x又進行了scale加上shift操作(y=scale*x+shift),每個神經(jīng)元增加了兩個參數(shù)scale和shift參數(shù)燕鸽,這兩個參數(shù)是通過訓練學習到的赊豌,意思是通過scale和shift把這個值從標準正態(tài)分布左移或者右移一點并長胖一點或者變瘦一點,每個實例挪動的程度不一樣绵咱,這樣等價于非線性函數(shù)的值從正中心周圍的線性區(qū)往非線性區(qū)動了動碘饼。核心思想應該是想找到一個線性和非線性的較好平衡點,既能享受非線性的較強表達能力的好處悲伶,又避免太靠非線性區(qū)兩頭使得網(wǎng)絡收斂速度太慢艾恼。
解決了什么?
一個標準的歸一化步驟就是減均值除方差麸锉,在這種歸一化中引入了兩個需要學習的參數(shù)钠绍。
????a中左圖是沒有經(jīng)過任何處理的輸入數(shù)據(jù),曲線是sigmoid函數(shù)花沉,如果數(shù)據(jù)在梯度很小的區(qū)域柳爽,那么學習率就會很慢甚至陷入長時間的停滯。減均值除方差后碱屁,數(shù)據(jù)就被移到中心區(qū)域如右圖所示磷脯,對于大多數(shù)激活函數(shù)而言,這個區(qū)域的梯度都是最大的或者是有梯度的(比如ReLU)娩脾,這可以看做是一種對抗梯度消失的有效手段赵誓。對于一層如此,如果對于每一層數(shù)據(jù)都那么做的話柿赊,數(shù)據(jù)的分布總是在隨著變化敏感的區(qū)域俩功,相當于不用考慮數(shù)據(jù)分布變化了,這樣訓練起來更有效率碰声。
? ? 減均值除方差得到的分布是正態(tài)分布诡蜓。如果數(shù)據(jù)本身就很不對稱,或者激活函數(shù)未必是對方差為1的數(shù)據(jù)最好的效果胰挑,比如Sigmoid激活函數(shù)蔓罚,在-1~1之間的梯度變化不大,那么非線性變換的作用就不能很好的體現(xiàn)洽腺,換言之就是脚粟,減均值除方差操作后可能會削弱網(wǎng)絡的性能。針對該情況蘸朋,在前面三步之后加入第4步完成真正的batch normalization。
????BN的本質(zhì)就是利用優(yōu)化變一下方差大小和均值位置扣唱,使得新的分布更切合數(shù)據(jù)的真實分布藕坯,保證模型的非線性表達能力团南。
BN的極端的情況就是這兩個參數(shù)等于mini-batch的均值和方差,那么經(jīng)過batch normalization之后的數(shù)據(jù)和輸入完全一樣炼彪,當然一般的情況是不同的吐根。
如何在驗證集中使用?
????對于預測階段時所使用的均值和方差辐马,其實也是來源于訓練集拷橘。比如我們在模型訓練時我們就記錄下每個batch下的均值和方差,待訓練完畢后喜爷,我們求整個訓練樣本的均值和方差期望值冗疮,作為我們進行預測時進行BN的的均值和方差
CNN中的BN
????卷積神經(jīng)網(wǎng)絡的特征是對應到一整張?zhí)卣黜憫獔D上的,所以做BN時也應以響應圖為單位而不是按照各個維度檩帐。比如在某一層术幔,batch大小為m,響應圖大小為w×h湃密,則做BN的數(shù)據(jù)量為m×w×h诅挑。
????BN在深層神經(jīng)網(wǎng)絡的作用非常明顯:若神經(jīng)網(wǎng)絡訓練時遇到收斂速度較慢,或者“梯度爆炸”等無法訓練的情況發(fā)生時都可以嘗試用BN來解決泛源。同時拔妥,常規(guī)使用情況下同樣可以加入BN來加速模型訓練,甚至提升模型精度达箍。
BN所產(chǎn)生的問題
????BN對batch是independent的毒嫡,過小的batch size會導致其性能下降,一般來說每GPU上batch設為32最合適幻梯。但是對于一些其他深度學習任務batch size往往只有1-2兜畸,比如目標檢測,圖像分割碘梢,視頻分類上咬摇,輸入的圖像數(shù)據(jù)很大,較大的batchsize顯存吃不消煞躬。
group normalization(GN)
深度網(wǎng)絡中的數(shù)據(jù)維度一般是[N, C, H, W]或者[N, H, W肛鹏,C]格式,N是batch size恩沛,H/W是feature的高/寬在扰,C是feature的channel,壓縮H/W至一個維度雷客,其三維的表示如上圖芒珠,假設單個方格的長度是1,那么其表示的是[6, 6搅裙,*, * ]
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能取得較好的效果
????傳統(tǒng)角度來講彼绷,在深度學習沒有火起來之前,提取特征通常是使用SIFT茴迁,HOG和GIST特征寄悯,這些特征有一個共性,都具有按group表示的特性堕义,每一個group由相同種類直方圖的構(gòu)建而成猜旬,這些特征通常是對在每個直方圖(histogram)或每個方向(orientation)上進行組歸一化(group-wise norm)而得到。而更高維的特征比如VLAD和Fisher Vectors(FV)也可以看作是group-wise feature倦卖,此處的group可以被認為是每個聚類(cluster)下的子向量sub-vector洒擦。
????從深度學習上來講,完全可以認為卷積提取的特征是一種非結(jié)構(gòu)化的特征或者向量怕膛,拿網(wǎng)絡的第一層卷積為例熟嫩,卷積層中的的卷積核filter1和此卷積核的其他經(jīng)過transform過的版本filter2(transform可以是horizontal flipping等),在同一張圖像上學習到的特征應該是具有相同的分布褐捻,那么掸茅,具有相同的特征可以被分到同一個group中,按照個人理解柠逞,每一層有很多的卷積核昧狮,這些核學習到的特征并不完全是獨立的,某些特征具有相同的分布板壮,因此可以被group逗鸣。
????導致分組(group)的因素有很多,比如頻率、形狀慕购、亮度和紋理等聊疲,HOG特征根據(jù)orientation分組茬底,而對神經(jīng)網(wǎng)絡來講沪悲,其提取特征的機制更加復雜,也更加難以描述阱表,變得不那么直觀殿如。
????另在神經(jīng)科學領域,一種被廣泛接受的計算模型是對cell的響應做歸一化最爬,此現(xiàn)象存在于淺層視覺皮層和整個視覺系統(tǒng)涉馁。
????作者基于此,提出了組歸一化(Group Normalization)的方式爱致,且效果表明烤送,顯著優(yōu)于BN、LN糠悯、IN等帮坚。GN的歸一化方式避開了batch size對模型的影響,特征的group歸一化同樣可以解決$Internal$ $Covariate$ $Shift$的問題互艾,并取得較好的效果试和。