更新:arxiv上更新了最新一版,增加了ConvNeXt加大kernel的实验结果,发现提升了一个量级,即ConvNeXt-tiny + 超大kernel > ConvNeXt-small,ConvNeXt-small + 超大kernel > ConvNeXt-base;pytorch github已经施工完毕,放出了所有代码、模型、高效大卷积的实现和一些工具性的代码(如可视化有效感受野)。https://github.com/DingXiaoH/RepLKNet-pytorch
你有多久没调过kernel size了?
当你在卷积网络(CNN)的深度、宽度、groups、输入分辨率上调参调得不可开交的时候,是否会在不经意间想起,有一个设计维度,kernel size,一直如此显而易见却又总是被忽视,总是被默认设为3x3或5x5?
当你在Transformer上调参调得乐不思蜀的时候,是否希望有一种简单、高效、部署容易、下游任务性能又不弱于Transformer的模型,带给你朴素的快乐?
我们发表于CVPR 2022的工作表明,CNN中的kernel size是一个非常重要但总是被人忽略的设计维度,在现代模型设计的加持下,卷积核越大越暴力,既涨点又高效,甚至大到31x31都非常work(如下表所示,左边一栏表示模型四个stage各自的kernel size)!即便在大体量下游任务上,我们提出的超大卷积核模型RepLKNet与Swin等Transformer相比,性能也更好或相当!
论文:https://arxiv.org/abs/2203.06717
MegEngine代码和模型:https://github.com/megvii-research/RepLKNet
PyTorch代码和模型:https://github.com/DingXiaoH/RepLKNet-pytorch
P.S.“丁司图”是我个人刚开的公众号,以后会发一些学术解读和评论以及杂七杂八的内容,其中学术的东西可能会和知乎专栏“司图笔记”同步更新,欢迎关注!(公众号二维码被知乎夹了,只能放个公众号文章的链接了:RepLKNet作者解读:超大卷积核,大到31x31,越大越暴力,涨点又高效!(CVPR 2022))
(本文可以转载,请注明出处)
以下是两分钟内可以看完的内容总结
我们挑战了以下习惯认知:
1. 超大卷积不但不涨点,而且还掉点?我们证明,超大卷积在过去没人用,不代表其现在不能用。人类对科学的认知总是螺旋上升的,在现代CNN设计(shortcut,重参数化等)的加持下,kernel size越大越涨点!
2. 超大卷积效率很差?我们发现,超大depth-wise卷积并不会增加多少FLOPs。如果再加点底层优化,速度会更快,31x31的计算密度最高可达3x3的70倍!
3. 大卷积只能用在大feature map上?我们发现,在7x7的feature map上用13x13卷积都能涨点。
4. ImageNet点数说明一切?我们发现,下游(目标检测、语义分割等)任务的性能可能跟ImageNet关系不大。
5. 超深CNN(如ResNet-152)堆叠大量3x3,所以感受野很大?我们发现,深层小kernel模型有效感受野其实很小。反而少量超大卷积核的有效感受野非常大。
6. Transformers(ViT、Swin等)在下游任务上性能强悍,是因为self-attention(Query-Key-Value的设计形式)本质更强?我们用超大卷积核验证,发现kernel size可能才是下游涨点的关键。
1. 通过一系列探索性的实验,总结了在现代CNN中应用超大卷积核的五条准则:
a. 用depth-wise超大卷积,最好再加底层优化(已集成进开源框架MegEngine)
b. 加shortcut
c. 用小卷积核做重参数化(即结构重参数化方法论,见我们去年的RepVGG,参考文献[1])
d. 要看下游任务的性能,不能只看ImageNet点数高低
e. 小feature map上也可以用大卷积,常规分辨率就能训大kernel模型
2. 基于以上准则,简单借鉴Swin Transformer的宏观架构,提出一种架构RepLKNet,其中大量使用超大卷积,如27x27、31x31等。这一架构的其他部分非常简单,都是1x1卷积、Batch Norm等喜闻乐见的简单结构,不用任何attention。
3. 基于超大卷积核,对有效感受野、shape bias(模型做决定的时候到底是看物体的形状还是看局部的纹理?)、Transformers之所以性能强悍的原因等话题的讨论和分析。我们发现,ResNet-152等传统深层小kernel模型的有效感受野其实不大,大kernel模型不但有效感受野更大而且更像人类(shape bias高),Transformer可能关键在于大kernel而不在于self-attention的具体形式。例如,下图分别表示ResNet-101、ResNet-152、全为13x13的RepLKNet、kernel大到31x31的RepLKNet的有效感受野,可见较浅的大kernel模型的有效感受野非常大。
1. ImageNet上,与Swin-Base相当。在额外数据训练下,超大量级模型最高达到87.8%的正确率。超大卷积核本来不是为刷ImageNet设计的,这个点数也算是可以让人满意。
2. Cityscapes语义分割上,仅用ImageNet-1K pretrain的RepLKNet-Base,甚至超过了ImageNet-22K pretrain的Swin-Large。这是跨模型量级、跨数据量级的超越。
3. ADE20K语义分割上,ImageNet-1K pretrain的模型大幅超过ResNet、ResNeSt等小kernel传统CNN。Base级别模型显著超过Swin,Large模型与Swin相当。超大量级模型达到56%的mIoU。
4. COCO目标检测上,大幅超过同量级的传统模型ResNeXt-101(超了4.4的mAP),与Swin相当,在超大量级上达到55.5%的mAP。
下面是详细介绍
在当今这个时代,我们再去研究听起来就很复古的大kernel,是为什么呢?
1. 复兴被“错杀”的设计元素,为大kernel正名。在历史上,AlexNet曾经用过11x11卷积,但在VGG出现后,大kernel逐渐被淘汰了,这标志着从浅而kernel大到深而kernel小的模型设计范式的转变。这一转变的原因包括大家发现大kernel的效率差(卷积的参数量和计算量与kernel size的平方成正比)、加大kernel size反而精度变差等。但是时代变了,在历史上不work的大kernel,在现代技术的加持下能不能work呢?
2. 克服传统的深层小kernel的CNN的固有缺陷。我们曾经相信大kernel可以用若干小kernel来替换,比如一个7x7可以换成三个3x3,这样速度更快(3x3x3< 1x7x7),效果更好(更深,非线性更多)。有的同学会想到,虽然深层小kernel的堆叠容易产生优化问题,但这个问题已经被ResNet解决了(ResNet-152有50层3x3卷积),那么这种做法还有什么缺陷呢?——ResNet解决这个问题的代价是,模型即便理论上的最大感受野很大,实质上的有效深度其实并不深(参考文献2),所以有效感受野并不大。这也可能是传统CNN虽然在ImageNet上跟Transformer差不多,但在下游任务上普遍不如Transformer的原因。也就是说,ResNet实质上帮助我们回避了“深层模型难以优化”的问题,而并没有真正解决它。既然深而kernel小的模型有这样的本质问题,浅而kernel大的设计范式效果会如何呢?
3. 理解Transformer之所以work的原因。已知Transformer性能拔群,特别是在检测、分割等下游任务上。Transformer的基本组件是self-attention,而self-attention的实质是在全局尺度或较大的窗口内进行Query-Key-Value运算。那么Transformer性能强悍的原因是什么,是Query-Key-Value的设计形式吗?我们猜测,会不会“全局尺度或较大的窗口”才是关键?对应到CNN中,这就需要用超大卷积核来验证。
为了搞明白大kernel到底应该怎么用,我们在MobileNet V2上进行了一系列探索实验,总结出五条准则。这里略去细节只说结论:
1. 用depth-wise大kernel,完全可以做到相当高效。在我们的优化(已经集成进开源框架MegEngine)下,31x31 depth-wise卷积的用时最低可达3x3卷积的1.5倍,而前者的FLOPs是后者的106倍(31x31/9),这意味着前者的效率是后者的71倍!
2. 不带identity shortcut,增大kernel会大幅掉点(ImageNet掉了15%);带shortcut,增大kernel才会涨点。
3. 如果要想进一步加大kernel size,从大kernel到超大kernel,可以用小kernel做结构重参数化(参考文献1)。也就是说,在训练的时候并行地加一个3x3或5x5卷积,训练完成后将小kernel等价合并到大kernel里面去。这样,模型就可以有效捕捉到不同尺度的特征。不过我们发现,数据集越小、模型越小,重参数化越重要。反之,在我们的超大规模数据集MegData73M上,重参数化提升很小(0.1%)。这一发现跟ViT类似:数据规模越大,inductive bias越不重要。
4. 我们要的是在目标任务上涨点,而不是ImageNet上涨点,ImageNet的精度跟下游任务不一定相关。随着kernel size越来越大,ImageNet上不再涨点,但是Cityscapes、ADE20K语义分割上还能涨一到两个点,而增大kernel带来的额外的参数量和计算量很少,性价比极高!
5. 有点反直觉的是,在7x7的小feature map上用13x13也可以涨点!也就是说,大kernel模型不一定需要大分辨率来训,跟小kernel模型差不多的训练方法就可以,又快又省!
我们以Swin作为主要的对比对象,并无意去刷SOTA,所以简单借鉴Swin的宏观架构设计了一种超大卷积核架构。这一架构主要在于把attention换成超大卷积和与之配套的结构,再加一点CNN风格的改动。根据以上五条准则,RepLKNet的设计元素包括shortcut、depth-wise超大kernel、小kernel重参数化等。
我们给RepLKNet的四个stage设定不同的kernel size,在ImageNet和ADE20K语义分割数据集上进行实验,结果颇为有趣:ImageNet上从7x7增大到13x13还能涨点,但从13x13以后不再涨点;但是在ADE20K上,从四个stage均为13增大到四个stage分别为31-29-27-13,涨了0.82的mIoU,参数量只涨了5.3%,FLOPs只涨了3.5%。所以后面的实验主要用31-29-27-13的kernel size,称为RepLKNet-31B,并将其整体加宽为1.5倍,称为RepLKNet-31L。
RepLKNet-31B的体量略小于Swin-Base,在仅仅用ImageNet-1K pretrain前提下,mIoU超过Swin-Large + ImageNet-22K,完成了跨模型量级、跨数据量级的超越。
RepLKNet相当能打,特别是Base级别。跟量级差不多的ResNet相比,mIoU高了6.1,体现出了少量大kernel相对于大量小kernel的显著优势。(COCO目标检测上也有相同结论,RepLKNet-31B的mAP比体量相当的ResNeXt-101高了4.4)。RepLKNet-XL是更大级别的模型,用私有数据集MegData-73M进行预训练,达到了56.0的mIoU(跟ViT-L相比,这个模型其实并不算很大)。
ImageNet分类、COCO目标检测
结果参见“太长不看”部分或论文。
我们可视化了RepLKNet-31、RepLKNet-13(前文所说的每个stage都是13x13的模型)、ResNet-101、ResNet-152的有效感受野(方法详见论文)发现ResNet-101的有效感受野其实很小,而且ResNet-152相对于101的提升也很小;RepLKNet-13的有效感受野很大,而RepLKNet-31通过增大kernel size进一步将有效感受野变得非常大。
我们又研究了模型的shape bias(即模型有多少比例的预测是基于形状而非纹理做出的),人类的shape bias在90%左右,见下图左边的菱形点。我们选用的模型包括Swin、ResNet152、RepLKNet-31和RepLKNet-3(前文提到的每个stage都是3x3的小kernel baseline),发现RepLKNet-3和ResNet-152的kernel size一样大(3x3),shape bias也非常接近(图中的两条竖直实线几乎重合)。有意思的是,关于shape bias的一项工作提到ViT(全局attention)的shapebias很高(参见参考文献3中的图),而我们发现Swin(窗口内局部attention)的shape bias其实不高(下图),这似乎说明attention的形式不是关键,作用的范围才是关键,这也解释了RepLKNet-31的高shape bias(即更像人类)。
以往大家不喜欢用大 kernel 的其中一个原因是其较低的运行效率。但旷视开源的深度学习框架 MegEngine 通过分析和实验发现大 kernel depth-wise 卷积仍有很大的优化潜力,其运行时间可能不会显著慢于小 kernel(延展阅读https://zhuanlan.zhihu.com/p/479182218)。MegEngine 针对大 kernel depthwise 卷积做了多种深度优化,优化后的 MegEngine 性能比 PyTorch 最高快 10 倍,31x31 大小卷积核上的运行时间几乎和9x9 大小卷积核的运行时间差不多,可以打满设备的浮点理论峰值。MegEngine 用实际数据在一定意义上打消了大家对大 kernel 卷积运行效率的疑虑。这些优化已经集成到了MegEngine中,欢迎使用~
我们邀请到了ConvNeXt的作者刘壮一起探讨现代模型设计!更多 MegEngine 中大 kernel 优化解读,及 ConvNext,RepLKNet 两篇 paper 的分享,可关注北京时间本周六(3.19)上午 10:00 的 MegEngine Meetup ,我们将为大家带来线上分享~