深度学习特征归一化方法——BN、LN、IN、GN
前言
最近看到Group Normalization的論文,主要提到了四個特征歸一化方法:Batch Norm、Layer Norm、Instance Norm、Group Norm。此外,論文還提到了Local Response Normalization(LRN)、Weight Normalization(WN)、Batch Renormalization(BR)。
國際慣例,參考博客:
Group Normalization論文
Group_Normalization-Tensorflow
GN的tensorflow官方實現(xiàn)
動機
BN是在小批數(shù)據(jù)中用均值和方差歸一化,能夠保證很深的網(wǎng)絡能夠收斂,但是BN需要足夠大的batch size,比較小的batch對批量數(shù)據(jù)的統(tǒng)計特征估算不準確,降低BN的batch size 就會提升模型誤差。
Group的思想有很多:AlexNet將模型部署到兩塊GPU;ResNeXt測試了depth、width、groups對網(wǎng)絡的效果,建議在相似計算消耗的前提下,較大的group能提升準確率;MobileNet和Xception測試了depth-wise卷積的效果,也就是group數(shù)與channel數(shù)相同;ShuffleNet嘗試了交換group特征,即channel隨機交換。這些方法都包括將channel劃分為不同的group,所以作者就想到了group做Normalization。
作者認為,DNN的channels特征并非是非結構化的,比如第一層卷積,其中一個濾波器與他的水平翻轉濾波器,對同一張圖片的響應,可能得到相似的分布。如果第一層卷積近似學習到了這對濾波器,那么這些濾波器對應的channel就可以被一起歸一化了。文章還說明了,除了類似這樣的卷積核可以導致group,其它的比如頻率、形狀、亮度、紋理等,都可能具有聯(lián)系,都可以被group。
理論
通常歸一化的標準公式就是:
x^=x?μiσi\hat{x}=\frac{x-\mu_i}{\sigma_i} x^=σi?x?μi??
其中μ\muμ是均值,σ\sigmaσ是方差,假設均值和方差都是從集合SiS_iSi?中計算得到的,那么
μi=1m∑k∈Sixkσi=1m∑k∈Si(xk?μi)2+?\begin{aligned} \mu_i &= \frac{1}{m}\sum_{k\in S_i} x_k \\ \sigma_i &=\sqrt{\frac{1}{m}\sum_{k \in S_i}(x_k-\mu_i)^2 + \epsilon} \end{aligned} μi?σi??=m1?k∈Si?∑?xk?=m1?k∈Si?∑?(xk??μi?)2+???
假設其中某個卷積層的特征圖樹木為(N,C,H,W)(N,C,H,W)(N,C,H,W),分別代表批中樣本索引、特征圖通道索引、特征圖高、寬,設它們的索引是(Ni,Cj,H,W)(N_i,C_j,H,W)(Ni?,Cj?,H,W)代表第iii個樣本的第jjj個特征圖。
那么
- Batch Norm對應的計算均值和方差的數(shù)據(jù)集合為:Si={k∣kC=Ci}S_i= \{k|k_C=C_i\}Si?={k∣kC?=Ci?} ;意思是將當前批所有數(shù)據(jù)的具有相同通道索引的特征圖劃分為一組,每組單獨歸一化,這樣組集合就是:
(N,C1,H,W),(N,C2,H,W),?,(N,Cj,H,W),?(N,C_1,H,W),(N,C_2,H,W),\cdots,(N,C_j,H,W),\cdots(N,C1?,H,W),(N,C2?,H,W),?,(N,Cj?,H,W),? - Layer Norm對應的計算均值和方差的數(shù)據(jù)集合為:Si={k∣kN=Ni}S_i= \{k|k_N = N_i \}Si?={k∣kN?=Ni?};意思是將當前批每個數(shù)據(jù)的所有通道劃分為一組,每組單獨歸一化,這樣組集合就是:
(N1,C,H,W),(N2,C,H,W),?,(Ni,C,H,W),?(N_1,C,H,W),(N_2,C,H,W),\cdots,(N_i,C,H,W),\cdots(N1?,C,H,W),(N2?,C,H,W),?,(Ni?,C,H,W),? - Instance Norm對應的計算均值和方差的數(shù)據(jù)集合為:S={k∣kn=Ni,kC=Cj}S=\{k|k_n=N_i,k_C=C_j\}S={k∣kn?=Ni?,kC?=Cj?};意思是將當前批每個數(shù)據(jù)的每個通道單獨劃分一組,也就是每個特征圖自己歸一化,這樣組集合就是:
(N1,C1,H,W),(N2,C1,H,W),?,(Ni,Cj,H,W),?(N_1,C_1,H,W),(N_2,C_1,H,W),\cdots,(N_i,C_j,H,W),\cdots(N1?,C1?,H,W),(N2?,C1?,H,W),?,(Ni?,Cj?,H,W),? - Group Norm對應的計算均值和方差的數(shù)據(jù)集合為:S={k∣kN=Ni,?kCC/G?=?CiC/G?}S=\{k| k_N=N_i, \lfloor \frac{k_C}{C/G} \rfloor = \lfloor \frac{C_i}{C/G} \rfloor \}S={k∣kN?=Ni?,?C/GkC???=?C/GCi???};意思是將每個樣本對應的所有通道劃分為GGG組,每組單獨歸一化,假設每組被劃分后有兩個通道,組集合就是:
第一組:(N1,C1,H,W),(N1,C2,H,W)(N_1,C_1,H,W),(N_1,C_2,H,W)(N1?,C1?,H,W),(N1?,C2?,H,W)
?\vdots?
第p組:(Ni,Cj,H,W),(Ni,Cj+1,H,W)(N_i,C_j,H,W),(N_i,C_{j+1},H,W)(Ni?,Cj?,H,W),(Ni?,Cj+1?,H,W)
?\vdots?
當然,為了彌補損失掉的表達能力,上述所有的Normalization方法都必須學習一個線性變換:
yi=γxi^+βy_i=\gamma \hat{x_i}+\betayi?=γxi?^?+β
其中γ\gammaγ和β\betaβ是可訓練的縮放與偏移值,是針對每個通道的。
代碼
第三方實現(xiàn)
github上有人在tensorflow中實現(xiàn)過,戳這里
def group_norm(x, G=32, eps=1e-5, scope='group_norm') :with tf.variable_scope(scope) :N, H, W, C = x.get_shape().as_list()G = min(G, C)x = tf.reshape(x, [N, H, W, G, C // G])mean, var = tf.nn.moments(x, [1, 2, 4], keep_dims=True)x = (x - mean) / tf.sqrt(var + eps)gamma = tf.get_variable('gamma', [1, 1, 1, C], initializer=tf.constant_initializer(1.0))beta = tf.get_variable('beta', [1, 1, 1, C], initializer=tf.constant_initializer(0.0))x = tf.reshape(x, [N, H, W, C]) * gamma + betareturn x調用方法也很簡單:
from ops import *x = conv(x)x = group_norm(x)tensorflow官方實現(xiàn)
官方實現(xiàn)戳這里
定義的函數(shù):
def group_norm(inputs,groups=32,channels_axis=-1,reduction_axes=(-3, -2),center=True,scale=True,epsilon=1e-6,activation_fn=None,param_initializers=None,reuse=None,variables_collections=None,outputs_collections=None,trainable=True,scope=None,mean_close_to_zero=False):分組的核心代碼:
# Manually broadcast the parameters to conform to the number of groups.params_shape_broadcast = ([1] * len(axes_before_channels) +[groups, channels // groups] +[1] * len(axes_after_channels))# Reshape the input by the group within the channel dimension.inputs_shape = (axes_before_channels + [groups, channels // groups] +axes_after_channels)inputs = array_ops.reshape(inputs, inputs_shape)可以發(fā)現(xiàn),不管是個人實現(xiàn),還是官方實現(xiàn),最主要的就是對channels進行groups分組。
后記
GN主要就是針對batch size時,BN歸一化不準確而提出的,如果我們的機器能滿足batch size足夠大,那就沒必要用GN了。
博客已同步至微信公眾號,不定時更新計算機視覺、機器學習、深度學習理論與代碼實現(xiàn),有問題歡迎評論或者微信公眾號私聊
總結
以上是生活随笔為你收集整理的深度学习特征归一化方法——BN、LN、IN、GN的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 精灵宝可梦GO属性攻防相克系数表 攻防系
- 下一篇: 3D人脸重建——PRNet网络输出的理解