RepVGG
- 论文总览
- 方法
- 多分支训练
- 结构重参数化
- 网络架构
- 实验
- 局限性
CVPR2021
Paper : https://arxiv.org/abs/2101.03697Code : https://github.com/DingXiaoH/RepVGG
MegEngine : https://github.com/megvii-model/RepVGG
论文总览
本文通过结构重参数化,只使用 3x3 卷积和 ReLU 激活函数的单路极简架构在速度和性能上达到 SOTA 水平。
尽管许多复杂的卷积网络都比简单的卷积网络提供更高的准确性,但缺点很明显:
- 复杂的多分支设计(例如 ResNet 的残差连接和 Inception 的分支拼接)让模型更难实现和定制,并且降低了推理速度,减少了内存利用
- 一些组件(例如 Xception 和 MobileNets 的深度卷积,ShuffleNet 的通道洗牌)增加了内存访问成本,并且缺乏设备的支持。
由于影响推理速度的因素太多,浮点运算(FLOP)的数量不能准确反映实际速度。
而简单架构是快速、节省内存并且具有灵活性的。
- 快速:
- 节省内存。单路架构节省内存。
- 灵活性好,容易改变更层的宽度
所以本文提出通过结构重参数化将多分支训练和简单架构推理分离,也就是通过转换网络的参数将架构从一种架构转换为另一种架构,如下图所示,使用(B)网络训练,然后通过结构重参数化转换为(C)网络进行推理。具体来说,如果某个结构的参数可以转换为由另一种结构的另一组参数,就可以用后者等效地替换前者,从而改变整个网络体系结构。
这样就可以同时利用多分支模型训练时的优势(性能高)和单路模型推理时的好处(速度快、省内存)。
方法
多分支训练
在训练时,为每一个 3x3 卷积层添加平行的 1x1 卷积分支和 identity 分支,构成一个 RepVGG Block(如上图)。这种设计是借鉴 ResNet 的做法,区别在于 ResNet 是每隔两层或三层加一分支,而本文是每层都加。
结构重参数化
怎么样把多分支训练网络重参数化为简单网络进行推理,也就是怎样将 和 identity 转换为一个
方法描述
卷积相当于一个特殊的 卷积(卷积核中有很多 0),而 identity 是一个特殊的 卷积(单位矩阵),因此也是一个特殊的 卷积。所以,把 identity 转换为 卷积,只要构造出一个以单位矩阵为卷积核的 卷积即可,把 卷积等价转换为
原理详解
使用 表示 的卷积核,输入通道为 ,输出通道为 。使用 表示 的卷积核。使用 表示 卷积层后的 BN 层的均值,标准差,缩放因子和偏置。使用 表示 卷积层后的 BN 层的均值,标准差,缩放因子和偏置。用 表示 卷积层后的 BN 层的均值,标准差,缩放因子和偏置。使用 表示输入和输出, 表示卷积操作。如果 ,则可以有:
不相等的话,不用恒等分支,因此上式只有前两项。对于 BN 的公式为:
首先可以把每个 BN 和它前边的卷积层转换为一个带有偏置限量的卷积。使用 表示转换后的卷积核和偏置,则:
因此
举例说明
上图描述了这一转换过程,输入和输出通道都是2,则 卷积的参数是 4 个 矩阵, 卷积的参数是一个 矩阵。根据以上公式可以将它们及其 BN 层分别转换为 卷积及其偏置,然后将它们分别相加即可。这样,每个 RepVGG Block 转换前后的输出完全相同,因而训练好的模型可以等价转换为只有
网络架构
a, b 为缩放系数
对于图像分类,使用全局平均池化和一个全连接网络分类。对于其他的任务,可以使用任意层的特征图。
遵循三个简单的准则来决定每个 stage 的层数。
- 第一个 stage 具有高分辨率,很耗时,因此仅使用了一层
- 最后一个 stage 具有更多通道,因此仅使用一层来保存参数
- 将最多的层放到倒数第二个 stage(ImageNet上的输出分辨率为14×14)
使用 RepVGG-A 与其他轻型和中等模型比较,包括 ResNet-18/34/50,而 RepVGG-B 与高性能模型比较。
实验
局限性
RepVGG 是为 GPU 和专用硬件设计的高效模型,追求高速度、省内存,较少关注参数量和理论计算量。在低算力设备上,可能不如 MobileNet 和 ShuffleNet 系列适用。
参考文章: