In this post, we discuss the computally efficient DCNN architectures, such as MobileNet, ShuffleNet and their variants.

Architectures Resources
ResNet [paper] [code (pytorch)]
ResNeXt [paper] [code (lua, official)] [code (pytorch)]
MobileNet [paper] [code]
MobiletNet V2 [paper] [code]
ShuffleNet [paper] [code]
ShuffleNet V2 [paper] [code]
SqueezeNet [paper] [code]
SqueezeNeXt [paper] [code]

Convolution Operation and Its Variants

卷积操作 (Source: Yusuke Uchida’s blog post)

首先来回顾一下卷积操作的计算成本的表示方式。给定以下条件:

  • 输入:尺寸为$H\times W\times N​$的feature map
  • 卷积:$M$个$K\times K\times N$大小的卷积核
  • 输出:尺寸为$H\times W\times M$的feature map

则卷积操作的计算成本为$HWNK^2M​$。可以看出,该计算成本主要受限于:

  1. 输出feature map的空间尺寸$H\times W$
  2. 卷积核尺寸$K\times K​$
  3. 输入与输出的channel数量$N$与$M$

一般来说,输出feature map的尺寸是无法改变的,所以efficient models主要是在第2、3点上做文章。

Standard Convolution

基本的卷积指的是同时在空间($H$与$W$方向)与通道($C$方向)上进行卷积操作,其操作成本即为上述的$HWNK^2M$。

Conv 3x3

$3\times 3​$卷积操作 (Source: Yusuke Uchida’s blog post)

$3\times 3$的卷积操作如上图所示,可以看出,在空间与通道上都是稠密的连接,其计算成本为$9\times HWNM​$。

  • 空间上,output map上的每一点都与input map上的9个点(图中只表现了3个)相关联
  • 通道上,output map的每个通道都与input map上的所有通道相关联

Conv 1x1

$1\times 1$卷积操作 (Source: Yusuke Uchida’s blog post)

$1\times 1$的卷积又称为pointwise卷积,主要作用是改变input map的通道数量,“融合”各通道的信息。其计算成本为$HWKM$,是$3\times 3$卷积的$19$。

  • 空间上,output map上的每一点都只与input map上的一个点相关联
  • 通道上,与$3\times 3$卷积类似,output map的每个通道都与input map上的所有通道相关联

Grouped Convolution

$G=2$时的$3\times 3$分组卷积操作 (Source: Yusuke Uchida’s blog post)

$G=3​$时的$3\times 3​$分组卷积操作 (Source: Yusuke Uchida’s blog post)

$G=2$时的$1\times 1$分组卷积操作 (Source: Yusuke Uchida’s blog post)

$G=3$时的$1\times 1$分组卷积操作 (Source: Yusuke Uchida’s blog post)

分组卷积是基本卷积的变种,主要是将input feature map的通道分组进行卷积,各个组之间卷积操作相互独立,最后再将各个组的结果连接起来。

  • 令$G$代表分组数量,则其计算成本为$HWNK^2M/G$,是基本卷积的$1/G$
  • $G$越大,则在通道上的卷积操作越稀疏

Depthwise Convolution

Depthwise卷积操作 (Source: Yusuke Uchida’s blog post)

Depthwise卷积是对input map的每一个通道进行单独的卷积,可以视为$G=N$的分组卷积操作的特例。

  • 使用$N$个尺寸为$K\times K\times 1$的卷积核对尺寸为$H\times W\times N ​$的输入feature map进行卷积,输出相同尺寸的feature map

  • 计算成本为$HWNK^2$,通过忽略通道方面的卷积,depthwise卷积大幅减少了计算成本

Channel Shuffle

$G=2​$时的Channel Shuffle操作 (Source: Yusuke Uchida’s blog post)

$G=3​$时的Channel Shuffle操作 (Source: Yusuke Uchida’s blog post)

Channel shuffle是将input feature map的通道顺序进行随机打乱的一种操作。其操作主要通过reshape与transpose实现:

  1. 输入feature map尺寸为$H\times W\times N$,其中$N=GN’$
  2. 将输入reshape为$H\times W \times G\times N’$
  3. 将输入transpose为$H\times W\times N’\times G$
  4. 将输入reshape回$H\times W\times N$,作为输出

其计算成本无法用加法与乘法的操作次数来衡量,不过也是有一定开销的。

Efficient Models

ResNet & ResNeXt

对ResNet/ResNeXt的详细介绍可见之前的文章,这里主要介绍其卷积操作的结构。

ResNet的bottleneck结构 (Source: Yusuke Uchida’s blog post)

ResNet的residual unit主要是一种bottleneck的结构,其能从一定程度上降低计算成本:

  1. 先用一个$1\times 1​$的卷积减少输入的通道数,从而减少之后$3\times 3​$卷积的计算成本
  2. 而后用$3\times 3​$的卷积进行卷积
  3. 最后用$1\times 1​$的卷积来恢复通道数

ResNeXt的bottleneck结构 (Source: Yusuke Uchida’s blog post)

