百科问答小站 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




  

相关话题

  为什么计算注意力机制的时候不加偏置项? 
  如何看待2021年秋招算法岗灰飞烟灭? 
  写论文痛苦吗? 
  深度学习工作站中使用AMD的CPU会有问题吗? 
  为什么强大的 MXNet 一直火不起来? 
  人是如何做黑盒优化的? 
  AlphaGo「理解」围棋吗? 
  写邮件给一些论文作者(尤其中国大陆)咨询已发表论文中的一些问题时,为什么往往得不到回复? 
  如何评价ST-GCN动作识别算法? 
  神经网络的万能逼近定理已经发展到什么地步了? 

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





© 2024-12-26 - tinynew.org. All Rights Reserved.
© 2024-12-26 - tinynew.org. 保留所有权利