理解Batch Normalization系列3——為什么有效及11個問題(清晰解釋)

前面兩期,我們了解了原理、訓(xùn)練及評估,然而為什么有效及若干細(xì)節(jié)仍值得討論。

系列目錄

理解Batch Normalization系列1——原理

理解Batch Normalization系列2——訓(xùn)練及評估

理解Batch Normalization系列3——為什么有效及若干討論

理解Batch Normalization系列4——實踐

文章目錄
BN改善了ICS嗎?
什么是ICS?
BN與ICS無關(guān)
BN改善了損失的平滑性
什么是平滑性?
其他11個值得討論的問題
參考文獻(xiàn)

BN改善了ICS嗎?

原作者認(rèn)為BN是旨在解決了 ICS(Internal Covariate Shift)問題。原文是這樣解釋:

We define Internal Covariate Shift as the change in the distribution of network activations due to the change in network parameters during training. To improve the training, we seek to reduce the internal covariate shift. By fixing the distribution of the layer inputs x as the training progresses, we expect to improve the training speed.

什么是ICS?

所謂Covariate Shift,是指相比于訓(xùn)練集數(shù)據(jù)的特征,測試集數(shù)據(jù)的特征分布發(fā)生了變化。

而原作者定義的Internal Covariate Shift,設(shè)想把每層神經(jīng)網(wǎng)絡(luò)看做一個單獨的模型,它有著自己對應(yīng)的輸入與輸出。如果這個“模型”越靠輸出層,由于訓(xùn)練過程中前面多層的權(quán)重的更新頻繁,導(dǎo)致它每個神經(jīng)元的輸入(即上一層的激活值)的數(shù)值分布,總在不停地變化,這導(dǎo)致訓(xùn)練困難。

然而,一個啟發(fā)性的解釋很容易被推翻,又有人做了更進(jìn)一步的解釋。

BN與ICS無關(guān)

2018年的文章《How Does Batch Normalization Help Optimization?》做了實驗,如圖1所示。

img1.png

圖 1. BN與ICS (來源: 原始論文)

左圖表明,三個網(wǎng)絡(luò)訓(xùn)練曲線,最終都達(dá)成了較高的精度;右圖是三個網(wǎng)絡(luò)中抽出3個層的激活值,繪制9個HISTOGRAMS圖,每層激活值的分布都在訓(xùn)練過程中不斷變化(HISTOGRAMS圖),尤其是網(wǎng)絡(luò)中更深的層,這導(dǎo)致了ICS問題(根據(jù)上文的ICS定義)。

  • 應(yīng)用了BN,觀察到的右圖(Standard+BatchNorm)的激活值分布變化很明顯,理論上將引起明顯的ICS問題。

  • 在BN層后疊加噪音(輸入到后面的非線性激活,相當(dāng)于BN白干了),觀察到的右圖(Standard+"Noisy" BatchNorm)的激活值分布變化更為突出,理論上將引起更為明顯的ICS問題。

    (然而,我的理解是:如果每個BN層后疊加噪音,下一層的BN也會進(jìn)行標(biāo)準(zhǔn)化,層層抵消,相當(dāng)于僅最后一個BN層后疊加的噪音增大了ICS)

    然而兩種情況下,左圖BN的表現(xiàn)依然非常穩(wěn)定。即BN并沒有減少ICS。

    那么,BN是為什么有效?

BN改善了損失的平滑性

2018年的論文《How Does Batch Normalization Help Optimization?》,作者定義了一個描述損失函數(shù)平滑度的函數(shù),觀察加入BN的前后,損失函數(shù)平滑性的變化。如圖2所示??v軸的數(shù)值越小,表明損失函數(shù)曲面越平滑;縱軸數(shù)值越大,表明損失函數(shù)曲面越顛簸。藍(lán)色線為加入BN后的損失函數(shù)的平滑度,可以看到,加入BN后,損失函數(shù)曲面的平滑程度得到了顯著改善。

img2.png

圖 2. BN的加入,增加了損失函數(shù)的光滑度(來源: 原始論文)

因此得到的結(jié)論是:BN的加入使得損失函數(shù)曲面變得平滑,而平滑的損失函數(shù)進(jìn)行梯度下降法變得非常容易(可參見圖3)。

什么是平滑性?

對平滑性的理解,我想沒有比圖3更合適的了。

img3.png

圖 3. 損失函數(shù)的光滑度對比(來源:Visualizing the Loss Landscape of Neural Nets)

圖3中所展示的是,ResNet中引入的shortcut connection,實際上是對損失函數(shù)的平滑作用。顯然,對于左側(cè)的損失函數(shù),梯度下降將是異常困難;而對于右側(cè),即經(jīng)過平滑的損失函數(shù),將大大提升訓(xùn)練效率。

由于權(quán)重參數(shù)動輒千萬,必然將權(quán)重數(shù)映射成2個,因此繪制損失函數(shù)曲面相當(dāng)需要技巧與計算代價,尚未找到BN的平滑性3D圖對比,但不影響圖2中BN對平滑性改善效果的證明。

