封面 《紅月ゆれる恋あかり》
前言
年初的时候看到别人推荐了 ConvNeXt 论文,看到了下面这张图,了解到了 ConvNeXt 比 Swin Transformer 效果好,因此读了一下这篇论文,写一下笔记。
ConvNeXt 的改进点
ConvNeXt 的总体改进如上所示,各个改进和其效果都可以看的比较明白
Macro Design
Changing stage compute ratio
在原先的 ResNet 中各个 stage 之间的比例是 (3:4:6:4),而在 swin transformer 中这个比例是 (1:1:3:1) 在 large 模型中这个比例是 (1:1:9:1),因此作者将 ResNet 各个阶段的比例设置为 (3:3:9:3),准确率从 78.8% 上升到了 79.4%。此外作者还表示这个比例还有优化空间
Changing stem to “Patchify”
什么是 stem?stem 简单来说就说第一个下采样,主要的功能是压缩输入,减少计算量
在原本的 ResNet 中,stem 层使用的是卷积核大小为 7×7,stride=2 的卷积核,其结果就是 4 倍的下采样。而在 vit 模型中,stem 层用的是更加激进的卷积,卷积大小是 14 或者 16,且移动没有重叠的。而在 swin 中 stem 使用的是相似的卷积,但是卷积大小是 4×4。因此 ConvNeXt 中使用的是卷积大小 4×4,stride=4 的卷积。这使得准确率从 79.4% 上升到 79.6%。
ResNeXt-ify
ResNeXt 在准确度和 FLOPs 之间有一个较好的权衡,ResNeXt 的 block 结构如下所示,其结合了 Inception 的思想。
与原本的 ResNeXt block 不同的是,在 ConvNeXt,ResNeXt 的卷积部分使用的 Group 数和 Channel 的数量相同。同时,作者还认为 depthwise 卷积的操作和 self-attention 类似。这使得准确率下降到了 78.3%, 但是 GFLOPs 从 4.4 下降到了 2.4。
此外还将网络的 channel 改到了和 swin 一样的 96,这使得准确率提高到了 80.5%,但是 GFLOPs 上升到了 5.3
Inverted Bottleneck
Transformer block 的 MLP 层与 MobileNetV2 的反转瓶颈层很像,因此 ConvNeXt 也设计了一个反转瓶颈层即中间粗两边细的结构。在 Transformer 中 MLP 的隐藏层的维度都是 4 倍于输入维度,因此反转瓶颈层的中间层也是四倍缩放。下图中 (a) 是 ResNet 的 block,而 (b) 是 ConvNeXt 建立的反转瓶颈层,© 是降空间 depthwise 的层上移。
使用反转瓶颈后,小模型中准确率从 80.5% 上升到 80.6%,大模型的准确率从 81.9% 上升到 82.6%,且 FLOPs 都减小。
Large Kernel Sizes
Moving up depthwise conv layer
因为在 transformer 模型上,MSA (Multi head self-attetion) 是在 MLP 前面的,因此在反转瓶颈的时候,将 depthwise 卷积放到前面,即 Inverted Bottleneck 中的 (b) 到 ©。此外中间的 1×1 的卷积在代码里面是使用全连接层来实现的,因为 1×1 卷积和全连接几乎等价。
这使得 FLOPs 下降到 4.1G,准确率到 79.1%
Increasing the kernel size
作者尝试增大卷积核的大小,可以看到卷积核加到 7×7 之后趋于饱和,因此选择在每个 block 中使用 7×7 的卷积核作为 depthwise 卷积。准确率上升到了 80.6%。
Micro Design
Replacing ReLU with GELU
大多数卷积网络使用的是 RELU 激活,而 transformer 大多使用 GELU 激活,因此使用 GELU 激活,这对准确率没有什么影响
Fewer activation functions
相较于 ResNet,transformer 拥有更少的激活函数。每一个 transformer block 中只有 1 个激活函数在 MLP 层之中,因此 ConvNeXt 也做类似,每个 block 在两个 1×1 之间加 GELU 激活。其结构如下图所示。这使得准确率从 80.6% 提升到了 81.3%。
Fewer normalization layers
transformer block 中也是拥有较少的 norm 层,因此作者只保留了 1×1 卷积前面的 BN 层,这使得准确率到了 81.4%,超过了 Swin-T。需要注意的是作者尝试把 BN 加在 Block 前面,但是效果没有什么提升。
Substituting BN with LN
在 Transformer 中经常使用 LN,因此作者使用 LN 替换原来的 BN,这使得准确率上升到了 81.5%。
Separate downsampling layers
在 ResNet 中空间下采样是在每个 block stage 的开头完成,通过使用 3×3 卷积 stride=2,shortcut 部分使用 1×1 卷积 stride=2 实现。而在 swin transformer 中在每个 stage 之间使用一个单独下采样层。因此作者使用 2×2,stride=2 的单独下采样层来实现。同时在下采样的卷积前使用 layernorm 可以帮助其收敛,而在 stem 层的 layernorm 加在卷积后面。这使得准确率提高到了 82.0%,超过了 Swin。
后记
以上就是一直拖着没更新的 ConvNeXt 了,这是一个纯卷积神经网络,实现起来比较容易,且效果要好于 Swin-T。是个不错的网络。
参考文献
Why does CNNs usually have a stem?
Aggregated Residual Transformations for Deep Neural Networks