随着 ViT
在计算机视觉领域大放异彩,越来越多的研究人员将工作重心放在 Transformer
上,在计算机视觉领域上 CNN
难道真的要被 Transformer
完全取代吗?
本文长篇分析并设计 CNN 架构的若干技巧,对照 Swin Transformer
的设计理念,渐进式“现代化”改造 ResNet
,取得了良好的效果,对深度网络的设计具有较大的参考价值
原论文链接:A ConvNet for the 2020s
分层变形器(如 Swin Transformers
)重新引入了几个 ConvNet 先验,使得 Transformer作为通用视觉骨干实际上是可行的,并在各种视觉任务中表现出显著的性能。然而,这种混合方法的有效性仍然主要归功于 Transformers
的内在优势,而不是 Convolutions
的内在归纳偏见
本文逐步将一个标准的 ResNet
“现代化”,并在这一过程中发现了几个促成性能差异的关键组件。ConvNeXt
完全由标准的 ConvNet
模块构成,在准确性和可扩展性方面与 Transformer
竞争,通过一系列实验比对,在相同的 FLOPs
下,ConvNeXt
相比 Swin Transformer
拥有更快的推理速度以及更高的准确率
背景:
ConvNets
成为视觉识别系统的基本构件ViT
没有引入图像特定的感应偏差,并且对原始的 NLP Transformers
做了最小的改动ViT
模型在作为通用视觉骨干时面临最大的挑战是 ViT
的全局注意力设计,它的复杂度与输入大小呈二次方ConvNets
更加相似我们可以发现,许多用于计算机视觉的变形器的进步都是为了让卷积回归,但这种尝试通常是有代价的
本文主要研究了 ConvNets
和 Transformers
之间的架构区别,并试图确定比较网络性能时的混杂变量。从一个标准的ResNet(例如ResNet50)开始,用改进的程序训练,并寻找到几个影响性能的关键组件,以实现与 Transformers
的竞争
阅读完 这篇文章,你会发现 ConvNeXt
“毫无亮点”,ConvNeXt
使用的全部都是现有的结构和方法,没有任何结构或者方法的创新。而且源码也非常的精简,100多行代码就能搭建完成
为什么现在基于 Transformer
架构的模型效果比卷积神经网络要好呢?本文认为可能是随着技术的不断发展,各种新的架构以及优化策略促使 Transformer
模型的效果更好,那么使用相同的策略去训练卷积神经网络也能达到相同的效果吗?
上图展现了每个方案对最终结果的影响(在 Imagenet 1K
的准确率)。很明显最后得到的 ConvNeXt
在相同 FLOPs
下准确率已经超过了 Swin Transformer
。接下来,针对每一个实验进行解析。
Vision Transformers
不仅带来了一套新的模块和架构设计决策,而且还为视觉引入了不同的训练技术(如 AdamW
优化器)。这主要涉及到优化策略和相关的超参数设置
本文首先利用训练 Vision Transformers
的策略去训练原始的 ResNet50
模型,在这种情况下是 ResNet50/200
,发现比原始效果要好很多,并将此结果作为后续实验的基准 baseline
本文使用了与 DeiT
和 Swin Transformer
相近的训练策略:
ResNets
AdamW
优化器Mixup
、Cutmix
、RandAugment
、Random Erasing
Stochastic Depth
和 Label Smoothing
就其本身而言,这个增强的训练配方将 ResNet-50
模型的性能从 76.1% 提高到 78.8% (+2.7%),这意味着传统 ConvNets
和视觉变形器之间的性能差异的很大一部分可能是由于训练技术造成的
在原 ResNet
网络中,一般 conv4_x
(即 stage3
)堆叠的 block 的次数是最多的。如下图中的 ResNet50
中 stage1
到 stage4
堆叠 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:1,Swin-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%
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 也降低了一点
本文试图采用 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 convolution
和 self-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,如下图所示:
作者参照 Swin Transformer,将每个 stage 的 channel 与 Swin Transformer 中的参数保持一致,可以发现准确率由 78.3 % 78.3\% 78.3% 提升到了 80.5 % 80.5\% 80.5%
作者认为 Transformer block 中的 MLP
模块非常像 MobileNetV2
中的 Inverted Bottleneck
模块,即两头细中间粗:
ReNet
中采用的 Bottleneck
模块MobileNetV2
采用的 Inverted Botleneck
模块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
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 大小的卷积核做了很多的优化,所以会更高效。接着作者做了如下两个改动:
depthwise conv
模块上移
1x1 conv -> depthwise conv -> 1x1 conv
depthwise conv -> 1x1 conv -> 1x1 conv
MSA
模块是放在 MLP
模块之前的,所以这里进行效仿,将 depthwise conv
上移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 时准确率就达到了饱和这里的大部分探索是在层级上完成的,重点是激活函数和归一化层的具体选择
在 Transformer 中激活函数基本用的都是 GELU
,而在卷积神经网络中最常用的是 ReLU
,于是作者又将激活函数替换成了 GELU
,替换后发现准确率没变化
在之前的神经网络学习过程中,我们习惯性地在每一个卷积层和全联接层之后加上一个激活函数,在这里,作者尝试使用更少的激活函数
如下图所示,在 Transformer
中并不是每个模块后都跟有激活函数,比如 MLP
中只有第一个全连接层后跟了 GELU
激活函数,其他模块后面都没有使用激活函数。接着作者在 ConvNeXt Block
中也减少激活函数的使用,减少后发现准确率从 80.6 % 80.6\% 80.6% 增长到 81.3 % 81.3\% 81.3%
同样在 Transformer 中,Normalization
使用的也比较少,接着作者也减少了 ConvNeXt Block
中的 Normalization
层,只保留了 depthwise conv
后的 Normalization
层
此时准确率已经达到了 81.4 % 81.4\% 81.4%,已经超过了 Swin-T
Batch Normalization (BN)
在卷积神经网络中是非常常用的操作了,它可以加速网络的收敛并减少过拟合
但在 Transformer 中基本都使用 Layer Normalization (LN)
,因为最开始 Transformer 是应用在 NLP 领域的,BN
不适用于 NLP 相关任务
接着作者将 BN
全部替换成了 LN
,发现准确率还有小幅提升达到了 81.5 % 81.5\% 81.5%
在 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%
对于 ConvNeXt
网络,作者提出了 T/S/B/L
四个版本,计算复杂度刚好和 Swin Transformer
中的 T/S/B/L
相似
这五个版本的配置如下:
其中 C C C 代表 4 4 4 个 stage
中输入的通道数, B B B 代表每个 stage
重复堆叠 block
的次数
ConvNeXt - T 模型结构图如下所示
stage1
- stage4
GELU
本文提出的纯 CNN
的网络 ConvNeXt
,在多种任务上取得了超越 Transformer 的效果,同时能够保留 ConvNet
的简洁高效性质
作者期望本文的结论能够推进对卷积及训练的重新思考
博客参考