【CV】RepVGG:通过结构重参数化实现训练和推理解耦的类 VGG 架构

论文名称:RepVGG: Making VGG-style ConvNets Great Again
论文下载:https://arxiv.org/abs/1704.04861
论文年份:2021
论文被引:152(2022/05/21)
论文代码:https://github.com/megvii-model/RepVGG

Abstract

我们提出了一个简单但功能强大的卷积神经网络架构,它具有类似 VGG 的推理时间体,仅由一堆 3×3 卷积和 ReLU 组成,而训练时间模型具有多分支拓扑这种训练时间和推理时间架构的解耦是通过结构重新参数化技术实现的,因此该模型被命名为 RepVGG。据我们所知,在 ImageNet 上,RepVGG 达到了超过 80% 的 top-1 准确率,这是普通模型的第一次。在 NVIDIA 1080Ti GPU 上,RepVGG 模型的运行速度比 ResNet-50 快 83% 或比 ResNet-101 快 101%,具有更高的准确度,与 EfficientNet 和 RegNet 等最先进的模型相比,表现出良好的准确度-速度权衡。

We present a simple but powerful architecture of convolutional neural network, which has a VGG-like inferencetime body composed of nothing but a stack of 3 × 3 convolution and ReLU, while the training-time model has a multi-branch topology. Such decoupling of the trainingtime and inference-time architecture is realized by a structural re-parameterization technique so that the model is named RepVGG. On ImageNet, RepVGG reaches over 80% top-1 accuracy, which is the first time for a plain model, to the best of our knowledge. On NVIDIA 1080Ti GPU, RepVGG models run 83% faster than ResNet-50 or 101% faster than ResNet-101 with higher accuracy and show favorable accuracy-speed trade-off compared to the stateof-the-art models like EfficientNet and RegNet.

1. Introduction

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

尽管许多复杂的 ConvNet 比简单的 ConvNet 提供更高的准确度,但缺点也很明显。

  • 1)复杂的多分支设计(例如 ResNet 中的 residual addition 和 Inception 中的 branch-concatenation)使模型难以实现和定制,减慢推理速度并降低内存利用率
  • 2)一些组件(例如,Xception [3] 和 MobileNets [16, 30] 中的 depthwise conv 和 ShuffleNets [24, 41] 中的 channel shuffle)增加了内存访问成本并且缺乏各种设备的支持

由于影响推理速度的因素众多,浮点运算(FLOP)的数量并不能准确反映实际速度。尽管一些新模型的 FLOP 比 VGG 和 ResNet-18/34/50 [12] 等老式模型低,它们可能不会跑得更快(表 4)。因此,VGG 和原始版本的 ResNets 仍然大量用于学术界和工业界的实际应用。
在这里插入图片描述
在本文中,我们提出了 RepVGG,这是一种 VGG 风格的架构,其性能优于许多复杂的模型(图 1)。 RepVGG 具有以下优点

  • 该模型具有类似 VGG 的普通(也称为前馈)拓扑,没有任何分支,这意味着每一层都将其唯一前一层的输出作为输入,并将输出馈送到其唯一的下一层。
  • 模型主体仅使用 3 × 3 conv 和 ReLU。
  • 具体架构(包括特定的深度和层宽)是在没有自动搜索[44]、手动细化[28]、复合缩放[35] 或其他繁重设计的情况下实例化的。

普通模型很难达到与多分支架构相当的性能水平。一种解释是,多分支拓扑,例如 ResNet,使模型成为许多较浅模型 [36] 的隐式集合,因此训练多分支模型可以避免梯度消失问题

