paper地址:https://arxiv.org/abs/1704.04861?context=cs
1. 介绍
MobileNet V1论文是google 在2017年4月提出的,作者先描述了现在的网络越来越网深层,准确率在不断的提高,伴随计算量越来越大,网络的效率并没有得到提升,表现在模型的大小(size)和速度(speed)方面,于是提出了这个轻量化网络模型。并在移动端或者嵌入式设备上得到广泛的应用。
如何实现加速?文中还指出现有一些论文只关注网络模型的大小,并没有考虑网络的速度。其实大部分的时间主要是花在卷积运算上,所以作者就从卷积下手,提出了一种新的卷积方法——深度可分离卷积(depthwise separable convolutions)。
文中主要围绕下面两点来实现模型更小、更低延时:
- 从网络的架构方面,引入了深度可分离卷积;
- 通过加入2个超参数:宽度缩放因子(width multiplier)和分辨率缩放因子(resolution multiplier)。
深度可分离卷积:最新使用在Inception models的前面几层上,它具有高度分解网络的能力,Xception网络也证明了如何在Inception V3网络上扩展深度可分离过滤器。而squeezenet网络则是使用bottleneck (瓶颈层)的方法来实现。
此外还有一些方法如收缩、分解、压缩、量化、剪枝、霍夫曼编码等实现加速。同时可以使用蒸馏(distillation)来训练一个小网络,通过一个大的网络来指导小网络的训练。
2. MobileNet 网络架构
下面从4个知识点进行介绍
- 深度可分离卷积
- MobileNet 结构和训练
- 宽度缩放因子(Width Multiplier)
- 分辨率缩放因子(Resolution Multiplier)
2.1 深度可分离卷积
那么是如何减少计算量的呢?其实在整个网络中,大部分的计算时间都花费在计算conv上,所以作者选择从conv下手,提出了深度可分离卷积。
深度可分离卷积:是对标准卷积(Standard conv)进行分解,分解为一个深层卷积(depthwise convolution)和一个 1x1 conv 逐点卷积(pointwise convolution)。深层卷积(dw)对每个输入通道只使用单个卷积核(filter)进行卷积,用来提取特;而1x1点卷积(pw)用来对深层卷积(dw)的多个输出进行线性融合。深度可分离卷积打破输出通道N(output channel)和 卷积核(kernel size) 之间相互连接的关系以减少计算量。
我们先从标准的conv说起,如下图
图(a):所示是使用标准卷积核,计算一个标准的卷积层计算量为:
是kernel size,M为input channel,N为output channel, 是feature map的大小。
图(b):是使用深层卷积核,它每个输入通道只使用单个过滤器(filter),故执行一次卷积运算的计算量为:
图(c):是分解成的1x1 conv点卷积。kernel size: ,所以它的计算量为:
这样就得到我们深度可分离卷积的总计算量,即为两者相加:
,
计算量减少到原来的倍数:
如果使用3x3的深度可分离卷积,大约减少8~9倍的计算量。
2.2 MobileNet 结构和训练
网络结构:
如Table 1所示:
MobileNet总共有28层, 第一层Conv/s2是全卷积层,之后就接很多的 Conv dw/s* , Conv/s1 层,这两层就是标准卷积分离得到的两个层,到后面再接一个Avg Pool / s1 层来降低空间解析度,得到1024个输出,再经过FC / s1 全连接层得到1000个输出,最后把1000输出喂到Softmax 函数来进行分类。
标准的卷积分解为 3x3 Depthwise Conv , 1x1 Conv这两个层,这两个层之间也是使用BN 和 Relu 来连接。正如下图所示:
论文中提到非结构化的稀疏矩阵一般不会比密集矩阵(dense matrix)运算得更快,然后作者的模型结构几乎是把所有(94.86%)的计算都放在1x1 conv 密集卷积中。卷积的计算通常由矩阵乘法(GEMM)来实现,可运算GEMM需要使用im2col 方式在内存中重新排序,才将其映射到GEMM。Caffe 就是使用这种方法(im2col + GEMM)来实现卷积运算的。1x1 conv不需要在内存中重新排序,可以直接使用GEMM实现。可见这网络的设计是如此的恰到好处。
训练:
- 优化器:使用RMSpror ;
- 较少使用正则化和数据增强,因为小的模型不会产生过拟合;
- 在depthwise filters上加入少量或者不加权重衰减(L2正则化)是很重要的,因为它们的参数很少,建议不加。
2.3 宽度缩放因子(Width Multiplier)
为了模型更小、计算量更少,作者引入一个简单的参数,让输入通道变为,输出通道变为,整个计算量就变为了:
其中,通常取1, 0.75, 0.5, 0.25 等。因为会使网络结构简化,所以我们需要从头训练模型。
2.4 分辨率缩放因子(Resolution Multiplier)
降低神经网络计算成本,引入的第二个超参数是分辨率乘法器,就是直接让输入的分辨率更小,由变为,计算量:
其中,得到典型的分辨率为224, 192, 160, 128 等。这一步减少的计算量到原来的倍。
3. 经验
作者介绍了一些自己的调试经验,主要是在MobileNet架构上精度、计算量和模型大小之间的权衡。
Table 4 对比了使用全连接卷积模型和深度可分离卷积模型的对比;
Table 5 是宽度变小和网络层数变浅的精度对比;
Table 6 是 超参数a在不同取值下的对比;
Table 7 是 在不同分辨率下精度对比;
其他的一些对比这里我就不仔细说了,可以去看作者的论文。这里再贴一个表:MobileNet 和一些流行的网络模型的对比。可以看到MobileNet和VGG16的精度是比较接近的,然而在模型上减少32倍,计算量减少了27倍,可见MobileNet效率有非常大的提高。
MobileNet 除了在图片分类上应用,还可以用于人脸识别、目标检测等多个方面,比如mobilefaceNets、mobilenetSSD等模型,实现自己想要的应用。
References:
[1] MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications