- 作者
- 摘要
BN是一个深度学习发展的里程碑,给多种网络训练赋能。但当batch变小,由于不准确的batch统计估计,BN的错误率会快速增加。这限制了BN在大模型的应用。本文提出Group Normalization(GN),作为BN的一个简单替换。GN将通道数分成多个组,在每个组计算均值和方差来归一化,计算独立于batch size,且在batchsize的大变化范围内性能稳定。在ImageNet训练的ResNet-50,batch size为2时GN的错误率比BN低10.6%;在batch size为标准数时,GN与BN性能相当,且比其他归一化变体效果好。此外,GN易于从预训练转去finetune。GN实现非常简单,只需几行代码。
开源:https://github.com/facebookresearch/Detectron/blob/master/projects/GN
- 介绍
BN的缺点是随着batch维度进行归一化,要求BN运行在足够大的batch size(例如有些文献要求32)。Batch size小会造成batch统计不能准确估计,从而降低模型准确率,如下图。
这限制BN层用于检测、分割、视频识别等占用内存/显存较大的模型,例如Fast/er和Mask R-CNN,由于高分辨率使用batch size为1或2,BN变成了线性层。
本文提出GN,作为BN的一种简单替代。我们注意到很多经典特征如SIFT、HOG都是group-wise特征,包括group-wise归一化。例如,一个HOG向量就是多个空间单元格的输出,每个单元格是一个归一化的方向直方图。类似的,我们提出GN层,将通道分组进行归一化,不受batch size影响。如下图。
虽然batch size可能变换,GN可以轻易从预训练转到fine-tune。
像LN和IN,训练序列化模型如RNN/LSTM,或者生成模型GANs比较高效,但在视觉识别方面性能受限,但GN性能更加。相反地,GN可以用于LN/IN适用领域。
- 相关方法
归一化。众所周知输入数据的归一化能加速训练。为了归一化隐藏特征,基于特征分布的强假设得出的初始化方法,在训练迭代时会变得无效。
归一化层在BN之前就有了广泛应用。Local Response Normalization(LRN)是AlexNet一部分,在每个像素的小邻域计算统计信息。
BN在batch维度使用了更全局的归一化,更重要的是BN推荐在所有层运行。但是batch并不是保持不变的,例如推理阶段用的是训练集计算的均值和方差,通常用的平均值,因此测试时没有归一化操作,但目标数据集的分布可能会变化。所以训练、转移、测试阶段不连续。而且减小batch size对性能有巨大影响。
很多归一化方法都希望绕开batch维度。LN运行在通道维度,IN类似BN但对单个样本。
小批量。同步BN可以跨卡计算均值方差,但并没有解决小batch size问题,只是将问题转移到工程和硬件需求方面,此外不适用于异步优化器。
组计算。略。
- 方法细节
视觉表达通道并不是相互独立的。经典特征SIFT\HOG\GIST都为分组特征表示,每组通道通过直方图构造。这些特征在每个直方图或每个方向上进行分组归一化。更高维特征例如VLAD和Fisher向量也是分组特征。
类似地,没必要将深度神经网络特征看做非结构化向量。例如,对于网络第一个卷积层conv1,我们可以假设一个滤波器在水平翻转前后,在图像上的滤波器响应分布是类似的。如果conv1学习到了这对滤波器,那就可以将这些滤波器的相应通道一起归一化。
更高层的卷积层提取信息更加抽象,不能凭直觉猜测。但是除了方向(SIFT\HOG),还有很多因素可以进行分组,例如频率、形状、光照、纹理等。这些参数也不相互独立。实际上,神经科学中一个公认的计算模型是跨细胞反应进行归一化。
1、公式
x是通过一个层计算的特征,i是索引。2维图像中是表示以(N,C,H,W)为特征次序的四维特征。μ是均值,σ是标准差。ε是一个很小的常数。
是所有需要计算均值方差的像素集合,m是集合的像素个数。各种不同的特征归一化方法主要区别是
的定义,如上图2。
Batch Norm:定义如下,iC(kC)表示C通道维度的第i(k)子序列。表示相同通道的像素进行归一化,例如对每个通道,BN沿着(N,H,W)维度计算μ和σ。
Layer Norm:表示LN沿着(C,H,W)维度计算μ和σ。
Instance Norm:表示IN沿着(H,W)维度对每个样本和每个通道计算μ和σ。
如BN论文所述,BN、LN、IN都学习一种逐通道线性变换,以补偿表达能力的可能的损失。
γ和β是可学习的缩放和平移参数。
Group Norm:定义如下,G是分组数,是预定义的超参数,默认32。每组的通道数是C/G。
是下截断操作,
表示i和k在同一通道组,假设每个通道组根据通道维度依序存放。GN沿着(H,W)和一个通道组来计算μ和σ。图2最右显示2组,每组3通道的GN计算。
综上,一个GN层的计算公式包括公式1、2、6、7。
Releation to Prior Work:G=1时GN等于LN,LN假设每层所有通道有相似贡献,但在卷积层存在时该假设可能无效。GN能更加灵活的在每一组学到不同分布,因此表达能力更强。G=C时等于IN,但IN只依赖空间维度计算均值方差,失去了探索通道相关性的可能。
2、实现
在pytorch和TensorFlow只需几行代码。TensorFlow代码如下:
实际上,我们只需指定归一化方法定义的计算均值和方差(“矩”)的轴线即可。
- 实验结果
使用ResNet模型,在ImageNet分类数据库,1000类,训练约12800w幅,评价约5w幅。
- ImageNet图像分类
实现细节:使用8块卡训练,BN计算均值方差都是在每块卡内计算,不跨卡。使用(Delving deep into rectifiers: Surpassing human-level performance on imagenet classification.ICCV 2015)初始化所有卷积层。用1初始化所有γ参数,除了每个残差块后的归一化层,初始化γ为0。权重 0.0001。训练100轮,在30、60、90降低学习率(10x)。使用了数据增广[58][17]。采用最后5轮的错误率的中位数作为结果。
特征归一化方法比较:
图4表明训练时GN错误率比BN低,说明GN更易于优化;验证集上GN错误率略高于BN,说明GN正则化能力略差。这个好解释,因为BN的均值方差计算带有不确定性,有助于regularization。GN可以加一个正则器,这个今后研究。
小batch:
BN在batch越小时错误率越高,如上图。但是,当batch为1时,BN其实是IN,反而性能高一些。(我用同步BN,batch为1时,效果奇差!可以换回BN试试)
分组:组数32性能最佳。我们还评估了每组通道数固定的性能,而组数G是根据不同层变化的,通道数16最佳。
- COCO的目标检测和分割
接下来评价finetune到目标检测和分割的模型的性能。这些任务往往输入高清图像,因此batch size往往较小(1或者2)。因此,BN转变为一个线性层,,均值和方差使用预训练时计算好的并且冻结,我们称为BN*,实际上在finetune没有进行归一化。(我们也尝试了finetune时用BN,但batch为2时,性能下降了,所以我们忽略。)
在Mask R-CNN基准上,用Detectron平台。我们finetune时用GN替换BN*,使用对应的ImageNet预训练的模型。γ和β权重衰减为0,这二者的调整对于取得好的检测结果很重要。Finetune时batch为1。
C4 backbone结果:
上图表示Mask R-CNN使用conv4做backbone的结果。使用ResNet层的上至conv4去提取特征,conv5层作为RoI头去分类和回归。因为有预训练模型,因此backbone和head都有归一化层。
可看到finetune后GN明显比BN*性能好,即使预训练时GN稍差于BN,因为BN*在finetune时冻结了BN,造成预训练和finetune的不连贯。LN也不如GN和BN*。
FPN backbone结果:在Mask R-CNN使用FPN(Feature Pyramid Network)比较GN和BN*,这是当前COCO的sota框架。跟C4变体不同,FPN使用所有预训练层构造金字塔,附加随机初始化层作为head。本文将box head的2fc换成了4conv1fc,性能如下图:
从头训Mask R-CNN:下图GN模型从头开始训了27w轮,GN更优秀。
- Kinetics数据集的视频分类
略