【網路最佳化】Batch Normalization(inception V2) 論文解析(轉)

來源:互聯網
上載者:User

標籤:long   上下   nis   轉換   多少   技術分享   重要性   pac   hit   

前言

懶癌翻了,這篇不想寫overview了,公式也比較多,今天有(zhao)點(jie)累(kou),不想一點點寫latex啦,讀論文的時候感覺文章不錯,雖然看似很多數學公式,其實都是比較基礎的公式,文章也比較細,從網上找了兩篇較好的講解,引用串連在每篇文章前面。

文章1
https://www.cnblogs.com/guoyaohua/p/8724433.html#undefined

  Batch Normalization作為最近一年來DL的重要成果,已經廣泛被證明其有效性和重要性。雖然有些細節處理還解釋不清其理論原因,但是實踐證明好用才是真的好,別忘了DL從Hinton對深層網路做Pre-Train開始就是一個經驗領先於理論分析的偏經驗的一門學問。本文是對論文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》的導讀。


  機器學習領域有個很重要的假設:IID獨立同分布假設,就是假設訓練資料和測試資料是滿足相同分布的,這是通過訓練資料獲得的模型能夠在測試集獲得好的效果的一個基本保障。那BatchNorm的作用是什麼呢?BatchNorm就是在深度神經網路訓練過程中使得每一層神經網路的輸入保持相同分布的。


  接下來一步一步的理解什麼是BN。


  為什麼深度神經網路隨著網路深度加深,訓練起來越困難,收斂越來越慢?這是個在DL領域很接近本質的好問題。很多論文都是解決這個問題的,比如ReLU啟用函數,再比如Residual Network,BN本質上也是解釋並從某個不同的角度來解決這個問題的。


一、“Internal Covariate Shift”問題

  從論文名字可以看出,BN是用來解決“Internal Covariate Shift”問題的,那麼首先得理解什麼是“Internal Covariate Shift”?


  論文首先說明Mini-Batch SGD相對於One Example SGD的兩個優勢:梯度更新方向更準確;並行計算速度快;(為什麼要說這些?因為BatchNorm是基於Mini-Batch SGD的,所以先誇下Mini-Batch SGD,當然也是大實話);然後吐槽下SGD訓練的缺點:超參數調起來很麻煩。(作者隱含意思是用BN就能解決很多SGD的缺點)


  接著引入covariate shift的概念如果ML系統執行個體集合<X,Y>中的輸入值X的分布老是變,這不符合IID假設,網路模型很難穩定的學規律,這不得引入遷移學習才能搞定嗎,我們的ML系統還得去學習怎麼迎合這種分布變化啊。對於深度學習這種包含很多隱層的網路結構,在訓練過程中,因為各層參數不停在變化,所以每個隱層都會面臨covariate shift的問題,也就是在訓練過程中,隱層的輸入分布老是變來變去,這就是所謂的“Internal Covariate Shift”,Internal指的是深層網路的隱層,是發生在網路內部的事情,而不是covariate shift問題只發生在輸入層。


  然後提出了BatchNorm的基本思想:能不能讓每個隱層節點的啟用輸入分布固定下來呢?這樣就避免了“Internal Covariate Shift”問題了。


  BN不是憑空拍腦袋拍出來的好點子,它是有啟發來源的:之前的研究表明如果在影像處理中對輸入映像進行白化(Whiten)操作的話——所謂白化就是對輸入資料分布變換到0均值,單位方差的常態分佈——那麼神經網路會較快收斂,那麼BN作者就開始推論了:映像是深度神經網路的輸入層,做白化能加快收斂,那麼其實對於深度網路來說,其中某個隱層的神經元是下一層的輸入,意思是其實深度神經網路的每一個隱層都是輸入層,不過是相對下一層來說而已,那麼能不能對每個隱層都做白化呢?這就是啟發BN產生的原初想法,而BN也確實就是這麼做的,可以理解為對深層神經網路每個隱層神經元的啟用值做簡化版本的白化操作。


