导读
最近在学习模型量化相关的技术,过程中了解到深度可分离卷积是模型量化学习前要了解的。后来发现在模型量化的时候,深度可分离卷积带来的影响是巨大的,特在此学习记录,如有不正确之处还请指正,欢迎讨论交流。
最直接高效的学习方法就是去看原著论文了MobileNet v1 (CVPR 2017) 论文获取。Google工作人员提出MobileNet用于在移动端完成视觉任务,其主要贡献就是提出了深度可分离卷积,大大减少了卷积神经网络(CNN)的参数量和计算复杂度。
提出背景
自从 AlexNet 在 ImageNet 挑战赛 ILSVRC 2012 上一举夺得冠军后,CNN 就开始在计算机视觉任务上流行起来。除此之外,为了达到更高的精度,研究工作人员趋向于设计更深、更复杂的 CNN 网络结构。然而,这些提升精度的设计方法,会使得模型大小急剧增加,并且运行速度变慢。在现实应用中,比如自动驾驶、机器人、增强现实等领域,模型需要在资源有限的计算平台上快速地运行,达到实时处理地要求。
鉴于上边的研究背景,作者为解决CNN模型高效运算(在提升准确率的同时,不增加模型参数和计算复杂度)的问题,提出了深度可分离卷积,以替代标准卷积完成语义特征提取。
研究进展
在这之前已经有一些工作提出来致力于解决CNN高效计算的问题,这些工作大致可分为两类:
-
直接训练小模型
其中,直接设计并训练小模型的方法有如下:
Flattened networks 使用完全因式分解的卷积搭建网络,并且展示了因式分解网路的潜力。与 Flattened networks 不同,Factorized networks 提出了一种相似的因式分解卷积,并且使用了拓扑连接的方式。随后,Xception network 被提出并证明了如何放大深度可分离卷积来超越 Inception V3 network。除此之外,还有一种小型网络 SqueezeNet,它使用 BottleNeck 的方法设计出了非常小的网络结构。当然,还有 structured transform networks 和 deep fried convnets。 -
改变预训练模型
通过预训练模型获取小模型的方法主要有三种:shrinking、factorizing、compressing。包括基于乘积量化、散列和剪枝、矢量量化和霍夫曼编码的压缩。此外,还有各种已经提出的分解方法来加速预训练网络。还有一种方法是蒸馏,它使用较大的网络来训练较小的网络。除此之外,还有另一种新兴的方法是低比特网络。
深度可分离卷积详细介绍
深度可分离卷积是 MobileNets 的核心模块,这是一种因式分解的卷积形式。常见的普通卷积的卷积核如图1所示,
D
K
D_K
DK 是卷积核的空间尺寸,
M
M
M 为卷积核的通道数(等于输入特征的通道数),
N
N
N 为卷积核的个数(等于输出特征的通道数)。
图1. 标准卷积的卷积核
假设给定一个维度为
D
F
×
D
F
×
M
D_F×D_F×M
DF×DF×M 的特征图作为输入,图1中那么每一个
D
K
×
D
K
×
M
D_K×D_K×M
DK×DK×M的卷积核在输入特征图上进行遍历和卷积运算,得到一张维度为
D
F
×
D
F
×
1
D_F×D_F×1
DF×DF×1的特征图(这里假设stride=1,并且Padding),待所有
D
K
×
D
K
×
M
D_K×D_K×M
DK×DK×M 的卷积核在输入特征上完成卷积运算之后,我们会得到维度为
D
F
×
D
F
×
N
D_F×D_F×N
DF×DF×N的输出特征图。整个标准卷积的运算过程用数学形式表达如下:
在上边的描述中,可以发现由于标准卷积的维度是三维的(包含通道维度),所以卷积的过程中不仅提取了中心像素及其周围像素的语义信息,而且还融合了通道之间的语义信息。然而,多一个维度,意味着计算量的指数增长。标准卷积的计算量 C C C 和参数量 P P P 分别为:
根据计算量 C C C 和参数量 P P P 的计算方式,如果想同时减小计算量 C C C 和参数量 P P P,有三种选择:
- 减小卷积核的空间尺寸 D K D_K DK
- 减小输出特征的通道数 N N N
- 减小输入特征的通道数 M M M
卷积核的空间尺寸 D K D_K DK 决定了 CNN 的感受野,感受野是 CNN 性能提升的关键指标(一般感受野越大,模型性能越好),想要了解感受野概念的可以转到膨胀卷积与感受野的讲解。目前提升CNN性能的一个研究趋势就是使用大卷积核代替小卷积核,所以减小 D K D_K DK 这个方案行不通。
那么减小输出特征的通道数 N N N 呢 ?CNN 提取特征的多样性与通道数息息相关,即卷积核的个数 N N N,如果降低 N N N ,可能导致提取语义特征的单一性,网络的表征能力无法胜任要求。一般地, N N N 随着网络加深,逐渐增加。
现在只剩下最后一种方案了:减小输入特征的通道数 M M M。其实 M M M 也是不能减小的,因为当前层的 M M M 便是上一层的 N N N,我们能改进的地方只是卷积的计算过程。那么怎么改进呢?我们开头的时候说了深度可分离卷积是一种因式分解的卷积形式。怎么个因式分解法呢?下面开始详细讲。
深度可分离卷积的改进思想是将标准卷积分解为深度卷积和被称为点卷积的 1×1 卷积。深度可分离,顾名思义,不同于标准卷积的三维卷积核,深度可分离卷积的卷积核通道数为 1 ,即
D
K
×
D
K
×
1
D_K×D_K×1
DK×DK×1 ,如图2所示,所以在深度卷积的过程中每个卷积核只考虑自己所负责的通道,而不是像标准卷积那样,每个
D
K
×
D
K
×
M
D_K×D_K×M
DK×DK×M的卷积核都要考虑所有通道的语义信息。
图2. 深度卷积的卷积核。
D
K
D_K
DK为卷积核的空间尺寸,
M
M
M为卷积核的个数(等于输入特征的通道数)
只进行深度卷积显然不能与标准卷积的性能相媲美,因为它没有考虑通道间的信息,而且输出通道数与输入通道数相等,提取的语义信息量没有增加。所以,深度可分离卷积还要进行第二步:点卷积(1×1卷积)。点卷积是一系列的1×1卷积卷积核,如图3所示。
图3. 点卷积的卷积核。
M
M
M为卷积核的通道维度,
N
N
N为1×1卷积核的个数(等于输出特征的通道数)
综上所述,深度可分离卷积将标准卷积分割成2步:深度卷积、点卷积。深度卷积的卷积核维度为 D K × D K × 1 × M D_K×D_K×1×M DK×DK×1×M,其中 M M M 为卷积核个数。每个卷积核负责提取1个通道的信息,通过这种方式,在标准卷积的基础上降低了计算量,深度卷积的计算量 C d e p t h C_{depth} Cdepth 和参数两 P d e p t h P_{depth} Pdepth分别为:
每个通道的语义信息通过深度卷积提取之后,再使用点卷积对通道之间的信息做整合,并且增加特征的通道数(特征的多样性)。点卷积的计算量 C p o i n t C_{point} Cpoint 和参数两 P p o i n t P_{point} Ppoint分别为:
那么深度可分离卷积的计算量 C d s C_{ds} Cds 和参数量 P d s P_{ds} Pds 分别为:
空间可分离
其实在深度可分离被提出来之前,有空间可分离的概念。学过线性代数的都知道矩阵的运算和分解,比如:
就这样,一个3×3的矩阵被分解成了一个3×1和一个1×3的矩阵相乘。通过这种空间维度上的分离,也可以降低计算量。但是这种分解方式比较难找,不适合大范围应用。
参数分析
所以深度可分离卷积,将创新点放在了深度分离上,首先使用深度卷积对单一通道进行卷积运算,相比较于标准卷积,将卷积核的参数量从
D
K
×
D
K
×
M
×
N
D_K×D_K×M×N
DK×DK×M×N 减少到
D
K
×
D
K
×
M
D_K×D_K×M
DK×DK×M。然后,点卷积采用的是1×1的卷积形式,参数量为
N
×
M
N×M
N×M,因为1×1卷积核的设计初衷就是降低参数量和计算量,通过整合单个特征点位置上的所有通道信息完成特征提取。
标准卷积和深度可分离卷积的参数量分析:
如果采用3×3的卷积核(即 D K = 3 D_K=3 DK=3),那么深度可分离卷积的参数量相比较于标准卷积,降低了8~9倍。而且,作者经过实验,虽然参数量大幅下降,但是准确率并没有受到影响。
深度可分离卷积以及MobileNet的网络结构
图4. 左边为带有BN和ReLU激活的标准卷积层结构,右边为带有BN和ReLU激活的深度可分离卷积层结构。可以看到,深度卷积和点卷积之后都做了一次BN和ReLU激活。
图5. 用于分类任务的MobileNet网络结构图
图6. 针对MobileNet参数分布的分析
图6表明,使用深度可分离卷积后,MobileNet的绝大多数运算量和参数量都集中在了1×1的卷积层。而这种现象带来了一种好处:通常,为利用并行计算的优势,卷积运算是以矩阵相乘的方式完成的。但是常规的方形卷积核在计算时,需要将输入特征和卷积核参数进行 im2col 的操作将其在内存中进行重新排序转换为矩阵形式进行运算,然而1×1的卷积运算不需要这种内存上的重新排序,便可以直接利用矩阵乘法完成运算,所以mobileNet在很大程度上提升了模型的推理速度,可以很好的解决模型在移动端部署时出现的延迟现象。