论文地址:https://arxiv.org/pdf/2203.06717.pdf
代码地址:https://github.com/MegEngine/RepLKNet
目录
论文地址:https://arxiv.org/pdf/2203.06717.pdf
代码地址:https://github.com/MegEngine/RepLKNet
Abstract
1. Introduction
2. Guidelines of Applying Large Convolutions
Guideline 1: large depth-wise convolutions can be efficient in practice
Remark 1.
Guideline 2: identity shortcut is vital especially for networks with very large kernels
Remark 2.
Guideline 3: re-parameterizing with small kernels helps to make up the optimization issue.
Remark 3.
Guideline 4: large convolutions boost downstream tasks much more than ImageNet classification
Remark 4.
Guideline 5: large kernel (e.g., 13×13) is useful even on small feature maps (e.g., 7×7).
Remark 5.
3. RepLKNet: a Large-Kernel Architecture
4. Conclusion
作者回顾了现代卷积神经网络(CNNs)中的大型核设计。受ViTs最新进展的启发,在本文中,作者证明了使用几个大的卷积核而不是一堆小的核可能是一个更强大的范式。作者提出了五个指导原则,例如,应用重新参数化的大的深度卷积来设计高效、高性能的大内核cnn。根据指导方针,作者提出了一个纯CNN体系结构RepLKNet,其内核大小与常用的3×3相比大到31×31。RepLKNet在很大程度上缩小了cnn和vit之间的性能差距,例如,与ImageNet上的Swin Transformer和一些典型的下游任务相比,RepLKNet在延迟较低的情况下实现了相当或更好的结果。RepLKNet在大数据和大模型上也表现出良好的可扩展性,在ImageNet上获得87.8%的top 1精度,在ADE20K上获得56.0%的mIoU,在具有类似模型尺寸的先进技术中非常具有竞争力。作者的研究进一步表明,与小核cnn相比,大核cnn具有更大的有效感受野和更高的形状偏差而不是纹理偏差。
作者系统地探讨了cnn的大型内核设计。作者遵循一个非常简单的“哲学”:只是将大的深度卷积引入到传统网络中,其规模从3×3到31×31,尽管存在通过单一或入大几层引型接收域的其他替代方案,例如:特征金字塔,膨胀卷积和可变形卷积。通过一系列的实验,作者总结了有效使用大卷积的5条经验准则:1)在实践中,非常大的核仍然可以是有效的;2)大核卷积+残差结构提升性能;3)用小核重新参数化有助于弥补优化问题;4)大卷积对下游任务的促进作用;5)大内核即使在小的特征映射上也很有用。
基于上述准则,作者提出了一种名为RepLKNet的新体系结构,这是一种纯CNN,其中使用重参数化的大卷积来构建大的接受域。网络总体上遵循Swin Transformer的宏观架构,并进行了一些修改,同时用大的深度卷积替换了多头自注意。作者主要对中型和大型模型进行基准测试,因为过去人们认为VIT在大数据和模型方面优于CNN。
人们认为,大核卷积在计算上是昂贵的,因为核的大小会二次增加参数和FLOPs。通过应用深度卷积(DW)可以极大地克服这一缺陷。例如,在作者提出的RepLKNet中,将不同阶段的内核大小从[3,3,3,3]增加到[31,29,27,13],只会分别增加18.6%和10.4%的flop和参数数量,这是可以接受的。剩下的1×1卷积实际上占据了大部分的复杂性。
FLOPs:注意s小写,是floating point operations的缩写(s表复数),意指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。
具体了解可见:CNN 模型所需的计算力flops是什么?怎么计算? - 知乎
作者发现现成的深度学习工具(如Pytorch)对大型DW卷积的支持很差,如表1所示。因此,作者尝试了几种方法来优化CUDA内核。在实践中,作者发现块(逆)隐式gemm算法是一个更好的选择。该实现已经集成到开源框架MegEngine[1]中,作者还为PyTorch发布了一个高效的实现[2]。
[1]Megengine:a fast, scalable and easy-to-use deep learning framework. https://github.com/MegEngine/MegEngine, 2020.
[2] Official pytorch implementation of replknet. https://github . com / DingXiaoH / RepLKNet - pytorch,2022.
上表表明作者的实现比Pytorch基线要高效得多。通过作者的优化,在RepLKNet中DW卷积的延迟贡献从49.5%降低到12.3%,这与FLOPs占用大致成比例。
identity shortcut会干什么:原封不动把x传出去,输入输出一模一样
深入了解identity shortcut可见:CV脱坑指南(一): ResNet重难点理解_马佳的男人的博客-CSDN博客_resnet不足
作者使用MobileNet V2进行基准测试,因为它大量使用DW层,并且有两个已发布的变体(带有或不带有shortcuts)。对于大内核版本,只需用13×13替换所有DW 3×3层。所有模型都在ImageNet上训练,训练配置相同,持续100个课时。表2显示,使用shortcuts的大内核使MobileNet V2的准确性提高了0.77%。但是,如果没有shortcuts,大的内核会将准确率降低到53.98%。
该指南也适用于ViT。最近的一项研究发现,如果没有shortcuts,注意力的排名会随着深度的增加而成倍下降,从而导致过度平滑的问题。虽然大内核CNN可能以不同于ViT的机制退化,但作者也观察到,如果没有shortcuts,网络很难捕获本地细节。shortcuts使模型成为由许多具有不同接受场(RF)的模型组成的隐式集成,因此它可以从更大的最大RF中获益,同时又不会失去捕获小范围模式的能力。
作者将MobileNet V2的3×3层分别替换为9×9和13×13,并可选地采用结构重新参数化方法。具体来说,作者构建了一个与大层并行的3×3层,然后在Batch normalization (BN)层后将它们的输出相加(图2)。训练后,作者将小核和BN参数合并到大核中,因此得到的模型等价于训练模型,但不再有小核。表3显示,直接将内核大小从9增加到13会降低精度,而重新参数化可以解决这个问题。
众所周知,ViT存在优化问题,尤其是在小型数据集上。一个常见的解决方法是引入卷积先验,例如,为每个自我注意块添加一个DW 3×3卷积,这与作者的方法类似。这些策略在网络之前引入了额外的平移等方差和局部性,使其更容易在小数据集上进行优化而不损失一般性。与ViT的行为类似,当预训练数据集增加到7300万张图像时,可以省略重新参数化而不降级。
表3(重新参数化后)显示,将MobileNet V2的内核大小从3×3增加到9×9, ImageNet的准确性提高了1.33%,而Cityscapes mIoU提高了3.99%。表5显示了类似的趋势:当内核尺寸从[3,3,3,3]增加到[31,29,27,13]时,ImageNet的精度仅提高了0.96%,而在ADE20K上的mIoU提高了3.12%。这种现象说明,ImageNet评分相似的模型在下游任务中可能具有非常不同的能力(如表5中最下面的3个模型)。
是什么导致了这种现象?首先,大内核设计显著提高了有效接受场(Effective receiving Fields, ERFs)。大量研究表明,“上下文”信息(隐含着较大的ERF)在许多下游任务(如对象检测和语义分割)中至关重要。其次,作者认为另一个原因可能是大型内核设计对网络造成了更多的形状偏差。简单地说,ImageNet图片可以根据纹理或形状进行正确分类。然而,人类识别物体主要是基于形状线索,而不是纹理,因此具有更强形状偏差的模型可能更好地转移到下游任务。最近的一项研究指出vit具有很强的形状偏差,这部分解释了为什么vit在转移任务中超级强大。相比之下,在ImageNet上训练的传统CNN往往偏向于纹理。作者发现,增大cnn的核尺寸可以有效地改善形状偏差。
为了验证它,作者将MobileNet V2最后阶段的DW卷积放大到7×7或13×13,因此内核大小与特性映射大小(默认情况下为7×7)相同甚至更大。我们将重新参数化应用于准则3所建议的大型核。表4显示,尽管最后一个阶段的卷积已经涉及到非常大的接受域,但进一步增加内核大小仍然会导致性能改进,特别是在诸如Cityscape这样的下游任务上。
当核尺寸变大时,注意CNN的平动等值方差并不严格成立。如图3所示,相邻空间位置的两个输出仅共享部分核权,即通过不同的映射进行转换。该特性也符合ViTs的“哲学”——在获得更多容量之前放松对称。有趣的是,作者发现在变压器领域广泛使用的二维相对位置嵌入(2D Relative Position Embedding, RPE)也可以被视为一个大小为(2H−1)×(2W−1)的大深度核,其中H和W分别为特征图高度和宽度。大的核不仅有助于学习概念之间的相对位置,而且由于填充效应,可以编码绝对位置信息。
RepLKNet的架构如上图所示。
Stem 指的是起始层。由于目标是下游密集预测任务的高性能,在开始时通过几个转换层捕获更多细节。在第一个带有2×下采样的3×3层之后,安排一个DW 3×3层捕获底层模式,一个1×1 conv层,另一个DW 3×3层进行下采样。
Stages 1-4每个都包含几个RepLK块,它们使用shortcuts(指南2)和DW大内核(指南1)。在DW conv前后使用1×1 conv作为一种常见的实践。注意,每个DW大转换使用5×5内核进行重新参数化(指南3),这在图4中没有显示。除了提供了足够的接受域和聚合空间信息能力的大转换层外,模型的表征能力也与深度密切相关。为了提供更多的非线性和跨通道的信息通信,我们希望使用1×1层来增加深度。受ViT和MLP中广泛使用的前馈网络(FFN)的启发,作者使用了类似的由shortcut、BN、两个1×1层和GELU组成的cnn风格的块,因此称为ConvFFN块。与经典FFN在全连接层之前使用层归一化相比,BN的优点是可以融合到conv中进行高效推理。通常的做法是,ConvFFN Block的内部通道数是4×作为输入。简单地遵循ViT和Swin,它们交错了注意力和FFN块,作者在每个RepLK块后面放置一个ConvFFN。
Transition Blocks放置在stages之间,首先通过1×1 conv增加通道维度并使用DW 3×3 conv进行2×下采样。
本文重新讨论了在设计CNN体系结构时长期被忽略的大型卷积核。
作者证明了使用几个大内核而不是许多小内核可以更有效地产生更大的有效接受域,大大提高了CNN的性能,特别是在下游任务上,并在数据和模型扩展时大大缩小了CNN和ViT之间的性能差距。作者希望他们的工作能够促进CNN和ViT的研究。一方面,对于CNN,作者的研究结果表明我们应该特别关注ERFs,这可能是高性能的关键。
另一方面,对于ViT来说,由于大卷积可以替代具有相似行为的多头自注意,这可能有助于理解自注意的内在机制。