作為讀paper系列的第一篇,算是給新年立個flag吧湃鹊。以前看東西不習(xí)慣整理,到現(xiàn)在遇到瓶頸了镣奋,很多東西你看懂了但是沒辦法說給別人聽懂币呵,那說明還是沒有理解到位,希望借博客來提高自己的表達和快速梳理的能力吧侨颈。本文也是供自己備忘查閱余赢,有錯誤和不到位的地方希望大家指出。
引言
神經(jīng)網(wǎng)絡(luò)雖然強大哈垢,但是其訓(xùn)練過程十分復(fù)雜妻柒,往往涉及到復(fù)雜的調(diào)參技巧,網(wǎng)絡(luò)越深就越難調(diào)耘分,業(yè)內(nèi)人士常常調(diào)侃自己是“煉丹師”举塔。優(yōu)化困難的原因之一就是網(wǎng)絡(luò)的輸入(或隱藏層輸出分布)在不斷變化,使得網(wǎng)絡(luò)得不斷地學(xué)習(xí)“新”的分布求泰,疲于奔命央渣,如果能把變化的數(shù)據(jù)映射到某個固定的分布上,這將更利于網(wǎng)絡(luò)的學(xué)習(xí)和收斂拜秧。圖像任務(wù)中我們會把輸入做一個減均值除以方差的預(yù)處理痹屹,實際上這就是將輸入數(shù)據(jù)映射到了一個更易學(xué)習(xí)的分布上,而Batch Normalization則是將這種操作拓展到了網(wǎng)絡(luò)的內(nèi)部枉氮。為了更好地理解Batch Normalization的思想志衍,我們簡單補充一下Covariate Shift、Internal Covariate Shift和Whitening的知識聊替,讀者也可以參考[2]的介紹楼肪。本文分成三個部分,前兩個部分作為鋪墊惹悄,若想直入主題的朋友可直接跳到最后的部分(Batch Normalization)春叫。
(一)Covariate Shift和Internal Covariate Shift
當(dāng)學(xué)習(xí)系統(tǒng)的輸入分布發(fā)生了變化,我們就稱發(fā)生了Covariate Shift(協(xié)變量漂移泣港,簡稱CS)暂殖。在模型的訓(xùn)練和測試兩個階段都可能發(fā)生CS,如果在訓(xùn)練過程當(dāng)中發(fā)生了CS当纱,那模型就需要不斷地去學(xué)習(xí)新的分布呛每,降低了學(xué)習(xí)效率,并且分布的復(fù)雜程度可能超過了模型容量坡氯,降低了學(xué)習(xí)效果晨横。如果在測試中發(fā)生了CS洋腮,則破壞了機器學(xué)習(xí)中的獨立同分布假設(shè)(IID),常規(guī)的機器學(xué)習(xí)是要假設(shè)訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)的分布是一致的手形,如果測試集分布和訓(xùn)練集的分布存在差異啥供,則模型精度將會下降,這就像給學(xué)生考了一道超綱的題库糠,沒學(xué)過自然做不出來伙狐。
我們可以將CS的問題推廣到網(wǎng)絡(luò)的中間層,[1]將Internal Covariate Shift(內(nèi)部協(xié)變量漂移瞬欧,簡稱ICS)定義成:由于網(wǎng)絡(luò)在訓(xùn)練過程中參數(shù)的更新而導(dǎo)致網(wǎng)絡(luò)隱藏層輸出分布的發(fā)生變化鳞骤。比如我們可以將中的看作是的輸入,在網(wǎng)絡(luò)的訓(xùn)練過程中黍判,會隨著參數(shù)的變化而發(fā)生變化豫尽,導(dǎo)致F2難以學(xué)習(xí)。
(二)Whitening和Normalization
Whitening(白化)是一種數(shù)據(jù)預(yù)處理過程顷帖,其目的是降低輸入數(shù)據(jù)的冗余性美旧,因為白化后的數(shù)據(jù)具有白噪聲的特征,所以我們稱之為“whitening”贬墩。白化后的數(shù)據(jù)具有一致的分布榴嗅,能夠加快網(wǎng)絡(luò)收斂。
然而因為嚴(yán)格的Whitening涉及到矩陣分析陶舞,計算復(fù)雜嗽测,我們通常會用Normalization(歸一化)來替代白化,Normalization就是將分布變換為均值方差一致的分布肿孵,我們常用的減均值除以方差就是一種Normalization操作唠粥。雖然均值方差一致不等于分布一致,但是因為它也是對數(shù)據(jù)的分布做了簡單約束停做,能在一定程度上緩解CS或ICS問題晤愧,并且它的計算速度快和可微性好,所以Bath Normalization使用的是Normalization而不是嚴(yán)格的Whitening.
另外蛉腌,關(guān)于Normalization后為什么可以加快收斂官份,還可以參考李宏毅老師網(wǎng)課的BatchNormalization一節(jié),[3]是我在網(wǎng)上找到的一個網(wǎng)友的筆記烙丛。
Towards Reducing Internal Covariate Shift
在[1]中Towards Reducing Internal Covariate Shift章節(jié)舅巷,作者說了他們?yōu)槭裁词褂肗ormalization來緩解ICS的思路,我沒怎么讀懂河咽,網(wǎng)上相關(guān)的解讀也很少钠右,但我感覺這一段很重要,科研的過程不僅是要看結(jié)果库北,了解結(jié)果產(chǎn)生的過程和思路才是更重要的爬舰,比如[4]就接使用Whitening來緩解ICS。我有時間研究清楚之后再來更新寒瓦,我先把目前的思路寫在下面情屹。
既然前人的工作對輸入數(shù)據(jù)做了Whitening并取得了加速收斂的效果,那么一個拍腦袋的緩解ICS的辦法就是對每一層的輸出也使用Whitening杂腰。BN作者剛開始研究的時做了一個簡單嘗試垃你。考慮某一層的輸出為喂很,為該層輸入惜颇,為可學(xué)習(xí)參數(shù),遍歷整個數(shù)據(jù)集得到少辣。我們現(xiàn)在要將白化得到(簡單起見凌摄,只考慮減均值的過程)。在反向傳播的時候我們需要更新參數(shù)漓帅,得到锨亏,如果優(yōu)化器忽略掉和的相關(guān)性的話(顯然是有關(guān)的),會有忙干,那么在下一次訓(xùn)練時器予,,在隨后的輸出中捐迫,歸一化就失效了乾翔。隨著訓(xùn)練的繼續(xù),會越來越大施戴,如果加上尺度歸一化的話這個問題會更加嚴(yán)重反浓。
上述的問題就在于優(yōu)化過程沒有意識到歸一化。我們在求梯度的時候應(yīng)該把歸一化過程給考慮進去赞哗」聪埃考慮一個,歸一化的輸出不僅依賴于當(dāng)前的輸入懈玻,還依賴整個數(shù)據(jù)集巧婶。如果要進行嚴(yán)格的白化操作,在反向傳播的時候我們就需要求兩個雅可比行列式:和涂乌,忽略第二個式子就會導(dǎo)致前面說的問題艺栈。嚴(yán)格的白化會涉及到復(fù)雜計算,效率低湾盒,所以本文使用簡單的歸一化湿右,并且使用mini-batch代替整個數(shù)據(jù)集來加快計算。
(這一段我也是不知所云罚勾,如果誰讀懂了希望能夠給我指點一下)
Batch Normalization
本章會介紹BN的具體計算方法:歸一化+去歸一化毅人,然后結(jié)合我的實驗經(jīng)驗闡述訓(xùn)練和測試中的一些事項吭狡。
(一)計算方法
BN的計算可以分成兩個步驟:歸一化+去歸一化。首先是歸一化丈莺,為了減少ICS划煮,同時使得算法利于集成到訓(xùn)練過程中,Batch Normalization(BN)做了兩點簡化:1)使用特征Normalization代替Whitening缔俄;2)只mini-batch代替整個訓(xùn)練集來計算統(tǒng)計量弛秋。對于一個維的特征,BN首先對其進行歸一化:
為樣本方差俐载,為方差的無偏估計蟹略,
m為batch size,是為了防止除以0的一個微小常數(shù)遏佣。這樣變換后得到的服從均值為0挖炬,方差為1的分布。
然后是去歸一化状婶。去歸一化操作實際上就是一個縮放平移操作茅茂,如果把網(wǎng)絡(luò)每一層的特征都歸一化會限制網(wǎng)絡(luò)的學(xué)習(xí)能力,比如sigmod函數(shù)本來可以作為門限函數(shù)表示開/關(guān)的邏輯信息太抓,但是歸一化后就將只能將特征限定在線性區(qū)域了空闲,所以作者在歸一化后又進行了一次線性變換:,其中和都是可學(xué)習(xí)的走敌,當(dāng)碴倾,時,整個BN層就是恒等變換掉丽。去歸一化操作還可以這么去理解跌榔,歸一化操作限制了網(wǎng)絡(luò)的學(xué)習(xí)能力,去歸一化操作引入了新的可學(xué)習(xí)參數(shù)捶障,把丟失的學(xué)習(xí)能力又補了上來僧须。
整個BN的算法流程如下:
讀到這里,大家可能會有疑問项炼,因為最后的scale and shift的操作担平,使得BN的輸出并不是歸一化的,這不是與減少ICS的初衷相悖嗎锭部?同樣的問題也在[5]中被指出了暂论。而我的理解是,雖然BN的輸出不一定是歸一化的拌禾,但是它引入的中間量是一個歸一化分布取胎,這個變量對于加速網(wǎng)絡(luò)收斂非常重要。我們可以這樣理解:如果把看作輸入,將和以及后面的網(wǎng)絡(luò)都看作是一個用于學(xué)習(xí)的分布的系統(tǒng)闻蛀,比起學(xué)習(xí)更復(fù)雜的的分布匪傍,學(xué)習(xí)歸一化分布自然更簡單。
(二)實驗啟發(fā)
1.關(guān)于BN參數(shù)的初始化觉痛。其實我自己在實驗過程中發(fā)現(xiàn)有很多工程實際上直接令BN層的beta=0和gamma=1役衡,然后凍結(jié)這兩個參數(shù),相當(dāng)于把BN退化成一個特征歸一化層秧饮,實際效果也很好。另外還有一個經(jīng)驗就是如果要在一些預(yù)訓(xùn)練模型上加入BN層泽篮,比如VGG出來的時候還沒有BN技術(shù)盗尸,如果我們直接在原有網(wǎng)絡(luò)上加BN,可能會破壞預(yù)訓(xùn)練的狀態(tài)帽撑,那我們可以將參數(shù)初始化成泼各,
,這樣BN的初態(tài)就是一個恒等變換了亏拉,可以讓網(wǎng)絡(luò)可以有一個比較好的初態(tài)扣蜻。
2.關(guān)于測試階段。我們會希望測試樣本是獨立的及塘,也就是說測試樣本間不能互相影響莽使,比如我們不希望這次以batch size=1測試得到一個結(jié)果A,下次以batch size=2測試笙僚,卻得到不一樣的結(jié)果B芳肌。BN的計算過程中會涉及到兩個統(tǒng)計量:均值(mean)和方差(var)。我們在測試時要使用固定的mean和var肋层,測試階段一般是使用訓(xùn)練集的mean和var亿笤。主流的自動微分框架會在訓(xùn)練時用滑動平均的方式統(tǒng)計mean和var,當(dāng)你使用測試模式的時候栋猖,框架會自動載入統(tǒng)計好的mean與var净薛。比如MXNet會使用下式來統(tǒng)計均值與方差:
通常momentum會設(shè)得很大,比如0.99蒲拉,以便得到更準(zhǔn)確的統(tǒng)計值肃拜,如果你發(fā)現(xiàn)模型在訓(xùn)練和測試時表現(xiàn)差異太大,可以檢查下這個值雌团。
3.關(guān)于先激活再BN爆班,還是先BN再激活。我把前者簡稱后置BN辱姨,后者簡稱前置BN柿菩。[1]中采用的是前置BN,但實際實驗中我發(fā)現(xiàn)兩者差異并不大(有時后置BN效果反而更好一點)雨涛∈嗖埃可能有的人認(rèn)為只有前置BN才會輸出歸一化的值懦胞,才能有效果,但如我在(一)計算方法一節(jié)中說的那樣凉泄,這兩種方法的最終輸出都不是歸一化的躏尉,關(guān)鍵在于兩者都引入了歸一化的中間量。我在文末提供了相關(guān)的拓展閱讀后众,[6]為網(wǎng)友討論胀糜,[7]提供了直觀的實驗結(jié)果。
4.關(guān)于BN為什么能夠加速收斂蒂誉。這個問題在[1]的Experiments部分有詳細的討論教藻。(1)BN可以將特征約束在激活函數(shù)的線性區(qū)域,緩解梯度消失右锨;(2)在網(wǎng)絡(luò)的多層都加入BN可以緩解訓(xùn)練的發(fā)散問題括堤,允許采用更大的學(xué)習(xí)率;(3)隨機采樣提供了一定的正則化約束绍移,有防過擬合的效果悄窃。
總結(jié)
BN通過引入層內(nèi)的批歸一化操作對特征進行歸一化,減少ICS蹂窖,實現(xiàn)了加速網(wǎng)絡(luò)收斂的效果轧抗。但關(guān)于BN為什么不直接使用白化操作我還沒理解,可能進一步閱讀[4]和Group Normalization后能找到答案瞬测。
參考資料
[1]Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
[2]Internal Covariate Shift與Normalization
[3]12. 批標(biāo)準(zhǔn)化(Batch Normalization
[4]Decorrelated Batch Normalization
[5]Intro to Optimization in Deep Learning: Busting the Myth About Batch Normalization
[6]Batch Normalization before or after ReLU?
[7]caffenet-benchmark/batchnorm.md