这是用户在 2024-8-24 20:10 为 https://zhuanlan.zhihu.com/p/361090497 保存的双语快照页面,由 沉浸式翻译 提供双语支持。了解如何保存?
首发于司图笔记
结构重参数化:利用参数转换解耦训练和推理结构

结构重参数化:利用参数转换解耦训练和推理结构

591 人赞同了该文章
发布于 2021-03-30 17:43 ,编辑于 2021-04-26 15:10

更新:RepVGG的更深版本达到了83.55%正确率!PyTorch代码和模型已经在GitHub上放出。DingXiaoH/RepVGG

本届CVPR收成不错,在旷视实习期间的工作RepVGG和Diverse Branch Block(也可以称之为ACNet v2)都中了。前者是VGG类极简架构,3x3卷积一卷到底,连分支结构都没有,ImageNet上可达80.5%正确率,跟SOTA架构如RegNet比都有可见的性能提升。代码和模型全都放出了,Git上已经1400+ star了。之前写了个稿子在这里: 丁霄汉:RepVGG:极简架构,SOTA性能,让VGG式模型再次伟大(CVPR-2021)

后者是一个通用building block,可以用一个很像Inception的block(其中包括average pooling,1x1-BN-3x3-BN连续卷积)来替换通常的卷积,极大地丰富模型的微观结构,提升多种架构的性能。有意思的点在于,这样一个复杂的block可以在训练结束后等价转换为一个卷积,因此模型的最终大小和速度(相对于使用普通卷积的模型)完全不变

这两个工作的共同点在于用了结构重参数化技术,“重参数化宇宙”已经初具雏形:结构A对应一组参数X,结构B对应一组参数Y,如果我们能将X等价转换为Y,就能将结构A等价转换为B。同样思想的还有ACNet(ICCV-2019)和ResRep(去年做的一个剪枝方法,Res50无损压缩超过50%,也就是说从76.15%的标准模型压到76.15%,真正意义的无损)。

总的来说,我相信重参数化是很有搞头的,既可暴力提性能,也可无损搞压缩,还能简单搭架构,肯定还有很多东西可以挖掘。

论文链接:

RepVGG:arxiv.org/abs/2101.0369

DiverseBranchBlock:arxiv.org/abs/2103.1342

ACNet:arxiv.org/abs/1908.0393

ResRep:arxiv.org/abs/2007.0326

代码全都在:github.com/DingXiaoH

下面介绍一下重参数化思想及其应用。

结构与参数

模型中的一个卷积层、一个block等都可以称为一个结构。我们所说的参数主要指的是

(1) 学得的参数(learnable params)。

(2) 其他在训练过程中得到的参数,如batch norm(BN)累积得到的均值和标准差。

我们主要考虑那些带参数的结构,并从参数的视角来看待这些结构。例如,一个input_channels=C, output_channels=O, kernel_size=KxK的卷积层,参数为一个OxCxKxK的四阶张量,记这个张量为W。这样我们就将W和这个卷积层建立了一一对应的关系。

既然一组参数和一个结构是一一对应的,我们就可以通过将一组参数转换为另一组参数来将一个结构转换为另一个结构。例如,如果我们通过某种办法把W变成了一个(O/2)xCxKxK的张量,那这个卷积层自然就变成了一个输出通道为O/2的卷积层。

再举个最简单的例子,两个全连接层之间如果没有非线性的话就可以转换为一个全连接层。设这两个全连接层的参数为矩阵AB,输入为x,则输出为y=B(Ax)。我们可以构造C=BA,则有y=B(Ax)=Cx。那么C就是我们得到的全连接层的参数。

结构重参数化

我们所提出的概念结构重参数化(structural re-parameterization)指的是首先构造一系列结构(一般用于训练),并将其参数等价转换为另一组参数(一般用于推理),从而将这一系列结构等价转换为另一系列结构。在现实场景中,训练资源一般是相对丰富的,我们更在意推理时的开销和性能,因此我们想要训练时的结构较大,具备好的某种性质(更高的精度或其他有用的性质,如稀疏性),转换得到的推理时结构较小且保留这种性质(相同的精度或其他有用的性质)。换句话说,“结构重参数化”这个词的本意就是:用一个结构的一组参数转换为另一组参数,并用转换得到的参数来参数化(parameterize)另一个结构。只要参数的转换是等价的,这两个结构的替换就是等价的。

下面介绍几个我们提