2. 神經(jīng)網(wǎng)絡(luò)之BN層

參考:BN學(xué)習(xí)筆記,用自己的的理解和語(yǔ)言總結(jié)一下。

背景

BN,全稱Batch Normalization,是2015年提出的一種方法,在進(jìn)行深度網(wǎng)絡(luò)訓(xùn)練時(shí),大都會(huì)采取這種算法。
原文鏈接:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

盡管梯度下降法訓(xùn)練神經(jīng)網(wǎng)絡(luò)很簡(jiǎn)單高效,但是需要人為地去選擇參數(shù),比如學(xué)習(xí)率,參數(shù)初始化,權(quán)重衰減系數(shù),Dropout比例等,而且這些參數(shù)的選擇對(duì)于訓(xùn)練結(jié)果至關(guān)重要,以至于我們很多時(shí)間都浪費(fèi)到這些調(diào)參上。BN算法的強(qiáng)大之處在下面幾個(gè)方面:

  1. 可以選擇較大的學(xué)習(xí)率,使得訓(xùn)練速度增長(zhǎng)很快,具有快速收斂性。
  2. 可以不去理會(huì)Dropout,L2正則項(xiàng)參數(shù)的選擇,如果選擇使用BN,甚至可以去掉這兩項(xiàng)。
  3. 去掉局部響應(yīng)歸一化層。(AlexNet中使用的方法,BN層出來(lái)之后這個(gè)就不再用了)
  4. 可以把訓(xùn)練數(shù)據(jù)打亂,防止每批訓(xùn)練的時(shí)候,某一個(gè)樣本被經(jīng)常挑選到。(不是很理解?。?/li>

首先來(lái)說(shuō)歸一化的問(wèn)題,神經(jīng)網(wǎng)絡(luò)訓(xùn)練開始前,都要對(duì)數(shù)據(jù)做一個(gè)歸一化處理,歸一化有很多好處,原因是網(wǎng)絡(luò)學(xué)習(xí)的過(guò)程的本質(zhì)就是學(xué)習(xí)數(shù)據(jù)分布,一旦訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)的分布不同,那么網(wǎng)絡(luò)的泛化能力就會(huì)大大降低,另外一方面,每一批次的數(shù)據(jù)分布如果不相同的話,那么網(wǎng)絡(luò)就要在每次迭代的時(shí)候都去適應(yīng)不同的分布,這樣會(huì)大大降低網(wǎng)絡(luò)的訓(xùn)練速度,這也就是為什么要對(duì)數(shù)據(jù)做一個(gè)歸一化預(yù)處理的原因。另外對(duì)圖片進(jìn)行歸一化處理還可以處理光照,對(duì)比度等影響。
另外,為什么要進(jìn)行歸一化還有一些原因,可以參考這里
網(wǎng)絡(luò)一旦訓(xùn)練起來(lái),參數(shù)就要發(fā)生更新,出了輸入層的數(shù)據(jù)外,其它層的數(shù)據(jù)分布是一直發(fā)生變化的,因?yàn)樵谟?xùn)練的時(shí)候,網(wǎng)絡(luò)參數(shù)的變化就會(huì)導(dǎo)致后面輸入數(shù)據(jù)的分布變化,比如第二層輸入,是由輸入數(shù)據(jù)和第一層參數(shù)得到的,而第一層的參數(shù)隨著訓(xùn)練一直變化,勢(shì)必會(huì)引起第二層輸入分布的改變,把這種改變稱之為:Internal Covariate Shift,BN就是為了解決這個(gè)問(wèn)題的。

BN

和卷積層,激活層,全連接層一樣,BN層也是屬于網(wǎng)絡(luò)中的一層。我們前面提到了,前面的層引起了數(shù)據(jù)分布的變化,這時(shí)候可能有一種思路是說(shuō):在每一層輸入的時(shí)候,在加一個(gè)預(yù)處理多好。比如歸一化到均值為0,方差為1,然后再送入輸入進(jìn)行學(xué)習(xí)。基本思路是這樣的,然而實(shí)際上沒(méi)有這么簡(jiǎn)單,如果我們只是使用簡(jiǎn)單的歸一化方式:

對(duì)某一層的輸入數(shù)據(jù)做歸一化,然后送入網(wǎng)絡(luò)的下一層,這樣是會(huì)影響到本層網(wǎng)絡(luò)所學(xué)習(xí)的特征的,比如網(wǎng)絡(luò)中學(xué)習(xí)到的數(shù)據(jù)本來(lái)大部分分布在0的右邊,經(jīng)過(guò)RELU激活函數(shù)以后大部分會(huì)被激活,如果直接強(qiáng)制歸一化,那么就會(huì)有大多數(shù)的數(shù)據(jù)無(wú)法激活了,這樣學(xué)習(xí)到的特征不就被破壞掉了么?論文中對(duì)上面的方法做了一些改進(jìn):變換重構(gòu),引入了可以學(xué)習(xí)的參數(shù),這就是算法的關(guān)鍵之處:這兩個(gè)希臘字母就是要學(xué)習(xí)的。

