ShuffleNetV2

Abstract

现在很多的网络设计在计算复杂度方面都只考虑了非直接度量(比如FLOPs),而对于直接度量(如速度等)并不只是由FLOPs来决定的,包括MAC(内存访问消耗)和平台特性都对速度有一定的影响。本文意在特定平台下进行直接度量,比仅仅考虑FLOPs要更好,并且在基于一系列控制实验下提出了一些对于高效率网络的指导准则,根据这些准则提出了ShuffleNetV2这样一种新的网络结构,全面的ablation experiments表明该模型在性能和精度的权衡上达到了state-of-the-art。

1.Introduction

自从AlexNet在ImageNet上取得了很好的成绩之后,ImageNet上的分类准确度又被一些新型的神经网络进一步改善,比如VGG,GoogLeNet,ResNet,DenseNet,ResNeXt,SE-Net等,而且还有自动网络结构搜索。除了精度之外,计算复杂度也是另外一个需要考虑的因素,现实世界的应用通常会受到很多平台的限制,这促进了很多轻量级神经网络结构的设计,以及更好的速度-精度平衡,比如Xception,MobileNet,MobileNetV2,ShuffleNet和CondenseNet等。在这些工作里面,group conv和depth-wise conv是至关重要的。

为了评价计算复杂度,常用的评价标准就是FLOPs(在本文中的定义是mult-adds的数量),然而FLOPs只是一个近似的间接度量,而不是我们所关心的直接度量,例如速度,延迟等。这样的矛盾在最近的工作中已经被注意到了。比如MobileNetV2和NASNET-A有相近的FLOPs但是MobileNetV2的速度要快得多。下图说明模型有近似的FLOPs但是可能有不同的速度近似的FLOPs具有不同的速度,因此仅仅使用FLOPs作为度量是不够的,并且有可能导致次优设计。

在间接度量(FLOPs)和直接度量(速度)之间的矛盾主要来自于两个方面(度量和平台):一是很多关键的影响速度的因素没有考虑进来,比如MAC(memory access cost,group conv是其中一个重要的组成,对于GPU这样强大的运算单元来说这可能会变成其瓶颈),还有就是DOP(degree of parallelism,在同样的FLOPs下,高DOP的模型可能要比低DOP的模型快很多)。第二个原因就是对于平台的依赖,比如张量分解这样的操作,尽管能够减少75%的FLOPs,但是在分解后CPU上的运行速度甚至比GPU更慢,后来发现这是由于最近的CUDNN库对于3x3卷积有特殊的优化,不能简单地认为3x3 conv就比1x1 conv要慢9倍。

通过这些观察,发现在高效的神经网络设计中应该遵循两条原则,一是要使用直接度量而非间接度量,二是要在特定的平台上进行度量。基于这两条准则提出了更加有效的神经网络结构。在第二章中我们首先分析了两个代表性的state-of-the-art神经网络(ShuffleNetV1,MobileNetV2)的运行时性能,之后我们提出了高效网络设计的四条准则,比只考虑FLOPs更进一步。然而这些准则是平台独立的,我们进行了不同的控制实验来在两个平台上(GPU和ARM)验证它们(带有代码优化),来保证我们的结论是state-of-the-art。

在第三章节中设计了ShuffleNetV2,通过第四章完整的验证实验,证明其在两个平台上都比之前的网络要更加准确和快速。

2.Practical Guidelines for Efficient Network Design

本研究是基于两个带有工业级优化的CNN库的被广泛应用的硬件平台上进行。注意到我们的CNN库要比大多数开源库更加高效,因此我们的观察和结论是牢固的并且在工业上是有实践价值的。GPU(单个GTX1080TI,卷积库是CUDNN7.0,并且激活了CUDNN的benchmarking函数来对于不同的卷积选择最快的算法),ARM(高通骁龙810,基于Neon实现,利用单线程来进行验证),其他的一些设置:开启全优化(张量融合之类的),输入图片尺寸:224x224,所有网络进行随机初始化,并且评估100次取平均运行时间。

