【調參13】如何使用Batch Normalization提高模型性能



1. Batch Normalization(批歸一化)簡介


【Paper】Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift


訓練數十層的深度神經網絡具有挑戰性,因爲它們可能對初始隨機權重和學習算法的配置敏感。造成此困難的一個可能原因是,在每次批批處理之後,當權重更新時,輸入到網絡深層的分佈可能會發生變化。這可能導致學習算法永遠追逐運動目標。網絡中各層的輸入分佈的這種變化,在技術上稱爲內部協變量平移(internal covariate shift)

批歸一化是一種用於訓練非常深的神經網絡的技術,該技術可將每個批處理的輸入標準化。不僅可以加快了模型的收斂速度,而且更重要的是在一定程度緩解了深層網絡中“梯度彌散”的問題,從而使得訓練深層網絡模型更加容易和穩定。在某些情況下,可以將訓練時間減少一半或更短,並提供一些正則化功能,從而減少泛化誤差。


1.1 訓練深層網絡的問題

這一挑戰的一個方面是,使用誤差估計將模型從輸出到輸入逐層更新,該估計假定當前層之前各層的權重是固定的。實際上,會同時更新所有層。由於在更新過程中所有層均已更改,因此更新過程將永遠追逐移動的目標。例如,給定期望先前層輸出具有給定分佈的值的情況下,更新層的權重。在更新前一層的權重後,此分佈可能會更改。

訓練深度神經網絡非常複雜,因爲在訓練過程中,隨着先前各層的參數發生變化,各層輸入的分佈也會發生變化。通常會設置較低的學習率和仔細的參數初始化來減緩訓練速度,並且訓練具有飽和非線性的模型非常困難。提出批歸一化的論文作者將訓練期間輸入分佈的變化稱爲內部協變量平移(internal covariate shift)


1.2 標準化層輸入

批歸一化(Batch Normalization),簡稱batchnorm,它提供了一種重新配置幾乎所有深層網絡的絕佳方法。重新參數化大大減少了跨多個層協調更新(coordinating updates)的問題。

它通過標準化每個小批量的每個輸入變量的激活,例如來自上一層的節點的激活,來縮放該層的輸出。標準化(standardization)是指重新縮放數據以使其平均值爲零,標準差爲1,例如高斯標準化(standard Gaussian)。當應用於計算機視覺中的圖像時,此過程也稱爲增白(whitening)

標準化前一層的激活意味着,假設後一層在權重更新期間對輸入的分佈和分佈所做的假設不會改變,至少不會顯着改變。這具有穩定和加快深度神經網絡訓練過程的效果。批歸一化的作用是僅標準化每個單元的均值和方差,以穩定學習,但允許單元之間的關係和單個單元的非線性統計發生變化。

標準化對圖層的輸入會影響模型的訓練,從而大大減少所需的時期數。它具有正則化效果,與使用激活正則化的方式非常相似,可以減少泛化誤差。批量歸一化可以對優化性能產生巨大影響,尤其是對於卷積網絡和具有sigmoidal 非線性的網絡。


1.3 如何標準化層輸入

可以在訓練期間通過計算每個批次的每個輸入變量到一個層的平均值和標準偏差並使用這些統計信息執行標準化來實現批次標準化。或者,可以在批次之間維持平均值和標準偏差的移動平均值,但可能會導致訓練不穩定。

訓練後,可以將輸入層的平均值和標準偏差設置爲在訓練數據集上觀察到的平均值。對於小批量或不包含來自訓練數據集的示例的代表性分佈的小批量,訓練和推理(訓練後使用模型)之間的標準輸入差異可能會導致性能上的明顯差異。可以通過對稱爲**批重新歸一化(BatchRenorm)**的方法進行修改來解決,該方法可使變量平均值和標準偏差的估計在批次之間更加穩定。批重歸一化使用每個維度的校正擴展了batchnorm,以確保激活在訓練網絡和推理網絡之間匹配。


【Paper】Batch Renormalization: Towards Reducing Minibatch Dependence in Batch-Normalized Models


輸入的這種標準化可以應用於第一隱藏層的輸入變量,也可以應用於來自較深層的隱藏層的激活。在實踐中,通常允許該層學習兩個新參數,即分別是新的均值Beta和標準差Gamma,這些參數允許自動縮放(scaling)和移動(shifting)標準化層輸入。在訓練過程中,模型會學習這些參數。

重要的是,將反向傳播算法更新爲對轉換後的輸入進行操作,並且誤差還用於更新模型學習到的新比例(scale)和移位(shifting)參數。標準化應用於層的輸入,即輸入變量或來自先前層的激活函數的輸出。給定激活函數的選擇,該層的輸入分佈可能是非高斯的。在這種情況下,在上一層中的激活函數之前對總的激活進行標準化可能會有好處。


1.4 批歸一化應用案例

概要 Paper 年份
Google的作者Sergey Ioffe和Christian Szegedy展示了基於Inception的卷積神經網絡的顯着加速,該神經網絡可用於對照片進行分類超過了基線方法。通過僅使用批處理歸一化,在不到訓練步數一半的情況下就達到了Inception的準確率 Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift 2016
何愷明等人在非常深的模型ResNet中對卷積層進行了歸一化處理(在每次卷積之後和激活之前都採用批量歸一化),然後在ImageNet數據集上實現了最新的結果,這是標準的照片分類任務。 Deep Residual Learning for Image Recognition 2015
Christian Szegedy等人在GoogleNet Inception-v3中使用了批量歸一化,從而在ImageNet數據集上獲得了最先進的結果。(BN-auxiliary是指輔助分類器的全連接層也進行批標準化,而不僅僅是卷積。 Rethinking the Inception Architecture for Computer Vision 2016
百度的Dario Amodei在其端到端深度模型中使用了批量歸一化遞歸神經網絡的變體來進行語音識別。將其應用於大型數據集上非常深的RNN網絡時,除了加速訓練外,使用的BatchNorm變體還大大改善了最終泛化誤差 Deep Speech 2 : End-to-End Speech Recognition in English and Mandarin 2016

1.5 批歸一化使用技巧

1.5.1 與不同的網絡類型一起使用

批量歸一化是一種通用技術,可用於將輸入歸一化到一個層。它可用於大多數網絡類型,例如多層感知器,卷積神經網絡和遞歸神經網絡。

1.5.2 激活前使用

在上一層激活功能之前或之後,可以在該層的輸入上使用批量歸一化。

像雙曲正切和邏輯函數這樣的S形激活函數,可能更適合在其之後使用批歸一化。像ReLU這樣的激活函數更適合在其之前使用。

批量歸一化的目標是在整個訓練過程中實現激活值的穩定分佈,在我們的實驗中,我們在非線性之前應用它,因爲在此情況下,匹配第一和第二時刻更可能導致穩定分佈。

1.5.3 使用大學習率

使用批量歸一化可以使網絡在訓練過程中更加穩定。這可能需要使用比正常學習率大得多的速度,進而可以進一步加快學習過程。

1.5.4 對權重初始化不敏感

深度神經網絡可能對訓練之前用於初始化權重的技術非常敏感。批歸一化帶來的訓練穩定性可以使訓練深度網絡對權重初始化方法的選擇不那麼敏感。

1.5.5 標準化輸入數據

批量標準化可以用來標準化具有不同比例的原始輸入變量。

如果爲每個輸入特徵計算的均值和標準差是在批次上而不是在整個訓練數據集上計算的,則批次大小必須足以代表每個變量的範圍。對於數據分佈高度非高斯的變量可能不合適,在這種情況下,最好將數據縮放作爲預處理步驟。

1.5.6 不與Dropout 一起使用

批量歸一化提供了一些正則化效果,減少了歸納誤差,也許不再需要使用dropout進行正則化。從修改後的BN-Inception中刪除Dropout可以加快訓練速度,而不會增加過度擬合的情況。

此外,在同一網絡中使用批處理規範化和Dropout可能不是一個好主意。原因是,考慮到在Dropout過程中節點隨機退出(dropping),用於歸一化先前層激活的統計信息可能會變得嘈雜。


2. Tensorflow.Keras API

tf.keras.layers.BatchNormalization(
    axis=-1, momentum=0.99, epsilon=0.001, center=True, scale=True,
    beta_initializer='zeros', gamma_initializer='ones',
    moving_mean_initializer='zeros', moving_variance_initializer='ones',
    beta_regularizer=None, gamma_regularizer=None, beta_constraint=None,
    gamma_constraint=None, renorm=False, renorm_clipping=None, renorm_momentum=0.99,
    fused=None, trainable=True, virtual_batch_size=None, adjustment=None, name=None,
    **kwargs
)

該層將轉換輸入,使其標準化,這意味着它們的平均值爲零,標準差爲1。在訓練期間,該層將跟蹤每個輸入變量的統計信息,並使用它們來標準化數據。

此外,可以使用學習的Beta和Gamma參數來縮放標準化輸出,這些參數定義了轉換輸出的新均值和標準差。該層可以配置爲分別通過中心(center)和比例(scale)屬性控制是否使用這些附加參數。默認情況下,它們是啓用的。

用於執行標準化的統計信息(例如,每個小批量的每個變量的平均值和標準偏差)都會更新,並保持運行平均值。動量(momentum)參數可以控制在計算更新時要包含的上一個批處理中的統計量。默認情況下,該值保持爲0.99。可以將其設置爲0.0,以僅使用當前批次的統計信息,如原始論文所述。

2.1 輸入和隱藏層輸入

可以將BatchNormalization層添加到模型中,以標準化原始輸入變量或隱藏層的輸出。

不建議使用批量歸一化來替代模型的適當數據準備。但是,當用於標準化原始輸入變量時,該層必須指定input_shape參數;例如:

...
model = Sequential
model.add(BatchNormalization(input_shape=(2,)))
...

當用於標準化隱藏層的輸出時,可以像其他任何層一樣將層添加到模型中。

...
model = Sequential
...
model.add(BatchNormalization())
...

2.2 在激活函數之前或之後使用

BatchNormalization規範化層可用於標準化上一層激活功能之前或之後的輸入。引入該方法的原始論文建議在前一層的激活函數之前添加批處理規範化,例如:

...
model = Sequential
model.add(Dense(32))
model.add(BatchNormalization())
model.add(Activation('relu'))
...

一些研究表明,在前一層的激活函數之後添加批歸一化層時,性能會更好;例如:

...
model = Sequential
model.add(Dense(32, activation='relu'))
model.add(BatchNormalization())
...

如果時間和資源允許,應該在模型上測試這兩種方法,並使用可產生最佳性能的方法。

2.3 MLP批歸一化

# example of batch normalization for an mlp
from tensorflow.keras.layers import Dense, BatchNormalization
...
model.add(Dense(32, activation='relu'))
model.add(BatchNormalization())
model.add(Dense(1))
...

2.4 CNN批歸一化

# example of batch normalization for an cnn
from tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D, BatchNormalization
...
model.add(Conv2D(32, (3,3), activation='relu'))
model.add(Conv2D(32, (3,3), activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D())
model.add(Dense(1))
...

2.5 RNN批歸一化

# example of batch normalization for a lstm
from tensorflow.keras.layers import Dense, LSTM, BatchNormalization
...
model.add(LSTM(32))
model.add(BatchNormalization())
model.add(Dense(1))
...

參考:
https://machinelearningmastery.com/batch-normalization-for-training-of-deep-neural-networks/
https://machinelearningmastery.com/how-to-accelerate-learning-of-deep-neural-networks-with-batch-normalization/
https://www.tensorflow.org/api_docs/python/tf/keras/layers/BatchNormalization?hl=en

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章