Skip to main content

Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

XavierAbout 13 minNotePaper ReadDeep Neural Networks

Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

Basic Information

  • Sergey Ioffe, Christian Szegedy from Google Reserch, @google.com
  • 2015 ICML

Problem Description

在訓練Deep Neural Network的過程中,每層layer的input distribution都會隨著前一層的parameter而改變(Internal Covariate Shift),容易導致Model收斂緩不容易train,而Batch Normalization就是透過在每一層的input都做一次normalization,來解決Internal Covariates Shift,減緩Vanishing Gradient的問題,同時也達到regularization的效果。

Stochastic Gradient Descent

Stochastic Gradient Descent(SGD)可以說是在Deep Learning中最常見的optimization技巧,跟一般的Gradient Descent(GD)差異在於,GD是一次用整個training set來計算loss function的Gradient來更新參數。SGD則是每次只用一個mini-batch的樣本來算出Gradient(的平均)就更新參數。那之所以會叫"Stochastic" Gradient Descent是因為每個mini-batch都是隨機(stochastic)抽取的。

Stochastic Gradient Descent的優點在於隨著batch size變大,在mini-batch上的gradient會接近整個training set,分成很多的mini-batch的方式也很方便進行平行運算。那缺點在於,如果當下的learning rate太大,容易造成參數更新呈現鋸齒狀,沒效率的同時還可能會發生到不了最佳解的狀況。

Covariate Shift

在ML中有個重要假設(獨立同分佈,IID),假設training set與testing set彼此是獨立的且滿足相同分佈,那代表這個model有著很好的泛化能力,透過traing set訓練出的這個model在testing set上也能取得很好的結果。但是如果training set與testing set的分佈不一致,這就叫做Covariate Shift。

Internal Covariate Shift

而Internal Covariate Shift就是指在Neural Network的內部(Internal),內部的多層layer的數據分佈不一致所造成的現象。在train Neural Network的過程中,parameters會隨著各層的training更新,而每次parameter的更新都會改變input的distribution,導致output的distribution也隨之改變,所以每一層hidden layer都會面臨到Covariate Shift的問題。

Saturating problem and Vanishing Gradient

關於Saturating與Non-saturating,在AlexNet有提過了,這邊解釋一下為什麼使用saturating的activation function容易造成梯度消失的問題。

一個常見的Sigmoid function長這樣:

可以看到只有在中間那塊區域,數據才能夠有效傳遞到下一層,藍色區域因為Gradient接近於0(斜率接近0),基本上可以視為Gradient已經消失了。

像這樣的function,就可以稱做saturating function,可以理解為將數據擠壓到某個特定的區間。那解決這個問題可以透過改使用ReLU等Non-saturating functions,或是使用本篇學到的Batch Normalization技巧。

Introduction

Stochastic Gradient Descent(SGD)是在train深度網絡時常用的技巧。雖然SGD簡單且有效,但他需要對hyper-parameter做非常小心的tuning,尤其是learning rate就不能設得太大。會這樣的原因是因為每層layer的input都會受到前一層layer的parameter影響,導致在parameters的一點點小改變會隨著網絡的深度而放大(Internal Covariates Shift)。Batch Normalization就是一個主要來解決Internal Covariates Shift的機制,透過對每一個mini-batch都normalize到mean為0,variance為1的distribution,來解決gradients對parameters過度依賴的問題(Internal Covariates Shift),同時在繼續使用saturating nonlinearities作為activation function的前提下,減緩Vanishing Gradients的問題,甚至還能達到regularization的效果,減少對Dropout的需求。作者將Batch Normalization應用在當時在ImageNet表現最好的classification network後,發現只需使用到原網絡7%的training steps就能達到一樣的performance,並且還可以大幅超越其accuracy。

Info

其實Internal Covariates Shift這個名詞,是本篇作者自己發明的,他們認為這是導致Deep Neural Network難train的其中一個問題。但實際上,後來有篇paperHow Does Batch Normalization Help Optimization?open in new window,挑戰了這個觀點,這篇paper認為Internal Covariates Shift不一定是在training時的一個問題,而Batch Normalization能夠達到比較好的表現,也不見得是因為它解決了Internal Covariates Shift的問題。結合實驗與理論的支持與佐證,他們認為Batch Normalization能夠成功的原因,是因為Batch Normalization能夠讓error surface變得比較不崎嶇,而要做到這件事情不見得要透過Batch Normalization,有許多其他的方法能做到,甚至還能比Batch Normalization更好。他們甚至還在paper上寫到,Batch Normalization可能只是一個出於偶然與意外的發現XD。

Methodology

其實本篇paper將Methodology分為Towards Reducing Internal Covariate ShiftNormalization via Mini-Batch Statistics兩個章節,但由於有後人提出說Internal Covariate Shift跟Batch Normalization的表現不見得有關聯,所以這邊會著重在Normalization via Mini-Batch Statistics的部份,也會加上我參考許多其他課程與文章中的一些理解,結構不見得會跟原文一模一樣(原文真的不是很好懂QQ)。

