1.介紹
https://blog.csdn.net/qq_25737169/article/details/79048516
Batchnorm是深度網絡中經常用到的加速神經網絡訓練,加速收斂速度及穩定性的算法。
在訓練模型時,學習的是數據集的分布,但是如果每一個批次batch分布不同,那么就會給訓練帶來困難;
另一方面,數據經過一層層網絡計算后,其數據分布也在發生着變化,此現象稱為Internal covariant shift,會給下一層的網絡學習帶來困難。
1.1 Internal covariant shift 內部協變量偏移
即:每一次參數迭代更新后,上一層網絡的輸出數據經過這一層網絡計算后,數據的分布會發生變化,為下一層網絡的學習帶來困難。
covariant shift描述的是訓練數據和測試數據存在分布的差異性,給網絡的泛化性和訓練速度帶來了影響。
//鏈接中有個圖講的很好,經過數據歸一化,就能加快訓練速度,因為b一般初始化為0?
2.原理
對每一層的輸出后的數據做歸一化,加入可訓練的參數做歸一化,其實過程非常簡單。
β是平移參數,γ是縮放參數。如果γ=σ,β=μ參數,那么y就取消了歸一化。所以,綜上保證了每一次數據經過歸一化后還保留的有學習來的特征,同時又能完成歸一化這個操作,加速訓練。
3.代碼
def Batchnorm_simple_for_train(x, gamma, beta, bn_param): """ param:x : 輸入數據,設shape(B,L) param:gama : 縮放因子 γ param:beta : 平移因子 β param:bn_param : batchnorm所需要的一些參數 eps : 接近0的數,防止分母出現0 momentum : 動量參數,一般為0.9, 0.99, 0.999 running_mean :滑動平均的方式計算新的均值,訓練時計算,為測試數據做准備 running_var : 滑動平均的方式計算新的方差,訓練時計算,為測試數據做准備 """ running_mean = bn_param['running_mean'] #shape = [B] running_var = bn_param['running_var'] #shape = [B] results = 0. # 建立一個新的變量 x_mean=x.mean(axis=0) # 計算x的均值 x_var=x.var(axis=0) # 計算方差 x_normalized=(x-x_mean)/np.sqrt(x_var+eps) # 歸一化 results = gamma * x_normalized + beta # 縮放平移 running_mean = momentum * running_mean + (1 - momentum) * x_mean running_var = momentum * running_var + (1 - momentum) * x_var #記錄新的值 bn_param['running_mean'] = running_mean bn_param['running_var'] = running_var return results , bn_param
其實上述running_mean和var在訓練過程中沒有用到,主要作用是在測試集的時候用到,因為測試集它是針對一個樣本,不存在均值。
在訓練過程中,是直接取running_mean和running_var的,
4.BatchNorm1d用法
https://pytorch.org/docs/stable/nn.html
https://blog.csdn.net/qsmx666/article/details/109527726
- num_features – 特征維度
- eps – 為數值穩定性而加到分母上的值。
- momentum – 移動平均的動量值。
- affine – 一個布爾值,當設置為真時,此模塊具有可學習的仿射參數。
其中γ默認為1,β默認為0,並且x是特征,不是樣本。。從下面的例子中可以看出:
import torch.nn as nn import torch m = nn.BatchNorm1d(3) input = torch.randn(2, 3) output = m(input) #輸出 >>> output tensor([[-0.9762, 0.3067, -0.5193],#做一個歸一化 [ 0.9762, -0.3067, 0.5193]], grad_fn=<NativeBatchNormBackward>)