RepVGG(CVPR 2021)

RepVGG: Making VGG-style ConvNets Great Again

Abstract

我们提出了一种简单而强大的卷积神经网络架构,它具有一个类似于vgg的推理时间体,由3 × 3卷积和ReLU的堆栈组成,而训练时间模型具有多分支拓扑结构。这种训练时间和推理时间架构的解耦是通过结构重新参数化技术实现的,因此该模型被命名为RepVGG。在ImageNet上,RepVGG达到了80%以上的top-1精度,据我们所知,这是一个普通模型的第一次。在NVIDIA 1080Ti GPU上,RepVGG模型的运行速度比ResNet-50快83%,比ResNet-101快101%,精度更高,与最先进的模型(如EfficientNet和RegNet)相比,显示出良好的精度-速度权衡。代码和训练过的模型可以在https://github.com/megvii-model/RepVGG上找到。

1. Introduction

经典的卷积神经网络(ConvNet) VGG[31]在图像识别方面取得了巨大的成功,其简单的架构由conv、ReLU和池化组成。随着Inception [33,34,32,19], ResNet[12]和DenseNet[17],许多研究兴趣转移到精心设计的架构上,使得模型越来越复杂。一些最近的架构是基于自动[44,29,23]或手动[28]架构搜索,或搜索复合扩展策略[35]。

虽然许多复杂的卷积网络比简单的卷积网络具有更高的精度,但缺点是显著的。1)复杂的多分支设计(如ResNet中的残差和Inception中的分支拼接)使模型难以实现和定制,降低了推理速度和内存利用率。2)一些组件(如Xception[3]和MobileNets[16,30]中的深度卷积和ShuffleNets[24,41]中的channel shuffle)增加了内存访问成本,缺乏各种设备的支持。由于影响推理速度的因素太多,浮点运算(FLOPs)的数量并不能准确反映实际速度。虽然一些新模型的FLOPs比VGG和ResNet-18/34/50[12]等老式模型低,但它们可能不会运行得更快(表4)。因此,VGG和ResNets的原始版本仍然在学术界和工业界的实际应用中大量使用。

在本文中,我们提出了RepVGG,一种vgg风格的体系结构,它优于许多复杂的模型(图1)。RepVGG有以下优点。
•该模型具有类似于vgg的平面(也称为前馈)拓扑,没有任何分支,这意味着每一层都将其唯一上一层的输出作为输入,并将输出馈送到唯一下一层。
•模型的主体只使用3 × 3的conv和ReLU。
•具体的架构(包括具体的深度和层宽)实例化,没有自动搜索[44],手动细化[28],复合缩放[35],也没有其他繁重的设计。

图1:ImageNet的Top-1精度与实际速度。左图:轻量级和中量级的RepVGG和120 epoch训练的基线。右图:经过200个时代训练的重量级模特。在相同的1080Ti上测试速度,批次大小为128,全精度(fp32),单次裁剪,并以实例/秒为单位进行测量。EfficientNet-B3[35]的输入分辨率为300,其他的为224。
对于普通模型来说,要达到与多分支体系结构相当的性能水平是很有挑战性的。一种解释是,多分支拓扑,例如ResNet,使模型成为众多浅模型[36]的隐式集成,这样训练多分支模型就避免了梯度消失的问题。
由于多分支体系结构的优点都是用于训练,缺点是不需要用于推断,我们建议通过结构重新参数化来解耦训练时的多分支和推断时的普通体系结构,这意味着通过转换其参数将体系结构从一个转换到另一个。具体来说,网络结构与一组参数耦合,例如,卷积层用四阶内核张量表示。如果某一结构的参数可以转换成另一结构耦合的另一组参数,我们可以等价地用后者替换前者,从而改变整个网络的架构。

具体来说,我们使用恒等映射和1×1分支构造训练时RepVGG,这是受ResNet的启发,但以不同的方式,可以通过结构重新参数化删除分支(图2,4)。训练完成后,我们用简单的代数进行变换,因为一个单位分支可以看作一个退化的1×1 conv,后者可以进一步看作一个退化的3 × 3 conv,这样我们就可以用原来的3 × 3核、同等映射和1×1分支以及batch normalization (BN)[19]层的训练参数构造一个3 × 3核。因此,转换后的模型具有一个3 × 3 conv层的堆栈,它被保存下来用于测试和部署。