二、BatchNorm的本質思想

  BN的基本思想其實相當直觀:因為深層神經網路在做非線性變換前的啟用輸入值(就是那個x=WU+B,U是輸入)隨著網路深度加深或者在訓練過程中,其分布逐漸發生位移或者變動,之所以訓練收斂慢,一般是整體分布逐漸往非線性函數的取值區間的上下限兩端靠近(對於Sigmoid函數來說,意味著啟用輸入值WU+B是大的負值或正值),所以這導致反向傳播時低層神經網路的梯度消失,這是訓練深層神經網路收斂越來越慢的本質原因而BN就是通過一定的正常化手段,把每層神經網路任意神經元這個輸入值的分布強行拉回到均值為0方差為1的標準常態分佈,其實就是把越來越偏的分布強制拉回比較標準的分布,這樣使得啟用輸入值落在非線性函數對輸入比較敏感的地區,這樣輸入的小變化就會導致損失函數較大的變化,意思是這樣讓梯度變大,避免梯度消失問題產生,而且梯度變大意味著學習收斂速度快,能大大加快訓練速度。


  THAT’S IT。其實一句話就是:對於每個隱層神經元,把逐漸向非線性函數映射後向取值區間極限飽和區靠攏的輸入分布強制拉回到均值為0方差為1的比較標準的常態分佈,使得非線性變換函數的輸入值落入對輸入比較敏感的地區,以此避免梯度消失問題。因為梯度一直都能保持比較大的狀態,所以很明顯對神經網路的參數調整效率比較高,就是變動大,就是說向損失函數最優值邁動的步子大,也就是說收斂地快。BN說到底就是這麼個機制,方法很簡單,道理很深刻。


  上面說得還是顯得抽象,下面更形象地表達下這種調整到底代表什麼含義。



  圖1  幾個常態分佈


  假設某個隱層神經元原先的啟用輸入x取值符合常態分佈,常態分佈均值是-2,方差是0.5,對應中最左端的淺藍色曲線,通過BN後轉換為均值為0,方差是1的常態分佈(對應中的深藍色圖形),意味著什麼,意味著輸入x的取值常態分佈整體右移2(均值的變化),圖形曲線更平緩了(方差增大的變化)。這個圖的意思是,BN其實就是把每個隱層神經元的啟用輸入分布從偏離均值為0方差為1的常態分佈通過平移均值壓縮或者擴大麴線尖銳程度,調整為均值為0方差為1的常態分佈。


  那麼把啟用輸入x調整到這個常態分佈有什麼用?首先我們看下均值為0,方差為1的標準常態分佈代表什麼含義:



 


圖2  均值為0方差為1的標準常態分佈圖


 


  這意味著在一個標準差範圍內,也就是說64%的機率x其值落在[-1,1]的範圍內,在兩個標準差範圍內,也就是說95%的機率x其值落在了[-2,2]的範圍內。那麼這又意味著什嗎?我們知道,啟用值x=WU+B,U是真正的輸入,x是某個神經元的啟用值,假設非線性函數是sigmoid,那麼看下sigmoid(x)其圖形:



圖3. Sigmoid(x)


及sigmoid(x)的導數為:G’=f(x)(1-f(x)),因為f(x)=sigmoid(x)在0到1之間,所以G’在0到0.25之間,其對應的圖如下:



圖4  Sigmoid(x)導數圖


  假設沒有經過BN調整前x的原先常態分佈均值是-6,方差是1,那麼意味著95%的值落在了[-8,-4]之間,那麼對應的Sigmoid(x)函數的值明顯接近於0,這是典型的梯度飽和區,在這個地區裡梯度變化很慢,為什麼是梯度飽和區?請看下sigmoid(x)如果取值接近0或者接近於1的時候對應導數函數取值,接近於0,意味著梯度變化很小甚至消失。而假設經過BN後,均值是0,方差是1,那麼意味著95%的x值落在了[-2,2]區間內,很明顯這一段是sigmoid(x)函數接近於線性變換的地區,意味著x的小變化會導致非線性函數值較大的變化,也即是梯度變化較大,對應導數函數圖中明顯大於0的地區,就是梯度非飽和區。


  從上面幾個圖應該看出來BN在幹什麼了吧?其實就是把隱層神經元啟用輸入x=WU+B從變化不拘一格的常態分佈通過BN操作拉回到了均值為0,方差為1的常態分佈,即原始常態分佈中心左移或者右移到以0為均值,展開或者縮減形態形成以1為方差的圖形。什麼意思?就是說經過BN後,目前大部分Activation的值落入非線性函數的線性區內,其對應的導數遠離導數飽和區,這樣來加速訓練收斂過程。


  但是很明顯,看到這裡,稍微瞭解神經網路的讀者一般會提出一個疑問:如果都通過BN,那麼不就跟把非線性函數替換成線性函數效果相同了?這意味著什嗎?我們知道,如果是多層的線性函數變換其實這個深層是沒有意義的,因為多層線性網路跟一層線性網路是等價的。這意味著網路的表達能力下降了,這也意味著深度的意義就沒有了。所以BN為了保證非線性獲得,對變換後的滿足均值為0方差為1的x又進行了scale加上shift操作(y=scalex+shift),每個神經元增加了兩個參數scale和shift參數,這兩個參數是通過訓練學習到的,意思是通過scale和shift把這個值從標準常態分佈左移或者右移一點並長胖一點或者變瘦一點,每個執行個體挪動的程度不一樣,這樣等價於非線性函數的值從正中心周圍的線性區往非線性區動了動。核心思想應該是想找到一個線性和非線性較好平衡點,既能享受非線性較強表達能力的好處,又避免太靠非線性區兩頭使得網路收斂速度太慢。當然,這是我的理解,論文作者並未明確這樣說。但是很明顯這裡的scale和shift操作是會有爭議的,因為按照論文作者論文裡寫的理想狀態,就會又通過scale和shift操作把變換後的x調整回未變換的狀態,那不是饒了一圈又繞回去原始的“Internal Covariate Shift”問題裡去了嗎,感覺論文作者並未能夠清楚地解釋scale和shift操作的理論原因。


三、訓練階段如何做BatchNorm

  上面是對BN的抽象分析和解釋,具體在Mini-Batch SGD下做BN怎麼做?其實論文裡面這塊寫得很清楚也容易理解。為了保證這篇文章完整性,這裡簡單說明下。


  假設對於一個深層神經網路來說,其中兩層結構如下:



  圖5  DNN其中兩層


  要對每個隱層神經元的啟用值做BN,可以想象成每個隱層又加上了一層BN操作層,它位於X=WU+B啟用值獲得之後,非線性函數變換之前,其圖示如下:



  圖6. BN操作


  對於Mini-Batch SGD來說,一次訓練過程裡麵包含m個訓練執行個體,其具體BN操作就是對於隱層內每個神經元的啟用值來說,進行如下變換:



  要注意,這裡t層某個神經元的x(k)不是指原始輸入,就是說不是t-1層每個神經元的輸出,而是t層這個神經元的線性啟用x=WU+B,這裡的U才是t-1層神經元的輸出。變換的意思是:某個神經元對應的原始的啟用x通過減去mini-Batch內m個執行個體獲得的m個啟用x求得的均值E(x)併除以求得的方差Var(x)來進行轉換。


  上文說過經過這個變換後某個神經元的啟用x形成了均值為0,方差為1的常態分佈,目的是把值往後續要進行的非線性變換的線性區拉動,增大導數值,增強反向傳播資訊流動性,加快訓練收斂速度。但是這樣會導致網路表達能力下降,為了防止這一點,每個神經元增加兩個調節參數(scale和shift),這兩個參數是通過訓練來學習到的,用來對變換後的啟用反變換,使得網路表達能力增強,即對變換後的啟用進行如下的scale和shift操作,這其實是變換的反操作:



  BN其具體操作流程,如論文中描述的一樣:



 


  過程非常清楚,就是上述公式的流程化描述,這裡不解釋了,直接應該能看懂。


