searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

网络重参数化

2023-06-26 08:23:47
15
0

一、算法介绍

  1. 背景

在2014到2016年(ResNet提出之前),VGG网络可以说是当时最火并被广泛应用的Backbone。后面由于各种新的网络提出,论精度VGG比不上ResNet,论速度和参数数量VGG比不过MobileNet等轻量级网络,慢慢的VGG开始淡出人们的视线。当VGG已经被大家遗忘时,2021年清华大学、旷视科技以及香港科技大学等机构共同提出了RepVGG网络,希望能够让VGG-style网络Great Again。

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

 

  1. 详细过程

两个问题:1、为什么训练时要采用多分支结构?2、为什么推理时要将多分支结构转换成单路结构?

下面就来回答这两个问题。

针对问题1,左图是进行下采样(stride=2)时使用的RepVGG Block结构,右图是正常的(stride=1)RepVGG Block结构。通过右图可以看到训练时RepVGG Block并行了三个分支:一个卷积核大小为3x3的主分支,一个卷积核大小为1x1的shortcut分支以及一个只连了BN的shortcut分支。答案很简单,因为并行多个分支一般能够增加模型的表征能力。

针对问题2,回答是:

更快:主要是考虑到模型在推理时硬件计算的并行程度以及MAC(memory access cost),对于多分支模型,硬件需要分别计算每个分支的结果,有的分支计算的快,有的分支计算的慢,而计算快的分支计算完后只能干等着,等其他分支都计算完后才能做进一步融合,这样会导致硬件算力不能充分利用,或者说并行度不够高。而且每个分支都需要去访问一次内存,计算完后还需要将计算结果存入内存(不断地访问和写入内存会在IO上浪费很多时间)。

更省内存:如下图(A)所示的Residual模块,假设卷积层不改变channel的数量,那么在主分支和shortcut分支上都要保存各自的特征图或者称Activation,那么在add操作前占用的内存大概是输入Activation的两倍,而图(B)的Plain结构占用内存始终不变。

更加灵活:作者在论文中提到了模型优化的剪枝问题,对于多分支的模型,结构限制较多剪枝很麻烦,而对于Plain结构的模型就相对灵活很多,剪枝也更加方便。

其实除此之外,在多分支转化成单路模型后很多算子进行了融合(比如Conv2d和BN融合),使得计算量变小了,而且算子减少后启动kernel的次数也减少了(比如在GPU中,每次执行一个算子就要启动一次kernel,启动kernel也需要消耗时间)。而且现在的硬件一般对3x3的卷积操作做了大量的优化,转成单路模型后采用的都是3x3卷积,这样也能进一步加速推理。

所以,RepVGG的精度靠多支路并行支持,速度靠什么呢?

就是本文的重中之重,结构重参数化

根据上图可以看到,结构重参数化主要分为两步,第一步主要是将Conv2d算子和BN算子融合以及将只有BN的分支转换成一个Conv2d算子,第二步将每个分支上的3×3卷积层融合成一个卷积层。

2.1 融合Conv2d和BN

对于卷积层,每个卷积核的通道数是与输入特征图的通道数相同,卷积核的个数决定了输出特征图的通道个数。对于BN层,主要包含4个参数:μ(均值)、σ2(方差)、γ和β,其中μ和σ是训练过程中统计得到的,γ和β是训练学习得到的。对于特征图第i个通道BN的计算公式如下,其中ϵ是一个非常小的常量,防止分母为零:

在论文中,作者给出了转换公式(对于通道i),其中M代表输入BN层的特征图,这里忽略了ϵ,因为:

所以转换后新的卷积层权重计算公式为(对于第i个卷积核),W′和b′是新的权重和偏置:

卷积核的层数等于输入特征图的通道数,卷积核的个数等于输出特征图的通道数。

这里假设输入的特征图如下图所示,输入通道数为2,然后采用两个卷积核(图中只画了第一个卷积核对应参数)。

