【重参数化卷积网络】RepVGG 网络解析

【重参数化卷积网络】RepVGG 网络解析

1. 介绍

论文地址:RepVGG: Making VGG-style ConvNets Great Again

VGG网络是2014年由牛津大学著名研究组VGG (Visual Geometry Group) 提出的。VGG网络解析可以参考:经典的图卷积网络框架(LeNet、AlexNet、VGGNet、InceptionNet 、ResNet、DenseNet)

  • 在2014到2016年(ResNet提出之前),VGG网络可以说是当时最火并被广泛应用的Backbone。后面由于各种新的网络提出,论精度VGG比不上ResNet,论速度和参数数量VGG比不过MobileNet等轻量级网络,慢慢的VGG开始淡出人们的视线。

当VGG已经被大家遗忘时,2021年清华大学、旷视科技以及香港科技大学等机构共同提出了RepVGG网络,希望能够让VGG-style网络Great Again。

从上图可以看出:RepVGG无论是在精度还是速度上都已经超过了ResNet、EffcientNet以及ReNeXt等网络。

那RepVGG究竟用了什么方法使得VGG网络能够获得如此大的提升呢?作者提到了structural re-parameterization technique方法,即结构重参数化。

  • 在训练时,使用一个类似ResNet-style的多分支模型;(训练的时候正常训练,不重参数化)
  • 而推理时转化成VGG-style的单路模型。(结构重参数化)

如下图所示,

  • 图(B)表示RepVGG训练时所采用的网络结构,
  • 而在推理时采用图(C)的网络结构。

关于如何将图(B)转换到图(C)以及为什么要这么做后面再细说,如果对模型优化部署有了解就会发现这和做网络图优化或者说算子融合非常类似。
在这里插入图片描述

2. 模型详解

RepVGG 在训练时候的模型很好理解,就是在不断堆叠RepVGG Block,只要之前看过VGG以及ResNet的代码,那么理解RepVGG也很容易。由于论文中的图都是简化过的,针对训练时采用的结构图如下

  • 左图是进行下采样(stride=2)时使用的RepVGG Block结构,
  • 右图是正常的(stride=1)RepVGG Block结构。通过图(b)可以看到训练时RepVGG Block并行了三个分支:一个卷积核大小为3x3的主分支,一个卷积核大小为1x1的shortcut分支以及一个只连了BN的shortcut分支。
    在这里插入图片描述

2.1 两个有可能的问题

1)关于 为什么训练时要采用多分支结构

  • 如果之前看过像Inception系列、ResNet以及DenseNet等模型,我们能够发现这些模型都并行了多个分支。
  • 至少根据现有的一些经验来看,并行多个分支一般能够增加模型的表征能力。所以你会发现一些论文喜欢各种魔改网络并行分支。在论文的表6中,作者也做了个简单的消融实验,在使用单路结构时(不使用其他任何分支)Acc大概为72.39,在加上Identity branch以及1x1 branch后Acc达到了75.14。
    在这里插入图片描述

2)关于 为什么推理时作者要将多分支模型转换成单路模型

根据论文3.1章节的内容可知,采用单路模型会更快、更省内存并且更加的灵活。

  • 更快:主要是考虑到模型在推理时硬件计算的并行程度以及MAC(memory access cost),对于多分支模型,硬件需要分别计算每个分支的结果,有的分支计算的快,有的分支计算的慢,而计算快的分支计算完后只能干等着,等其他分支都计算完后才能做进一步融合,这样会导致硬件算力不能充分利用,或者说并行度不够高。而且每个分支都需要去访问一次内存,计算完后还需要将计算结果存入内存(不断地访问和写入内存会在IO上浪费很多时间)。
  • 更省内存:在论文的图3当中,作者举了个例子,如图(A)所示的Residual模块,假设卷积层不改变channel的数量,那么在主分支和shortcut分支上都要保存各自的特征图或者称Activation,那么在add操作前占用的内存大概是输入Activation的两倍,而图(B)的Plain结构占用内存始终不变。
    在这里插入图片描述
  • 更加灵活:作者在论文中提到了模型优化的剪枝问题,对于多分支的模型,结构限制较多剪枝很麻烦,而对于Plain结构的模型就相对灵活很多,剪枝也更加方便。
  • 另外,在多分支转化成单路模型后很多算子进行了融合(比如Conv2d和BN融合),使得计算量变小了,而且算子减少后启动kernel的次数也减少了(比如在GPU中,每次执行一个算子就要启动一次kernel,启动kernel也需要消耗时间)。而且现在的硬件一般对3x3的卷积操作做了大量的优化,转成单路模型后采用的都是3x3卷积,这样也能进一步加速推理。如下图多分支模型(B)转换成单路模型图(C)。
    在这里插入图片描述

2.2 结构重参数化

在简单了解RepVGG Block的训练结构后,接下来再来聊聊结构重参数化(也是模型的最重要部分)。怎么将训练好的RepVGG Block 转成推理时的模型结构,即structural re-parameterization technique过程。

