论文:https://arxiv.org/pdf/2201.03545.pdf
代码:https://github.com/facebookresearch/ConvNeXt
摘要
视觉任务的20年代以ViT(Vision Transformers)为始,并迅速超越ConvNet成为性能最佳的图像分类模型。 分层Transformer(如Swin Transformer)重新引入了ConvNet先验信息 ,使得Transformer成实际可行的通用视觉骨干网络,并在不同视觉任务上取得了非凡的性能。但是,这种混合方法的有效性,归因于transformer的内在优势,而不是卷积的归纳偏差。
论文重新验证了设计空间,并测试了单纯的卷积网络convnet可以达到的上限。 论文对标准的ResNet,循序渐进地朝着ViT方向改造,并发现了一些影响模型性能的关键部分。 得到了一系列纯粹的卷积网络模型,叫做ConvNeXt,在准确率和稳定性上完全可以和Transformers 媲美,在 ImageNet top-1达到87.8%准确率,而且在coco数据集目标检测和ADE20K数据集语义分割上超过了Swin Transformers,同时,保持了标准卷积的简单和效率。

2. Modernizing a ConvNet: a Roadmap
基于FLOPs对齐两种模型:
ResNet-50 / Swin-T计算量FLOPs:
4.5
×
1
0
9
4.5 \times 10^{9}
4.5×109
ResNet-200 / Swin-B计算量FLOPs:
15.0
×
1
0
9
15.0 \times 10^{9}
15.0×109
最终结果使用ResNet-50 / Swin-T展示。
原则:遵循Swin Transformer不同层次的设计,同时保持网络作为标准ConvNet的简单性。
首先,在相同的训练策略下,ViT比ResNet50性能表现要好很多,使用当前的ResNet50作为baseline;
之后,设计了一系列的 ‘modernize’ 改进策略:
(1)macro design;
(2)ResNeXt;
(3)inverted bottleneck;
(4)large kernel size;
(5)various layer-wise micro design。
图2展示了随着网络一步步地modernize,所有模型在ImageNet-1K上训练并测试取得的一些结果。

2.1 训练技巧
ViT除了新的结构模块设计,在视觉任务上训练策略也不同(例如AdamW优化器)。所以第一步,就是根据ViT的训练策略,训练一组ResNet50/200的baseline。
具体训练策略:
1)训练从90epoch扩展到300epoch;
2)使用AdamW优化器;
3)数据增强使用 Mixup、 Cutmix、RandAugment 、Random Erasing;
4)正则化方案包括随机深度(Stochastic Depth)和标签平滑(Label Smoothing)。具体参数设置如下:

就其本身而言,这种增强训练方法将ResNet-50模型的性能从76.1%提高到78.8%(+2.7%),这意味着传统卷积神经网络和ViT之间的性能差异很大一部分可能是由于训练技术。
2.2 Macro Design
Changing stage compute ratio.
ResNet的res4 阶段的结构设计是为了适配下游的任务(比如目标检测,检测器要在14*14的尺寸上进行)。Swin-T也践行了同一原则,唯一不同的是4阶段的计算比率是 1:1:3:1,更大Swin Transformer使用的比率是1:1:9:1.所以调整ResNet50的block数量由(3,4,6,3)到(3,3,9,3),FLOAPs和Swin-T基本一致,但准确率从78.8%提升到79.4%。(有研究在分析计算分布的影响,可能存在更有的计算分布)
Changing stem to “Patchify”
stem结构主要关心:网络起始部分如何对输入图像处理。由于图片本身具有内在冗余,标准ResNet和ViT,一般都会将图像下采样到合适的特征图尺寸。在标准ResNet中,一组stride=2的7*7卷积,之后一组MaxPooling,生成输入图像的4倍下采样特征。在ViT中,使用了激进的“Patchify”策略应用到stem 策略,即一组大的kernel (通常了kernel size=14、16)和无重叠的卷积。
SiT使用了类似“Patchify”的策略,但是使用了更小的patch size=4来适应多阶段的结构设计。
论文将ResNet-style stem cell替换为patchily层,使用
4
∗
4
4*4
4∗4,步长为4的卷积层。准确率从79.4%提升到79.5%,这表明ResNet的stem cell可以被ViT的patchify层取代,并取得更好的性能。
2.3. ResNeXt-ify
此阶段,尝试使用ResNeXt的分组卷积。ResNeXt践行更多的分组,来扩充宽度。在bottleneck块中使用 3 ∗ 3 3*3 3∗3的分组卷积,明显减少了FLOPs,同时用扩展网络宽度弥补容量的损失。
论文使用了depthwise convolution(DW),发现深度卷积类似于自注意力中的加权和操作,其操作基于每个通道,即只在空间维度上混合信息。深度卷积和 1 ∗ 1 1*1 1∗1卷积相结合,形成空间和通道的分离,这也是ViT共有的特性,其每个操作要么混合了空间或者通道维度的信息,但不会同时混合。(当然,FLOPs降了,精度也如期降了!)
论文又将网络宽度64提升到和Swin-T一样的通道数96。准确率提升到80.5%,FLOPs为5.3G。
2.4. Inverted Bottleneck
每个transformer块一个重要的设计是,创建了一个倒置瓶颈块,即MLP块的隐藏层尺寸是输入层尺寸的4倍。这种设计可联系到ConvNets中扩展比为4的倒置瓶颈块。这是MobileNetV2最先引起的倒置瓶颈块的潮流,之后广泛应用到ConvNet结构中。