四、BatchNorm的推理(Inference)過程

  BN在訓練的時候可以根據Mini-Batch裡的若干訓練執行個體進行啟用數值調整,但是在推理(inference)的過程中,很明顯輸入就只有一個執行個體,看不到Mini-Batch其它執行個體,那麼這時候怎麼對輸入做BN呢?因為很明顯一個執行個體是沒法算執行個體集合求出的均值和方差的。這可如何是好?


  既然沒有從Mini-Batch資料裡可以得到的統計量,那就想其它辦法來獲得這個統計量,就是均值和方差。可以用從所有訓練執行個體中獲得的統計量來代替Mini-Batch裡面m個訓練執行個體獲得的均值和方差統計量,因為本來就打算用全域的統計量,只是因為計算量等太大所以才會用Mini-Batch這種簡化方式的,那麼在推理的時候直接用全域統計量即可。


  決定了獲得統計量的資料範圍,那麼接下來的問題是如何獲得均值和方差的問題。很簡單,因為每次做Mini-Batch訓練時,都會有那個Mini-Batch裡m個訓練執行個體獲得的均值和方差,現在要全域統計量,只要把每個Mini-Batch的均值和方差統計量記住,然後對這些均值和方差求其對應的數學期望即可得出全域統計量,即:



  有了均值和方差,每個隱層神經元也已經有對應訓練好的Scaling參數和Shift參數,就可以在推導的時候對每個神經元的啟用資料計算NB進行變換了,在推理過程中進行BN採取如下方式:



  這個公式其實和訓練時



  是等價的,通過簡單的合并計算推導就可以得出這個結論。那麼為啥要寫成這個變換形式呢?我猜作者這麼寫的意思是:在實際啟動並執行時候,按照這種變體形式可以減少計算量,為啥呢?因為對於每個隱層節點來說:


          


  都是固定值,這樣這兩個值可以事先算好存起來,在推理的時候直接用就行了,這樣比原始的公式每一步驟都現算少了除法的運算過程,乍一看也沒少多少計算量,但是如果隱層節點個數多的話節省的計算量就比較多了。


五、BatchNorm的好處

  BatchNorm為什麼NB呢,關鍵還是效果好。不僅僅極大提升了訓練速度,收斂過程大大加快;②還能增加分類效果,一種解釋是這是類似於Dropout的一種防止過擬合的正則化表達方式,所以不用Dropout也能達到相當的效果;③另外調參過程也簡單多了,對於初始化要求沒那麼高,而且可以使用大的學習率等。總而言之,經過這麼簡單的變換,帶來的好處多得很,這也是為何現在BN這麼快流行起來的原因。


 

文章251691868論文題目:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

首先看看部落格http://blog.csdn.net/happynear/article/details/44238541中最開始介紹的:

為什麼中心化,方差歸一化等,可以加快收斂?

補充一點:輸入x集中在0周圍,sigmoid更可能在其未飽和地區,梯度相對更大一些,收斂更快。

 

Abstract

1.深層網路訓練時,由於模型參數在不斷修改,所以各層的輸入的機率分布在不斷變化,這使得我們必須使用較小的學習率及較好的權重初值,導致訓練很慢,同時也導致使用saturating nonlinearities 啟用函數(如sigmoid,正負兩邊都會飽和)時訓練很困難。

這種現象加 internal covariate shift ,解決辦法是:對每層的輸入進行歸一化。

本文方法特點是 :making normalization a part of the model architecture and performing the normalization for each training mini-batch

Batch Normalization 讓我們可以使用更大的學習率,初值可以更隨意。它起到了正則項的作用,在某些情況下,有它就不需要使用Dropout了。

在Imagenet上, achieves the same accuracy with 14 times fewertraining steps

 

Introduction

1. SGD:

