发布时间:2023-12-10 16:00
论文: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;
参数: