【Keras】從Keras的一個Pull Request看BatchNormalization

這篇文章適合對Keras和深度學(xué)習(xí)有一定基礎(chǔ)的讀者

BatchNormalization 是我們在訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)的時候常用方法搬葬,由Google在2015年提出:https://arxiv.org/pdf/1502.03167.pdf.
總結(jié)來說使用BatchNormalization有以下有點:

  • 可以減少過擬合棠赛,一定成都上減少Dropout的使用
  • 加速訓(xùn)練
  • 使用更好的學(xué)習(xí)率

BatchNormalization原理

我們都知道在訓(xùn)練深度學(xué)習(xí)模型的時候是使用一個一個batch來進(jìn)行隨機(jī)梯度更新的熊赖,這樣不用每次更新都需要計算所有數(shù)據(jù)的參數(shù)浪听,同樣對于batchnormalization:
假設(shè)輸入的batch中有m個數(shù)據(jù)钉蒲,對輸入的m個數(shù)據(jù)計算均值和均方差浓利,使用統(tǒng)計數(shù)據(jù)對輸入進(jìn)行normalization宫仗,然后再使用 \gamma\beta對歸一化的輸入 \hat{x_i}進(jìn)行 scale 和 shift够挂,其中scale和shift是可以學(xué)習(xí)的參數(shù),也就是經(jīng)過batchnormalization處理的batch數(shù)據(jù)不僅僅受到整個batch的mean和variance參數(shù)影響藕夫,也受到前面訓(xùn)練的數(shù)據(jù)集的影響(前面的數(shù)據(jù)訓(xùn)練影響 \gamma\beta)
原文里有這樣一句話孽糖,也是相同的意思:

The BN transform can be added to a network to manip- ulate any activation. In the notation y = BNγ ,β (x), we
indicate that the parameters γ and β are to be learned,
but it should be noted that the BN transform does not
independently process the activation in each training ex-
ample. Rather, BNγ,β(x) depends both on the training
example and the other examples in the mini-batch

image.png

Keras中BatchNormalization的參數(shù):

keras.layers.BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001, center=True, scale=True, beta_initializer='zeros', gamma_initializer='ones', moving_mean_initializer='zeros', moving_variance_initializer='ones', beta_regularizer=None, gamma_regularizer=None, beta_constraint=None, gamma_constraint=None)

Arguments

axis: Integer, the axis that should be normalized (typically the features axis). For instance, after a Conv2D layer with  data_format="channels_first", set axis=1 in BatchNormalization.
momentum: Momentum for the moving mean and the moving variance.
epsilon: Small float added to variance to avoid dividing by zero.
center: If True, add offset of beta to normalized tensor. If False, beta is ignored.
scale: If True, multiply by gamma. If False, gamma is not used. When the next layer is linear (also e.g. nn.relu), this can be disabled since the scaling will be done by the next layer.
beta_initializer: Initializer for the beta weight.
gamma_initializer: Initializer for the gamma weight.
moving_mean_initializer: Initializer for the moving mean.
moving_variance_initializer: Initializer for the moving variance.
beta_regularizer: Optional regularizer for the beta weight.
gamma_regularizer: Optional regularizer for the gamma weight.
beta_constraint: Optional constraint for the beta weight.
gamma_constraint: Optional constraint for the gamma weight.

通過使用BatchNormalization對網(wǎng)絡(luò)內(nèi)部的輸入輸出進(jìn)行歸一化,可以避免梯度消失或者爆炸的問題毅贮,而且可以增加網(wǎng)絡(luò)的魯棒性办悟,可以參考對網(wǎng)絡(luò)的輸入進(jìn)行歸一化。

Keras 的BatchNormalization實現(xiàn)

從這里回歸題目滩褥,Keras里面的BatchNormalization有什么不一樣?
我們知道在訓(xùn)練的時候使用batch normalization來對輸入進(jìn)行歸一化病蛉,在測試的時候使用的是一個樣本如何獲取mean和variance呢?
在測試的時候使用的是前面的訓(xùn)練的所有的min-batches的指數(shù)平均瑰煎,具體這里不展開铺然,可以參考這里:Ng的課程
,可看作前面所有的數(shù)據(jù)的mean和variance對當(dāng)前測試樣本的一個估計丢间。

在Keras里面inference或者predict mode里面采用的也是這種方法探熔。這個PR提出的問題是在進(jìn)行遷移學(xué)習(xí)的時候Keras提供的這個接口有很大的問題,很多人在訓(xùn)練集和測試集上的準(zhǔn)確度差異太大烘挫。

遷移學(xué)習(xí)一般在我們自己的樣本數(shù)據(jù)過少诀艰,在別人訓(xùn)練好的模型基礎(chǔ)上,使用我們自己的模型進(jìn)行參數(shù)微調(diào)整饮六。別人的模型解決的問題不是完全一樣二是類似的問題其垄,因為訓(xùn)練好的模型前面幾層可能都會識別邊緣和角點等信息。

在遷移學(xué)習(xí)的時候卤橄,通過frozen前面已經(jīng)訓(xùn)練好的layer绿满,然后在新加的layer上進(jìn)行參數(shù)更新。Keras里面一般我們通過如下代碼來fronzen一些層:

for layer in base_model.layers:
  layer.trainable=False
image.png

問題就出在這里窟扑,在進(jìn)行finetune的時候喇颁,trainable=False的層計算mean和variance參數(shù)的時候使用的是新數(shù)據(jù)的min-batch計算得到的mean和variance進(jìn)行參數(shù)更新,而在模型finetune好之后嚎货,在inference的時候使用的是原始的數(shù)據(jù)加權(quán)平均的mean和variance橘霎。總而言之殖属,在finetune的時候trainable=False的batch normalization 統(tǒng)計參數(shù)來自于新數(shù)據(jù)(你現(xiàn)有的樣本)姐叁,而finetune完成之后進(jìn)行inference的時候統(tǒng)計參數(shù)來自于別人訓(xùn)練模型用的樣本特性。在這之間就有一個gap, 導(dǎo)致在finetune的訓(xùn)練準(zhǔn)確度和測試準(zhǔn)確度差異較大外潜,Github上也有人提過issue原环。

那么正確的解決方案是怎樣的?
在finetune的時候使用原始數(shù)據(jù)計算的統(tǒng)計參數(shù)對trainable=False的BatchNormalization參數(shù)進(jìn)行更新处窥,這樣就可以保證訓(xùn)練和測試的時候行為一致嘱吗。現(xiàn)在的Keras應(yīng)該是不支持這一行為的。 這也導(dǎo)致了在pull request page的論戰(zhàn)碧库。

提出PR的人柜与,在他的博客里面也做了對比實驗,想仔細(xì)了解的人可以去參考的博客嵌灰。

這個問題我之前也沒有注意過弄匕,通過這個問題即更加深入的了解了BatchNormalization也對Keras的使用方法有所注意,也是Keras封裝太多帶來的問題沽瞭,未來可能考慮轉(zhuǎn)戰(zhàn)Tensorflow或者Pytorch迁匠。希望對讀者有所裨益。

Reference

  1. https://github.com/keras-team/keras/pull/9965
  2. http://blog.datumbox.com/the-batch-normalization-layer-of-keras-is-broken/
  3. original paper: https://arxiv.org/pdf/1502.03167.pdf
  4. https://github.com/keras-team/keras/issues/4762
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末驹溃,一起剝皮案震驚了整個濱河市城丧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌豌鹤,老刑警劉巖亡哄,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異布疙,居然都是意外死亡蚊惯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門灵临,熙熙樓的掌柜王于貴愁眉苦臉地迎上來截型,“玉大人,你說我怎么就攤上這事儒溉』陆梗” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵顿涣,是天一觀的道長波闹。 經(jīng)常有香客問我,道長涛碑,這世上最難降的妖魔是什么舔痪? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮锌唾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己晌涕,他們只是感情好滋捶,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著余黎,像睡著了一般重窟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惧财,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天巡扇,我揣著相機(jī)與錄音,去河邊找鬼垮衷。 笑死厅翔,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的搀突。 我是一名探鬼主播刀闷,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼仰迁!你這毒婦竟也來了甸昏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤徐许,失蹤者是張志新(化名)和其女友劉穎施蜜,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雌隅,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡翻默,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了澄步。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冰蘑。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖村缸,靈堂內(nèi)的尸體忽然破棺而出祠肥,到底是詐尸還是另有隱情,我是刑警寧澤梯皿,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布仇箱,位于F島的核電站,受9級特大地震影響东羹,放射性物質(zhì)發(fā)生泄漏剂桥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一属提、第九天 我趴在偏房一處隱蔽的房頂上張望权逗。 院中可真熱鬧美尸,春花似錦、人聲如沸斟薇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽堪滨。三九已至胯陋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間袱箱,已是汗流浹背遏乔。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留发笔,地道東北人盟萨。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像筐咧,于是被迫代替她去往敵國和親鸯旁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容