底层视觉干货,即可获取
借用丁霄汉博士的说法:“结构A对应一组参数X,结构B对应一组参数Y,如果我们能将X等价转换为Y,就能将结构A等价转换为B”。也就是,如果结构A是训练阶段的复杂结构,结构B是推理阶段的精简结构,训练阶段的结构A可以极大的丰富模型的微观结构,进而提升模型性能,但对于部署不够友好;与结构A等价的结构B更为精简,且能取得同等性能,部署更友好,但从头训练时因缺乏丰富的围观结构导致性能不佳。
那么,什么样的结构可以进行这样的转换呢?如果连续的两个操作均为线性变换,且两者中间未插入非线性激活,那么这两个操作就可以合并为一个等价的线性变换。假设输入为x,连续的两个线性变换为A和B,那么输出
;如果我们可以构造一个
,那么就有
。
那么,什么样的操作是线性变换呢?在深度学习中,卷积、BatchNorm、全连接层均为线性操作,像Conv+BN、Linear+BN的推理融合已成为一种非常基本的推理优化技巧。
在介绍具体方法之前,我们先来介绍一些关于卷积融合的基础知识。无论是Conv+BN的融合,还是Conv+Conv的融合,它们能融合的根本原因在于:操作的线性特性。
我们假设卷积输入通道数为C,输出通道数为D,卷积尺寸为
,那么其卷积核为
,偏置参数
可选。为方便后续的合并,我们将偏置参数表示为
,此时卷积可以表示如下:
输出通道的每个值可以表示如下:
卷积的线性特性可以从上述沟通推导得到,包含同质特性与加法特性:
注:加法特性只有当两个滤波器满足相同配置(比如通道数量、卷积核尺寸、stride、padding等等)时才满足。
一般而来,卷积与BN这对“基友”会同时出现,而两者在推理时又可以合并为单一卷积。那么如何合并呢?这个比较简单,公式如下:
这里利用了卷积的同质特性进行合并。变换后的卷积参数如下:
分支合并利用了卷积的加法特性,两个卷积的参数合并方式如下:
在这方面比较典型的网络是ACNet中的
等分支卷积的合并。
除了Add融合外,Concat进行多分支的融合是另一种最常见的方式。Concat方式的公式也是非常的简单,描述如下:
此时
。这里的组合是一种通用变换,可以将两个分支的卷积变换成组卷积形式。注:在这个情况下,该分支的卷积序列应当具有相同的groups参数。
这种情况的一个典型模块为SqueezeNet中Fire
模块,它由两路并行分支构成(一个分支为
,一个分支为
),最后通过concat进行融合。
我们可以将连续的
卷积与
卷积合并为单个
卷积;类似的,我们也可以将
卷积与
卷积合并为单个
卷积此时
与
两个卷积的卷积核分别为
与
(注:D可以是任意整数,所以这里可以极大的提升FLOPs,比如把D设置为10000,哈哈)。这两个卷积核的合并方法也是非常简单,公式如下:
注:
表示将
为
空间。
考虑到
可以通过零padding等价变换为
卷积,因此
可以等价的转换,这也就是ACNetV1的本质所在。谷歌提出的MixConv以及斯坦福大学提出的SqueezeNet中的Fire模块可视作这种情形下的一种特殊形式。
上面主要从一些通用场景进行介绍,实际应用场景中可能还包含一些特殊的操作,比如均值池化、depthwise卷积、组卷积、Identity(可视作参数固定的
卷积)等。
对于这些典型的操作,我们可以先将其转换为标准卷积性,再进行卷积的融合。事实上,我们还可以进行depthwise卷积+标准卷积的融合、标准卷积+组卷机的融合以重点突出近邻通道之间的相关性。
另外,需要指出的是卷积是全连接层的一个特例,即参数共享+稀疏形式的全连接层。因此,我们可以在某些特定条件下采用卷积对全连接层进行增广,比如最近提出的RepMLP。RepMLP是在ResNet的stage部分对bottleneck进行的操作,RepMLP理论上也可以在classifier部分进行增强处理。
当然,了解了上述原理后,大家就可以随机发挥了,只要等价并且能涨点就可以了。
上图给出了ExpandNet一文的重参数结构示意图,它采用了串联方式进行结构重参数。比如,采用
的组合最大程度的提升参数量以及模型性能,在推理阶段可以折叠为简单的
卷积。
需要注意的是:在串联重参数方案中,如果期望折叠后的卷积核尺寸为k,那么串联的卷积尺寸不能大于k,如果其中存在一个为k,那么其他的只能设置为1。比如,我们期望折叠后的卷积核尺寸为3,那么,我们只能采用1-3-1的组合;如果我们期望折叠后的卷积核尺寸为5,我们可以选择1-5-1的组合,也可以选择3-3的组合。总而言之:折叠前后的感受野必须一致。
上图给出了ACNet训练与推理时的结构示意图,它采用了并行方式进行结构重参数化。在推理阶段,它由
三种形式的卷积构成,这种配置用于提升中间“十”字骨架的权值。ACNet这种非对称结果在图像超分、目标检测等领域得到了应用,同时也出现在一些产品化方案中。
更详细介绍建议查看BBuf同学的解读:无痛的涨点技巧:ACNet
上图给出了DO-Conv的两种计算流程图,一种是特征分解模式,一种kernel分解模式。建议采用kernel分解模式,这种方式在训练完成后可以转换为固定的卷积核,达到训练重参数、推理轻参数的目的。
更详细介绍建议查看52CV的解读:DO-Conv无痛涨点:使用over-parameterized卷积层提高CNN性能
上图给出了RepVGG中的重参数示意图,它采用了Identity、
卷积以及
卷积进行重参数设置,在完成训练后,我们可以轻易的将Identity、
卷积三个分支合并为单个
卷积。
更详细介绍建议查看Happy的解读:RepVGG|让你的ConVNet一卷到底,plain网络首次超过80%top1精度。
上图给出了本文所设计的DBB结构示意图。类似Inception,它采用
等组合方式对原始
卷积进行增强。对于
分支,我们设置中间通道数等于输入通道数并将
卷积初始化为Identity矩阵;其他分支则采用常规方式初始化。此外,在每个卷积后都添加BN层用于提供训练时的非线性,这对于性能提升很有必要。
更详细介绍建议查看Happy的解读:CVPR2021|“无痛涨点”的ACNet再进化,清华大学&旷视科技提出Inception类型的DBB。
上图给出了RepMLP的结构示意图,它能同时利用卷积层的局部结构提取能力与全连接层的全局建模、位置感知特性。更详细的介绍建议查看Happy的解读:“重参数宇宙”再添新成员:RepMLP,清华大学&旷视科技提出将重参数卷积嵌入到全连接层。
上图为PSConv的示意图,它将多尺度卷积纳入到统一的架构中。上图可能不太容易看懂,我们来看下图,不同颜色代表不同的感受野。比如,红色代表
,蓝色代表
, 绿色代表
, 黄色代表
。当把所有的卷积核参考ACNet中方式padding到
后,是不是发现:PSConv就变为了简简单单的
卷积了。当然FLOPs也会变大不少。
PSConv的实现中采用了
三个尺度的感受野,如果按照重参数化方案进行转换的话,转换后的卷积核尺寸为
,计算量会进一步加剧,且现有框架对
以外的卷积优化程度不够,所以会导致速度变慢。如果我们固定转换后的卷积核尺寸是
的话,我们可以设计不同颜色区域采用不同的卷积:
。这样是不是就可以达到折叠的目的了,哈哈。
到此为止,我们基本上已经把业界知名的重参数化方案进行了简要性的介绍。如果有哪位同学想进行更多样的结构设计可参考笔者很早之前的一篇文章稀疏卷积在模型设计中的应用结合上述提到的折叠原理进行更多样性的模块设计。
比如下面几种简单的特例,注:这里仅列出了笔者在这方面探索时几个比较有用的组合,但这里的可尝试空间还是非常大的。
从笔者有限的了解来看,ACNet、ExpandNet的重参数思想在图像超分、图像去摩尔纹、目标检测中得到了不少应用,比如