解读Batch Normalization
解讀Batch Normalization
2016-02-23 16:03 5262人閱讀 評論(1) 收藏 舉報 本文章已收錄于: 分類: 深度學習基礎(10) 作者同類文章X版權聲明:本文為博主原創文章,轉載請注明出處
目錄(?)[+]
目錄
-
- 目錄
- 1-Motivation
- 2-Normalization via Mini-Batch Statistics
- 測試
- BN before or after Activation
- 3-Experiments
- 目錄
本次所講的內容為Batch Normalization,簡稱BN,來源于《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》,是一篇很好的paper。
1-Motivation
作者認為:網絡訓練過程中參數不斷改變導致后續每一層輸入的分布也發生變化,而學習的過程又要使每一層適應輸入的分布,因此我們不得不降低學習率、小心地初始化。作者將分布發生變化稱之為 internal covariate shift。
大家應該都知道,我們一般在訓練網絡的時會將輸入減去均值,還有些人甚至會對輸入做白化等操作,目的是為了加快訓練。為什么減均值、白化可以加快訓練呢,這里做一個簡單地說明:
首先,圖像數據是高度相關的,假設其分布如下圖a所示(簡化為2維)。由于初始化的時候,我們的參數一般都是0均值的,因此開始的擬合y=Wx+b,基本過原點附近,如圖b紅色虛線。因此,網絡需要經過多次學習才能逐步達到如紫色實線的擬合,即收斂的比較慢。如果我們對輸入數據先作減均值操作,如圖c,顯然可以加快學習。更進一步的,我們對數據再進行去相關操作,使得數據更加容易區分,這樣又會加快訓練,如圖d。
白化的方式有好幾種,常用的有PCA白化:即對數據進行PCA操作之后,在進行方差歸一化。這樣數據基本滿足0均值、單位方差、弱相關性。作者首先考慮,對每一層數據都使用白化操作,但分析認為這是不可取的。因為白化需要計算協方差矩陣、求逆等操作,計算量很大,此外,反向傳播時,白化操作不一定可導。于是,作者采用下面的Normalization方法。
2-Normalization via Mini-Batch Statistics
數據歸一化方法很簡單,就是要讓數據具有0均值和單位方差,如下式:
但是作者又說如果簡單的這么干,會降低層的表達能力。比如下圖,在使用sigmoid激活函數的時候,如果把數據限制到0均值單位方差,那么相當于只使用了激活函數中近似線性的部分,這顯然會降低模型表達能力。
為此,作者又為BN增加了2個參數,用來保持模型的表達能力。
于是最后的輸出為:
上述公式中用到了均值E和方差Var,需要注意的是理想情況下E和Var應該是針對整個數據集的,但顯然這是不現實的。因此,作者做了簡化,用一個Batch的均值和方差作為對整個數據集均值和方差的估計。
整個BN的算法如下:
求導的過程也非常簡單,有興趣地可以自己再推導一遍或者直接參見原文。
測試
實際測試網絡的時候,我們依然會應用下面的式子:
特別注意: 這里的均值和方差已經不是針對某一個Batch了,而是針對整個數據集而言。因此,在訓練過程中除了正常的前向傳播和反向求導之外,我們還要記錄每一個Batch的均值和方差,以便訓練完成之后按照下式計算整體的均值和方差:
BN before or after Activation
作者在文章中說應該把BN放在激活函數之前,這是因為Wx+b具有更加一致和非稀疏的分布。但是也有人做實驗表明放在激活函數后面效果更好。這是實驗鏈接,里面有很多有意思的對比實驗:https://github.com/ducha-aiki/caffenet-benchmark
3-Experiments
作者在文章中也做了很多實驗對比,我這里就簡單說明2個。
下圖a說明,BN可以加速訓練。圖b和c則分別展示了訓練過程中輸入數據分布的變化情況。
下表是一個實驗結果的對比,需要注意的是在使用BN的過程中,作者發現Sigmoid激活函數比Relu效果要好。
- 上一篇系列解讀Dropout
- 下一篇GoogLeNet系列解讀
我的同類文章
深度學習基礎(10) http://blog.csdn.net- ?CNN不能識別Negative圖像2017-04-10閱讀849
- ?深度模型一些新的運行框架或者輔助庫工具等2016-11-04閱讀1399
- ?深度學習——PReLU激活2016-05-08閱讀4060
- ?GoogLeNet系列解讀2016-02-25閱讀13083
- ?多尺度競爭卷積2016-01-12閱讀1248
- ?思考深度學習的泛化能力2017-02-20閱讀617
- ?深度學習——MSRA初始化2016-05-08閱讀3364
- ?深度學習——Xavier初始化方法2016-05-07閱讀9004
- ?系列解讀Dropout2016-01-25閱讀1880
- ?mxnet學習記錄【1】2015-12-01閱讀10031
參考知識庫
軟件測試知識庫
4519關注|318收錄
算法與數據結構知識庫
15752關注|2320收錄
核心技術類目
全部主題HadoopAWS移動游戲JavaAndroidiOSSwift智能硬件DockerOpenStackVPNSparkERPIE10EclipseCRMJavaScript數據庫UbuntuNFCWAPjQueryBIHTML5SpringApache.NETAPIHTMLSDKIISFedoraXMLLBSUnitySplashtopUMLcomponentsWindows MobileRailsQEMUKDECassandraCloudStackFTCcoremailOPhone CouchBase云計算iOS6Rackspace Web AppSpringSideMaemoCompuware大數據aptechPerlTornadoRubyHibernateThinkPHPHBasePureSolrAngularCloud FoundryRedisScalaDjangoBootstrap總結
以上是生活随笔為你收集整理的解读Batch Normalization的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【视频特辑】数据分析师必备,快速制作一张
- 下一篇: 一文搞懂redis