深度學習之BatchNorm(批量標准化)


     BN作為最近一年來深度學習的重要成果,已經廣泛被證明其有效性和重要性。雖然還解釋不清其理論原因,但是實踐證明好用才是真的。

     理解一個功能只需三問,是什么?為什么?怎么樣?也就是3W。接下來逐一分析下:

一、什么是BN

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

 

二、為什么要使用BN

     根據論文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》所講內容,BN主要是解決Internal Convariate Shift問題。那么什么是Internal Convariate Shift呢? 可以這樣解釋:如果ML系統實例集合<X,Y>中的輸入值X的分布老是變,這不符合IID假設,網絡模型很難學習到有效的規律。對於深度學習這種包含很多隱層的網絡結構,在訓練過程中,因為各層參數不停在變化,所以每個隱層都會面臨covariate shift的問題,也就是在訓練過程中,隱層的輸入分布老是變來變去,這就是所謂的“Internal Covariate Shift”,Internal指的是深層網絡的隱層,是發生在網絡內部的事情,而不是covariate shift問題只發生在輸入層。由此提出了BN:讓每個隱層節點的激活輸入分布在固定區域。

      圖像白化:對輸入數據分布變換到0均值,1方差的正態分布。在神經網絡的輸入層中引入白化操作后收斂會加快,所以,進一步想:如果在神經網絡的各層都加入,是不是可以較快的提高收斂速度呢?這就是提出BN的最初想法。

       BN的基本思想:深層神經網絡在做非線性變換前的激活輸入值(就是y=Wx+B,x是輸入)隨着網絡深度加深或者在訓練過程中,其分布逐漸發生偏移或者變動,之所以訓練收斂慢,一般是整體分布逐漸往非線性函數的取值區間的上下限兩端靠近。

       對於Sigmoid函數來說,意味着激活輸入值Wx+B是大的負值或正值,所以這導致反向傳播時低層神經網絡的梯度消失,這是訓練深層神經網絡收斂越來越慢的本質原因.BN就是通過一定的規范化手段,把每層神經網絡任意神經元這個輸入值的分布強行拉回到均值為0方差為1的標准正態分布,其實就是把越來越偏的分布強制拉回比較標准的分布,這樣使得激活輸入值落在非線性函數對輸入比較敏感的區域,這樣輸入的小變化就會導致損失函數較大的變化,意思是這樣讓梯度變大,避免梯度消失問題產生,而且梯度變大意味着學習收斂速度快,能大大加快訓練速度。BN說到底就是這個機制,方法很簡單,道理很深刻。

      把激活輸入x調整到這個正態分布有什么用?首先我們看下均值為0,方差為1的標准正態分布代表什么含義:

圖:均值為0方差為1的標准正態分布圖

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

圖: Sigmoid(x)

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

圖: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=scale*x+shift),每個神經元增加了兩個參數scale和shift參數,這兩個參數是通過訓練學習到的,意思是通過scale和shift把這個值從標准正態分布左移或者右移一點並長胖一點或者變瘦一點,每個實例挪動的程度不一樣,這樣等價於非線性函數的值從正中心周圍的線性區往非線性區動了動。核心思想應該是想找到一個線性和非線性的較好平衡點,既能享受非線性的較強表達能力的好處,又避免太靠非線性區兩頭使得網絡收斂速度太慢。

 

三、怎么使用

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

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

對於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具體操作流程,如論文描述一樣:

 推理過程:

        BN在訓練時可根據若干訓練實例進行激活,但在推理時只有一個輸入,怎么辦?

這里可使得全局統計量來代替。

       接下來就是如何獲取全局統計量的問題了,

只要把每個Mini-Batch的均值和方差統計量記住,然后對這些均值和方差求其對應的數學期望即可得出全局統計量,即:

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

  這個公式其實和訓練時

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

          

四、BN優勢

       1、極大提升了訓練速度,收斂過程大大加快;

       2、能增加分類效果,一種解釋是這是類似於Dropout的一種防止過擬合的正則化表達方式,所以不用Dropout也能達到相當的效果;

       3、調參過程也變簡單了,對於初始化要求沒那么高,而且可以使用大的學習率等。

 

參考鏈接:

      https://www.cnblogs.com/guoyaohua/p/8724433.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM