rep论文阅读4:RepVGG:Making VGG-style ConvNets Great Again

RepVGG:让vgg风格的卷积网络再次伟大

paper:https://openaccess.thecvf.com/content/CVPR2021/papers/Ding_RepVGG_Making_VGG-Style_ConvNets_Great_Again_CVPR_2021_paper.pdf

code:https://github. com/megvii-model/RepVGG

摘要:利用结构重参数化“复兴”VGG式单路极简架构,一路3x3卷到底,在速度和性能上达到SOTA水平

        k x k --> k x k + 1 x 1 + identity

Abstract 

        提出了一种简单而强大的卷积神经网络结构,其推理阶段是仅由3x3卷积和RELU组成VGG风格的结构,训练阶段则具有多分支结构。这种训练-推理的解耦是利用一种叫做“重参数化(re-parameterization)”的技术实现的,因此,该网络被称为RepVGG。在ImageNet上能够达到超过80%的top-1准确率,这是plain网络第一次达到如此高的性能。在 NVIDIA 1080Ti GPU上,RepVGG比ResNet-50快83%,比ResNet-101快101%,同时具有更高的精度。相比当前的SOTA模型,如EfficientNet、ResNet,RepVGG可以实现精度-速度之间的平衡。

 1. Introduction

        VGG是一种简单的plain网络,没有复杂结构,只需要堆叠CNN层、RELU层即可达到较高的性能。后来的网络,如Inception、ResNet、DenseNet等设计的越来越复杂,虽然网络性能提高了,但缺点也很明显:

        (1)复杂的分支设计(如ResNet和Inception)使其难以应用和自定义,降低了推理的速度并且内存占用率较高
        (2)一些组件(如Xception和MobileNets中的depthwise卷积、ShuffleNets中的通道shuffle模块)增加了内存访问成本且缺乏适用的硬件
        此外,FLOPS并不能代表运行速度,尽管某些模型FLOPS很低,但其速度并不快(PS:特别是EfficientNets等使用了depthwise卷积的网络)。

        复杂分支的设计有利于训练过程,而其缺点又是对推理过程不利的。

        因此,作者提出了RepVGG,对训练-推理阶段的网络进行解耦,训练时多分支、推理时plain。其主要有以下优点:

  • 模型具有VGG风格的plain(又称前馈)网络结构,没有任何分支,也即:每一层只取其前一层的输出作为输入,而该层输出只作为下一层的输入;
  • 模型的主体只用3*3卷积和RELU;
  • 模型的具体架构(如深度、宽度等)并没有经过自动搜索、手动精调、复合缩放,也没有其他繁琐的设计。

        RepVGG和其他模型的比较:

rep论文阅读4:RepVGG:Making VGG-style ConvNets Great Again_第1张图片

总体来说,本文主要贡献有:

  • 提出了RepVGG,与当前SOTA模型相比,具有更好的速度-精度平衡;
  • 使用结构重参数化解耦了训练和推理过程,训练时为多分支结构、推理时为plain结构;
  • 证明了RepVGG在图像分类和分割方面的有效性,实现起来简单有效。  

  RepVGG网络结构如图2所示:

rep论文阅读4:RepVGG:Making VGG-style ConvNets Great Again_第2张图片

 2. Related Work

2.1. From Single-path to Multi-branch

从单分支到多分支

        卷积网络的设计经历了由简单到复杂的过程,从VGG的但路径开始,后续的GoogleNets、ResNets、DenseNet等网络越来越复杂,虽然网络性能也在提升,但计算复杂度也随之大幅提升,且不好实现、推理不友好

2.2. Effective Training of Single-path Models 

单分支模型的有效训练

        有很多工作致力于提升单分支模型的训练精度,但往往华而不实;本文的目的不是使一个非常深的网络收敛,而是建立一个简单的具有合理的深度模型,在达到较好的速度-精度平衡的基础上又可以简单地使用常见组件及线性代数来实现

2.3. Model Re-parameterization

模型重参数化

        DiracNet是一个重参数化模型,它通过编码卷积层中的卷积核来构建非常深的plain网络:

不过RepVGG中的结构重参数化与其不同:

        (1)结构重参数化是通过一个具体结构的实际数据流来实现的,这个具体结构可以在以后转换成另一个结构,而DiracNet仅仅使用另一个conv核的数学表达式来简化优化;

        (2)DiracNet模型性能低于同复杂度的ResNet,而RepVGG高于ResNet。

         Asym Conv Block (ACB)使用非对称卷积来加强常规卷积,是另一种形式的重参数化。但是ACB是被当作一个组件来设计的,用于替换卷积层。

2.4. Winograd Convolution 

Winograd卷积

        RepVGG只用了3*3卷积,因为该卷积是被cuDNN、MKL在GPU和CPU上高度优化过的,如表1:

rep论文阅读4:RepVGG:Making VGG-style ConvNets Great Again_第3张图片

        Winograd卷积是一种加速卷积计算效率的算法,可将3*3的乘法次数(MULs)减少为原来的4/9

