CV-Model【8】:ConvNeXt


前言

随着 ViT 在计算机视觉领域大放异彩,越来越多的研究人员将工作重心放在 Transformer 上,在计算机视觉领域上 CNN 难道真的要被 Transformer 完全取代吗?

本文长篇分析并设计 CNN 架构的若干技巧,对照 Swin Transformer 的设计理念,渐进式“现代化”改造 ResNet,取得了良好的效果,对深度网络的设计具有较大的参考价值

原论文链接:A ConvNet for the 2020s


1. Abstract & Introduction

1.1. Abstract

分层变形器(如 Swin Transformers)重新引入了几个 ConvNet 先验,使得 Transformer作为通用视觉骨干实际上是可行的,并在各种视觉任务中表现出显著的性能。然而,这种混合方法的有效性仍然主要归功于 Transformers 的内在优势,而不是 Convolutions 的内在归纳偏见

本文逐步将一个标准的 ResNet “现代化”,并在这一过程中发现了几个促成性能差异的关键组件。ConvNeXt 完全由标准的 ConvNet 模块构成,在准确性和可扩展性方面与 Transformer 竞争,通过一系列实验比对,在相同的 FLOPs 下,ConvNeXt 相比 Swin Transformer 拥有更快的推理速度以及更高的准确率

1.2. Introduction

背景:

  • ConvNets
    • "滑动窗口 "策略是视觉处理的内在因素,特别是在处理高分辨率图像时
      • 以滑动窗口的方式使用时,计算是共享的
    • 基于区域的检测器让 ConvNets 成为视觉识别系统的基本构件
  • ViT
    • 除了最初的 "补丁化 "层(将图像分割成一连串的补丁),ViT 没有引入图像特定的感应偏差,并且对原始的 NLP Transformers 做了最小的改动
    • ViT 模型在作为通用视觉骨干时面临最大的挑战是 ViT 的全局注意力设计,它的复杂度与输入大小呈二次方
  • Swin Transformer
    • 采用了一种混合方法来弥补这一差距
      • "滑动窗口 "策略(如在局部窗口内的注意)被重新引入变形器,使其行为与 ConvNets 更加相似

我们可以发现,许多用于计算机视觉的变形器的进步都是为了让卷积回归,但这种尝试通常是有代价的

本文主要研究了 ConvNetsTransformers 之间的架构区别,并试图确定比较网络性能时的混杂变量。从一个标准的ResNet(例如ResNet50)开始,用改进的程序训练,并寻找到几个影响性能的关键组件,以实现与 Transformers 的竞争

在这里插入图片描述


2. Modernizing a ConvNet: a Roadmap

阅读完 这篇文章,你会发现 ConvNeXt “毫无亮点”,ConvNeXt 使用的全部都是现有的结构和方法,没有任何结构或者方法的创新。而且源码也非常的精简,100多行代码就能搭建完成

为什么现在基于 Transformer 架构的模型效果比卷积神经网络要好呢?本文认为可能是随着技术的不断发展,各种新的架构以及优化策略促使 Transformer 模型的效果更好,那么使用相同的策略去训练卷积神经网络也能达到相同的效果吗?

在这里插入图片描述

上图展现了每个方案对最终结果的影响(在 Imagenet 1K 的准确率)。很明显最后得到的 ConvNeXt 在相同 FLOPs 下准确率已经超过了 Swin Transformer。接下来,针对每一个实验进行解析。

2.1. Training Techniques

Vision Transformers 不仅带来了一套新的模块和架构设计决策,而且还为视觉引入了不同的训练技术(如 AdamW 优化器)。这主要涉及到优化策略和相关的超参数设置

本文首先利用训练 Vision Transformers 的策略去训练原始的 ResNet50 模型,在这种情况下是 ResNet50/200,发现比原始效果要好很多,并将此结果作为后续实验的基准 baseline

本文使用了与 DeiTSwin Transformer相近的训练策略:

  • 训练从原来的 90 个 epochs 扩展到 300 个 epochs 的 ResNets
  • 使用 AdamW 优化器
  • 数据增强技术,如 MixupCutmixRandAugmentRandom Erasing
  • 正则化方法,如 Stochastic DepthLabel Smoothing

就其本身而言,这个增强的训练配方将 ResNet-50 模型的性能从 76.1% 提高到 78.8% (+2.7%),这意味着传统 ConvNets 和视觉变形器之间的性能差异的很大一部分可能是由于训练技术造成的

2.2. Macro Design

2.2.1. Stage ratio

在原 ResNet 网络中,一般 conv4_x(即 stage3)堆叠的 block 的次数是最多的。如下图中的 ResNet50stage1stage4 堆叠 block 的次数是 ( 3 , 4 , 6 , 3 ) (3, 4, 6, 3) (3,4,6,3) 比例大概是 1 : 1 : 2 : 1 1:1:2:1 1:1:2:1,但在 Swin Transformer 中,比如 Swin-T 的比例是 1 : 1 : 3 : 1 1:1:3:1 1:1:3:1Swin-L 的比例是 1 : 1 : 9 : 1 1:1:9:1 1:1:9:1,很明显,在 Swin Transformer 中,stage3 堆叠 block 的占比更高

