RepVGG: Making VGG-style ConvNets Great Again —— 论文阅读笔记


在这里插入图片描述

Paper : https://arxiv.org/abs/2101.03697

Code : https://github.com/DingXiaoH/RepVGG

MegEngine : https://github.com/megvii-model/RepVGG

论文总览

在这里插入图片描述

本文通过结构重参数化,只使用 3x3 卷积和 ReLU 激活函数的单路极简架构在速度和性能上达到 SOTA 水平。

尽管许多复杂的卷积网络都比简单的卷积网络提供更高的准确性,但缺点很明显:

  1. 复杂的多分支设计(例如 ResNet 的残差连接和 Inception 的分支拼接)让模型更难实现和定制,并且降低了推理速度,减少了内存利用
  2. 一些组件(例如 Xception 和 MobileNets 的深度卷积,ShuffleNet 的通道洗牌)增加了内存访问成本,并且缺乏设备的支持。

由于影响推理速度的因素太多,浮点运算(FLOP)的数量不能准确反映实际速度。

而简单架构是快速、节省内存并且具有灵活性的

  • 快速: 3 × 3 3 \times 3 3×3 卷积非常快。单路架构非常快,因为并行度高。

    在这里插入图片描述

  • 节省内存。单路架构节省内存。

    在这里插入图片描述

  • 灵活性好,容易改变更曾的宽度

所以本文提出通过结构重参数化将多分支训练和简单架构推理分离,也就是通过转换网络的参数将架构从一种架构转换为另一种架构,如下图所示,使用(B)网络训练,然后通过结构重参数化转换为(C)网络进行推理。具体来说,如果某个结构的参数可以转换为由另一种结构的另一组参数,就可以用后者等效地替换前者,从而改变整个网络体系结构。

这样就可以同时利用多分支模型训练时的优势(性能高)和单路模型推理时的好处(速度快、省内存)。

在这里插入图片描述

方法

多分支训练

在训练时,为每一个 3x3 卷积层添加平行的 1x1 卷积分支和 identity 分支,构成一个 RepVGG Block(如上图)。这种设计是借鉴 ResNet 的做法,区别在于 ResNet 是每隔两层或三层加一分支,而我们是每层都加。

结构重参数化

怎么样把多分支训练网络重参数化为简单网络进行推理,也就是怎样将 3 × 3 , 1 × 1 3\times 3, 1\times1 3×3,1×1 和 identity 转换为一个 3 × 3 3 \times 3 3×3 卷积?

方法描述