对于刚开始的研究我们选取MobileNetV2和ShuffleNetV1,尽管只有两个,但是这代表了最近的趋势,这两个网络的核心是group conv和depth-wise conv,这也同样是其他state-of-the-art网络的核心。整个运行时分解图如下:运行时间分解图,FLOPs只算了卷积部分,尽管其占了大部分时间,但是一些其他的内容比如:数据I/O,data shuffle和element-wise操作也占了很大一部分,因此FLOPs用作时间的估计是很不准确的。基于以上观察,我们对运行时间从几个方面进行了分析,并且得出了对于高效神经网络设计的一些实际经验。

G1.Equal channel width minimize memory access cost

很多现代网络都采用depth-wise conv,其中1x1卷积占了大部分复杂度,其FLOPs为B=hwc1c2B=hwc_1c_2,假设内存够大足够存储输入输出的特征和卷积核权重,MAC为MAC=hwc1+hwc2+c1c2MAC=hwc_1+hwc_2+c_1c_2,即为输入特征+输出特征+卷积核权重。通过均值不等式可以得到MAC2hwB+BhwMAC\ge 2\sqrt{hwB}+\frac{B}{hw},当c1=c2c_1=c_2时该不等式取等号,即当输出通道数等于输入通道数时MAC最小。当然这只是理论上的,利用重复堆积10个block来作为评价网络,通过调整通道数来使整个FLOPs保持不变,实际的实验结果如下:不同通道数的速度

G2.Excessive group convolution increase MAC

group conv是很多现代网络的核心,可以通过channel之间的稀疏连接来减少FLOPs,一方面可以在固定FLOPs下使用更多的channel,以此增加网络容量(从而改善精度),另一方面增加channel也会增加MAC。根据上一条里面的公式可以得到1x1 conv的FLOPs和MAC之间的关系为:MAC=hwc1+Bgc1+BhwMAC=hwc_1+\frac{Bg}{c_1}+\frac{B}{hw},其中g为组数,可以看到在h,w,c1,c2,B固定的情况下,增加g会增加MAC。通过堆积10个1x1 group conv来构造评价网络,结果证明一味选取很大的group数并不好,其带来的精度提升的好处可能会被增加的计算消耗所抵消掉。实验结果如下:不同组数之间的对比

G3.Network fragmentation reduces degree of parallelism

在GoogLeNet系列和自动生成结构系列,“多路径”结构在每个网络block被广泛应用,许多小操作(fragmented operators)在这里被应用,而不是少量的大操作。比如在NASNET-A中fragmented ops(比如某个block中单独的卷积/池化操作)是13,而在一些正则化结构中(比如ResNet)是2或3。这样的碎片结构已经表明对准确度有利,但是可能会降低效率因为这些操作对于一些高度并行计算的设备比如GPU很不友好。也会导致核的启动/同步等额外开销。为了对此影像进行量化,设计了实验block如下:DOP实验的网络,每个block重复10次。试验结果表明碎片化会明显降低了GPU上的速度,相对GPU,ARM上的速度降低更轻微一些。实验结果如图:网络碎片对速度的影响

G4.Element-wise operations are non-negligible

如之前的图片所示,element-wise操作(张量相加,bias,ReLU等)占据了相当的时间,尤其是在GPU上面,它们具有比较小的FLOPs但是具有较大的MAC,尤其是depthwise conv作为element-wise操作,因为其具有较大的MAC/FLOPs比率。在bottleneck结构上进行了实验,针对ReLU和shortcut:逐点操作的实验结果

Conclusion and Discussion

总结:1)应该使用尽量平衡的卷积(输入输出通道相等),2)了解group-conv的消耗,3)减少网络的碎片度,3)减少逐点操作。而且相比理论上而言,更应该考虑到网络在平台上的特性,并且应用在实际网络设计当中。之前的很多网络违背了这些规则,例如ShuffleNetV1太依赖group conv违背了G2,其瓶颈结构设计违背了G1,MobileNetV2的瓶颈设计违背了G1,在太厚的特征图上使用ReLU等违背了G4,自动生成的网络结构太过碎片化违背了G3。