值得注意的是,推理时间RepVGG的主体只有一种单一类型的操作符:3 × 3 conv后面跟着ReLU,这使得RepVGG在gpu等通用计算设备上速度很快。更好的是,RepVGG允许专用硬件实现更高的速度,因为考虑到芯片尺寸和功耗,我们需要的运算符类型越少,我们可以集成到芯片上的计算单元就越多。因此,专门用于RepVGG的推理芯片可以拥有大量的3×3-ReLU单元和更少的内存单元(因为普通拓扑结构是内存经济的,如图3所示)。我们的贡献总结如下。
•我们提出了RepVGG,这是一种简单的架构,与最先进的技术相比,具有良好的速度-精度权衡。
•我们建议使用结构重新参数化来将训练时间多分支拓扑与推理时间平原架构解耦。
•我们展示了RepVGG在图像分类和语义分割中的有效性,以及实现的效率和易用性。

图3:残差模型和普通模型的峰值内存占用。如果残差块保持特征图的大小,则特征图占用额外内存的峰值为2倍作为输入。与被忽略的特征相比,参数占用的内存很小。

3.2. Training-time Multi-branch Architecture

普通convnet有很多优点,但有一个致命的弱点:性能差。例如,使用像BN[19]这样的流行组件,VGG-16可以在ImageNet上达到超过72%的top-1精度,这似乎已经过时了。我们的结构重新参数化方法受到ResNet的启发,ResNet显式地构造了一个快捷分支来将信息流建模为y = x + f (x),并使用一个剩余块来学习f。当x和f (x)的维度不匹配时,它就变成y = g(x)+f (x),其中g(x)是由1×1 conv实现的卷积快捷方式。ResNets成功的一个解释是,这样的多分支架构使模型成为众多浅模型[36]的隐式集成。具体来说,使用n个blocks,模型可以被解释为2n个模型的集成,因为每个块都将流划分为两个路径。由于多分支拓扑结构在推理方面存在缺陷,但分支似乎有利于训练[36],因此我们使用多个分支来对众多模型进行仅训练时间的集成。为了使大多数成员更浅或更简单,我们使用类似resnet的标识(仅当维度匹配时)和1 × 1分支,以便构建块的训练时间信息流为y =x + g(x) + f (x)。我们简单地堆叠几个这样的块来构造训练时间模型。从与[36]相同的角度来看,模型变成了包含3的n次方个成员和n个这样的块的集成。

3.3. Re-param for Plain Inference-time Model

在本小节中,我们将描述如何将训练好的块转换为单个3 × 3 conv层进行推理。注意,我们在加法之前的每个分支中使用BN(图4)。形式上,我们使用W(3)∈R^(C2 ×C1 ×3×3)^表示3×3 conv层的核,其中C1输入通道和C2输出通道,对于1 × 1分支的核,W(1)∈R^C2 ×C1。我们使用μ(3)^, σ(3), γ(3), β(3)作为3 × 3 conv后BN层的累积平均值、标准差和学习的标度因子和偏差,μ(1), σ(1), γ(1), β(1)用于1 × 1 conv后BN, μ(0), σ(0), γ(0), β(0)作为单位分支。设M(1)∈R^N ×C1 ×H1 ×W1,M(2)∈RN ×C2 ×H2 ×W2^分别为输入和输出,且∗为卷积算子。如果C1 = C2, H1 =H2, W1 = W2,我们有


这个变换也适用于同等映射分支,因为单位可以被看作是以单位矩阵为核的1 × 1卷积。经过这样的变换,我们将得到一个3 × 3核,两个1 × 1核和三个偏置向量。然后将三个偏差向量相加得到最终的偏差,将1×1核相加到3×3核的中心点上得到最终的3×3核,这可以通过先将两个1×1核零填充为3×3并将三个核相加来实现,如图4所示。注意,这种转换的等价性要求3 × 3层和1 × 1层具有相同的步幅,并且后者的填充配置要比前者少一个像素。例如,对于3×3层,填充输入一个像素,这是最常见的情况,1 × 1层应该有填充= 0。