由于多分支架构的好处都是用于训练,而缺点是不适合推理,我们建议通过结构重新参数化将训练时多分支和推理时普通架构解耦,这意味着通过转换其参数将架构从一种转换为另一种。具体来说,一个网络结构与一组参数相耦合,例如,一个卷积层由一个四阶核张量 (4th-order kernel tensor) 表示
在这里插入图片描述
具体来说,我们使用恒等映射 (identity) 和 1×1 分支构建训练时 RepVGG,这受到 ResNet 的启发,但以不同的方式可以通过结构重新参数化来移除分支(图 2,4)训练后,我们用简单的代数进行变换,因为一个恒等分支可以看成是一个退化的 1×1 conv,而后者又可以进一步看成是一个退化的 3×3 conv,这样就可以构造一个单一的 3× 3 内核,具有原始 3 × 3 内核、identity 和 1 × 1 分支和批量归一化 (BN) [19] 层的训练参数。因此,转换后的模型有一个 3 × 3 的卷积层堆栈,用于测试和部署
在这里插入图片描述
值得注意的是,推理时间 RepVGG 的主体只有一种类型的算子:3 × 3 conv 后跟 ReLU,这使得 RepVGG 在 GPU 等通用计算设备上运行速度更快。更好的是,RepVGG 允许专用硬件实现更高的速度,因为考虑到芯片尺寸和功耗,我们需要的运算符类型越少,可以集成到芯片上的计算单元就越多。因此,专门用于 RepVGG 的推理芯片可以具有大量的 3×3-ReLU 单元和更少的内存单元(因为普通拓扑结构是内存经济的,如图 3 所示)。我们的贡献总结如下。

  • 我们提出了RepVGG,这是一种简单的架构,与最先进的技术相比具有良好的速度-准确度权衡。
  • 我们建议使用结构重新参数化将训练时多分支拓扑与推理时普通架构解耦。
  • 我们展示了RepVGG 在图像分类和语义分割中的有效性,以及实现的效率和易用性。

2. Related Work

2.1. From Single-path to Multi-branch

在 VGG [31] 将 ImageNet 分类的 top-1 准确率提高到 70% 以上之后,有许多创新使 ConvNets 变得复杂以获得高性能,例如当代的 GoogLeNet [33] 和后来的 Inception 模型 [34, 32, 19 ]采用精心设计的多分支架构,ResNet [12]提出了一种简化的双分支架构,而DenseNet [17]通过将低层与许多高层连接起来使拓扑更加复杂。神经架构搜索 (NAS) [44, 29, 23, 35] 和手动设计空间设计 [28] 可以生成性能更高的 ConvNet,但代价是大量的计算资源或人力。一些大版本的 NAS 生成模型甚至无法在普通 GPU 上训练,因此限制了应用。除了实现不便外,复杂的模型可能会降低并行度[24],从而减慢推理速度

2.2. Effective Training of Single-path Models

已经有一些尝试在没有分支的情况下训练 ConvNet。然而,先前的工作主要是试图使非常深的模型以合理的精度收敛,但没有比复杂模型获得更好的性能。因此,这些方法和结果模型既不简单也不实用。[37] 提出了一种初始化方法来训练极深的普通 ConvNet。使用基于平均场理论的方案 (mean-field-theory-based scheme),10000 层网络在 MNIST 上的训练准确率超过 99%,在 CIFAR-10 上的准确率超过 82%。尽管这些模型并不实用(即使 LeNet-5 [21] 在 MNIST 上的准确率可以达到 99.3%,而 VGG-16 在 CIFAR10 上的准确率也可以达到 93% 以上),但其理论贡献是有见地的。最近的一项工作 [25] 结合了几种技术,包括 Leaky ReLU、最大范数和仔细初始化。在 ImageNet 上,它表明具有 147M 参数的普通 ConvNet 可以达到 74.6% 的 top-1 准确率,比其报告的基线(ResNet-101, 76.6%, 45M 参数)低 2%。

值得注意的是,这篇论文不仅仅是一个简单的模型可以很好地收敛的证明,也不打算训练像 ResNets 这样非常深的 ConvNets。相反,我们的目标是建立一个简单的模型,具有合理的深度和有利的精度-速度权衡,可以使用最常见的组件(例如,常规 conv 和 BN)和简单的代数来简单地实现。