论文使用了倒置瓶颈块结构,图3中的(a)到(b)解释了这一变化过程。虽然深度卷积的FLOPs增加了,但是在下采样shortcut
1
∗
1
1*1
1∗1卷积层FLOPs减少了,整体的FLOPs也降低到4.6G。并且性能从80.5%提升到80.6%。
2.5. Large Kernel Sizes
ViT没有local自注意力机制,每一层都是全局视野。以前ConvNets有大尺寸的卷积核,但是 3 ∗ 3 3*3 3∗3卷积核在现代gpu上有较高的硬件实现,所以被广泛使用。Swin-T重新引入local窗口的自注意力block,窗口尺寸 7 ∗ 7 7*7 7∗7,明显比ResNeXt的 3 ∗ 3 3*3 3∗3大很多,所以论文在ConvNet上再次使用大卷积核以对齐。
Moving up depthwise conv layer
探讨大的卷积核就要把深度卷积上移,图3中(b)到©。这类似于在Transformer中就是MSA block在MLP层之前。 (b)中本身就是导致的瓶颈块,现将大卷积核的深度卷积上移,那么深度卷积通道就要减少(复杂且低效的模块-大核卷积、MSA这种),而高效密集的
1
∗
1
1*1
1∗1卷积成为主要工作部分。
性能下降到79.9%
Increasing the kernel size.
实验了几组kernel size3、5、7、9,性能从79.9%( 3 ∗ 3 3*3 3∗3)提升到80.6%( 7 ∗ 7 7*7 7∗7),FLOPs大体一致,在 7 ∗ 7 7*7 7∗7性能达到饱和。R200也是在 7 ∗ 7 7*7 7∗7卷积核性能达到最佳。
2.6. Micro Design
关注一些微观操作,大部分是层级的,关注特殊的激活函数和归一化层。
Replacing ReLU with GELU
将ReLU激活函数替换为NLP常用GELU,性能没变。
Fewer activation function
ViT有更少的激活函数,为了跟ViT结构相似。如图4,剔除了除
1
∗
1
1*1
1∗1卷积层之外的所有GELU激活函数。性能提升到81.3%, 已经达到了Swin-T的性能指标。

Fewer normalization layers
transformer block的归一化层也很少,仿照他的风格,删除2个BN层,只留一组
1
∗
1
1*1
1∗1卷积之前的BN层,性能提升到81.4%,已经超过了Swin-T。
这样看来,论文每个block的归一化层比Transformer更少,因为作者经验表明,在block的开始添加一个ewaide 的BN层并不能改善性能。
Substituting BN with LN.
有论文指出BN对模型有害,也有论文指出LN(Layer Normalization)在Transformer中表现更好。有论文直接用LN替代BN性能不佳,但是论文用LN替代BN性能有了提升至81.5%。
Separate downsampling layers.
ResNet空间下采样是通过每一阶段的第一个残差块,使用步长为2的
3
∗
3
3*3
3∗3的卷积(shortcut中
1
∗
1
1*1
1∗1的卷积步长也为2)。在Swin Transformer会在各阶段之间,有一个单独的下采样层。论文使用了步长为2的
2
∗
2
2*2
2∗2卷积进行空间下采样。 并且进一步的观察表明,在空间分辨率改变的地方添加归一化层,有利于训练稳定。
所以使用了 stride=2的conv_2*2和一层LN,性能提升至82.0%。
ResNet50、ConvNeXt-T以及Swin-T结构对比:

3. Empirical Evaluations on ImageNet
构建了不同尺度的ConvNeXt,ConvNeXt- T/S/B/L分别对应 Swin-T/S/B/L,不同尺度的区别仅仅在于,各阶段的通道数量C和block数量B,另通道数C增加是在每个新增的stage。具体配置如下:
• ConvNeXt-T: C = (96, 192, 384, 768), B = (3, 3, 9, 3)
• ConvNeXt-S: C = (96, 192, 384, 768), B = (3, 3, 27, 3)
• ConvNeXt-B: C = (128, 256, 512, 1024), B = (3, 3, 27, 3)
• ConvNeXt-L: C = (192, 384, 768, 1536), B = (3, 3, 27, 3)
• ConvNeXt-XL: C = (256, 512, 1024, 2048), B = (3, 3, 27, 3)
3.1. Settings
在ImageNet-22K上预训练模型,之后在 ImageNet-1K上fine-tune。
ConvNeXts’ ImageNet-1K training and ImageNet-22K pre-training settings in Table 5 第二节的所有配置都在Tabel5中,除了EMA=disabled,因为作者发现EMA会严重损害有BN层的模型。

ImageNet Fine-tuning
基于之前预训练的模型进行微调,没有使用EMA。

另注:
与前面的实验观察不同,
R200的kernel size饱和值是5,R50的饱和值是7;
瓶颈块倒置结构在R200上性能涨幅更大。
具体实验详情,可见论文。
总结
虽然论文中所有对convnet设计改造,都来自于 vision Transform,但是改造后ConvNeXt的仍是纯粹的ConvNet,而且,性能明显超过Swin Transformer。相比Swin Transformer,ConvNeXt具有相同的FLOPs、参数量、吞吐量和内存使用,但不需要特殊的模块,比如滑窗注意力、相对位置偏置等。可见Swin Transformer在视觉任务上的优秀表现,并不能单纯归因于transformer的内在优势,反而ConvNet简单高效的结构更能打。
参考:

2983

被折叠的 条评论
为什么被折叠?