這部份我們分成4個part,分別是Batch Normalization TransformTraining and InferenceConvolutional NetworksHigher learning rates and Regularizations

Batch Normalization Transform

Batch Normalization 會對於每個feacture獨立做normalization,對於每個dimension(feature),經過

x^(k)=x(k)E[x(k)]Var[x(k)] \hat{x}^{(k)} = \frac{x^{(k)} - E[x^{(k)}]}{\sqrt{Var[x^{(k)}]}}

normalize成Mean=0,Variance=1Mean = 0, Variance = 1的distribution。

Training使用mini-batch SGD,因此Mean跟Variance都是在每個mini-batch中估計而來。考量一個大小為mm的mini-batch B\Beta,對於每個feature

其中μB\mu_{\Beta}為Mean,σB2\sigma_{\Beta}^2為Variance xi^\hat{x_i}是normalize後的值,而ϵ\epsilon是為了穩定性而加的常數 yiy_i是經過scale跟shift的結果,其中γ\gammaβ\beta是learnbale的parameters,代表scale跟shift的參數 加上γ\gammaβ\beta的原因是,normalize之後的Mean都是00,Variance都是11,可能會導致一些負面影響。比如說如果使用ReLU作為activation function,如果Mean是00,代表會有一半(<0<0)的訊息消失,所以加上γ\gammaβ\beta兩個參數來進行調整,讓Network自己學習去調整輸出的分佈。

透過這些步驟,Batch Normalization Transformation能夠代表一個identity transformation並維持一樣的訊息流量。

Training and Inference

要對整個Network做Batch Normalization,我們要對在每一層的activation都插入BN transform。任何layer之前接收xx作為input,現在都改為接收BN(x)BN(x)作為input。那因為只有在training時需要分成mini-batch(SGD),inference時不需要,我們希望output只取決於input,所以在推論時改成

x^=xE[x]Var[x]+ϵ \hat{x} = \frac{x - E[x]}{\sqrt{Var[x] + \epsilon}}

E[x],Var[x]E[x], Var[x]在inference中是固定的。

那其實在training過程中,E[x],Var[x]E[x], Var[x]是會變動的,透過backpropagation也會改動到parameter的值。所以會透過moving average來更新。

E[x]EB[μB]Var[x]mm1EB[σB2] E[x] \leftarrow E_{\Beta}[\mu_{\Beta}] Var[x] \leftarrow \frac{m}{m - 1} \cdot E_{\Beta}[\sigma_{\Beta}^2]

Convolutional Networks

考量到一組transformation

z=g(Wu+b) z = g(Wu + b)

W, b是learnable parameters g()是像ReLU或sigmoid等nonlinearity

我們將BN加在nonlinearity之前,也就是對每組x=Wu+bx = Wu + b做normalization。那事實上要對input uu做normalization也是可以的,但因為uu通常是前一層nonlinearity的output,他的分佈容易在training過程中改變。相較之下,Wu+bWu + b更可能具有對稱且非稀疏的distribution,對他做normalization可以產生更stable的activation。

Wu+bWu + b做normalization還有一個好處,那就是緩解vanishing gradient的問題。

以Sigmoid作為activation function為例,只有在紅色區間的數據,才能夠被有效地傳遞到下一層,在紅色區間之外的都容易導致梯度消失。

透過對$Wu + b$做normalization,可以將數據集中在紅色區間內,讓數據能更有效地進行傳遞。

Higher learning rates and regularizations

在傳統的DN中,太高的learning rate容易導致梯度爆炸或消失,或著是error function卡在local minima。Batch Normalization透過對整個Network的activations做normalization,來避免training陷入nonlinearity的飽和狀態。透過Batch Normalization,參數的scale也不會影響到layer的backpropagation(可以想像成,scale並不會改變數據的相對關係,所以做完normalization後,會跟沒做scale一樣)。

接下來,我們用李宏毅open in new window老師的上課例子,來解釋為什麼Batch Normalization可以加快模型收斂速度,提高learning rate。

在左圖上,$x_1$與$x_2$的值相差很大。因為$x_1$的值比較小,所以$w_1$對loss的影響比較小,在$w_1$方向上的Gradient變化比較小,反之在$w_2$方向上的Gradient變化就比較大。這樣的差異就會讓traing上比較麻煩,需要在不同的dimension上給不同的learning rates。而做了Normalization後會變成右邊那張圖,製造比較好的error surface,可以使用一樣的learning rate,進而加快模型收斂速度。

其實Batch Normalization也具有一定的regularization效果。由於BN是在每個mini-batch上計算,不是在全部的training set,在選取mini-batch的隨機性會導致Mean跟Variance略為不同,可以視為在training的過程中添加了一些隨機噪音,算是做到了一些Dropout在做的事情。

綜合以上,Batch Normalization能夠使梯度的傳遞更加穩定,並使model能以更高的learning rate進行training,同時可以達到regularization的效果,減少Dropout的需求。