2.3. Model Re-parameterization

DiracNet [39] 是一种与我们相关的重新参数化方法它通过将卷积层的内核编码为 ^W = diag(a)I + diag(b)Wnorm 来构建深层平面模型,其中 ^W 是用于卷积的最终权重(将 4 阶张量视为矩阵),a 和 b是学习向量,Wnorm 是归一化的可学习核。与具有相当数量参数的 ResNet 相比,DiracNet 的 top-1 准确率在 CIFAR100 上低 2.29%(78.46% vs. 80.75%),在 ImageNet 上低 0.62%(DiracNet-34 的 72.21% vs. ResNet-的 72.83%) 34)。 DiracNet 在两个方面与我们的方法不同

  • 1)RepVGG 的训练时间行为是由实际数据流通过具体结构实现的,该结构稍后可以转换为另一种结构,而 DiracNet 仅使用 conv kernels 的另一种数学表达式,以便于优化。换句话说,训练时的 RepVGG 是真正的多分支模型,但 DiracNet 不是

  • 2)DiracNet 的性能高于通常参数化的普通模型,但低于可比较的 ResNet,而 RepVGG 模型的性能大大优于 ResNet。

Asym Conv Block (ACB) [10]、DO-Conv [1] 和 ExpandNet [11] 在将块转换为 conv 的意义上也可以被视为结构重新参数化。与我们的方法相比,不同之处在于它们是为组件级改进而设计的,并可以直接替代任何架构中卷积层,而我们的结构重新参数化对于训练普通卷积网络至关重要,如 Sect. 4.2 所述

2.4. Winograd Convolution

在这里插入图片描述
RepVGG 仅使用 3 × 3 卷积,因为它在 GPU 和 CPU 上被一些现代计算库(如 NVIDIA cuDNN [2] 和 Intel MKL [18])高度优化。表 1 显示了在 1080Ti GPU 上使用 cuDNN 7.5.0 测试的理论 FLOP、实际运行时间和计算密度(以每秒 Tera 浮点运算数,TFLOPS 衡量)。3×3 conv 的理论计算密度大约是其他的 4 倍,表明总的理论 FLOPs 不能代表不同架构之间的实际速度。 Winograd [20] 是加速 3 × 3 卷积的经典算法(仅当步幅为 1 时),已被 cuDNN 和 MKL 等库很好地支持(并默认启用)。例如,使用标准 F (2 × 2, 3 × 3) Winograd,3×3 conv 的乘法量 (MUL) 减少到原始的 4/9。由于乘法比加法更耗时,我们计算 MUL 以测量带有 Winograd 支持的计算成本(在表 4、5 中由 Wino MUL 表示)。请注意,具体的计算库和硬件决定是否对每个算子使用 Winograd,因为小规模卷积可能由于内存开销而无法加速。

3. Building RepVGG via Structural Re-param

3.1. Simple is Fast, Memory-economical, Flexible

使用简单的 ConvNet 至少有三个原因:它们快速、节省内存和灵活

Fast 许多最近的多分支架构的理论 FLOP 比 VGG 低,但可能不会运行得更快。例如,VGG-16 的 FLOPs 是 EfficientNet-B3 [35] 的 8.4 倍,但在 1080Ti 上运行速度快 1.8 倍(表 4),这意味着前者的计算密度是后者的 15 倍。除了 Winograd conv 带来的加速之外,FLOPs 和速度之间的差异可以归因于两个对速度有很大影响但 FLOPs 没有考虑到的重要因素:内存访问成本(MAC)和并行度 [24 ]。例如,尽管所需的分支加法或级联计算可以忽略不计,但 MAC 很重要。此外,MAC 在分组卷积中占时间使用的很大一部分。另一方面,在相同的 FLOP 下,具有高度并行性的模型可能比另一个并行度低的模型快得多。由于多分支拓扑在 Inception 和自动生成的架构中被广泛采用,因此使用多个小型算子而不是几个大型算子。之前的工作 [24] 报道了 NASNET-A [43] 中的碎片化算子的数量(即一个构建块中的单个 conv 或池化操作的数量)为 13,这对 GPU 等具有强大并行计算能力的设备不友好并引入了额外的开销,例如内核启动和同步。相比之下,这个数字在 ResNets 中是 2 或 3,我们将其设为 1:单个 conv。
在这里插入图片描述
Memory-economical 多分支拓扑是内存效率低的,因为每个分支的结果都需要保存到相加或连接,显着提高了内存占用的峰值。图 3 显示需要保留残差块的输入直到添加。假设块保持特征图大小,额外内存占用的峰值为输入的 2 倍。相反,普通拓扑允许在操作完成时立即释放特定层的输入所占用的内存。在设计专用硬件时,普通的 ConvNet 允许深度内存优化并降低内存单元的成本,以便我们可以将更多的计算单元集成到芯片上。

