【深度學習】批歸一化(BatchNorm)與層歸一化(LayerNorm):技術背景、原理及基于Pytorch的代碼詳解
批歸一化(Batch Normalization)和層歸一化(Layer Normalization)是深度學習中廣泛應用的兩種數據歸一化方法,用于改善神經網絡的訓練性能。本文將從提出這兩種技術的原論文出發,詳細闡述技術背景、原理及基于Pytorch的實現方式。
1.批歸一化(Batch Normalization)
批歸一化由谷歌的Sergey Ioffe和Christian Szegedy于2015年在論文“Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift”中提出。
(1)技術背景:深度神經網絡的訓練十分復雜,因為在訓練過程中隨著前一層網絡參數的變化,下一層網絡的輸入分布也會發生變化。而更低的學習率和更精細的參數初始化又會減慢模型訓練速度,特別是會讓具有飽和非線性的模型收斂變得十分困難,如使用Sigmoid激活函數時,容易陷入梯度消失之中。
Ps:飽和非線性是指激活函數在輸入值較大或較小時,其輸出趨于恒定,導數接近于零的現象,如Sigmoid和Tanh激活函數。
(2)技術原理:批歸一化則是通過標準化輸入來解決上述問題,將歸一化作為模型架構的一部分,對每次訓練中的小批量樣本執行歸一化,使得我們可以使用更高的學習率且能降低對參數初始化的要求。同時,在某些情況下還能充當正則化使用,可以替代Dropout技術。
(3)批歸一化詳細計算步驟:

需要特別注意的是,批歸一化中模型在測試時使用的是訓練中累積的全局均值和方差替代小批量樣本的統計值,有關全局均值和方差的計算可見下述詳細代碼的實現,更加清晰明了。
(4)基于Pytorch的實現
Pytorch中提供了nn.BatchNorm1d、nn.BatchNorm2d 和 nn.BatchNorm3d,對應不同輸入維度的批歸一化層,如下所示:

【參數詳解】

(5) 使用Python手動實現批歸一化

2.層歸一化(Layer Normalization)
層歸一化由多倫多大學的Jimmy Lei Ba等人于2016年于論文“Layer Normalization”中提出。
(1)技術背景:批歸一化的效果取決于小批量的大小,且在循環神經網絡中的應用受到明顯的限制。同時,批歸一化也不能應用于在線學習任務或小批量必須很小的極大分布式模型。
Ps:循環神經網絡中循環神經元的輸入總和通常隨序列長度的變化而變化,因此對其應該針對不同時間步長進行不同的統計。
(2)技術原理:層歸一化則是通過計算單個樣本中所有特征值的均值和方差來實現輸入數據的歸一化,可以直接應用于循環神經網絡。與批歸一化一樣的是在歸一化之后也提供了自適應偏差和增益兩個可學習參數來增強模型的表達能力。與批歸一化不同的是,層歸一化在訓練和測試的時候執行完全相同的計算。
(3)層歸一化詳細計算步驟:

(4)基于Pytorch的實現
Pytorch中提供了nn.LayerNorm實現層歸一化層,適合處理任何維度的輸入,如下所示:

【參數詳解】

(5)使用Python手動實現層歸一化

本文轉載自???南夏的算法驛站???,作者:趙南夏

















