
极市导读
结构重参数化技术是一种很巧妙的让模型同时具备"简单"的架构和"优秀"的参数的方法。本文介绍了两篇来自清华大学丁贵广老师团队和旷视科技的关于模型参数化技术的工作。 >>加入极市CV技术交流群,走在计算机视觉的最前沿
本文介绍的2篇论文都来自清华大学丁贵广老师团队和旷视科技。
模型参数主要指的是学得的参数(learnable params) 和其他在训练过程中得到的参数,如batch norm (BN) 累积得到的均值和标准差。则:一组参数和一个结构是一一对应的。举个最简单的例子,两个全连接层甲和乙之间如果没有非线性的话就可以转换为一个全连接层丙。设这两个全连接层的参数为矩阵A和B,输入为x,则输出为y=B(Ax)。我们可以构造C=BA,则有y=B(Ax)=Cx。那么C就是我们得到的全连接层的参数。则参数AB就对应结构甲乙,参数C就对应结构丙。
结构重参数的意思其实是说:结构重参数化(structural re-parameterization)指的是首先构造一系列结构 (一般用于训练),并将其参数等价转换为另一组参数 (一般用于推理或部署),从而将这一系列结构等价转换为另一系列结构。在现实场景中,训练资源一般是相对丰富的,我们更在意推理时的开销和性能,因此我们想要训练时的结构较大,具备好的某种性质(更高的精度或其他有用的性质,如稀疏性),转换得到的推理时结构较小且保留这种性质(相同的精度或其他有用的性质)。这样一来,训练时的结构对应一组参数,推理时我们想要的结构对应另一组参数;只要能把前者的参数等价转换为后者,就可以将前者的结构等价转换为后者。 结构A对应一组参数X,结构B对应一组参数Y,如果我们能将X等价转换为Y,就能将结构A等价转换为B。
The meaning of structural reparameterization is that the training-time model has a set of parameters while the inference-time model has another set, and we parameterize the latter with the parameters transformed from the former.
目录:
1 RepVGG: Making VGG-style ConvNets Great Again (CVPR 2021)
1.1 RepVGG原理分析
1.1.1 什么是VGG式模型?
1.1.2 从多分支架构到结构重参数
1.2 RepVGG代码解读2 RepMLP: Re-parameterizing Convolutions into Fully-connected Layers for Image Recognition (Arxiv)
2.1 RepMLP原理分析
2.1.1 深度学习模型的几个性质
2.1.2 RepMLP模块
2.1.3 如何将卷积等效成FC层?
1 RepVGG: Making VGG-style ConvNets Great Again (CVPR 2021)
论文地址:
https://arxiv.org/abs/2101.03697
开源预训练模型和代码 (PyTorch版):
https://github.com/DingXiaoH/RepVGG
本小节参考论文作者的博客:
丁霄汉:RepVGG:极简架构,SOTA性能,让VGG式模型再次伟大(CVPR-2021)
https://zhuanlan.zhihu.com/p/344324470
1.1 RepVGG原理分析:
1.1.1 什么是VGG式模型?
“VGG式”模型指的是:
1. 没有任何分支结构。即通常所说的plain或feed-forward架构。
2. 仅使用3x3卷积。
3. 仅使用ReLU作为激活函数。
下面用一句话介绍RepVGG模型的基本架构:将20多层3x3卷积堆起来,分成5个stage,每个stage的第一层是stride=2的降采样,每个卷积层用ReLU作为激活函数。
再用一句话介绍RepVGG模型的详细结构:RepVGG-A的5个stage分别有[1, 2, 4, 14, 1]层,RepVGG-B的5个stage分别有[1, 4, 6, 16, 1]层,宽度是[64, 128, 256, 512]的若干倍。这里的倍数是随意指定的诸如1.5,2.5这样的“工整”的数字,没有经过细调。
我们一般用TFLOPS (Tera FLoating-point Operations Per-second) 来描述某种操作的计算密度,下图1是不同大小卷积核卷积的运算量,时间和计算密度。可以发现3×3卷积的计算密度最大,可达1x1和5x5卷积的4倍。

