BN:總的來(lái)說(shuō)仑乌,BN通過(guò)將每一層網(wǎng)絡(luò)的輸入進(jìn)行normalization,保證輸入分布的均值與方差固定在一定范圍內(nèi)霍狰,減少了網(wǎng)絡(luò)中的Internal Covariate Shift問(wèn)題推正,并在一定程度上緩解了梯度消失训柴,加速了模型收斂滩报;并且BN使得網(wǎng)絡(luò)對(duì)參數(shù)锅知、激活函數(shù)更加具有魯棒性,降低了神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練和調(diào)參的復(fù)雜度脓钾;最后BN訓(xùn)練過(guò)程中由于使用mini-batch的mean/variance每次都不同售睹,引入了隨機(jī)噪聲,在一定程度上對(duì)模型起到了正則化的效果惭笑。
Normalization
字面上意思就是標(biāo)準(zhǔn)化,也就是對(duì)輸入的數(shù)據(jù)做標(biāo)準(zhǔn)化,可以用下面的公式表示(這里 代表輸入數(shù)據(jù), n代表訓(xùn)練集大小):
以上可以看出, 標(biāo)準(zhǔn)化以后的數(shù)據(jù)服從均值為0,方差為1的正態(tài)分布
為什么要進(jìn)行Normalization?
在介紹BN之前,先說(shuō)說(shuō)為什么要進(jìn)行Normalization
在神經(jīng)網(wǎng)絡(luò)中, 數(shù)據(jù)分布對(duì)訓(xùn)練會(huì)產(chǎn)生影響. 比如某個(gè)神經(jīng)元 x 的值為1, 某個(gè) Weights 的初始值為 0.1, 這樣后一層神經(jīng)元計(jì)算結(jié)果就是 Wx = 0.1; 又或者 x = 20, 這樣 Wx 的結(jié)果就為 2. 現(xiàn)在還不能看出什么問(wèn)題, 但是, 當(dāng)我們加上一層激勵(lì)函數(shù), 激活這個(gè) Wx 值的時(shí)候, 問(wèn)題就來(lái)了. 如果使用 像 tanh 的激勵(lì)函數(shù), Wx 的激活值就變成了 ~0.1 和 ~1, 接近于 1 的部已經(jīng)處在了 激勵(lì)函數(shù)的飽和階段, 也就是如果 x 無(wú)論再怎么擴(kuò)大, tanh 激勵(lì)函數(shù)輸出值也還是接近1. 換句話(huà)說(shuō), 神經(jīng)網(wǎng)絡(luò)在初始階段已經(jīng)不對(duì)那些比較大的 x 特征范圍 敏感了. 這樣很糟糕, 想象我輕輕拍自己的感覺(jué)和重重打自己的感覺(jué)居然沒(méi)什么差別, 這就證明我的感官系統(tǒng)失效了. 當(dāng)然我們是可以用之前提到的對(duì)數(shù)據(jù)做 normalization 預(yù)處理, 使得輸入的 x 變化范圍不會(huì)太大, 讓輸入值經(jīng)過(guò)激勵(lì)函數(shù)的敏感部分. 但剛剛這個(gè)不敏感問(wèn)題不僅僅發(fā)生在神經(jīng)網(wǎng)絡(luò)的輸入層, 而且在隱藏層中也經(jīng)常會(huì)發(fā)生.
Normalization的效果:
如上圖,當(dāng)沒(méi)有進(jìn)行normalizatin時(shí),數(shù)據(jù)的分布是任意的,那么就會(huì)有大量的數(shù)據(jù)處在激活函數(shù)的敏感區(qū)域外, 對(duì)這樣的數(shù)據(jù)分布進(jìn)行激活后, 大部分的值都會(huì)變成1或-1,造成激活后的數(shù)據(jù)分布不均衡,而如果進(jìn)行了Normallizatin, 那么相對(duì)來(lái)說(shuō)數(shù)據(jù)的分布比較均衡,如下圖所示:
一句話(huà)總結(jié)就是: 通過(guò)Normalization讓數(shù)據(jù)的分布始終處在激活函數(shù)敏感的區(qū)域
BN的提出背景
https://zhuanlan.zhihu.com/p/34879333
Internal Covariate Shift
Covariate [k?'ve?r?rt]
什么是Internal Covariate Shift:
在深層網(wǎng)絡(luò)訓(xùn)練的過(guò)程中侣姆,由于網(wǎng)絡(luò)中參數(shù)變化而引起內(nèi)部結(jié)點(diǎn)數(shù)據(jù)分布發(fā)生變化的這一過(guò)程被稱(chēng)作Internal Covariate Shift。
帶來(lái)了什么問(wèn)題:
- 上層網(wǎng)絡(luò)需要不停調(diào)整來(lái)適應(yīng)輸入數(shù)據(jù)分布的變化沉噩,導(dǎo)致網(wǎng)絡(luò)學(xué)習(xí)速度的降低
- 網(wǎng)絡(luò)的訓(xùn)練過(guò)程容易陷入梯度飽和區(qū),減緩網(wǎng)絡(luò)收斂速度
如何減緩Internal Covariate Shift:
(1)白化(PCA白化和ZCA白化):
- 使得輸入特征分布具有相同的均值與方差
- 取出特征之間的相關(guān)性
- 通過(guò)白化操作,我們可以減緩ICS的問(wèn)題柱蟀,進(jìn)而固定了每一層網(wǎng)絡(luò)輸入分布川蒙,加速網(wǎng)絡(luò)訓(xùn)練過(guò)程的收斂
白化缺點(diǎn):
- 白化過(guò)程計(jì)算成本太高,并且在每一輪訓(xùn)練中的每一層我們都需要做如此高成本計(jì)算的白化操作长已;
- 白化過(guò)程由于改變了網(wǎng)絡(luò)每一層的分布畜眨,因而改變了網(wǎng)絡(luò)層中本身數(shù)據(jù)的表達(dá)能力昼牛。底層網(wǎng)絡(luò)學(xué)習(xí)到的參數(shù)信息會(huì)被白化操作丟失掉。
于是就提出了BN
什么是Batch Normalization
傳統(tǒng)的Normalization使用的均值和方差是整個(gè)訓(xùn)練集的均值和方差, 并且只對(duì)輸入層的數(shù)據(jù)做歸一化, 而B(niǎo)atch Normalization按字面意思就是對(duì)每一批數(shù)據(jù)進(jìn)行歸一化, 同時(shí)會(huì)對(duì)每一層輸入做歸一化, 所以, 首先要將傳統(tǒng)的標(biāo)準(zhǔn)化中的n改為m, m表示一個(gè)batch的大小,如下所示:
傳統(tǒng)的Normalization直接使用了減均值除方差的方式來(lái)進(jìn)行標(biāo)準(zhǔn)化, 但是, 這樣一概而全的方法未必對(duì)所有數(shù)據(jù)來(lái)說(shuō)就是最優(yōu)的, 比如數(shù)據(jù)本身就不對(duì)稱(chēng), 或者激活函數(shù)未必對(duì)方差為1的數(shù)據(jù)有最好的效果, 所以, BN的想法是在傳統(tǒng)標(biāo)準(zhǔn)化之后再加上一個(gè)線(xiàn)性變換,如下所示:
其中, 和
是兩個(gè)需要學(xué)習(xí)的參數(shù), ** 可以看出, BN的本質(zhì)就是利用參數(shù)優(yōu)化來(lái)改變一下數(shù)據(jù)分布的方差大小和均值的位置. **
BN的優(yōu)點(diǎn)
(1)BN使得網(wǎng)絡(luò)中每層輸入數(shù)據(jù)的分布相對(duì)穩(wěn)定康聂,加速模型學(xué)習(xí)速度
(2)BN使得模型對(duì)初始化方法和網(wǎng)絡(luò)中的參數(shù)不那么敏感贰健,簡(jiǎn)化調(diào)參過(guò)程,使得網(wǎng)絡(luò)學(xué)習(xí)更加穩(wěn)定
(3)BN允許網(wǎng)絡(luò)使用飽和性激活函數(shù)(例如sigmoid恬汁,tanh等)伶椿,緩解梯度消失問(wèn)題
(4)BN具有一定的正則化效果
原因如下:
(1)BN使得網(wǎng)絡(luò)中每層輸入數(shù)據(jù)的分布相對(duì)穩(wěn)定,加速模型學(xué)習(xí)速度
BN通過(guò)規(guī)范化與線(xiàn)性變換使得每一層網(wǎng)絡(luò)的輸入數(shù)據(jù)的均值與方差都在一定范圍內(nèi)氓侧,使得后一層網(wǎng)絡(luò)不必不斷去適應(yīng)底層網(wǎng)絡(luò)中輸入的變化脊另,從而實(shí)現(xiàn)了網(wǎng)絡(luò)中層與層之間的解耦,更加有利于優(yōu)化的過(guò)程,提高整個(gè)神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)速度约巷。
(2)BN使得模型對(duì)初始化方法和網(wǎng)絡(luò)中的參數(shù)不那么敏感偎痛,簡(jiǎn)化調(diào)參過(guò)程,使得網(wǎng)絡(luò)學(xué)習(xí)更加穩(wěn)定
在神經(jīng)網(wǎng)絡(luò)中独郎,我們經(jīng)常會(huì)謹(jǐn)慎地采用一些權(quán)重初始化方法(例如Xavier)或者合適的學(xué)習(xí)率來(lái)保證網(wǎng)絡(luò)穩(wěn)定訓(xùn)練踩麦。當(dāng)學(xué)習(xí)率設(shè)置太高時(shí),會(huì)使得參數(shù)更新步伐過(guò)大氓癌,容易出現(xiàn)震蕩和不收斂...
https://zhuanlan.zhihu.com/p/34879333
(3)BN允許網(wǎng)絡(luò)使用飽和性激活函數(shù)(例如sigmoid谓谦,tanh等),緩解梯度消失問(wèn)題
在不使用BN層的時(shí)候顽铸,由于網(wǎng)絡(luò)的深度與復(fù)雜性茁计,很容易使得底層網(wǎng)絡(luò)變化累積到上層網(wǎng)絡(luò)中,導(dǎo)致模型的訓(xùn)練很容易進(jìn)入到激活函數(shù)的梯度飽和區(qū)谓松;通過(guò)normalize操作可以讓激活函數(shù)的輸入數(shù)據(jù)落在梯度非飽和區(qū)星压,緩解梯度消失的問(wèn)題;另外通過(guò)自適應(yīng)學(xué)習(xí) 與
又讓數(shù)據(jù)保留更多的原始信息鬼譬。
(4)BN具有一定的正則化效果
在Batch Normalization中娜膘,由于我們使用mini-batch的均值與方差作為對(duì)整體訓(xùn)練樣本均值與方差的估計(jì),盡管每一個(gè)batch中的數(shù)據(jù)都是從總體樣本中抽樣得到优质,但不同mini-batch的均值與方差會(huì)有所不同竣贪,這就為網(wǎng)絡(luò)的學(xué)習(xí)過(guò)程中增加了隨機(jī)噪音,與Dropout通過(guò)關(guān)閉神經(jīng)元給網(wǎng)絡(luò)訓(xùn)練帶來(lái)噪音類(lèi)似巩螃,在一定程度上對(duì)模型起到了正則化的效果演怎。
另外,原作者也證明了網(wǎng)絡(luò)加入BN后避乏,可以丟棄Dropout爷耀,模型也同樣具有很好的泛化效果。
BN的具體實(shí)現(xiàn)及其反向傳播
http://www.reibang.com/p/4270f5acc066
https://zhuanlan.zhihu.com/p/27938792
在Caffe2實(shí)現(xiàn)中, BN層需要和Scale層配合使用, 其中, BN專(zhuān)門(mén)用于做歸一化操作, 而后續(xù)的線(xiàn)性變換層, 會(huì)交給Scale層去做.
訓(xùn)練階段:
在訓(xùn)練時(shí)利用當(dāng)前batch的mean和variance來(lái)進(jìn)行BN處理, 同時(shí)使用滑動(dòng)平均的方式不斷的更新global 的mean和variance, 并將其存儲(chǔ)起來(lái).
測(cè)試階段:
在預(yù)測(cè)階段, 直接使用模型存儲(chǔ)好的均值和方差進(jìn)行計(jì)算
使用BN時(shí)應(yīng)注意的問(wèn)題
- 訓(xùn)練/測(cè)試階段的使用
在實(shí)際應(yīng)用中, 均值和方差是通過(guò)滑動(dòng)平均方法在訓(xùn)練數(shù)據(jù)集上得到的, 如果換了其他的任務(wù)或數(shù)據(jù)集, 建議先f(wàn)inetune之后再使用BN層存儲(chǔ)的均值和方差. 同時(shí), 注意訓(xùn)練時(shí)的均值和方差是來(lái)自于當(dāng)前batch的.
- 隱藏層中BN的數(shù)據(jù)大小
在卷積網(wǎng)絡(luò)隱藏層中, BN的大小不單單是batch, 而是batch和特征相應(yīng)圖大小的乘積. 也就是說(shuō), 在隱藏層, 層的輸入是上一層的輸出, 也就是上一層的神經(jīng)元個(gè)數(shù), 而對(duì)于上一層來(lái)說(shuō), 如果輸出的特征相應(yīng)圖大小為 , 那么上一層的神經(jīng)元個(gè)數(shù)就應(yīng)該是
, 其中,b是指batch的大小