Date: 2020/01/25
Author: CW
前言:
如果你希望對(duì)Batch Normalization有更深入的理解态辛,還請(qǐng)耐心閱讀本文。CW會(huì)一步步為大家解析Batch Normalization挺尿,由淺至深奏黑,并且引出在具體使用中的一些關(guān)鍵點(diǎn),供各位網(wǎng)友參考學(xué)習(xí)编矾,如有不當(dāng)之處熟史,歡迎大家交流與指正,謝謝窄俏!
Outline
i). Why:為什么需要 Batch Normalization蹂匹?
ii). What:Batch Normalization 是什么東東?
iii). How:Batch Normalization 干了什么凹蜈?具體是怎么做的限寞?
iv). Key Point:關(guān)于 Batch Normalization,這些細(xì)節(jié)你都了解嗎仰坦?
v). Summary:Batch Normalization 起到了什么作用履植?
Why:為什么需要 Batch Normalization?
上圖表示的是神經(jīng)網(wǎng)絡(luò)每層的權(quán)重和激活函數(shù)悄晃,每層權(quán)重的更新其實(shí)是在假定其輸入不變的情況下根據(jù)loss結(jié)合反向傳播過程來進(jìn)行的玫霎。但實(shí)際情況是,每層的輸入是前面層的輸出妈橄,而前面層的權(quán)重更新會(huì)導(dǎo)致它的輸出變化庶近,即當(dāng)前層的輸入數(shù)據(jù)就會(huì)跟著變化了,本來上次權(quán)重的更新對(duì)輸入適應(yīng)得不錯(cuò)了眷蚓,但是由于輸入分布又變化了鼻种,于是權(quán)重又得繼續(xù)調(diào)整,而根據(jù)反向傳播過程溪椎,前面層的權(quán)重也會(huì)更新普舆,這樣當(dāng)前層的輸入分布又再次變化恬口,于是當(dāng)前層的權(quán)重在下次更新時(shí)又需根據(jù)新的分布重新調(diào)整...你們說累不累校读?
在此沼侣,順便引入一個(gè)概念——Internal Covariate Shift,即內(nèi)部協(xié)轉(zhuǎn)移歉秫,它是指深層網(wǎng)絡(luò)中由于參數(shù)變化而引起的內(nèi)部數(shù)據(jù)分布變化蛾洛,這會(huì)帶來以下問題:
i). 深層的網(wǎng)絡(luò)需不斷調(diào)整來適應(yīng)淺層網(wǎng)絡(luò)引起的數(shù)據(jù)分布變化,從而影響模型收斂雁芙;
ii). 由于激活函數(shù)的存在轧膘,模型容易在訓(xùn)練過程中陷入梯度飽和區(qū)域。
那么兔甘,如何減緩/規(guī)避這樣的問題呢谎碍?
以往機(jī)器學(xué)習(xí)的傳統(tǒng)做法可以使用如PCA/ZCA這樣的白化操作,但如果用在深度神經(jīng)網(wǎng)絡(luò)中洞焙,計(jì)算成本就太高了蟆淀,傷不起!另外澡匪,反向傳播時(shí)熔任,白化操作還不一定可導(dǎo)。同時(shí)唁情,由于這類操作改變了原數(shù)據(jù)分布疑苔,因而本身數(shù)據(jù)的表達(dá)能力被改變了,低層網(wǎng)絡(luò)學(xué)習(xí)到的參數(shù)信息會(huì)被白化操作丟棄掉甸鸟。
于是惦费,why batch normalization? cuz' we need it!
Batch Normalization 就破蛋而出了。
What:Batch Normalization 是什么東東抢韭?
通過上一節(jié)我們知道薪贫,隨著網(wǎng)絡(luò)深度加深,輸入分布會(huì)逐漸發(fā)生偏移和變動(dòng)篮绰,于是激活函數(shù)的輸入分布很容易處于線性飽和區(qū)域(即這時(shí)激活函數(shù)的輸出值在向其取值區(qū)間的上下限兩端靠近)后雷,從而后向傳播淺層網(wǎng)絡(luò)的梯度逐漸消失,進(jìn)而導(dǎo)致模型收斂變慢吠各。
Batch Normalization臀突,即“批次歸一化”,通常簡稱BatchNorm或BN贾漏,目前廣泛作為神經(jīng)網(wǎng)絡(luò)模型中的一個(gè)網(wǎng)絡(luò)層使用候学。顧名思義,它是基于一個(gè)個(gè)批次(相對(duì)的是全量數(shù)據(jù))的數(shù)據(jù)來進(jìn)行歸一化操作的纵散。它是這樣的一種手段——把網(wǎng)絡(luò)中每層各神經(jīng)元的輸入分布強(qiáng)行拉回到均值為0方差為1的分布(通常是正態(tài)/均勻分布)梳码,從而使激活函數(shù)的輸入落在非線性飽和區(qū)域隐圾,進(jìn)而避免梯度消失,最終使得模型可持續(xù)學(xué)習(xí)至收斂掰茶。
HOW:Batch Normalization 干了什么暇藏?具體是怎么做的?
總的來說濒蒋,BN干以下兩件事情:
i). Normalization:即對(duì)每個(gè)批次的數(shù)據(jù)進(jìn)行歸一化操作盐碱,使其均值為0方差為1;
ii). (可選)Scale & Shift:設(shè)置兩個(gè)可學(xué)習(xí)參數(shù)和
沪伙,對(duì)歸一化后的每個(gè)批次數(shù)據(jù)進(jìn)行縮放和平移瓮顽,使其變?yōu)榱硪环N分布,均值為
围橡,方差為
暖混。
通過以上,你是否發(fā)現(xiàn)以下小秘密:
1炬守、和
為當(dāng)前批次的統(tǒng)計(jì)量牧嫉,不可學(xué)習(xí);
2减途、和
為待學(xué)習(xí)的縮放(scale)和平移(shift)參數(shù)酣藻,分別用于控制方差和均值,即無論
原本的均值和方差是多少鳍置,通過BN后均值和方差將分別變?yōu)?
?和?
(若感到疑惑辽剧,動(dòng)動(dòng)小手自己推一推哈);
3税产、BN層中怕轿,不同神經(jīng)元(通道)的之間不存在信息交流。注意哦辟拷,這代表它們的
?是分別計(jì)算和學(xué)習(xí)的
以上就是BN的具體操作了诀紊,這部分會(huì)發(fā)生在前向反饋過程中,那么你們不免會(huì)問隅俘,后向傳播呢邻奠?客觀稍坐片刻笤喳,CW這就為您上菜!
根據(jù)反向傳播的順序碌宴,首先求取損失loss對(duì)BN層輸出y的偏導(dǎo)杀狡,然后是對(duì)可學(xué)習(xí)參數(shù)的偏導(dǎo)唧喉,用于對(duì)參數(shù)進(jìn)行更新捣卤。接著忍抽,繼續(xù)回傳上一層網(wǎng)絡(luò)八孝,于是需要求對(duì)該BN層輸入x的偏導(dǎo),從而用到對(duì)
以及
的偏導(dǎo)干跛,最終根據(jù)鏈?zhǔn)椒▌t求它們對(duì)x的偏導(dǎo)。
Key Point:關(guān)于 Batch Normalization祟绊,這些細(xì)節(jié)你都了解嗎楼入?
i). 預(yù)測階段如何使用BN?
我們知道牧抽,在訓(xùn)練過程中嘉熊,都是變化的阐肤,而在預(yù)測階段,所有參數(shù)的取值都應(yīng)該是固定的讲坎,那么這時(shí)孕惜,我們?cè)撊绾问褂肂N?
對(duì)于和
晨炕,隨著訓(xùn)練結(jié)束衫画,兩者最終收斂,于是使用訓(xùn)練結(jié)束時(shí)的值即可瓮栗。
對(duì)于和
削罩,在訓(xùn)練階段時(shí)它們是當(dāng)前mini-batch的統(tǒng)計(jì)量,而在預(yù)測階段费奸,輸入數(shù)據(jù)可能只有1條弥激,那么這時(shí)
和
該如何取值呢?可以采用訓(xùn)練至收斂的最后幾批mini-batch的
和
的期望作為這時(shí)的
:
從而换况,BN操作會(huì)時(shí)數(shù)據(jù)進(jìn)行如下轉(zhuǎn)換:
ii). 配合卷積層如何使用BN职辨?
我們知道盗蟆,在卷積層中一個(gè)kernel(卷積核)對(duì)應(yīng)一個(gè)feature map(特征圖),為了保持卷積的性質(zhì)與效果舒裤,因此處于同一feature map中的不同元素應(yīng)當(dāng)被施與相同的BN操作(包括歸一化和縮放平移)喳资。這樣,同一feature map中的元素就應(yīng)該共享一對(duì)參數(shù)腾供。于是仆邓,若卷積層有n個(gè)kernel,那么其后的BN層將有n對(duì)
伴鳖。
總的來說节值,可以將BN理解為基于通道來操作的:
對(duì)于,處于同一通道的數(shù)據(jù)它們的這兩個(gè)值是相同的榜聂;
對(duì)于搞疗,處于同一通道并且是同一mini-batch的數(shù)據(jù)它們的這兩個(gè)值是相同的。
For convolutional layers, we additionally want the normalization to obey the convolutional property – so that different elements of the same feature map, at different locations, are normalized in the same way. To achieve this, we jointly normalize all the activations in a mini-batch, over all locations.
so for a mini-batch of size m and feature maps of size p × q, we use the effective mini-batch of size m′= |B| = m · pq. We learn a pair of parameters γ(k) and β(k) per feature map, rather than per activation.
—— Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
iii). 歸一化之后為何要縮放和平移须肆?scale & shift存在的必要性匿乃?
首先說明一點(diǎn),可以不進(jìn)行縮放和平移(在代碼中也可以通過參數(shù)進(jìn)行設(shè)置)豌汇,但網(wǎng)絡(luò)的表達(dá)能力會(huì)下降幢炸。
由開篇的論述我們可知,深層神經(jīng)網(wǎng)絡(luò)中拒贱,每層網(wǎng)絡(luò)的權(quán)重和輸入分布會(huì)通過前向和反向過程而相互協(xié)調(diào)宛徊,那么強(qiáng)制把數(shù)據(jù)歸一化到均值為0方差為1的分布并不一定是最好的選擇。使用可學(xué)習(xí)的參數(shù)柜思,是為了讓模型通過訓(xùn)練來學(xué)習(xí)什么樣的分布才是合適的岩调,利于輸入分布和權(quán)重的相互協(xié)調(diào),同時(shí)避免數(shù)據(jù)因這種統(tǒng)一均為0方差為1的“強(qiáng)硬”歸一化而丟失過多原始信息赡盘,增強(qiáng)了網(wǎng)絡(luò)的表達(dá)能力号枕。
特別地,=1且
=0的情況下等價(jià)于僅進(jìn)行歸一化(normalization)操作陨享,不進(jìn)行縮放和平移葱淳;而
且
的情況下等價(jià)于沒有使用BN操作(包括歸一化和縮放平移)。
iv). 為何說BN對(duì)網(wǎng)絡(luò)中的參數(shù)不那么敏感抛姑,具有更強(qiáng)的魯棒性(即學(xué)習(xí)過程更加穩(wěn)定)赞厕,并且可以放心使用大學(xué)習(xí)率進(jìn)行訓(xùn)練從而加速收斂悴势?
舉一例說明更形象生動(dòng):
假設(shè)現(xiàn)在對(duì)網(wǎng)絡(luò)中某層參數(shù)w進(jìn)行縮放掌呜,使其變?yōu)閍w,其中a為縮放系數(shù)嘹朗,x為當(dāng)前層的輸入。那么诲侮,在沒有進(jìn)行縮放時(shí)镀虐,該層輸出將是wx,記均值和方差將分別為沟绪;縮放后刮便,該層輸出將是(aw)x,記此時(shí)均值和方差分別為
绽慈,則有:
恨旱、
。
忽略坝疼,記縮放前后的BN操作分別為BN[wx]和BN[(aw)x]搜贤,則有:
BN[(aw)x] =
? ? ? ? ? ? ? ? = +
? ? ? ? ? ? ? ? = +
? ? ? ? ? ? ? ? = BN[wx]
咦!系數(shù)縮放之后對(duì)于BN層操作來說居然沒有變化裙士!這說明即使前面的網(wǎng)絡(luò)層權(quán)重系數(shù)較之前進(jìn)行了縮放入客,但是在經(jīng)過BN層之后,數(shù)據(jù)的分布依舊穩(wěn)定在一定范圍內(nèi)腿椎。
同理,對(duì)于梯度夭咬,不難計(jì)算出以下關(guān)系:
=
啃炸;
=
于是,我們知道卓舵,對(duì)于輸入數(shù)據(jù)x在BN層的梯度計(jì)算沒有發(fā)生變化南用,同時(shí),縮放尺寸與權(quán)重的梯度更新成反比掏湾,可使得其梯度更新更穩(wěn)定裹虫。
綜上,BN抑制了參數(shù)微小變化隨著網(wǎng)絡(luò)加深而被放大的情況融击,從而允許設(shè)置較大學(xué)習(xí)率筑公,同時(shí)不易造成模型震蕩或不收斂,較大學(xué)習(xí)率訓(xùn)練意味著可以加速收斂尊浪。
v). 為何BN會(huì)具有一定的正則化效果匣屡,甚至可以不使用Dropout?
要知道拇涤,在BN中我們使用的是mini-batch的均值與方差作為對(duì)整體訓(xùn)練樣本均值與方差的估計(jì)捣作,盡管每個(gè)mini-batch中的數(shù)據(jù)都是從總體樣本中抽樣得到,但不同mini-batch的均值與方差會(huì)有所不同(mini-batch size越小差異可能越大)鹅士,這相當(dāng)于在網(wǎng)絡(luò)的學(xué)習(xí)過程中增加了隨機(jī)噪音券躁,與Dropout通過關(guān)閉神經(jīng)元帶來噪音的效果類似,因此在一定程度上起到了正則化的效果。
另外也拜,BN原paper的作者也通過實(shí)驗(yàn)證明網(wǎng)絡(luò)加入BN后丟棄Dropout旭贬,模型也同樣具有很好的泛化效果。
vi). BN應(yīng)該放在激活層(通常是ReLU)前面還是后面搪泳?
原paper作者建議將BN層放置在ReLU前稀轨,因?yàn)镽eLU激活函數(shù)的輸出非負(fù),不能近似為高斯分布岸军。
The goal of Batch Normalization is to achieve a stable distribution of activation values throughout training, and in our experiments we apply it before the nonlinearity since that is where matching the first and second moments is more likely to result in a stable distribution.
—— Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
但是奋刽,也有實(shí)驗(yàn)表明放在ReLU后效果更好,這相當(dāng)于對(duì)下一層的輸入作歸一化艰赞。
因此佣谐,BN應(yīng)該放在激活層前面還是后面,以及與其他變量如初始化方法等如何組合方妖,目前沒有同一定論狭魂,通常憑直覺和經(jīng)驗(yàn)性指導(dǎo),具體效果還是得實(shí)驗(yàn)結(jié)果說了算党觅。
vii). 為啥使用了BN雌澄,就可以不對(duì)上一層的網(wǎng)絡(luò)設(shè)置bias(對(duì)于卷積層conv,就是bias=0)杯瞻?
一句話:設(shè)不設(shè)置一個(gè)樣镐牺,再見。
開個(gè)玩笑魁莉,原因很簡單睬涧,因?yàn)锽N的歸一化操作會(huì)將這個(gè)偏置分量移除掉:
(x + b) - E(x + b) = x +b - [E(x) + b] = x - E(x)
這么聰明的你肯定早就知道了,還請(qǐng)不要鄙視我以上這波操作...
Summary:Batch Normalization 起到了什么作用旗唁?
(1)使數(shù)據(jù)分布處于激活函數(shù)的非線性飽和區(qū)域畦浓,從而避免梯度消失;
(2)如在歸一化的同時(shí)進(jìn)行了縮放和平移检疫,則將數(shù)據(jù)分布的均值與方差從淺層網(wǎng)絡(luò)的權(quán)重中解耦讶请,只需調(diào)整兩個(gè)參數(shù),使得數(shù)據(jù)分布和網(wǎng)絡(luò)權(quán)重的相互協(xié)調(diào)變得更加容易电谣;
(3)對(duì)網(wǎng)絡(luò)權(quán)重初始化不再那么敏感秽梅,對(duì)參數(shù)、激活函數(shù)具有更強(qiáng)的魯棒性剿牺,一定程度上降低了調(diào)參和訓(xùn)練的復(fù)雜度企垦;
(4)允許設(shè)置較大學(xué)習(xí)率進(jìn)行訓(xùn)練,加速模型收斂晒来;
(5)訓(xùn)練過程中的方差與均值基于每個(gè)mini-batch進(jìn)行統(tǒng)計(jì)钞诡,相當(dāng)于引入隨機(jī)噪聲,一定程度上起到了正則化效果。
#彩蛋
耐心的你居然看到了這里荧降,我內(nèi)心真的十分感動(dòng)接箫!
品完這篇文,你對(duì)BN是否有了新的認(rèn)識(shí)呢(大牛的話就默默別出聲吧哈哈哈)朵诫?那么辛友,你是否有思考過,若使用GPU多卡訓(xùn)練剪返,BN會(huì)是怎樣的一波操作废累?
我們知道,BN的統(tǒng)計(jì)量是基于batch來計(jì)算的脱盲,在GPU多卡的情況下邑滨,一個(gè)batch會(huì)被分成即部分分配到不同卡上,每張卡會(huì)基于它所拿到的那部分進(jìn)行計(jì)算钱反。當(dāng) batch size較大時(shí)掖看,可能不會(huì)有什么不妥,但是對(duì)于像語義分割等之類的稠密估計(jì)(Dense Prediction)問題面哥,batch size通常都很小哎壳,那么每張卡計(jì)算得到的統(tǒng)計(jì)量可能與整體數(shù)據(jù)樣本具有較大差異,這...不就尷尬了嗎4敝瘛耳峦?
嘿嘿!不急不急焕毫,別方,先把這篇文中的內(nèi)容啃下去好好消化驶乾,下回CW再為您上菜邑飒!
參考:
http://www.reibang.com/p/b38e14c1f14d
https://blog.csdn.net/zhikangfu/article/details/53391840
https://www.cnblogs.com/makefile/p/batch-norm.html?utm_source=debugrun&utm_medium=referral