一、简介
本文主要对目前常用加速卷积神经网络的方法做一个概述。
全连接层(Fully Connected Layer)是造成神经网络占用大量内存的原因,但是他很快;卷积层消耗了大部分算力,虽然参数更少。事实上卷积非常需要算力,这也是我们需要如此多的算力来训练网络的原因。
目前有多种加速卷积同时不严重影响模型精度的方法。在这片博客中,我们主要介绍下面几种:
- Factorization/Decomposition of convolution’s kernels
- Bottleneck Layers
- Wider Convolutions
- Depthwise Separable Convolutions
二、Factorization
这里分解卷积的方法是指在图像处理领域的分解方式:对一个N*N的卷积核,可以通过分解成1*N和N*1的形式,然后按顺序使用两个卷积核做卷积。
靠近输入层的卷积核最好不要分解,另外分解3*3的卷积核有可能损害网络的性能。靠近输入层的卷积核不做分解的主要原因是这些层主要提取底层信息,分解卷积核有可能影响特征提取,进而对高维度的信息产生影响。目前我了解到的卷积分解很少会做上面提到的分解方法,更多的是利用depthwise+pointwise来分解卷积,提升速度。
在介绍其他方法之前,还要再提一个分解大卷积核更加稳定的方法:使用多个小卷积核替代大卷积核。比如使用两个3*3卷积核代替5*5卷积核,或者使用3个3*3卷积核替代7*7卷积核。
三、Bottleneck Layers
Bottleneck Layers主要的思想是利用1*1卷积核减少输入tensor的通道数,然后在channel更少的feature map上使用大于1的卷积核。
从革命性的InceptionV1到现代的DenseNet,几乎所有的cnn都在以这样或那样的瓶颈层使用。这种技术有助于保持参数的数量,同时降低计算成本。
四、Wider Convolutions
另一种简单的加速方法叫做wide convolutional layer。模型有越多的卷积层,它的速度越慢。但你需要大量卷积核的表达能力。怎么办呢?使用更少但更宽的卷积层,这里宽的意思是每层拥有更多的卷积核。这样做的优势是GPU更容易处理大的数据块而不是很多小的数据块。
五、Depthwise Separable Convolutions
在深入介绍这个方法之前,需要注意可分离卷积非常依赖不用框架的实现。Tensorflow貌似做了一些特定的优化,但是其他的比如Caffe,CNTK或者是Pytorch就不清楚了。
普通卷积是在所有channel上进行的,但是Depthwise则是在每一个channel上单独进行的,可以使用depth_multiplier来提高输出的通道数,或者使用pointwise来调整输出通道数