Batch Normalization小簡介(1) — 論文筆記(上)

Martin Huang
8 min readSep 4, 2020

--

原文在此[1],選讀這篇的動機是因為batch normalization以及weight initialization常常被提到,所以想從文章中得到更完整的概念。這篇有很多的數學,而且避不太掉,不想接觸的人可以直接看結論(會放在下篇)。

一樣會在其中加入一些個人見解,因此標題不再用「翻譯」,而改成筆記。

前言

在訓練深層神經網路時,前層的輸入變動而導致參數調整會導致學習效率減慢,因為必須很謹慎地調整。這在非線性函數的飽和區時更明顯,因為找不到梯度下降的突破口。文章中將這個現象命名為「內在變項移動」(internal covariate shift),並打算由每層輸入標準化的方式切入解決這個問題。這個方式具體的做法是把標準化置入神經網路架構中成為一部分,而且在每次訓練的小批次(mini-batch,也就是現在執行面上的batch/step per epoch)中執行標準化。這樣可以使我們不必將學習速率訂得很低,而且也可以不那麼在意初始化的問題(指的是權重吧)。除此之外,他可以分擔調節器(正規化,Regularizer)的角色,使dropout的使用可以降低。在實驗中,我們使用同樣最先進的(2015年)圖片分類模型,可以在達到一樣效果的前提下減少14被的學習步驟。此外,如果用batch normalization集合而成的架構,在ImageNet可以達到僅僅4.8%的驗證top-5錯誤率。

心得:無怪乎這篇文章被狂引用,被引用數達到超過20000(累計至2020/9)。這個錯誤率比起AlexNet真的是突飛猛進。

簡介

文章從隨機梯度下降(stochastic gradient descend)開始談起,並提到動量(momentum)和Adagrad兩種SGD的改良型。關於這個部分,我會另開一篇介紹。SGD的基本公式如下:

公式1. SGD

θ是SGD想追求降低的參數,以降低損失。Xi是訓練資料。以一個mini-batch,其內含資料量(即batch size)為m,來逼近損失函數的梯度,即損失函數對θ的偏微分:

公式2. 偏微分

利用mini-batch,即數筆資料,比起單筆資料的好處如下:首先,一個mini-batch對梯度的逼近較能預測整組資料的梯度,這個現象在batch size月大時越明顯;其次,對一個mini-batch做計算比單筆計算的效率快m倍,特別是現行硬體已經支援平行運算。

SGD是一個簡單且有效的做法,但如前所述,因為神經網路模型日益增深,前面微小的變化到後面的層可能被放大。因此必須謹慎調整參數,而且學習速率不可設定太大。

每一層的輸入都會因為訓練持續的變動。這個現象稱作變項移動(covariate shift)[2]。傳統上處理的方法是領域適應(domain adaptation)[3](關於這個名詞,我先放一個查到的網頁解釋[4])。變項移動的概念可以在單層的範圍,也可以到複數層,甚至是擴及整個神經網路。例如我們有一個神經網路

公式3. 小神經網路

其中F是函數,或映射。θ是參數,目的是讓損失函數ℓ變小。學習θ2的過程可以視為一個輸入x=F1(u,θ1)進入另一個子網路ℓ = F2(x,θ2)裡面。若要逼近θ2,則公式2可以寫成

公式4. 逼近θ2

如此一來,就像是一個只有一層神經網路架構(F2)對應一個輸入(x)求梯度下降一樣。輸入的分布的性質一樣可以適用在F2(子網路)上。若固定x的分布,則θ2不再受到x分布改變的影響。

