概念
结构重参数化(structural re-parameterization)指的是首先构造一系列结构(一般用于训练),并将其参数等价转换为另一组参数(一般用于推理),从而将这一系列结构等价转换为另一系列结构。在现实场景中,训练资源一般是相对丰富的,我们更在意推理时的开销和性能,因此我们想要训练时的结构较大,具备好的某种性质(更高的精度或其他有用的性质,如稀疏性),转换得到的推理时结构较小且保留这种性质(相同的精度或其他有用的性质)。换句话说,“结构重参数化”这个词的本意就是:用一个结构的一组参数转换为另一组参数,并用转换得到的参数来参数化(parameterize)另一个结构。只要参数的转换是等价的,这两个结构的替换就是等价的。
(1) 推理时的等价性不代表训练时的等价性。以RepVGG为例,3x3-BN + 1x1-BN + BN最后得到的结构就是一个3x3卷积。也就是说,最终得到那一组参数是OxCx3x3,直接训一个3x3卷积最终得到的也是OxCx3x3。但这两组参数只是形状相同而已,并不代表后者的性能跟前者一样。再举个最简单的例子,一个带BN的卷积就可以等价转换为一个带bias的卷积(即工业界常说的“吸BN”),总不能说训练时前者也等价于后者嘛。至于为什么前者比后者更好,这就是一个本质上非常复杂的训练动力学(training dynamics)问题了。这个问题的解决恐怕要依赖更多“打开深度学习的黑箱”之类的工作。
(2) 大就是猛,多就是好,大力出奇迹,越多越work。一般来说,加参数总是有好处的。但是既然不能不考虑推理开销,我们就希望加一些能在推理阶段去掉的参数,事实证明这样也是有好处的。
(3) 构造的结构提供了模型本身所缺乏的某种性质,为某些花式操作提供了空间。例如,VGG式直筒模型缺乏分支结构和短的路径,我们就构造shortcut,给它加上分支和短的路径,只不过这些结构只在训练时存在而已;通道剪枝问题中“记忆”(保持模型精度不降低)和“遗忘”(制造稀疏性)耦合在一起(同一组参数同时参与记忆和遗忘有关的损失函数),我们就引入额外的1x1卷积,让这些额外的结构去“遗忘”,避免这种耦合。
(4) 构造的结构增加了“多样化的链接”和更多的“训练时非线性”。在Diverse Branch Block的实验中,我们报告了一些有意思的发现。按理说1x1卷积的表征能力弱于3x3卷积,因为前者可以看作一个有很多参数为0的3x3卷积,但是1x1 + 3x3的性能却明显好于3x3 + 3x3,也就是说一个强结构加一个弱结构好于两个强结构相加;BN虽然推理时是线性的,但训练时是非线性的,在DBB的各个分支里去掉BN则效果减弱很多。