用minibatch去近似整個訓練集的梯度,在並行計算下,m個合成一個batch計算比單獨計算m次快很多。 2.SGD雖然簡單高效,但是需要調節很多超參,學習率,初值等。各層權重參數嚴重影響每層的輸入,輸入的小變動隨著層數加深不斷被放大。這帶來一個問題:各層輸入分布的變動導致模型需要不停地去擬合新的分布。當一個學習系統的輸入分布是變化的時,即訓練集的樣本分布和測試集的樣本分布不一致,訓練的模型就很難有較好的泛化能力,這叫做 covariate shift (Shimodaira, 2000),解決辦法是domain adaptation (Jiang, 2008).和遷移學習。BN想把輸入的均值方差正常化,使輸入分布一致,但是僅均值、方差一樣的分布就一定一樣嗎?但是思路是這樣,而且效果好。 也可以不只關注學習系統整體,而關注它的內部,如一個subnetwork或 a layer:損失函數為:sub-network的損失函數為:SGD: is exactly equivalent to that for a stand-alone network F2 with input x.輸入X的分布保持不變的話,參數就不需要 readjust 去補償X分布的變化。注意Sigmoid 函數的特性,當輸入不集中在 0 附近時(飽和時),梯度會非常小,訓練會很慢。然而,輸入x受前面層的參數的影響,這些參數的變化很可能導致x過早變化到sigmoid函數的飽和地區,收斂減慢。這種影響隨著深度增加而加大。ReLU和好的初值、更小的學習率可以解決梯度消失的問題。但是,要是我們能讓輸入更穩定,就不太可能 get stuck in the saturated regime,訓練也會加快。 3.這種深度網路內部,參數不斷變化導致的各層輸入分布的變化 稱為 Internal Covariate Shift.Batch Normalization a.保持各層輸入的均值和方差穩定,來減弱 internal covariate shift;b.也讓梯度受參數及其初值的減小;c.它也算作正則項,減少對Dropout的依賴;d.它讓卡在飽和地區的機率降低,以便可以使用 saturating nonlinearities Towards Reducing Internal Covariate Shift1.網路輸入白化會加快收斂 (LeCun et al., 1998b; Wiesler & Ney, 2011) 並不是直接在每層正常化這麼簡單,如果模型的最佳化求梯度時不考慮到歸一化的話,會影響模型,就是你最佳化半天學到了某種分布,一正常化,就把這它破壞了。 2.正常化與某個樣本的各層輸入及所有樣本的各層輸入都有關(對某個正常化時用到了所有樣本):在反向傳導時,求導需考慮下面兩項:這樣基於整個訓練集的白化是非常耗時的,因為白化需要計算 x 的共變數矩陣及白化部分,還需計算BP演算法中的求導。但是基於某個或者部分樣本進行正常化又會changes the representation ability of a network所以本文在minibatch內歸一化,再用可以學習的 γ 和 β 來擬合minibatch的統計量與整個訓練集統計量之間的關係。 Normalization via Mini-Batch Statistics

 1.有兩個方面簡化計算:

a.把 x 向量中每個元素當成獨立隨機變數單獨進行正常化,向量中各變數獨立了,也沒有什麼共變數矩陣了。這種正常化在各變數相關的情況下依然能加速收斂,(LeCun et al., 1998b),此外,如果看成向量中變數的聯合機率,需要計算共變數矩陣,如果變數個數大於minibatch中樣本數,共變數矩陣無法復原!!

b.在每個mini-batch中計算得到mini-batch mean和variance來替代整體訓練集的mean和variance. Algorithm 1.

simply normalizing each input of a layer may change what the layer can represent.normalizing the inputs of a sigmoid would constrain them to the linear regime of the nonlinearity

為瞭解決這個問題,we make sure that the transformation inserted in the network can represent the identity transform.也就是用用可以學習的 γ 和 β 去擬合出與原先等價的變換。

採用 normalize via mini-batch statistics ,the statistics used for normalization can fully participate in the gradient backpropagation

 

