轻量级卷积神经网络综述:从SqueezeNet到MixNet

在先前的神经网络发展中,神经网络通常是通过加深、加宽网络结构或重复使用特征图来提高网络的性能。但在网络性能提升的同时,也导致了其对内存、CPU/GPU需求大,推演速度慢,耗电量高等问题,难以运用在实时场景和移动设备中。如自动驾驶车载神经网络运行速度慢就有可能导致事故发生,耗电量高则会导致汽车、手机等移动端续航能力变差,而只有轻量级的神经网络能解决这个问题。下面我将介绍近年来轻量级卷积神经网络的发展。

1 SqueezeNet

论文地址:SqueezeNet:AlexNet-level accuracy with 50x fewer parameters and <1MB model size

SqueezeNet网络的主要亮点在于提出了Fire Module来减少参数量。Fire Module 分为两部分:Squeeze 和 Expand。Squeeze层通过 1×1 卷积对特征图进行降维,减少参数量,Expand层分别使用 1×1 和 3×3 卷积对降维后的特征图进行处理后concat到一起。比起直接用3×3卷积,这种方法减少了一定的运算量。

(R7V7PD.png

整个网络由多个Fire Module堆叠而成,很像GoogLeNet。右边两个网络结构参考了ResNet。

`YX7Opng

2 MobileNet v1

论文地址:MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

MobileNet由谷歌公司提出,主要用于移动和嵌入式视觉应用,其亮点在于采用深度可分离卷积(Depth-wise Separable Convolution) 代替传统卷积。

深度可分离卷积

深度可分离卷积分为两步:

  1. Depthwise convolution:对特征图各个通道进行卷积,每个卷积核只有一个通道且只负责特征图的一个通道。
  2. Pointwise convolution:使用1×1卷积将特征图串起来,得到和普通卷积一样的输出。

W8I.png

运算量对比

假设输入图像为12×12×3,输出图像为8×8×256。

  • Convolution:
    • 卷积核大小 5×5×3,卷积核数量 256
    • 数据量:5×5×3×256 = 19200
    • 计算量:仅考虑乘法运算,每产生一个输出值就要进行5×5×3次运算,一共要产生8×8×256个输出值,故 5×5×3×256×8×8 = 1228800。
  • Depthwise Separable Convolution:
    • Depthwise convolution:卷积核大小 5×5×1,卷积核数量 3
    • Pointwise convolution:卷积核大小 1×1×3,卷积核数量 256
    • 数据量:5×5×1×3+1×1×3×256 = 843
    • 计算量:5×5×1×3×8×8+1×1×3×8×8×256 = 53952

网络模块

左边是传统卷积,右边是深度可分离卷积。

FT.png

实验结果对比

可以看到MobileNet在只牺牲了少量精确度的情况下节约了大量的运算量和网络参数。

O.png

3 Xception

论文地址:Xception: Deep Learning with Depthwise Separable Convolutions

Xception 借鉴了深度可分离卷积的思想并以此改进了Inception V3。

Fpng

图中是一个Xception模块,先用 1×1 卷积改变特征图的通道数,再对输出的每个通道分别进行 3×3 卷积,最后将 3×3 卷积的输出concat到一起。

4 ShuffleNet v1

论文地址:ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices

ShuffleNet是由旷视公司提出的轻量级网络,该网络结构主要使用了分组卷积(group convolution)通道洗牌(channel shuffle)

MBng

图a展示了分组卷积,即将通道均等分为多组,分别进行卷积操作(类似于深度可分离卷积)。但这样会导致组之间的信息不流通,对精度造成影响。于是使用通道洗牌的方式,对各组的通道进行交换。

下图是两种ShuffleNet单元:

7EYQpng

5 MobileNet v2

论文地址:MobileNetV2: Inverted Residuals and Linear Bottlenecks

MobileNet v1 存在问题

MobileNet v1 虽然很好地降低了模型运算量,但依然存在如下两个问题:

  1. MobileNet v1 的结构是类似于 VGG 的堆叠结构,而这种结构比起后来的 ResNet、GoogLeNet 来说性能不高。
  2. Depthwise Convolution 的潜在问题:论文作者发现,由于深度残差卷积产生的特征图通道数较少,在 ReLU 的影响下很容易产生较大的信息损耗(这个故事告诉我们不要在压缩通道后用ReLU)。

MobileNet v2 的创新点

为了解决 v1 存在的问题,v2 提出了以下改进方法:

  1. Inverted Residual Block:首先从名字可以看出,这是从传统残差块演化而来的逆残差,两者主要的不同在于对 1×1 卷积的运用方式不同。传统的残差块使用 1×1 卷积降低特征图的通道数,减少 3×3 卷积的运算量;而逆残差则是用 1×1 卷积来提升维度,以便提升网络的准确度。可能作者觉得反正 Depthwise Convolution 运算量也不大,不如就牺牲一丢丢速度来提高一下精度吧。

    Q_P`KE8N_V3JY_L``4O6CXS.png

  2. Linear Bottlenecks:对比 v1 和 v2 的结构可以看出,v2 使用线性函数替换了 v1 模块最后的ReLU6:

H_T83__0YR5Q6K_Y~V8_M_S.png

6 ShuffleNet v2

论文地址:ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design

前言

通常用于神经网络的设计指导指标使用的是计算复杂度衡量指标:FLOPs,而不是更直接的评价指标:运行速度(speed)。而作者发现相同FLOPs的网络速度可能差别很大,认为FLOPs并不能作为网络性能的唯一衡量指标。

造成FLOPs和速度不成比例的原因:

  1. 部分影响速度的原因没有被FLOPs包含在内:
    • 内存访问成本(memory access cost, MAC):这会使得强大的GPU算力受到限制。
    • 并行度(degree of parallelism):在相同FLOPs的情况下,并行度高的网络模型速度远高于低并行度模型。
  2. 不同的运行平台会影响FLOPs。比如说新版的CUDNN专门对 3 × 3 卷积运算进行了优化。

出于这点考虑,作者提出了两点高效结构设计的指导性原则:

  1. 应当使用直接的评价指标(e.g., 速度)而不是间接的(e.g., FLOPs)。
  2. 应当在规定的平台上进行评估。

高效卷积网络设计准测

  • G1: 当输入、输出channels数目相同时,conv计算所需的MAC最低。以深度可分离卷积(Depth-wise Separable Convolution)为例,其 pointwise convlution (i.e., 1×1 conv) 部分占用了其大部分复杂度。设$c_1$,$c_2$为 1 × 1 卷积的输入、输出通道数,$h$和$w$为特征图的高和宽,则 FLOPs 计算为 $B=hwc_1c_2$。内存访问操作次数为 $MAC=hw(c_1+c_2)+c_1c_2$。得出下面的不等式,仅当输入输出通道数相同时,MAC最小:
  • G2: 过多的分组卷积(Group Convolution)会增大 MAC 开销。设分组数量为 $g$,从下面公式可以看出随着 $g$ 增加,MAC增加。 :
  • G3: 网络碎片化(fragmentation)会减少并发度。这里的碎片化大概指的是模型的分支数量。比如说 NASNET-A 的分支数就高达13,而 ResNet 的分支数为2或3。作者通过实验证明,分支数量的提升会提高网络的准确率,但也会因降低GPU并行计算能力而影响效率。
  • G4: Element-wise 操作的计算量不容忽视。element-wise包括激活、张量相加、添加偏置等,它们的共同特征就是FLOPS较小但是MAC相对较大。同时作者将 depthwise convolution 操作也算入了element-wise,因为其有着同样高的 MAC/FLOP 比率。

目前的轻量级网络结构主要是是以FLOPS作为度量标准设计的,而没有考虑以上的几点属性。比如说,ShuffleNet v1使用了过多的分组卷积(与G2违背)、bottleneck-like块(与G1违背);MobileNet v2使用倒置的bottleneck结构(与G1违背),同时使用了深度卷积和ReLU在”thick”特征图上(与G4违背);自动生成结构过多的使用了碎片化结构(与G3违背)

ShuffleNet V2 网络结构

为了使ShuffleNet更加高效,关键在于保持等宽的出入输出通道,以及使用密集卷积操作而不是过多的分组卷积。

S9YD9ZB_OHNUS`GHFVS@9D0.png

如图,左边两个是 ShuffleNet v1 的模块,右边两个是 ShuffleNet v2 的模块。

图c是 ShuffleNet v2 的基本模块,其首先将输入的通道随机split成两部分(这是一种变相的分组卷积,不过只分了两个组,遵守了G2和G3),一部分恒等映射到模块尾部,另一部分通过三个输入输出通道数相同的卷积前向传播(遵守了G1),之后使用concat操作(而不是add操作,遵守了G4)将两个分支结合在一起,最后进行通道洗牌(channel shuffle)。

图d为下采样模块,原理类似,stride=2缩小特征图,没有使用channel split操作,最后两个分支concat到一起使通道数翻倍。

恒等映射后concat到模块尾部,能使特征得到复用,提高准确度。这种思想来源于DenseNet。

7 MnasNet(待更新)

太复杂了,回头再看

8 MobileNet v3(待更新)

基于MnasNet

9 MixNet(待更新)

参考文献

  1. 纵览轻量化卷积神经网络:SqueezeNet、MobileNet、ShuffleNet、Xception
  2. SqueezeNet | 轻量级深层神经网络
  3. 贪心学院
  4. Xception
  5. 轻量级模型:MobileNet V2
  6. 精简CNN模型系列之六:ShuffleNet v2
  7. ShuffleNet v2算法笔记
  8. ShuffleNet_v2模型解读
-------------本文结束感谢您的阅读-------------