Flexible 多分支拓扑对架构规范施加了约束。例如,ResNet 要求将卷积层组织为残差块,这限制了灵活性,因为每个残差块的最后一个卷积层必须产生相同形状的张量,否则快捷添加将没有意义。更糟糕的是,多分支拓扑限制了通道修剪的应用[22, 14],这是一种去除一些不重要通道的实用技术,并且一些方法可以通过自动发现每层的适当宽度来优化模型结构 [8]。然而,多分支模型使修剪变得棘手,并导致显着的性能下降或低加速比 [7, 22, 9]。相比之下,简单的架构允许我们根据我们的要求自由配置每个 conv 层并进行修剪以获得更好的性能-效率权衡

3.2. Training-time Multi-branch Architecture

Plain ConvNets 有很多优点,但有一个致命的弱点:性能不佳。例如,使用像 BN [19] 这样的现代组件,VGG-16 在 ImageNet 上可以达到 72% 以上的 top-1 准确率,这似乎已经过时了。我们的结构重参数化方法受到 ResNet 的启发,它显式地构造了一个快捷分支来将信息流建模为 y = x + f(x),并使用残差块来学习 f当 x 和 f(x) 的维度不匹配时,就变成了y = g(x)+f(x),其中g(x)是一个1×1 conv实现的卷积shortcut。 ResNets 成功的一个解释是,这种多分支架构使模型成为许多较浅模型的隐式集合 [36]。具体来说,对于 n 个块,该模型可以解释为 2n 个模型的集合,因为每个块将流分支成两条路径

由于多分支拓扑在推理方面存在缺陷,但分支似乎有利于训练 [36],因此我们使用多个分支来制作多个模型的仅训练时间集合。为了使大多数成员更浅或更简单,我们使用类似 ResNet 的identity(仅当维度匹配时)和 1 × 1 分支,以便构建块的训练时间信息流为 y = x + g(x) + f(x)。我们简单地堆叠几个这样的块来构建训练时间模型。从与 [36] 相同的角度来看,该模型成为具有 n 个此类块的 3n 个成员的集合。

3.3. Re-param for Plain Inference-time Model