3. Building RepVGG via Structural Re-param

3.1. Simple is Fast, Memory-economical, Flexible

        使用简单的ConvNet具有至少三点优势:

        快速:VGG虽然参数多于一些复杂网络,但是推理速度却更快,如VGG16的参数量为EfficientNetB3的8.4倍,但在1080Ti上推理速度反而快1.8倍。这说明,VGG的计算密度是后者的14倍。这主要是由访存率(memory access cose,MAC)和并行度决定的。

        内存高效:多分支结构的网络是内存低效的,因为每个分支在addition或者concatenation之前都需要保存在内存中,这就导致了较高的内存占用峰值;而plain网络是一层一层计算的,不会在内存保留太多临时变量。如图3所示:

        灵活:在多分支网络中,模型结构受到一定的约束,如ResNet的残差块要求两个分支具有相同的shape,否则shortcut就没意义了。更糟糕的是,多分支对通道剪枝也不友好;但plain网络允许我们根据需求自由配置每个卷积层。

rep论文阅读4:RepVGG:Making VGG-style ConvNets Great Again_第4张图片

 3.2. Training-time Multi-branch Architecture

        plain网络尽管有这么多优点,但是有个致命缺点:性能差。如VGG16在ImageNet上只能达到72%的top-1准确率。而多分支结构虽然对推理不友好,但是对训练友好。因此,作者受Resnet启发,设计了一个shortcut分支结构:y = x + g(x) + f(x),其中:g(x)代表1*1卷积,f(x)代表3*3卷积。在训练阶段,只需要简单堆叠上述结构;而在推理阶段,可以将y = x + g(x) + f(x)转换为y = h(x),从而在训练阶段利用了多分支的优势,而在推理阶段利用了plain网络的优势。

3.3. Re-param for Plain Inference-time Model

         这一节主要描述如何将一个训练时的多分支模块转换为单一的3*3卷积。转化过程示意如图4所示:

 rep论文阅读4:RepVGG:Making VGG-style ConvNets Great Again_第5张图片

        其过程简单解析一下:

  • 首先每个分支都有一个BN层,因此,需要将BN和卷积层融合(shortcut视为一个1*1卷积层),可以参照这篇博客;
  • 卷积和BN融合后,得到了一个3*3卷积和两个1*1卷积,需要将1*1卷积通过zero-padding的方式变成3*3卷积;
  • 最后将3个3*3卷积加起来,即可得到一个单一的3*3卷积。

 3.4. Architectural Specification

        RepVGG的网络规格如表2所示:

rep论文阅读4:RepVGG:Making VGG-style ConvNets Great Again_第6张图片 

        RepVGG是一种VGG风格的网络,使用plain结构,并大量使用了3*3卷积。但是没有向VGG那样使用max-pooling,因为作者希望RepVGG的主体中只有一种操作。为了实现下采样,在每个stage的第一个3*3卷积中将步长设为2。在分类任务中,网络的输出头是GAP+全连接;对于其他任务,指定的任务头也可以利用各个层的输出。

        对于每个stage的层数设计,基于以下三个准则:

        (1)第一个stage的输入是大分辨率,比较耗时,因此只用了一个卷积层来减少推理时间;
        (2)最后一个层由于通道比较多,为了减少参数量,也只设计了一个卷积层;
        (3)按照ResNet的设计,把更多层放在了倒数第二个stage;
        因此,网络层数的设计就跟表2中描述的一样:5个stage中的层数分别为1、2、4、14、1,这种设计称为RepVGG-A。此外,还设计更深的网络,如RepVGG-B是在第2,3,4stage多了一个卷积层。RepVGG-A对标ResNet-18/34/50等轻量级网络,RepVGG-B对标更高性能的网络。

        对于通道数,采用了VGG和ResNet所用的经典分配: [64,128,256,512]。并设置了两个乘数因子a,b分别控制前四个stage和最后一个stage的通道数,通常b>a,因为希望对于分类和其他下游任务来说,使最后一层具有更多的语义信息。而最后一个stage设置的因子大一些也无所谓,因为最后一个stage只有一个卷积层。最终,第2,3,4,5个stage的通道分配为 [64a,128a,256a,512b],而第1个stage的通道设置为min(64,64a),因为第1个stage中的feature map分辨率较高,这样设置可以防止进行大量卷积运算。

        不同规模的RepVGG如表3所示:

 rep论文阅读4:RepVGG:Making VGG-style ConvNets Great Again_第7张图片

 4. Experiments

 略

 5. Conclusion

        主要是提出了RepVGG网络,简单堆叠3*3卷积和RELU,使其在GPU和专业推理芯片上非常适合使用。并且利用重参数化技术对训练和推理阶段进行了解耦,训练阶段多分支,推理阶段单分支,并且能够在ImageNet上达到80%的top-1准确率,与最先进的复杂模型相比,具有良好的速度精度平衡。

 

 

 

 

你可能感兴趣的