最后对上述计算公式进行简单的变形,可以得到转化后新卷积层只需在对应第i个卷积核的权重上乘以系数即可,对应第i个卷积核新的偏置就等于(因为之前采用Conv2d+BN的组合中Conv2d默认是不采用偏置的或者说偏置为零)。

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

这个过程比较简单,如下图所示,以1x1卷积层中某一个卷积核为例,只需在原来权重周围补一圈零就行了,这样就变成了3x3的卷积层,注意为了保证输入输出特征图高宽不变,此时需要将padding设置成1(原来卷积核大小为1x1时padding为0)。最后按照上述2.1中讲的内容将卷积层和BN层进行融合即可。

2.3 将BN转换成3x3卷积

对于只有BN的分支由于没有卷积层,所以我们可以先自己构建出一个卷积层来。如下图所示,构建了一个3×3的卷积层,该卷积层只做了恒等映射,即输入输出特征图不变。既然有了卷积层,那么又可以按照上述2.1中讲的内容将卷积层和BN层进行融合。

2.4 多分支融合

直接将这三个卷积层的参数相加(add)即可,纯线性计算。

  1. 实验

  1. 结论

论文提出了VGG风格的单分支网络结构RepVGG,能够比结构复杂的多分支网络更优秀,主要包含以下特点:

1、模型跟VGG类似,不包含任何分支,无需保存过多的中间结果,内存占用少。

2、模型仅包含3×3卷积和ReLU,计算速度快。

3、具体的网络结构(包括深度和宽度)不需要依靠自动搜索、人工调整以及复合缩放等复杂手段进行设计,十分灵活。

RepVGG将训练推理网络结构进行独立设计,在训练时使用高精度的多分支网络学习权值,在推理时使用低延迟的单分支网络,然后通过结构重参数化将多分支网络的权值转移到单分支网络。RepVGG性能达到了SOTA,思路简单新颖,相信可以在上面做更多的工作来获得更好的性能。

 

附件

论文地址

https://arxiv.org/abs/2101.03697

代码

https://github.com/DingXiaoH/RepVGG

 

0条评论
作者已关闭评论
h****n
5文章数
0粉丝数
h****n
5 文章 | 0 粉丝
原创

网络重参数化

2023-06-26 08:23:47
15
0

一、算法介绍

  1. 背景

在2014到2016年(ResNet提出之前),VGG网络可以说是当时最火并被广泛应用的Backbone。后面由于各种新的网络提出,论精度VGG比不上ResNet,论速度和参数数量VGG比不过MobileNet等轻量级网络,慢慢的VGG开始淡出人们的视线。当VGG已经被大家遗忘时,2021年清华大学、旷视科技以及香港科技大学等机构共同提出了RepVGG网络,希望能够让VGG-style网络Great Again。

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

 

  1. 详细过程

两个问题:1、为什么训练时要采用多分支结构?2、为什么推理时要将多分支结构转换成单路结构?

下面就来回答这两个问题。

针对问题1,左图是进行下采样(stride=2)时使用的RepVGG Block结构,右图是正常的(stride=1)RepVGG Block结构。通过右图可以看到训练时RepVGG Block并行了三个分支:一个卷积核大小为3x3的主分支,一个卷积核大小为1x1的shortcut分支以及一个只连了BN的shortcut分支。答案很简单,因为并行多个分支一般能够增加模型的表征能力。

针对问题2,回答是:

更快:主要是考虑到模型在推理时硬件计算的并行程度以及MAC(memory access cost),对于多分支模型,硬件需要分别计算每个分支的结果,有的分支计算的快,有的分支计算的慢,而计算快的分支计算完后只能干等着,等其他分支都计算完后才能做进一步融合,这样会导致硬件算力不能充分利用,或者说并行度不够高。而且每个分支都需要去访问一次内存,计算完后还需要将计算结果存入内存(不断地访问和写入内存会在IO上浪费很多时间)。

更省内存:如下图(A)所示的Residual模块,假设卷积层不改变channel的数量,那么在主分支和shortcut分支上都要保存各自的特征图或者称Activation,那么在add操作前占用的内存大概是输入Activation的两倍,而图(B)的Plain结构占用内存始终不变。

