解毒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
- batch normalization學習理解筆記BATORM筆記
- 【深度學習筆記】Batch Normalization (BN)深度學習筆記BATORM
- BN(Batch Normalization)層的詳細介紹BATORM
- Batch Normalization: 如何更快地訓練深度神經網路BATORM神經網路
- Layer NormalizationORM
- 深度學習中的Normalization模型深度學習ORM模型
- [PyTorch 學習筆記] 6.2 NormalizationPyTorch筆記ORM
- 陪你解讀Spring Batch(一)Spring Batch介紹SpringBAT
- Batch Scripting TutorialBAT
- 陪你解讀Spring Batch(二)帶你入手Spring BatchSpringBAT
- Spring Batch 簡介SpringBAT
- Learning with Mini-BatchBAT
- 不只是雨夜霓虹:從音樂角度“解毒”賽博朋克
- Spring Boot整合Spring BatchSpring BootBAT
- Batch入門教程(2)BAT
- codeurjc/spring-mail-batch:使用Spring Batch批次傳送電子郵件SpringAIBAT
- 神經網路常見引數解釋:epoch、batch、batch size、step、iteration神經網路BAT
- flink batch dataset 的基本操作BAT
- batch、epoch、iteration的區別BAT
- 深度學習中的Normalization模型(附例項&公式)深度學習ORM模型公式
- SAP Batch Derivation功能初探之二BAT
- SAP Batch Derivation功能初探之一BAT
- 深入分析kube-batch(4)——actionsBAT
- 【小白學PyTorch】21 Keras的API詳解(下)池化、Normalization層PyTorchKerasAPIORM
- 如何從ERP將Material的Batch資訊下載到CRM並儲存在settype COMM_PR_BATCH裡BAT
- Dynamics 365 Web API 批處理(batch requests)WebAPIBAT
- pytorch dataloader和batch_size大小的理解PyTorchBAT
- 梯度累計講解-支援更大的batch梯度BAT
- Vs Code Batch-runner 外掛設定BAT
- Spring Batch + JPA 處理 Excel 檔案教程SpringBATExcel
- CVPR2021 | 重新思考BatchNorm中的BatchBATORM
- 企業計算機中了eking勒索病毒如何解毒,eking勒索病毒檔案恢復計算機
- 在Spring Batch中配置重試邏輯 - BaeldungSpringBAT
- SAP settype COMM_PR_BATCH的下載方式BAT
- maven “Generating project in Batch mode“問題的解決MavenProjectBAT
- Spring Boot 之 Spring Batch 批處理實踐Spring BootBAT