ConvNeXt

163 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

arxiv.org/abs/2201.03…

A ConvNet for the 2020s

之前的论文都是基于Transformer的,这篇论文觉得不用Transformer,只用卷积也能达到很好的效果。

论文中认为Transformer架构之所以好,可能是随着技术不断发展,各种新的架构以及优化策略促使Transformer模型有更好的效果,那如果我们采用相同的策略训练卷积神经网络,是否也能达到更好的效果?抱着这个疑问,作者就以Swim-Transformer作为参考,进行了一系列实验。

C是每个stage输入特征层的channel,B是每个stage重复Block次数

网络亮点

论文“毫无亮点”,使用的都是现有的结构和方法,没有任何的创新,源码很精简,一百多行就能完成模型的搭建

  • Macro Design
  • ResNeXt
  • Inverted Bottleneck
  • Large Kernel size
  • Various layer-wise Micro Design

各个改进提升如下:

作者先是拿ResNet50利用训练ViT的方法训练的ResNet50,作为baseline,然后进行了一系列实验。

结构介绍

Layer Scale论文中没细讲,其实就是对每个通道数据进行缩放,缩放比例是可学习参数,维度和输入特征层channel一致

Macro DesignMacro Design

stage ratio

在ResNet50中,各阶段Block个数为3, 4, 6, 3,而Swim-T比例为1: 1: 3: 1,Swim-L比例为1: 1: 9: 1,所以作者将Block比例改为1: 1: 3: 1,即3, 3, 9, 3

patchify stem

在卷积中,最初的下采样称为stem,就是前面一个7×7,stride为2的卷积和一个最大池化,而在swim-transformer是直接使用一个卷积核大小为4,步距为4的卷积层,所以作者也换成了它。

ResNeXt

ResNeXt相比普通的ResNet在FLOPs和精度间做到了更好的平衡,ResNeXt的Block相比ResNet就是在中间的卷积使用了组卷积,作者采用了更激进的DW卷积,就是组数与输入特征图的通道相同。

这样做了后精度和GFLOPs都降低了一般。

之后作者增大了输入特征图的宽度,也就是channel,作者将每个stage通道改成和swim-transformer一样,例如第一个stage中ResNet50输入是64,swim-transformer是96,结果提升很多。

Inverted Bottleneck

这是MobileNet V2中提出的结构,与ResNet的相反,ResNet是两头粗中间细的瓶颈结构,这个是两头细中间粗的结构。

作者认为Transformer block中的MLP模块和这个模块很像,都是两天细中间粗。所以作者就换成了这个。

对于较小模型,准确率由80.5%提升到80.6%,对于较大模型,准确率由81.9%提升到82.6%。

Large Kernel size

首先将DW卷积上移。

原本是:1×1卷积->DW卷积->1×1卷积

现在是:DW卷积->1×1卷积->1×1卷积

准确率降低到了79.9%。

作者这么做是因为,他认为DW卷积和MSA类似,而在Transformer Block中,MSA是放在MLP前面的,所以也提到了前面。

然后作者增大了Kernel size,之前搭建卷积网络,习惯使用3×3卷积核,因为之前vgg说到可以堆叠多个3×3卷积层可以替换一个大卷积层,并且现在设备对3×3卷积层做了很多优化,所以效率是很高的,这里作者将3×3改成了7×7,这是通过多次试验得到的,这样刚好和swim-transformer窗口大小一致。

Various layer-wise Micro Design

将ReLU换成了GELU,替换后准确率没发生变化

采用更少的激活函数,之前在每个卷积或全连接层后都会跟一个激活函数,但在swim-transformer中只有在MLP第一个全连接层后接了个激活函数,所以作者只在Block中第一个1×1卷积后加了个激活函数,准确率由80.6%提升到81.3%。

使用更少的Normalization Layer,之前在每个卷积后都有个BN,但在swim-transformer中Layer Normalization的使用不多,所以尽在DW后加了LN,提升了0.1%。

替换BN为LN,提升0.1%。

使用单独的下采样,ResNet中stage2到stage4的第一个Block都有下采样功能,swim-transformer使用Patch Merging下采样,所以作者直接使用卷积核大小为2×2,步距为2的卷积层实现,精度由81.5%提升到82%