ShuffleNet:An Extremely Efficient Convolutional Neural Network for Mobile Devices一种非常有效的移动设备卷积神经网络
小组成员:吴坤帅,薄雨蒙,黄麟舒,田磊
1. 简介
近年来关于卷积模型的研究层出不穷,产生了如VGG、ResNet、Xception和ResNeXt等性能优异的网络结构,在多个视觉任务上超过了人类水平。现在的CNNs模型已经具有很高的精度了,最精确的CNN往往需要几百层和几千个信道,因此需要billion级的FLOPS计算量,显然这就限制了此类模型只能用于高性能的服务器集群,需要一个更大体积的计算设备来完成,而对于很多移动端应用无能为力。。当我们需要在诸如手机、无人机或机器人等移动设备上进行神经卷积操作时,无法应用这类型的模型。因此我们需要一个在能满足足够的精确计算得同时具有较小体积的模型。
解决这一难题的方法之一是设计更为轻量级的模型结构。ShuffleNet 效率极高的CNN架构,专门应用于计算能力受限的移动设备上。这个新的架构利用两个新的操作:逐点的群卷积和信道混洗。这两个操作可以有效地降低计算消耗,同时又能保证一定的精确度。群卷积操作可以减少由于1x1卷积引入的计算复杂度,信道混洗可以促进信息在信道的流动来减少群卷积引入的副作用。这样我们就可以通过使用更少的信道,获得尽量多的编码信息。
在Imagenet分类和MSCOCO上做的实验证明了ShuffleNet 具有良好的效果,在基于ARM结构的移动设备上,ShuffleNet在保证计算精确度的同时能达到比AlexNet具有更高的速度。着可以证明,ShuffleNet在小型设备上的可用性。
2.理论基础
2.1群卷积操作
现代的神经卷积网络通常包括了许多重复的模块。比如最先进的Xception和ResNeXt引入了有效的逐深度卷积的方式或是群卷积方式,在表达能力和计算复杂度中找到折中。但这两种方法都存在一个缺点,他们没有充分优化计算中的1x1逐点卷积(逐点卷积需要很大的复杂度)。例如,对于RexNeXt中的每个残余单元,逐点卷积占用了93.4%的乘法和加法(multilplication-adds)(基数为32)。在小型网络中,逐点卷积占据了许多信道,结果我们在使用信道去做其他计算时捉襟见肘,降低计算的精确度。
解决这个问题,最直接的方式是应用信道稀疏连接(channel sparse connections),比如也对1x1的层也做群卷积。通过确定每个卷积操作仅发生在相应的输入信道组上,群卷积有效地减少了计算量。然而这样会带来一个新的问题,如果多个群卷积堆叠到一起,产生了副作用:信道的输出仅由较少的输入信息决定,如图1(a)中所示,两个栈道进行群卷积,可以看到,一个信道的输出只与该组输入有关。这回阻断信道之间的信息流动,降低信息的表达能力。
要解决这个问题,就要让信息在不同栈道之间流动起来。我们允许群卷积从不同的组中得到输入信息,输入和输出的各信道将会紧密相关。如图(b)所示。我们将进行过一次卷积后得到的特征划分成一些小的子组,然后在下一个层的各组中填充这些不同的子组。如同我们在图中看到的,栈道的输出信号将于各个输入栈道相关。这个操作对于两个卷积层有不同数量的组的情况也有效。另外,通道卷积也是可导的,这意味着它可以被嵌入到端到端训练(end to end training)的网络结构中。
我们可以使用信道混洗来实现与(b)一致的功能,如图(c)所示。我们要做的是将第一次输出的信息,分成几个小组,并分别分配到下一层的输入。这样第二层的输入就同时包含来自上一层的不同组的信息。
具体的混洗操作如下图所示。假设一个卷积层有g个组,每组分成n信道。我们将输入的栈道reshape成(g,n)维的矩阵,然后转置,再重新分配作为输出。
2.2.ShuffleNet单元
针对信道混洗,我们专门建立了小型的ShuffleNet单元。如图(3)所示。
1).a中的是一个残差模块。对于其中的3x3卷积,我们使用逐深度卷积。剩下的两个1x1卷积中,我们把第一个卷积替换成逐点群卷积,并对输出信号进行信道混洗。
2).b中是我们建立的ShuffleNet单元。我们把第二次1x1点卷积也替换群卷积,目的是匹配灰度通道的维度。我们不需要在第二个逐点卷积层后使用额外的信道混洗操作。
3).c中,我们在支线上添加了步长为2的3x3均值池化,并且用信道串联替代了元素相加操作,这样可以在只付出一点额外计算量的代价下扩大信道的维度。
由于使用通道洗牌和逐点群卷积,ShuffleNet中的所有部件可以被有效地计算出来。在相同设置下,这个模型比ResNet和ResNeXt的复杂度低。比如,给定输入尺寸c x h x w,瓶颈通道m,卷积组数目为g,各模型需要的计算量分别为:
也就是说,对于给定的计算量限制,ShuffleNet可以使用更广的特征谱。另外,在ShuffleNet中逐深度卷积只使用在瓶颈特征谱上。虽然逐深度卷积通常有很低的理论复杂度,它在低功耗的移动设备上很难实现,可能会导致与其它密集操作相比很差的计算复杂度。在ShuffleNet单元中,我们只在瓶颈单元处使用逐深度卷积
3.实验
实验的设置大多与ResNet相关实验相同,区别在于(1).权重衰减降低到了4e-5;(2).数据增强只使用了微量的aggressive scale augmentation。之所以做出这样的改变是因为在小型网络中欠拟合问题比较突出。
4. 实验结果
4.1 群卷积的影响
作者对于计算复杂度为140MFLOPs 、 40MFLOPs、13MFLOPs的ShuffleNet模型,在控制模型复杂度的同时对比了分组化逐点卷积的组数在1~8时分别对于性能的影响。复杂度一致的情况下,改变组数来改变输出的信道数量。结果如表1。从表1中看出,带有分组(g>1)的网络比不带分组(g=1)的网络错误率低。错误率首先随着组数的提高下降这显示了群卷积将获得更多的信息。对于较小的网络,较大的分组会得到更好的结果,组数增加时,每个卷积滤波器的输入通道越来越窄,模型将会丢失一部分信息,较宽的通道对于小网络尤为重要。所以移除了网络第三阶段的两个结构单元,将节省下来的运算量用来增加网络宽度后,网络性能进一步提高。
4.2 混洗的影响
有没有进行混洗显然会对错误率造成影响。表2显示了模型在有/无混洗的情况下的错误率区别。可以看到第一次群卷积后进行信道混洗可以有效的减少错误率。
4.3 与其他模型的比较
对比其他的模型,包括VGG,ResNet,GoogleNet,ResNeXt和Xception,发现ShuffleNet在兼顾计算准确度和复杂度方面有着最好的表现。
5. 总结
ShuffleNet的整体网络结构设计延续了ResNeXt的设计思路,主要的差异之处在于,ShuffleNet将瓶颈中的1*1点卷积换成了群卷积。因为实际1x1点卷积也占据了很大一部分计算量,原本的3x3群卷积用最极端的深度卷积代替。为了解决逐点群卷积造成的上一层群卷积中特定的一些信息只作用于下一层一部分。群卷积带来的弱表达问题,把上一层不同群卷积得到的特征做了一个信道混洗,来保证信息在不同信道之间的流动。
ShuffleNet的实验结果优于MobileNet,相比MobileNet提高了准确率,突显了分组卷积在运算效率上的优势,特别是用在小模型上。
总体来说,ShuffleNet通过引进了信道混洗解决了分组卷积的信道相关问题,并且也验证了其有效性。ShuffleNet具有着理论创新性和实用性。在理论上,ShuffleNet用了一种轻量级的方法结局了传统意义上AlexNet原有的分组并行信息交互问题,而且ShuffleNet的网络效率很高,适合体积小的嵌入式产品。但是现有的CPU对信道混洗也很难支持上,毕竟破坏了数据存储的连续性后,SIMD的发挥差强人意,需要在实现上再下一点功夫。
参考文献:
[1].Zhang X, Zhou X, Lin M, et al. ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices[J]. 2017.