GhostNet:More Features from Cheap Operations

GhostNet 认为CNN输出存在大量的冗余特征,没必要一次生成,而是标准卷积过程分解为两个阶段,第一阶段生成少数特征图,第二阶段基于少数特征变换(1x1)得到等量特征图,这种方式降低了卷积的计算量

什么是 GhostNetv1 ?

  • 在 CNN 中,对于一个 hwc 的输入,如果使用 k×kk\times k 的卷积核生成 n 个 h‘w’的特征图,其计算成本为:hwc×k×k×nh'w'c\times k\times k \times n,GhostNetv1 认为 n 个特征图存在大量冗余,但是冗余特征对 CNN 又是必要的,应该如何降低计算成本呢?
  • GhostNetv1 认为既然特征冗余了,那么我首先生成 m 个特征图 (m<<n),然后对每张特征图执行 S 次简单变换,并使得 m×s=nm\times s=n,由于简单变换使用深度可分离卷积的"通道卷积",因此提取同样数量的特征图,GhostNet 计算成本更低
  • GhostNet 本质创新就是将标准卷积过程分解为两个阶段,第一阶段生成少数特征图,第二阶段基于少数特征变换得到等量特征图

GhostNetv1 的网络结构?

  • GhostNet 主要由一堆 Ghost bottleneck 组成,其中 Ghost bottleneck 以 Ghost 模块为构建基础

GhostNetv1 的 Ghost Module?

  • 标准卷积:在 CNN 中,对于一个 hwc 的输入,如果使用 k×kk\times k 的卷积核生成 n 个 h‘w’的特征图,其计算成本为:hwc×k×k×nh'w'c\times k\times k \times n
  • Ghost Module:通过 2 步分解标准卷积,1)通过标准卷积生成 m 个特征图 yy^{'} (M<<N);然后对每个特征图执行 S 次简单变换,公式 yjy_{j}^{'} 是第 i 个原始特征图,Φi,j\Phi_{i,j} 是对第 i 个特征图执行第 j 个线性计算,用于生成第 j 个幻影特征图 yijy_{ij}Φi,s\Phi_{i,s} 是第 i 个特征图最后一次线性变换,定义为恒等映射,主要确保 m×s=Nm\times s=N,Ghost Module 输出的特征图数量和标准卷积一样

    yij=Φi,j(yi),i=1,,m,j=1,,sy_{ij}=\Phi_{i,j}(y'_i),\quad i=1,\ldots,m,j=1,\ldots,s

GhostNetv1 的 Ghost Module 复杂度分析?

  • 假设 Ghost 模块生成与普通卷积层相同数量、相同分辨率的特征图,Ghost 模块比标准卷积少 s 倍成本
  • 标准卷积:对于一个 hwc 的输入,如果使用 k×kk\times k 的卷积核生成 n 个 h‘w’的特征图,其计算成本为:hwc×k×k×nh'w'c\times k\times k \times n
  • Ghost 模块:具有一个恒等映射和 m(s1)=ns(s1)m\cdot(s-1)=\frac{n}{s}\cdot(s-1) 个线性变换,假设线性变换的平均内核大小为 d×dd\times d,则其计算量为:

    nshwckk+(s1)nshwdd\frac{n}{s}\cdot h'\cdot w'\cdot c\cdot k\cdot k+(s-1)\cdot\frac{n}{s}\cdot h'\cdot w'\cdot d\cdot d

  • 计算成本计算比:

    rs=nhwckknshwckk+(s1)nshwddd=ckk1sckk+s1sddscs+c1s.\begin{array}{c}r_s=\dfrac{n\cdot h'\cdot w'\cdot c\cdot k\cdot k}{\frac{n}{s}\cdot h'\cdot w'\cdot c\cdot k\cdot k+(s-1)\cdot\frac{n}{s}\cdot h'\cdot w'\cdot d\cdot d\cdot d}\\ =\dfrac{c\cdot k\cdot k}{\frac{1}{s}\cdot c\cdot k\cdot k+\frac{s-1}{s}\cdot d\cdot d}\approx\dfrac{s\cdot c}{s+c-1}\approx s.\\ \end{array}

  • 参数压缩比:

    rc=nckknsckk+(s1)nsddscs+c1s.r_c=\dfrac{n\cdot c\cdot k\cdot k}{\frac{n}{s}\cdot c\cdot k\cdot k+(s-1)\cdot\frac{n}{s}\cdot d\cdot d}\approx\dfrac{s\cdot c}{s+c-1}\approx s.

GhostNetv1 的 Ghost Bottleneck?

  • GhostNetv1-20230408140217
  • 利用 Ghost 模块的优势,专门为小型 CNN 设计的 Ghost bottleneck(G-bneck),Ghost bottleneck 似乎类似于 ResNet 中的基本残差块(Basic Residual Block),其中集成了多个卷积层和 shortcut
  • Ghost bottleneck 主要由两个堆叠的 Ghost 模块组成。第一个 Ghost 模块用作扩展层,增加了通道数。这里将输出通道数与输入通道数之比称为 expansion ratio;第二个 Ghost 模块减少通道数,以与 shortcut 路径匹配。然后,使用 shortcut 连接这两个 Ghost 模块的输入和输出
  • 上图是 stride=1 保持分辨率模块和下采样一倍模块,注意这里借鉴了 MobileNetV2,第二个 Ghost 模块之后不使用 ReLU,其他层在每层之后都应用了批量归一化(BN)和 ReLU 非线性激活

参考资料

  1. CVPR 2020:华为GhostNet,超越谷歌MobileNet,已开源 - 知乎