在这里插入图片描述
在本小节中,我们将描述如何将经过训练的块转换为单个 3 × 3 卷积层以进行推理。我们在 addition 之前在每个分支中使用 BN(图 4)。形式上,使用 W ( 3 ) ∈ R C 2 × C 1 × 3 × 3 W^{(3)} ∈ \mathbb{R}^{C_2×C_1×3×3} W(3)RC2×C1×3×3 表示具有 C 1 C_1 C1 输入通道和 C 2 C_2 C2 输出通道的 3×3 卷积层的内核, W ( 1 ) ∈ R C 2 × C 1 W^{(1)} ∈ \mathbb{R}^{C_2×C_1} W(1)RC2×C1 表示 1 × 1 的内核分支。使用 μ ( 3 ) , σ ( 3 ) , γ ( 3 ) , β ( 3 ) μ^{(3)}, σ^{(3)}, γ^{(3)}, β^{(3)} μ(3),σ(3),γ(3),β(3) 作为 BN 层在 3 × 3 conv 后的BN层的累积平均值、标准偏差和学习的比例因子和偏差, μ ( 1 ) , σ ( 1 ) , γ ( 1 ) , β ( 1 ) μ^{(1)}, σ^{(1)}, γ^{(1)}, β^{(1)} μ(1),σ(1),γ(1),β(1) 用于 1 × 1 conv 后的BN, μ ( 0 ) , σ ( 0 ) , γ ( 0 ) , β ( 1 ) μ^{(0)}, σ^{(0)}, γ^{(0)}, β^{(1)} μ(0),σ(0),γ(0),β(1) 表示 identity 分支。令 M ( 1 ) ∈ R N × C 1 × H 1 × W 1 M^{(1)} ∈ \mathbb{R}^{N×C_1×H_1×W_1} M(1)RN×C1×H1×W1 M ( 2 ) ∈ R N × C 2 × H 2 × W 2 M^{(2)} ∈ \mathbb{R}^{N×C_2×H_2×W_2} M(2)RN×C2×H2×W2 分别为输入和输出,* 为卷积算子。如果 C1 = C2,H1 = H2,W1 = W2,我们有
在这里插入图片描述
否则,我们只是不使用恒等分支,因此上述等式只有前两项。这里 bn 是推理时间 BN 函数,形式上,∀1 ≤ i ≤ C2,
在这里插入图片描述
我们首先将每个 BN 及其前面的 conv 层转换为带有偏置向量的 conv。令 {W0, b0} 为从 {W, µ, σ, γ, β} 转换而来的内核和偏差,我们有
在这里插入图片描述
这种转换也适用于恒等分支,因为恒等可以被视为以恒等矩阵为内核的 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 层应该有 padding = 0

3.4. Architectural Specification

在这里插入图片描述

表 2 显示了 RepVGG 的规格,包括深度和宽度。RepVGG 是 VGG 风格,因为它采用简单的拓扑结构并大量使用 3 × 3 卷积,但它不像 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 层来构造一个名为 RepVGG-A 的实例。我们还构建了一个更深的 RepVGG-B,它在 stage2、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,我们缩小 stage1 但不放大,因此 stage1 的宽度为 min(64, 64a)。

为了进一步减少参数和计算,我们可以选择将 groupwise 3 × 3 conv 层与密集层交错,以牺牲准确性来提高效率。具体来说,我们为 RepVGG-A 的第 3、5、7、…、21 层以及 RepVGG-B 的第 23、25 和 27 层设置组数 g。为简单起见,我们将这些层的 g 全局设置为 1、2 或 4,而无需逐层调整。我们不使用相邻的分组卷积层,因为这会禁用通道间信息交换并带来副作用[41]:来自某个通道的输出将仅来自一小部分输入通道。请注意,1×1 分支应具有与 3×3 转换相同的 g

4. Experiments

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

4.1. RepVGG for ImageNet Classification

我们将 RepVGG 与 ImageNet-1K [6] 上的经典和最新模型进行比较,包括 VGG-16 [31]、ResNet [12]、ResNeXt [38]、EfficientNet [35] 和 RegNet [28],其中包含 128 万张用于训练的图像和 5 万张用于验证的图像。我们分别使用 EfficientNet-B0/B3 和 RegNet3.2GF/12GF 作为中量级和重量级最先进模型的代表。我们改变乘数 a 和 b 以生成一系列 RepVGG 模型以与基线进行比较(表 3)。
在这里插入图片描述
我们首先将 RepVGG 与 ResNets [12] 进行比较,这是最常见的基准。我们分别使用 RepVGA0/A1/A2 与 ResNet-18/34/50 进行比较。为了与更大的模型进行比较,我们构建了更深的 RepVGG-B0/B1/B2/B3,宽度增加。对于那些具有交错分组层的 RepVGG 模型,我们将 g2/g4 后缀到模型名称。