根据论文中的图4(左侧)可以看到,结构重参数化主要分为两步,

  • 第一步主要是将Conv2d算子和BN算子融合、将BN的分支转换成一个Conv2d算子;
  • 第二步将每个分支上的3x3卷积层融合成一个卷积层。

关于参数具体融合(重参数化)的过程可以看图中右侧的部分。
在这里插入图片描述

2.2.1 融合Conv2d和BN

关于Conv2d 和 BN的融合对于网络的优化已经很普遍了。因为Conv2d和BN两个算子都是做线性运算,所以可以融合成一个算子。

  • 这里还需要强调一点,融合是在网络训练完之后做的,所以现在讲的默认都是推理模式;
  • 注意BN在训练以及推理时计算方式是不同的。

对于卷积层,每个卷积核的通道数是与输入特征图的通道数相同,卷积核的个数决定了输出特征图的通道个数。对于BN层(推理模式),主要包含4个参数:μ (均值)、 σ 2 \sigma^2 σ2 (方差)、γ 和 β,其中μ 和 σ 2 \sigma^2 σ2 是训练过程中统计得到的,γ 和 β 是训练学习得到的。对于特征图第 i 个通道BN的计算公式如下,其中 ϵ 是一个非常小的常量,防止分母为零:
在这里插入图片描述
在论文的3.3章节中,作者给出了转换公式(对于通道i),其中M MM代表输入BN层的特征图(Activation),这里忽略了 ϵ :
在这里插入图片描述
因此,整合Conv2d和BN层,可以得到融合后新的卷积层权重计算公式为(对于第i个卷积核),W ′ 和 b′ 是新的权重和偏置:
在这里插入图片描述

例子如下
这里假设输入的特征图(Input feature map)如下图所示,输入通道数为2,然后采用两个卷积核(输出通道为2)。

  • 这里解释一下,一个卷积核处理两个通道,也即一个卷积核包含两个卷积算子,图中只画了第一个卷积核对应参数。

在这里插入图片描述
接着计算输出的特征:下图中(Output feature map)通道1上的第一个元素,即当卷积核1在输入特征图红色框区域卷积时得到的值(为了保证输入输出特征图高宽不变,所以对Input feature map进行了Padding)。其他位置的计算过程类似这里就不去演示了。
在这里插入图片描述
然后再将卷积层输出的特征图作为BN层的输入,这里同样计算一下输出特征图(Output feature map)通道1上的第一个元素,按照上述BN在推理时的计算公式即可得到如下图所示的计算结果。
在这里插入图片描述

最后对上述计算公式进行简单的变形,

  • 可以得到转化后新卷积层只需在对应第 i 个卷积核的权重上乘以 γ i σ i 2 + ϵ \frac{\gamma_i}{\sqrt{\sigma^2_i+\epsilon}} σi2+ϵ γi 系数;
  • 对应第 i 个卷积核新的偏执就等于 β i − μ i γ i σ i 2 + ϵ \beta_i-\frac{\mu_i \gamma_i}{\sqrt{\sigma^2_i + \epsilon}} βiσi2+ϵ μiγi(因为之前采用Conv2d+BN的组合中Conv2d默认是不采用偏执的或者说偏执为零)。
    在这里插入图片描述

2.2.2 将1x1卷积转换成3x3卷积

这个过程比较简单,如下图所示,

  • 以1x1卷积层中某一个卷积核为例,只需在原来权重周围补一圈零就行了,这样就变成了3x3的卷积层,注意为了保证输入输出特征图高宽不变,此时需要将padding设置成1(原来卷积核大小为1x1时padding为0)。
  • 接着,按照上述2.2.1中 讲的内容将 卷积层 和 BN 层进行融合即可。
    在这里插入图片描述

2.2.3 将BN转换成3x3卷积

对于只有BN的分支由于没有卷积层,因此我们可以先自己构建出一个卷积层来。如下图所示,

  • 构建了一个3x3的卷积层,该卷积层只做了恒等映射,即输入输出特征图不变。
  • 既然有了卷积层,那么又可以按照上述2.2.1中讲的内容将卷积层和BN层进行融合。
    在这里插入图片描述

2.2.4 多分支融合

在这里插入图片描述
上述,我们已经讲了如何把每个分支融合转换成一个3x3的卷积层(如上图所示),接下来需要进一步将多分支转换成一个单路3x3卷积层。

  • 合并的过程其实也很简单,直接将这三个卷积层的参数相加即可,具体推理过程就不讲了,如果不了解的可以自己动手算算。(如下图所示)
    在这里插入图片描述

3. 模型细节与实验结果

在这里插入图片描述
在这里插入图片描述

4. 参考

【1】https://blog.csdn.net/qq_37541097/article/details/125692507
【2】https://www.bilibili.com/video/BV15f4y1o7QR

猜你喜欢

转载自blog.csdn.net/qq_51392112/article/details/129857626
今日推荐