提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、前言
这篇论文是Google针对手机等嵌入式设备提出的一种轻量级的深层神经网络,取名为MobileNets。个人感觉论文所做工作偏向于模型压缩方面,核心思想就是卷积核的巧妙分解,可以有效减少网络参数。
论文地址:MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
民间实现:Caffe | Tensorflow_1 | Tensorflow_2
官方代码:mobilenet_v1.md
二、摘要
我们提供一类称为MobileNets的高效模型,用于移动和嵌入式视觉应用。 MobileNets是基于一个流线型的架构,它使用深度可分离的卷积来构建轻量级的深层神经网络。我们引入两个简单的全局超参数,在延迟度和准确度之间有效地进行平衡。这两个超参数允许模型构建者根据问题的约束条件,为其应用选择合适大小的模型。我们进行了资源和精度权衡的广泛实验,与ImageNet分类上的其他流行的网络模型相比,MobileNets表现出很强的性能。最后,我们展示了MobileNets在广泛应用场景中的有效性,包括物体检测,细粒度分类,人脸属性和大规模地理定位。
三、背景
随着深度学习的发展,卷积神经网络变得越来越普遍。当前发展的总体趋势是,通过更深和更复杂的网络来得到更高的精度,但是这种网络往往在模型大小和运行速度上没多大优势。一些嵌入式平台上的应用比如机器人和自动驾驶,它们的硬件资源有限,就十分需要一种轻量级、低延迟(同时精度尚可接受)的网络模型,这就是本文的主要工作。
毕竟消费类产品很多是嵌入式的终端产品,而且嵌入式芯片的计算性能并不很强。即使我们考虑云计算,也需要消耗大量的带宽资源和计算资源。因此,CNN的优化已经成为深度学习产品能否在消费市场落脚生根的一个重要课题之一。所以,有不少学者着手研究CNN的网络优化,如韩松的SqueezeNet, Deep Compression, LeCun的SVD, Google的MobileNet以及这个孙剑的ShuffleNet等。
其实网络压缩优化的方法有两个发展方向,一个是迁移学习,另一个是网络稀疏。迁移学习是指一种学习对另一种学习的影响,好比我们常说的举一反三行为,以减少模型对数据的依赖。不过,它也可以通过Knowledge distillation(知识蒸馏)实现大模型到小模型的迁移,这方面的工作有港中文汤晓鸥组的MobileID。他们运用模型压缩技术和domain knowledge,用小的网络去拟合大量的数据,并以大型teacher network的知识作为监督,训练了一个小而紧凑的student network打算将DeepID迁移到移动终端与嵌入式设备中。而另一方面,网络稀疏是现在比较主流的压缩优化方向,这方面的工作主要是以网络结构的剪枝和调整卷积方式为主。比如深度压缩,它先通过dropout, L1/L2-regularization等能产生权重稀疏性的方法训练题记和密度都很大的网络,让后把网络中贡献小(也就是被稀疏过的)的权重裁剪掉,相当于去除了一些冗余链接,最后对模型做一下fine-tune就得到他所说的30%压缩率的效果。但它在效率上的提高并不适合大多数的通用CPU,因为它的存储不连续,索引权重时容易发生Cache Miss, 反而得不偿失。下面介绍的MobileNet在这方面更有优势,MobileNets主要关注优化延迟,同时兼顾模型大小,不像有些模型虽然参数少。
四、MobileNets模型结构
MobileNet的主要工作是用depthwise sparable convolutions(深度级可分离卷积)替代过去的standard convolutions(标准卷积)来解决卷积网络的计算效率和参数量问题,它可以将标准卷积分解成一个深度卷积和一个点卷积(1x1卷积核)。深度卷积将每个卷积核应用到每一个通道,而1x1卷积用来组合通道卷积的输出。
1、原理解释
下图说明了标准卷积如何进行分解的:
它将standard convolutions(标准卷积)分解为depthwise convolution(深度卷积)和pointwise convolution(逐点卷积),它默认一种假设,使用分解后的卷积效果和标准卷积效果是近似的。举个简单的例子说明,假设我们有一个输入图片,这个输入图片的维度是11x11x3,标准卷积为3x3x3x6(假设stride为2, padding为1),那么可以得到输出为6x6x16(6=(11 - 3 + 2*1) / 2+1)的输出结果。现在输入图片不变,先通过一个维度是3x3x1x3的深度卷积(输入是三通道,这里有3个卷积核分别作用在3个通道上),得到6x6x3的中间输出,然后再通过一个维度是1x1x3x16的1x1卷积,同样的到输出为6x6x16。
其实,它默认一个假设,就是常规卷积核在feature maps的channels维度映射中,存在一种类似线性组合的分解特性。我们用k表示一个常规卷积核,则:
其中,".“表示一种特殊的矩阵乘法,其运算法则参考下面公式,b是一个m维矩阵"向量”(Matrix Spaces),它的每个元素(element)是一个sxs大小的2维卷积核:
2、网络结构
前面讲述了depthwise separable convolution, 这是MobileNet的基本组件,但是在真正应用中会加入Batch Normalization(BN), BN是啥?顾名思义,batch normalization,就是“批规范化”咯。Google在ICML文中描述的非常清晰,即在每次SGD(随机梯度下降)时,通过mini-batch来对相应的activation做规范化操作,使得结果(输出信号各个维度)的均值为0,方差为1。
什么时候用BN呢?例如在神经网络训练时遇到收敛速度很慢,或者梯度爆炸等无法训练的情况可以尝试用BN来解决。另外,在一般使用情况下也可以加入BN来加快训练速度,提高模型精度。
除此之外,模型还是用ReLU激活函数,所以depthwise separable convolution的基本结构如下图所示:
而MobileNets由很多上图所示的depthwise separable convolution组合而成的。其具体的网络结构如下图所示:
如上图所示,首先是 一个3x3的标准卷积,然后后面就是堆积depthwise separable convolution, 并且可以看到其中部分depthwise convolution会通过strides = 2(步长)进行downsampling(下采样)。然后采用average pooling(平均池化)将feature变成1x1, 根据预测类别大小加上全连接层,最后是一个softmax层。如果单独计算depthwise convolution和pointwise convolution,整个网络有28层
(这里Avg Pool和Softmax不在计算内)。
我们还可以分析整个网络的参数和计算量分布,如下图所示:
可以看到整个计算量基本集中在1x1卷积上,如果你熟悉卷积底层实现的话,你应该知道卷积一般空过一种im2col,其需要内存重组,但是当卷积核为1x1时,其实就不需要这种操作了,底层可以有更快的实现。对于参数也主要集中在1x1卷积,初次之外还有就是全连接层占了一部分参数。
MobileNet到底效果如何,这里与GoogleNet和VGG16做了对比,如下图所示:
相比VGG16,MobileNet的准确度稍微下降,但是优于GoogleNet。然而,从计算量和参数量上MobileNet有绝对的优势。