更加灵活:作者在论文中提到了模型优化的剪枝问题,对于多分支的模型,结构限制较多剪枝很麻烦,而对于Plain结构的模型就相对灵活很多,剪枝也更加方便。

其实除此之外,在多分支转化成单路模型后很多算子进行了融合(比如Conv2d和BN融合),使得计算量变小了,而且算子减少后启动kernel的次数也减少了(比如在GPU中,每次执行一个算子就要启动一次kernel,启动kernel也需要消耗时间)。而且现在的硬件一般对3x3的卷积操作做了大量的优化,转成单路模型后采用的都是3x3卷积,这样也能进一步加速推理。

所以,RepVGG的精度靠多支路并行支持,速度靠什么呢?

就是本文的重中之重,结构重参数化

根据上图可以看到,结构重参数化主要分为两步,第一步主要是将Conv2d算子和BN算子融合以及将只有BN的分支转换成一个Conv2d算子,第二步将每个分支上的3×3卷积层融合成一个卷积层。

2.1 融合Conv2d和BN

对于卷积层,每个卷积核的通道数是与输入特征图的通道数相同,卷积核的个数决定了输出特征图的通道个数。对于BN层,主要包含4个参数:μ(均值)、σ2(方差)、γ和β,其中μ和σ是训练过程中统计得到的,γ和β是训练学习得到的。对于特征图第i个通道BN的计算公式如下,其中ϵ是一个非常小的常量,防止分母为零:

在论文中,作者给出了转换公式(对于通道i),其中M代表输入BN层的特征图,这里忽略了ϵ,因为:

所以转换后新的卷积层权重计算公式为(对于第i个卷积核),W′和b′是新的权重和偏置:

卷积核的层数等于输入特征图的通道数,卷积核的个数等于输出特征图的通道数。

这里假设输入的特征图如下图所示,输入通道数为2,然后采用两个卷积核(图中只画了第一个卷积核对应参数)。

最后对上述计算公式进行简单的变形,可以得到转化后新卷积层只需在对应第i个卷积核的权重上乘以系数即可,对应第i个卷积核新的偏置就等于(因为之前采用Conv2d+BN的组合中Conv2d默认是不采用偏置的或者说偏置为零)。

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

这个过程比较简单,如下图所示,以1x1卷积层中某一个卷积核为例,只需在原来权重周围补一圈零就行了,这样就变成了3x3的卷积层,注意为了保证输入输出特征图高宽不变,此时需要将padding设置成1(原来卷积核大小为1x1时padding为0)。最后按照上述2.1中讲的内容将卷积层和BN层进行融合即可。

2.3 将BN转换成3x3卷积

对于只有BN的分支由于没有卷积层,所以我们可以先自己构建出一个卷积层来。如下图所示,构建了一个3×3的卷积层,该卷积层只做了恒等映射,即输入输出特征图不变。既然有了卷积层,那么又可以按照上述2.1中讲的内容将卷积层和BN层进行融合。

2.4 多分支融合

直接将这三个卷积层的参数相加(add)即可,纯线性计算。

  1. 实验

  1. 结论

论文提出了VGG风格的单分支网络结构RepVGG,能够比结构复杂的多分支网络更优秀,主要包含以下特点:

1、模型跟VGG类似,不包含任何分支,无需保存过多的中间结果,内存占用少。

2、模型仅包含3×3卷积和ReLU,计算速度快。

3、具体的网络结构(包括深度和宽度)不需要依靠自动搜索、人工调整以及复合缩放等复杂手段进行设计,十分灵活。

RepVGG将训练推理网络结构进行独立设计,在训练时使用高精度的多分支网络学习权值,在推理时使用低延迟的单分支网络,然后通过结构重参数化将多分支网络的权值转移到单分支网络。RepVGG性能达到了SOTA,思路简单新颖,相信可以在上面做更多的工作来获得更好的性能。

 

附件

论文地址

https://arxiv.org/abs/2101.03697

代码

https://github.com/DingXiaoH/RepVGG

 

文章来自个人专栏
重参数化
1 文章 | 1 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0