3.ShuffleNet V2:an Efficient Architecture

轻量级网络设计的主要挑战是给定计算量下的有限的通道数。想在有限的FLOPs下增加通道数的办法有两个:1)pointwise group conv,2)瓶颈结构。之后又引出了channel shuffle这样的结构来增加不同channel的通讯。但是pointwise group conv和瓶颈结构都有违背之前的准则,现在的问题在于如何维持大量的平均匀分布的channel数,而不至于太密的卷积或者太多的组数。

对于以上的需求做了一些设计:刚开始就对channel进行分割,然后在1x1 conv中不再使用group,也不使用瓶颈结构,而是让输入输出channel相等,并且只在一个支路上进行ReLu和depthwise conv。最后进行concat和channel shuffle。并且将concat,channel shuffle,split合并成一个element-wise操作。与V1相同可以利用s来对网络进行缩放,通过改变通道数,另外在进行split的时候为了简单起见采用了对半分的方式。ShuffleNetV2 block的结构如下:ShuffleNetV1和V2的block对比

ShuffleNetV2很高效,因此可以具有更多的通道数和模型容量,另外特征的对半分可以看作一种feature reuse,类似于DenseNet和CondenseNet。DenseNet和ShuffleNetV2在feature reuse上面的模式对比如下图:feature reuse的模式对比ShuffleNetV2在feature reues上获取了和DenseNet同样的好处,却相比更加高效,后续的实验可以说明。

4.Experiment

实验所使用的超参数和协议与ShuffleNetV1完全相同,在这里先放上实验结果,后面再对实验进行总结:实验结果

Accuracy vs. FLOPs:ShuffleNetV2明显可以超过其他所有网络,但是在40MFLOPs,224x224图像尺寸的时候由于通道数太少表现也欠佳。该模型和DenseNet相比,都有reuse features,但是本模型更高效。

Inference Speed vs. FLOPs/Accuracy:MobileNetV2在小FLOPs的时候非常慢,可能是由于具有过高的MAC。尽管MobileNetV1在准确度上欠佳,但是其在GPU上的面的速度很快,已经超过了ShuffleNetV2,可能是其更加满足之前的设计准则,尤其是G3,MobileNetV1的fragments是比ShuffleNetV2还要更小的。另外,IGCV2和IGCV3都很慢,可能是由于使用了过多的group conv,然后这些现象都与我们的设计准则相符合。目前的自动搜索出的神经网络结构都比较慢,应该是具有较多的fragments,这违背了G3,不过这个研究方向仍然是充满前景的。在accuracy vs. speed这个方面,ShuffleNetV2在GPU和CPU两个平台上都是表现最好的。

Compatibility with other methods:将ShuffleNetV2和其他结构相结合的时候,比如SE(squeeze and excitation),分类准确率有所提升,应该说明了其良好的兼容性。

Generalization to Large :当ShuffleNetV2用作大模型的时候性能也很好,只不过在做得很深的时候为了加快收敛速度而增加了残差连接

Object Detection:在COCO数据集上来评估其泛化性能,使用state-of-the-art的轻量级检测器Light-Head RCNN来作为框架,在ImageNet上进行了训练然后在finetuned用作检测任务。后来发现Xception比较擅长检测任务,可能是由于block更大的接受域,收到这个的启发,我们在第一个1x1 conv之前加入了3x3的depthwise conv,最后在增加了一点FLOPs的情况下更好的改善了性能。另外在检测任务下,不同模型之间的速度差要小于分类任务(除去数据拷贝的开销和检测特有的开销)。ShuffleNetV2*有最好的精度并且比其它方法都要快,这启发出了另一个实际问题:如何让增加接受域的大小,这在高分辨率图像的目标检测中是至关重要的。

5.Conclusion

网络设计应该考虑直接度量而非间接度量,提供了结构设计的有效准则和一种高效的神经网络ShuffleNetV2,全面的实验充分证明了模型的有效性,希望这项工作能引出对于平台相关而且更加实际的网络设计。