作者‖ cocoon
编辑‖ 3D视觉开发者社区
FAIR又出新作了!一篇《2020年代的卷积网络》的横空出世,让国内外CV圈的眼光都聚焦于此,不少大牛都纷纷下场参与讨论。研究团队以Transformer的一些设计原则以及训练技巧为标,尽可能地探究纯卷积结构的效果与性能极限。该篇论文实验充分,结构清晰,非常值得一读。
论文名称: A ConvNet for the 2020s
论文链接: https://arxiv.org/pdf/2201.03545.pdf
开源代码链接: https://github.com/facebookresearch/ConvNeXt
作者单位: FAIR(Facebook AI Research)、 UC Berkeley
无疑,transformer的结构在视觉识别领域内获得了巨大的成功,然而,原生的transformer结构无法应用到某些普遍的视觉任务中,比如说在目标识别以及语义分割任务。针对这样的问题,Swin transformer应用了一些卷积结构的优势,使得Transformer能够实际地作为许多网络的backbone,进而在一系列的视觉任务中取得令人瞩目的成绩。尽管如此,类似于swin transformer的混合方法,之所以能够取得好成绩,主要的原因还是更偏重于其transformer的结构,并不是卷积结构的固有特性。
而FAIR团队在这篇文章中所介绍的工作则是,重新探究和评估ConvNet的设计空间以及性能上的极限。
文章逐渐地将ResNet”现代化“,或者说,对ResNet进行改进,使得其更接近transformer的版本,并从中提取能够对性能有较大贡献的几个关键组件。探究的结果是一个纯卷积结构所组成的网络,称之为ConvNeXt。尽管全部由卷积结构设计而得,ConvNeXt却能够在精度以及灵活性上均与transformer媲美,甚至更优。具体地,在ImageNet上获得了87.8%的top-1准确度,且超过了Swin transformer在COCO检测数据集以及ADE20K分割集上的效果。更难能可贵的是,ConvNeXt保持了纯卷积结构的简洁性与高效性。
在本节中,提供了从ResNet到ConvNet的设计轨迹,该设计轨迹与Transformer有一定的相似性。
从FlOPs的角度出发,考虑了两种模型的size,一个是ResNet-50/Swin-T的模型大小,其FLOPs约为 4.5 ∗ 1 0 9 4.5 * 10^9 4.5∗109,另一个则是ResNet-200/ Swin-B的模型大小,其FLOPs大约为 15.0 ∗ 1 0 9 15.0 * 10^9 15.0∗109。
出于简洁性的考虑,文章最终会给出相当于ResNet-50/Swin-T的模型结果。
首先使用Swin-Transformer的训练方式对ResNet-50进行训练,作为baseline。
然后研究了一系列的设计技巧对于网络性能的影响,这些性能包括了:
(1)宏观设计(macro design);
(2)ResNetXt化;
(3)倒置的瓶颈(inverted bottleneck);
(4)更大的核大小;
(5)不同的逐层微观设计。
除了网络结构的设计,训练策略也将对模型结果产生影响。
实际上,ViT的成果不仅仅给我们带来了在模型结构设计上的启发,其在训练策略上亦有值得我们学习的地方。
因此,探索的第一步就是,使用ViT的训练策略,训练出一个ResNet-50/200作为baseline。
具体地,使用了类似于DeiT以及Swin Transformer的训练策略,有:
通过这样的训练策略,可以使得ResNet-50的准确率从76.1% 提升至 78.8 %。
在之后的探索中,均采用了一致的训练策略与超参数。每一个结果都是三个随机种子训练得到的结果平均。
我们知道,Swin Transformer的设计是多级的,每一级都有着不同的特征图分辨率,文章提炼出了两个比较有意思的设计思想:
原始ResNet在每一个stage中的计算分布实质上是经验性的。
最为繁重的"res4"的设计意图是与某些下游任务,比方说目标减策实现兼容,具体的体现方式为探测头在 14 ∗ 14 14 *14 14∗14大小的特征平面上进行处理。
Swin-T的设计原则也是类似的,其stage compute ratio 为 1 : 1 : 3 : 1 1:1:3:1 1:1:3:1,而对于更大的Swin Transformer来说,其比例为 1 : 1 : 9 : 1 1:1:9:1 1:1:9:1。
考虑到这样的设计原则,我们调整ResNet-50中的stage compute ratio 从 ( 3 , 4 , 6 , 3 ) (3,4,6,3) (3,4,6,3)到 ( 3 , 3 , 9 , 3 ) (3,3,9,3) (3,3,9,3)。这样的调整,使得ResNet的FLOPs与Swin-T一致。且精度从78.8%进一步地增长到79.4%。
值得注意的是,在这方面或许仍然有增长空间。
在接下来的探究实验中,均采用了这样的比例分配。
显然,“stem”的设计更关注怎么在网络开始的时候处理输入图像。考虑到自然影像中存在的冗余信息,不管是ConvNet还是ViT,都会将自然影像下采样到一个合适的特征图尺寸。
在传统的ResNet中,“Stem”表现为stride=2的 7 ∗ 7 7*7 7∗7卷积,且接一个最大池化,因此最终得到一个4倍降采样的size。
而在ViT中,其“Stem”则采用了更为激进的“patchify”策略,即,采用了一个更大的核(14或16),以及非重叠的卷积。
Swin-Transformer采用了一个类似的“patchify”层,不过采用了更小的patch size(4),目的是为了适应其多级的网络结构。
将ResNet中的“stem”换成了一个 4 ∗ 4 4*4 4∗4大小, s t r i d e = 4 stride = 4 stride=4的所谓的patchify的卷积层,精度从 79.4 79.4% 79.4提升到了 79.5 79.5% 79.5。
相比起普通的ResNet来说,尝试采用ResNeXt中的思想策略。ResNeXt中的核心策略是分组卷积,在这里特指的含义是:将卷积划分为几个组内。
使用了depthwise卷积。
实际上,depthwise卷积与自注意力中的加权和操作非常相似,都是在每一个通道中进行操作。
结合depthwise卷积与1*1卷积,使得空间和通道的信息融合分离开来,这与ViT中的思想非常相似,即,要么融合空间信息,要么融合通道信息,并不会同时进行信息混合。
通过depthwise卷积的使用,大幅降低了网络的FLOPs
考虑到ResNeXt所提到的策略,将网络的通道提到与Swin-T一致,即从64到96。这使得网络的性能提升到80.5%,但同时,FLOPs也增加了5.3G。
在每一个Transformer block中都有一个非常重要的设计,即inverted Bottleneck,换言之,MLP block是输入维度的四倍宽。
在图三中,体现了配置的配置设计:
尽管depthwise卷积层的FLOPs提高了,但由于降采样残差块中shortcut的连接减少,整个网络的FLOPs减少到了4.6G。
这样的设计轻微地提高了精度,即从80.5% 到 80.6%。
而在ResNet-200/Swin-B的机制中,则带来了更大的收益,从81.9%涨到了82.6%。
为了探索大型卷积核的作用,一个先决条件就是将depthwise的位置上调(见Figure 3(b)到(c))。这在Transformer中也是有迹可循的:MSA在MLP层之前。由于inverted bottleneck的存在,这就变成了一个很自然的选择:复杂的MSA模块有着更少的通道数,而更有效率的密集的1*1的卷积则将会承担更为繁重的工作。
这样的中间步骤将FLOPs减少到了4.1G,但是却暂时的使得精度降低到了79.9%。
在有了先决条件后,实验了 3 , 5 , 7 , 9 , 11 3,5,7,9,11 3,5,7,9,11这几个核的精度。
将核大小变化为 7 ∗ 7 7*7 7∗7后,相对于 3 ∗ 3 3*3 3∗3的卷积,精度从79.9%提升到了80.6%,而FLOPs几乎保持不变。
7 ∗ 7 7*7 7∗7的核大小基本上精度已饱和,再增加核的大小都不会使得精度再有所增益。因此,在之后的实验中均采用 7 ∗ 7 7*7 7∗7大小的核。
所谓的微观层面指,基本上在层的颗粒度上进行设计,主要聚焦在一些激活函数以及归一化层的选择上。
GELU可以视作是ReLU的平滑体,在比较新的研究中有所使用,如BERT、OpenAI中的GPT-2以及ViT等。
然而,将ReLU替换成GELU后在精度上并没有提升。
Transformer与ResNet的block之间还有一个小区别就是Transformer采用了更少的激活函数。
考虑Transformer block内有key/query/value的线性embedding层,投影层,在MLP block中的两个线性层,只有在MLP block中才存在一个激活函数。
作为对比,可以尝试在每一个卷积层后面都添加一个激活函数层。
在Figure 4中,可以看到,尝试从残差块中去除了GELU激活,只保留在两个 1 ∗ 1 1*1 1∗1层之间的GELU,模拟了Transformer中的风格,这样的操作使得精度提升了0.7%,达到了81.3%的精度,此时的精度已经可以媲美Swin-T了。
因此,在接下来的网络评估中,都只采用一个GELU激活。
同样,在Transformer的block中,往往有着更少的归一化层。
同样,这里也去除掉两个BN层,在 1 ∗ 1 1*1 1∗1卷积之间只使用一个BN层,这使得网络的精度进一步提升至81.4%,这已经超过了Swin-Transformer的精度了。
注意到,此时在每一个block中的激活函数已经比Transformer还少了,因此,经验地再在block的最开始处额外地加一个BN层,并不会对精度有所提高。
之前,直接将ResNet中的BN层替换为LN,会导致网络的精度并非最优。然而,采用之前提到的网络结构以及训练技巧,发现用LN训练并没有什么困难,甚至最后还取得了81.5% 的精度。
因此,在接下来的实验中,在每一个残差块中都采用一个LN层。
在ResNet中,空间降采样是通过残差块进行实现的。
在Swin Transformer中,在两个stage之间加入了分开的降采样层。
进而,探索了一个类似的策略,即使用两个 2 ∗ 2 2 *2 2∗2的卷积层( s t r i d e = 2 stride = 2 stride=2)进行空间上的降采样,这样的修改导致了不同的训练,在之后的研究中发现,在空间分辨率变化的位置加上归一化层将有助于训练的稳定性。
此外,在Swin-Transformer中,一个LN放在降采样之前,一个LN放在stem之后,还有一个放在最后的全局平均池化之后。
这样的操作使得网络的精度提升到82.0%,大幅高于Swin-Transformer所能达到的81.3%。
因此,使用分开的降采样层,这将形成最终的模型,即,命名为ConvNeXt。
ResNet、Swin以及ConvNeXt的block结构可以见Figure 4.
ResNet-50、Swin-T、ConvNeXt-T的细节结构则见Table 9,即:
构建了多个ConvNeXt的变种,有:
训练细则的介绍暂略,读者可见原文,各变种的结果为:
文章以Transformer的一些设计原则以及训练技巧为标的,尽可能地探究纯卷积结构的效果与性能极限。尽管每一个小的技巧并非是创新的,但综合的进行试验时确切地得到了大幅的精度提升,个人认为这也将为广大研究者在模型设计与精度提点的工作中提供启发性的思路。
版权声明:本文为奥比中光3D视觉开发者社区特约作者授权原创发布,未经授权不得转载,本文仅做学术分享,版权归原作者所有,若涉及侵权内容请联系删文。
3D视觉开发者社区是由奥比中光给所有开发者打造的分享与交流平台,旨在将3D视觉技术开放给开发者。平台为开发者提供3D视觉领域免费课程、奥比中光独家资源与专业技术支持。点击加入3D视觉开发者社区,和开发者们一起讨论分享吧~
或可微信关注官方公众号 3D视觉开发者社区 ,获取更多干货知识哦。