重参数化的卷积模型:RepVGG,DBB

2021-01-12  本文已影响0人  Valar_Morghulis

本文介绍丁霄汉等人在CVPR2021发表的两篇重参数化卷积模型。

目录:

1. RepVGG

2. DBB


RepVGG: Making VGG-style ConvNets Great Again

CVPR2021

原文:https://arxiv.org/abs/2101.03697

开源:https://github.com/megvii-model/RepVGG

摘要:我们提出了一种简单而强大的卷积神经网络架构,它具有类似VGG的推理时间体,由3x3卷积和ReLU组成,而训练时间模型具有多分支拓扑结构。这种训练时间和推理时间结构的解耦是通过一种结构再参数化技术来实现的,因此该模型被命名为RepVGG。在ImageNet上,RepVGG达到了80%以上的top-1精度,据我们所知,这是第一次使用plain模型。在nvidia1080tigpu上,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) 一些组件(例如,depthwise conv in Exception[3]和MobileNet[16,30]以及ShuffeNet[24,41]中的通道混洗)增加了内存访问成本,并且缺乏对各种设备的支持。由于影响推理速度的因素很多,浮点运算(FLOPs)的数量不能准确反映实际速度。尽管一些新型模型的FLOPs低于老式模型(如VGG和ResNet-18/34/50[12]),但它们可能运行得不快(表4)。因此,VGG和ResNet的原始版本仍然大量用于学术界和工业界的现实世界的应用。

在本文中,我们提出了RepVGG,这是一种VGG风格的网络结构,其性能优于许多复杂的模型(图1)。RepVGG具有以下优点。

•    该模型具有类似VGG的plain(也称为前馈)拓扑(注释1),没有任何分支,这意味着每一层都将其唯一的前一层的输出作为输入,并将输出馈入其唯一的后一层。(注释1:在本文中,网络拓扑只关注组件如何连接到其他组件,架构(architecture)指的是拓扑以及组件(如深度和宽度)的规范,结构可以指架构的任何组件或部分。可能存在少许误译)

•    模型主体仅使用3×3 conv和ReLU。

•    离散架构(包括特定深度和层宽)在没有自动搜索[44]、手动细化[28]、复合缩放[35]或其他重型设计的情况下实例化。

普通模型(plain)要达到与多分支网络结构相当的性能水平是一个挑战。一种解释是,多分支拓扑(如ResNet)使模型成为众多较浅模型的隐式集合[36],因此训练多分支模型可避免梯度消失问题。

由于多分支网络结构的优点都是用于训练,缺点是推理速度慢,因此我们建议通过结构重新参数化将训练时间多分支网络结构与推理时间plain网络结构解耦,即通过转换其参数将网络结构从一个网络结构转换为另一个网络结构。具体而言,网络结构与一组参数耦合,例如,conv层由四阶核张量表示(4th-order kernel tensor)。如果某个结构的参数可以转换为另一个结构耦合的另一组参数,我们可以用后者等价地替换前者,从而改变整个网络架构。

To be specific, a network structure is coupled with a set of parameters, e.g., a conv layer is represented by a 4th-order kernel tensor. If the parameters of a certain structure can be converted into another set of parameters coupled by another structure, we can equivalently replace the former with the latter, so that the overall network architecture is changed.

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

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

•    我们提出了RepVGG,这是一种简单的网络结构,与现有技术相比,具有良好的速度-精度权衡。

•    我们建议使用结构重参数化将训练时多分支拓扑与推理时plain架构解耦。

•    我们展示了RepVGG在图像分类和语义分割方面的有效性,以及实现的效率和易用性。

2. 相关工作

2.1.  从单路径到多分支

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

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

