本篇博文来介绍一个深度学习模型加速的算法:MobileNets,可以在基本不影响准确率的前提下大大减少计算时间和参数数量。
概述
深度学习网络广泛应用在图像分类,检测中,但是网络结构复杂,参数过多,计算时间过长使其不容易在移动端应用。因此像模型压缩、模型加速应该会是未来深度学习比较活跃的一个领域。本文提出一种将传统的卷积结构改造成两层卷积结构的网络:MobileNets,采用类似ResNext里面的group操作来实现。这种新的结构可以在基本不影响准确率的前提下大大减少计算时间(约为原来的1/9)和参数数量(约为原来的1/7)。
MobileNet模型的核心
MobileNet模型的核心就是将原本标准的卷积操作因式分解成一个depthwise convolution和一个1*1的卷积(文中叫pointwise convolution)操作。简单讲就是将原来一个卷积层分成两个卷积层,其中前面一个卷积层的每个filter都只跟input的每个channel进行卷积,然后后面一个卷积层则负责combining,即将上一层卷积的结果进行合并。
如下图:M表示输入特征的通道数,N表示输出特征的通道数(也是本层的卷积核个数)。因此如果假设卷积核大小是
D
K
∗
D
K
∗
M
∗
N
DK*DK*M*N
DK∗DK∗M∗N,输出是
D
F
∗
D
F
∗
N
DF*DF*N
DF∗DF∗N,那么标准卷积的计算量是
D
K
∗
D
K
∗
M
∗
N
∗
D
F
∗
D
F
DK*DK*M*N*DF*DF
DK∗DK∗M∗N∗DF∗DF。这个式子可以这么理解,先去掉
M
∗
N
M*N
M∗N,那么就变成一个二维卷积核去卷积一个二维输入feature map;那么如果输出feature map的尺寸是
D
F
∗
D
F
DF*DF
DF∗DF,由于输出feature map的每个点都是由卷积操作生成的,而每卷积一次就会有
D
K
∗
D
K
DK*DK
DK∗DK个计算量,因此一个二维卷积核去卷积一个二维输入feature map就有
D
F
∗
D
F
∗
D
K
∗
D
K
DF*DF*DK*DK
DF∗DF∗DK∗DK个计算量;如果有M个输入feature map和N个卷积核,那么就会有
D
F
∗
D
F
∗
D
K
∗
D
K
∗
M
∗
N
DF*DF*DK*DK*M*N
DF∗DF∗DK∗DK∗M∗N计算量。
本文的算法是用上图中的(b)+(c)代替(a),接下来详细讲解下什么怎么卷积的。依然假设有N个卷积核,每个卷积核维度是
D
K
∗
D
K
∗
M
DK*DK*M
DK∗DK∗M,输入feature map的通道数是M,输出feature map为
D
F
∗
D
F
∗
N
DF*DF*N
DF∗DF∗N。那么(b)表示用M个维度为
D
K
∗
D
K
∗
1
DK*DK*1
DK∗DK∗1的卷积核去卷积对应输入的M个feature map,然后得到M个结果,而且这M个结果相互之间不累加(传统的卷积是用N个卷积核卷积输入的所有(也就是M个)feature map,然后累加这M个结果,最终得到N个累加后的结果),注意这里是用M个卷积核而不是N个卷积核,所以(b)中没有N,只有M。因此计算量是
D
F
∗
D
F
∗
D
K
∗
D
K
∗
M
DF*DF*DK*DK*M
DF∗DF∗DK∗DK∗M。(b)生成的结果应该是
D
F
∗
D
F
∗
M
DF*DF*M
DF∗DF∗M,图中的(b)表示的是卷积核的维度。
(c)表示用N个维度为11M的卷积核卷积(b)的结果,即输入是 D F ∗ D F ∗ M DF*DF*M DF∗DF∗M,最终得到 D F ∗ D F ∗ N DF*DF*N DF∗DF∗N的feature map。这个就可以当做是普通的一个卷积过程了,所以计算量是 D F ∗ D F ∗ 1 ∗ 1 ∗ M ∗ N DF*DF*1*1*M*N DF∗DF∗1∗1∗M∗N(联系下前面讲的标准卷积是 D F ∗ D F ∗ D K ∗ D K ∗ M ∗ N DF*DF*DK*DK*M*N DF∗DF∗DK∗DK∗M∗N,就可以看出这个(c)其实就是卷积核为1*1的标准卷积)。
所以最重要的来了,采用这种算法的计算量变成了
D
F
∗
D
F
∗
D
K
∗
D
K
∗
M
+
D
F
∗
D
F
∗
M
∗
N
DF*DF*DK*DK*M+DF*DF*M*N
DF∗DF∗DK∗DK∗M+DF∗DF∗M∗N。具体和原来相比减少了多少计算量?可以看下面这个式子:
也就是说如果卷积核大小为3*3,那么差不多卷积操作的时间能降到原来的1/9左右(因为N通道数一般为较大值)。
所以看看Fig3表达的标准卷积(左边)和因式分解后的卷积(右边)的差别。注意到卷积操作后都会跟一个Batchnorm和ReLU操作。
网络结构
然后看看这个网络结构:如果把depthwise和pointwise看做不同层的话,MobileNet一共包含28层。第一个卷积层不做分解,另外最后有个均值pooling层,全连接层和softmax层。这里dw就表示depthwise。
下表Table2介绍了网络中不同类型层的计算时间在总时间中的比例以及参数的数量在总的参数数量中的比例。
前面讲的都是在计算时间和参数的减少,现在看看计算准确率的对比:Table4,表示本文卷积和标准卷积的对比。可以看出Accuracy减少得不是很明显,但是却大大减少了计算时间和参数数量。
总结
作者主要提出一种将标准卷积层拆分成两个卷积层的MolileNet网络,可以在基本保证准确率的前提下大大减少计算时间和参数数量。个人认为应该对于全卷积网络(ResNet等)的提升效果比较明显,可以在最近的object detection算法中借鉴。另外模型加速和压缩应该会是最近几年比较活跃和值得关注的领域。
论文地址
MobileNets Efficient Convolutional Neural Networks for Mobile Vision Applications