每一個(gè)神經(jīng)元x_k都會(huì)有這樣的一對(duì)參數(shù),當(dāng):

這樣的時(shí)候可以恢復(fù)出原始的某一層學(xué)習(xí)到的特征的,因此我們引入這個(gè)可以學(xué)習(xí)的參數(shù)使得我們的網(wǎng)絡(luò)可以恢復(fù)出原始網(wǎng)絡(luò)所要學(xué)習(xí)的特征分布,最后BN層的前向傳導(dǎo)公式為:

上面公式中的m指的是mini-batch size。也就是每一個(gè)batch來(lái)做一個(gè)這樣的BN。代碼對(duì)應(yīng)也是四句話。

m = K.mean(X, axis=-1, keepdims=True)        #計(jì)算均值  
std = K.std(X, axis=-1, keepdims=True)           #計(jì)算標(biāo)準(zhǔn)差  
X_normed = (X - m) / (std + self.epsilon)         #歸一化  
out = self.gamma * X_normed + self.beta           #重構(gòu)變換  

上面的x是一個(gè)二維矩陣,對(duì)于源碼的實(shí)現(xiàn)就是上面幾行了。

使用

一旦網(wǎng)絡(luò)訓(xùn)練結(jié)束,就沒(méi)有了batch這個(gè)概念了,測(cè)試階段的時(shí)候我們一般只輸入一個(gè)樣本來(lái)看一下預(yù)測(cè)結(jié)果。因此測(cè)試樣本前向傳導(dǎo)的時(shí)候,上面式子里的均值和標(biāo)準(zhǔn)差從哪里來(lái)?其實(shí)網(wǎng)絡(luò)一旦訓(xùn)練完畢,參數(shù)都是固定的,這個(gè)時(shí)候即便是訓(xùn)練數(shù)據(jù)進(jìn)來(lái)一個(gè)batch,BN層計(jì)算的均值和標(biāo)準(zhǔn)差都是基本不變的(網(wǎng)絡(luò)趨于穩(wěn)定),我們可以采用這些數(shù)值作為測(cè)試樣本所需要的均值和標(biāo)準(zhǔn)差,于是最后測(cè)試階段的均值和標(biāo)準(zhǔn)差為:

上面簡(jiǎn)單理解就是:對(duì)于均值來(lái)說(shuō)直接計(jì)算所有batch u值的平均值;然后對(duì)于標(biāo)準(zhǔn)偏差采用每個(gè)batch σB的無(wú)偏估計(jì)。最后測(cè)試階段,BN的使用公式就是

BN可以用于一個(gè)神經(jīng)網(wǎng)絡(luò)的任何一個(gè)神經(jīng)元上,文獻(xiàn)中主要是把BN變換放在激活函數(shù)層的前面,所以前向傳導(dǎo)的計(jì)算公式應(yīng)該是:z=g(BN(Wu+b)),因?yàn)槠脜?shù)經(jīng)過(guò)BN層其實(shí)是不起作用的,因?yàn)橐矔?huì)被均值歸一化(平移),所以這個(gè)參數(shù)就可以不要了,可以寫成:z=g(BN(Wu))

BN在CNN上的使用。

上面所說(shuō)的是BN對(duì)于每一個(gè)神經(jīng)元都做處理,對(duì)于卷積神經(jīng)網(wǎng)絡(luò)來(lái)說(shuō)呢?比如某一層卷積層的維度是:1001006,如果對(duì)每一個(gè)神經(jīng)元都進(jìn)行BN的話,那就需要600萬(wàn)*2的參數(shù),這是相當(dāng)恐怖的,所以其實(shí)卷積神經(jīng)網(wǎng)絡(luò)使用BN的時(shí)候,也做了權(quán)重共享的策略,把一張?zhí)卣鲌D當(dāng)做一個(gè)神經(jīng)元來(lái)處理。
比如某層的特征維度是[m,f,p,q],分別是batch_num:m,維度: f,特征尺寸p,q。CNN中可把每個(gè)特征圖看成是一個(gè)特征處理(神經(jīng)元),因此在使用BN的時(shí)候,Mini-batch size的大小就是mpq,對(duì)于每一個(gè)特征圖只有一對(duì)科學(xué)系的參數(shù)。說(shuō)白了,就是相當(dāng)于求所有樣本(batch_num:m個(gè))所對(duì)應(yīng)的的一個(gè)特征圖的所有神經(jīng)元的平均值和方差,然后對(duì)這一個(gè)神經(jīng)元做歸一化,假設(shè)特征維度只有一維的話,就相當(dāng)于一個(gè)batch的所有圖片像素的均值和方差來(lái)對(duì)每一張圖片來(lái)做歸一化,也是容易理解的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容