- BN
- BN的作用
- 爲了對隱含層進行歸一化操作。對於每個隱層神經元,把逐漸向非線性函數映射後向取值區間極限飽和區靠攏的輸入分佈強制拉回到均值爲0方差爲1的比較標準的正態分佈,使得非線性變換函數的輸入值落入對輸入比較敏感的區域,以此避免梯度消失問題。(如下圖,加入激活函數後,可能會使很多的數據進入飽和區(即當x大於20之後,其梯度幾乎爲0))
- 添加BN的原因
- 因爲添加的激活函數(非線性函數),會逐漸將隱含層的輸出映射到激活函數的飽和區,從而慢慢使得數據傳不到後面的層,即出現梯度消失的問題
- BN添加的位置
- 激活函數之前
- BN算法
- BN在batch的維度上norm,歸一化維度爲[N,H,W],對batch中對應的channel歸一化,反標準化是爲了,抵消不是最優的情況,即有的時候歸一化可能會破壞原來的數據分佈,兩個參數是可以學習的參數
- BN的代碼實現,其中x爲(N,C*H*W)
- mu = np.mean(x,axis=0)
- sigma2 = np.var(x,axis=0)
- x_hat = (x-mu)/np.sqrt(sigma2+eps)
- out = gamma*x_hat + beta
- BN的作用
- BN、LN、IN、GN的異同
- 從左到右依次是BN,LN,IN,GN
- BN是在batch的維度上歸一化,即對整個batch內的對應的通道歸一化,即依賴於batch size,當batchsize很小時,歸一化效果不好
- LN是在channel上歸一化(即針對單個訓練樣本進行,不依賴於其他數據),即對同一個feature map的所有的通道歸一化,不依賴與batchsize,但 LN 的處理可能會降低模型的表達能力
- IN是隻對一個feature map的同一個channel內的數據歸一化,多用於GAN和style transfer,因爲BN的計算是要受其他樣本影響的,由於每個batch的均值和標準差不穩定,對於單個數據而言,相對於是引入了噪聲,而BN獲得的整體信息對這兩種任務沒有什麼效果。
- GN是對一個feature map的所有通道進行分組,對屬於一組的 通道內的所有數據進行歸一化。GN介於LN和IN之間,其首先將channel分爲許多組(group),對每一組做歸一化,及先將feature的維度由[N, C, H, W]reshape爲[N*G,C//G , H, W],歸一化的維度爲[C//G , H, W]
- GN
- Group Normalization(GN)是針對Batch Normalization(BN)在batch size較小時錯誤率較高而提出的改進算法,因爲BN層的計算結果依賴當前batch的數據,當batch size較小時(比如2、4這樣),該batch數據的均值和方差的代表性較差,因此對最後的結果影響也較大。(研究意義:在訓練大型網絡和將特徵轉移到計算機視覺任務中(包括檢測、分割和視頻),內存消耗限制了只能使用小批量的BN。真的用的到嘛??)
- 如果batchsize可以設的大的話,BN應該是要比GN好一些(如下圖),GN比BN的速度要慢一寫,因爲多了reshape的過程
- 注意:
- 第一,使用ImageNet的預訓練網絡的時候,要frozenBN層,不然結果反而會劣化,而GN不會有這個問題。保持特徵網絡的BNfrozen,只在Head部分使用GN會提升效果,但是如果把backbone也換成GN預訓練的,效果會更好。
- 第二,使用BN的準確率模型性能已經無法隨着迭代次數增加的時候,GN反而可能會隨着迭代次數的增加性能有一定的上升。
- 第三,不使用預訓練模型,GN仍然可以達到compared的性能,但是BN會出現結果的劣化
- ...
- SN(Switchable Normalization)
- SN是一種能夠有效適應不同任務地歸一化方式
- 效果
- SN的計算公式:(SN增加了6個控制參數,相比於BN而言,還增加了LN、IN的計算)
- 注意:
- minibatch越小,SN中BN的權重係數越小,IN和LN的權重係數則越大;
- minibatch越大,SN中BN的權重係數越大,IN和LN的權重係數越小。
- 分析
- 如果想換的話,需要從頭訓練(GNpaper中說是從頭訓能達到不錯的效果,但是針對自己的數據集要進行至少一次訓練和遷移),或者找大數據集上的預訓練模型(受限)
- 爲啥不把所有的數據求均值,方差試一下,有些極端,但感覺可以一試
- Weight Standardization (太偏理論了)
- WS+GN在batch size很小的情況下,性能也能超過BN(即使BN的batch size較大時)
部分資源來源網絡,如有侵權請聯繫刪除