Now you see me

Chao's Blog

理解MobileNetV1

在本文中,主要介绍了MobileNetV1,其中使用的深度可分离卷积能够减小模型尺寸和复杂度,这对于移动端和嵌入式的视觉应用十分有效。作者提出了两个全局超参数(宽度乘子和分辨率乘子),用于取得效率和准确率之间的平衡。MobileNetV1的核心就是更小、更高效。 一、深度可分离卷积 深度可分离卷积之所以如此命名,是因为它不仅涉及空间维度,而且涉及深度维度(通道数)。深度可分离卷积将一个内核拆分为两个独立的内核,这些内核执行两个卷积:逐深度卷积(depthwise convolution)和逐点卷积(pointwise convolution)。 但首先,让我们看看普通卷积的工作原理。 1.1 普通卷积 一般来说,典型的图像不一定是2D图像, 它可能具有深度、宽度和高度。 我们假设有一张12 x 12 x 3像素的输入图像。我们在图像上进行5 x 5的卷积,不使用填充,步幅为1。如果仅考虑图像的宽度和高度,则卷积过程类似于:12 x 12\to5 x 5\to 8 x 8。 在5×5内核中,每25个像素进行标量乘法,每次给出1个数字。 由于没有填充(12 – 5 + 1 = 8),因此最终得到8×8像素的图像。 但是,由于图像具有3个通道,因此我们的卷积内核也需要具有3个通道。 这意味着,每次内核移动时,我们实际上都执行5 x 5 x 3 = 75乘法,而不是执行5 x 5 = 25乘法。 如图1所示,我们以每25个像素执行标量矩阵乘法,输出1个数字。 经过5 x 5 x 3内核后,12 x 12 x 3图像将变为8 x […]

在本文中,主要介绍了MobileNetV1,其中使用的深度可分离卷积能够减小模型尺寸和复杂度,这对于移动端和嵌入式的视觉应用十分有效。作者提出了两个全局超参数(宽度乘子和分辨率乘子),用于取得效率和准确率之间的平衡。MobileNetV1的核心就是更小、更高效。

一、深度可分离卷积

深度可分离卷积之所以如此命名,是因为它不仅涉及空间维度,而且涉及深度维度(通道数)。深度可分离卷积将一个内核拆分为两个独立的内核,这些内核执行两个卷积:逐深度卷积(depthwise convolution)和逐点卷积(pointwise convolution)。 但首先,让我们看看普通卷积的工作原理。

1.1 普通卷积

一般来说,典型的图像不一定是2D图像, 它可能具有深度、宽度和高度。 我们假设有一张12 x 12 x 3像素的输入图像。我们在图像上进行5 x 5的卷积,不使用填充,步幅为1。如果仅考虑图像的宽度和高度,则卷积过程类似于:12 x 12\to5 x 5\to 8 x 8。 在5×5内核中,每25个像素进行标量乘法,每次给出1个数字。 由于没有填充(12 – 5 + 1 = 8),因此最终得到8×8像素的图像。

但是,由于图像具有3个通道,因此我们的卷积内核也需要具有3个通道。 这意味着,每次内核移动时,我们实际上都执行5 x 5 x 3 = 75乘法,而不是执行5 x 5 = 25乘法。

如图1所示,我们以每25个像素执行标量矩阵乘法,输出1个数字。 经过5 x 5 x 3内核后,12 x 12 x 3图像将变为8 x 8 x 1图像。


图1. 一个普通卷积,其输出为8 x 8 x 1(源自:Ref [2])

如果我们想增加输出图像中的通道数怎么办? 如果我们想要大小为8 x 8 x 256的输出怎么办?如图2所示,我们可以创建256个内核来生成256张8 x 8 x 1图像,然后将它们堆叠在一起以创建8 x 8 x 256图像输出。


图2. 一个普通卷积,其输出为8 x 8 x 256(源自:Ref [2])

这就是普通卷积的工作方式。 可以将其视为一个函数:12 x 12 x 3 \to 5 x 5 x 3 x 256\to12 x 12 x 256(其中5 x 5 x 3 x 256表示内核的高度、宽度、输入通道数和输出通道数)。我们不是将整个图像乘以内核,而是将内核移动到图像的每个部分,并分别乘以一小部分。

1.2 逐深度卷积

在第一部分的逐深度卷积中,我们在不改变深度的情况下为输入图像进行了卷积。 如图3所示,我们通过使用3个形状为5x5x1的内核来实现。


