1、為什么提出BN?
訓(xùn)練深層神經(jīng)網(wǎng)絡(luò),由于每層的變化會(huì)導(dǎo)致訓(xùn)練困難,訓(xùn)練速度慢,繼而提出BN實(shí)現(xiàn)訓(xùn)練速度提升的目的。
深度的神經(jīng)網(wǎng)絡(luò)模型會(huì)涉及多個(gè)函數(shù)或?qū)咏M合,在其他層不變的前提下,使用梯度可以更新參數(shù)[1]。
但實(shí)際是所有層同時(shí)更新。每個(gè)層在訓(xùn)練過程中的分布發(fā)生變化,每一層的輸入都受到所有先前層的參數(shù)的影響,因此訓(xùn)練變得復(fù)雜,訓(xùn)練速度也比較慢。訓(xùn)練期間網(wǎng)絡(luò)參數(shù)變化導(dǎo)致的數(shù)據(jù)分布的變化叫做Internal Covariate Shift。
所以在2015年作者提出BN,說是通過降低ICS實(shí)現(xiàn)BN的目的——加速深層網(wǎng)絡(luò)的訓(xùn)練[2]。
2、BN是什么?
Batchnorm全名是Batch Normalization,簡稱BN,即批規(guī)范化??蓱?yīng)用網(wǎng)絡(luò)中任何的輸入層和隱藏層。
Batch 是指操作對(duì)象是mini-batch數(shù)據(jù)(SGD是訓(xùn)練深層網(wǎng)絡(luò)的一種有效方法,使用小批次mini-batch數(shù)據(jù)來訓(xùn)練深度網(wǎng)絡(luò))。
Normalization 標(biāo)準(zhǔn)化顧名思義轉(zhuǎn)換數(shù)據(jù)到均值為0方差為1的數(shù)據(jù)分布,不過BN算法在此基礎(chǔ)上稍微有些改進(jìn)。
算法原理(或者說BN在做些什么?)
Batch Normalizing Transform, applied to activation x over a mini-batch
解讀:
輸入的x是mini-batch的一批數(shù)據(jù);
輸出的是經(jīng)過BN處理后的一批新分布的數(shù)據(jù);
首先,根據(jù)輸入的計(jì)算均值和方差,代入標(biāo)準(zhǔn)化公式得到均值為0方差為1的新數(shù)據(jù)
。這里
是一個(gè)常數(shù),避免分母為0的情況。
然后,引入縮放因子和遷移因子
得到更合適的分布數(shù)據(jù)
。其中
是超參數(shù),在模型訓(xùn)練中不斷學(xué)習(xí)。
圖片來源:https://www.cnblogs.com/skyfsm/p/8453498.html
經(jīng)過BN處理后,每一層的輸入在訓(xùn)練過程中的分布變得相對(duì)穩(wěn)定。
例如小貓貓二分類任務(wù),第i批次都是小黑貓,第j批次的小貓貓顯然有不同的特征分布。由于BN的操作使得壓縮在同一均值和方差下,深度網(wǎng)絡(luò)變得更加穩(wěn)定。
小結(jié):深度網(wǎng)絡(luò)難訓(xùn)練是因?yàn)樗袑佣荚诟?。BN使得網(wǎng)絡(luò)每層的數(shù)據(jù)分布相對(duì)穩(wěn)定,使得每一層可以盡量面對(duì)同一特征分布的輸入值,降低訓(xùn)練難度。
3、BN在神經(jīng)網(wǎng)絡(luò)中是怎么應(yīng)用的?
神經(jīng)網(wǎng)絡(luò)的每個(gè)單元負(fù)責(zé)兩件事情:先計(jì)算,然后應(yīng)用到激活函數(shù)中再計(jì)算
。BN的操作是在激活函數(shù)應(yīng)用前的。

【暫放】BN是如何在CNN網(wǎng)絡(luò)中應(yīng)用的?
4、BN的作用[2]
(1)降低ICS,提升訓(xùn)練穩(wěn)定性,加速網(wǎng)絡(luò)收斂速度。
(2)允許我們使用更高的學(xué)習(xí)率。
(3)不那么依賴參數(shù)初始值。
(4)充當(dāng)正則化,在某些情況下消除了對(duì)Dropout的需要。
(5)深層網(wǎng)絡(luò)使用sigmoid、tanh等激活函數(shù)變得可能。
【暫放】原因說明
5、補(bǔ)充
(1)BN并不是適用于所有任務(wù)
- BN不適合圖像像素到像素的項(xiàng)目。韓國團(tuán)隊(duì)在2017NTIRE圖像超分辨率中取得了top1的成績,主要原因竟是去掉了網(wǎng)絡(luò)中的batchnorm層,由此可見,BN并不是適用于所有任務(wù)的。
- RNN等動(dòng)態(tài)網(wǎng)絡(luò)使用BN效果不佳且使用起來不方便。
詳見來源
(2)為什么使用縮放因子和遷移因子?
如果不引入的處理,每一層的數(shù)據(jù)分布都是標(biāo)準(zhǔn)正態(tài)分布,導(dǎo)致其完全學(xué)習(xí)不到輸入數(shù)據(jù)的特征。
【暫放】更多細(xì)節(jié)的理解
(3)參數(shù)b的舍去
當(dāng)使用BN時(shí),參數(shù)是沒有意義的

【暫放】更多細(xì)節(jié)的理解
(4)預(yù)測(cè)時(shí)均值和方差的計(jì)算
由于均值和方差是基于mini-batch計(jì)算的,但在測(cè)試時(shí),如果只有一個(gè)數(shù)據(jù),此時(shí)根據(jù)一個(gè)數(shù)據(jù)計(jì)算的均值和方差是無意義的。
所以我們會(huì)記錄模型訓(xùn)練過程中的均值和方差,通過track_running_stats控制。預(yù)測(cè)前通過model.eval()固定BN。
CLASS torch.nn.BatchNorm2d(num_features,
eps=1e-05, # 對(duì)應(yīng)分母中的epsilon
momentum=0.1,
affine=True,
track_running_stats=True)

參考資料
[1] 花書 8.7.1 Batch Normalization
[2] 論文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》
[3] 吳恩達(dá)《深度學(xué)習(xí)》調(diào)試處理——BN


