CNN之结构重参数化

什么是结构重参数化?

  • 我们知道模型要变好,就必须构建得更加复杂,但是这来这带来一个坏处,就是模型部署的耗时会增长,这两者是相互矛盾的,结构从参数化就是两者都可以做到,在训练的时候,通过复杂的神经网络去训练,提升模型的性能,但是在推理的时候,我通过对模型结构的重参数化生成了一个更加精简的结构,使推理的时候速度更快
  • RepVGG 的结构重参数化过程:上图是左边是训练时的卷积网络,右边通过对结构进行重参数化,得到一个只有 1 个分支的结构,因此可以做到训练时提升性能,推理时提升速度
  • 结构从参数化的基本原理卷积的可加性,对于同一个输入,只要其扫描频率一致(相同的通道数、kernel size、stride、padding),其卷积可过程可以融合。如下公式 1 是一个实数乘特征图和乘卷积是等效的,公式 2卷积核 F1 与 F2 可以被融合为 1 个卷积,卷积核为 (F1+F2)
  • I(pF)=p(IF)(1)IF(1)+IF(2)=I(F(1)+F(1))(2)\begin{matrix}I\otimes(pF)=p(I\otimes F) \quad&(1)\\I\otimes F^{(1)}+I\otimes F^{(2)}=I\otimes(F^{(1)}+F^{(1)})\quad&(2)\end{matrix}

ACNet 的网络结构?

  • 上图左边展示 3 个分支的卷积融合为一个等效卷积的过程;右边是卷积融合的过程,主要包括融合 BN (BN fusion) 和融合分支 (branch fusion)两个步骤
  • 融合 BN (BN fusion) :所有 BN 对输入操作一样,不改变输入分辨率,所以利用卷积的线性可加性,将 BN 的过程融合进卷积
  • 融合分支 (branch fusion):同样利用卷积的线性可加性,将多分支的卷积融合为 1个卷积

RepVGG 如何进行“结构重参数化”?

  • 1.卷积层参数:上图是 REP-VGG 块的结构重参数化过程。为了易于可视化,我们假设 C2 = C1 = 2,因此3×3层具有四个3×3矩阵,而1×1层的核为2×2矩阵
  • 2.BN 层参数:(1)可知 BN 层为每个通道的数据进行规范化,每个通道需要 4 个参数 μ,σ,γ,β\:\mu,\:\sigma,\:\gamma,\:\beta,输入通道 2 个则有 8 个参数;(2) 当 μ,σ,γ,β\:\mu,\:\sigma,\:\gamma,\:\beta 均为 0 时,规范化后的数据还是原来的值,这可以用于模拟 identity 路径
  • 3.融合卷积与 BN 层:(1)最难理解的是虚线红框部分,由原来的 2×1×1×22\times 1 \times 1\times 2 变为 2×3×3×22\times 3 \times 3\times 2 ,也就是单个卷积核由 1×11\times 1 变为 3×33\times 3,这是通过在 1×11\times 1 四周补 0 做到的,因为补 0 后得到的卷积和是不变的;(2) 类似 [[ACNet#^udwpgu|ACNet的网络结构]]的过程,μ,σ,γ,β\:\mu,\:\sigma,\:\gamma,\:\beta 的部分参数用于重构卷积核的值,部分参数组合成卷积的偏置值 bb,并且每个通道 1 个值
  • 4.利用卷积的可加性,融合多路径:对应同 size 卷积核的,可以利用卷积的可加性,将卷积融合,具体来说是卷积核矩阵对应相加,偏置值对应相加

DBB 的网络结构?

  • 参考 [[GoogleNetv1]] 的 Inception block 的概念,结合结构重参数划的理论,设计了 DBB block
  • 每个 DBB block 包含 4 个并行的路径,推理时融合成 1 个路径

DBB 的 6 种模块可以等价转为单个卷积?

    1. Conv-BN 合并:经典的卷积层融合 BN 层的结构
    1. 并行合并:参考ACNet的网络结构,卷积核可线性相加
    1. 串行合并:参考ACNet的网络结构,卷积核可线性相加
    1. 并行拼接:参考ACNet的网络结构,卷积核 kernel size 保持不变,数量是两个分支相加
    1. 平均池化转换:平均池化很像卷积核的过程,只不过是求和后加平均而已,直接对卷积核的值除 KxK,后面得到的卷积和就是 AVG 后的值了
    1. 多尺度卷积合并:参考ACNet的网络结构,同一将卷积核扩充为 KxK,再进行融合