图3. 在一幅三通道图像中迭代三个卷积核(源自:Ref [2])

如图4所示,每个5 x 5 x 1内核都会迭代图像的1个通道(注意:1个通道,而不是所有通道),获得每25个像素组的标量积,从而给出8 x 8 x 1图像。 将这些图像堆叠在一起将创建一个8 x 8 x 3的图像。


图4. 逐深度卷积,使用3个卷积核将一幅12 x 12 x 3图像转化为8 x 8 x 3图像(源自:Ref [2])

1.3 逐点卷积

原始的普通卷积将12 x 12 x 3图像转换为8 x 8 x 256图像。 当前,深度卷积已将12 x 12 x 3图像转换为8 x 8 x 3图像。 现在,我们需要增加每个图像的通道数。

逐点卷积之所以如此命名,是因为它使用了1 x 1的内核或迭代遍历每个点的内核。 该内核的深度为输入图像所具有的通道数。 因此,如图6所示,我们将1 x 1 x 3内核在8 x 8 x 3图像上进行迭代,以获得1张8 x 8 x 1的图像。


图5. 逐点卷积,将一幅8 x 8 x 3图像转化为8 x 8 x 1图像(源自:Ref [2])

如图6所示,我们可以创建256个1 x 1 x 3内核,每个内核输出8 x 8 x 1图像,以得到形状为8 x 8 x 256的最终图像。


图6. 逐点卷积,使用256个卷积核将一幅8x8x3图像转化为8x8x256图像(源自:Ref [2])

我们将卷积分为:深度卷积和点卷积。如果原始的普通卷积为12 x 12 x 3$ \to $5 x 5 x 3 x 256$ \to $8 x 8 x 256,我们可以将这种新卷积说明为12 x 12 x 3$ \to $5 x 5 x 1 x 3$ \to $1 x 1 x 3 x 256$ \to $8 x 8 x 256。

1.4 深度可分离卷积的优势

我们计算一下在普通卷积中执行的乘法次数,有256个5 x 5 x 3内核,可移动8 x 8次,那就是256 x 3 x 5 x 5 x 8 x 8 = 1,228,800乘法。

深度可分离卷积呢?在逐深度卷积中,我们有3个5 x 5 x 1内核,它们移动了8 x 8次。那就是3 x 5 x 5 x 8 x 8 = 4,800次乘法。在逐点卷积中,我们有256个1 x 1 x 3内核,它们移动8 x 8次。那就是256 x 1 x 1 x 3 x 8 x 8 = 49,152次乘法。 最后,将它们加在一起,就是53,952次乘法。

52,952比1,228,800少得多。 通过较少的计算,网络可以在更短的时间内处理更多内容。但是,这两个网络是在做同样的事情么?在这两种情况下,我们都将图像通过5 x 5内核,将其缩小到一个通道,然后将其扩展到256个通道。 为什么一个为什么比另一个快两倍以上呢?

主要区别在于:在正常卷积中,我们将图像变换了256次。 并且每个变换都使用5 x 5 x 3 x 8 x 8 = 4800次乘法。 在深度可分离卷积中,我们只对图像进行1次真正的变换-即在逐深度卷积。然后,我们获取转换后的图像并将其简单地拉长到256个通道。 无需一遍又一遍地变换图像,这样我们就可以节省计算能力。

二、网络架构

MobileNetV1的网络架构如下图7所示。


图7. MobileNetV1的网络架构(源自:Ref [1])

MobileNet就是建立在深度可分离卷积上的,但是它的第一层是完全卷积层。除了最后的全连接层(无需非线性,连接softmax用于分类),所有卷积层(包括深度可分离卷积)后均添加了BN层和ReLU层,如下图8所示。在第一层和深度可分离卷积中,均采用了跨步卷积来进行下采样。此外,在全连接层之前,作者使用了一个平均池化层,将空间分辨率降为1。若将逐深度卷积和逐点卷积归为单独的层,那么MobileNet一共有28层。


图8. 普通卷积(左),带有BN和ReLU的深度可分离卷积(右)(源自:Ref [1])

三、宽度乘子$\alpha $

作者在网络中引入了宽度乘子\alpha,主要是为了控制某一层的输入宽度。原文中提到:

The role of the width multiplier α is to thin a network uniformly at each layer.

