轻量级CNN模型综述:从SqueezeNet到MobileNetV3
轻量级CNN模型综述:从SqueezeNet到MobileNetV3
神经网络模型在工业领域得到了广泛应用,并取得了巨大成功。然而,由于存储空间和算力的限制,大而复杂的神经网络模型难以被应用。首先,模型过于庞大,计算参数多,容易面临内存不足的问题。其次,某些场景要求低延迟或快速响应。因此,研究小而高效的CNN模型至关重要。
本文将介绍一些常见的CNN小型化结构,包括SqueezeNet系列(2016)、ShuffleNet系列(2017)、MobileNet系列(2017)、ESPNet系列(2018)、FBNet系列(2018)、EfficientNet系列(2019)和GhostNet系列(2019)。
SqueezeNet系列
SqueezeNet
SqueezeNet是轻量化主干网络中比较著名的模型,发表于ICLR 2017。它在达到AlexNet相同精度的同时,只用了AlexNet 1/50的参数量。SqueezeNet的核心贡献在于使用Fire Module,即使用1x1卷积降低通道数目(squeeze),然后用1x1和3x3卷积提升通道数(expand)。
SqueezeNet算法的主要目标是构建轻量参数的CNN架构,同时不损失精度。为了实现这一目标,作者采用了以下三种策略:
- 将3x3卷积替换成1x1卷积,可以使参数量减少9倍。
- 减少3x3卷积的通道数,一个3x3卷积的计算量是3x3xMxN,通过将M和N减少以降低参数数量。
- 将下采样操作延后,这样卷积层就有了大的激活图,保留更多信息。
在Fire Module的基础上搭建SqueezeNet神经网络,结构如下图所示。它以卷积层开始,后面是8个Fire Module,最后以卷积层结束,每个Fire Module中的通道数目逐渐增加,另外网络在conv1、fire4、fire8、conv10的后面使用了最大池化。
SqueezeNext
SqueezeNext的设计基于残差结构并使用了分离卷积,采用了降低参数的策略:
- 采用two-stage bottleneck modules来减少权值参数,即采用两个1x1的Conv,使得参数显著减少。
- Low Rank Filters低秩分解的核心思想就是将大矩阵分解成多个小矩阵,这里使用Canonical Polyadic Decomposition,将KxK卷积,参数量能从k^2降为2K,在SqueezeNext中也加入了Shortut Connection。
SqueezeNext的block结构如下:
- 两个1x1的Conv以减少参数。
- 3x3卷积变成1x3卷积与3x1卷积的组合。
ShuffleNet系列
ShuffleNet
ShuffleNet发表于CVPR2018,针对极小的网络上的计算效率依然不高的问题,特别是1x1卷积特别消耗计算资源。它的贡献在于,使用Point-Wise分组卷积和Channel Shuffle两个操作,在降低计算量同时保持准确率。网络使用更多的通道来帮助编码阶段提取更多的信息,同时又针对小网络提出了ShuffleNet Unit,主要策略如下:
- 使用Pointwise Group Convolution卷积来降低1x1卷积的计算量。
- 使用Channel Shuffle让不同通道的进行信息交互。
- 使用ShuffleNet Unit来构建小模型。
Pointwise Group Convolution与Channel Shuffle
一般采用更稀疏的通道策略来解决1x1卷积带来的计算量问题,比如在1x1卷积内部也使用分组卷积。但由于1x1卷积的输出会是下一层block的输入,当在1x1卷积中使用分组策略,则1x1瓶颈层的输出特征的每个通道并没有接收其他前面的所有输入(如图a)。为了解决图a中的问题,将每个组再细分,细分后放入不同的组内(图b),这个过程可以叫做Channel Shuffle,打乱后如图c所示。
ShuffleNet单元
基于残差块(residual block)和通道洗牌(channel shuffle)设计的ShuffleNet Unit:
- 深度卷积。
- 逐点分组卷积。
- 逐点分组卷积(stride=2)。
ShuffleNet V2
ShuffleNet V2在V1的Channel Shuffle的基础上,又提出了Channel Split,增强特征的重用性的同时也减少了计算量,并提出了4条设计高效网络的方法:
- G1:输入输出通道相同的时候,MAC最小,模型最快。
- G2:当分组卷积的分组数增大时(保持FLOPs不变时),MAC也会增大,所以建议针对不同的硬件和需求,更好的设计对应的分组数,而非盲目的增加。
- G3:网络设计的碎片化程度越高,速度越慢。
- G4:不要过多的使用逐点运算。
ShuffleNet V2中提出了Channel Split,如图c、d所示。在每个单元的开始将通道拆分为2个分支,一个分支做恒等映射,另一个分支经过多层卷积保证输入通道数与输出通道数相同。不同于ShuffleNet V1,ShuffleNet V2的1x1没有再使用分组卷积,两条分支最后使用通道级联concatenate操作,没有使用TensorAdd。
MobileNet系列
MobileNet系列主要是为了在保持模型性能的前提下降低模型大小,同时可以提升模型速度,主要有V1、V2、V3版本。
MobileNet V1
MobileNet V1的主要贡献在于提出了Depthwise Separable Convolutions(深度可分离卷积),深度可分离卷积主要包括两种卷积变体,逐通道卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution)。
逐通道卷积(Depthwise Convolution)
Depthwise Convolution的一个卷积核只有一个通道,输入信息的一个通道只被一个卷积核卷积,这个过程产生的feature map通道数和输入的通道数完全一样,如下图所示:
逐点卷积(Pointwise Convolution)
Pointwise Convolution的本质就是1X1的卷积,它的卷积核的尺寸为1×1×M,M为上一层输出信息的通道数。所以这里Pointwise Convolution的每个卷积核会将上一步的特征图在通道方向上进行加权组合,生成新的特征图,如下图所示:
MBconv模块
MBconv由Depthwise Convolution、BN、ReLU组成,基本结构如下图右面所示:
整体网络就是通过不断堆叠MBconv组件,这种深度可分离卷积的操作方式在减少计算量的同时保持了模型的表达能力。
分别是宽度乘子(α)和分辨率乘子(ρ)
宽度和分辨率调整系数用于调整模型的大小和计算复杂性。
- 宽度系数(α):宽度系数是一个介于0和1之间的比例因子。通过降低每个卷积层的通道数,可以减少模型中的参数数量和计算量,从而使模型更轻量化。
- 分辨率系数(ρ):分辨率系数是一个介于0和1之间的比例因子。通过降低输入图像的分辨率,可以减少卷积操作的计算量和内存消耗。
MobileNet V2
MobileNet V2:2018年在MobileNet V1的基础上又提出了改进版本MobileNet V2,V2中主要用到了Inverted Residuals和Linear Bottlnecks。
Inverted Residuals
在Inverted Residual block中,3x3卷积变成Depthwise了,计算量更少了,通过1x1卷积先提升通道数,再Depthwise 3x3卷积,最后用1x1卷积降低通道数。两端的通道数都很小,所以整体计算量并不大。
Linear Bottleneck
Linear Bottlnecks上面的Inverted Residuals block中的bottleneck处的ReLU去掉。整体的网络模型就是由堆叠下图右图的Bottlenecks搭建而成的。
关于ReLU6
卷积之后通常会接一个ReLU非线性激活,在MobileNet中使用ReLU6。ReLU6在普通的ReLU基础上限制最大输出为6,这是为了在移动端设备float16/int8的低精度的时候也能有很好的数值分辨率。如果对ReLU的激活范围不加限制,输出范围为0到正无穷,如果激活值非常大,分布在一个很大的范围内,则低精度的float16/int8无法很好地精确描述如此大范围的数值,带来精度损失。
MobileNet V3
MobileNetV3:整体架构基本沿用了MobileNetV2的设计,采用了轻量级的深度可分离卷积和残差块等结构,依然是由多个模块组成,但是每个模块得到了优化和升级。主要贡献点在于:
- 神经网络搜索技术:由资源受限的NAS执行模块级搜索,NetAdapt执行局部搜索。
- 网络结构改进:将最后一步的平均池化层前移并移除最后一个卷积层,引入h-swish激活函数。
SE结构
首先使用一个全局池化层将每个通道变成一个具体的数值,然后接两个全连接层,最后通过一个H-Sigmoid函数获取最终的权重,赋值给最初的特征图。
重新设计耗时层结构
首先,减少网络第一个卷积层的卷积核个数,从32减到16,然后精简了最后的Stage,将原来搜索到的最后阶段的人工精简,删除了多余的卷积层,将延迟减少了7毫秒,将近全部运行时间的11%,并减少了3000万的乘加操作次数,几乎没有损失准确性。
重新设计激活函数
引入新的非线性激活函数:h-swish。swish公式:
[Swish x = x*α(x) ]
这里σ(x)是sigmoid函数。swish虽然提高了精度,但sigmoid函数计算是极为昂贵的,在嵌入式移动端不适合它的存在,因此,MobileNet_V3提出了计算更为简便的h-swish函数,其定义如下:
[h-swish[x] = x\frac{ReLU6(x+3)}{6} ]
NAS搜索全局结构(Block-wise Search)
采用NSA方法来搜寻全局网络结构,另外需要针对轻量模型进行优化,用一个多目标奖励。
[{ACC(m)x[LAT(m)/TAR]}^{w} ]
来近似pareto最优解,根据目标延迟TAR为每个模型m平衡模型精度ACC(m)和延迟LAT(m)。用较小的权重因子w =-0.15来弥补不同的延迟的更大精度变化。从头训练了一个新的架构搜索,找到了初始的seed模型,然后应用NetAdapt和其他优化来获得最终的MobilenetV3-Small模型。
NetAdapt搜索层结构(Layer-wise Search)
[\frac{ΔACC}{ΔLatency} ]
给定一个K conv and FC layers的网络Net,在每一步的结构更改中,需要减少一个给定个值deltaR,然后调整每层的卷积核数,生成一个Net_simp集合,从中找到目标延时的网络。保持循环,直到满足给定条件后finetune网络。V3用了两种减少延迟的方法来产生网络:
- 减少expansion layer的size。
- 减少所有共享相同bottleneck size模块的瓶颈。