Experiments

本篇paper做了許多實驗來驗證Batch Normalization的效果,以下分為MNISTImageNet兩大部份。

MNIST

MNIST是由28×2828 \times 28 pixel,binary的手寫數字圖像形成的dataset,共有1010個類別(0 90 ~ 9)。實驗使用了非常簡單的Network,用了3層fully-connected hidden layers,每層都有100個sigmoid nonlinearity作為activations。後面還有一層使用10個activations跟cross-entropy loss的hidden layer(fully-connected)。訓練時經過50000個steps,一個mini-batch的size為60個examples。而在每一層hidden layer都有加上Batch Normalization。

這張圖顯示了有BN跟沒BN的網路,test accuracy隨training steps變化的情況,其中xx軸代表epoch,yy軸代表test accuracy。可以看到有BN的Neural Network有著更高的test accuracy。

這兩張圖顯示了有BN跟沒BN的input經過sigmoid作為activation的演變情形,xx軸一樣代表epoch,yy軸則代表output value。可以看到相較於沒有BN的網路,有BN的網路要來得穩定許多。

ImageNet

ImageNet的部份都是在LSVRC2012的data set上train的,主要是使用Inception這個SOTA。

本篇使用的是Inception Network的一種變體,該網路有大量的Convolutional與pooling layers,以及一層softmax layer來預測是屬於1000種類別的哪個,而Convolutional layers一樣使用ReLu。變體的地方在於使用兩個連續的3x3 convolutional layers取代原本的一個5x5 convolutional layer。該model使用SGD with momentum, mini-batch size設為32。最重要的是,一樣在每個nonlinearity的input,都加上Batch Normalization。

Accelerating BN Networks

單純的將Batch Normalization加進Network中沒有辦法發揮最大效益,作者進一步改變了Network與training parameters。

  • 增加learning rate: 因為加了BN,可以在沒有副作用的情況下提高learning rate。
  • 移除Dropout: 因為BN可以部份取代Dropout,移除Dropout可以加速training。
  • 減少L2 weight regularization: 在加入BN後,該權重減少5倍。
  • 加速learning rate decay: 在訓練Inception時,learning rate會呈exponentially decay。因為加上BN後train得會比Inception快,所以讓decay速率變成6倍。
  • 移除Local Response Normalization: 有了BN後,LRN就不是必要的了。
  • 更徹底地shuffle訓練樣本: 防止相同的example總是出現在一個mini-batch中。
  • 減少photometric distortions: 因為加了BN的Network train起來更快,每個training example會被觀察更少次。減少distortion可以專注於更真實的圖像。

Single-Network Classification

為了驗證BN的效果,作者分出了幾種Network:

  • Inception: 前面描述的Network,初始learning rate設為0.0015。
  • BN-Baseline: 同上,但在每個nonlinearity前加上BN。
  • BN-x5: 應用上面提到的加速,將初始learning rate設為0.0075(5倍)。
  • BN-x30: 應用上面提到的加速,將初始learning rate設為0.045(30倍)。
  • BN-x5-Sigmoid: 跟BN-x5類似,但使用sigmoid而不是ReLU。

在這張圖中,我們看到了validation accuracy隨training steps變化的情形。xx軸代表epoch,yy軸代表validation accuracy。

可以看到有BN的Network都能在比較少的steps下得到一樣的accuracy。

這張圖中,顯示了每個Network到達72.2% accuracy所需的training step數,以及達到最大的validation accuracy所需的step數。

可以看到光加上BN就能使到達72.2%所需的steps減少一半以上,而BN-x5所需的steps比Inception少14倍。而BN-x30雖然會讓初始的訓練速度略慢,但能夠達到更高的最終accuracy。

Ensemble Classification

Ensemble使用6個Network,每個都是基於BN-x30經由以下修改得到:

  • 在convolutional layers中增加初始權重
  • 使用Dropout(與Inception的40%相比,Dropout probability約為5%或10%)
  • 在最後一層hidden layer上,使用non-convolutional的BN。

而ensemble prediction是基於constituent networks的算術平均數。

可以看到說BN-Inception ensemble達到了4.9的top-5 error,超越了之前表現最好的Deep Image Ensemble,甚至還超越了human raters的accuracy。

Conclusions

本篇paper認為BN之所以可以顯著加速Deep Network的訓練,在於它減少了Internal Covariate Shift的問題。透過將BN融入Network的架構中,對每個mini-batch都做normalization,讓Network可以使用saturating nonlinearity進行training,可以忍受更高的training rates,而且(通常)不需要Dropout。在activation中加入BN只增加了兩個額外的parameters,保留了Network的expressivity。

實驗顯示只是將BN加入ImageNet classification的SOTA就可以顯著加快training速度。藉由進一步增加learning rate,移除Dropout並加上BN的其他加速,只需要少量的training steps就能得到之前SOTA的結果。將多個使用Batch Normalization訓練的model結合在一起,還能夠得到比當前ImageNet上最好的系統要好上許多的表現。

References