论文
RepVGG: Making VGG-style ConvNets Great Again
论文地址
https://openaccess.thecvf.com/content/CVPR2021/papers/Ding_RepVGG_Making_VGG-Style_ConvNets_Great_Again_CVPR_2021_paper.pdf
摘要
提出了一种简单但功能强大的卷积神经网络结构,它具有类似VGG的推理时间体,仅由3×3卷积和ReLU的堆栈组成,而训练时间模型具有多分支拓扑。这种训练时间和推理时间结构的解耦是通过结构重新参数化技术实现的,因此该模型被命名为RepVGG
RepVGG模型的运行速度比ResNet-50快83%,比ResNet-101快101%,具有更高的精度,与最先进的模型(如EfficientNet和RegNet)相比,显示出良好的精度-速度权衡。
1 介绍
经典的卷积神经网络(ConvNet)VGG[31]在图像识别方面取得了巨大成功,其简单的架构由一个由conv、ReLU和pooling组成的堆栈组成。随着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]中的频道切换)增加了内存访问成本,并且缺乏对各种设备的支持。由于影响推理速度的因素很多,浮点运算(FLOP)的数量不能准确反映实际速度。
在本文中,我们提出了RepVGG,一种VGG风格的体系结构,其性能优于许多复杂的模型。
RepVGG具有以下优点:
1、 该模型具有类似VGG的平面(即前馈)拓扑(网络拓扑只关注组件如何连接到其他组件),没有任何分支,这意味着每一层都将其前一层的输出作为输入,并将输出馈送到其后一层
2、 该模型的主体仅使用3×3 conv和ReLU
3、 主要结构(特定深度和层宽度)是实例化的,没有自动搜索[44]、手动优化[28]、复合缩放[35],也没有其他重型设计。
对于普通模型来说,要达到与多分支体系结构相当的性能水平是一个挑战。多分支拓扑(例如ResNet)使模型成为许多较浅模型的隐式集成[36],因此训练多分支模型可以避免梯度消失问题。由于多分支体系结构的优点都是为了训练,缺点是不需要推理,因此我们建议通过结构重新参数化将训练时间多分支和推理时间普通体系结构解耦,这意味着通过转换其参数将体系结构从一种结构转换为另一种结构。具体来说,网络结构与一组参数相耦合。
在本文中,网络拓扑只关注组件如何连接到其他组件,架构是指拓扑以及组件的规格(如深度和宽度),结构可以指架构的任何组件或部分核张量。如果某个结构的参数可以转换为另一个结构耦合的另一组参数,我们可以用后者等效地替换前者,从而改变整个网络结构。我们使用标识和1×1分支构造了训练时间RepVGG,这是受ResNet启发的,但可以通过结构重新参数化以不同的方式删除分支。
本文的主要贡献:
• 建议使用RepVGG,这是一种简单的架构,与现有技术相比,具有良好的速度精度权衡。
• 我们建议使用结构重新参数化,将训练时间多分支拓扑与推理时间普通架构解耦。
• 我们展示了RepVGG在图像分类和语义分割方面的有效性,以及实现的效率和易用性。
2 相关工作
2.1 从单路径到多分支
VGG[31]将ImageNet分类的头等精度提高到70%以上后,在使ConvNets复杂化以实现高性能方面有许多创新。例如,当代GoogLeNet[33]和后来的Inception模型[34、32、19]采用了精心设计的多分支架构,ResNet[12]提出了简化的两分支架构,而DenseNet[17]通过将低层与许多高层连接起来,使拓扑结构更加复杂。
神经架构搜索(NAS)[44、29、23、35]和手动设计空间设计[28]可以生成性能更高的ConvNets,但需要耗费大量计算资源或人力。一些大型NAS生成的模型甚至无法在普通GPU上训练,因此限制了应用程序。除了实施不便之外,复杂的模型可能会降低并行度[24],从而减慢推理速度。
2.2 单路径模型的有效训练
以往的工作主要是试图使非常深的模型以合理的精度收敛,但没有达到比复杂模型更好的性能。因此,这些方法和结果模型既不简单也不实用。[37]提出了一种初始化方法来训练极深的普通ConvNets。使用基于平均场理论的方案,在MNIST和CIFAR-10上分别对10000层网络进行了99%和82%以上的精度训练。尽管这些模型不实用(即使LeNet-5[21]在MNIST上也能达到99.3%的精度,而VGG-16在CIFAR10上也能达到93%以上),但理论上的贡献很有见地。最近的一项工作[25]结合了多种技术,包括Leaky-ReLU、max-norm和careful initialization。在ImageNet上,它显示具有147M参数的普通ConvNet可以达到74.6%的top-1精度,比其报告的基线(ResNet-101,76.6%,45M参数)低2%。
本文不仅证明了普通模型可以很好地收敛,而且不打算训练像ResNets这样的非常深入的ConvNets。相反,我们的目标是建立一个具有合理深度和良好精度-速度权衡的简单模型,它可以用最常见的组件(例如正则conv和BN)和简单的代数简单地实现。
2.3 模型重新参数化
DiracNet[39]是一种与我们相关的重新参数化方法。它通过将conv层的内核编码为:
W是用于卷积的最终权重,a和b是学习向量,Wnorm是归一化可学习核。
DiracNet有两个方面与本文的方法不同:
1、 RepVGG的训练时间行为是实际数据流通过一个具体的结构来实现的,该结构可以稍后转换为另一个结构,而DiracNet仅使用另一个conv内核的数学表达式来简化优化。训练时间RepVGG是一真正的多分支模型,但DiracNet不是。
2、 DiracNet的性能高于正常参数化的普通模型,但低于可比较的ResNet,而RepVGG模型的性能优于ResNet,差距很大。
Asym Conv Block(ACB)[10]、DO Conv[1]和ExpandNet[11]也可以被视为结构重新参数化,因为它们将块转换为Conv。与我们的方法相比,不同之处在于,它们是为组件级改进而设计的,并且在任何架构中都用作Conv层的替代品,而我们的结构重新参数化对于训练普通ConvNets至关重要。
2.4 Winograd卷积
RepVGG 只使用3×3 conv,因为它是由一些现代计算库,如 NVIDIA cuDNN [2]和 Intel MKL [18] GPU和CPU上高度优化的。如表显示了1080Ti GPU 上用 cuDNN 7.5.0测试的理论FLOPs、实际运行时间和计算密度(在每秒 Tera 浮点运算中测量,TFLOPS)。3×3 conv的理论计算密度约为其他计算密度的4倍,这表明理论上的总FLOP不能代表不同体系结构之间的实际速度。
在NVIDIA 1080Ti上进行速度测试,改变内核大小和批次大小=32,输入通道=输出通道=2048,分辨率=56×56,步幅=1。硬件预热(warm up)后,时间使用结果平均为10次运行。
Winograd[20]是一种用于加速3×3 conv(仅当步幅为1时)的经典算法,cuDNN和MKL等库很好地支持(默认启用)该算法。使用标准的F(2×2,3×3)Winograd,3×3conv的乘法量(MUL)减少到原来的4/9倍。由于乘法比加法更耗时,我们计算MUL(度量单位)以测量Winograd支持下的计算成本。特定的计算库和硬件决定是否对每个运算符使用Winograd,因为由于内存开销,小规模卷积可能不会加速。
3 通过结构重构参数构建RepVGG
3.1 简单快速,内存经济,灵活
使用简单ConvNets至少有三个原因:它们速度快、节省内存和灵活。
Fast :许多最近的多分支体系结构的理论FLOP低于VGG,但运行速度可能不会更快。例如,VGG-16具有比EfficientNet-B3[35]多8.4倍的FLOPs,但在1080Ti 上运行速度只快了1.8倍,即前者的计算密度为后者的15倍。除了 Winograd conv 带来的加速之外,FLOP 和速度之间的差异可以归因于:对速度有相当大影响,但 FLOP 没有考虑的两个重要因素: 内存访问成本(MAC)和并行度[24]。例如,虽然分支相加或连接所需的计算可以忽略不计,但MAC是重要的。此外,MAC在群卷积中占据了很大一部分时间。另一方面,在相同的Flops下,一个具有高并行度的模型可能比另一个具有低并行度的模型快得多。由于多分支拓扑结构在Inception和auto-generated结构中被广泛采用,因此使用多个小的算子。priorwork[24]报告了在NASNET-A[43]中碎片运算符(即一个构建块中单独的转换或池操作的数量)是13,这对具有强大并行计算能力的设备(如GPU)不友好,并引入了额外的开销,如内核启动和同步。在ResNets中这个数字是2或3,我们将其设为1:一个单一的conv
Memory-economical :多分支拓扑是内存效率低下的,因为每个分支的结果都需要保留,直到添加或串联,这大大提高了内存占用的峰值。残差块的输入需要保持到加法。假设块保持特征映射大小,额外内存占用的峰值为2倍作为输入。相比之下,普通拓扑允许在操作完成时立即释放特定层的输入所占用的内存。在设计专用硬件时,普通ConvNet允许深度内存优化,并降低内存单元的成本,以便我们可以将更多计算单元集成到芯片上。
Flexible :多分支拓扑对体系结构规范施加了约束。例如,ResNet要求将conv层组织为残差块,这限制了灵活性,因为每个残差块的最后conv层必须产生相同形状的张量,否则快捷方式的添加就没有意义。多分支拓扑限制了通道修剪的应用[22,14],这是一种删除一些不重要通道的实用技术,有些方法可以通过自动发现每个层的适当宽度来优化模型结构[8]。多分支模型使修剪变得棘手,导致性能显著下降或加速变低[7,22,9]。相比之下,简单的体系结构允许我们根据自己的需求自由配置每个转换层,并进行修剪以获得更好的性能效率权衡。
3.2 训练时间多分支架构
普通ConvNet有许多优点,但有一个致命的缺点: 性能差。例如,使用像 BN [19]这样的现代组件,VGG-16在 ImageNet 上的精度可以达到72% 以上,这似乎已经过时了。我们结构重参数化方法是受到 ResNet 的启发,它显式地构造了一个快捷分支来将信息流建模为 y = x + f (x) ,并使用一个残差块来学习f。当x和f (x)的维数不匹配时,它变成 y = g (x) + f (x),其中g (x)是1×1 conv实现的卷积捷径。ResNets 成功的一个解释是,这样的多分支架构使模型成为众多浅层模型的隐式集合[36]。具体来说,对于n个块,模型可以解释为2的n次方个模型的集合,因为每个块将流分成两个路径。多分支拓扑在推理方面存在缺陷,但分支似乎有利于训练[36],因此我们使用多个分支来对众多模型进行只需要训练时间的集成。为了使大多数成员更浅或更简单,我们使用类似ResNet的标识(仅在维度匹配的情况下)和1 × 1分支,以便构建块的训练时间信息流为y = x + g(x) + f(x)。我们只需将几个这样的块叠加起来,就可以构建训练时间模型。该模型成为 3的n次方 个成员和 n 个这样的块的集合。
3.3 重新参数化的纯推理时间模型
在本小节中,描述了如何将经过训练的块转换为单个3×3 conv层进行推理。我们添加之前在每个分支中使用BN,如图所示。形式上,我们使用W(3)∈ RC2×C1×3×3表示带C1输入通道和C2输出通道的3×3 conv层的内核,以及W(1)∈ RC2×C1用于1×1分支的内核。使用µ(3), σ(3), γ(3), β(3)作为3×3转换后BN层的累积平均值、标准偏差、学习比例因子和偏差。µ(1), σ(1), γ(1), β(1)作为1×1转换后BN层的累积平均值、标准偏差、学习比例因子和偏差。µ(0), σ(0), γ(0), β(0)作为同一分支的累积平均值、标准偏差、学习比例因子和偏差。设M(1)∈ RN×C1×H1×W1,M(2)∈ RN×C2×H2×W2分别为输入输出,*为卷积算子。如果C1=C2,H1=H2,W1=W2则有:
或者,我们不使用同一分支,则上述方程只有前两项。这里的bn是推理时间bn函数。1 ≤ i ≤ C2
首先将每个BN及其前一个conv层转换为一个带有偏置矢量的conv。设{W’,b’}为核,由{W,µ,σ,γ,β}转换为偏压,得到:
3.4 结构规范
RepVGG是VGG风格的,因为它采用普通拓扑,大量使用3×3 conv,但它不像VGG那样使用最大池,因为我们希望主体只有一种类型的运算符。
根据三个简单的准则来决定每个阶段的层数。1) 第一阶段以大分辨率运行,这很耗时,因此我们只使用一层来降低延迟。2) 最后一个阶段应该有更多的通道,所以我们只使用一层来保存参数。3) 我们将最多的层放入第二个最后阶段(ImageNet上的输出分辨率为14×14),紧随其后的是ResNet及其最新变体[12、28、38](例如,ResNet-101在其14×14分辨率阶段使用了69层)。我们让这五个阶段分别有1、2、4、14、1层来构造一个名为RepVGG-A的实例。我们还构建了一个更深的RepVGG-B,它在第2、3和4阶段还有2层。我们使用RepVGG-A与其他轻量级和中量级型号竞争,包括ResNet-18/34/50,并与高性能型号竞争。
2×64a表示阶段2有2个层,每个层有64a通道。
通过均匀缩放经典宽度设置[64、128、256、512](例如VGG和ResNets)来确定层宽度。我们使用乘数a缩放前四个阶段,b缩放最后一个阶段,通常设置b>a,希望最后一层具有更丰富的特征,用于分类或其他下游任务。由于RepVGG在最后一个阶段只有一层,因此较大的b不会显著增加延迟或参数量。具体来说,阶段2、3、4、5的宽度分别为[64a、128a、256a、512b]。为了避免在高分辨率特征图上进行大规模转换,如果a<1,我们缩小阶段1,但不放大,因此阶段1的宽度为min(64,64a)
为了进一步减少参数和计算,我们可以选择将密集的3×3 conv层与成组的层数交错,以牺牲效率的准确性。具体来说,我们为RepVGG-A的第3、5、7、…、21层以及RepVGG-B的额外第23、25和27层设置了组g的数量。为了简单起见,我们将此类层的g全局设置为1、2或4,而不进行逐层调整。我们不使用相邻的逐组conv层,因为这将禁用通道间信息交换并带来副作用[41]:某个通道的输出将仅来自一小部分输入通道。注意,1×1分支的g应与3×3转换器的g相同。
4 实验
将RepVGG与ImageNet上的基线进行比较,通过一系列消融研究和比较来证明结构重新参数化的重要性,并验证语义分割的泛化性能。
4.1用于ImageNet分类的RepVGG
将RepVGG与ImageNet-1K[6]上的经典和最先进的模型进行了比较,包括VGG-16[31]、ResNet[12]、ResNeXt[38]、EfficientNet[35]和RegNet[28],其中包括1.28M个用于培训的图像和50K个用于验证的图像。我们分别使用EfficientNet-B0/B3和RegNet3.2GF/12GF作为中量级和重量级最先进代表。我们改变乘数a和b,以生成一系列RepVGG模型,与基线进行比较。
首先比较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周期预热、200周期余弦学习率退火、标签平滑[34]和混合[40](以下为[13]),以及自动增强[5]的数据增强管道、随机裁剪和翻转。RepVGG-B2及其g2/g4变体在这两种设置中都经过训练。在1080Ti GPU上,我们测试了每个批量为128的模型的速度,首先给50个批量的硬件加热,然后记录50个批量的时间使用情况。为了进行公平的比较,我们在相同的GPU上测试了所有的模型,并且基线的所有conv-BN序列也都转换成了带偏差的 conv。
余弦退火(Cosine annealing)可以通过余弦函数来降低学习率。余弦函数中随着x的增加余弦值首先缓慢下降,然后加速下降,再次缓慢下降。论文:Stochastic Gradient Descent with Warm Restarts
如下表所示(在ImageNet上经过120个时代的数据增强训练。速度在批次大小为128的1080Ti上进行测试,全精度(fp32),以实例/秒为单位进行测量。计算的理论FLOP和MULs)显示了RepVGG良好的精度-速度权衡:RepVGG-A0在精度和速度方面比ResNet-18高1.25%和33%,RepVGGA1比ResNet-34高0.29%/64%,RepVGG-A2比ResNet-50高0.17%/83%,通过交错分组层(g2/g4),RepVGG模型进一步加速,精度降低合理:RepVGG-B1g4比ResNet-101高0.37%/101%,RepVVGG-B1g2以同样的精度比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%,RepVVGG-B1比RegNetX3.2GF好0.39%,运行速度稍快。RepVGG模型在200个时期内达到了80%以上的精度如下表所示(表中在ImageNet上使用自动增强[5]、标签平滑和mixup训练了200个epochs的结果),据我们所知,这是普通模型第一次赶上最先进的水平。与RegNetX-12GF相比,RepVGG-B3的运行速度快31%,这是令人印象深刻的,因为RepVGG不需要像RegNet[28]那样耗费大量人力来优化设计空间,而且架构超参数是随意设置的。
作为计算复杂性的两个代表,我们计算理论FLOP和Wino MUL,如2.4节所述。前面表格显示了Wino MUL在GPU上是一个更好的代理,例如,ResNet-152的运行速度比VGG-16慢,理论FLOP更低,但Wino MULs更高,实际速度应该始终是黄金标准。
4.2 结构重新参数化是关键(消融实验)
所有模型都是用上述相同的简单训练设置从头开始训练120个epochs的。RepVGG-B0的每个块中删除identity和/或1×1分支来进行消融研究。当两个分支都被删除时,训练时间模型退化为普通的平面模型,仅达到72.39%的准确率。1×1的准确率提高到73.15%,同一性提高到74.79,全功能RepVGGB0的准确率为75.14%,比普通模型高2.75%。从训练时间(即尚未转换的)模型的推理速度来看,通过结构重新参数化去除恒等式和1×1分支带来了显著的加速。本文构建了一系列变体和基线,以便在RepVGG-B0上进行比较。同样,所有的模型都是在120个epochs里从头开始训练的。
• Identity w/o BN 删除Identity分支中的BN。
• Post-addition BN 去除三个分支中的BN层,并在添加后附加一个BN层。换言之,BN的位置从前加变为后加。
• +ReLU in branches 将ReLU插入每个分支(BN之后和添加之前)。由于这样的块不能转换为单个conv层,因此没有实际用途,我们只想看看更多的非线性是否会带来更高的性能。
• DiracNet[39] 采用了精心设计的conv内核重新参数化(在2.2小节介绍过),我们使用它的官方PyTorch代码构建层来替换原来的3×3 conv。
• Trivial Re-param 是通过直接向3×3内核添加Identity内核,对conv内核进行更简单的重新参数化,可以将其视为DiracNet的降级版本(ˆW=I+W[39])。
• Asymmetric Conv Block(ACB)[10]可被视为另一种形式的结构重新参数化。我们与ACB进行比较,以了解我们的结构重新参数化的改进是否是由于组件级别的过度参数化(即,额外的参数使每3×3转换更强)。
• Residual Reorg 通过以类似ResNet的方式重新组织每个阶段(每个区块2层)来构建每个阶段。具体来说,合成模型在第一阶段和最后阶段有一个3×3层,在第二阶段、第三阶段、第四阶段有2、3、8个剩余块,并且使用的快捷方式与ResNet-18/34类似。
本文认为,与DiractNet和Trivial re-param相比,结构化re-param的优势在于,前者依赖于通过具有非线性行为(BN)的具体结构的实际数据流,而后者仅使用另一个conv核的数学表达式。前者的“re-param”意思是“使用一个结构的参数来参数化另一个结构”,而后者的意思是“首先使用另一组参数计算参数,然后将它们用于其他计算”。去除BN会降低准确度,添加ReLU会提高准确度。尽管RepVGG块可以等效转换为单个conv进行推理,但推理时间等效并不意味着训练时间等效,因为我们不能构造一个conv层来具有与RepVGG块相同的训练时间行为。
我们将ResNet-50的每3×3 conv替换为一个RepVGG块,并从头开始训练120个小时。准确率为76.34%,仅比ResNet-50基线高0.03%,这表明RepVGG结构重新参数化不是一种通用的过参数化技术,而是训练强大的普通ConvNets的关键方法。与具有相同数量的3×3 conv和用于训练和推理的附加捷径的真实残差网络Restival Reorg相比,RepVGG的表现优于0.58%,这并不奇怪,因为RepVGG有更多分支。
4.3 语义分割
我们使用 PSPNet [42]框架,基于0.01的多学习速率策略和0.9的功率,权重衰减为10-4,在8个 GPU 上的全局批量大小为16,持续40个epochs。为了公平比较,我们只将 ResNet-50/101主干更改为 RepVGG-B1g2/B2,并保持其他设置相同。RepVGG主干在平均IoU上以更高的速度分别比ResNet-50和ResNet-101快1.71%和1.01%,RepVGG-B1g2-fast在mIoU方面比ResNet-101主干快0.37,运行速度快62%。对于较大的模型而言,扩展似乎更有效,因为与RepVGG-B1g2相比,使用更多的扩展conv层并不能快速提高性能,但会在合理的减速下将RepVGG-B2的mIoU提高1.05%。
4.4 限制
RepVGG模型是快速、简单和实用的ConvNets,设计用于GPU和专用硬件上的最大速度,较少涉及参数的数量。它们比ResNets的参数效率更高,但可能不如MobileNets[16,30,15]和ShuffleNets[41,24]等低功耗设备的移动机制模型受欢迎。
5 结论
我们提出了RepVGG,这是一种简单的结构,具有3×3 conv和ReLU的堆栈,特别适合于GPU和专用推理芯片。通过我们的结构重新参数化方法,它在ImageNet上达到了80%以上的top-1精度,与最先进的模型相比,显示了良好的速度精度权衡。
文章出处登录后可见!