https://arxiv.org/pdf/2101.03697.pdf
repVGG, 没错就是这么简单,一眼望去只有3*3的卷积核和ReLU函数构成。
今年三月份发布这项工作叫做RepVGG,标题是重振VGG荣光。但是其实在训练的时候,RepVGG也使用了分支结构,更多借鉴的是ResNet模型。Rep指的是reparameterization 重参数化,多个分支的卷积操作,完全可以由合适参数的单个卷积核进行替代。
简单的模型运算更快,更容易得到不同设备的优化支持,带分支的模型可以帮助训练,得到更好的参数。而RepVGG既要还要,靠的就是重参数对训练和推理时的模型结构进行结构。
回顾一下ResNet 和 VGG
VGG的特点是模块化的网络,模型结构简单而且灵活。第一版的ResNet,基于VGG网络加入了跳跃连接用来应对模型退化问题。
不过分支也引入了一些麻烦,比如连接处需要特征图通道数相同。ResNet在每个阶段通道数会加倍,所以使用了1*1卷积让分支上通道数也加倍。并用步长为2的卷积使特征图尺寸减半。
我们在模型结构上花的很多心思,比如跳跃连接,其实都是在帮助训练。训练完毕后,参数就不变了,那么这些分支结构在推理时,就只能徒增烦恼。
RepVGG的训练模型主要借鉴的是ResNet模。由于如果跳跃连接的主干中存在激活函数就没有办法使用重参数化,所以作者做了些必要的修改。
参数少不一定快
虽然精心设计的复杂模型往往可以比同参数量的简单模型表现得更好,但是运算速度却不一定快,因为内存的存取也是要耗时的,有分支就意味着要占用更多的内存。
分支中的特征图尺寸保持不变时,需要两倍的内存。
而且对于不同设备来说,简单的模型可以通过一些快速算法大大减少实际的运算量,参考Winograd快速卷积算法。
重参数
主要是处理一下BN层,BN就是对某一层的输出进行归一化然后再重新缩放和平移。
BN先归一化(μ,σ),再加权求和(γ,β)。
阴影层是bn层,计算过程见下图
式子1计算的是上图从输入经过三个分支求和得到输出,式子2描述的就是对卷积操作后的值进行批量归一化,用式子3转化得到的卷积核参数和偏置,等效于原来的卷积加BN。对于恒等映射的分支,也可以看成是经过一个1*1单位矩阵卷积。
如果大卷积和小卷积的步长相同,那么就可以用简单叠加的方法合多个分支的卷积核,用单个卷积来替代,小卷积通过补零的方式padding成大卷积的尺寸。
总之RepVGG结构简单,实际推理速度快,重参数化的trick对多分支结构过河拆桥,捡了便宜而又全身而退,在实际项目中应该很有用处。