Batch Normalization作為最近一年來DL的重要成果( 本文寫于2016年)夫凸,已經(jīng)廣泛被證明其有效性和重要性。目前幾乎已經(jīng)成為DL的標(biāo)配了就缆,任何有志于學(xué)習(xí)DL的同學(xué)們朋友們雷迪斯俺的詹特曼們都應(yīng)該好好學(xué)一學(xué)BN颜价。BN倒過來看就是NB思币,因?yàn)檫@個(gè)技術(shù)確實(shí)很NB,雖然有些細(xì)節(jié)處理還解釋不清其理論原因肛度,但是實(shí)踐證明好用才是真的好傻唾,別忘了DL從Hinton對(duì)深層網(wǎng)絡(luò)做Pre-Train開始就是一個(gè)經(jīng)驗(yàn)領(lǐng)先于理論分析的偏經(jīng)驗(yàn)的一門學(xué)問。
如何理解BatchNorm?請(qǐng)參考論文:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift承耿。因?yàn)閷?duì)于部分基礎(chǔ)不是太好的同學(xué)們朋友們雷迪斯俺的詹特曼們可能閱讀理解有一定障礙冠骄,所以本文是為了更容易理解BN而做的一番導(dǎo)讀。由于本人水平也很有限加袋,假設(shè)導(dǎo)游導(dǎo)錯(cuò)了了路凛辣,那么…….您就認(rèn)倒霉好了,畢竟這是免費(fèi)的導(dǎo)游您說是不职烧,期望別太高蟀给,“任何對(duì)其它人或者事物報(bào)以極高期望的人是這個(gè)世界上最不幸福的人”蝙砌,這是出自我的非名人的名言,所以“降低期望是通向幸福之路”跋理,這也是我的名言择克。
機(jī)器學(xué)習(xí)領(lǐng)域有個(gè)很重要的假設(shè):IID獨(dú)立同分布假設(shè),就是假設(shè)訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)是滿足相同分布的前普,這是通過訓(xùn)練數(shù)據(jù)獲得的模型能夠在測(cè)試集獲得好的效果的一個(gè)基本保障肚邢。而BatchNorm是干啥的呢?BatchNorm就是在深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練過程中使得每一層神經(jīng)網(wǎng)絡(luò)的輸入保持相同分布的拭卿。OK骡湖,BN講完了,再見峻厚。
嗯响蕴,這么講步子邁得有點(diǎn)大,我們放慢腳步惠桃,把學(xué)習(xí)率調(diào)小一點(diǎn)浦夷,一步一步接近理解BN的最優(yōu)解。
為什么深度神經(jīng)網(wǎng)絡(luò)隨著網(wǎng)絡(luò)深度加深辜王,訓(xùn)練起來越困難劈狐,收斂越來越慢?這是個(gè)在DL領(lǐng)域很接近本質(zhì)的好問題呐馆。很多論文都是解決這個(gè)問題的肥缔,比如ReLU激活函數(shù),再比如Residual Network汹来,BN本質(zhì)上也是解釋并從某個(gè)不同的角度來解決這個(gè)問題的续膳。
|“Internal Covariate Shift”問題
從論文名字可以看出,BN是用來解決“Internal Covariate Shift”問題的收班,那么首先得理解什么是“Internal Covariate Shift”姑宽?
論文首先說明Mini-Batch SGD相對(duì)于One Example SGD的兩個(gè)優(yōu)勢(shì):梯度更新方向更準(zhǔn)確;并行計(jì)算速度快闺阱;(本文作者:為啥要說這些炮车?因?yàn)锽atchNorm是基于Mini-Batch SGD的,所以先夸下Mini-Batch SGD酣溃,當(dāng)然也是大實(shí)話)瘦穆;
然后吐槽下SGD訓(xùn)練的缺點(diǎn):超參數(shù)調(diào)起來很麻煩。(本文作者:作者隱含意思是用我大BN就能解決很多SGD的缺點(diǎn):用了大BN赊豌,媽媽再也不用擔(dān)心我的調(diào)參能力啦)
接著引入covariate shift的概念:如果ML系統(tǒng)實(shí)例集合<X,Y>中的輸入值X的分布老是變扛或,這不符合IID假設(shè)啊,那您怎么讓我穩(wěn)定的學(xué)規(guī)律啊碘饼,這不得引入遷移學(xué)習(xí)才能搞定嗎熙兔,我們的ML系統(tǒng)還得去學(xué)習(xí)怎么迎合這種分布變化啊悲伶。
對(duì)于深度學(xué)習(xí)這種包含很多隱層的網(wǎng)絡(luò)結(jié)構(gòu),在訓(xùn)練過程中住涉,因?yàn)楦鲗訁?shù)老在變麸锉,所以每個(gè)隱層都會(huì)面臨covariate shift的問題,也就是在訓(xùn)練過程中舆声,隱層的輸入分布老是變來變?nèi)セǔ粒@就是所謂的“Internal Covariate Shift”,Internal指的是深層網(wǎng)絡(luò)的隱層媳握,是發(fā)生在網(wǎng)絡(luò)內(nèi)部的事情碱屁,而不是covariate shift問題只發(fā)生在輸入層。
然后提出了BatchNorm的基本思想:能不能讓每個(gè)隱層節(jié)點(diǎn)的激活輸入分布固定下來呢蛾找?這樣就避免了“Internal Covariate Shift”問題了娩脾。
BN不是憑空拍腦袋拍出來的好點(diǎn)子,它是有啟發(fā)來源的:之前的研究表明如果在圖像處理中對(duì)輸入圖像進(jìn)行白化(Whiten)操作的話——所謂白化打毛,就是對(duì)輸入數(shù)據(jù)分布變換到0均值柿赊,單位方差的正態(tài)分布——那么神經(jīng)網(wǎng)絡(luò)會(huì)較快收斂,那么BN作者就開始推論了:圖像是深度神經(jīng)網(wǎng)絡(luò)的輸入層隘冲,做白化能加快收斂闹瞧,那么其實(shí)對(duì)于深度網(wǎng)絡(luò)來說绑雄,其中某個(gè)隱層的神經(jīng)元是下一層的輸入展辞,意思是其實(shí)深度神經(jīng)網(wǎng)絡(luò)的每一個(gè)隱層都是輸入層,不過是相對(duì)下一層來說而已万牺,那么能不能對(duì)每個(gè)隱層都做白化呢罗珍?這就是啟發(fā)BN產(chǎn)生的原初想法,而BN也確實(shí)就是這么做的脚粟,可以理解為對(duì)深層神經(jīng)網(wǎng)絡(luò)每個(gè)隱層神經(jīng)元的激活值做簡化版本的白化操作覆旱。
|BatchNorm的本質(zhì)思想
BN的基本思想其實(shí)相當(dāng)直觀:因?yàn)樯顚由窠?jīng)網(wǎng)絡(luò)在做非線性變換前的激活輸入值(就是那個(gè)x=WU+B,U是輸入)隨著網(wǎng)絡(luò)深度加深或者在訓(xùn)練過程中核无,其分布逐漸發(fā)生偏移或者變動(dòng)扣唱,之所以訓(xùn)練收斂慢,一般是整體分布逐漸往非線性函數(shù)的取值區(qū)間的上下限兩端靠近(對(duì)于Sigmoid函數(shù)來說团南,意味著激活輸入值WU+B是大的負(fù)值或正值)噪沙,所以這導(dǎo)致后向傳播時(shí)低層神經(jīng)網(wǎng)絡(luò)的梯度消失,這是訓(xùn)練深層神經(jīng)網(wǎng)絡(luò)收斂越來越慢的本質(zhì)原因吐根,而BN就是通過一定的規(guī)范化手段正歼,把每層神經(jīng)網(wǎng)絡(luò)任意神經(jīng)元這個(gè)輸入值的分布強(qiáng)行拉回到均值為0方差為1的標(biāo)準(zhǔn)正太分布而不是蘿莉分布(哦,是正態(tài)分布)拷橘,其實(shí)就是把越來越偏的分布強(qiáng)制拉回比較標(biāo)準(zhǔn)的分布局义,這樣使得激活輸入值落在非線性函數(shù)對(duì)輸入比較敏感的區(qū)域喜爷,這樣輸入的小變化就會(huì)導(dǎo)致?lián)p失函數(shù)較大的變化,意思是這樣讓梯度變大萄唇,避免梯度消失問題產(chǎn)生檩帐,而且梯度變大意味著學(xué)習(xí)收斂速度快,能大大加快訓(xùn)練速度穷绵。
THAT’S IT轿塔。其實(shí)一句話就是:對(duì)于每個(gè)隱層神經(jīng)元,把逐漸向非線性函數(shù)映射后向取值區(qū)間極限飽和區(qū)靠攏的輸入分布強(qiáng)制拉回到均值為0方差為1的比較標(biāo)準(zhǔn)的正態(tài)分布仲墨,使得非線性變換函數(shù)的輸入值落入對(duì)輸入比較敏感的區(qū)域勾缭,以此避免梯度消失問題。因?yàn)樘荻纫恢倍寄鼙3直容^大的狀態(tài)目养,所以很明顯對(duì)神經(jīng)網(wǎng)絡(luò)的參數(shù)調(diào)整效率比較高俩由,就是變動(dòng)大,就是說向損失函數(shù)最優(yōu)值邁動(dòng)的步子大癌蚁,也就是說收斂地快幻梯。NB說到底就是這么個(gè)機(jī)制,方法很簡單努释,道理很深刻碘梢。
上面說得還是顯得抽象,下面更形象地表達(dá)下這種調(diào)整到底代表什么含義伐蒂。
圖1. 幾個(gè)正態(tài)分布
假設(shè)某個(gè)隱層神經(jīng)元原先的激活輸入x取值符合正態(tài)分布煞躬,正態(tài)分布均值是-2,方差是0.5逸邦,對(duì)應(yīng)上圖中最左端的淺藍(lán)色曲線恩沛,通過BN后轉(zhuǎn)換為均值為0,方差是1的正態(tài)分布(對(duì)應(yīng)上圖中的深藍(lán)色圖形)缕减,意味著什么雷客,意味著輸入x的取值正態(tài)分布整體右移2(均值的變化),圖形曲線更平緩了(方差增大的變化)桥狡。這個(gè)圖的意思是搅裙,BN其實(shí)就是把每個(gè)隱層神經(jīng)元的激活輸入分布從偏離均值為0方差為1的正態(tài)分布通過平移均值壓縮或者擴(kuò)大曲線尖銳程度,調(diào)整為均值為0方差為1的正態(tài)分布裹芝。
那么把激活輸入x調(diào)整到這個(gè)正態(tài)分布有什么用部逮?
首先我們看下均值為0,方差為1的標(biāo)準(zhǔn)正態(tài)分布代表什么含義:
圖2.均值為0方差為1的標(biāo)準(zhǔn)正態(tài)分布圖
這意味著在一個(gè)標(biāo)準(zhǔn)差范圍內(nèi)局雄,也就是說64%的概率x其值落在[-1,1]的范圍內(nèi)甥啄,在兩個(gè)標(biāo)準(zhǔn)差范圍內(nèi),也就是說95%的概率x其值落在了[-2,2]的范圍內(nèi)炬搭。那么這又意味著什么蜈漓?我們知道穆桂,激活值x=WU+B,U是真正的輸入,x是某個(gè)神經(jīng)元的激活值融虽,假設(shè)非線性函數(shù)是sigmoid享完,那么看下sigmoid(x)其圖形:
圖3 Sigmoid(x)
及sigmoid(x)的導(dǎo)數(shù)為:G’=f(x)*(1-f(x)),因?yàn)閒(x)=sigmoid(x)在0到1之間有额,所以G’在0到0.25之間般又,其對(duì)應(yīng)的圖如下:
圖4. Sigmoid(x)導(dǎo)數(shù)圖
假設(shè)沒有經(jīng)過BN調(diào)整前x的原先正態(tài)分布均值是-6,方差是1巍佑,那么意味著95%的值落在了[-8,-4]之間茴迁,那么對(duì)應(yīng)的Sigmoid(x)函數(shù)的值明顯接近于0,這是典型的梯度飽和區(qū)萤衰,在這個(gè)區(qū)域里梯度變化很慢堕义,為什么是梯度飽和區(qū)?請(qǐng)看下sigmoid(x)如果取值接近0或者接近于1的時(shí)候?qū)?yīng)導(dǎo)數(shù)函數(shù)取值脆栋,接近于0倦卖,意味著梯度變化很小甚至消失。而假設(shè)經(jīng)過BN后椿争,均值是0怕膛,方差是1,那么意味著95%的x值落在了[-2,2]區(qū)間內(nèi)秦踪,很明顯這一段是sigmoid(x)函數(shù)接近于線性變換的區(qū)域褐捻,意味著x的小變化會(huì)導(dǎo)致非線性函數(shù)值較大的變化,也即是梯度變化較大洋侨,對(duì)應(yīng)導(dǎo)數(shù)函數(shù)圖中明顯大于0的區(qū)域舍扰,就是梯度非飽和區(qū)倦蚪。
從上面幾個(gè)圖應(yīng)該看出來BN在干什么了吧希坚?其實(shí)就是把隱層神經(jīng)元激活輸入x=WU+B從變化不拘一格的正態(tài)分布通過BN操作拉回到了均值為0,方差為1的正態(tài)分布陵且,即原始正態(tài)分布中心左移或者右移到以0為均值裁僧,拉伸或者縮減形態(tài)形成以1為方差的圖形。什么意思慕购?就是說經(jīng)過BN后聊疲,目前大部分Activation的值落入非線性函數(shù)的線性區(qū)內(nèi),其對(duì)應(yīng)的導(dǎo)數(shù)遠(yuǎn)離導(dǎo)數(shù)飽和區(qū)沪悲,這樣來加速訓(xùn)練收斂過程获洲。
但是很明顯,看到這里殿如,稍微了解神經(jīng)網(wǎng)絡(luò)的讀者一般會(huì)提出一個(gè)疑問:如果都通過BN贡珊,那么不就跟把非線性函數(shù)替換成線性函數(shù)效果相同了最爬?這意味著什么?我們知道门岔,如果是多層的線性函數(shù)變換其實(shí)這個(gè)深層是沒有意義的爱致,因?yàn)槎鄬泳€性網(wǎng)絡(luò)跟一層線性網(wǎng)絡(luò)是等價(jià)的。這意味著網(wǎng)絡(luò)的表達(dá)能力下降了寒随,這也意味著深度的意義就沒有了糠悯。所以BN為了保證非線性的獲得,對(duì)變換后的滿足均值為0方差為1的x又進(jìn)行了scale加上shift操作(y=scale*x+shift)妻往,每個(gè)神經(jīng)元增加了兩個(gè)參數(shù)scale和shift參數(shù)互艾,這兩個(gè)參數(shù)是通過訓(xùn)練學(xué)習(xí)到的,意思是通過scale和shift把這個(gè)值從標(biāo)準(zhǔn)正態(tài)分布左移或者由移一點(diǎn)并長胖一點(diǎn)或者變瘦一點(diǎn)讯泣,每個(gè)實(shí)例挪動(dòng)的程度不一樣忘朝,這樣等價(jià)于非線性函數(shù)的值從正中心周圍的線性區(qū)往非線性區(qū)動(dòng)了動(dòng)。核心思想應(yīng)該是想找到一個(gè)線性和非線性的較好平衡點(diǎn)判帮,既能享受非線性的較強(qiáng)表達(dá)能力的好處局嘁,又避免太靠非線性區(qū)兩頭使得網(wǎng)絡(luò)收斂速度太慢。當(dāng)然晦墙,這是我的理解悦昵,論文作者并未明確這樣說。但是很明顯這里的scale和shift操作是會(huì)有爭議的晌畅,因?yàn)榘凑照撐淖髡哒撐睦飳懙睦硐霠顟B(tài)但指,就會(huì)又通過scale和shift操作把變換后的x調(diào)整回未變換的狀態(tài),那不是饒了一圈又繞回去原始的“Internal Covariate Shift”問題里去了嗎抗楔,感覺論文作者并未能夠清楚地解釋scale和shift操作的理論原因棋凳。
|訓(xùn)練階段如何做BatchNorm
上面是對(duì)BN的抽象分析和解釋,具體在Mini-Batch SGD下做BN怎么做连躏?其實(shí)論文里面這塊寫得很清楚也容易理解剩岳。為了保證這篇文章完整性,這里簡單說明下入热。
假設(shè)對(duì)于一個(gè)深層神經(jīng)網(wǎng)絡(luò)來說拍棕,其中兩層結(jié)構(gòu)如下:
圖5. DNN其中兩層
要對(duì)每個(gè)隱層神經(jīng)元的激活值做BN,可以想象成每個(gè)隱層又加上了一層BN操作層勺良,它位于X=WU+B激活值獲得之后妻导,非線性函數(shù)變換之前眠寿,其圖示如下:
圖6. BN操作
對(duì)于Mini-Batch SGD來說诸尽,一次訓(xùn)練過程里面包含m個(gè)訓(xùn)練實(shí)例劳翰,其具體BN操作就是對(duì)于隱層內(nèi)每個(gè)神經(jīng)元的激活值來說,進(jìn)行如下變換:
要注意,這里t層某個(gè)神經(jīng)元的x(k)不是指原始輸入谬泌,就是說不是t-1層每個(gè)神經(jīng)元的輸出示弓,而是t層這個(gè)神經(jīng)元的激活x=WU+B,這里的U才是t-1層神經(jīng)元的輸出呵萨。
變換的意思是:某個(gè)神經(jīng)元對(duì)應(yīng)的原始的激活x通過減去mini-Batch內(nèi)m個(gè)實(shí)例獲得的m個(gè)激活x求得的均值E(x)并除以求得的方差Var(x)來進(jìn)行轉(zhuǎn)換奏属。
上文說過經(jīng)過這個(gè)變換后某個(gè)神經(jīng)元的激活x形成了均值為0,方差為1的正態(tài)分布潮峦,目的是把值往后續(xù)要進(jìn)行的非線性變換的線性區(qū)拉動(dòng)囱皿,增大導(dǎo)數(shù)值,增強(qiáng)反向傳播信息流動(dòng)性忱嘹,加快訓(xùn)練收斂速度嘱腥。但是這樣會(huì)導(dǎo)致網(wǎng)絡(luò)表達(dá)能力下降,為了防止這一點(diǎn)拘悦,每個(gè)神經(jīng)元增加兩個(gè)調(diào)節(jié)參數(shù)(scale和shift)齿兔,這兩個(gè)參數(shù)是通過訓(xùn)練來學(xué)習(xí)到的,用來對(duì)變換后的激活反變換础米,使得網(wǎng)絡(luò)表達(dá)能力增強(qiáng)分苇,即對(duì)變換后的激活進(jìn)行如下的scale和shift操作,這其實(shí)是變換的反操作:
BN其具體操作流程屁桑,如論文中描述的一樣:
過程非常清楚医寿,就是上述公式的流程化描述,這里不解釋了蘑斧,直接應(yīng)該能看懂靖秩。
|BatchNorm的推理過程
BN在訓(xùn)練的時(shí)候可以根據(jù)Mini-Batch里的若干訓(xùn)練實(shí)例進(jìn)行激活數(shù)值調(diào)整,但是在推理(inference)的過程中竖瘾,很明顯輸入就只有一個(gè)實(shí)例沟突,看不到Mini-Batch其它實(shí)例,那么這時(shí)候怎么對(duì)輸入做BN呢捕传?因?yàn)楹苊黠@一個(gè)實(shí)例是沒法算實(shí)例集合求出的均值和方差的惠拭。這可如何是好?這可如何是好乐横?這可如何是好求橄?
既然沒有從Mini-Batch數(shù)據(jù)里可以得到的統(tǒng)計(jì)量今野,那就想其它辦法來獲得這個(gè)統(tǒng)計(jì)量葡公,就是均值和方差√跛可以用從所有訓(xùn)練實(shí)例中獲得的統(tǒng)計(jì)量來代替Mini-Batch里面m個(gè)訓(xùn)練實(shí)例獲得的均值和方差統(tǒng)計(jì)量催什,因?yàn)楸緛砭痛蛩阌萌值慕y(tǒng)計(jì)量,只是因?yàn)橛?jì)算量等太大所以才會(huì)用Mini-Batch這種簡化方式的宰睡,那么在推理的時(shí)候直接用全局統(tǒng)計(jì)量即可蒲凶。
決定了獲得統(tǒng)計(jì)量的數(shù)據(jù)范圍气筋,那么接下來的問題是如何獲得均值和方差的問題。很簡單旋圆,因?yàn)槊看巫鯩ini-Batch訓(xùn)練時(shí)宠默,都會(huì)有那個(gè)Mini-Batch里m個(gè)訓(xùn)練實(shí)例獲得的均值和方差,現(xiàn)在要全局統(tǒng)計(jì)量灵巧,只要把每個(gè)Mini-Batch的均值和方差統(tǒng)計(jì)量記住搀矫,然后對(duì)這些均值和方差求其對(duì)應(yīng)的數(shù)學(xué)期望即可得出全局統(tǒng)計(jì)量,即:
有了均值和方差刻肄,每個(gè)隱層神經(jīng)元也已經(jīng)有對(duì)應(yīng)訓(xùn)練好的Scaling參數(shù)和Shift參數(shù)瓤球,就可以在推導(dǎo)的時(shí)候?qū)γ總€(gè)神經(jīng)元的激活數(shù)據(jù)計(jì)算NB進(jìn)行變換了,在推理過程中進(jìn)行NB采取如下方式:
這個(gè)公式其實(shí)和訓(xùn)練時(shí):
是等價(jià)的敏弃,通過簡單的合并計(jì)算推導(dǎo)就可以得出這個(gè)結(jié)論卦羡。那么為啥要寫成這個(gè)變換形式呢?我猜作者這么寫的意思是:在實(shí)際運(yùn)行的時(shí)候麦到,按照這種變體形式可以減少計(jì)算量绿饵,為啥呢?因?yàn)閷?duì)于每個(gè)隱層節(jié)點(diǎn)來說:
都是固定值瓶颠,這樣這兩個(gè)值可以事先算好存起來蝴罪,在推理的時(shí)候直接用就行了,這樣比原始的公式每一步驟都現(xiàn)算少了除法的運(yùn)算過程步清,乍一看也沒少多少計(jì)算量要门,但是如果隱層節(jié)點(diǎn)個(gè)數(shù)多的話節(jié)省的計(jì)算量就比較多了。
|BatchNorm的好處
BatchNorm為什么NB呢廓啊,關(guān)鍵還是效果好欢搜。不僅僅極大提升了訓(xùn)練速度,收斂過程大大加快谴轮,還能增加分類效果炒瘟,一種解釋是這是類似于Dropout的一種防止過擬合的正則化表達(dá)方式,所以不用Dropout也能達(dá)到相當(dāng)?shù)男Ч诓健A硗庹{(diào)參過程也簡單多了疮装,對(duì)于初始化要求沒那么高,而且可以使用大的學(xué)習(xí)率等粘都±疲總而言之,經(jīng)過這么簡單的變換翩隧,帶來的好處多得很樊展,這也是為何現(xiàn)在BN這么快流行起來的原因。