所以,本文将 ResNet50 中的堆叠次数由 ( 3 , 4 , 6 , 3 ) (3, 4, 6, 3) (3,4,6,3) 调整成 ( 3 , 3 , 9 , 3 ) (3, 3, 9, 3) (3,3,9,3),和 Swin-T 拥有相似的 FLOPs。进行调整后,准确率由 78.8 % 78.8\% 78.8% 提升到了 79.4 % 79.4\% 79.4%

在这里插入图片描述

2.2.2. “patchif” stem

stem 即卷机神经网络中,最初的下采样模块。如上图所示,ResNet50 网络当中,stem 是由 7 × 7 7 \times 7 7×7 的卷积与最大池化下采样组成,步距均为 2 2 2,图像的高和宽都下采样4倍

但在 Transformer 模型中一般都是通过一个卷积核非常大且相邻窗口之间没有重叠的(即 stride 等于 kernel_size)卷积层进行下采样。比如在 Swin Transformer 中采用的是一个卷积核大小为 4 × 4 4 \times 4 4×4 步距为 4 4 4 的卷积层构成 patchify,同样是下采样 4 4 4 倍。所以作者将 ResNet 中的 stem 也换成了和 Swin Transformer 一样的 patchify

替换后准确率从 79.4 % 79.4\% 79.4% 提升到 79.5 % 79.5\% 79.5%,并且 FLOPs 也降低了一点

2.3. ResNeXt-ify

本文试图采用 ResNeXt 的思想,因为 ResNeXt 相比普通的 ResNet 而言在 FLOPs 以及 accuracy 之间做到了更好的平衡。其核心部分是分组卷积 grouped convolution,其中卷积核被分成不同的组

如下图所示,左图是 ResNet 所采用的 bottleneck 结构,首尾两端通过 1 × 1 1 \times 1 1×1 的卷积核将通道数从 256 调整为 64 再调整回 256;右图是 ResNeXt 所采用的 block 结构,两者的最主要区别在于中间的卷积层,ResNet 采用的是普通的卷积层,而 ResNeXt 采用的是分组卷积

在这里插入图片描述

本文采用的是更激进的 depthwise convolution,即 group 数和通道数 channel 相同,使用 depthwise convolution 的一个原因是作者认为 depthwise convolutionself-attention 中的加权求和操作很相似,具体的原理可以参考我的另一篇 blog:CV-Model【2】:MobileNet v1

其结构与下图类似,针对每个 channel 的数据,我们单独用一个卷积核进行处理

在这里插入图片描述

使用 depthwise convolution 后,准确率由 79.5 % 79.5\% 79.5% 下降到 78.3 % 78.3\% 78.3%,同时 Flops 也从 4.4 下降到 2.4

接下来增大输入特征层的 channel,如下图所示:

  • ResNet
    • 输入通道数为 64
      在这里插入图片描述
  • Swin Transformer
    在这里插入图片描述
    • 以 Swin-T 为例,输入通道数为 96

作者参照 Swin Transformer,将每个 stage 的 channel 与 Swin Transformer 中的参数保持一致,可以发现准确率由 78.3 % 78.3\% 78.3% 提升到了 80.5 % 80.5\% 80.5%

2.4. Inverted Bottleneck

作者认为 Transformer block 中的 MLP 模块非常像 MobileNetV2中的 Inverted Bottleneck 模块,即两头细中间粗:

  • 下图 a 是 ReNet 中采用的 Bottleneck 模块
  • 下图 b 是 MobileNetV2 采用的 Inverted Botleneck 模块
  • 下图 c 是 ConvNeXt 采用的 Inverted Bottleneck 模块

在这里插入图片描述

作者采用 Inverted Bottleneck 模块后,在较小的模型上准确率由 80.5 % 80.5\% 80.5% 提升到了 80.6 % 80.6\% 80.6%,在较大的模型上准确率由 81.9 % 81.9\% 81.9% 提升到 82.6 % 82.6\% 82.6%

关于 MLP 模块可以参考我的另一篇 blog:CV-Model【6】:Vision Transformer,关于 Inverted Bottleneck 模块可以参考我的另一篇 blog:CV-Model【3】:MobileNet v2

2.5. Large Kernel Sizes

