Tensorflow學習筆記No.6

數據的批標準化

本篇主要講述什麼是標準化,為什麼要標準化,以及如何進行標準化(添加BN層)。

1.什麼是標準化

  傳統機器學習中標準化也叫做歸一化。

  一般是將數據映射到指定的範圍,用於去除不同維度數據的量綱以及量綱單位(說白了就是讓數據儘可能處於某個範圍內)。

  數據標準化讓機器學習模型看到的不同樣本彼此之間更加相似,這有助於模型的學習與對新數據的泛化

  常見的數據標準化形式:

     標準化:

    將數據減去其平均值使其中心值為0,然後將數據除以其標準差使其標準差為1。

    歸一化:

    將數據減去最小值除以最大時,使取值範圍壓縮到0~1之間。

   批標準化:

  Batch Normalization(BN),批標準化

   和普通的數據標準化類似,是將分散的數據統一的一種做法,也是優化神經網路的一種方法。

   不僅在數據輸入之前對數據做標準化,在網路模型的每一次變換之後都應該考慮數據的標準化。

   即使在訓練過程中,均值和方差隨著時間發生變化,它也可以適應性的將數據標準化。

2.為什麼要做批標準化

   批標準化解決的問題是梯度消失梯度爆炸

   批標準化是一種訓練優化方法

  梯度消失與梯度爆炸:

    對於激活函數,之前一直使用Sigmoid函數,其函數影像成一個S型,如下所示,它會使得輸出在[0, 1]之間:

S(x) = \frac{1}{1+e^{-x}} = \frac{e^x}{e^x+1}

 
    如果我們輸入的數據在0附近左右均勻分布,x的變化就會引起y的正常變化,就是一個正常的梯度變化。
   但是,當數據全部非常大,或者非常小的時候,x上的變化幾乎不會引起y的變化,訓練的速度就會非常緩慢,且效果差,這種情況就稱為梯度消失。同理,在其他的激活函數中,也會出現數據範圍導致的梯度異常激增,x上的微小變化就會導致y的劇烈變化,從而影響訓練效果,這種情況稱之為梯度爆炸。

  批標準化的好處:

  數據預處理可以加速收斂,同理,在神經網路中使用批標準化也可以加速收斂,而且還有更多的優點。

  1.具有正則化的效果(抑制過擬合)。

  2.提高模型泛化能力。

  3.允許更高的學習率從而加速收斂。

  4.批標準化有助於梯度的傳播,因此能夠使用更深的網路進行訓練。對於特別深的神經網路,只有包含多個Batch Normalization(BN)層才能進行訓練。

3.tensorflow實現批標準化

  Batch Normalization通常在卷積層或者全連接層之後使用(原始論文中一般是應用於卷積層或全連接層之後,在激活函數之前。但是,實際上放在激活函數之後效果可能更好)。

  使用tf.keras.layers.Batchnormalization()來實現。

  tf.keras.layers.Batchnormalization()不僅可以處理訓練數據的均值和方差,也可以在預測時,根據訓練數據均值和方差的期望值對測試數據進行處理。

  程式碼: 

1 model.add(tf.keras.layers.Conv2D(64, (3, 3)))
2 model.add(tf.keras.layers.BatchNormalization())
3 model.add(tf.keras.layers.Activation('relu'))
4 #兩種BN層插入方式
5 model.add(tf.keras.layers.Conv2D(64, (3, 3), activation = 'relu'))
6 model.add(tf.keras.layers.BatchNormalization())