A ConvNet for the 2020s

论文发表在2022CVPR

代码:https://github.com/YUTING0907/SubscribePapers/blob/main/papers/cvpr/cvpr2022.md

A ConvNet for the 2020s

ConvNeXts由传统的卷积层(ConvNets)组合成的模型,在ImageNet上得到了 top-1 accuracy,87.8% 超过了Transformers,在COCO detection and ADE20K segmentation任务上优于 Swin Transformers 。引发人们重新思考卷积在计算机视觉领域的重要性。

1. ConvNeXt的进化路径

图1概括了ConvNeXt的所有优化点,它从ResNet-50[4]或者ResNet-200出发,依次从宏观设计,深度可分离卷积(ResNeXt[5]),逆瓶颈层(MobileNet v2[6]),大卷积核,细节设计这五个角度依次借鉴Swin Transformer的思想,然后在ImageNet-1K上进行训练和评估,最终得到ConvNeXt的核心结构。

1.1 训练方式

在介绍ConvNeXt的结构优化之前,我们先简单介绍一下ConvNeXt的训练方法。我们知道ResNet-50在ImageNet-1k上最终的Top-1的准确率是76.1%,而图1中ResNet-50说的是78.8%,而这2.7%的准确率的提升正是依靠对训练策略的优化所达到的。

在ConvNeXt中,它的优化策略借鉴了Swin-Transformer。具体的优化策略包括:(1)将训练Epoch数从90增加到300;(2)优化器从SGD改为AdamW;(3)更复杂的数据扩充策略,包括Mixup,CutMix,RandAugment,Random Erasing等;(4)增加正则策略,例如随机深度[7],标签平滑[8],EMA[9]等。更具体的预训练和微调的超参数如图2。

1.2 宏观设计

1.2.1 每个阶段的计算占比(Stage Ratio)

VGG提出了把骨干网络分成若干个网络块的结构,每个网络块通过池化操作将Feature Map降采样到不同的尺寸。在VGG中,每个网络块的网络层的数量基本是相同,但在之后的很多工作中,他们指出当深层的网络块层数更多时,模型的表现更好。例如,ResNet-50中共有4个不同的网络块,每个网络块又有若干个不同的基础层,一般是由卷积,BN等操作组成,它的每个网络块的层数是 (3,4,6,3) 。

在Swin-Transformer中,每个骨干网络被分成了4个不同的Stage,每个Stage又是由若干个Block组成,在Swin-Transformer中,这个Block的比例是 1:1:3:1 ,而对于更大的模型来说,这个比例是 1:1:9:1 。ConvNeXt的改进是将ResNet-50的每个Stage的block的比例调整到 1:1:3:1 ,最终得到的block数是 (3,3,9,3) 。从图1中可以看出这个改进将ResNet-50的准确率从78.8%提升至79.4%。注意这里模型的GFLOPs从4.1增加至4.5,这0.6%的准确率的提升也有一部分功劳要归功于模型参数量的增加。此外ConvNeXt还提供了更大的block数为 (3,3,27,3) 的模型。

1.2.2 Patchify Stem

对于ImageNet数据集,我们通常采用 224×224 的输入尺寸,这个尺寸对于ViT等基于Transformer的模型来说是非常大的,它们通常使用一个步长为4,大小也为4的卷积将其尺寸降采样到 56×56 。因为这个卷积的步长和大小是完全相同的,所以它又是一个无覆盖的卷积,或者叫Patchify(补丁化)的卷积。这一部分在Swin-Transformer中叫做stem层,它是位于输入之后的一个降采样层。

在ConvNeXt中,Stem层也是一个步长为4,大小也为4的卷积操作,这一操作将准确率从79.4%提升至79.5%,GFLOPs从4.5降到4.4%。也有人指出使用覆盖的卷积(例如步长为4,卷积核大小为7的卷积)能够获得更好的表现。

1.2.3 分组卷积

在轻量级模型中,我们介绍了深度可分离卷积,它们将 3×3 卷积以通道为单位进行运算(深度卷积),然后再通过 1×1 卷积进行通道融合(点卷积)。而ResNeXt是一个更折中的方案,它通过分组卷积(将通道分组,然后以组为单位进行卷积)的方式来提升模型的计算速度。与之类似的是,Swin-Tranformer的Self-Attention也是以通道为单位的运算单元,不同的是可分离卷积是可学习的卷积核,Self-Attention是根据数据动态计算的权值。