3.4. Architectural Specification

RepVGG的规格如表2所示,包括深度和宽度。RepVGG是VGG风格的,因为它采用了普通的拓扑结构,并大量使用3 × 3 conv,但它不像VGG那样使用最大池化,因为我们希望主体只有一种类型的操作符。我们将3×3层分成5个阶段,并对阶段的第一层进行下采样,stride = 2。对于图像分类,我们使用全局平均池化,然后是一个全连接层作为头部。对于其他任务,特定于任务的头可以用于任何层生成的特性。

我们根据三个简单的原则来决定每个阶段的层数。1)第一阶段分辨率大,耗时长,所以我们只使用一层以降低延迟。2)最后一个阶段需要有更多的通道,所以我们只用一层来保存参数。3)我们将最多的层放入最后第二个阶段(在ImageNet上输出分辨率为14 × 14),紧随ResNet及其最近的变体[12,28,38](例如,ResNet-101在其14 × 14分辨率阶段使用69层)。我们让这五个阶段分别有1、2、4、14、1层,构造一个实例repvg - a。我们还构建了更深的repvg - b,它在阶段2、3和4中有2个层。我们使用repvgg- a与其他轻、中重量型号(包括ResNet-18/34/50)竞争,使用repvgg- b与高性能模型竞争。

我们通过统一缩放[64,128,256,512]的经典宽度设置来确定层宽度(例如,VGG和ResNets)。我们使用乘法器a来缩放前四个阶段,b用于最后一个阶段,通常设置b > a,因为我们希望最后一层具有更丰富的分类或其他下游任务的特征。由于RepVGG在最后一阶段只有一层,所以b越大,时延和参数量的增加并不明显。其中stage2, 3, 4, 5的宽度分别为[64a, 128a, 256a, 512b]。为了避免高分辨率特征图上的大规模卷积,如果a < 1,我们将缩小阶段1,而不能将其放大,使stage1的宽度为min(64,64a)。

为了进一步减少参数和计算量,我们可以选择用密集的3 × 3 conv层分组交织,以换取精度和效率。具体来说,我们将设置第3、第5、第7、……第21层的repvgg- a和额外的第23、25和27层的repvgg- b分组g的数量。为了简单起见,我们将g全局设置为1、2或4,不进行分层调优。我们不使用相邻的分组conv层,因为这会禁用通道间的信息交换,并带来一个副作用[41]:来自某个通道的输出将只来自输入通道的一小部分。注意,1 × 1分支的分组数量g应与3 × 3卷积相同。

4. Experiments

我们将RepVGG与ImageNet上的基线进行了比较,通过一系列消融研究和比较证明了结构参数化的重要性,并验证了语义分割[42]上的泛化性能。

4.1. RepVGG for ImageNet Classification

我们将RepVGG与经典和最先进的模型进行比较,包括VGG-16 [31], ResNet [12], ResNeXt [38], EfficientNet[35]和RegNet[28]在ImageNet-1K[6]上,其中包括1.28M张用于训练的图像和50K用于验证的图像。我们分别使用EfficientNet-B0/B3和RegNet3.2GF/12GF作为中重量级和重量级最先进模型的代表。我们改变乘法器a和b以生成一系列RepVGG模型,并与基线进行比较(表3)。
在这里插入图片描述
我们首先比较RepVGG和ResNets[12],这是最常见的基准测试。我们分别使用RepVGGA0/A1/A2与ResNet-18/34/50进行比较。为了与较大的模型进行比较,我们构造了较深的RepVGG-B0/B1/B2/B3,随着宽度的增加。对于那些具有交错分组层的RepVGG模型,我们在模型名称后加上g2/g4。
为了训练轻量级和中等重量模型,我们只使用简单的数据增强管道,包括随机裁剪和左右翻转,遵循官方PyTorch示例[27]。我们在8个gpu上使用256的全局批处理大小,初始化为0.1的学习率和120个周期的余弦退火,标准SGD动量系数为0.9,重量衰减为10−4
在卷积层和全连接层。对于RegNetX-12GF、EfficientNet-B3和RepVGG-B3等重量级模型,我们使用了5 epoch的预热,余弦学习率退火200 epoch,标签平滑[34]**和混合40,**以及Autoaugment[5]的数据增强管道,随机裁剪和翻转。repvgg- b2及其g2/g4变体在这两种设置下都被训练。我们在1080Ti GPU 4上测试每个型号的速度,批次大小为128,首先输入50批次来加热硬件,然后记录50批次的时间使用情况。为了公平的比较,我们在同一个GPU上测试所有的模型,并且基线的所有conv - bn序列也被转换为带有偏差的conv (Eq. 3)。

