Zhangzhe's Blog

The projection of my life.

0%

DO-Conv: Depthwise Over-parameterized Convolutional Layer

URL

https://arxiv.org/pdf/2006.12030.pdf

TL;DR

  • 传统过参数化网络,在训练阶段能提高收敛速度并提高算法表现,但在推理阶段速度会变慢

  • 本文提出一种过参数化卷积 DO-Conv,在训练阶段有过参数化的优点——收敛速度快、算法表现好,在推理阶段将 DO-Conv 转化为标准卷积,不会带来任何额外耗时

  • DO-Conv 实际上是在训练阶段,将标准卷积拆分成标准卷积和Depthwise卷积的叠加;在推理阶段之前,将拆分后的标准卷积和Depthwise卷积再合并为一个标准卷积

Algorithm

何为过参数化?

  • 过参数化可以理解为:通过使用更多的参数,增大模型的假设空间,增加模型的表达能力(线性与非线性),从而加速训练甚至提高算法表现

标准卷积与Depthwise卷积的数学表示:

  • O=W×PO = W \times P

    • WRCout×(M×N)×CinW \in \mathbb{R}^{C_{out} \times (M \times N) \times C_{in}} ,表示 kernels,每一个 kernel.shape==(Cin,M,N)kernel.shape == (C_{in}, M, N) ,一共 CoutC_{out}kernel

    • PR(M×N)×CinP \in \mathbb{R}^{(M \times N) \times C_{in}} ,表示输入 feature mapkernel 覆盖的 patch,每一个 patch.shape==(Cin,M,N)patch.shape == (C_{in}, M, N)

    • ORCoutO \in \mathbb{R}^{C_{out}} ,表示卷积结果

    do1.png

Depthwise 卷积的数学表示:

  • O=WPO = W \circ P

    • WR(M×N)×Dmul×CinW \in \mathbb{R}^{(M \times N) \times D_{mul} \times C_{in}} ,表示 kernels,每一个 kernel.shape==(M,N)kernel.shape == ( M, N) ,每组(每个通道为一组) DmulD_{mul}kernel,一共 CinC_{in}

    • PR(M×N)×CinP \in \mathbb{R}^{(M \times N) \times C_{in}} ,表示输入 feature mapkernel 覆盖(所有通道)的 patch,每一个 patch.shape==(Cin,M,N)patch.shape == (C_{in}, M, N)

    • ORDmul×CinO \in \mathbb{R}^{D_{mul} \times C_{in}} ,表示卷积结果

      do2.png

DO-Conv 的数学表示:

  • O=(D,W)PO = (D, W) \star P

  • feature compositionO=W×(DP)O = W \times (D \circ P)

  • kernel compositionO=(DTW)×PO = (D^T \circ W ) \times P

    • WRCout×Dmul×CinW \in \mathbb{R}^{C_{out}\times D_{mul}\times C_{in}} ,表示 kernels_w,每一个 kernelw.shape== ( Cin,Dmul)kernel_w.shape ==\text{ ( }C_{in}, D_{mul}) ,一共CoutC_{out}kernel_w

    • DR(M×N)×Dmul×CinD \in \mathbb{R}^{(M\times N)\times D_{mul}\times C_{in}} ,表示 kernels_d,每一个 kerneld.shape==(M,N)kernel_d.shape == ( M, N) ,每组(每个通道为一组) DmulD_{mul}kernel_d,一共 CinC_{in}

    • PR(M×N)×CinP \in \mathbb{R}^{(M\times N)\times C_{in}} ,表示输入 feature mapkernel 覆盖(所有通道)的 patch,每一个 patch.shape==(Cin,M,N)patch.shape == (C_{in}, M, N)

    • ORCoutO \in \mathbb{R}^{C_{out}} ,表示卷积结果

do3.png

这与Depthwise Separable 卷积有什么区别?

  • 相同点:

    • feature composition 可以看做是先对 feature mapDepthwise Conv ,再做标准卷积
  • 区别:

    • Depthwise Separable Conv 是`DO-Conv Dmul=1D_{mul} = 1 的特殊情况

DO-Conv 怎么能保证参数量比标准卷积多呢?

  • 标准卷积卷积核:

    • W1RCout×(M×N)×CinW_1 \in \mathbb{R}^{C_{out}\times (M\times N)\times C_{in}}
  • DO-Conv 卷积核:

    • W2RCout×Dmul×CinW_2 \in \mathbb{R}^{C_{out}\times D_{mul}\times C_{in}}

    • DR(M×N)×Dmul×CinD \in \mathbb{R}^{(M\times N)\times D_{mul}\times C_{in}}

  • Dmul=(M×N)D_{mul} = (M \times N) 时, W2=W1W2 = W1 ,此时 $ D + W_2 > W_1$ ,DO-Conv 拥有更多的参数量

  • 所以规定: Dmul(M×N)D_{mul} \ge (M \times N)

怎么能保证推理阶段不增加耗时呢?

  • 训练阶段 WD 都是可优化参数,所以模型会保存 WD

  • 推理阶段之前,使用 kernel compositionWD 处理, W=DTWW' = D^T \circ W ,然后就使用 WW' 去做标准卷积, W.shape==W1.shapeW'.shape == W_1.shape ,所以 inference 阶段不会增加任何耗时

DO-Conv 分组卷积 / Depthwise卷积

  • O=(D,W)PO = (D, W) \odot P

  • feature compositionO=W(DP)O = W \circ (D \circ P)

  • kernel compositionO=(DTWT)TPO = (D^T \circ W^T )^T \circ P

Thoughts

  • a = a1 * a2,能不能从数学角度证明学习 a1 * a2 比直接学习 a 更容易,效果更好?

  • 芯片上常常不支持 1 * 1 Conv,能否将输入的 (N2×Cin,H,W)(N^2 \times C_{in}, H, W) 使用 PixelShuffle 运算 reshape 成为 (Cin,N×H,N×W)(C_{in}, N \times H, N \times W) ,再使用 kernel.shape==(Cin,N,N),stride=Nkernel.shape == (C_{in},N, N), stride = N 的标准卷积去算?

DO-Conv 网络的实际表现

  • 在所有用到卷积的地方,无脑替换为 DO-Conv 基本都能涨点

do4.png

do5.png

do6.png

do7.png

do8.png

do9.png