有人试图在没有分支机构的情况下培训convnet。然而,以前的工作主要是试图使非常深的模型以合理的精度收敛,但没有达到比复杂模型更好的性能。因此,这些方法和结果模型既不简单也不实用。提出了一种初始化方法[37],用于训练极深的plain网络。使用基于平均场理论的方案,10000层网络在MNIST上的训练精度超过99%,在CIFAR-10上的训练精度超过82%。尽管这些模型并不实用(即使LeNet-5[21]在MNIST上的准确率也可以达到99.3%,而VGG-16在CIFAR10上的准确率可以达到93%以上),但理论贡献是深刻的。最近的一项工作[25]结合了几种技术,包括LeakyReLU、max-norm和仔细初始化。在ImageNet上,它显示具有147M参数的普通ConvNet可以达到74.6%的top-1精度,比其报告的基线(ResNet-101、76.6%、45M参数)低2%。值得注意的是,本文不仅证明了普通模型可以很好地收敛,而且不打算像ResNet那样训练极深的convnet。相反,我们的目标是建立一个具有合理深度和良好精度-速度权衡的简单模型,该模型可以通过最常见的组件(例如,常规卷积和BN)和简单代数简单实现。

Notably, this paper is not merely a demonstration that plain models can converge reasonably well, and does not intend to train extremely deep ConvNets like ResNets.

2.3. 模型重参数化

DiracNet[39]是一种与我们相关的重新参数化方法。它通过将conv层的核编码为\hat{\mathrm{W}}=\text{diag}(\mathbf{a})\mathrm{I} + \text{diag}(\mathbf{b})\mathrm{W}_{\text{norm}}来构建深plain模型,其中\hat{\mathrm{W}}是用于卷积的最终权重(被视为矩阵的4阶张量),\mathbf{a}\mathbf{b}是学习向量,\mathrm{W}_{\text{norm}}是归一化的可学习的核。与具有可比参数量的ResNet相比,DiracNet的顶级精度在CIFAR100上降低了2.29%(78.46%对80.75%),在ImageNet上降低了0.62%(DiracNet-34的72.21%对ResNet-34的72.83%)。DiracNet在两个方面与我们的方法不同:1) RepVGG的trainingtime行为由通过具体结构的实际数据流实现,该结构可在以后转换为另一个结构,而DiracNet仅使用另一个conv内核的数学表达式,以便于优化。换句话说,训练时RepVGG是一个真正的多分支模型,而DiracNet则不是。2) DiracNet的性能高于通常参数化的普通模型,但低于可比的ResNet,而RepVGG模型的性能大大优于ResNet。Asym Conv Block(ACB)[10]、DO Conv[1]和ExpandNet[11]也可以被视为结构再参数化,因为它们将块转换为Conv。与我们的方法相比,它们的不同之处在于,它们是为组件级改进而设计的,并在任何网络结构中用作Conv层的替代品,而我们的结构重新参数化对于训练普通网络至关重要,如第4.2节所示。

2.4. Winograd卷积

RepVGG仅使用3×3 conv,因为它在GPU和CPU上被一些现代计算库(如NVIDIA cuDNN[2]和Intel MKL[18])高度优化。表1显示了在1080Ti GPU上用cuDNN 7.5.0测试的理论FLOPs、实际运行时间和计算密度(以每秒Tera浮点运算(TFLOPS))(注释2)。3×3 conv的理论计算密度约为其他结构的4×,这表明理论上的总FLOPs次数并不能代表不同结构之间的实际速度。Winograd[20]是一种用于加速3×3 conv的经典算法(仅当步幅为1时),cuDNN和MKL等库都很好地支持(并默认启用)。例如,使用标准F(2\times2, 3\times3)Winograd,3×3 conv的乘法量(MULs)减少到原来的49。由于乘法比加法耗时得多,因此我们计算MUL来衡量Winograd支持下的计算成本(表4、5中用Wino MUL表示)。请注意,特定的计算库和硬件决定是否为每个操作符使用Winograd,因为小规模卷积可能不会由于内存开销而加速。(注释3)

注释2和注释3

3 通过结构参数重建RepVGG

3.1 Simple速度快、内存经济、灵活

使用简单convnet至少有三个原因:它们速度快、内存经济且灵活。

快    许多最近的多分支网络结构的理论FLOPs低于VGG,但可能运行得不快。例如,VGG-16的FLOPs为8.4倍于EfficientNet-B3[35],但在1080Ti上的运算速度要快1.8倍(表4),这意味着前者的计算密度为后者的15倍。除了Winograd conv带来的加速外,FLOPs和速度之间的差异可归因于两个重要因素,这两个因素对速度有相当大的影响,但FLOPs没有考虑到:内存访问成本(MAC)和并行度[24](degree of parallelism)。例如,尽管分支相加或拼接的计算是可忽略的,但是却造成了MAC的明显增加。

