论文地址:https://arxiv.org/pdf/2101.03697.pdf。
GitHub地址:https://github.com/megvii-model/RepVGG。
目录
0、摘要
1、引言
2、相关技术
3、利用结构重参数化构造RepVGG
3.1、 简单就是快速、内存高效、灵活
3.2、训练阶段的多分支结构
3.3、推理阶段的重参数化
3.4、网络规格
4、实验结果
5、总结
提出了一种简单而强大的卷积神经网络结构,其推理阶段是仅由3*3卷积和RELU组成VGG风格的结构,训练阶段则具有多分支结构。这种训练-推理的解耦是利用一种叫做“重参数化(re-parameterization)”的技术实现的,因此,该网络被称为RepVGG。在ImageNet上能够达到超过80%的top-1准确率,这是plain网络第一次达到如此高的性能。在 NVIDIA 1080Ti GPU上,RepVGG比ResNet-50快83%,比ResNet-101快101%,同时具有更高的精度。相比当前的SOTA模型,如EfficientNet、ResNet,RepVGG可以实现精度-速度之间的平衡。
VGG是一种简单的plain网络,没有复杂结构,只需要堆叠CNN层、RELU层即可达到较高的性能。后来的网络,如Inception、ResNet、DenseNet等设计的越来越复杂,虽然网络性能提高了,但缺点也很明显:
此外,FLOPS并不能代表运行速度,尽管某些模型FLOPS很低,但其速度并不快(PS:特别是EfficientNets等使用了depthwise卷积的网络)。
复杂分支的设计有利于训练过程,而其缺点又是对推理过程不利的。
因此,作者提出了RepVGG,对训练-推理阶段的网络进行解耦,训练时多分支、推理时plain。其主要有以下优点:
RepVGG和其他模型的比较:
总体来说,本文主要贡献有:
RepVGG网络结构如图2所示:
从单分支到多分支:
卷积网络的设计经历了由简单到复杂的过程,从VGG的但路径开始,后续的GoogleNets、ResNets、DenseNet等网络越来越复杂,虽然网络性能也在提升,但计算复杂度也随之大幅提升,且不好实现、推理不友好。
单分支模型的有效训练:
有很多工作致力于提升单分支模型的训练精度,但往往华而不实;本文的目的不是使一个非常深的网络收敛,而是建立一个简单的具有合理的深度模型,在达到较好的速度-精度平衡的基础上又可以简单地使用常见组件及线性代数来实现。
模型重参数化:
DiracNet是一个重参数化模型,它通过编码卷积层中的卷积核来构建非常深的plain网络:。不过RepVGG中的结构重参数化与其不同:
(1)结构重参数化是通过一个具体结构的实际数据流来实现的,这个具体结构可以在以后转换成另一个结构,而DiracNet仅仅使用另一个conv核的数学表达式来简化优化;
(2)DiracNet模型性能低于同复杂度的ResNet,而RepVGG高于ResNet。
Asym Conv Block (ACB)使用非对称卷积来加强常规卷积,是另一种形式的重参数化。但是ACB是被当作一个组件来设计的,用于替换卷积层。
Winograd卷积:
RepVGG只用了3*3卷积,因为该卷积是被cuDNN、MKL在GPU和CPU上高度优化过的,如表1:
Winograd卷积是一种加速卷积计算效率的算法,可将3*3的乘法次数(MULs)减少为原来的4/9。
使用简单的ConvNet具有至少三点优势:
快速:VGG虽然参数多于一些复杂网络,但是推理速度却更快,如VGG16的参数量为EfficientNetB3的8.4倍,但在1080Ti上推理速度反而快1.8倍。这说明,VGG的计算密度是后者的14倍。这主要是由访存率(memory access cose,MAC)和并行度决定的。
内存高效:多分支结构的网络是内存低效的,因为每个分支在addition或者concatenation之前都需要保存在内存中,这就导致了较高的内存占用峰值;而plain网络是一层一层计算的,不会在内存保留太多临时变量。如图3所示:
灵活:在多分支网络中,模型结构受到一定的约束,如ResNet的残差块要求两个分支具有相同的shape,否则shortcut就没意义了。更糟糕的是,多分支对通道剪枝也不友好;但plain网络允许我们根据需求自由配置每个卷积层。
plain网络尽管有这么多优点,但是有个致命缺点:性能差。如VGG16在ImageNet上只能达到72%的top-1准确率。而多分支结构虽然对推理不友好,但是对训练友好。因此,作者受Resnet启发,设计了一个shortcut分支结构:,其中:代表1*1卷积,代表3*3卷积。在训练阶段,只需要简单堆叠上述结构;而在推理阶段,可以将转换为,从而在训练阶段利用了多分支的优势,而在推理阶段利用了plain网络的优势。
这一节主要描述如何将一个训练时的多分支模块转换为单一的3*3卷积。转化过程示意如图4所示:
其过程简单解析一下:
RepVGG的网络规格如表2所示:
RepVGG是一种VGG风格的网络,使用plain结构,并大量使用了3*3卷积。但是没有向VGG那样使用max-pooling,因为作者希望RepVGG的主体中只有一种操作。为了实现下采样,在每个stage的第一个3*3卷积中将步长设为2。在分类任务中,网络的输出头是GAP+全连接;对于其他任务,指定的任务头也可以利用各个层的输出。
对于每个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所示:
此外,为了进一步降低参数量和计算量,可以选择使用3*3的分组卷积与原来的3*3卷积交替配置。具体的,在RepVGG-A的3-5-7-...-21卷积层采用了组卷积;此外,在RepVGG-B的23-25-27卷积层同样采用了组卷积。
主要是提出了RepVGG网络,简单堆叠3*3卷积和RELU,使其在GPU和专业推理芯片上非常适合使用。并且利用重参数化技术对训练和推理阶段进行了解耦,训练阶段多分支,推理阶段单分支,并且能够在ImageNet上达到80%的top-1准确率,与最先进的复杂模型相比,具有良好的速度精度平衡。