前言
VGG网络也是之前学习过的网络。而RepVGG类似于VGG的推理时间主体,在ImageNet上,RepVGG的top-1准确性达到80%以上。这是基础模型首次实现80%以上的精度,综合性能超越ResNet、EfficientNet等。
摘要
RepVGG架构是一个简单且强大的卷积神经网络架构,该架构具有类似于VGG的推理时间主体,该主体仅由3x3卷积和ReLU的堆叠组成,而训练时间模型具有多分支拓扑。训练时间和推理时间架构的这种解耦是通过结构重新参数化(re-parameterization)技术实现的,因此该模型称为RepVGG。
模型定义
“VGG式”:
- 没有任何分支结构。即通常所说的plain或feed-forward架构。
- 仅使用3x3卷积。
- 仅使用ReLU作为激活函数。
基本架构:将20多层3x3卷积堆起来,分成5个stage,每个stage的第一层是stride=2的降采样,每个卷积层用ReLU作为激活函数。
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这样的“工整”的数字。
方法
1 为什么用VGG模型
使用VGG模型至少有三个原因:速度快、内存经济且灵活。
1.1 快速
多分支体系结构理论上失败率比VGG低,但运行速度可能更慢。虽然Winograd快速卷积算法优化了卷积计算,但内存访问成本(MAC)和并行度这两个重要因素对速度有很大的影响。多分支体系结构的分支加法或连接的计算是微不足道的,但MAC是重要的。此外,MAC在分组卷积中占据了很大一部分时间。在相同的 FLOPs情况下,具有高并行度的模型可能比另一个具有低并行度的模型要快得多。
当分割操作的数量(即在一个构建块中单个Conv或池化操作的数量)过多时,如NASNET-A是13,这对GPU等拥有强大并行计算能力的设备不太友好,并引入了额外的开销,如内核启动和同步。相比之下,这个数字在ResNets中是2或3,文章所提的方法将其设为1:仅仅是单个Conv。
RepVGG使用
3
∗
3
3*3
3∗3的卷积核,在GPU上,3x3卷积的计算密度(理论运算量除以所用时间)可达1x1和5x5卷积的四倍。且单路架构非常快,因为并行度高。同样的计算量,“大而整”的运算效率远超“小而碎”的运算。
1.2 内存经济
多分支拓扑的内存效率是非常低下的,因为每个分支的结果都需要保留到叠加或连接,这大大提高了内存占用。如图1所示,Residual Block的输入需要保持到加法为止。假设Block保持feature map大小,则内存占用保持在2倍作为输入空间。相比之下,普通拓扑允许特定层的输入所占用的内存在操作完成后立即释放。
RepVGG的单路架构可以节省内存。
图1
1.3 灵活
多分支结构关于体系结构规范有很多约束,且限制了网络的剪枝。网络剪枝是一种去除一些不重要通道的技术,有些方法可以自动发现每一层合适的宽度来优化模型结构。但多分支模型使修剪变得复杂,并明显导致了性能下降或较低的加速比。
相比之下,单路架构允许根据需求自由配置每个conv层,容易改变各层的宽度,并进行修剪,以获得更好的性能-效率平衡。
2 多分支结构和多分支融合
相比于各种多分支架构(如ResNet,Inception,DenseNet),简单的卷积网络有很多优点,但有一个致命的缺点:性能差,但分支对训练有益。例如,ResNet性能好的一种解释是ResNet的分支结构(shortcut)产生了一个大量子模型的隐式ensemble(因为每遇到一次分支,总的路径就变成两倍),单路架构显然不具备这种特点。
虽然多分支架构是对训练有益的,而想要部署的模型却是单路架构,那应该怎么办呢。
我们通常使用的方法是:训练一个模型,然后部署。
文章提出了一个新方法:训练一个多分支模型,将分支模型等价转换为单路模型,然后部署。
这样就可以同时利用多分支模型训练时的优势(性能高)和单路模型推理时的好处(速度快、省内存)。
文章的实现方法是在训练时,为每一个3x3卷积层添加平行的1x1卷积分支和恒等映射分支,构成一个RepVGG Block。这种设计是借鉴ResNet的做法,区别在于ResNet是每隔两层或三层加一分支,而文章是每层都加。如图2中的B。
图2
训练完成后,需要对模型做等价转换,得到部署模型。1x1卷积是一个特殊(卷积核中有很多0)的3x3卷积,而恒等映射是一个特殊(以单位矩阵为卷积核)的1x1卷积。根据卷积的线性(具体来说是可加性),每个RepVGG Block的三个分支可以合并为一个3x3卷积。
如图3,输入和输出通道都是2,故3x3卷积的参数是4个3x3矩阵,1x1卷积的参数是一个2x2矩阵。注意三个分支都有BN(batch normalization)层,其参数包括累积得到的均值及标准差和学得的缩放因子及bias。这并不会妨碍转换的可行性,因为推理时的卷积层和其后的BN层可以等价转换为一个带bias的卷积层(也就是通常所谓的“吸BN”)。
对三分支分别“吸BN”之后(注恒等映射可以看成一个“卷积层”,其参数是一个2x2单位矩阵),将得到的1x1卷积核用0填充成3x3的卷积核。最后,三分支得到的卷积核和bias分别相加即可。这样,每个RepVGG Block转换前后的输出完全相同,因而训练好的模型可以等价转换为只有3x3卷积的单路模型。
图3
这一部分的实质是:训练时的结构对应一组参数,推理时我们想要的结构对应另一组参数;只要能把前者的参数等价转换为后者,就可以将前者的结构等价转换为后者。
结构
RepVGG是VGG时的,采用简单的拓扑结构,大量使用3×3 conv,但它不像VGG那样使用最大池化,因为希望主体只有一种操作类型。这里安排3×3 layer分为5个阶段,第一个阶段的第1层下降样品的stride=2。对于图像分类,使用全局平均池化,然后使用全连接层作为head。对于其他任务,特定于任务的head可以用于任何层产生的特性。
图4
实验结果
ImageNet分类任务
结果如图5。
图5 RepVGG模型和基线经过120个时期的训练,并在ImageNet上进行了简单的数据扩充。在1080Ti上测试速度,批量大小为128,全精度(fp32),测量单位为例/秒。
语义分割任务
图6 基于验证子集的城市景观语义分割[3]。在同一台1080tigpu上,以16个批量、全精度(fp32)和713×713的输入分辨率测试了速度(例/秒)。
在Cityscapes上的语义分割实验表明,在速度更快的情况下,RepVGG模型比ResNet系列高约1%到1.7%的mIoU,或在mIoU高0.37%的情况下速度快62%。
注意
RepVGG是为GPU和专用硬件设计的高效模型,追求高速度、省内存,较少关注参数量和理论计算量。在低算力设备上,可能不如MobileNet和ShuffleNet系列适用。
启发
RepVGG的是一个很棒的BackBone工作,避免了复杂的模块设计,NAS搜索,仅仅靠简单的手工设计和重参数化达到了SOTA结果。因此在设计模型时,也可以参考这个思路。