解毒batch normalization
本文轉載自:http://blog.csdn.net/shuzfan/article/details/50723877
本次所講的內容為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效果要好。
相關文章
- TensorFlow實現Batch NormalizationBATORM
- 深度學習中 Batch Normalization深度學習BATORM
- tensorflow使用BN—Batch NormalizationBATORM
- batch normalization學習理解筆記BATORM筆記
- 【深度學習筆記】Batch Normalization (BN)深度學習筆記BATORM
- BN(Batch Normalization)層的詳細介紹BATORM
- Batch Normalization: 如何更快地訓練深度神經網路BATORM神經網路
- 深度學習(二十九)Batch Normalization 學習筆記深度學習BATORM筆記
- 卷積神經網路CNN(2)—— BN(Batch Normalization) 原理與使用過程詳解卷積神經網路CNNBATORM
- Layer NormalizationORM
- 【BATCH】BATCH-CopyBAT
- jdbc batchJDBCBAT
- 深度學習中的Normalization模型深度學習ORM模型
- TSM BATCH模式BAT模式
- [PyTorch 學習筆記] 6.2 NormalizationPyTorch筆記ORM
- 陪你解讀Spring Batch(一)Spring Batch介紹SpringBAT
- 5 Fansites Q & A BatchBAT
- Batch Scripting TutorialBAT
- 陪你解讀Spring Batch(二)帶你入手Spring BatchSpringBAT
- Batch入門教程(2)BAT
- Learning with Mini-BatchBAT
- 聊聊jdbc的batch操作JDBCBAT
- Spring Batch專題SpringBAT
- nuget packages batch installPackageBAT
- Using svn in CLI with BatchBAT
- SAP 批次管理(Batch management)BAT
- Spring Batch 簡介SpringBAT
- 神經網路常見引數解釋:epoch、batch、batch size、step、iteration神經網路BAT
- batch、epoch、iteration的區別BAT
- MySQL使用Batch批量處理MySqlBAT
- Use windows batch script to create menuWindowsBAT
- 為什麼我們要給Google文化一支解毒劑Go
- 深度學習中的Normalization模型(附例項&公式)深度學習ORM模型公式
- codeurjc/spring-mail-batch:使用Spring Batch批次傳送電子郵件SpringAIBAT
- Spring Boot整合Spring BatchSpring BootBAT
- SAP Batch Derivation功能初探之二BAT
- SAP Batch Derivation功能初探之一BAT
- flink batch dataset 的基本操作BAT