(写作日期:2022-08-18)
这篇文章提出一种新的VGG模型RepVGG。它使用重参数化技巧,能够让模型推理(inference)速度大幅提升。并取得SOTA性能。
VGG是一种经典的卷积神经网络。只堆叠卷积、ReLU、池化操作就在图像识别领域获得巨大成就。但随后的研究关注点转移到是否具有良好的网络结构设计,例如Inception、ResNet、DenseNet。这使得模型越来越复杂。这些复杂的卷积网络有明显的缺点。一是复杂的多分支设计让模型难以实现和自定义,拖慢推理速度和降低了内存利用率。二是一些随机混合操作增加了内存访问消耗,而且缺乏硬件设备支持。综合这些影响因素,理论FLOPs并不能精确的反映实际推理速度。
推理时RepVGG有以下VGG特征
1. 没有任何分支结构。即通常所说的plain或feed-forward架构。
2. 仅使用 3 × 3 3\times3 3×3卷积。
3. 仅使用ReLU作为激活函数。
多分支结构往往比plain结构表现要好。一个可能的解释是多分枝结构是一些浅层模型的一种隐式集成,所以避免了梯度消失的问题。鉴于此,文章提出解耦训练时架构和推理时架构。通过转换参数形式,来转换架构。
一个网络结构可以和一组参数对应,例如一个卷积层可以被一个4维核张量表示。在训练时RepVGG受到ResNet启发,用到了恒等(identity)分支和 1 × 1 1\times1 1×1分支,但这些分支是可被结构性地重参数化。这种转换可以看作是代数问题。恒等变换可以被视为 1 × 1 1\times 1 1×1卷积,然后也可以进一步降级为 3 × 3 3\times3 3×3卷积。于是训练时的恒等、 1 × 1 1\times1 1×1 、 3 × 3 3\times3 3×3分支和BN层就可以构筑为推理时的单独一个 3 × 3 3\times3 3×3核。
特别地,推理时RepVGG只有唯一一种操作:
3
×
3
3\times3
3×3卷积后跟ReLU。这样RepVGG在如GPUs等设备上运行非常快。在专门的设备上更是如此。
要注意到,在每个分支汇总前,都会进行BN操作。用 W ( 3 ) ∈ R C 2 × C 1 × 3 × 3 W^{(3)} \in \mathbb{R}^{C_{2} \times C_{1} \times 3 \times 3} W(3)∈RC2×C1×3×3表示 C 1 C_{1} C1输入、 C 2 C_{2} C2输出的 3 × 3 3\times3 3×3卷积核, W ( 1 ) ∈ R C 2 × C 1 W^{(1)} \in \mathbb{R}^{C_{2} \times C_{1}} W(1)∈RC2×C1表示1*1分支。 μ ( 3 ) σ ( 3 ) γ ( 3 ) β ( 3 ) \mu^{(3)}\sigma^{(3)}\gamma^{(3)}\beta^{(3)} μ(3)σ(3)γ(3)β(3)、 μ ( 1 ) σ ( 1 ) γ ( 1 ) β ( 1 ) \mu^{(1)}\sigma^{(1)}\gamma^{(1)}\beta^{(1)} μ(1)σ(1)γ(1)β(1)、 μ ( 0 ) σ ( 0 ) γ ( 0 ) β ( 0 ) \mu^{(0)}\sigma^{(0)}\gamma^{(0)}\beta^{(0)} μ(0)σ(0)γ(0)β(0)分别表示 3 × 3 3\times3 3×3、 1 × 1 1\times1 1×1和恒等分支的BN层的累计平均、标准差、可学习缩放因子、偏置。用 M ( 1 ) ∈ R N × C 1 × H 1 × W 1 M^{(1)} \in \mathbb{R}^{N \times C_{1} \times H_{1} \times W_{1}} M(1)∈RN×C1×H1×W1, M ( 2 ) ∈ R N × C 2 × H 2 × W 2 M^{(2)} \in \mathbb{R}^{N \times C_{2} \times H_{2} \times W_{2}} M(2)∈RN×C2×H2×W2表示输入和输出。用 ∗ * ∗表示卷积。假如有 C 1 = C 2 , H 1 = H 2 , W 1 = W 2 C_{1} = C_{2},H_{1} = H_{2},W_{1} = W_{2} C1=C2,H1=H2,W1=W2,则模块可以描述为
M ( 2 ) = bn ( M ( 1 ) ∗ W ( 3 ) , μ ( 3 ) , σ ( 3 ) , γ ( 3 ) , β ( 3 ) ) + bn ( M ( 1 ) ∗ W ( 1 ) , μ ( 1 ) , σ ( 1 ) , γ ( 1 ) , β ( 1 ) ) + bn ( M ( 1 ) , μ ( 0 ) , σ ( 0 ) , γ ( 0 ) , β ( 0 ) ) {M^{\left( 2 \right)} = \text{bn}\left( M^{\left( 1 \right)}*W^{\left( 3 \right)},\mu^{\left( 3 \right)},\sigma^{\left( 3 \right)},\gamma^{\left( 3 \right)},\beta^{\left( 3 \right)} \right) }\\{+ \text{bn}\left( M^{\left( 1 \right)}*W^{\left( 1 \right)},\mu^{\left( 1 \right)},\sigma^{\left( 1 \right)},\gamma^{\left( 1 \right)},\beta^{\left( 1 \right)} \right) }\\{+ \text{bn}\left( M^{\left( 1 \right)},\mu^{\left( 0 \right)},\sigma^{\left( 0 \right)},\gamma^{\left( 0 \right)},\beta^{\left( 0 \right)} \right)} M(2)=bn(M(1)∗W(3),μ(3),σ(3),γ(3),β(3))+bn(M(1)∗W(1),μ(1),σ(1),γ(1),β(1))+bn(M(1),μ(0),σ(0),γ(0),β(0))
这里的bn是推理时BN函数,正常情况下,对于 ∀ 1 ≤ i ≤ C 2 \forall 1 \leq i \leq C_{2} ∀1≤i≤C2,有
bn ( M , μ , σ , γ , β ) : , i , : , : = ( M : , i , : , : − μ i ) γ i σ i + β i \text{bn}\left( M,\mu,\sigma,\gamma,\beta \right)_{:,i,:,:} = \left( M_{:,i,:,:} - \mu_{i} \right)\frac{\gamma_{i}}{\sigma_{i}} + \beta_{i}\ bn(M,μ,σ,γ,β):,i,:,:=(M:,i,:,:−μi)σiγi+βi
为了将这些BN层和卷积层变换为可加的卷积和偏置,让 { W ′ , b ′ } \{ W^{'},b^{'}\} {W′,b′}作为变换 { W , μ , σ , γ , β } \{ W,\mu,\sigma,\gamma,\beta\} {W,μ,σ,γ,β}的结果,有
W i , : , : , : ′ = γ i σ i W i , : , : , : b i ′ = − μ i γ i σ i + β i W_{i,:,:,:}^{'} = \frac{\gamma_{i}}{\sigma_{i}}W_{i,:,:,:}\text{\ \ \ \ \ \ \ \ \ \ }b_{i}^{'} = - \frac{\mu_{i}\gamma_{i}}{\sigma_{i}} + \beta_{i} Wi,:,:,:′=σiγiWi,:,:,: bi′=−σiμiγi+βi
容易验证,有
bn ( M ∗ W , μ , σ , γ , β ) : , i , : , : = ( M ∗ W ′ ) : , i , : , : + b i ′ \text{bn}\left( M*W,\mu,\sigma,\gamma,\beta \right)_{:,i,:,:} = {(M*W')}_{:,i,:,:} + b_{i}^{'} bn(M∗W,μ,σ,γ,β):,i,:,:=(M∗W′):,i,:,:+bi′
恒等分支可以视为单位矩阵作为核的 1 × 1 1\times1 1×1卷积。而 1 × 1 1\times1 1×1核可以放置在 3 × 3 3\times3 3×3核的中心点,其余置零,从而作为一个 3 × 3 3\times3 3×3核。三个分支的核相加形成一个 3 × 3 3\times3 3×3核。三个分支的偏置直接相加。此时就获得单独一层卷积层,没有BN层。需要留意这种操作需要满足卷积层的步跨一致,边缘填充设置核 3 × 3 3\times3 3×3要比 3 × 3 3\times3 3×3核少1格的填充像素。
最终整个模型分为5个stage,RepVGG-A的5个stage分别有[1, 2, 4, 14, 1]层,RepVGG-B的5个stage分别有[1, 4, 6, 16, 1]层,宽度是[64, 128, 256, 512]的若干倍。
下图可以看到,相同推理速度下(每秒预测完成的样本数)RepVGG准确率高。同样准确率下RepVGG推理速度快