百科问答小站 logo
百科问答小站 font logo



CVPR2022 有什么值得关注的论文 ? 第1页

  

user avatar   ding-xiao-yi-93 网友的相关建议: 
      

更新:arxiv上更新了最新一版,增加了ConvNeXt加大kernel的实验结果,发现提升了一个量级,即ConvNeXt-tiny + 超大kernel > ConvNeXt-small,ConvNeXt-small + 超大kernel > ConvNeXt-base;pytorch github已经施工完毕,放出了所有代码、模型、高效大卷积的实现和一些工具性的代码(如可视化有效感受野)。github.com/DingXiaoH/Re

你有多久没调过kernel size了?

当你在卷积网络(CNN)的深度、宽度、groups、输入分辨率上调参调得不可开交的时候,是否会在不经意间想起,有一个设计维度,kernel size,一直如此显而易见却又总是被忽视,总是被默认设为3x3或5x5?

当你在Transformer上调参调得乐不思蜀的时候,是否希望有一种简单、高效、部署容易、下游任务性能又不弱于Transformer的模型,带给你朴素的快乐?

我们发表于CVPR 2022的工作表明,CNN中的kernel size是一个非常重要但总是被人忽略的设计维度,在现代模型设计的加持下,卷积核越大越暴力,既涨点又高效,甚至大到31x31都非常work(如下表所示,左边一栏表示模型四个stage各自的kernel size)!即便在大体量下游任务上,我们提出的超大卷积核模型RepLKNet与Swin等Transformer相比,性能也更好或相当!

论文:arxiv.org/abs/2203.0671

MegEngine代码和模型:github.com/megvii-resea

PyTorch代码和模型:github.com/DingXiaoH/Re

P.S.“丁司图”是我个人刚开的公众号,以后会发一些学术解读和评论以及杂七杂八的内容,其中学术的东西可能会和知乎专栏“司图笔记”同步更新,欢迎关注!(公众号二维码被知乎夹了,只能放个公众号文章的链接了:RepLKNet作者解读:超大卷积核,大到31x31,越大越暴力,涨点又高效!(CVPR 2022)

(本文可以转载,请注明出处)



太长不看版

以下是两分钟内可以看完的内容总结

A.我们对业界关于CNN和Transformer的知识和理解有何贡献?

我们挑战了以下习惯认知:

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可能才是下游涨点的关键


B.我们做了哪些具体的工作?

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模型的有效感受野非常大。


C.提出的架构RepLKNet效果如何?

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 size?

在当今这个时代,我们再去研究听起来就很复古的大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模型差不多的训练方法就可以,又快又省!


RepLKNet:超大卷积核架构

我们以Swin作为主要的对比对象,并无意去刷SOTA,所以简单借鉴Swin的宏观架构设计了一种超大卷积核架构。这一架构主要在于把attention换成超大卷积和与之配套的结构,再加一点CNN风格的改动。根据以上五条准则,RepLKNet的设计元素包括shortcut、depth-wise超大kernel、小kernel重参数化等。



增大kernel size:越大越暴力!

我们给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。


Cityscapes语义分割

RepLKNet-31B的体量略小于Swin-Base,在仅仅用ImageNet-1K pretrain前提下,mIoU超过Swin-Large + ImageNet-22K,完成了跨模型量级、跨数据量级的超越


ADE20K语义分割

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目标检测

结果参见“太长不看”部分或论文。


讨论与分析

有效感受野:大kernel模型远超深层小kernel模型

我们可视化了RepLKNet-31、RepLKNet-13(前文所说的每个stage都是13x13的模型)、ResNet-101、ResNet-152的有效感受野(方法详见论文)发现ResNet-101的有效感受野其实很小,而且ResNet-152相对于101的提升也很小;RepLKNet-13的有效感受野很大,而RepLKNet-31通过增大kernel size进一步将有效感受野变得非常大


Shape bias:大kernel模型更像人类

我们又研究了模型的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(即更像人类)

MegEngine对大kernel的强力优化

以往大家不喜欢用大 kernel 的其中一个原因是其较低的运行效率。但旷视开源的深度学习框架 MegEngine 通过分析和实验发现大 kernel depth-wise 卷积仍有很大的优化潜力,其运行时间可能不会显著慢于小 kernel(延展阅读zhuanlan.zhihu.com/p/47)。MegEngine 针对大 kernel depthwise 卷积做了多种深度优化,优化后的 MegEngine 性能比 PyTorch 最高快 10 倍,31x31 大小卷积核上的运行时间几乎和9x9 大小卷积核的运行时间差不多,可以打满设备的浮点理论峰值。MegEngine 用实际数据在一定意义上打消了大家对大 kernel 卷积运行效率的疑虑。这些优化已经集成到了MegEngine中,欢迎使用~

3月19日Meetup预告:ConvNeXt + RepLKNet

我们邀请到了ConvNeXt的作者刘壮一起探讨现代模型设计!更多 MegEngine 中大 kernel 优化解读,及 ConvNext,RepLKNet 两篇 paper 的分享,可关注北京时间本周六(3.19)上午 10:00 的 MegEngine Meetup ,我们将为大家带来线上分享~

活动链接:周六直播预告 | 打破思维惯性,旷视MegEngine告诉你为什么要思考大kernel size




  

相关话题

  pytorch dataloader数据加载占用了大部分时间,各位大佬都是怎么解决的? 
  如何评价 Face++ 旷视科技最新出品的检测专用 backbone 网络 DetNet ? 
  AMD的CPU是否适合搭建深度学习主机? 
  计算机视觉和自然语言处理,哪个更具有发展前景呢,还是各有千秋呢? 
  机器视觉为什么不用手机的镜头,而要用那么大的工业相机? 
  如何看待阿里巴巴提出的 FashionAI 比赛? 
  UCLA 的朱松纯教授是一个什么样的人? 
  测试集在构造的时候需要人为控制其中应该正确的和应该错误的数据比例吗? 
  计算流体力学(CFD)里应用注意力机制(attention)是否可行? 
  如何解决测试中充斥着大量训练集中没见过的样本类型模型将其识别成非我族类仍然保持测试集的高精度? 

前一个讨论
深度学习中Attention与全连接层的区别何在?
下一个讨论
隐私计算/多方安全计算/联邦学习问题?





© 2024-11-21 - tinynew.org. All Rights Reserved.
© 2024-11-21 - tinynew.org. 保留所有权利