表4显示了RepVGG良好的精度-速度权衡:repvggg - a0在精度和速度方面比ResNet-18好1.25%和33%,RepVGGA1比ResNet-34好0.29%/64%,repvggg - a2比ResNet-50好0.17%/83%。通过交叉分组层(g2/g4), RepVGG模型进一步加速,精度降低合理:RepVGG- b1g4比ResNet-101提高0.37%/101%,RepVGGB1g2在相同精度下比ResNet-152快2.66倍。虽然参数的数量不是我们主要关心的问题,但所有上述RepVGG模型的参数效率都比ResNets高。与经典的vgg-16相比,repvgg- b2只有58%的参数,运行速度快10%,精度提高6.57%。与我们所知的用RePr[26]**(一种基于修剪的训练方法)**训练的准确率最高(74.5%)的VGG相比,repvgg- b2的准确率高出4.28%。
在这里插入图片描述
与最先进的基线相比,考虑到其简单性,RepVGG也表现出良好的性能:RepVGG- a2比EfficientNetB0好1.37%/59%,RepVGG- b1比RegNetX3.2GF好0.39%,运行速度略快。值得注意的是,RepVGG模型在200个epoch的情况下达到80%以上的精度(表5),据我们所知,这是普通模型第一次赶上了最先进的水平。与RegNetX-12GF相比,RepVGG- b3运行速度快了31%,考虑到RepVGG不需要很多像RegNet[28]这样的设计空间需要大量人力来完善,而j结构超参数的设置是随意的,这是令人印象深刻的。
在这里插入图片描述
作为计算复杂度的两个代理,我们计算理论flop和Wino MULs,如章节2.4所述。例如,我们发现在efficient entnet - b0 /B3中没有一个conv被Winograd算法加速。表4显示Wino MULs在GPU上是一个更好的代理,例如,ResNet-152运行速度比VGG-16慢,理论FLOPs较低,但Wino MULs较高。当然,实际速度应该始终是黄金标准。

4.2. Structural Re-parameterization is the Key

在本小节中,我们验证了结构重新参数化技术的重要性(表6)。所有模型都从头开始训练120个周期,使用上述相同的简单训练设置。首先,我们通过移除同等连接和/或repvg - b0每个区块1 × 1个分支进行消融研究。去除两个分支后,训练时间模型退化为普通的平面模型,准确率仅为72.39%。在1 × 1的情况下,识别准确率提高到73.15%,识别准确率提高到74.79%。全特征RepVGGB0的准确率为75.14%,比普通平面模型提高了2.75%。从训练时间(即尚未转换的)模型的推理速度来看,通过结构重新参数化去除单位和1 × 1分支可以显著提高速度。
然后,我们构建了一系列变体和基线,用于在repvgg- b0上进行比较(表7)。同样,所有模型都是在120个epoch中从头开始训练的。
无BN的Identity去掉了Identity分支中的BN。
添加后BN删除三个分支中的BN层,并在添加后追加一个BN层。换句话说,BN的位置由加前变为加后。
+分支中的ReLU在每个分支中插入ReLU(在BN之后和添加之前)。由于这样的块不能转换为单一的conv层,因此没有实际用途,我们只是想看看更多的非线性是否会带来更高的性能。
DiracNet[39]采用了精心设计的conv内核重参数化,如2.2节所述。我们使用它的官方PyTorch代码来构建层来取代原来的3 × 3 conv。
•Trivial Re-param是一种更简单的conv内核的重新参数化,通过直接向3 × 3内核添加一个身份内核,可以查看DiracNet的降级版本(W = I + W[39])。
Asymmetric Conv Block[10]可以被视为另一种形式的结构参数化。我们将与ACB进行比较,看看我们的结构重新参数化的改进是否是由于组件级的过度参数化(即,额外的参数使每3 × 3的conv更强)。
Residual Reorg通过以类似resnet的方式重新组织每个阶段(每个块2层)。具体来说,生成的模型在第一阶段和最后阶段有一个3×3层,在阶段2,3,4中有2,3,8个剩余块,并使用类似ResNet-18/34的快捷连接。