在ConvNeXt中,也引入了分组卷积的思想。它将 3×3 卷积替换成了 3×3 的分组卷积,这个操作将GFLOPs从4.4降到了2.4,但是它也将准确率从79.5%降到了78.3%。为了弥补准确率的下降,它将ResNet-50的基础通道数从64增加至96。这个操作将GFLOPs增加到了5.3,但是准确率提升到了80.5%。

1.2.3 逆瓶颈层

瓶颈层是一个中间小,两头大的结构,最早在残差网络中被使用。而在MobileNet v2中则使用了一个中间大,两头小的结构,他们认为这个结构能够有效的避免信息流失。之后的 Transformer本质也是一个逆瓶颈层的架构,在Transformer中,Self-Attention的隐层节点数是512,而中间的全连接的隐层节点数是2048。这里的ConvNeXt也是使用了逆瓶颈层的结构,如图3.(a)和图3.(b)所示。这个策略将准确率提升至85.6%,GFLOPs降低至4.6。

在后续的工作中,作者尝试了使用更大的卷积核。为了适应更大的卷积核,作者将卷积的图3.(b)的深度卷积向上移动了一层,如图3.(c)。此操作将准确率降低到了79.9%,但是GFLOPS也下降到了4.1%。

1.3 更大卷积核

大卷积核是一个比较古老的卷积运算参数,上次看见这些大卷积核还是在AlexNet,VGG等这些上古网络中。当时使用小卷积核替代大卷积核,一个重要的原因是一个大卷积核( 5×5 卷积)和两层的小卷积核( 3×3 卷积)在拥有相同感受野的情况下,表现是比两层小卷积核略差的。在Swin-Transformer中,它们使用的是 7×7 自注意力窗口本质上也是一个大的计算窗口,因此这里作者也对大的卷积核重新进行了对照实验。

在ConvNeXt的实验中,它们尝试了 5×5 , 7×7 , 9×9 和 11×11 共4个不同尺寸的卷积操作。从图1的实验结果来看, 7×7 卷积操作的效果最好。它将模型的准确率提升至80.6%,GFLOPs些许增加至4.2。并且从这个实验结果中可以看出,大卷积核对模型速度的影响并不很大,这可能是得益于当前深度学习框架以及硬件对大卷积核的支持更友好。

1.4 细节优化

1.4.1 ReLU替换为GELU

ReLU是比较早期的激活函数,近年来更多的模型选择使用GELU[11]作为激活函数,例如ConvNeXt要对齐的Swin Transformer。在ConvNeXt的实验中,GELU并没有提升模型的准确率和效率。但是为了对齐其它指标,ConvNeXt还是选择了GELU作为激活函数。

1.4.2 更少的激活函数

在以往的卷积网络中,我们倾向于为每一个卷积操作都添加一个激活函数,但Transformer使用了更少的激活函数,Transformer是由一个自注意力层和两个MLP组成,但它仅在一个MLP上使用了激活函数。

ConvNeXt也借鉴了Transformer的思想,它仅在两个 1×1 卷积之间添加了一个GELU激活函数。实验结果表明这个操作将准确率从80.6%提升至81.3%。

1.4.3 更少的归一化层

Transformer也是一个归一化层使用的非常少的网络结构,因此在ConvNeXt中也使用了更少的归一化操作,它仅在第一个 1×1 卷积之前添加了一个BN,而更多的归一化操作对模型效果提升并没有帮助。通过这个操作将模型的准确率提升至81.4%。

1.4.4 BN替换为LN

根据我们之前的经验,BN[12]经常被用在CNN中,而LN[13]通常是用来解决BN在样本量过少的时候归一化统计量偏差过大的问题的。也有实验结果表明,如果将残差网络中的BN直接替换为LN的话,模型的性能反而会下降。

但是在ConvNeXt中,因为之前作者做了若干个将卷积网络向Transformer的改进,因此这里也尝试了将ConvNeXt中的BN替换为LN,令人意外的是,LN在ConvNeXt中要比BN表现的好,它将模型的准确率提升至81.5%。

因为上述改进都是非常小的点的优化,对模型的速度影响并不大,因此ConvNeXt的GFLOPs维持在了4.2没变。上述的所有改进如下面代码片段所示。注意下面的代码中的 1×1 卷积使用的是线性层来实现的。


觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭



wechat pay



alipay

A ConvNet for the 2020s
http://yuting0907.github.io/2023/07/22/paper-A-ConvNet-for-the-2020s/
作者
Echo Yu
发布于
2023年7月22日
许可协议