论文笔记:ConvNeXt :A ConvNet for the 2020s

论文笔记:ConvNeXt :A ConvNet for the 2020s_第1张图片

一、训练技巧

第一部分模仿的是swin transformer的训练技巧方面,主要是对res50这个backbone的训练技巧。首先是把90个epoch训练res50 变成300epoch进行训练。其次是一些训练技巧:使用到了AdamW优化器,数据增强技巧(augment)如Mixup、Cutmix、RandAugment、RandomErasing,以及包括Stochastic Depth和Label Smoothing的规范化方案。

二、宏观设计macro design

一、在ConvNext中在控制block的数量比方面从res50的(3,4,6,3)调整为(3,3,9,3)。因为体积较小的swin transformer使用的是1:1:3:1的block比例。同时这样可以让FLOPs计算复杂度和swin transformer-T保持一致。(下图是res50的block结构图)

论文笔记:ConvNeXt :A ConvNet for the 2020s_第2张图片

二、模仿swin transformer对一开始输入图像的降采样的方式。补丁图一个大核的卷积和无重叠的卷积。在此基础上convnext采用了我们将在网络中使用 "patchify stem"(4×4非重叠卷积),也就是相当于resnet中的stem阶段。非常类似于打成patch的操作。

三、ResNeXt-ify

用多通道的DW卷积来代替self-attention模块。因为self-attention模块和DW卷积相似,都是在空间上做,但是在通道上没有交集。Self-attention是采用了多头的注意力机制来解决了这个问题。深度卷积和1×1卷积的结合导致了空间和通道混合的分离。而DW卷积是采用ResNext中增加通道数量的方法来补偿通道之间没有融合的损失。(64变成96就和swin中的通道数相同)

四、inverted bottleneck

此处补充bottleneck的作用:bottleneck。使用bottleneck(即1 ∗ 1的卷积核)来进行特征降维,减少特征图的层数,从而减少计算量。这个bottleneck结构在深层的卷积块操作中是经常用到的。

所谓的倒瓶颈结构就是隐藏层是输入的4倍宽的结构。这是一个block的结构。我们可以看到(a图)是resnet中的bottleneck的结构(两头大中间小,沙漏型)。而为了ConvNext的卷积块(c图)和transformerblock中的MLP block即前馈神经网络的操作相匹配,即是一个倒置的瓶颈结构(inverted bottleneck),两头小中间宽。

论文笔记:ConvNeXt :A ConvNet for the 2020s_第3张图片
论文笔记:ConvNeXt :A ConvNet for the 2020s_第4张图片
论文笔记:ConvNeXt :A ConvNet for the 2020s_第5张图片
论文笔记:ConvNeXt :A ConvNet for the 2020s_第6张图片

五、大核卷积

1.为什么要上移深度卷积的位置?

在过去卷积都是使用大核卷积,但是自从VGG之后开始流行使用3*3的卷积,因为3*3的卷积在GPU硬件的优化上比较好。但是在SW中,移动窗口的操作,他的窗口大小是7*7,是属于大核卷积,因此,Convnext也使用大核卷积。

那么卷积必须在什么条件下使用大核卷积呢?必须在DW卷积模块上移的情况下。

因为作者想要探索大核卷积的性能到底能不能对标transformerblock中的多头注意力机制。所以为了和transformerblock中先进行了多头注意力机制才通过MLP层(也就是前馈神经网络)的形式相匹配,上移DW卷积模块,采用了和transformer相同的inverted bottleneck的结构设计。但是这样的上移有会带来精度的下降,因为正常的inverted bottleneck是在如下图(b)的情况下进行卷积的,是在通道较大的地方做普通的卷积。但是由于上移了,卷积通道数量下降,进而效果也变差了。

论文笔记:ConvNeXt :A ConvNet for the 2020s_第7张图片
论文笔记:ConvNeXt :A ConvNet for the 2020s_第8张图片

2.为什么要增大卷积核大小?

虽然卷积通道下降了,仍然可以通过加大卷积核来弥补。这也是加大卷积核的意义。

实验结果表明在7*7的卷积核之后的卷积核效果就没有很大的提升了,包括是较大的部分。

六、微观设计

    • 激活函数用Gelu代替Relu

用Gelu代替Relu。许多激活函数被开发出来,但整流线性单元(ReLU)由于其简单和高效,仍然被广泛用于ConvNets。高斯误差线性单元,即GELU,可以被认为是ReLU的平滑变体,在最先进的Transformer中被利用,包括谷歌的BERT和OpenAI的GPT-2,以及最近的ViTs。我们发现,在ConvNet中,ReLU也可以用GELU代替,尽管准确率保持不变。

    • 减少激活函数的数量。

减少激活函数的数量。可以看到在transformer块中的Gelu是很少的,只有在后面的两个MLP之间才使用Gelu。因此Convnext也模仿了这一点,采用减少Gelu的方式,只在Convnext块的1*1的卷积之间才使用了一个Gelu。

论文笔记:ConvNeXt :A ConvNet for the 2020s_第9张图片

3.减少normalization层。

首先作者团队点出,BN的作用就是让参数归一化,是模型能更加快速收敛并且减少过拟合。但是BN更加复杂,而且对模型有副作用。由于各种对BN的优化存在,BN仍然是计算机视觉任务中主要的归一化手段。但是transformer中使用的是更加简单的LN。

作者团队在实验中:在原ResNet中直接用LN代替BN会导致次优的性能。随着网络结构和训练技术的所有修改,ConvNet模型在使用LN训练时没有任何困难;事实上,性能略好,获得了81.5%的准确性。

4.在stage在stage之间插入downsampling模块。

这是在模仿swintrans former中的patch_merging的内容,那么sw中的patch_merging是为了模仿conv中的下采样过程。因此这里的方法叫做分离的下采样层(即专门用于下采样)

论文笔记:ConvNeXt :A ConvNet for the 2020s_第10张图片

你可能感兴趣的:(论文阅读笔记,论文阅读,深度学习,人工智能)