批量歸一化實際上也是乙個層,可以直接呼叫torch的api。
我們在訓練頂部的層,實際上幹的就是在擬合底部層。所以頂部的層會收斂的很快,但是底部的層資料變化後,頂部又要重新進行訓練。
乙個簡單的實現就是將分布的均值和方差進行固定。這個實現也很簡單。
\[\mu_=\frac \sum_ x_ \text \sigma_^=\frac \sum_\left(x_-\mu_\right)^+\epsilon
\]\[x_=\gamma \frac-\mu_}}+\beta
\]這裡的\(\mu\) 均值和 \(\sigma\) 方差是通過batch進行計算得到的,然後在通過歸一化操作得到新的輸出。其中\(\gamma\) 和\(\beta\) 是 可訓練引數。
批量歸一化層作用於啟用函式之前。
這裡批量歸一化在卷積裡面是作用在通道維的。因為卷積的shape是 (batchsize, channel, high, width) 這裡的每乙個channel實際上就是乙個特徵維度。
如果批量歸一化作用在全連線層,那麼它是作用在特徵維,比如shape (batchsize, features_num) 那麼求均值後就是(, features_num)。批量歸一化是對批量進行歸一化,而不是乙個樣本裡的特徵做歸一化。反正很難說清楚。
批量歸一化在做什麼?
它可能是通過在小批量裡加入噪音來控制模型複雜度,所以沒有必要和丟棄法混合使用。批量歸一化層只會加速收斂,不會改變模型精度。
import torch
import torch.nn as nn
con = nn.conv2d(2, 3, 1)
nor = nn.lazybatchnorm2d()
tmp = torch.ones((1, 2, 28, 28))
s = nor(con(tmp))
s = s.permute(1,0,2,3).reshape(3,-1)
其實torch裡有batchnorm2d,但我搞不懂為什麼要輸入num_input,這個引數不是隱含在input size裡嗎?就是size(1),所以這裡我用了lazybatchnorm2d()
eps,就是計算batch的\(\sigma\) 方差所用到的 \(\epsilon\) ,預設取0就行了。這裡的moment是用於計算running_mean 和running_var用到的。
\[\hat_}=(1-\text ) \times \hat+\text \times x_
\]這裡的running_mean 和 running_var 就是用該batch得到mean和var進行更新。然後在eval時候,我們就不用batch 的mean和var進行歸一化,我們會使用訓練得到的running_mean 和 running_var 進行更新。
如果tack_running_stats 設定為false,那麼我們在訓練過程就不會去計算running_mean 和running_var。在eval的時候也是用eval的batch mean和var進行歸一化。
affine預設設定為true,表示\(\gamma\) 和\(\beta\) 是 可訓練引數,如果設定為false就不訓練。
這裡有個問題:why does nn.conv2d require in_channels?
可以很好的解決我的疑惑,對於卷積核需要初始化,直接在init時候就定義好卷積核大小或許是個好的行為。
比如在這裡:
import torch
from torch.functional import norm
import torch.nn as nn
con = nn.conv2d(2, 3, 1)
nor = nn.lazybatchnorm2d()
tmp = torch.ones((1, 2, 28, 28))
s = nor(con(tmp))
t = torch.ones((1, 4, 28, 28))
s = s.permute(1,0,2,3).reshape(3,-1)
nor(t)
由於使用了lazynorm先對(1,3,28,28)shape進行歸一化,於是在對(1,4,28,28)歸一化的時候就會報錯。 (九)批量歸一化
1 引入 對輸入資料做了歸一化處理,就是將每個特徵在所有樣本上的值轉歸一化成均值0方差1。這樣我們保證訓練資料裡數值都同樣量級上,從而使得訓練的時候數值更加穩定。對於淺層模型來說,通常資料歸一化預處理足夠有效。輸出數值在只經過幾個神經層後通常不會出現劇烈變化。但對於深層神經網路來說,情況一般比較複雜...
BN演算法 批量歸一化演算法
2015年的 batch normalization accelerating deep network training by reducing internal covariate shift 思想 給每層神經網路的輸出做乙個歸一化,將資料變為乙個高斯分布。為增加模型的表達能力,每個神經元都要以...
CS231n 批量歸一化
部分資料 於網路,僅做個人學習之用 內部協變數偏移 深度神經網路的訓練在訓練時,先前的層的權值引數改變會導致層間輸入值的分布情況也隨之改變,這就使神經網路的訓練變得困難。也使我們只能使用較小的學習率 更謹慎的引數初始化,且訓練非線性模型變得非常困難。訓練過程中,層間的權重會不斷改變和調整,而前面層權...