论文地址:https://arxiv.org/pdf/1803.08494.pdf
相关代码:https://github.com/facebookresearch/Detectron/tree/master/projects/GN
Group Normalization(GN)源自2018年收录于cs.CV的论文《Group Normalization》,作者是Yuxinwu和Kaiminghe。
Batch Normalization(BN)是非常重要的归一化算法,但使用它时存在限制:在batch_size变小时,效果明显变差,下图为ResNet50模型效果:
这影响了在目标识别、实例分类、视频等由于内存限制,需要设置较小batch_size的算法效果。GN是BN的改进版本,它将channel分成多个组,计算每一组的均值和方差做归一化处理,使归一化操作与batch_size大小无关,它在ResNet-50上batch_size为2的情况下错误率比BN降低了10.6%(详见上图)。在batch_size正常的情况下,也能保证模型效果正常。GN可以在大部分场景中替代BN,并且已在ImageNet, COCO, Kinetics等多种场景中被证明是有效的方法。
原理
各种归一化方法的原理如下所示:
摘自论文为了改进BN的batch_size的问题,相继出现了Layer Normalization (LN),Instance Normalization (IN),它们可以在RNN/LSTM有效地工作,但在机器视觉上达不到BN的精度。
所有的归一化方法均能用下式描述:
其中σ是标准差,μ是均值x是待归一化的数据,i是索引,对于图片来说,代入模型的数据一般是(N,C,W,H),它们分别是batch中图片的张数,通道数,和图片的长宽,不同的归一化方法在不同的维度计算,如i = (iN,iC,iH,iW)。标准差和均值计算方法如下:
其中ε(eps)是个很小的数用于防止前式中分母为0,S是像素点的值,m是数据个数。不同的归一化方法的主要差别在于其S不同。
BN的S定义如下:
它表示对具有同样通道的数据归一化,即在(N,H,W)三个维度上计算均值和方差。
LN的S定义如下:
它表示在(C,H,W) 维度上,对每个实例(每张图)计算均值和方差。
IN的S定义如下:
它表示仅在(H,W) 维度上,对每个实例的每个通道计算均值和方差。
一般的归一化层除了上述功能以外,还使用线性变换补偿可能损失的表征能力(实现仿射变换),该层输出的y定义如下:
其中的γβ通过训练求得,分别对应缩放和平移。
GN的S定义如下:
它与IN类似,差别在于对通道分组处理。G是预先定义的分组数,默认为32,⌊.⌋为向下取整符号,在(H,W,C/G)三个维度上计算均值和方差,上图最右侧展示了G=2,每组三个通道的情况,GN针对每个组计算μσ,针对每个通道学习γβ。
LN,IN,GN三种方法都与batch大小无关,LN和IN可视为GN的极端形式,当G=1时 GN=LN, LN假设层中的所有通道具有相同的分布(与全连接层不同,这个假设在卷积层很少有效,因此在机器视觉中效果较差),相对的GN把通道分成几组,这样更有弹性。当G=C时GN=IN,IN只依赖于空间中的点计算,未考虑各个Channel的共性,过于片面。
GN的TensorFlow代码实现如下:
实验
下图是在batch_size=32的情况下,使用各种不同归一化方法的对比结果,可以看到IN自始致终效果不佳,LN在训练早期效果也不好。
下图在不同batch_size的情况下,对比了BN与GN的效果,在batch_size变小后,BN受到了严重的影响,而GN从始至终几乎未受影响,这说明当图片数据很少时,batch的统计值具有很强的不确定性。
在目标识别和实例分割任务中图片分辨率往往较大,因此不能设置太磊的batch_size。常用方法是使用预训练(pre-train)的均值和方差,并将其冻住frozen,在精调时不处理归一化层,这种方法称为BN。下面是使用BN和GN的效果对比。
网友评论