Batch Normalizing Transform:

只要minibatch中的樣本採樣與同一分布,正常化後的輸入 x 期望為0,方差為1,把規範後的 x 進行線性變換得到 y 作為後續層的輸入,可以發現 後續層的輸入具有固定的均值和方差的。儘管 正常化後的 x 的聯合分布在訓練過程中會改變(源於第一個簡化,本文的正常化是把 x 向量中各個變數當作獨立的,單獨正常化的,所以他們的聯合分布並不穩定,只是單獨是穩定的),但還是可以使訓練加速。

 

2.最佳化中也需要對 BN 變換的兩個參數進行最佳化,鏈式法則求導就可以了:

 BN 變換是可微的,通過BN變換,可以減弱輸入分布的 internal covariate shift ,並且學習到這個線性變換讓 BN變換 與網路本來的變換 等價,preserves the network capacity

Training and Inference with Batch-Normalized Networks

1.使用BN,把網路中各層輸入 x 變為 BN(x)即可。可以使用SGD及其各種變種訓練。

2.訓練時候在minibatch內正常化非常高效,但是推斷時就不需要而且不應該這樣了。推斷是我們希望輸出只取決於輸入,所以正常化中的期望、方差用全部資料計算:

就是各minibatch的方差求平均,minibatch數量為m。

注意:推斷時,均值和方差是固定的,那麼正常化這步線性變換可以和 γ、β 這步線性變換 合成 一個線性變換。訓練BN網路步驟如下:

 

Batch-Normalized Convolutional Networks

1. BN 可以用於任意層的 activations,但是把 BN 加在 W u +b 之後,非線性啟用函數之前更好!

因為前層的 activations (這層的輸入 u)是非線性輸出的,其分布很可能在訓練中變化;而 W u +b 更可能有 a symmetric, non-sparse distribution, that is “more Gaussian”
(Hyv¨arinen & Oja, 2000); 正常化它更有可能得到穩定的 activations 分布。

2. 注意 b 可以不管,因為減均值時 b 會被消掉,b 的作用其實被 β 代替了,所以:

BN是對 x =W u 的每一維單獨正常化

3.對卷積層,正常化也該保持卷積特性,即 相同feature map,不同 location 的元素 用相同方式正常化:

a mini-batch of size m and feature maps of size p × q,  m*p*q個元素一起正常化!每個 feature map 有一對 γ β。

 

Batch Normalization enables higher learning rates

1.太大的學習率可能導致 梯度爆炸或消失以及卡在局部極值,BN可以防止參數小變換被逐層放大,通過修改 γ、β可以最佳化 activations的變化。

一般來說,大學習率增加參數的scale,在BP中放大了梯度,導致模型爆炸。然而使用了 BN,每層的BP不受其參數影響:

The scale does not affect the layer Jacobian nor, consequently, the gradient propagation.

而且:大權重會導致更小的梯度,所以BN可以穩定參數的增長。

2.BN還可以使 layer Jacobians 的奇異值接近 1 .這更利於訓練 (Saxe et al.,2013).

論文中有在高斯、獨立且變換為線性等條件下,可以推出來,但是說實話假設有點太苛刻,有點強行解釋的味道,論文也提出更普適的結論需後續研究。

 

Batch Normalization regularizes the model

1.使用BN後,訓練時對於單個樣本與整個minibatch綜合考慮了,training network no longer producing deterministic values for a given training example

這有利於提升網路的泛化能力,可以代替 Dropout

 

ExperimentsActivations over time

在mnist上用3個隱層,每層100個的神經元的網路進行實驗,初值為高斯,sigmoid函數,迭代50000次,minibatch為60個樣本,損失為交叉熵。

(a)可以看到,加BN測試精度更高,而且最開始就達到了較高的精度;

(b,c)可以明顯看到加BN後分布更加穩定。圖中三條線為{15,50,85}分位元。

後面的實驗就看論文了。

【網路最佳化】Batch Normalization(inception V2) 論文解析(轉)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.