为了训练轻量级和中量级模型,我们仅使用简单的数据增强管道,包括随机裁剪和左右翻转,遵循官方 PyTorch 示例 [27]。我们在 8 个 GPU 上使用 256 的全局批大小,初始化为 0.1 的学习率和 120 个 epoch 的余弦退火,标准 SGD,动量系数为 0.9,在卷积层和全连接层的内核上权重衰减为 10-4。对于包括 RegNetX-12GF、EfficientNet-B3 和 RepVGG-B3 在内的重量级模型,我们使用 5-epoch 预热、200 个 epoch 的余弦学习率退火、标签平滑 [34] 和 mixup [40](如下 [13]),以及Autoaugment [5] 的数据增强管道,随机裁剪和翻转。 RepVGG-B2 及其 g2/g4 变体在这两种设置中都进行了训练。我们在 1080Ti GPU 4 上测试每个批次大小为 128 的模型的速度,首先输入 50 个批次以预热硬件,然后记录 50 个批次并记录时间使用情况。为了公平比较,我们在同一个 GPU 上测试了所有模型,并且基线的所有 conv-BN 序列也被转换为带有偏差的 conv(公式 3)。
在这里插入图片描述
表 4 显示了 RepVGG 有利的准确率-速度折衷:RepVGG-A0 在准确率和速度方面分别比 ResNet-18 好 1.25% 和 33%,RepVGGA1 比 ResNet-34 好 0.29%/64%,RepVGG-A2 是 0.17比 ResNet-50 好 %/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] 那样需要大量人力来细化设计空间,并且架构超参数设置随意,这令人印象深刻。
在这里插入图片描述
作为计算复杂度的两个代理,我们计算了理论 FLOPs 和 Wino MULs,如 Sect 中所述。 2.4.例如,我们发现 EfficientNet-B0/B3 中的所有 conv 都没有被 Winograd 算法加速。桌子。图 4 显示 Wino MUL 是 GPU 上更好的代理,例如,ResNet-152 运行速度比 VGG-16 慢,理论 FLOP 更低,但 Wino MUL 更高。当然,实际速度应该始终是黄金标准

4.2. Structural Re-parameterization is the Key

在这里插入图片描述
在本小节中,我们验证了结构重新参数化技术的重要性(表 6)。所有模型都使用上述相同的简单训练设置从头开始训练 120 个 epoch。首先,我们通过从 RepVGG-B0 的每个块中删除identity和/或 1×1 分支来进行消融研究。移除两个分支后,训练时模型降级为普通的普通模型,准确率仅达到 72.39%。 1×1的准确率提高到73.15%,同一性的准确率提高到74.79%。全功能 RepVGGB0 的准确率为 75.14%,比普通平原模型高 2.75%。从训练时(即尚未转换)模型的推理速度来看,通过结构重参数化去除恒等和 1×1 分支带来了显着的加速。
在这里插入图片描述
然后我们构建了一系列变体和基线,用于在 RepVGG-B0 上进行比较(表 7)。同样,所有模型都是在 120 个 epoch 中从头开始训练的。

  • Identity w/o BN 删除identity分支中的 BN。
  • 添加后BN 去除三个分支中的BN 层,并在添加后追加一个BN 层。换句话说,BN的位置从pre-addition变为post-addition。
  • 分支中的+ReLU 将ReLU 插入每个分支(BN 之后和加法之前)。由于这样的块不能转化为单个conv层,所以没有实际用处,我们只是想看看更多的非线性是否会带来更高的性能。
  • DiracNet [39] 采用精心设计的卷积核重新参数化,如 Sect2.2. 中介绍的那样。我们使用它的官方 PyTorch 代码来构建层来替换原来的 3 × 3 conv。
  • Trivial Re-param 是通过直接向 3 × 3 内核添加恒等内核来对 conv 内核进行更简单的重新参数化,可以将其视为 DiracNet 的退化版本 (^W = I + W [39])。
  • 非对称Conv Block (ACB) [10] 可以被视为另一种形式的结构重新参数化。我们与 ACB 进行比较,看看我们的结构重新参数化的改进是否是由于组件级的过度参数化(即额外的参数使每 3 × 3 转换更强)。
  • Residual Reorg 通过以类似 ResNet 的方式重新组织每个阶段(每个块 2 层)来构建每个阶段。具体来说,生成的模型在第一个和最后一个阶段有一个 3×3 层,在第 2、3、4 阶段有 2、3、8 个残差块,并使用类似于 ResNet-18/34 的快捷方式。