Transformer 中一般都是对全局做 self-attention,比如 Vision Transformer。即使是 Swin Transformer 也有 7 × 7 7 \times 7 7×7 大小的窗口。但现在主流的卷积神经网络都是采用 3 × 3 3 \times 3 3×3 大小的窗口,因为之前 VGG 论文中说通过堆叠多个 3 × 3 3 \times 3 3×3 的窗口可以替代一个更大的窗口,而且现在的 GPU 设备针对 3 × 3 3 \times 3 3×3 大小的卷积核做了很多的优化,所以会更高效。接着作者做了如下两个改动:

  • Moving up depthwise conv layer
    • 即将 depthwise conv 模块上移
      • 原来是 1x1 conv -> depthwise conv -> 1x1 conv
      • 现在是 depthwise conv -> 1x1 conv -> 1x1 conv
    • 这么做是因为在 Transformer 中,MSA 模块是放在 MLP 模块之前的,所以这里进行效仿,将 depthwise conv 上移
    • 这样改动后,准确率下降到了 79.9 % 79.9\% 79.9%,同时 FLOPs 也减小了。
  • Increasing the kernel size
    • 接着作者将 depthwise conv 的卷积核大小由 3 × 3 3 \times 3 3×3 改成了 7 × 7 7 \times 7 7×7(和 Swin Transformer 一样),当然作者也尝试了其他尺寸,包括 3 , 5 , 7 , 9 , 11 3, 5, 7, 9, 11 3,5,7,9,11 发现取到 7 7 7 时准确率就达到了饱和
    • 准确率从 79.9 % 79.9\% 79.9% ( 3 × 3 3 \times 3 3×3) 增长到 80.6 % 80.6\% 80.6% ( 7 × 7 7 \times 7 7×7)

在这里插入图片描述

2.6. Micro Design

这里的大部分探索是在层级上完成的,重点是激活函数和归一化层的具体选择

2.6.1. Replacing ReLU with GELU

在 Transformer 中激活函数基本用的都是 GELU,而在卷积神经网络中最常用的是 ReLU,于是作者又将激活函数替换成了 GELU,替换后发现准确率没变化

2.6.2. Fewer activation functions

在之前的神经网络学习过程中,我们习惯性地在每一个卷积层和全联接层之后加上一个激活函数,在这里,作者尝试使用更少的激活函数

如下图所示,在 Transformer 中并不是每个模块后都跟有激活函数,比如 MLP 中只有第一个全连接层后跟了 GELU 激活函数,其他模块后面都没有使用激活函数。接着作者在 ConvNeXt Block中也减少激活函数的使用,减少后发现准确率从 80.6 % 80.6\% 80.6% 增长到 81.3 % 81.3\% 81.3%

在这里插入图片描述

2.6.3. Fewer normalization layers

同样在 Transformer 中,Normalization 使用的也比较少,接着作者也减少了 ConvNeXt Block 中的 Normalization 层,只保留了 depthwise conv 后的 Normalization

此时准确率已经达到了 81.4 % 81.4\% 81.4%,已经超过了 Swin-T

2.6.4. Substituting BN with LN

Batch Normalization (BN) 在卷积神经网络中是非常常用的操作了,它可以加速网络的收敛并减少过拟合

但在 Transformer 中基本都使用 Layer Normalization (LN),因为最开始 Transformer 是应用在 NLP 领域的,BN 不适用于 NLP 相关任务

接着作者将 BN 全部替换成了 LN,发现准确率还有小幅提升达到了 81.5 % 81.5\% 81.5%

2.6.5. Separate downsampling layers

ResNet 网络中 stage2 - stage4 的下采样都是通过将主分支上 3 × 3 3 \times 3 3×3 的卷积层步距设置成 2 2 2,捷径分支上 1 × 1 1 \times 1 1×1 的卷积层步距设置成 2 2 2 进行下采样的

但在 Swin Transformer 中是通过一个单独的 Patch Merging 实现的。接着作者就为 ConvNext 网络单独使用了一个下采样层,就是通过一个 Laryer Normalization 加上一个卷积核大小为 2 2 2 步距为 2 2 2 的卷积层构成

在这里插入图片描述

更改后准确率就提升到了 82.0 % 82.0\% 82.0%


3. ConvNeXt Architecture

3.1. ConvNeXt variants

对于 ConvNeXt 网络,作者提出了 T/S/B/L 四个版本,计算复杂度刚好和 Swin Transformer 中的 T/S/B/L 相似

这五个版本的配置如下:

  • 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)

其中 C C C 代表 4 4 4stage 中输入的通道数, B B B 代表每个 stage 重复堆叠 block 的次数

3.2. Model Architecture

ConvNeXt - T 模型结构图如下所示

  • 通过卷积核大小为 4 × 4 4 \times 4 4×4,步距为 4 4 4 的卷积层对图像进行下采样
  • 依次通过 stage1 - stage4
    • Depthwise conv2d 卷积核大小为 7 × 7 7 \times 7 7×7,步距为 1 1 1,padding 为 3 3 3 h , w , d i m h, w, dim h,w,dim 不变,后接一个 Layer Norm
    • Conv2d 卷积核大小为 1 × 1 1 \times 1 1×1,步距为 1 1 1 h , w h, w h,w 不变, d i m × 4 dim \times 4 dim×4,后接一个 GELU
    • Layer Scale
      • 论文中并没有提到,其实它就是将输入的特征层乘上一个可训练的参数,该参数就是一个向量,元素个数与特征层 channel 相同,即对每个 channel 的数据进行缩放
    • Drop path

在这里插入图片描述


总结

本文提出的纯 CNN 的网络 ConvNeXt,在多种任务上取得了超越 Transformer 的效果,同时能够保留 ConvNet 的简洁高效性质

作者期望本文的结论能够推进对卷积及训练的重新思考

博客参考

猜你喜欢

转载自blog.csdn.net/HoraceYan/article/details/128772385
CV