ResNeXt的主要改进在于使用分组的$3\times 3​$卷积代替了ResNet中的普通$3\times 3​$卷积。如此一来,节省下的计算成本可以让第一步$1\times 1​$卷积的通道缩减比率变得小一些,从而使得ResNeXt能在与ResNet相近的计算成本时获得更好的准确率。

SqueezeNet

SqueezeNet的卷积结构

主要是改进了Inception的结构,提出所谓的squeeze + expand的fire module:

  1. 先用一个$1\times 1$的卷积减少输入的通道数,从而减少之后的计算成本
  2. 而后分别用$1\times1$与$3\times 3$的卷积进行卷积
  3. 在通道上连接上一步的两个输出结果

MobileNet

MobileNet的卷积结构 (Source: Yusuke Uchida’s blog post)

MobileNet主要是使用了separable convolution modules,也就是1个depthwise卷积加上1个pointwise卷积(也就是$1\times 1​$卷积),使得卷积在空间与通道上的操作分离开来,从而显著地减少了计算成本。

  1. 首先使用depthwise卷积处理$H\times W\times N$的输入,其中使用了$N$个$K\times K\times 1$的卷积核,计算成本为$HWNK^2$
  2. 其次使用pixelwise的卷积处理上一步的输出,其中使用了$M$个$1\times 1\times N$的卷积核,计算成本为$HWNM$

所以1次separable卷积的计算成本为$HWN(K^2+M)$,而普通的卷积操作的计算成本为$HWNK^2M$。由于一般情况下(例如$M=32, K=3$时),$M\gg K^2$,所以separable卷积的计算成本为普通方式的$\frac{K^2+M}{K^2M}\approx\frac{1}{K^2}$,即大约$18$或者$19$倍。

同时,可以看出,此时的计算成本的瓶颈主要在于$1\times 1$卷积计算成本中的$M$因素。

ShuffleNet

ShuffleNet的卷积结构 (Source: Yusuke Uchida’s blog post)

ShuffleNet主要是使用分组卷积来降低separable卷积操作中的$1\times 1$卷积的计算成本。同时,ShuffleNet还在分组卷积之后增加了channel shuffle操作,防止某一通道只在某一组中进行卷积,使得各个通道的输出都有可能传入到各个组中去,从而避免了精度降低。

MobileNet V2

MobileNet V2的卷积结构 (Source: Yusuke Uchida’s blog post)

MobileNet V2主要在ResNet的residual unit的基础上,

  1. 使用depthwise卷积替换了普通的$3\times 3$卷积
  2. 使用$1\times 1$卷积首先扩大通道数,而后在最后减少通道数

MobileNet V2的卷积结构的另一种表示 (Source: Yusuke Uchida’s blog post)

当然,MobielNet V2的unit也可以表示成如上图这样的形式(由于MobileNet V2是由一堆units叠在一起的,所以可以这么看)。这样的话,原始版本的MobileNet中的$1\times 1$卷积就被拆成了两个。令$T$表示通道数的减小比率,则原始的$1\times 1$卷积的计算成本为$HWN^2$,拆成2个$1\times 1$卷积的计算成本为$2HWN^2/T$。MobileNet V2使用$T=6$,则其$1\times 1$卷积的计算成本是MobileNet V1的$13$。

SqueezeNeXt

ShuffleNet V2

ShuffleNet V2主要是通过实验研究了在设计与评价轻量级网络的方法,并从中归纳了一些经验性的准则。

首先是直接指标(例如速度)与间接指标(例如 FLOPs)之间的差异。由于FLOPs仅和卷积部分相关,尽管这一部分需要消耗大部分的时间,但其它过程例如数据I/O、数据重排和元素级运算(张量加法、ReLU等)也需要消耗一定程度的时间。FLOPs近似的网络也会有不同的速度。这两者的差异主要在于:

  • 对速度有较大影响的几个重要因素对 FLOPs 不产生太大作用。
    • 其中一个因素是内存访问成本 (MAC)。在某些操作(如组卷积)中,MAC 占运行时间的很大一部分。对于像 GPU 这样具备强大计算能力的设备而言,这就是瓶颈。在网络架构设计过程中,内存访问成本不能被简单忽视。
    • 另一个因素是并行度。当 FLOPs 相同时,高并行度的模型可能比低并行度的模型快得多。
  • FLOPs 相同的运算可能有着不同的运行时间,这取决于硬件平台以及其网络实现

通过实验研究,该文章提出了评价与设计的经验准则:

  • 评价准则:
    • 应该用直接指标(例如速度)替换间接指标(例如 FLOPs)
    • 这些指标应该在目标平台上进行评估。
  • 设计准则:
    • 相同的通道宽度可最小化MAC
    • 过度的组卷积会增加 MAC
    • 网络碎片化(例如GoogLeNet或者Inception的多路径分支结构)会降低并行度
    • 元素级运算的计算成本不可忽视

基于此,该文章提出了ShuffleNet V2的单元结构:

ShuffleNet V2的卷积结构 (Source: original paper)

Cheat Sheet

本文所述卷积操作与网络结构总结 (Source: Yusuke Uchida’s blog post)

Reference