通常,我们可以将\alpha设置为1、0.75、0.5和0.25。当$\alpha = 1$时,我们得到的就是基础的MobileNet。对于给定的一个层和宽度乘子$\alpha $,输入通道数就会从M变成\alpha M,输出通道数就会从N变成\alpha N。随着\alpha的减小,计算损耗和参数量呈二次函数下降的趋势。

Width multiplier has the effect of reducing computational cost and the number of parameters quadratically by roughly \alpha ^2.

Width Multiplier ImageNet Accuracy Million Mult-Adds Million Parameters
1.0 MobileNet-224 70.6% 569 4.2
0.75 MobileNet-224 68.4% 325 2.6
0.5 MobileNet-224 63.7% 149 1.3
0.25 MobileNet-224 50.6% 41 0.5

可以看到当\alpha从1.0降至0.5的过程中,准确率的下降都是十分平缓的。但是\alpha=0.25时,准确率下降较大,说明此时宽度乘子过小了。

四、分辨率乘子$\rho $

此外,作者还在网络中引入了分辨率乘子\rho,控制输入图像的分辨率。原文中提到:

We apply this (resolution multiplier) to the input image and the internal representation of every layer is subsequently reduced by the same multiplier.

\rho的范围在0到1之间,初始输入图像的分辨率为224,这是基础的MobileNet。当\rho分别等于0.86,0.71,0.57时,输入图像的分辨率分别为192,160,128。不过,这里$\rho $的数值是通过改变分辨率来隐性设置的。此外,计算损耗会以\rho ^2的速度下降。

Resolution multiplier has the effect of reducing computational cost by $\rho ^2$.

Resolution Multiplier ImageNet Accuracy Million Mult-Adds Million Parameters
1.0 MobileNet-224 70.6% 569 4.2
1 MobileNet-192 69.1% 418 4.2
1 MobileNet-160 67.2% 290 4.2
1 MobileNet-128 64.4% 186 4.2

可以看到当分辨率从224降至128的过程中,准确率的下降都是十分平缓的。

五、其他结果

根据\alpha \in \{ 1,0.75,0.5,0.25\}res \in \{ 224,192,160,128\},设计了16个模型,图9显示了ImageNet准确率和计算次数的关系,图中的结果是采用底数线性处理的。可以看到当\alpha=0.25时,准确率有一个跃升。图10 显示的是ImageNet准确率和参数量之间的关系。


图9. ImageNet准确率和计算量之间的关系(源自:Ref [1])


图10. ImageNet准确率和参数量之间的关系(源自:Ref [1])

六、应用

(1)更精细的识别

(2)大尺度的地理定位

(3)人脸识别

(4)目标检测

七、思考

为什么MobileNet能够加快网络训练速度呢?

首先就是使用了深度可分离卷积,这极大的减少了计算量(Mult-Adds)。但还有另一方面需要考虑的,那就是网络的实现方式。作者提到:

Our model structure puts nearly all of the computation into dense 1×1 convolutions. This can be implemented with highly optimized general matrix 0.0multiply (GEMM) functions.

1×1 convolutions do not require initial reordering in memory and can be implemented directly with GEMM which is one of the most optimized numerical linear algebra algorithms.

然后作者给出了各个网络层的计算和参数占比,如下表所示。

Type Mult-Adds Parameters
Conv 1 x 1 96.86% 74.59%
Conv DW 3 x 3 3.06% 1.06%
Conv 3 x 3 1.19% 0.02%
Fully Connected 0.18% 24.33%

那什么是GEMM呢?其实它就是泛化矩阵-矩阵乘法。原文中提到的reordering的解释可以参照matlab中的函数im2col,也可以见下图的解释。


图11. im2col的解释(源自:Ref [4])

由此,我们就可以明白为什么作者说1 x 1卷积不需要reordering,因为这个卷积只有Patch 1。关于GEMM的由浅入深的解释,可见这里:Why GEMM is at the heart of deep learning

接下来,回到原文中,作者还提到了另外两点。

(1)使用更少的正则化和数据增强,因为小模型一般不需要担心过拟合的问题。

(2)尽量减少对逐深度卷积使用权值下降,因为很明显,它们的参数已经够少了。

除此以外,作者还应用了MobileNet的核心超参数,也就是宽度乘子和分辨率乘子。

Reference

[1]. MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

[2]. A Basic Introduction to Separable Convolutions

[3]. Review: MobileNetV1 — Depthwise Separable Convolution (Light Weight Model)

[4]. Why GEMM is at the heart of deep learning