在移动端高效的模型设计中,卷积拆分和分组几乎是不可缺少的思想,那么它们究竟是如何高效,本身又有哪些发展呢。
1 什么是卷积拆分
一个多通道的普通2D卷积包含了三个维度,分别是通道,长,宽,如下图(a)。
然后将这个卷积的步骤分解为3个独立的方向[1],即通道方向,X方向和Y方向,如上图(b),则具有更低的计算量和参数量。
假如X是卷积核宽度,Y是卷积核高度,C是输入通道数,如果是正常的卷积,那么输出一个通道,需要的参数量是XYC,经过上图的分解后,参数量变为X+Y+C,一般来说C>>X和Y,所以分解后的参数对比之前的参数约为1/(XY)。
对于3×3的卷积,相当于参数量降低一个数量级,计算量也是相当,可见这是很高效的操作。
当然,还可以只分解其中的某些维度,比如在Inception V3的网络结构中,就将7×7的卷积拆分为1×7和7×1两个方向。从另一个角度来看,这还提升了网络的深度。
2 什么是通道分组
2.1 分组卷积的来源
标准的卷积是使用多个卷积核在输入的所有通道上分别卷积提取特征,而分组卷积,就是将通道进行分组,组与组之间相关不影响,各自得到输出。
通道分组的思想来自于Laurent Sifre在Google实习的时候提出的separable convolution,相关的内部报告可以参考YouTube视频https://www.youtube.com/watch?v=VhLe-u0M1a8,具体的实现在它的博士论文[2]中,如下示意图。
对于平移,旋转等刚体运动来说,它们可以被拆分成不同的维度,因此使用上面的separable convolution,实现起来也很简单,就是先进行通道的分组,这在AlexNet网络中还被当作一个训练技巧。
2.2 从Xception到MobileNet
随着Google的Inception网络提出,这一个相对于VGG更加高效的网络也开始进化。到了Inception V2的时候,已经用上了上面的思想。
上面就是一个与Inception Module类似的模块,只是每一个通道完全一样,这就可以等价于通道分组了。
假如分组的个数与输入通道数相等,Inception便成为了极致的inception(extreme inception,简称Xception[3])。
首先经过1×1卷积,然后通道分组进行卷积,这样的一个结构随Tensorflow的流行而流行,名为Depthwise Separable Convolution。
随后Google的研究人员提出了MobileNets[4]结构,使用了Depthwise Separable Convolution模块进行堆叠,与Xception中的不同是1×1卷积放置在分组卷积之后。因为有许多这样的模块进行堆叠,所以两者其实是等价的。
画成二维图,示意图如下:
画成三维图,示意图如下:
使用Netscope可视化MobileNet的网络如下,当我们看到这个28层的网络,又经历了残差网络的洗礼后,顿时有种返璞归真的感觉。
2.3 分组卷积性能如何
令输入blob大小为M×Dk×Dk,输出为N×Dj×Dj,则标准卷积计算量为M×Dk×Dk×N×Dj×Dj,而转换为Depthwise卷积加Pointwise卷积,Depthwise卷积计算量为M×Dk×Dk×Dj×Dj,Pointwise卷积计算量为M×N×Dj×Dj,计算量对比为:(M×Dk×Dk×Dj×Dj+M×N×Dj×Dj)/M×Dk×Dk×N×Dj×Dj= 1/N+1/(Dk×Dk),由于网络中大量地使用3×3的卷积核,当N比较大时,上面卷积计算量约为普通卷积的1/9,从而降低了一个数量级的计算量。
性能上也没有让我们失望,在只有VGG16不到1/32的参数量和1/27的计算量的同时还能取得与之相当的性能。
关于更多细节的解读和实验对比,此处就不再做介绍了,可以阅读以前的一篇文章。
2.4 分组卷积性能的进一步提升
对于MobileNet这样的网络结构,还可以从两个方向进行提升,第一个是增加分组的信息交流,第二个是更加智能的分组。
简单的分组使得不同通道之间没有交流,可能会导致信息的丢失,Shufflenet[5]重新增加了通道的信息交换。具体来说,对于上一层输出的通道,先做一个Shuffle操作,再分成几个组进入到下一层,示意图如下:
另一方面,MobileNet的分组是固定,ShuffleNet中的通道的打乱也是一个确定的映射,那是不是可以基于数据来学习到更加合适的分组呢?Condensenets[6]给出了确定的回答。
更多的解读,我们已经放在了知识星球中,感兴趣的可以关注。
3 分组卷积结构的发展
ResNet虽然不是残差连接的发明者,但使得这一思想为众人痴狂。MobileNet也不是分组卷积的发明者,但同样是它使分组的思想深入人心,原来这样的网络结构不仅不降低准确率,还能大幅度提升计算效率,尤其适合硬件并行。
自此,分组的思想被不断拓展研究,下面我们主要考虑分组的各个通道存在较大差异的研究。
3.1 多分辨率卷积核通道分组网络
这一类网络以SqueezeNet[7]为代表,它以卷积层conv1开始,接着是8个Fire modules,最后以卷积层conv10结束。
一个fire module的子结构下图,包含一个squeeze模块加上一个expand模块。Squeeze模块使用1×1卷积进行通道降维,expand模块使用1×1卷积和3×3卷积用于通道升维。
Squeezenet的压缩比率是惊人的,只有AlexNet 1/50的参数量,能达到相当的性能。
3.2 多尺度通道分组网络
这一类结构采用不同的尺度对信息进行处理,对于分辨率大的分支,使用更少的卷积通道,对于分辨率小的分支,使用更多的卷积通道,以Big-Little Net[8]为代表,K个分支,尺度分别为1/2^(K-1),如下图结构。
当然,如果两个通道在中间的计算过程中还存在信息的交流,则可以获得更高的性能,比如Octave Convolution[9]。
卷积核通过因子被分为了高分辨率和低分辨率两部分,低分辨率具有较多的通道,被称为低频分量。高分辨率具有较少的通道,被称为高频分量,两者各自学习,并且进行信息的融合。高分辨率通道通过池化与低分辨率通道融合,低分辨率通过上采样与高分辨率通道融合。最终在22.2GFLOPS的计算量下,ImageNet Top-1的精度达到了82.9%。
3.3 多精度通道分组网络
除了还分辨率和卷积核上做文章,还可以在计算精度上做文章,这一类结构以DSConv[10]为代表,它将卷积核分为两部分,一部分是整数分量VQK,一部分是分数分量KDS,如下图:
VQK(Variable Quantizes Kernel)只有整数值,不可训练,它的权重值从预训练模型中计算而来。KDS(kernel distribution shifter)是浮点数,包含一个kernel级别的偏移量,一个channel级别的偏移量。
这一个模型在ResNet50和ResNet34,AlexNet,MobileNet等基准模型上取得了14x参数量的压缩,10x速度的提升。
除了上面这些思路外,还有很多可以做的空间,大家可以去多实验写论文填坑,有三就帮到这里了。
参考文献
[1] Jin J, Dundar A, Culurciello E. Flattened convolutional neural networks for feedforward acceleration[J]. arXiv preprint arXiv:1412.5474, 2014.
[2] Sifre L , Mallat, Stéphane. Rigid-Motion Scattering for Texture Classification[J]. Computer Science, 2014.
[3] Chollet F. Xception: Deep Learning with Depthwise Separable Convolutions[J]. computer vision and pattern recognition, 2017: 1800-1807.
[4] Howard A G, Zhu M, Chen B, et al. Mobilenets: Efficient convolutional neural networks for mobile vision applications[J]. arXiv preprint arXiv:1704.04861, 2017.
[5] Zhang X, Zhou X, Lin M, et al. Shufflenet: An extremely efficient convolutional neural network for mobile devices[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2018: 6848-6856.
[6] Huang G, Liu S, Van der Maaten L, et al. Condensenet: An efficient densenet using learned group convolutions[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2018: 2752-2761.
[7] Iandola F N, Han S, Moskewicz M W, et al. SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and< 0.5 MB model size[J]. arXiv preprint arXiv:1602.07360, 2016.
[8] Chen C F, Fan Q, Mallinar N, et al. Big-little net: An efficient multi-scale feature representation for visual and speech recognition[J]. arXiv preprint arXiv:1807.03848, 2018.
[9] Chen Y, Fang H, Xu B, et al. Drop an octave: Reducing spatial redundancy in convolutional neural networks with octave convolution[J]. arXiv preprint arXiv:1904.05049, 2019.
[10] Gennari M, Fawcett R, Prisacariu V A. DSConv: Efficient Convolution Operator[J]. arXiv preprint arXiv:1901.01928, 2019.
总结
分组卷积之所有有效,一个是因为网络中的空间和通道的冗余计算使得其性能可以保持,而简单的分组并行计算又非常适合于GPU等处理器,因此在移动端高效率模型中广泛使用,是必须掌握的思想。