系列文章目录
=======================================================
专题-端侧机器学习
第一节 端侧机器学习框架
第二节 轻量级网络模型之MobileNet系列
第三节 轻量级网络模型之ShuffleNet
第三节 轻量级网络模型之EfficientNe
=======================================================
轻量级网络模型之MobileNet系列
Mobile Net自2017年被提出来至今(2021)已经迭代出3个版本: MobileNet v1, MobileNet v2, MobileNet v3, 下面分别作以介绍。
MobileNet V1
参见文章 :MobileNets Efficient Convolutional Neural Networks for Mobile Vision Application,
文章要点
1.基于深度可分离卷积(Depthwise separable convolution)构建了面向移动端和嵌入式应用的轻量级神经网络MobileNet,并定量分析了Depthwise separable convolution在降低计算量和模型大小方面的作用;
2.提出了两个模型超参数以指导MobileNet配置,从而为Accuracy, Latencency, size 三者之间权衡提供了灵活选择;
注:Depthwise separable convolution并不是这篇文章提出的,更早之前的XCeption等就用到了它。
模型结构
模型结构非常简单,采用流水线方法搭建即可。
Depthwise separable convolution
传统的标准卷积相当于是在spatial
和channel
两个方向同时进行特征提取与融合,而Depthwise separable convolution相当于把这个过程进行了拆分:先在spatial
方向逐channel
进行卷积(即Depthwise convolution)以提取特征,然后再在channel
方向通过pointwise convolution融合不同channel
的特征。
因此:Depthwise separable conv. =Depthwise conv. + pointwise conv.
假设输入尺寸:[Df, Df, M]
, 卷积核尺寸为:[Dk,Dk,M, N]
, 则采用Depthwise separable conv后,相比于常规Convolution,计算量将降低为原来的:
超参数
文中提出了两个模型超参数:
Width Multiplier
简单来说就是卷积核数量缩放因,从Table 1可以看到卷积核的数量变化:3-> 32 -> 64 -> 128 -> 256 -> 512, 给每层的卷积核数量都乘以系数Width Multiplier, 从而参数两和计算量大大减小。Width Multiplier越小,减小的程度越大。 具体计算代价为:
其中
α
\alpha
α就是Width Multiplier。
Resolution Multipler
简单来说就是用以调节原图分辨率的因子,原文中建议的缩放后的分辨率为:192,160, 128, 假设原图分辨率为224, 则Resolution Multipler分别为; 192/224, 160/224, 128/124。 Resolution Multipler越小, 减小的程度越大。
同时考虑这两个超参数的计算代价为:
其中
ρ
\rho
ρ就是Resolution Multipler。
相关实现
官方提供的预训练Models(包含不同的配置以及相关的量化版本): https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet_v1.md
其他的比较好的实现代码:
1.https://github.com/Zehaos/MobileNet
2.https://github.com/xiaohu2015/DeepLearning_tutorials/blob/master/CNNs/MobileNet.py
MobileNet V2
参见文章: MobileNetV2: Inverted Residuals and Linear Bottlenecks
文章要点
这篇文章最大的贡献就是提出了一个新的building block: the
inverted residual with linear bottleneck。 (下面会对该模块进行详细阐述)
模型结构
如下表,模型结构很简单:一个常规convolution,后接17
(1+2+3+4+3+3+1)个bottleneck module, 再依次串联 pointwise conv. (提升#channels), pool, pointwise conv. (将#channels变换到目标类别数)。可以看到最核心的building module就是: bottleneck module。
Bottleneck module
该module的全称叫做: bottleneck depth-separable convolution with inverted residuals.*。 如下图所示:
构成:expansion convolution -> depthwise convolution -> projector layer , 其中expansion convolution** 将input feature映射到高维空间,depthwise convolution进行逐channel的convolution,最后 projector layer再将其投影到低维空间。
总的来说,这种结构在输入和输出处保持紧凑的表示形式,同时在内部扩展到高维特征空间以提高每个通道转变的非线性表达能力
。
该 Module在继承了MobileNet v1的building block: depthwise separable convolution的基础之上增加了两个改进
:
(1) Liner bottleneck:
depthwise separable convolution由两个Operation组成:一个depthwise convolution, 一个pointwise convolution, 并且这两个Operation都是带有非线性ReLU激活的。 而这里在pointwise convolution 之后由连接了一个linear的pointwise convolution。
动机来源:神经网络是由多个层构成,一连串的卷积和(非线性)激活层形成一个兴趣流形(manifold of interest。长期以来我们认为:在神经网络中兴趣流形可以嵌入到低维子空间,通俗点说,我们查看的卷积层中所有单个d通道像素时,这些值中存在多种编码信息,兴趣流行位于其中的。我们可以通过卷积进行变换,进一步嵌入到下一个低维子空间中(即转换兴趣流形所在空间维度)。
然而,层是具有非线性激活函数的,如果当前的(低维)激活空间内兴趣流形完整度较高,经过ReLU,可能会让激活空间坍塌,不可避免的会丢失信息
。图示如下:
(二维空间的螺旋线通过随机矩阵T映射到n维空间,然后经过非线性ReLU激活在通过
T
−
1
T^{-1}
T−1投影到二维空间。图中展示了n=2,3,5,15,30的结果)
可以看到:n=2,3时,信息丢失严重,中心点坍塌掉了。当n=15…30之间,恢复的信息明显多了。
因此,通过在卷积模块中后插入linear bottleneck来捕获兴趣流形。 实验证明,使用linear bottleneck可以防止非线性破坏太多信息。
参考: https://zhuanlan.zhihu.com/p/98874284
注:
1.还有一个关于#channe的l扩展系数expansion factor,即表格中的参数t, 原文中建议取值在5~10之间,假设t=6,假设bottle接受#channel=64的输入,产生#channel=128的输出,则中间层的#channel=384。
2. 关于module中linear bottle和depthwise separable哪个先哪个后的问题:
如下图所示,作者指出:当多个这样的Module进行stack时,这两种结构是等价的。其余的示意图均采用了(d)进行绘制,刚开始看的时候差点被绕进去,哈哈!
(2) Inverted residuals:
常规的residual,shorcut 连接的是两个#channel更大的layers, 中间是两个bottleneck layer, 而这里,shorcut连接的是两个#channel更小的layers,如下图所示:
特别注意,在MobileNet v2的具体配置中,关于Bottleneck module使用了两种配置: 一种是stride=1, 带shortcut connection, 另一种是stride=2,不带shortcut connection, 如下图所示:
相关实现
MobileNet V3
参见文章:Searching for MobileNetV3
文章要点:
1.将神经网络架构搜索与网络设计方法结合,提出了两种新的模型: MobileNet V3 Large, MobileNet V3 Small.
2.模型的building block吸收了MobileNet V1, MobileNet V2,以及MnasNet中首次引入的轻量级注意力module.
模型结构
最终的MobileNet V3 Large和MobileNet V3 Small的模型结构如下:
(其中列SE 表示bneck中是否带有attention module, NL表示使用的非线性的具体类型)
关于模型开始层(bneck之前)和结尾层(bneck之前)的重新设计
开始层的设计:
开始层原先的#channel=32,采用ReLu或swish.激活,作者使用hard swish,在保证准确率不降的前提下,通过实验发现#channel可以降到16,如表所示。
结尾层的设计:
结尾层原先是先通过1x1 conv.来提升维度,然后再接池化层, 作者将该1x1 conv.移到池化层之后,这样一来,conv是在1x1的分辨率而不是7x7的分辨率上计算的。进而,之前的bottleneck layer中的depthwise conv.和projection layerye就不再需要。改变前后的对比图如下所示:
非线性激活的改进
原始的swish激活是这样的:
其中
σ
\sigma
σ表示sigmoid激活函数。考虑到其在移动设备中计算量太大,作者提出了改进版本:
Bneck中引入attention module
bneck即MobileNet v2的build block, Squeeze-and-Excite本质上是一种channel方向上的注意力机制。具体如下
:首先通过全剧平均池化GAP将spatial方向的分辨率降为1x1,然后连接两个fully connected layer, 其中中间的那个layer维度要低于两边的(即bottleneck结构)。
bneck与 Squeeze-and-Excite 如何结合呢?
Squeeze-and-Excite 作为一个独立的module的模块,可以与任何卷积模块结合,这里:Squeeze-and-Excite 是连接在depthwise的输出和projection layer的输入之间,如下图所示:
注:
1.MobileNetV2与Squeeze-and-Excite的首次结合是在Mnasnet: Platform-aware neural architecture search for mobile 这篇文章,这里只是继承和沿用;
2.关于Squeeze-and-Excite请参见文章: Squeeze-and-Excitation Networks
神经网络架构搜索NAS
文中所用的NAS分为两个步骤:
(1) 首先使用PlatformAware NAS,通过优化每一个block来搜索全局的网络结构;
(2) 通过NetAdapt算法来进一步微调每一个网络层;
PlatformAware NAS
在PlatformAware NAS中, 奖励函数的设计如下:
即基于目标延时,通过平衡实际延时和模型准确率来近似帕累托最优解。
作者进一步发现,原始的奖励函数并不适合小的移动模型,具体来说:对于小的模型Accuracy的变化更为显著,因此: 对于小的模型MobileNet V3 Small,权重因子w应该设置更小;
NetAdapt
详细过程如下:
其中有两个要点:
(1)proposals的生成:
包括调整bneck中expansion layer的大小;减小bottleneck的尺寸等
(2)筛选最佳proposal的度量准则
作者提出通过最大化下列目标来选择最佳的proposal作为下一轮的初始model;
相关实现
References
1.MobileNets Efficient Convolutional Neural Networks for Mobile Vision Application
2.CVPR-2018-MobileNetV2 Inverted Residuals and Linear Bottlenecks
3.Searching for MobileNetV3
4.Xception: Deep Learning with Depthwise Separable Convolutions
总结
可以看到这方面的工作的一个突出的特点是:
(1)工程性和实践性更强,虽然ideal很重要,但空有idea并不能说明什么,需要大量的实验,很多tricks和details都是大量的实验对比发现的,这些对于模型的最终性能都有影响;
(2)相互借鉴和吸收优秀的文章, 每一篇文章的原始贡献实际上很小,每篇文章都不同程度上继承/改进了之前的工作,都是相互借鉴和吸收,而不是某个东西突然之间横空出世。因此还是要多跟踪最新文章 。
未完待续。