此外,MAC在分组卷积中占很大一部分时间。另一方面,在相同的FLOPs下,具有高并行度的模型可能比具有低并行度的模型快得多。由于多分支拓扑在初始和自动生成的网络结构中被广泛采用,因此使用了多个小操作符而不是几个大操作符。先前的一项工作[24]报告说,NASNET-A[43]中的分段运算符(即一个构建块中的单个conv或池操作数)为13,这对具有强大并行计算能力的设备(如GPU)来说是不友好的,并引入了额外的开销,如内核启动和同步。相比之下,这个数字在ResNet中是2或3,我们将其设为1:a single conv。(文献24是ShuffleNetv2)

内存经济型    多分支拓扑的内存效率很低,因为每个分支的结果都需要保留到加法或级联为止,这大大提高了内存占用的峰值。图3示出需要保持对剩余块的输入直到加法。假设块保持特征映射大小,额外内存占用的峰值为输入的2倍。相反,普通拓扑允许在操作完成时立即释放特定层的输入占用的内存。在设计专用硬件时,普通的ConvNet允许深度内存优化,并降低内存单元的成本,以便我们可以将更多的计算单元集成到芯片上。

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

3.2. 训练时多分支网络结构

普通convnet有很多优点,但有一个致命的缺点:性能差。例如,使用BN[19]等现代组件,VGG-16可以在ImageNet上达到72%以上的top-1精度,这似乎已经过时了。我们的结构重新参数化方法受ResNet的启发,它显式构造了一个快捷分支,将信息流建模为y = x + f(x),并使用剩余块学习f。当xf(x)的维数不匹配时,它变为y = g(x) + f(x),其中 g(x)是由1×1 conv实现的卷积捷径。Resnet成功的一个解释是,这种多分支网络结构使模型成为众多较浅模型的隐式集合[36]。具体地说,对于n个块,模型可以解释为2^{n}个模型的集合,因为每个块将流分支成两条路径。

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

3.3. 推理时重参数化plain模型

在本小节中,我们将描述如何将经过训练的块转换为单个3×3 conv层进行推理。注意,在添加之前,我们在每个分支中使用BN(图4)。形式上,我们使用\mathrm{W}^{(3)}\in\mathbb{R}^{C_2\times C_1\times 3\times 3}表示具有C1输入通道和C2输出通道的3×3 conv层的核,以及\mathrm{W}^{(1)}\in\mathbb{R}^{C_2\times C_1}表示1×1分支的核。我们使用\vec{\mu}^{(3)},\vec{\sigma}^{(3)},\vec{\gamma}^{(3)},\vec{\beta}^{(3)}作为3×3 conv后BN层的累积平均值、标准偏差和学习的比例因子和偏差,对于1×1 conv后的BN,使用\vec{\mu}^{(1)},\vec{\sigma}^{(1)},\vec{\gamma}^{(1)},\vec{\beta}^{(1)},对于恒等分支,使用\vec{\mu}^{(0)},\vec{\sigma}^{(0)},\vec{\gamma}^{(0)},\vec{\beta}^{(0)}。设\mathrm{M}^{(\text{1})}\in\mathbb{R}^{N\times C_1\times H_1\times W_1}\mathrm{M}^{(\text{2})}\in\mathbb{R}^{N\times C_2\times H_2\times W_2}分别为输入和输出,\ast是卷积算子。如果C1=C2,H1=H2,W1=W2,我们有

\mathrm{M}^{(\text{2})} = \text{bn}(\mathrm{M}^{(\text{1})} \ast \mathrm{W}^{(3)},\vec{\mu}^{(3)},\vec{\sigma}^{(3)},\vec{\gamma}^{(3)},\vec{\beta}^{(3)})

+\text{bn}(\mathrm{M}^{(\text{1})} \ast \mathrm{W}^{(1)},\vec{\mu}^{(1)},\vec{\sigma}^{(1)},\vec{\gamma}^{(1)},\vec{\beta}^{(1)})

+\text{bn}(\mathrm{M}^{(\text{1})},\vec{\mu}^{(0)},\vec{\sigma}^{(0)},\vec{\gamma}^{(0)},\vec{\beta}^{(0)})    (1)