作者认为,VGG式极简模型至少还有5大现实的优势:
1. 计算密度高: 3x3卷积非常快。在GPU上,3x3卷积的计算密度(理论运算量除以所用时间)可达1x1和5x5卷积的四倍。
2. 运算速度快: 单路架构非常快,因为并行度高。同样的计算量,“大而整”的运算效率远超“小而碎”的运算,尽管VGG模型看起来参数量大一点。比如VGG-16的计算量是EfficientNet-B3的8.4倍,但是在1080Ti的运算速度确是EfficientNet-B3的1.8倍!对GPU这类强并行运算设备友好。运行时间除了与FLOPs有关以外,还受其他2个因素的影响:Memory access cost (MAC):内存使用量,运行这个操作占用多少内存。比如多分支操作Inception,ResNet的MAC很大。Degree of parallelism:高并行度的模型在相同的FLOPs时比低并行度的模型速度快。
-
省内存: 单路架构省内存。例如,ResNet的shortcut虽然不占计算量,却增加了一倍的显存占用,因为多路架构的memory access cost (MAC)很大。
4. 灵活性: 单路架构灵活性更好,容易改变各层的宽度 (如剪枝) 。
5. 专一性: RepVGG主体部分只有一种算子:3x3卷积接ReLU。在设计专用芯片时,给定芯片尺寸或造价,我们可以集成海量的3x3卷积-ReLU计算单元来达到很高的效率,从图12中看出。别忘了,单路架构省内存的特性也可以帮我们少做存储单元。
1.1.2 从多分支架构到结构重参数
多分支架构(如ResNet,Inception,DenseNet,各种NAS架构)和单分支结构 (VGG式模型) 相比各有什么优劣呢?
-
多分支架构训练更加稳定且容易,比如ResNet的残差连接就能够很好地解决gradient vanishing的问题。但是推理速度慢,占用的内存大。 -
单分支结构推理速度快,节省内存。但是训练比较困难,训练的性能较低。
既然多分支架构是对训练有益的,而作者想要部署的模型是单路架构,作者提出解耦训练时和推理时架构。我们通常使用模型的方式是:
1. 训练一个模型
2. 部署这个模型
但在这里,作者提出一个新的做法:
1. 训练一个多分支模型
2. 将多分支模型等价转换为单路模型
3. 部署单路模型
这样就可以同时利用多分支模型训练时的优势(性能高) 和单路模型推理时的好处(速度快、省内存)。这里的关键显然在于这种多分支模型的构造形式和转换的方式。
如果能把一种结构的参数等价转换成另一种结构的参数,那么这个多分支模型就可以等价转换成单路模型。
作者的实现方式是在训练时,为每一个3x3卷积层添加平行的1x1卷积分支和恒等映射分支,构成一个RepVGG Block。这种设计是借鉴ResNet的做法,区别在于ResNet是每隔两层或三层加一分支,而作者是每层都加,如下图2所示。

