Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift論文筆記

論文地址:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

前言

雖然GoogLeNet在ILSVRC2014上斬獲了各種大獎,但是GooGle的各位大牛依然沒有閒着,他們馬上又拋出了一個新的問題:Internal Covariate Shift,也就是本文要研究的問題,他們提出了一個新的層:Batch Normalization(BN),不僅能夠很好的解決這個問題,而且在增快訓練速度的基礎上能夠有效的提高模型的性能。

Internal Convariate Shift

以下是載自於李理:卷積神經網絡之Batch Normalization的原理及實現中的一段話:

如果訓練時和測試時輸入的分佈變化,會給模型帶來問題。當然在日常的應用中,這個問題一般不會太明顯,因爲一般情況數據的分佈差別不會太大,但是在很深的網絡裏這個問題會帶來問題,使得訓練收斂速度變慢。因爲前面的層的結果會傳遞到後面的層,而且層次越多,前面的細微變化就會帶來後面的巨大變化。如果某一層的輸入分佈總是變化的話,那麼它就會無所適從,很難調整好參數。我們一般會對輸入數據進行”白化“除理,使得它的均值是0,方差是1。但是之後的層就很難保證了,因爲隨着前面層參數的調整,後面的層的輸入是很難保證的。比較壞的情況是,比如最後一層,經過一個minibatch,把參數調整好的比之前好一些了,但是它之前的所有層的參數也都變了,從而導致下一輪訓練的時候輸入的範圍都發生變化了,那麼它肯定就很難正確的分類了。這就是所謂的Internal Covariate Shift。

簡言之就是:先前層參數的調整會導致之後每一層輸入值的分佈發生變化,所以在深度神經網絡模型的訓練中, 通常需要細緻選取初始參數並採取較小的學習率。

數據預處理

常用的數據預處理手段,如歸一化(normalization)、PCA/ZCA白化(whitening),能夠對數據進行去均值、標準方差、去相關等操作,使得網絡訓練的收斂速度加快。如果在模型的每一層的輸入都使用類似的預處理操作,就可以實現輸入的固定分佈,從而能夠有效的消除Internal Convariate Shift的影響。如下圖所示:
這裏寫圖片描述
原始數據分佈如a所示,如果要對它直接進行擬合會比較難(b的紅色虛線到紫色實線),如果進過去均值(c),和去相關(d)操作,這樣就可以明顯的提升訓練的效率和效果。
但是類似於白化的操作要參考所有的樣本,並且需要計算協方差矩陣、求逆等操作,計算量很大,同時,在反向傳播時,白化操作不一定處處可導。因此在每一層都加一個類似於白化的操作是不現實的,但是也爲接下來的工作提供了很好的思路。

Batch Normalization

白化的計算代價太大,而且不是處處可導,因此作者做出了兩個簡化。

第一個簡化:在數據的每一個維度上進行歸一化,即對於一個d維的輸入這裏寫圖片描述,我們對每一個維度進行歸一化:
這裏寫圖片描述
雖然這無法消除數據間的相關性,但是能夠提高模型的收斂速度。
但是這樣一個簡單的歸一化操作可能會影響到該層所學習到的特徵,例如對sigmoid函數,如果使用這個簡單的歸一化操作,可能會將數據限制在sigmoid的線性部分,如下圖,這樣非線性函數就失去的意義。
這裏寫圖片描述
於是作者又提出了兩個參數:這裏寫圖片描述來對歸一化後的值進行縮放和偏移:這裏寫圖片描述,從而恢復該層所學到的分佈。這樣的話,上面的問題便迎刃而解。值得注意的是,這裏寫圖片描述這兩個參數也是訓練所得,即對於每一個神經元,都會有一對這樣的參數。

第二個簡化:既然模型是使用mini-batch來進行前向和反向計算,那麼對於每一個batch的激活也可以是用該batch的數據來對均值和方差進行估計。

這樣的話,整個Batch Normalization的前向公式爲:
這裏寫圖片描述
同時它還是處處可導的,它的反向求導公式爲:
這裏寫圖片描述

BN的推理過程

依賴小批量數據的BN在訓練過程中,可以利用batch的信息對數據進行歸一化,能夠有效的加速訓練,但是在推理過程(inference)中,可能無法利用到batch的信息(假設只有一個測試樣本),這樣的話,沒有均值,沒有方差,該如何進行歸一化計算這裏寫圖片描述呢?

作者的做法是,利用訓練的mini-batch中計算的均值的期望和方差的期望來作爲全部樣本均值和方差的無偏估計,即:
這裏寫圖片描述
再加上訓練得到的這裏寫圖片描述,就可以得到BN層的輸出:
這裏寫圖片描述
這樣除了x和y以外,所有值在模型訓練完畢後就已經固定了,這就相當於對輸入x的一個線性變換。

CNN的BN

作者提到,在卷積層的輸出和非線性層(sigmoid或ReLU)的輸入之間使用BN層,在不在卷積層的輸入之前使用BN,原因是卷積層的輸入通常爲非線性層的輸出,其分佈可能在訓練過程中發生改變,依然會產生Internal Covariate Shift的問題,而在卷積層後,這裏寫圖片描述 具有更均衡、非稀疏的分佈,對它進行歸一化能夠產生更加穩定的非線性輸出。同時由於BN的去均值操作,這裏寫圖片描述 中b的作用被忽略,因此輸出變爲:這裏寫圖片描述
由於卷積層具有權值共享性,因此對於每一個feature map,共享一組這裏寫圖片描述,即對於mini-batch大小爲m,feature map尺寸爲p*q,在BN的計算中,batch的大小應該爲m*p*q。

BN的作用

  1. 可以使用更大的學習率,加速訓練,加速訓練,加速訓練(重要的事情說三遍,在模型訓練中真正體會到了什麼叫做兵貴神速啊)。
  2. 提高了模型下的正則化,可以去除dropout、L2正則化。
  3. 不再需要LRN層,BN本身能起到normalization的效果。

實驗

從sigmoid輸入的分佈上來看,分佈更加穩定,能夠提高模型的準確性。
這裏寫圖片描述

對於ImageNet分類上,作者使用了GoogLeNet Inception的改進:增加了BN層;將5*5的卷積層使用兩個3*3卷積層的堆疊來替代(與vgg類似),模型的框架如下:
這裏寫圖片描述
可以參照GoogLeNet Inception V1

實驗結果:
這裏寫圖片描述
這裏寫圖片描述
其中x5和x30分別爲將學習率提高了5倍和30倍。結果表明,使用BN能夠大大提高收斂速度,例如BN-x5達到與Inception相同的72.2%準確率,訓練速度提高了14倍。同時在精度上也得到了提高。

這裏寫圖片描述
在essemble的分類top1和top5錯誤率上,使用BN的性能也好於其他模型。

學習參考:《Batch Normalization Accelerating Deep Network Training by Reducing Internal Covariate Shift》閱讀筆記與實現

發佈了43 篇原創文章 · 獲贊 333 · 訪問量 52萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章