如果不满足C1=C2,H1=H2,W1=W2,我们简单地不使用恒等分支,因此上面的方程只有前两项。这里bn是推理时bn函数,形式上,\forall 1\leq i \leq C_2

\text{bn}(\mathrm{M},\mathbf{\vec{\mu}},\vec{\sigma},\vec{\gamma},\vec{\beta})_{:,i,:,:} = (\mathrm{M}_{:,i,:,:} - \vec{\mu}_i)\frac{\vec{\gamma}_i}{\vec{\sigma}_i} + \vec{\beta}_i \,.    (2)

我们首先将每个BN及其前面的conv层转换为带有偏置向量的conv。设\{\mathrm{W}^\prime,\mathbf{b}^\prime\}为从\{\mathrm{W},\vec{\mu},\vec{\sigma},\vec{\gamma},\vec{\beta}\}转化后的核与偏置,有:

\mathrm{W}^\prime_{i,:,:,:} = \frac{\vec{\gamma}_i}{\vec{\sigma}_i}\mathrm{W}_{i,:,:,:} \,,\quad \mathbf{b}^\prime_i = -\frac{\vec{\mu}_i \vec{\gamma}_i}{\vec{\sigma}_i} + \vec{\beta}_i \,.    (3)

那么很容易验证,对于\forall 1\leq i \leq C_2,有:

\text{bn}(\mathrm{M}\ast\mathrm{W},\vec{\mu},\vec{\sigma},\vec{\gamma},\vec{\beta})_{:,i,:,:} = (\mathrm{M} \ast \mathrm{W}^\prime)_{:,i,:,:} + \mathbf{b}^\prime_i \,.    (4)

这种转换也适用于恒等分支,因为恒等分支可以被视为以identity矩阵为核心的1×1 conv。在这样的变换之后,我们将有一个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. 架构定制化

表2显示了RepVGG的规格,包括深度和宽度。RepVGG是VGG风格的,因为它采用简单的拓扑结构,大量使用3×3 conv,但它不像VGG那样使用最大池,因为我们希望主体只有一种类型的操作符。我们将3×3层安排为5个阶段,阶段的第一层向下取样,步幅=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,它在阶段2、3和4中分别增加2层。我们使用RepVGG-A与其他轻量级和中量级模型竞争,包括ResNet-18/34/50,RepVGG-B与高性能模型竞争。

我们通过均匀缩放经典宽度设置[64、128、256、512](例如VGG和Resnet)来确定层宽度。我们使用乘数a缩放前四个阶段,b缩放最后一个阶段,通常设置b>a,因为我们希望最后一层具有更丰富的分类或其他下游任务特征。由于RepVGG在最后一个阶段只有一层,因此较大的b不会显著增加延迟或参数量。具体而言,stage2、3、4、5的宽度分别为[64a、128a、256a、512b]。为了避免在高分辨率特征图上出现大规模conv,如果a<1,我们将stage1缩小,但无论a如何我们不会使stage1的通道数大于64,以便stage1的宽度为\text{min}(64, 64a)

To avoid large-scale conv on high-resolution feature maps, we scale down stage1 if a < 1 but do not scale it up, so that the width of stage1 is min(64, 64a).

为了进一步减少参数和计算,我们可以选择将分组3×3 conv层与密集×3 conv层交错,以平衡精度和效率。具体而言,我们为RepVGG-A的第3层、第5层、第7层、…、第21层以及对RepVGG-B的额外的第23层、第25层和第27层设置了组g的数量。为简单起见,我们在不进行每层调整的情况下,将这些层的g全局设置为1、2或4。我们不使用相邻的groupwise conv层,因为这将禁用通道间的信息交换并带来副作用[41]:来自某个通道的输出将仅来自一小部分输入通道。注意,1×1分支应具有与3×3 conv相同的g

4. 实验

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

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模型,与基线进行比较(表3)。

我们首先将RepVGG与resnet[12]进行比较,resnet是最常见的基准。我们使用RepVGGA0/A1/A2分别与ResNet-18/34/50进行比较。为了与更大的模型进行比较,我们构造了更深的RepVGG-B0/B1/B2/B3,并增加了宽度。对于那些具有交错分组层的RepVGG模型,我们将g2/g4后缀到模型名称。

为了训练轻量级和中量级模型,我们只使用简单的数据扩充管道,包括随机裁剪和左右翻转,遵循官方的PyTorch示例[27]。我们在8GPU上使用256的全局批处理大小,学习率初始化为0.1,余弦退火120个时代,标准SGD的动量系数为0.9,重量衰减为10−4在conv和完全连接层的内核上。对于包括RegNetX-12GF、EfficientNet-B3和RepVGG-B3在内的重量级模型,我们使用5个历元预热、200个历元的余弦学习率退火、标签平滑[34]和混合[40](见[13])以及自动增强[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比ResNet-50高0.17%/83%。使用交错分组层(g2/g4),RepVGG模型在合理的精度降低下进一步加速:RepVGG-B1g4比ResNet-101好0.37%/101%,RepVGGB1g2比ResNet-152快2.66倍,精度相同。虽然参数的数量不是我们主要关心的问题,但上述所有RepVGG模型的参数效率都高于RESNET。与经典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个时代内达到了80%以上的准确率(表5),就我们所知,这是普通模型第一次赶上先进水平。与RegNetX-12GF相比,RepVGG-B3的运行速度快31%,这令人印象深刻,因为RepVGG不像RegNet[28]那样需要大量人力来优化设计空间,而且架构超参数是随意设置的。

作为计算复杂性的两个代表,我们计算理论上的触发器和Wino MUL,如第2.4节所述。例如,我们发现Winograd算法没有加速有效的EfficientNet-B0/B3。表4显示Wino MULs在GPU上是一个更好的代理,例如,ResNet-152比VGG-16运行得慢,理论FLOPs较低,但Wino MULs较高。当然,实际速度应该始终是黄金标准。

4.2. 构造重参数化是关键

在本小节中,我们将验证我们的结构重新参数化技术的重要性(表6)。所有的模型都是用上述相同的简单训练设置从零开始训练120个时代。首先,我们通过从RepVGG-B0的每个区块移除恒等映射和/或1×1分支来进行消融研究。在去除两个分支后,训练时间模型退化为普通的plain模型,精度仅为72.39%。1×1的准确率为73.15%,恒等映射的准确率为74.79%。全功能RepVGGB0的准确度为75.14%,比普通plain模型高2.75%。从训练时间(即尚未转换)模型的推理速度来看,通过结构重新参数化去除恒等式和1×1分支会带来显著的加速。

然后,我们构建了一系列变体和基线,用于在RepVGG-B0上进行比较(表7)。同样,所有的模型都是在120个时代从无到有地训练出来的。

•    Identity w/o BN     删除恒等分支中的BN。

•    Post-addition BN    移除三个分支中的BN层,并在相加后附加一个BN层。换句话说,BN的位置从预加变成后加。

•    +ReLU in branches    将ReLU插入每个分支(在BN之后,相加之前)。由于这样的块不能转换为单个conv层,因此它没有实际用途,我们只想看看更多的非线性是否会带来更高的性能。

•    DiracNet[39]    采用了精心设计的conv内核重新参数化,如第2.2节所述。我们使用它的官方PyTorch代码来构建层,以替换原来的3×3 conv。

•    Trial Re-param    是一种更简单的conv内核重新参数化方法,它直接向3×3内核添加一个恒等内核,可以将其视为DiracNet的降级版本(\hat{\mathrm{W}}=\mathrm{I} + \mathrm{W}[39])。

•    Asymmetric Conv Block(ACB)    [10]可被视为另一种结构再参数化形式。我们将与ACB进行比较,以了解我们的结构重新参数化的改进是否是由于组件级别的参数化过度(即,额外的参数使每3×3 conv更强)。

•    Residual Reorg    通过以类似ResNet的方式重新组织每个阶段(每个块2层)来构建每个阶段。具体来说,结果模型在第一和最后阶段有一个3×3层,在第2、3、4阶段有2、3、8个剩余块,并使用与ResNet-18/34类似的快捷方式。

我们认为结构re-param优于DiractNet和Trivial Re-param,因为前者依赖于通过具有非线性行为(BN)的具体结构的实际数据流,而后者仅使用另一个conv核的数学表达式。前者“re-param”表示“使用一个结构的参数来参数化另一个结构”,但后者表示“首先使用另一组参数计算参数,然后将其用于其他计算”。对于训练时间BN等非线性分量,前者不能用后者近似。作为证据,去除BN降低了准确度,添加ReLU提高了准确度。换句话说,尽管RepVGG块可以等效地转换为单个conv进行推理,但推理时间等效并不意味着训练时间等效,因为我们无法构造conv层使其具有与RepVGG块相同的训练时间行为。

The former “re-param” means “using the params of a structure to parameterize another structure”, but the latter means “computing the params first with another set of params, then using them for other computations”. With nonlinear components like a training-time BN, the former cannot be approximated by the latter. As evidences, the accuracy is decreased by removing the BN and improved by adding ReLU. In other words, though a RepVGG block can be equivalently converted into a single conv for inference, the inferencetime equivalence does not imply the training-time equivalence, as we cannot construct a conv layer to have the same training-time behavior as a RepVGG block

与ACB的比较表明,RepVGG的成功不应仅仅归因于每个组件的过度参数化效应,因为ACB使用了更多的参数,但产生了较差的性能。作为双重检查,我们用RepVGG块替换ResNet-50的每3×3 conv,并从头开始训练120个epoch。准确率为76.34%,仅比ResNet-50基线高0.03%,这表明RepVGGstyle结构再参数化不是一种通用的过参数化技术,而是一种对训练强大的plain网络至关重要的方法。与残差Reorg(具有相同数量的3×3 conv和额外的训练和推理捷径的真实残差网络)相比,RepVGG的性能优于0.58%,这并不奇怪,因为RepVGG有更多的分支。例如,分支使RepVGG的stage4成为2\times3^{15}=2.8\times10^7模型的集合[36],而剩余Reorg的数量为2^8=256

The comparison with ACB suggests the success of RepVGG should not be simply attributed to the effect of over-parameterization of every component, since ACB uses more parameters but yields inferior performance. As a double check, we replace every 3×3 conv of ResNet-50 with a RepVGG block and train from scratch for 120 epochs. The accuracy is 76.34%, which is merely 0.03% higher than the ResNet-50 baseline, suggesting that RepVGGstyle structural re-parameterization is not a generic overparameterization technique, but a methodology critical for training powerful plain ConvNets. Compared to Residual Reorg, a real residual network with the same number of 3×3 conv and additional shortcuts for both training and inference, RepVGG outperforms by 0.58%, which is not surprising since RepVGG has far more branches. For example, the branches make stage4 of RepVGG an ensemble of 2×3^15 = 2.8×10^7 models [36], while the number for Residual Reorg is 2^8 = 256. 

4.3. 语义分割

我们验证了ImageNetpretrained RepVGG在城市景观语义分割方面的泛化性能[4](表8)。我们使用PSPNet[42]框架,这是一种多元学习率策略,基数为0.01,幂为0.9,权重衰减为10−4,全局批处理大小为16,8 GPU,用于40个时代。为了公平比较,我们仅将ResNet-50/101主干更改为RepVGG-B1g2/B2,并保持其他设置相同。按照官方的PSPNet-50/101[42]在ResNet-50/101的最后两个阶段中使用了扩展的conv,我们还对RepVGG-B1g2/B2的最后两个阶段中的所有3×3 conv层进行了扩展。然而,目前3×3扩展conv的低效实现(尽管FLOPs与3×3常规conv相同)减慢了推理速度。为了便于比较,我们构建了另外两个仅在最后5层(即stage4的最后4层和stage5的唯一一层)进行扩展的PSPNets(用fast表示),因此PSPNets的运行速度略快于ResNet-50/101骨干网。RepVGG主干网在平均IoU方面以更高的速度分别比ResNet-50和ResNet-101高1.71%和1.01%,RepVGG-B1g2-fast在mIoU方面比ResNet-101主干网高0.37%,运行速度快62%。有趣的是,对于较大的模型,扩张似乎更有效,因为与RepVGG-B1g2-fast相比,使用更多扩张的conv层并不能提高性能,但在合理减速的情况下,会将RepVGG-B2的mIoU提高1.05%。

4.4. 局限性

RepVGG型号是一款快速、简单、实用的ConvNets,专为GPU和专用硬件上的最高速度而设计,较少涉及参数数量。它们的参数效率比resnet更高,但在低功耗设备方面可能不如MobileNets[16,30,15]和ShuffleNets[41,24]等移动模式。

5.结论

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

https://hub.fastgit.org/DingXiaoH/DiverseBranchBlock

https://arxiv.org/abs/2103.13425

CVPR 2021

https://blog.csdn.net/u010087277/article/details/115488455

我们提出了一种通用的卷积神经网络构造块(ConvNet),以提高性能而不需要任何推理时间开销。该块被称为多样分支块(DBB),它通过组合不同规模和复杂度的多样分支来丰富特征空间,包括卷积序列、多尺度卷积和平均池,从而增强单个卷积的表示能力。经过训练后,DBB可以等效地转换为单个conv层进行部署。与新型ConvNet架构的进步不同,DBB在维护宏架构的同时使训练时微观结构复杂化,因此它可以作为任何架构的常规conv层的替代品。通过这种方式,可以训练模型达到更高的性能水平,然后将其转换为原始的推理时间结构进行推理。DBB在图像分类(比ImageNet的top-1准确率高出1.9%)、对象检测和语义分割方面改进了CONVNET。

1.介绍

提高卷积神经网络(ConvNet)的性能一直是一个热门的研究课题。一方面,架构设计的进步,例如初始模型[27,28,26,15],揭示了多分支拓扑和不同规模和复杂度的各种路径的组合可以丰富特征空间并提高性能。然而,复杂的结构通常会减慢推理速度,因为小型运算符的组合(例如,1×1 conv的串联和池)对具有强大并行计算能力的设备(如GPU)不友好[21]。

另一方面,更多的参数和连接通常会带来更高的性能,但由于业务需求和硬件限制,我们部署的ConvNet的大小不能任意增加。考虑到这一点,我们通常通过性能和推理时间成本(如延迟、内存占用和参数数量)之间的权衡来判断ConvNet的质量。在一般情况下,我们在强大的GPU工作站上对模型进行训练,并将其部署到效率敏感的设备上,因此我们认为可以接受更多的训练资源的成本来提高性能,只要部署的模型保持相同的大小。

在本文中,我们试图在众多ConvNet架构中插入复杂的结构,以提高性能,同时保持原始的推理时间开销。为此,我们将训练时间和推理时间网络结构解耦,只在训练期间使模型复杂化,并将其转换回原始推理结构。当然,我们要求这些额外的训练时间结构1)有效地提高训练时间模型的性能,2)能够转换为原始的推理时间结构。

