ConvNeXt
注:以下笔记参考原论文以及这个博客做了简化。
Macro Design
- Changing stage ratio: 在ResNet中,一般conv4_x(stage3)堆叠的block数最大,ResNet50中,各个stage堆叠的block数大约为(3,4,6,3),比例为1:1:2:1。Swin Transformer中stage3的比例更高,故将ResNet的堆叠次数从(3,4,6,3)调整为(3,3,9,3),和Swin-T有相似的FLOPs,调整后,准确率由78.8%上升到79.4%
- Changing stem to "Patchify”:ResNet中的下采样是采用stride为2的7x7的卷积层以及stride为2的最大池化下采样共同组成。Transformer中一般都是通过一个stride等于kernel_size的卷积层实现下采样,看起来就像是把一个patch通过上述的卷积层下采样为1个像素,下采样倍数等于kernel_size。替换后准确率从79.4%提升到79.5%,并且FLOPs也降低了。
ResNeXt-ify
- ResNeXt中使用了组卷积使得其在FLOPs和accuracy上做到了比较好的平衡。这里ConvNeXt中直接使用了MobileNet中提出的depthwise-conv替换ResBkock中的3x3卷积。同时作者将通道数从64变成了96,最终准确率达到了80.5%。
Inverted Bottleneck
- 作者认为Transformer block中的MLP模块与MobileNetV2中的Inverted bottlenect结构类似,都是两头细中间粗的结构。ConvNeXt最终将结构从下图a修改为c,b为MobileNetV2使用的Inverted bottleneck。作者采用Inverted bottleneck后在较小的模型上准确率从80.5%提升到了80.6%,在较大模型上准确率从81.9%提升到82.6%,并且FLOPs由小幅度降低
Large kernel size
由于Transformer中一般都是做全局的self-attention,比如vision transformer,而且Swin Transformer中也有7x7的窗口大小。但是目前主流的神经网络都是采用3x3大小的窗口,因为之前VGG中提到堆叠多个3x3卷积层可以替代更大的卷积层,且3x3卷积层的优化比较高效。
- Moving up depthwise convolution: 将1x1conv→depthwise conv → 1x1conv变为depthwise conv→1x1conv→1x1conv,准确率下降到79.9%,同时FLOPs也减小了
- Increasing kernel size:修改depth wise的卷积核为7x7,同时作者尝试过其他尺寸的卷积核,包括3,5,7,9,11发现到7时准确率就达到了饱和。并且准确率从79.9%(3x3)增长到80.6%(7x7)
Macro Design
主要关注更细小的差异,比如激活函数以及Normalization等
- Relu→GRELU:将Relu激活函数换成GELU激活函数,准确率没有明显变化
- fewer activation:使用更少的激活函数,一般卷积网络中会在卷积层或者全连接层后面都接一个激活函数,但是Transformer中MLP只在第一个全连接层后跟了GELU激活函数。作者在ConvNeXt中也减少了激活函数,depthwise conv→1x1conv + GELU→1x1conv,准确率从80.6%上涨到81.3%
- Fewer normalization layers:作者在ConvNeXt中只在7x7的depthwise conv后面使用了Normalization,准确率上升了0.1%,到达81.4%
- Substitute BN with LN:使用layer norm替换batch norm,准确率上升了0.1%,到达81.5%
- Separate downsampling layers:原ResNet中stage2-stage4中的下采样是通过将主分支的3x3卷积步距设置为2,捷径分支上1x1的卷积层步距设置为2进行的。Swin Transformer中是通过一个单独的patch merging实现的,ConvNeXt中作者单独使用了一个下采样层,通过一个Layer norm加上一个卷积核大小为2,stride为2的卷积层组成,最终准确率提升到82.0%
|