1 × 1 1 \times 1 1×1 卷积相当于一个特殊的 3 × 3 3 \times 3 3×3 卷积(卷积核中有很多 0),而 identity 是一个特殊的 1 × 1 1 \times 1 1×1 卷积(单位矩阵),因此也是一个特殊的 3 × 3 3 \times 3 3×3 卷积。所以,把 identity 转换为 1 × 1 1 \times 1 1×1 卷积,只要构造出一个以单位矩阵为卷积核的 1 × 1 1 \times 1 1×1 卷积即可,把 1 × 1 1 \times 1 1×1 卷积等价转换为 3 × 3 3 \times 3 3×3 卷积,只要用 0 填充即可。而对于 BN 层,因为其参数包括累积得到的均值,标准差,缩放因子和偏置,所以推理时的卷积层和其后的 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 表示 3 × 3 3 \times 3 3×3 的卷积核,输入通道为 C 1 C_1 C1,输出通道为 C 2 C_2 C2 。使用 W ( 1 ) ∈ R C 2 × C 1 W^{(1)} \in \mathbb{R}^{C_2\times C_1 } W(1)RC2×C1 表示 1 × 1 1 \times 1 1×1 的卷积核。使用 μ ( 3 ) , σ ( 3 ) , γ ( 3 ) , β ( 3 ) \mu^{(3)}, \sigma^{(3)},\gamma^{(3)},\beta^{(3)} μ(3),σ(3)γ(3)β(3) 表示 3 × 3 3\times 3 3×3 卷积层后的 BN 层的均值,标准差,缩放因子和偏置。使用 μ ( 1 ) , σ ( 1 ) , γ ( 1 ) , β ( 1 ) \mu^{(1)}, \sigma^{(1)},\gamma^{(1)},\beta^{(1)} μ(1),σ(1)γ(1)β(1) 表示 1 × 1 1\times 1 1×1 卷积层后的 BN 层的均值,标准差,缩放因子和偏置。用 μ ( 0 ) , σ ( 0 ) , γ ( 0 ) , β ( 0 ) \mu^{(0)}, \sigma^{(0)},\gamma^{(0)},\beta^{(0)} μ(0),σ(0)γ(0)β(0) 表示 1 × 1 1\times 1 1×1 卷积层后的 BN 层的均值,标准差,缩放因子和偏置。使用 M ( 1 ) ∈ R N × C 1 × H 1 × W 1 , M ( 2 ) ∈ R N × C 2 × H 2 × W 2 M^{(1)} \in \mathbb{R}^{N\times C_1 \times H_1 \times W_1},M^{(2)} \in \mathbb{R}^{N\times C_2 \times H_2 \times W_2} M(1)RN×C1×H1×W1,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 ) = b n ( M ( 1 ) ∗ W ( 3 ) , μ ( 3 ) , σ ( 3 ) , γ ( 3 ) , β ( 3 ) ) + b n ( M ( 1 ) ∗ W ( 1 ) , μ ( 1 ) , σ ( 1 ) , γ ( 1 ) , β ( 1 ) ) + b n ( M ( 1 ) , μ ( 0 ) , σ ( 0 ) , γ ( 0 ) , β ( 0 ) ) \begin{aligned} M^{(2)} & = bn(M^{(1)} * W^{(3)}, \mu^{(3)}, \sigma^{(3)},\gamma^{(3)},\beta^{(3)}) \\ & + bn(M^{(1)} * W^{(1)}, \mu^{(1)}, \sigma^{(1)},\gamma^{(1)},\beta^{(1)}) \\ & + bn(M^{(1)}, \mu^{(0)}, \sigma^{(0)},\gamma^{(0)},\beta^{(0)}) \\ \end{aligned} 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 的公式为:
b n ( M , μ , σ , γ , β ) : , i : , : = ( M : , i : , : − μ i ) γ i σ i + β i bn(M, \mu, \sigma, \gamma, \beta)_{:,i:,:} = (M_{:,i:,:} - \mu_i) \frac{\gamma_i}{\sigma_i} + \beta_i bn(M,μ,σ,γ,β):,i:,:=(M:,i:,:μi)σiγi+βi
首先可以把每个 BN 和它前边的卷积层转换为一个带有偏置限量的卷积。使用 { W ′ , b ′ } \{W', b'\} { W,b} 表示转换后的卷积核和偏置,则:
W i , : , : , : ′ = γ i σ i W i , : , : , : ,        b i ′ = − μ i γ i σ i + β i W_{i,:,:,:}' = \frac{\gamma_i}{\sigma_i} W_{i,:,:,:}, \;\;\; b_i' = -\frac{\mu_i \gamma_i}{\sigma_i} + \beta_i Wi,:,:,:=σiγiWi,:,:,:,bi=σiμiγi+βi
因此
b n ( M ∗ W , μ , σ , γ , β ) : , i , : , : = ( M ∗ W ′ ) : , i , : , : + b i ′ bn(M * W, \mu, \sigma, \gamma, \beta)_{:,i,:,:} = (M * W')_{:,i,:,:} + b_i' bn(MW,μ,σ,γ,β):,i,:,:=(MW):,i,:,:+bi
举例说明

在这里插入图片描述

上图描述了这一转换过程,输入和输出通道都是2,则 3 × 3 3 \times 3 3×3 卷积的参数是 4 个 3 × 3 3 \times 3 3×3 矩阵, 1 × 1 1 \times 1 1×1 卷积的参数是一个 2 × 2 2 \times 2 2×2 矩阵。根据以上公式可以将它们及其 BN 层分别转换为 3 × 3 3 \times 3 3×3 卷积及其偏置,然后将它们分别相加即可。这样,每个 RepVGG Block 转换前后的输出完全相同,因而训练好的模型可以等价转换为只有 3 × 3 3 \times 3 3×3 卷积的单路模型。

网络架构

在这里插入图片描述

a, b 为缩放系数

对于图像分类,使用全局平均池化和一个全连接网络分类。对于其他的任务,可以使用任意层的特征图。

遵循三个简单的准则来决定每个 stage 的层数。

  1. 第一个 stage 具有高分辨率,很耗时,因此仅使用了一层
  2. 最后一个 stage 具有更多通道,因此仅使用一层来保存参数
  3. 将最多的层放到倒数第二个 stage(ImageNet上的输出分辨率为14×14)

使用 RepVGG-A 与其他轻型和中等模型比较,包括 ResNet-18/34/50,而 RepVGG-B 与高性能模型比较。

实验

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

局限性

RepVGG 是为 GPU 和专用硬件设计的高效模型,追求高速度、省内存,较少关注参数量和理论计算量。在低算力设备上,可能不如 MobileNet 和 ShuffleNet 系列适用。


参考文章:

RepVGG:极简架构,SOTA性能,让VGG式模型再次伟大(CVPR-2021)


猜你喜欢

转载自blog.csdn.net/m0_38007695/article/details/115302109