學習記錄:
深度學習筆記(一):卷積層+激活函數+池化層+全連接層
深度學習筆記(二):激活函數總結
深度學習筆記(三):BatchNorm(BN)層
深度學習筆記(四):梯度下降法與局部最優解
深度學習筆記(五):欠擬合、過擬合
防止過擬合(一):正則化
防止過擬合(二):Dropout
防止過擬合(三):數據增強
一、背景
卷積神經網絡的出現,網絡參數量大大減低,使得幾十層的深層網絡成爲可能。然而,在殘差網絡出現之前,網絡的加深使得網絡訓練變得非常不穩定,甚至出現網絡長時間不更新或者不收斂的情形,同時網絡對超參數比較敏感,超參數的微量擾動也會導致網絡的訓練軌跡完全改變。
二、提出
2015 年,Google 研究人員Sergey Ioffe等提出了一種參數標準化(Normalize)的手段,並基於參數標準化設計了 Batch Nomalization(簡稱 BatchNorm或 BN)層 。BN層提出後:
(1)使得網絡的超參數的設定更加自由,比如更大的學習率,更隨意的網絡初始化等,同時網絡的收斂速度更快,性能也更好。
(2)廣泛地應用在各種深度網絡模型上,卷積層、BN 層,ReLU 層、池化層一度成爲網絡模型的標配單元,通過堆疊 Conv-BN-ReLU-Pooling 方式往往可以獲得不錯的模型性能。
三、原理
網絡層的輸入x分佈相近,並且分佈在較小範圍內時(如 0 附近),更有利於函數的迭代優化。那麼如何保證輸入x的分佈相近呢?
數據標準化可以實現此目的,通過數據標準化操作可以將數據x映射:
其中、來自統計的所有數據x的均值和方差,是爲防止出現除 0的錯誤而設置的較小數,比如。
很容易很看出來:上面的公式表示的是正太分佈。也就是說,通過上面的公式計算,可以將原本隨機分佈的輸入數據x,轉化成按正太分佈分佈的數據,從而使得輸入網絡的數據分佈較近,有利於網絡的迭代優化。
四、計算
要使得原本的輸入x映射到正太分佈的,就需要分別計算出和的值,然後帶入下面公式,完成轉換。
(1)訓練階段
通過統計可以得到Batch組數據的均值和方差,計算公式如下:
其中,m爲Batch樣本數。在實際應用過程中,、近似於和。計算時,可直接用、代替。
因此,在訓練階段,通過下面公式標準化輸入:
(2)測試階段
在測試階段,、計算原理和訓練階段相同。需要注意的是,這裏的是測試集的數據,m是測試集一次輸入的batch數。
因此,在測試階段,通過下面公式標準化輸入:
注意:測試階段也進行標準化,並不是爲了去優化訓練,只是爲了和訓練解階段保持一致,這樣得到的測試結果纔有意義。
五、Scale and Shift
上述的標準化運算並沒有引入額外的待優化變量,、 均由統計得到,不需要參與梯度更新。實際上,爲了提高 BN 層的表達能力,BN 層作者引入了“scale and shift”技巧,將變量再次映射變換:
其中參數實現對標準化後的再次進行縮放,參數實現對標準化的進行平移。不同的是,、參數均由反向傳播算法自動優化,實現網絡層“按需”縮放平移數據的分佈的目的。
於是,在測試階段,標準化公式與縮放平移結合變爲:
六、BN層實現
在 TensorFlow 中,通過 layers.BatchNormalization()類可以非常方便地實現 BN 層:
# 插入BN層
layers.BatchNormalization()