论文:https://arxiv.org/pdf/2101.03697v3.pdf
代码:https://github.com/DingXiaoH/RepVGG
VGG式的推理模型,由3 * 3卷积块和ReLU激活函数组成。
训练时用的是一个多分支的网络,然后通过结构re-parameter技术得到推理网络。因为用到了结构re-parameter,所以叫做RepVGG。
复杂网络可以取得更高的识别精度,但是有如下缺点:
内存利用率、内存访问速度等众多因素都可能影响模型的推理速度,所以单纯使用FLOPs是无法得到准确的模型推理速度的。所以虽然很多新的模型比VGG、ResNet-18/34/50的FLOPs要小,但实际的运行速度却不一定会更快。
多分支的网络可以看做是多个浅层网络的集成,所以训练过程中可以避免梯度弥散,取得比plain 网络更好的效果。但上面也说到了多分支网络在推理过程中的缺点,所以本文作者通过结构re-parameter的技术用多分支网络进行训练,但只用plain网络进行推理。re-parameter是指一个模块和对应的参数可以映射到另一个不同结构的模块,新模块的参数也跟着调整,确保两个模块可以取得相同的效果。
本文的主要贡献:
本文的RepVGG推理网络具有下述优点:
很多多分支网络的FLOPs比VGG小,但实际的推理速度却比VGG慢,这说明两个网络的计算密度是不同的。例如VGG-16的FLOPs比EfficientNet-B3大8.4倍,但实际运行时的吞吐量却是后者的1.8倍,说明VGG的计算密度是后者的15倍。
FLOPs和实际吞吐量之间的差异主要在于前者没有考虑两个因素:
多分支结构需要在进行add/concatenate之前保存各个分支的计算结果,所以总体内存占用更大。但一个plain网络,总是对前一层的输出进行计算得到本层的输出,无需额外的存储空间,内存占用更小。如下图所示:
在设计专用硬件时,如果内存需求量小,那么就可以集成更多的计算单元以进一步加速网络的推理。
多分支网络需要进行定制化的设计。例如,ResNet需要对每一个残差块的最后一个卷积层进行定制化设计以使得其输出和残差块的输入具有相同的尺寸。
更不好的一点是多分支结构会限制模型剪枝的应用,会使得剪枝的过程需要很强的技巧,如果剪枝不得当,可能模型的准确性会大幅下降或者剪枝的提速效果有限。
而一个plain的网络没有上述限制,可以自由地进行网络结构设计和剪枝。
plain网络虽然有2.1节介绍的优点,但有一个核心缺点:准确率较低。所以本文在模型训练时还是使用了多分支网络。本文具体用的是ResNet,其核心思想是 y = f(x)+x
或y=f(x)+g(x)
,f(x)
表示残差学习函数,x
表示shortcut通路,g(x)
表示使用了1 * 1 卷积的shortcut通路。ResNet之所以能取得较好的训练效果,是因为其可以看做是多个浅层网络的集成,对于包含n个残差块的ResNet,可以看作是 2 n 2^n 2n个浅层网络的集成,2
表示每个残差块中的两个分支。
本文作者设计了一个新的残差块y = x + f(x) + g(x)
,按照上一段的思想,具有n个该残差块的网络可以看作是 3 n 3^n 3n个浅层网络的集成。
本节讲述如何把y=x+f(x)+g(x)
通过re-parameter变为一个3 * 3卷积的过程。
输入: M ( 1 ) ∈ R N × C 1 × H 1 × W 1 M^{(1)} \in R^{N \times C_1 \times H_1 \times W_1} M(1)∈RN×C1×H1×W1, C 1 C_1 C1个channel,上图中定义为2;
输出: M ( 2 ) ∈ R N × C 2 × H 2 × W 2 M^{(2)} \in R^{N \times C_2 \times H_2 \times W_2} M(2)∈RN×C2×H2×W2, C 2 C_2 C2个channel,上图中定义为2;
参数:
设定 C 1 = C 2 C_1 = C_2 C1=C2, W 1 = W 2 W_1 = W_2 W1=W2,有:
BN层合并到卷积层中:
bn表示BN层,对 ∀ 1 ≤ i ≤ C 2 \forall 1 \leq i \leq C_2 ∀1≤i≤C2计算过程可以表示为:
BN层合并到卷积层中,可得:
直连分支:
直连分支可以看做是卷积核为单位矩阵的1 * 1的卷积。
总体re-parameter:
一个 3 * 3的卷积核,两个1 * 1的卷积核,三个偏移量。然后把两个1 * 1的卷积变换为3 * 3的卷积,偏移向量也进行叠加,得到了Fig. 4的中间结果。最后再把三个3 * 3的矩阵进行相加,得到一个3 * 3的矩阵,同理也得到了一个长度为2的向量。
上面的re-parameter的过程要求3 * 3的卷积和1 * 1的卷积有相同大小的stride值,且后者的padding值要比前者小1。
只使用 3 * 3的卷积,没有使用Max Pooling,目的是减少用到的层的类型。
网络分为5个stage,每个stage的第一个卷积层的stride都是2,用于减小feature map的尺寸。
对图像分类任务,网络头部使用GAP层+fc层;其他任务,使用自定义的网络头。
每一个stage的层的数量按照下面三个原则进行设计:
按照上面的原则,构建了两个网络,分别是RepVGG-A和RepVGG-B,前者五个stage分别包含1,2,4,14,1个层,后者五个stage分别包含1,4,6,16,1个层。前者对应于轻量化或中等大小的网络,例如ResNet-18//34/50,后者对应大的网络,如ResNet-101。
层的channel数也遵从[64,128,256,512]的原则,使用两个系数 α \alpha α和 β \beta β缩放channel数量,前四个stage使用 α \alpha α,最后一个stage使用系数 β \beta β,且一般设置 β \beta β > α \alpha α,目的是保证输出有更加丰富的特征。因为最后stage只有一个层,使用较大的 β \beta β值也不会使模型变得特别大。第一个stage因为输入分辨率很大,所以不允许对其channel数进行扩充,所以设计成 m i n ( 64 , 64 α ) min(64,64 \alpha) min(64,64α)。
为进一步减少计算量和参数量,作者配置了可选的分组卷积。
说明了BN的重要性、增加更多的ReLU单元可以进一步提升性能,下面部分的对比实验也说明了本文re-parameter技术的优越性。
将本文的re-parameter技术和DiracNet、Trival Re-Param进行对比,前者依赖于带有BN层的具体结构的数据流,后两者只是在卷积核上应用了一次数学计算。前者的re-param表示使用一个结构的参数来参数化另一个结构。后两者却是计算两组参数用于其他的计算。因为有训练时的非线性单元BN,前者无法用后两者近似。实验结果也证明了移除BN降低了网络性能,使用更多的ReLU单元增强了网络性能。换言之,虽然一个RepVGG块可以在推理时等价转换为一个conv层,但推理时的结果并不等价于训练时的结果,所以不能把一个训练时的RepVGG块转换为一个conv层。
RepVGG简单、实用,推理速度快,适用于GPU和其他专用设备。比ResNets参数少、效率高。
但在低功耗的设备上,不一定比MobileNet/ShuffleNet更好。