我们认为结构重参数相对于dicractnet和Trivial重参数的优势在于前者依赖于通过具有非线性行为(BN)的具体结构的实际数据流,而后者只是使用了另一种卷积核的数学表达式。前者“重新参数化”意味着“使用一个结构的参数来参数化另一个结构”,而后者意味着“先用另一组参数计算参数,然后再用它们进行其他计算”。对于训练时间BN这样的非线性成分,前者不能近似于后者。作为证据,通过去除BN准确性降低,并通过添加ReLU进行改进。换句话说,虽然RepVGG块可以等价地转换为一个用于推理的conv,但推理时间等价并不意味着训练时间等价,因为我们不能构造一个conv层来具有与RepVGG块相同的训练时间行为。

与ACB的比较表明,RepVGG的成功不应该简单地归因于每个组件的过度参数化的影响,因为ACB使用了更多的参数,但性能较差。作为双重检查,我们将ResNet-50的每3 × 3 conv替换为RepVGG块,从头开始训练120个epoch。准确率为76.34%,仅比ResNet-50基线高0.03%,这表明RepVGGstyle结构重新参数化不是一种通用的过度参数化技术,而是训练强大的普通ConvNets的关键方法。与残差Reorg(一个真实的残差网络,具有相同数量的3 × 3 conv和额外的训练和推理捷径)相比,RepVGG的性能高出0.58%,这并不奇怪,因为RepVGG有更多的分支。例如,分支使RepVGG的stage4为2 × 315 = 2.8 × 107模型的集合[36],而Residual Reorg的数量为28 = 256。

4.3. Semantic Segmentation

我们验证了ImageNetpretrained RepVGG在城市景观[4]上进行语义分割的泛化性能(表8)。我们使用PSPNet[42]框架,一个基于0.01和0.9的多学习率策略,权值衰减为10−4和全局batch size为16,在8个gpu上运行40个epoch。为了公平比较,我们只将ResNet-50/101主干网更改为repvg - b1g2 /B2,其他设置保持相同。继官方的PSPNet-50/101[42]在ResNet-50/101的最后两个阶段使用了扩张的conv之后,我们还将RepVGG-B1g2/B2最后两个阶段的所有3 × 3 conv层进行了扩张。然而,目前低效率的3 × 3扩张卷积(尽管FLOPs与3 × 3正则卷积相同)实现减慢了推断。为了便于比较,我们构建了另外两个PSPNets(用fast表示),仅在最后5层(即stage4的最后4层和stage5的唯一一层)进行膨胀,因此PSPNets的运行速度略快于ResNet-50/101-backbone对应的PSPNets。RepVGG- b1g2 -fast在平均欠条上比ResNet-50和ResNet-101分别快1.71%和1.01%,在mIoU上比ResNet-101快0.37,快62%。有趣的是,膨胀似乎对更大的模型更有效,因为使用更膨胀的conv层与repvg - b1g2 -fast相比并没有提高性能,但在合理的减速下,将repvg - b2的mIoU提高了1.05%。

4.4. Limitations

RepVGG模型是快速、简单和实用的ConvNets,专为GPU和专用硬件上的最大速度而设计,不太关心参数的数量。它们比ResNets参数效率更高,但可能不如用于低功耗设备的MobileNets[16,30,15]和ShuffleNets[41,24]等移动系统模型受欢迎。

5. Conclusion

我们提出了RepVGG,这是一个简单的结构,由3 × 3的conv和ReLU组成,特别适用于GPU和专用推理芯片。通过我们的结构重新参数化方法,它在ImageNet上达到了超过80%的top-1精度,与最先进的模型相比,它表现出了良好的速度-精度权衡。

参考文献

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_60534571/article/details/129596043