Batch Normalization


 一、BN 的作用

1、具有快速訓練收斂的特性:采用初始很大的學習率,然后學習率的衰減速度也很大

2、具有提高網絡泛化能力的特性:不用去理會過擬合中drop out、L2正則項參數的選擇問題

3、不需要使用使用局部響應歸一化層,BN本身就是一個歸一化網絡層

4、可以把訓練數據徹底打亂

 

神經網絡訓練開始前,都要對輸入數據做一個歸一化處理,原因在於神經網絡學習過程本質就是為了學習數據分布,一旦訓練數據與測試數據的分布不同,那么網絡的泛化能力也大大降低;另外一方面,一旦每批訓練數據的分布各不相同(batch 梯度下降),那么網絡就要在每次迭代都去學習適應不同的分布,這樣將會大大降低網絡的訓練速度,這也正是為什么我們需要對數據都要做一個歸一化預處理的原因。網絡中間層在訓練過程中,數據分布的改變稱之為:“Internal  Covariate Shift”。Batch  Normalization就是要解決在訓練過程中,中間層數據分布發生改變的情況

 

二、啟發來源:白化

 

所謂白化,就是對輸入數據分布變換到0均值,單位方差的正態分布——那么神經網絡會較快收斂。經過白化預處理后,數據滿足條件:a、特征之間的相關性降低,這個就相當於pca;b、數據均值、標准差歸一化,也就是使得每一維特征均值為0,標准差為1。如果數據特征維數比較大,要進行PCA,也就是實現白化的第1個要求,是需要計算特征向量,計算量非常大,於是為了簡化計算,忽略第1個要求,僅僅使用了下面的公式進行預處理,也就是近似白化預處理:

 

 

BN可以理解為對深層神經網絡每個隱層神經元的激活值做簡化版本的白化操作。

 

 

三、BN的本質

深層神經網絡在做非線性變換前的激活輸入值(就是那個x=WU+B,U是輸入)隨着網絡深度加深或者在訓練過程中,其分布逐漸發生偏移或者變動,之所以訓練收斂慢,一般是整體分布逐漸往非線性函數的取值區間的上下限兩端靠近(對於Sigmoid函數來說,意味着激活輸入值WU+B是大的負值或正值),所以這導致后向傳播時低層神經網絡的梯度消失,這是訓練深層神經網絡收斂越來越慢的本質原因。

BN則是對於每個隱層神經元,把逐漸向非線性函數映射后向取值區間極限飽和區靠攏的輸入分布強制拉回到均值為0方差為1的比較標准的正態分布,使得非線性變換函數的輸入值落入對輸入比較敏感的區域,以此避免梯度消失問題。因為梯度一直都能保持比較大的狀態,所以很明顯對神經網絡的參數調整效率比較高,就是變動大,就是說向損失函數最優值邁動的步子大,也就是收斂地快。

 

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

 

 

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

 

                                                                 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后,目前大部分Activation的值落入非線性函數的線性區內,其對應的導數遠離導數飽和區,這樣來加速訓練收斂過程。BN為了保證非線性的獲得,對變換后的滿足均值為0方差為1的x又進行了scale加上shift操作(y=scale*x+shift),即每個神經元增加了兩個參數scale和shift參數,這兩個參數是通過訓練學習到的,通過scale和shift把這個值從標准正態分布左移或者右移一點並長胖一點或者變瘦一點,每個實例挪動的程度不一樣,這樣等價於非線性函數的值從正中心周圍的線性區往非線性區動了動。

 

 

 

四、BN算法概述

(1)

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

 

具體BN操作就是對於隱層內每個神經元的激活值來說,進行如下變換:

 

經過這個變換后某個神經元的激活x形成了均值為0,方差為1的正態分布,目的是把值往后續要進行的非線性變換的線性區拉動,增大導數值,增強反向傳播信息流動性,加快訓練收斂速度(這里t層某個神經元的x(k)不是指原始輸入,就是說不是t-1層每個神經元的輸出,而是t層這個神經元的激活x=WU+B,這里的U才是t-1層神經元的輸出)。

 

 

(2)

如果是僅僅使用上面的歸一化公式對網絡(t-1)層的輸出數據做歸一化,然后送入網絡下一層 t,這樣是會影響到本層網絡(t-1)所學習到的特征的。所以引入了可學習參數γ、β

 

每一個神經元xk都會有一對這樣的參數γ、β,根據這兩個參數恢復出原始的某一層所學到的特征:

 

Batch Normalization網絡層的前向傳導過程公式就是(m指的是mini-batch size):

 

(3)

網絡一旦訓練完畢,參數都是固定的,這個時候即使是每批訓練樣本進入網絡,那么BN層計算的均值u、和標准差都是固定不變的。我們可以采用這些數值來作為測試樣本所需要的均值、標准差,於是最后測試階段的u和σ 計算公式如下:

 

對於均值來說直接計算所有batch u值的平均值;然后對於標准偏差采用每個batch σB的無偏估計。最后測試階段,BN的使用公式就是:

 

 

五、Tensorflow的Batch Normalization

 

tensorflow中關於BN(Batch Normalization)的函數主要有兩個,分別是:

• tf.nn.moments

• tf.nn.batch_normalization

 

(1)tf.nn.moments函數

def moments(x, axes, name=None, keep_dims=False)

• x 可以理解為我們輸出的數據,形如 [batchsize, height, width, kernels]

• axes 表示在哪個維度上求解,是個list,例如 [0, 1, 2]

• name 就是個名字

• keep_dims 是否保持維度

• 兩個輸出:

Two Tensor objects: mean(均值) and variance(方差).

 

計算卷積神經網絡某層的的mean和variance:

假定我們需要計算數據的形狀是 [batchsize, height, width, kernels],例如:

img = tf.Variable(tf.random_normal([128, 32, 32, 64]))

axis = list(range(len(img.get_shape()) - 1))

mean, variance = tf.nn.moments(img, axis)

 

對應輸出為:

 

一個batch里的128個圖,經過一個64 kernels卷積層處理,得到了128×64個圖,再針對每一個kernel所對應的128個圖,求它們所有像素的mean和variance,因為總共有64個kernels,輸出的結果就是一個一維長度64的數組

 

 

 

 

 

 

(2)tf.nn.batch_normalization函數

 

def batch_normalization(x, mean, variance, offset, scale, variance_epsilon, name=None):

同樣返回mean、variance

 

 

 

offset和scale這兩個參數是需要訓練的,其中offset一般初始化為0,scale初始化為1,另外offset、scale的shape與mean相同。

 

注意:BN在神經網絡進行training和testing的時候,所用的mean、variance是不一樣的!(在上文的 “四-(3)”有提及)

 


免責聲明!

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



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