为了可用性和通用性,我们将基本的ConvNet组件K×K conv升级为一个功能强大的块,名为多样化分支块(DBB)(图1)。作为一个构建块,DBB是对改进ConvNet的其他努力的补充,例如架构设计[12,24,13,21,23,35]、神经架构搜索[2,39,22,20,19]、数据扩充和训练方法[25,5,33],并通过以下两个特性满足上述两个要求:

•    DBB采用具有多尺度卷积、串接1×1-K×K卷积、平均池和分支相加的多分支拓扑。与Inception架构一样,具有不同复杂度的各种感受野和路径的操作可以丰富功能空间。

•    DBB可以等效地转换为单个conv进行推理。给定一个架构,我们可以用DBB替换一些常规的conv层,以构建更复杂的用于训练的子架构,并将其转换回原始结构,这样就不会有额外的推理时间开销。

更准确地说,我们不会在每次forwarding之前导出用于推断的参数。相反,我们在训练一次后转换模型,然后我们只保存并使用结果模型,并且训练后的模型可以被丢弃。将DBB转换为conv的想法可归类为结构重新参数化,这意味着使用从另一个结构转换的参数以及并行工作对结构进行参数化[9]。虽然DBB和常规conv层具有相同的推理时间结构,但前者具有更高的表征能力。通过一系列烧蚀实验,我们将这种有效性归因于集成Inception单元的差异化的连接(具有不同规模和复杂性的路径),以及批量归一化带来的训练期间非线性[15]。与一些具有重复路径或纯线性分支的对应项相比(图6),DBB显示出更好的性能(表4)。

