【AI不惑境】移动端高效网络,卷积拆分和分组的精髓

大家好,这是专栏《AI不惑境》的第六篇文章,讲述卷积拆分和分组卷积的精髓。

进入到不惑境界,就是向高手迈进的开始了,在这个境界需要自己独立思考。如果说学习是一个从模仿,到追随,到创造的过程,那么到这个阶段,应该跃过了模仿和追随的阶段,进入了创造的阶段。从这个境界开始,讲述的问题可能不再有答案,更多的是激发大家一起来思考。

作者&编辑 | 言有三

在移动端高效的模型设计中,卷积拆分和分组几乎是不可缺少的思想,那么它们究竟是如何高效,本身又有哪些发展呢。

 

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的计算量的同时还能取得与之相当的性能。

 

关于更多细节的解读和实验对比,此处就不再做介绍了,可以阅读以前的一篇文章。

【模型解读】说说移动端基准模型MobileNets

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等处理器,因此在移动端高效率模型中广泛使用,是必须掌握的思想。

下期预告:深度学习中的尺度。

AI白身境系列完整阅读:

第一期:【AI白身境】深度学习从弃用windows开始

第二期:【AI白身境】Linux干活三板斧,shell、vim和git

第三期:【AI白身境】学AI必备的python基础

第四期:【AI白身境】深度学习必备图像基础

第五期:【AI白身境】搞计算机视觉必备的OpenCV入门基础

第六期:【AI白身境】只会用Python?g++,CMake和Makefile了解一下

第七期:【AI白身境】学深度学习你不得不知的爬虫基础

第八期: 【AI白身境】深度学习中的数据可视化

第九期:【AI白身境】入行AI需要什么数学基础:左手矩阵论,右手微积分

第十期:【AI白身境】一文览尽计算机视觉研究方向

第十一期:【AI白身境】AI+,都加在哪些应用领域了

第十二期:【AI白身境】究竟谁是paper之王,全球前10的计算机科学家

AI初识境系列完整阅读

第一期:【AI初识境】从3次人工智能潮起潮落说起

第二期:【AI初识境】从头理解神经网络-内行与外行的分水岭

第三期:【AI初识境】近20年深度学习在图像领域的重要进展节点

第四期:【AI初识境】激活函数:从人工设计到自动搜索

第五期:【AI初识境】什么是深度学习成功的开始?参数初始化

第六期:【AI初识境】深度学习模型中的Normalization,你懂了多少?

第七期:【AI初识境】为了围剿SGD大家这些年想过的那十几招

第八期:【AI初识境】被Hinton,DeepMind和斯坦福嫌弃的池化,到底是什么?

第九期:【AI初识境】如何增加深度学习模型的泛化能力

第十期:【AI初识境】深度学习模型评估,从图像分类到生成模型

第十一期:【AI初识境】深度学习中常用的损失函数有哪些?

第十二期:【AI初识境】给深度学习新手开始项目时的10条建议

AI不惑境系列完整阅读:

第一期:【AI不惑境】数据压榨有多狠,人工智能就有多成功

第二期:【AI不惑境】网络深度对深度学习模型性能有什么影响?

第三期:【AI不惑境】网络的宽度如何影响深度学习模型的性能?

第四期:【AI不惑境】学习率和batchsize如何影响模型的性能?

第五期:【AI不惑境】残差网络的前世今生与原理

第六期:【AI不惑境】移动端高效网络,卷积拆分和分组的精髓

感谢各位看官的耐心阅读,不足之处希望多多指教。后续内容将会不定期奉上,欢迎大家关注有三公众号 有三AI

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

言有三

三人行必有AI

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值