RepVGG :让卷积再次伟大

Posted AI浩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RepVGG :让卷积再次伟大相关的知识,希望对你有一定的参考价值。

摘要

我们提出了一个简单但功能强大的卷积神经网络架构,它具有类似 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、简介

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

尽管许多复杂的 ConvNet 比简单的 ConvNet 提供更高的准确度,但缺点也很明显。
1)复杂的多分支设计(例如ResNet中的residualaddition和Inception中的branch-concatenation)使模型难以实现和定制,减慢推理速度并降低内存利用率。
2)某些组件(例如,Xception [3] 和 MobileNets [16, 30] 中的 depthwise conv 和 ShuffleNets [24, 41] 中的通道 shuffle)增加了内存访问成本并且缺乏各种设备的支持。 由于影响推理速度的因素众多,浮点运算(FLOP)的数量并不能准确反映实际速度。 尽管一些新模型的 FLOP 比 VGG 和 ResNet-18/34/50 [12] 等老式模型低,但它们可能不会运行得更快(表 4)。 因此,VGG 和原始版本的 ResNets 仍然大量用于学术界和工业界的实际应用。

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

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

由于多分支架构的好处都是用于训练,而缺点是不适合推理,我们建议通过结构重新参数化将训练时多分支和推理时普通架构解耦,这意味着将架构从一种转换为另一种 通过转换其参数。 具体来说,一个网络结构与一组参数相耦合,例如,一个卷积层由一个四阶核张量表示。 如果某个结构的参数可以转换成另一个结构耦合的另一组参数,我们可以等效地用后者替换前者,从而改变整个网络架构。

具体来说,我们使用恒等和 1×1 分支构建训练时 RepVGG,这受到 ResNet 的启发,但以不同的方式可以通过结构重新参数化来移除分支(图 2,4)。训练后,我们用简单的代数进行变换,因为一个恒等分支可以看成是一个退化的1×1 conv,而后者又可以进一步看成是一个退化的3×3 conv,这样我们就可以构造一个单一的3× 3 内核,具有原始3 × 3 卷积核、恒等和 1 × 1 分支以及批量归一化 (BN) [19] 层的参数。 因此,转换后的模型有一个 3 × 3 的 convlayer 堆栈,用于测试和部署。

值得注意的是,推理时间 RepVGG 的主体只有一种类型的算子:3 × 3 conv 后跟 ReLU,这使得 RepVGG 在 GPU 等通用计算设备上运行速度更快。 更好的是,RepVGG 允许专用硬件实现更高的速度,因为考虑到芯片尺寸和功耗,我们需要的运算符类型越少,我们可以集成到芯片上的计算单元就越多。 因此,专门用于 RepVGG 的推理芯片可以具有大量的 3×3-ReLU 单元和更少的内存单元(因为普通拓扑结构是内存经济的,如图 3 所示)。 我们的贡献总结如下:

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

2、相关工作

2.1、从单路径到多分支

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

2.2、单路径模型的有效训练

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

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

2.3、模型重新参数化