我们将我们的贡献总结如下。

•    我们建议将丰富的微结构整合到各种ConvNet架构中,以提高性能,同时保持原有的宏架构。

•    我们提出了DBB,一种通用构建块,并总结了六种转换(图2),将DBB转换为单个卷积,因此对用户来说是无代价的。

•    我们展示了一个具有代表性的类似于Inception的DBB实例,并表明它提高了ImageNet[7](例如,top-1精度提高了1.9%)、COCO检测[18]和城市景观[4]的性能。

2.    相关工作

2.1. 多分支架构

Inception[15,26,27,28]架构采用多分支结构来丰富特征空间,这证明了不同连接、不同感受野和多分支组合的重要性。DBB借用了使用多分支拓扑的思想,但区别在于1)DBB是一个可用于多种架构的构建块,2)DBB的每个分支都可以转换为一个conv,因此这些分支的组合可以合并为一个conv,这比实际的Inception单元快得多。我们将展示不同分支相对于重复分支的优势(表4),最有趣的发现是,将两个具有不同表征能力的分支(例如,1×1 conv和3×3 conv)组合起来比两个大容量分支(例如,两个3×3卷积)更好,这反过来可能会为ConvNet架构设计带来启示。

2.2. ConvNet组件以获得更好的性能

有一些新的组件可以改进convnet。例如,挤压和激励(SE)块[14]和Efficient Convolutional Attention(ECA)块[29]利用注意机制重新校准特征,Octave卷积[3]减少规则卷积的空间冗余,可变形卷积[6]增加具有可学习偏移的空间采样位置,扩张卷积扩展了感受野[32],模糊池[34]恢复了移位不变性等。DBB是这些组件的补充,因为它只升级了一个基本构建块:conv层。

