本文汇总编辑:人民中科赵朋飞
一、RepVGG
1.RepVGG简介
RepVGG架构是简单而强大的卷积神经网络架构,且是具有类似于VGG的推理时间主体,该主体仅由3x3卷积和ReLU组成,而训练时间模型具有多分支拓扑结构。训练时间和推理时间架构的这种解耦是通过结构重新参数化(re-parameterization)技术实现的,因此该模型称为RepVGG。
在ImageNet上,RepVGG的top-1准确性达到80%以上,这是单模型首次实现超越80%的精度。在NVIDIA 1080Ti GPU上,RepVGG模型的运行速度比ResNet-50快83%,比ResNet-101快101%,具有更高的精度,并且与诸如EfficientNet和RegNet的最新模型相比,都显示出良好的精度-速度折衷。
二、RepVGG网络架构详解
1.为什么选择VGG风格的网络
(1)速度快
现有的计算库(如CuDNN,Intel MKL)和硬件针对3x3卷积有深度的优化,相比其他卷积核,3x3卷积计算密度更高,更加有效。
下表显示了在1080Ti GPU上用cuDNN 7.5.0测试的理论FLOPs、实际运行时间和计算密度(TFLOPS)
许多多分支架构在理论上FLOPs比VGG要低,但运行起来可能并不会更快。例如,VGG-16的FLOPs是EfficientNet-B3的8.4倍,但在1080Ti上运行速度要快1.8倍,这意味着前者的计算密度是后者的15倍。
除了Winograd conv带来的加速外,内存访问成本(MAC)和并行度这两个重要因素对速度有很大的影响,但内存访问成本和并行度并没有被计算在内。例如,虽然所需要的分支相加(addition)或拼接(concatenation)的计算可以忽略不计,但MAC是重要的。此外,MAC在分组卷积中占据了很大一部分时间。另一方面,在相同的 FLOPs情况下,具有高并行度的模型可能比另一个具有低并行度的模型要快得多。由于多分支拓扑在初始化和自动生成的体系结构中被广泛采用,因此使用了多个小的运算符而不是几个大的运算符。
(2)节约显存
多分支拓扑结构的 内(显)存效率是非常低下的,因为每个分支的结果都需要保留到叠加或拼接,这大大提高了内存占用。如下图所示,Residual Block的输入需要保持到加法为止。假设Block保持feature map大小,则内存占用保持在2倍作为输入空间。相比之下,普通拓扑允许特定层的输入所占用的内存在操作完成后立即释放。
(3)灵活性
多分支拓扑对体系结构规范施加了约束。例如,ResNet要求将conv层组织为Residual Block,这限制了灵活性,因为每个Residual Block的最后一个conv层必须产生相同形状的张量,否则Shortcut将没办法进行。
多分支拓扑限制了通道剪枝的应用,多分支模型修剪后导致显著的性能下降或较低的加速比。相反,普通架构允许我们根据需求自由配置每个conv层,并进行修剪,以获得更好的性能-效率平衡。
2.RepVGG网络结构
图A表示的是原始的ResNet网络,该网络中包含着Conv1×1 的残差结构和Identity的残差结构,正是这些残差结构的存在解决了深层网路中的梯度消失问题,使得网络更加易于收敛。图B表示的是训练阶段的RepVGG网络架构,整个网络的主体结构和ResNet网络类似,两个网络中都包含残差结构。两个网络中的主要差异如下所述:
(1)RepVGG网络中的残差块并没有跨层。
(2)整个网络包含2种残差结构,一种是残差结构仅仅包含Conv1×1残差分支;另外则不仅包含Conv1×1的残差结构,而且包含Identity残差结构。由于残差结构具有多个分支,就相当于给网络增加了多条梯度流动的路径,训练一个这样的网络,其实类似于训练了多个网络,并将多个网络融合在一个网络中,类似于模型集成的思路,不过这种思路更加简单和高效!!
(3)模型的初始阶段使用了简单的残差结构,随着模型的加深,使用了复杂的残差结构,这样不仅仅能够在网络的深层获得更鲁邦的特征表示,而且可以更好的处理网络深层的梯度消失问题。
图C表示的是推理阶段的RepVGG网络,该网络的结构非常简单,整个网络均是由Conv3×3+Relu堆叠而成,易于模型的推理和加速。
3.重新指定推理时间模型的参数
如何将一个训练块转换成一个单独的3×3的conv层进行推理, 如图
否则,如果不使用identity branch,因此上述方程只有前两项。这里bn是推理时间bn函数:
首先将每一个BN及其前面的卷积层转换成一个带有bias向量的卷积。让{W', b'} 是从{W, μ,γ,b} 转换过来的kernel和bias:
上述变换也适用于identity branch,因为单位映射可以被视为以单位矩阵为核的1x1 conv。如Figure 4所示,经过这样的变换,将得到一个3x3 kernel,2个1x1 kernel,和3个bias向量。然后获得通过添加了3个bias向量的最终bias,最后3x3 kernel通过添加1x1 kernel的中心点上3x3的kernel,这可以很容易地由第1个零填充两个1x1内核实现3x3和添加3个kernel。需要注意的是,这些转换的等价性要求3x3层和1x1层具有相同的stride,而1x1层的padding配置要比3x3层少一个像素。例如,对于一个3x3层,填充一个像素的输入,这是最常见的情况,1x1层应该有padding=0。
(1)3x3卷积和1x1卷积融合
(2)identity分支等效特殊权重卷积层
identity前后值不变,那么我会想到是用权重等于1的卷积核,并分开通道进行卷积,即1x1的,权重固定为1的Depthwise卷积
但是3x3和1x1分支都不是Depthwise卷积,现在也是不能融合进去的,
需要把Depthwise卷积以普通卷积的形式表达出来。因为普通卷积输出是将各个通道结果相加,只要将当前通道对应的卷积权重设置为1,而其他通道权重设置为0,就等价Depthwise卷积。其中灰色的地方均表示为0
(3)代码实现
三、实验结果
四、总结与分析
RepVGG是一个分类网路,该网络是在VGG网络的基础上进行改进,结合了VGG网络和ResNet网络的思路,主要的创新点包括:
(1)在VGG网络的Block块中加入了Identity和残差分支,相当于把ResNet网络中的精华应用到VGG网络中;
(2)模型推理阶段,通过Op融合策略将所有的网络层都转换为Conv3×3,便于模型的部署与加速。
(3)这是一个通用的提升性能的Tricks,可以利用该Backbone来替换不同任务中的基准Backbone,算法性能会得到一定程度的提升。
尽管RepVGG网络具有以上的优势,但是该网络中也存在一些问题,具体的问题包括:
(1)从训练阶段转推理阶段之前,需要执行模型重参数化操作;
(2)在模型重参数化过程中会增加一些额外的计算量;
(3)由于每个残差块中引入了多个残差分支,网络的参数量也增加了一些。
论文信息
论文地址:https://arxiv.org/abs/2101.03697
代码地址:https://github.com/DingXiaoH/RepVGG
人民中科(济南)智能技术有限公司是人民网与中科院自动化所联合发起设立的“人工智能技术引擎”和科技成果转化平台,以内容安全为初始应用场景,建设内容智能理解核心能力,目标是成为全球内容科技领导企业
本文暂时没有评论,来添加一个吧(●'◡'●)