Batch_Normalization,簡稱BN,是一種針對神經網絡中分布不穩定的提出的正則化手段。在深度學習中,BN是十分重要的一個模塊,它可以在訓練過程中加速網絡收斂,同時增加了模型的泛化能力。在本文中,我們將對BN進行詳細的介紹。
一、batchnorm的方差shape
對於輸入的$N\times C \times H \times W$的四維數據,BN中對於每個channel需要統計出其平均值和方差。具體來說,如下:
// 計算每個channel的均值和方差 mean = sum(x, (0, 2, 3), keepdim=True) / (x.shape[0] * x.shape[2] * x.shape[3]) variance = sum((x - mean) ** 2, axis=(0, 2, 3), keepdim=True) / (x.shape[0] * x.shape[2] * x.shape[3])
對於計算出的均值和方差,可以使用以下公式對BN進行標準化:
y = (x - mean) / sqrt(variance + eps)
其中eps為一個較小的數,用來避免分母為零的情況。最後加入了權重和偏置項,以得到最終標準化結果。
二、BatchNormalizationLayer Matlab
在Matlab中,可以很方便地使用BatchNormalizationLayer層來進行BN。
% 創建一層batchnorm,inputSize為輸入數據的size batchnormLayer = batchNormalizationLayer('Name','bn','Epsilon',0.001,'Offset',zeros(1,inputSize(3),'single'),'Scale',ones(1,inputSize(3),'single')); % 前向傳播 bn_res = predict(batchnormLayer, x);
三、Normalization
除了BN,還有一種正則化方法叫做Normalization。Normalization是對於某一層的所有輸入數據進行正則化,而BN是對於每個channel進行標準化,因此Normalization所需要的參數要比BN多,更難訓練。但是Normalization在某些情況下可能表現更好,比如處理非常稀疏的數據。
四、Layer Normalization
BN在處理圖像分類等場景表現比較好,但是對於RNN等序列問題表現較差,這時候可以使用Layer Normalization。它與BN的區別在於:BN是在數據在$N\times C \times H \times W$的四個維度上進行標準化,而LayerNorm是在$N\times L \times C$的三個維度上進行標準化,即一個batch的所有樣本都共用一組mean和variance。LayerNormalization的具體公式如下:
z = (x - mean) / sqrt(variance + eps) y = gamma * z + beta
五、Batchnorm的原理和作用
BN是一種歸一化方法,其主要原理就是讓每一層的輸入數據分布盡量接近於標準正態分布。在深度神經網絡中,隨着層數的增加,輸入數據的分布越來越偏離標準正態分布,容易出現梯度消失和梯度爆炸等問題,影響網絡的訓練效果。而BN可以通過標準化來解決這個問題,並且在訓練過程中動態調整輸入數據的均值和方差,降低了網絡對初始化的依賴,加速了網絡訓練的收斂速度。此外,BN還可以起到正則化的作用,避免過擬合。
六、Batchnorm會造成illegal memory
在某些情況下,BN可能會導致illegal memory訪問錯誤,這是由於batch size過小,導致方差為0。此時,可以在BN的代碼中增加一定的容錯機制,比如將eps設置成一個較小的數(如$1e-5$),即可解決該問題。
七、Batchnormalization層的作用
BN層是深度學習中很重要的一層,主要作用如下:
- 加速網絡訓練:
- 提高網絡泛化能力:
- 正則化:
減少了網絡對參數初始化的依賴,加速了網絡收斂的速度。
在訓練過程中動態調整輸入數據的均值和方差使得網絡更加魯棒,具有更好的泛化能力。
通過對輸入數據進行標準化來避免過擬合。
八、Batchnormalization和Layer選取
在選擇使用哪一種歸一化方法時,需要考慮輸入數據的性質和具體的任務。如果是圖像分類等場景,可以優先選擇BN。如果是序列問題,可以選擇LN。 在實際應用中,也可以同時使用BN和LN,進一步提高泛化性。
代碼示例
以下是tensorflow中BN的具體代碼,以MNIST數據集為例。
import tensorflow as tf (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0 model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(), tf.keras.layers.BatchNormalization(), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=5) model.evaluate(x_test, y_test, verbose=2)
在上面的代碼中,使用了Sequential模型,加入了一個BN層以及兩個全聯接層。代碼簡單易懂,並且有了BN層的加入,模型的準確率會更高。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/195443.html