『教程』Batch Normalization 层介绍
原文鏈接
思考
YJango的前饋神經(jīng)網(wǎng)絡(luò)--代碼LV3的數(shù)據(jù)預(yù)處理中提到過(guò):在數(shù)據(jù)預(yù)處理階段,數(shù)據(jù)會(huì)被標(biāo)準(zhǔn)化(減掉平均值、除以標(biāo)準(zhǔn)差),以降低不同樣本間的差異性,使建模變得相對(duì)簡(jiǎn)單。
我們又知道神經(jīng)網(wǎng)絡(luò)中的每一層都是一次變換,而上一層的輸出又會(huì)作為下一層的輸入繼續(xù)變換。如下圖中, 經(jīng)過(guò)第一層 的變換后,所得到的 ; 而 經(jīng)過(guò)第二層 的變換后,得到 。
在第二層所扮演的角色就是 在第一層所扮演的角色。 我們將 進(jìn)行了標(biāo)準(zhǔn)化,那么,為什么不對(duì) 也進(jìn)行標(biāo)準(zhǔn)化呢?
?
Batch Normalization論文便首次提出了這樣的做法。
Batch Normalization(BN)就是將每個(gè)隱藏層的輸出結(jié)果(如 )在batch上也進(jìn)行標(biāo)準(zhǔn)化后再送入下一層(就像我們?cè)跀?shù)據(jù)預(yù)處理中將 進(jìn)行標(biāo)準(zhǔn)化后送入神經(jīng)網(wǎng)絡(luò)的第一層一樣)。
優(yōu)點(diǎn)
那么Batch Normalization(BN)有什么優(yōu)點(diǎn)?BN的優(yōu)點(diǎn)是多個(gè)并存,但這里只提一個(gè)最容易理解的優(yōu)點(diǎn)。
訓(xùn)練時(shí)的問(wèn)題
盡管在講解神經(jīng)網(wǎng)絡(luò)概念的時(shí)候,神經(jīng)網(wǎng)絡(luò)的輸入指的是一個(gè)向量 。
但在實(shí)際訓(xùn)練中有:
- 隨機(jī)梯度下降法(Stochastic Gradient Descent):用一個(gè)樣本的梯度來(lái)更新權(quán)重。
- 批量梯度下降法(Batch Gradient Descent):用多個(gè)樣本梯度的平均值來(lái)更新權(quán)重。
如下圖所示,綠、藍(lán)、黑的箭頭表示三個(gè)樣本的梯度更新網(wǎng)絡(luò)權(quán)重后loss的下降方向。
若用多個(gè)梯度的均值來(lái)更新權(quán)重的批量梯度下降法可以用相對(duì)少的訓(xùn)練次數(shù)遍歷完整個(gè)訓(xùn)練集,其次可以使更新的方向更加貼合整個(gè)訓(xùn)練集,避免單個(gè)噪音樣本使網(wǎng)絡(luò)更新到錯(cuò)誤方向。
?
然而也正是因?yàn)槠骄硕鄠€(gè)樣本的梯度,許多樣本對(duì)神經(jīng)網(wǎng)絡(luò)的貢獻(xiàn)就被其他樣本平均掉了,相當(dāng)于在每個(gè)epoch中,訓(xùn)練集的樣本數(shù)被縮小了。batch中每個(gè)樣本的差異性越大,這種弊端就越嚴(yán)重。
一般的解決方法就是在每次訓(xùn)練完一個(gè)epoch后,將訓(xùn)練集中樣本的順序打亂再訓(xùn)練另一個(gè)epoch,不斷反復(fù)。這樣重新組成的batch中的樣本梯度的平均值就會(huì)與上一個(gè)epoch的不同。而這顯然增加了訓(xùn)練的時(shí)間。
同時(shí)因?yàn)闆](méi)辦法保證每次更新的方向都貼合整個(gè)訓(xùn)練集的大方向,只能使用較小的學(xué)習(xí)速率。這意味著訓(xùn)練過(guò)程中,一部分steps對(duì)網(wǎng)絡(luò)最終的更新起到了促進(jìn),一部分steps對(duì)網(wǎng)絡(luò)最終的更新造成了干擾,這樣“磕磕碰碰”無(wú)數(shù)個(gè)epoch后才能達(dá)到較為滿意的結(jié)果。
注:一個(gè)epoch是指訓(xùn)練集中的所有樣本都被訓(xùn)練完。一個(gè)step或iteration是指神經(jīng)網(wǎng)絡(luò)的權(quán)重更新一次。
為了解決這種“不效率”的訓(xùn)練,BN首先是把所有的samples的統(tǒng)計(jì)分布標(biāo)準(zhǔn)化,降低了batch內(nèi)不同樣本的差異性,然后又允許batch內(nèi)的各個(gè)samples有各自的統(tǒng)計(jì)分布。所以,
BN的優(yōu)點(diǎn)自然也就是允許網(wǎng)絡(luò)使用較大的學(xué)習(xí)速率進(jìn)行訓(xùn)練,加快網(wǎng)絡(luò)的訓(xùn)練速度(減少epoch次數(shù)),提升效果。做法
設(shè),每個(gè)batch輸入是 (其中每個(gè) 都是一個(gè)樣本, 是batch size) 假如在第一層后加入Batch normalization layer后, 的計(jì)算就倍替換為下圖所示的那樣。
- 矩陣 先經(jīng)過(guò) 的線性變換后得到
- 注:因?yàn)闇p去batch的平均值 后, 的作用會(huì)被抵消掉,所以沒(méi)必要加入 (紅色刪除線)。
- 將 再減去batch的平均值 ,并除以batch的標(biāo)準(zhǔn)差 得到 。 是為了避免除數(shù)為0的情況所使用的微小正數(shù)。
- 注:但 基本會(huì)被限制在正態(tài)分布下,使得網(wǎng)絡(luò)的表達(dá)能力下降。為解決該問(wèn)題,引入兩個(gè)新的parameters: 和 。 和 是在訓(xùn)練時(shí)網(wǎng)絡(luò)自己學(xué)習(xí)得到的。
- 將 乘以 調(diào)整數(shù)值大小,再加上 增加偏移后得到 。
- 為加入非線性能力, 也會(huì)跟隨著ReLU等激活函數(shù)。
- 最終得到的 會(huì)被送到下一層作為輸入。
需要注意的是,上述的計(jì)算方法用于在訓(xùn)練。因?yàn)闇y(cè)試時(shí)常會(huì)只預(yù)測(cè)一個(gè)新樣本,也就是說(shuō)batch size為1。若還用相同的方法計(jì)算 , 就會(huì)是這個(gè)新樣本自身, 就會(huì)成為0。
所以在測(cè)試時(shí),所使用的 和 是整個(gè)訓(xùn)練集的均值 和方差 。
而整個(gè)訓(xùn)練集的均值和方差 的值通常也是在訓(xùn)練的同時(shí)用移動(dòng)平均法來(lái)計(jì)算,會(huì)在下一篇代碼演示中介紹。
總結(jié)
以上是生活随笔為你收集整理的『教程』Batch Normalization 层介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Lua_第17 章 数学库
- 下一篇: Vue 2.3、2.4 知识点小结