但固定子網路內的輸入分布不只對子網路有效,對子網路外也有幫助。例如一個sigmoid啟動函數z = g(Wu + b),其中w、b為要學習的權重和誤差,g則為啟動函數。隨著x往兩端增加,根據函數模型,會往曲線較平滑的方向伸展,即一階導數趨於零。這表示學習速率將會變慢。而x本身又受到前一層、以即再往前的層數的影響,如果前面只是有微小的變動,也可能在這邊時已經放大x而使學習速率變慢。所以如果可以盡量保持輸入的分布不讓他變動,就可以擺脫這個飽和的狀態,維持學習的速率。這個神經網路內的輸入分布變動稱作內在變項移動(internal covariate shift),而減少它就可以維持較好的學習速率。Batch normalization就是為了這個目的發明出來的。它可以透過標準化修正每一層輸入的平均數和變異數,同時也減少設定初始參數,以即參數變動程度帶來的影響。最重要的是,有了它,原本非線性函數陷入飽和區拖住學習速率的狀況可以改善,等於重新賦予這些函數在深度學習領域的生命。

減少內在變項移動

如上所述,訓練的效率和輸入的「漂白」程度有關[5][6]。漂白處理,最常見的就是將其標準化 — 平均數為零、標準差/變異數為1、常態分佈。如果在每一層的輸入端都這樣做,或許就能維持學習速率。改變的方式是直接改變神經網路架構,或根據啟動函數的值直接修改神經網路參數。

然而,若這些改變穿插著最佳化,則參數的更新必須仰賴標準化的更新,有可能降低梯度下降的效果。例如有一層網路其輸入為u,誤差為b,輸出為x = u+b。然後我們將x標準化:減掉其平均值E[x]。(這個例子盡量讓過程簡單化)若梯度下降的步驟忽略了b對E[x]的依賴性,則b的更新會由b + △b取代,其中△b即損失函數ℓ對x的偏微分。則新一輪的輸入變成u + (b + △b) − E[u + (b + △b)] = u + b − E[u + b]。結果就是b改變了,但損失函數ℓ及輸出x都沒有改變。若啟動函數裡還有權重(這個例子裡沒有),那情況會更嚴重。這也是作者在實驗早期階段親身經歷的問題。

要解決這個問題,就是要讓神經網路更新參數時把標準化考慮進去。現在重新設定一層神經網路的輸入為x,另外設X為該層神經網路對整組訓練資料的輸入群。其標準化可以寫成下式:

公式5. 輸入標準化

如此一來標準化不僅和單筆資料的輸出x相關,也和整組資料X有關。如果架構裡包含不只一層神經網路,每一筆x還和參數θ有關。根據反向傳播演算法:

公式6. 偏微分

如果忽略了上式的後者,則會陷入前述的困境:修改了參數但輸出和損失不變。但要求得後者,必須花費很多運算資源。這促使作者群去尋找一個可微分,而且不需要在每次更新時分析整組訓練資料的方法,以標準化輸入。

先到這邊。後續的段落將在下篇補足。

Reference

[1] S. Loffe, C. Szegedy: Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift, 2015
[2] Shimodaira, Hidetoshi. Improving predictive inference under covariate shift by weighting the log-likelihood function. Journal of Statistical Planning and Inference, 90(2):227–244, October 2000.
[3] Jiang, Jing. A literature survey on domain adaptation of statistical classifiers, 2008.
[4] https://zhuanlan.zhihu.com/p/50710267
[5] LeCun, Y., Bottou, L., Orr, G., and Muller, K. Efficient backprop. In Orr, G. and K., Muller (eds.), Neural Networks: Tricks of the trade. Springer, 1998b.
[6] Wiesler, Simon and Ney, Hermann. A convergence analysis of log-linear training. In Shawe-Taylor, J., Zemel, R.S., Bartlett, P., Pereira, F.C.N., andWeinberger, K.Q. (eds.), Advances in Neural Information Processing Systems 24, pp. 657–665,Granada, Spain, December 2011.

--

--

Martin Huang
Martin Huang

Written by Martin Huang

崎嶇的發展 目前主攻CV,但正在往NLP的路上。 歡迎合作或聯絡:martin12345m@gmail.com

No responses yet