图2:为每一个3x3卷积层添加平行的1x1卷积分支和恒等映射分支
训练完成后,我们对模型做等价转换,得到部署模型。根据卷积的线性(具体来说是可加性),设三个3x3卷积核分别是 ,有
。怎样利用这一原理将一个RepVGG Block转换为一个卷积呢?
其实非常简单,因为RepVGG Block中的:
所以我们只需要:
1. 把Identity转换为1x1卷积,只要构造出一个以单位矩阵为卷积核的1x1卷积即可。
2. 把1x1卷积等价转换为3x3卷积,只要用0填充即可。
下图3描述了这一转换过程。在这一示例中,输入和输出通道都是2,故3x3卷积的参数是4个3x3矩阵,1x1卷积的参数是一个2x2矩阵。注意三个分支都有BN层,其参数包括累积得到的均值及标准差和学得的缩放因子及bias。这并不会妨碍转换的可行性,因为推理时的卷积层和其后的BN层可以等价转换为一个带bias的卷积层(也就是通常所谓的“吸BN”)。比如卷积核分别是 , 。3种不同操作的BN参数分别是:
则输出特征是:
而BN操作可以等价为:
把BN的参数合并到卷积中的过程为:
合并之后卷积就成为了:
所以推理时的卷积层和其后的BN层可以等价转换为一个带bias的卷积层。对三分支分别“吸BN”之后(注意恒等映射可以看成一个“卷积层”,其参数是一个2x2单位矩阵!),将得到的1x1卷积核用0给pad成3x3。最后,三分支得到的卷积核和bias分别相加即可。这样,每个RepVGG Block转换前后的输出完全相同,因而训练好的模型可以等价转换为只有3x3卷积的单路模型。
从这一转换过程中,我们看到了 “结构重参数化”的实质:训练时的结构对应一组参数,推理时我们想要的结构对应另一组参数;只要能把前者的参数等价转换为后者,就可以将前者的结构等价转换为后者。
RepVGG模型的架构如下图4所示。大量使用3×卷积但是不使用Max-Pooling结构。RepVGG-A的5个stage分别有[1, 2, 4, 14, 1]层,RepVGG-B的5个stage分别有[1, 4, 6, 16, 1]层,宽度 width 是[64, 128, 256, 512]的若干倍。这里的倍数是随意指定的诸如1.5,2.5这样的“工整”的数字,没有经过细调。分类头和MLP-Mixer一致,为Global Average Pooling+FC层。
-
第1个stage分辨率最高,所以只使用1层。 -
最后1个stage的channel数最多,所以为了节约参数也只使用1层。

在不同阶段的通道数方面,作者采用了经典的配置64-128-256-512。与此同时,作者采用因子 控制前四个阶段的通道,因子 控制最后一个阶段的通道,通常 (我们期望最后一层具有更丰富的特征)。为避免大尺寸特征的高计算量,对于第一阶段的输出通道做了约束 。基于此得到的不同大小的RepVGG模型见下图5。

RepVGG实验:
在1080Ti上测试,RepVGG模型的速度-精度相当出色。下图6给出了RepVGG与不同计算量的ResNet及其变种在精度、速度、参数量等方面的对比。可以看到:RepVGG表现出了更好的精度-速度均衡,比如
-
RepVGG-A0比ResNet18 Accuracy 高1.25%,推理速度快33%; -
RepVGG-A1比Resnet34 Accuracy 高0.29%,推理速度快64%; -
RepVGG-A2比ResNet50 Accuracy 高0.17%,推理速度快83%; -
RepVGG-B1g4比ResNet101 Accuracy 度高0.37%,推理速度快101%; -
RepVGG-B1g2比ResNet152 Accuracy 相当,推理速度快2.66倍。
注意,RepVGG取得超过EfficientNet和RegNet的性能并没有使用任何的NAS或繁重的人工迭代设计。
下图7是ImageNet上训练200 epochs的实验结果。RepVGG模型可以在200 epoch的时候达到80%的accuracy,这是plain模型首次在精度上达到SOTA指标。
-
RepVGG-A2比EfficientNet-B0精度高1.37%,推理速度快59%; -
RepVGG-B1比RegNetX-3.2GF精度高0.39%,推理速度稍快; -
RepVGG-B3比RegNetX-12GF精度相当,推理速快31%。
这也说明,在不同的架构之间用FLOPs来衡量其真实速度是欠妥的。例如,RepVGG-B2的FLOPs是EfficientNet-B3的10倍,但1080Ti上的速度是后者的2倍,这说明前者的计算密度是后者的20余倍。

另外一系列ablation studies和对比实验表明,结构重参数化是RepVGG模型性能出色的关键 (详见论文) 。
最后需要注明的是,RepVGG是为GPU和专用硬件设计的高效模型,追求高速度、省内存,较少关注参数量和理论计算量。在低算力设备上,可能不如MobileNet和ShuffleNet系列适用。
所以结构重参数的意思其实是说:训练时的结构对应一组参数,推理时我们想要的结构对应另一组参数;只要能把前者的参数等价转换为后者,就可以将前者的结构等价转换为后者。