我们认为structural re-param优于DiractNet和Trivial Re-param的优势在于前者依赖于通过具有非线性行为(BN)的具体结构的实际数据流,而后者仅使用conv kernels的另一种数学表达式.前者的“re-param”是指“使用一个结构的参数来参数化另一个结构”,而后者的意思是“先用另一组参数计算参数,然后将它们用于其他计算”。对于像训练时间 BN 这样的非线性组件,前者不能被后者逼近。作为证据,通过移除 BN 会降低准确率,而通过添加 ReLU 会提高准确率。换句话说,虽然 RepVGG 块可以等效地转换为单个 conv 进行推理,但推理时间等价并不意味着训练时间等价,因为我们不能构造一个卷积层以具有与 RepVGG 块相同的训练时间行为。

与 ACB 的比较表明 RepVGG 的成功不应简单地归因于每个组件的过度参数化的影响,因为 ACB 使用更多的参数但产生的性能较差。作为双重检查,我们用 RepVGG 块替换 ResNet-50 的每个 3×3 卷积,并从头开始训练 120 个 epoch。准确度为 76.34%,仅比 ResNet-50 基线高 0.03%,这表明 RepVGGstyle 结构重参数化不是通用的过参数化技术,而是训练强大的普通 ConvNet 的关键方法。与 Residual 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 在 Cityscapes [4] 上的语义分割的泛化性能(表 8)。我们使用 PSPNet [42] 框架,一个多元学习率策略,基数为 0.01,功率为 0.9,权重衰减为 10-4,全局批量大小为 16,在 8 个 GPU 上运行 40 个 epoch。为了公平比较,我们仅将 ResNet-50/101 主干更改为 RepVGG-B1g2/B2 并保持其他设置相同。继官方 PSPNet-50/101 [42] 在 ResNet-50/101 的最后两个阶段使用 dilated conv 之后,我们还将 RepVGG-B1g2/B2 的最后两个阶段中的所有 3×3 卷积层进行了扩张。然而,目前 3 × 3 dilated conv 的低效实现(尽管 FLOPs 与 3 × 3 常规 conv 相同)减慢了推理速度。为了便于比较,我们只在最后 5 层(即 stage4 的最后 4 层和 stage5 的唯一层)构建另外两个 PSPNets(用 fast 表示),这样 PSPNets 的运行速度略快于ResNet-50/101-backbone 对应物。 RepVGG 骨干网在平均 IoU 方面的性能分别比 ResNet-50 和 ResNet-101 高 1.71% 和 1.01%,速度更快,而 RepVGG-B1g2-fast 在 mIoU 方面的性能比 ResNet-101 骨干网高 0.37,运行速度快 62%。有趣的是,扩张似乎对较大的模型更有效,因为与 RepVGG-B1g2-fast 相比,使用更多扩张的卷积层并没有提高性能,但将 RepVGG-B2 的 mIoU 提高了 1.05%,并有合理的减速

4.4. Limitations

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

5. Conclusion

我们提出了 RepVGG,这是一种简单的架构,具有 3 × 3 conv 和 ReLU 的堆栈,特别适用于 GPU 和专用推理芯片。使用我们的结构重新参数化方法,它在 ImageNet 上达到了 80% 以上的 top-1 准确度,并且与最先进的模型相比,表现出良好的速度-准确度权衡。

猜你喜欢

转载自blog.csdn.net/weixin_39653948/article/details/124898109
VGG