声明:原创文章,欢迎转载,但必须经过本人同意。
论文标题:《Group Normalization》
论文链接: https://arxiv.org/pdf/1803.08494.pdf
作为两年一届的计算机视觉顶会ECCV前不久在德国召开,引起了诸多CVer的关注。其中,最佳论文被一个3D朝向的论文斩获,提出了具有普世性价值的AAE。对,想要拿最佳paper,你的paper一定要提出具有普世性价值的东西。
事实上,Kaiming的论文普世性价值应该更大。不过由于是德国主场,最佳论文被德国的科研机构拿到了。开个了玩笑,其实Kaiming这篇论文拿不到best paper的原因是他没有给出数学解释。我们来好好讨论一下Kaiming的新论文。
提示:看本文需要有Batch Normalization基础,不了解BN的可以移步《Batch Normalization》,因为你至少要知道Normalization是在做一件什么事情。
Group Normalization
Batch Normalization的出现带来了一系列的Normalization研究。BN在很多基于深度学习的视觉任务里帮助特别大,到目前为止,BN还存在于各种主流CNN网络(如yolo v2/v3,MegDet等)。
2016年,Hinton发表了关于研究《Layer Normalization》的论文,同年也有一篇叫《Instance Normalization》的文章挂在arxiv上。都渴望能作为BN的代替品,事实上到目前为止,我们可以发现,这些LN和IN都没做到完全代替BN。
在Kaiming的文章里提到:GN是完全比BN有优势的,当然这只是他自己说的(也有数据支撑)。不过,具体能不能吊打BN,还有待时间的验证。
我们直接来分析文章:
BN目前存在的主要问题是:十分依赖batch size。当你的batch size比较小的时候,BN的效果是不太好的。但随着现在视觉任务越来越复杂,输入数据尺寸越来越庞大,网络结构也越来越复杂。举个栗子,以前只是做个几十像素平方图片的分类,现在慢慢到高清图检测,分割等等,再到视频检测分割,再到3D视觉任务。而我们的计算力,现在主要来讲还是GPU,发展得并没那么快。于是乎,计算力不足以撑起很大的batch size。比如,我retrain yolo v3全层网络参数的时候,用GTX1080只能带动的batch size为8,然而不同的batch size是实实在在影响训练结果的。
那么,就要考虑解决batch size不够大的问题。Face++给出了一个很好的方案,就是用在COCO2017检测比赛上得冠军的方案,他们用了一个跨GPU计算BN的方案叫CGBN(cross-GPU Batch Normalization),他们是怎么做呢?
他们用了一个超大的Batch Size,256,分部在128块GPU上。其实重点还是在后面,他们有128块GPU,足够土豪。而且一方面还依赖HPC方面的技术专家去铺设这个计算系统。
GN的提出,就解决了BN所遇到的问题。GN对系统的优化程度完全不依赖Batch size有多大。我们来看一张图:
GN在很小的batch size就是稳定的,而BN在batch size不大的情况下,效果就会差很多。 看起来是令人兴奋的。先看看GN是怎么操作的:
上图描述了BN, LN, IN和GN四中norm方式。用更简单的语言来讲,各种Norm之间的差别只是针对的维度不同而已。
从最广为人知的BN着手讲解:
在一层层的网络之间传递的数据,我们叫做hidden feature,即隐藏特征图。我们的隐藏特征图通常有4个维度,包括长、宽、depth和batch数。hidden feature的深度由上一参数层的filters数量决定,batch数就是我们设的batch size。
那么,我们的hidden feature就可以看作一个4维张量,包含(W, H, N, C)这四个维度。N对应的就是batch数,而C对应的就是channel数,即depth。注意区分四个维度分别的含义。
如图2所示,BN是在N维度上做的Norm,N越大那么,N维度上Norm的效果就越好。实际上,我认为图2画得不够好,因为一开始我看这张图的时候,就被迷惑了好久,所以为了更好解释这些维度之间的差别,我重新画了一遍图2,用我自己的方式:
对于BN来讲,norm的操作range是下图:
红色标记就是norm的操作range,通过这种方法,可以简单标出LN和IN:
我相信,通过上面这几张图,BN/LN/IN之间的差别是一目了然的。以此来引导出我们今天的主角——Group Norm.
GN也只是在操作维度上进行了一丢丢改进而已。他的做法比较贴近LN,可是比LN成功得多。 看一下图就知道了:
GN并不像LN那样把channel维度所有channel进行一个Normalization,而是以分组的形式获得一个组的Norm即Group Normalization。就像作者自己比较的说法:
LN和IN只是GN的两种极端形式。
我们对channel进行分组,分组数为G,即一共分G组。 当G=1时,GN就是LN了;当G=C时,GN就是IN了。这也是一个有趣的比较,类似于GN是LN和IN的一个tradeoff。文章里对G的默认值是32。
GN的效果
GN的效果足以用惊人来形容。我们看一下在batch_size=32情况下的各种norm效果对比表格:
GN表现效果比BN次了点儿,但吊打LN和IN是没问题的。重要的是,GN能不依赖Batch size这就是个BN无法企及的优势,可以看下面数据:
可以看出,在小batch-size的时候,GN是可以吊打BN的。当然,对于GN来讲,也存在G的取值不同所带来的结果差异:
这个结果也是很明显。可见GN是存在一个较优的G取值使得GN效果最好。
GN的具体实现
GN的实现,可以说是相当地简便,只需将channel分个组就行了,看论文里给出的tensorflow实现:
def GroupNorm(x, gamma, beta, G, eps=1e−5):
# x: input features with shape [N,C,H,W]
# gamma, beta: scale and offset, with shape [1,C,1,1]
# G: number of groups for GN
N, C, H, W = x.shape
x = tf.reshape(x, [N, G, C // G, H, W])
mean, var = tf.nn.moments(x, [2, 3, 4], keep dims=True)
x = (x − mean) / tf.sqrt(var + eps)
x = tf.reshape(x, [N, C, H, W])
return x ∗ gamma + beta
上面这段代码确确实实是论文中直接给出的! Kaiming作为FAIR的代表人物之一,你们自家有caffe和pytorch,居然用tensorflow来实现GN算法。一方面,体现出tf确实便利,另一方面也传达出不太好的信号——tf要侵染FAIR内部了。好了,不扯淡了。继续分析GN的实现。
可以一句话说明这个代码:将(N,C,H,W)四个维度分为(N,G,C/G,H,W)五个维度。多的这个维度G就是组数,从channel数上出来的。然后,分别求出每个组的均值方差,得出各自的Normalization。这就是GN的操作。
个人总结
BN本身带来了很多优势,比如可以加快收敛,提高模型准确率等等。但本身也有致命的缺点,BN的缺点如下:
1,十分依赖Batch size。一定要batch size足够大,BN的效果才会好;
2,不适用序列数据的神经网络比如RNN,因为这类数据不适合做出batch;即,BN的适用范围不够大。
GN能有效解决BN的以上两个问题,同时还带来依然令人惊奇的效果。GN是在channel维度上进行的norm,可以很好适用于RNN,这是GN的巨大优势。虽然文中没做关于RNN的实验,但这无疑提供了一条新思路。这,就是最佳论文提名奖应该做的事情。
说了这么多GN的优点,我来说下个人认为的GN存在的缺陷:
1,GN是否真的能跟大batch size的BN正面刚呢? 文中用于比较的BN所用的batch size都是32,其实这无疑并不是一个很大的batch size。就是说,文中与GN对比的BN并不是BN最强的状态。旷视科技提出的MegDet用了一种超大的batch size=256,激发的BN效果比batch_size=32的时候好很多,并且顺便拿下COCO2017检测的冠军。不知用了GN的MASK R-CNN是否干得过超大batch size的MegDet呢?结果我们可以拭目以待,等待COCO2018的揭晓。
2,通篇论文,作者没有说why。没有说自己为什么要这么做,也没有一个理论支持为什么这么做效果会好。没有任何数学理论解释的操作,都可以划分为“玄学”,就一点一点试,效果好就可以发文章了。先提出来,证明的事儿就交给后人吧
GN能否成功,还需要接受时间的考验。是否能像其他具有普世性价值的trick比如resnet,BN等那么成功,只需看明年的主流结构里,能不能经常看到GN的影子了。