其他11個值得討論的問題

  • BN層的位置能不能調(diào)整?如果能調(diào)整哪個位置更好?

    能。原因:由第二章BN的反向傳播可知,BN不管放在網(wǎng)絡(luò)的哪個位置,都可以實現(xiàn)這兩個功能:訓(xùn)練?和?、傳遞梯度到前一層,所以位置并不限于ReLU之前。

    原始論文中,BN被放在本層ReLU之前,即

    也有測試表明,BN放在上一層ReLU之后,效果更好,即

    表1 BN的位置對訓(xùn)練結(jié)果的影響來源

Name Accuracy LogLoss Comments
Before 0.474 2.35 As in paper
Before + scale&bias layer 0.478 2.33 As in paper
After 0.499 2.21
After + scale&bias layer 0.493 2.24

但是由于這些都是試驗證明,而非理論證明,因此無法肯定BN放在ReLU后就一定更好。

在實踐中可以都試試。

  • 在訓(xùn)練時為什么不直接使用整個訓(xùn)練集的均值/方差?

    使用 BN 的目的就是為了保證每批數(shù)據(jù)的分布穩(wěn)定,使用全局統(tǒng)計量反而違背了這個初衷。

  • 在預(yù)測時為什么不直接使用整個訓(xùn)練集的均值/方差?

    完全可以。由于神經(jīng)網(wǎng)絡(luò)的訓(xùn)練數(shù)據(jù)量一般很大,所以內(nèi)存裝不下,因此用指數(shù)滑動平均方法去近似值,好處是不占內(nèi)存,計算方便,但其結(jié)果不如整個訓(xùn)練集的均值/方差那么準(zhǔn)確。

  • batch_size的配置

    不適合batch_size較小的學(xué)習(xí)任務(wù)。因為batch_size太小,每一個step里前向計算中所統(tǒng)計的本batch上的方差和均值,噪音聲量大,與總體方差和總體均值相差太大。前向計算已經(jīng)不準(zhǔn)了,反向傳播的誤差就更大了。

    尤其是最極端的在線學(xué)習(xí)(batch_size=1),原因為無法獲得總體統(tǒng)計量。

  • 對學(xué)習(xí)率有何影響?

    由于BN對損失函數(shù)的平滑作用,因此可以采用較大的學(xué)習(xí)率。

  • BN是正則化嗎?

    在深度學(xué)習(xí)中,正則化一般是指為避免過擬合而限制模型參數(shù)規(guī)模的做法。即正則化=簡化。BN能夠平滑損失函數(shù)的曲面,顯然屬于正則化。不過,除了在過擬合時起正則作用,在欠擬合狀況下,BN也能提升收斂速度。

  • 與Dropout的有何異同?

    BN由于平滑了損失函數(shù)的梯度函數(shù),不僅使得模型訓(xùn)練精度提升了,而且收斂速度也提升了;Dropout是一種集成策略,只能提升模型訓(xùn)練精度。因此BN更受歡迎。

  • 能否和Dropout混合使用?

    雖然混合使用較麻煩,但是可以。不過現(xiàn)在主流模型已經(jīng)全面倒戈BN。Dropout之前最常用的場合是全連接層,也被全局池化日漸取代。既生瑜何生亮。

  • BN可以用在哪些層?

    所有的層。從第一個隱藏層到輸出層,均可使用,而且全部加BN效果往往最好。

  • BN可以用在哪些類型的網(wǎng)絡(luò)?

    MLP、CNN均ok,幾乎成了這類網(wǎng)絡(luò)的必選項。

    RNN網(wǎng)絡(luò)不ok,因為無論訓(xùn)練和測試階段,每個batch上的輸入序列的長度都不確定,均值和方差的統(tǒng)計非常困難。

  • BN的缺點

    在訓(xùn)練時前向傳播的時間將增大。(但是迭代次數(shù)變少了,總的時間反而少了)

下一期,我們將動手實現(xiàn)一個BN層。

(如果本文對您有所幫助,別忘了點贊支持一下哈,感謝各位看官)

參考文獻(xiàn)

[1] https://arxiv.org/pdf/1502.03167v3.pdf

[2] https://r2rt.com/implementing-batch-normalization-in-tensorflow.html

[3] Adjusting for Dropout Variance in Batch Normalization and Weight Initialization

[4] http://www.itdecent.cn/p/05f3e7ddf1e1

[5] https://www.youtube.com/watch?v=gYpoJMlgyXA&feature=youtu.be&list=PLkt2uSq6rBVctENoVBg1TpCC7OQi31AlC&t=3078

[6] https://kratzert.github.io/2016/02/12/understanding-the-gradient-flow-through-the-batch-normalization-layer.html

[7] https://www.quora.com/In-deep-learning-networks-could-the-trick-of-dropout-be-replaced-entirely-by-batch-normalization

[8]https://panxiaoxie.cn/2018/07/28/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0-Batch-Normalization/

[9] https://www.tensorflow.org/api_docs/python/tf/layers/batch_normalization

[10] https://www.quora.com/In-deep-learning-networks-could-the-trick-of-dropout-be-replaced-entirely-by-batch-normalization

[11] https://github.com/ducha-aiki/caffenet-benchmark/blob/master/batchnorm.md

[12]https://www.quora.com/What-is-Covariate-shift

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

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

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