2.3. 结构再参数化

本文和并行工作RepVGG[9]是第一个使用结构重新参数化来定义使用从另一个结构转换的参数对结构进行参数化的方法。ExpandNet[10]、DO Conv[1]和ACNet[8]也可以归类为结构重新参数化,因为它们将块转换为Conv。例如,ACNet使用非对称卷积块(ACB,如图6d所示)来加强Conv内核的骨架(即交叉部分)。与DBB相比,它还被设计为在不增加额外推理时间成本的情况下改进ConvNet。然而,不同之处在于,ACNet的动机是观察到skeleton的参数在大小上更大,因此试图使其更大,而我们关注的是不同的角度。我们发现平均池、1×1 conv和1×1-K×K顺序conv更有效,因为它们提供了不同复杂度的路径,并且允许使用更多的训练期间非线性。此外,ACB可以被视为DBB的特例,因为1×K和K×1 conv层可以通过变换VI(图2)扩充到K×K,并通过变换II合并到方形核中。

2.4. 其他ConvNet重新参数化方法

有些工作可以称为重新参数化,但不能称为结构重新参数化。例如,最近的NAS[20,39]方法[2]使用元内核对内核进行重新参数化,并将这些元内核的宽度和高度补充到搜索空间中。软条件计算(SCC)[31]或CondConv[30]可被视为与数据相关的内核重新参数化,因为它为相同形状的多个内核生成权重,然后导出一个内核作为所有此类内核的加权和,以参与卷积。请注意,SCC在部署的模型中引入了大量参数。这些重新参数化方法不同于ACB和DBB,前者的“重新参数化”意味着使用一些元参数(例如,元核[2])导出一组新参数,然后将新参数用于其他计算,而后者意味着将训练模型的参数转换为另一个参数化。

3.    多分支块

3.1. 卷积的线性

具有C个输入通道、D个输出通道和核大小K×K的conv层的参数在conv核中,它是一个四阶张量F∈ R^{D×C×K×K}和可选偏置b\in R^D。它输入一个C通道的特征图I∈ R^{C×H×W},输出一个D通道的特征图O∈ R^{D×H’×W’},其中H’和W’取决于K、填充和步幅。我们使用⊛表示卷积操作,并将偏置b复制为REP(b)\in R^{D×H’×W’},并将其加到卷积操作的结果上。Formally,

O=I⊛F+REP(b)    (1)

输出的第j个通道在(h,w)处的值为:

上一篇下一篇

猜你喜欢

热点阅读