【论文】Wu Y , He K . Group Normalization[J].(pdf)
BatchNorm 有一个很大的问题——随着 batch_size 的减小,BN 的错误会急剧增加,这是由于小批量不正确统计估计导致的。于是,我们就又有了 Group Normalization 作为 BN 的替代,GN 将通道化成组,然后在每一个组中计算用于归一化的均值和方差
如今,许多的模型由于显存的限制都使用了较小的 batch_size,但是根据上图显示结果,这会导致非常严重的模型性能下降。例如,Fast R-CNN 或者 Mask R-CNN 因为使用了大分辨率的图片,因此每个小批量就只包含 1 - 2 个样本
我们前面还学习过 IN 和 LN 的内容,但是就视觉识别任务而言,它们都未能取得很好的结果
Group Normalization
我们知道,视觉特征在通道上并不是完全独立的。像 SIFT、HOG 和 GIST 这些分类特征都是分组表示的——通道上的每一组都是由某些种类的直方图组成。这些特征在处理上经常也会对每一直方图或者梯度使用 group-wise normalization
另外,一些更高层的特征,如 VLAD 或者 FV 也都是分组特征,每一组可以被看做是一个簇的子向量
同样的,我们也不应该将深度网络特征视为没有结构的向量。例如,对于第一层卷积 conv1,我们希望一个滤波器以及它的水平翻转可以在自然图像上显示出类似的滤波器响应分布,这是很合理的。如果 conv1 刚好能够近似地学习到这一对滤波器,或者通过论文 Exploiting cyclic symmetry in convolutional neural networks 和 Group equivariant convolutional networks 中的设计方式将水平翻转结构化,那么这些过滤器相应的通道就可以组合在一起进行归一化
对于更高层的特征往往会更抽象,其行为也不会很直观。然而,除了 SIFT 和 HOG 这些特征,我们依然还是可以按照频率、形状、照明和纹理等条件进行分组。它们的系数依然是相关的
于是,基于上面这些理由,我们提出了通用的分组归一化方式
Formulation
在 BN、LN、IN 和 GN 中,我们都有如下的公式 x ^ i = 1 σ ( x i − μ i ) \hat x_i=\frac{1}{\sigma}(x_i-\mu_i) x^i=σ1(xi−μi) 其中, x x x 表示特征, i i i 是序号。对于一张图片, i = ( i N , i C , i H , i W ) i=(i_N, i_C, i_H, i_W) i=(iN,iC,iH,iW) 是一个四维的向量表示 ( N , C , H , W ) (N,C,H,W) (N,C,H,W) 下的一个特征。 μ i \mu_i μi 和 σ i \sigma_i σi 的计算公式如下 μ i = 1 m ∑ k ∈ S i x k σ i = 1 m ∑ k ∈ S i ( x k − μ i ) 2 + ϵ \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} μi=m1k∈Si∑xkσi=m1k∈Si∑(xk−μi)2+ϵ
S i S_i Si表示进行归一化的像素集合,不同的归一化方法的区别就在于 S i S_i Si 的选取方式不同
- BN 的 S i S_i Si 定义为 S i = { k ∣ k C = i C } S_i=\left\{k|k_C=i_C\right\} Si={k∣kC=iC},意思是通道不变,沿着 ( N , H , W ) (N, H, W) (N,H,W) 取一个像素集合
- LN 定义为 S i = { k ∣ k N = i N } S_i=\left\{k|k_N=i_N\right\} Si={k∣kN=iN},意思是沿着 ( C , H , W ) (C, H, W) (C,H,W) 取一个像素集合
- IN 定义为 S i = { k ∣ k N = i N , k C = i C } S_i=\left\{k|k_N=i_N, k_C=i_C\right\} Si={k∣kN=iN,kC=iC},意思是沿着 ( H , W ) (H, W) (H,W) 取一个像素集合
最后,BN,LN 和 IN 都在每个通道上学习一个线性变化以补偿归一化导致的可能的非线性表达性的损失
y
i
=
γ
x
^
i
+
β
y_i=\gamma\hat x_i+\beta
yi=γx^i+β
Group Norm
在 GN 中, S i S_i Si 定义为 S i = { k ∣ k N = i N , ⌊ k C C / G ⌋ = ⌊ i C C / G ⌋ } S_i=\left\{k|k_N=i_N, \left \lfloor \frac{k_C}{C/G}\right \rfloor=\left \lfloor \frac{i_C}{C/G} \right \rfloor\right\} Si={k∣kN=iN,⌊C/GkC⌋=⌊C/GiC⌋} 其中, G G G 表示分组数,是一个预先定义好的超参数,默认 G = 32 G=32 G=32。 C / G C/G C/G 表示每一组里面的通道数。 ⌊ k C C / G ⌋ = ⌊ i C C / G ⌋ \left \lfloor \frac{k_C}{C/G}\right \rfloor=\left \lfloor \frac{i_C}{C/G} \right \rfloor ⌊C/GkC⌋=⌊C/GiC⌋ 意味着索引 i i i 和 k k k 在同一组通道内。于是,GN 沿着 ( H , W ) (H, W) (H,W) 和 C G \frac{C}{G} GC 一组的通道方向计算 μ \mu μ 和 σ \sigma σ
关于计算方式,GN 还是遵从上面提到的几个公式。GN 同样要学习 γ \gamma γ 和 β \beta β 两个超参数
与 LN 的联系
当 G = 1 G=1 G=1 时,GN就退化为 LN,LN 认为一层上的所有通道都保持一样的分布,这点在全连接网络上是没有问题的,但是在卷积上这点很难成立。GN 比起 LN 限制更小,因为我们只假设一组里面的所有通道保持一样的期望和方差,而不是假设所有通道都是。同时,GN 也更加灵活,可以在不同组上学习到不同的分布。这样就使得 GN 比起 LN 拥有更强大的表达能力(如下图所示)
与 IN 的联系
当 C = G C=G C=G 时,GN 就退化为 IN ,但是 IN 只能在特定的一个维度上计算期望和方差,这样的话就会丢失通道间的相关性
Implementation
最后,我们看一下 GN 在 batch_size 方面的鲁棒性