VGG是一种经典的卷积神经网络。只堆叠卷积、ReLU、池化操作就在图像识别领域获得巨大成就。但随后的研究关注点转移到是否具有良好的网络结构设计,例如Inception、ResNet、DenseNet。这使得模型越来越复杂。这些复杂的卷积网络有明显的缺点。一是复杂的多分支设计让模型难以实现和自定义,拖慢推理速度和降低了内存利用率。二是一些随机混合操作增加了内存访问消耗,而且缺乏硬件设备支持。综合这些影响因素,理论FLOPs并不能精确的反映实际推理速度。
推理时RepVGG有以下VGG特征
1. 没有任何分支结构。即通常所说的plain或feed-forward架构。
2. 仅使用卷积。
3. 仅使用ReLU作为激活函数。
多分支结构往往比plain结构表现要好。一个可能的解释是多分枝结构是一些浅层模型的一种隐式集成,所以避免了梯度消失的问题。鉴于此,文章提出解耦训练时架构和推理时架构。通过转换参数形式,来转换架构。
一个网络结构可以和一组参数对应,例如一个卷积层可以被一个4维核张量表示。在训练时RepVGG受到ResNet启发,用到了恒等(identity)分支和分支,但这些分支是可被结构性地重参数化。这种转换可以看作是代数问题。恒等变换可以被视为卷积,然后也可以进一步降级为卷积。于是训练时的恒等、 、分支和BN层就可以构筑为推理时的单独一个核。
特别地,推理时RepVGG只有唯一一种操作:卷积后跟ReLU。这样RepVGG在如GPUs等设备上运行非常快。在专门的设备上更是如此。
要注意到,在每个分支汇总前,都会进行BN操作。用表示输入、输出的卷积核,表示1*1分支。、、分别表示、和恒等分支的BN层的累计平均、标准差、可学习缩放因子、偏置。用, 表示输入和输出。用表示卷积。假如有,则模块可以描述为
这里的bn是推理时BN函数,正常情况下,对于,有
为了将这些BN层和卷积层变换为可加的卷积和偏置,让作为变换的结果,有
容易验证,有
恒等分支可以视为单位矩阵作为核的卷积。而核可以放置在核的中心点,其余置零,从而作为一个核。三个分支的核相加形成一个核。三个分支的偏置直接相加。此时就获得单独一层卷积层,没有BN层。需要留意这种操作需要满足卷积层的步跨一致,边缘填充设置核要比核少1格的填充像素。
最终整个模型分为5个stage,RepVGG-A的5个stage分别有[1, 2, 4, 14, 1]层,RepVGG-B的5个stage分别有[1, 4, 6, 16, 1]层,宽度是[64, 128, 256, 512]的若干倍。
下图可以看到,相同推理速度下(每秒预测完成的样本数)RepVGG准确率高。同样准确率下RepVGG推理速度快