本文已参与「新人创作礼」活动,一起开启掘金创作之路。
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%