DiracNet [39] 是一种与我们相关的重新参数化方法。它通过将卷积层的内核编码为 W ^ = diag ⁡ ( a ) I + diag ⁡ ( b ) W norm  \\hatW=\\operatornamediag(\\mathbfa) \\mathrmI+\\operatornamediag(\\mathbfb) \\mathrmW_\\text norm W^=diag(a)I+diag(b)Wnorm  来构建深层平面模型,其中 W ^ \\hatW W^ 是用于卷积的最终权重(被视为矩阵的 4 阶张量),a和 b 是学习向量,Wnorm 是归一化的可学习核。与参数数量相当的 ResNet 相比,DiracNet 的 top-1 准确率在 CIFAR-100 上低 2.29%(78.46% vs. 80.75%),在 ImageNet 上低 0.62%(DiracNet-34 的 72.21% vs. 72.83% ResNet-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 的意义上也可以被视为结构重新参数化。与我们的方法相比,不同之处在于它们是为组件级改进而设计的,并用作任何架构中卷积层的直接替代品,而我们的结构重新参数化对于训练普通卷积网络至关重要,如第 4.2 节所示。

2.4、Winograd卷积

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 conv 的经典算法(仅当步幅为 1 时),已被 cuDNN 和 MKL 等库很好地支持(并默认启用)。例如,使用标准 F(2 × 2,3 × 3) Winograd,3×3 conv 的乘法 (MUL) 数量减少到原始的 49。由于乘法比加法更耗时,我们计算 MUL 以测量带有 Winograd 支持的计算成本(在表 4、5 中用 WinoMUL 表示)。请注意,具体的计算库和硬件决定是否对每个算子使用 Winograd,因为小规模卷积可能由于内存开销而无法加速。

3、通过 Structural Re-param 构建 RepVGG

3.1、 简单就是快速、节省内存、灵活

使用简单的 ConvNet 至少有三个原因:它们快速、节省内存和灵活。
快速 许多最近的多分支架构的理论 FLOP 比 VGG 低,但运行速度可能不会更快。例如,VGG-16 与 EfficientNet-B3 [35] 相比具有 8:4× FLOP,但在 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。

节省内存 多分支拓扑的内存效率低,因为每个分支的结果都需要保存到相加或连接,显着提高了内存占用的峰值。 图 3 显示需要保留残差块的输入直到添加。 假设块保持特征图大小,额外内存占用的峰值为输入的2倍。 相反,普通拓扑允许在操作完成时立即释放特定层的输入所占用的内存。 在设计专用硬件时,普通的 ConvNet 允许深度内存优化并降低内存单元的成本,以便我们可以将更多的计算单元集成到芯片上。
灵活 多分支拓扑对架构规范施加了约束。 例如,ResNet 要求将 conv 层组织为残差块,这限制了灵活性,因为每个残差块的最后一个 conv 层必须产生相同形状的张量,否则快捷添加将没有意义。更糟糕的是,多 分支拓扑限制了通道修剪的应用[22, 14],这是一种去除一些不重要通道的实用技术,一些方法可以通过自动发现每层的适当宽度来优化模型结构[8]。 然而,多分支模型使修剪变得棘手,并导致显着的性能下降或低加速比 [7, 22, 9]。 相比之下,简单的架构允许我们根据我们的要求自由配置每个 conv 层并进行修剪以获得更好的性能-效率权衡。

3.2、训练时多分支架构

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

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

3.3、重新参数模型的推理时间

在本小节中,我们将描述如何将经过训练的块转换为单个 3 × 3 卷积层以进行推理。 请注意,我们在添加之前在每个分支中使用 BN(图 4)。 形式上,我们使用 W ( 3 ) ∈ R C 2 × C 1 × 3 × 3 \\mathbfW^(3) \\in \\mathbbR^C_2 \\times C_1 \\times 3 \\times 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 \\mathbfW^(1) \\in \\mathbbR^C_2 \\times C_1 W(1)RC2×C1 表示 1 的内核 × 1 个分支。 我们使用 μ ( 3 ) \\boldsymbol\\mu^(3) μ(3); σ ( 3 ) \\boldsymbol\\sigma^(3) σ(3); γ ( 3 ) \\boldsymbol\\gamma^(3) γ(3); β ( 3 ) \\boldsymbol\\beta^(3) β(3) 作为 BN 层在 3 × 3 conv 之后的累积均值、标准偏差和学习的比例因子和偏差, μ ( 1 ) \\boldsymbol\\mu^(1) μ(1); σ ( 1 ) \\boldsymbol\\sigma^(1) σ(1); γ ( 1 ) \\boldsymbol\\gamma^(1) γ(1); β ( 1 ) \\boldsymbol\\beta^(1) β(1) 用于 BN 以下 1 × 1 conv 和 μ ( 0 ) \\boldsymbol\\mu^(0) μ(0); σ ( 0 ) \\boldsymbol\\sigma^(0) σ(0); γ ( 0 ) \\boldsymbol\\gamma^(0) γ(0); β ( 0 ) \\boldsymbol\\beta^(0) β(0)用于恒等分支。 令 M ( 1 ) ∈ R N × C 1 × H 1 × W 1 \\mathbfM^(1) \\in \\mathbbR^N \\times C_1 \\times H_1 \\times W_1 M(1)RN×C1×H1×W1 M ( 2 ) ∈ R N × C 2 × H 2 × W 2 \\mathbfM^(2) \\in \\mathbbR^N \\times C_2 \\times H_2 \\times W_2 M(2)RN×C2×H2×W2分别为输入和输出,*为卷积算子。 如果 C1 = C2; H1 = H2; W1 = W2,我们有
M ( 2 ) = bn ⁡ ( M ( 1 ) ∗   W ( 3 ) , μ ( 3 ) , σ ( 3 ) , γ ( 3 ) , β ( 3 ) ) + bn ⁡ ( M ( 1 ) ∗   W ( 1 ) , μ ( 1 ) , σ ( 1 ) , γ ( 1 ) , β ( 1 ) ) + bn ⁡ ( M ( 1 ) , μ ( 0 ) , σ ( 0 ) , γ ( 0 ) , β ( 0 ) ) (1) \\beginaligned \\mathrmM^(2) &=\\operatornamebn\\left(\\mathrmM^(1) * \\mathrm~W^(3), \\boldsymbol\\mu^(3), \\boldsymbol\\sigma^(3), \\boldsymbol\\gamma^(3), \\boldsymbol\\beta^(3)\\right) \\\\ &+\\operatornamebn\\left(\\mathrmM^(1) * \\mathrm~W^(1), \\boldsymbol\\mu^(1), \\boldsymbol\\sigma^(1), \\gamma^(1), \\boldsymbol\\beta^(1)\\right) \\\\ &+\\operatornamebn\\left(\\mathrmM^(1), \\boldsymbol\\mu^(0), \\boldsymbol\\sigma^(0), \\boldsymbol\\gamma^(0), \\boldsymbol\\beta^(0)\\right) \\endaligned \\tag1 M

以上是关于RepVGG :让卷积再次伟大的主要内容,如果未能解决你的问题,请参考以下文章

QARepVGG:让RepVGG再次强大:一种量化感知的方法

RepVgg实战:使用RepVgg实现图像分类

RepVgg实战:使用RepVgg实现图像分类

YOLOv5/v7 引入 RepVGG 重参数化模块

repVGG论文笔记

RepVGG:极简架构,SOTA性能,论文解读