论文:https://arxiv.org/abs/1807.11164
目前,神经网络架构设计主要由计算复杂度的间接度量(FLOP — 乘加数)引导。然而,直接度量(例如,速度)还取决于诸如存储器访问成本和平台特性等其他因素。因此,本文评估目标平台上的直接度量,而不仅仅考虑FLOP。基于一系列对照实验,本文为有效的网络设计提供了几个实用指南。因此,提出了一种称为ShuffleNet V2的新架构。全面的对比实验验证了我们的模型在速度和准确性权衡方面是最先进的。
深度卷积神经网络(CNN)的体系结构已经发展了多年,变得更加准确和快速。自AlexNet的里程碑工作以来,ImageNet分类的准确性通过使用新的结构的得到了显著改善,包括VGG,GoogLeNet,ResNet,DenseNet,ResNeXt ,SE-Net和自动架构搜索[9,10,11],仅举几例。
除了准确性,计算复杂性是另一个重要考虑因素。现实世界任务通常旨在由目标平台(例如,硬件)和应用场景(例如,自动驾驶需要低延迟时间)给出的有限计算资源下获得最佳准确度。这激发了一系列针对轻量级架构设计和更好的速度 - 准确性权衡的工作,包括Xception,MobileNet,MobileNet V2 ,ShuffleNet和CondenseNet。组卷积和深度分离卷积在这些工作中至关重要。
为了测量计算复杂性,广泛使用的度量是浮点运算或FLOP的数量。但是,FLOP是间接指标。它是我们真正关心的直接度量 — 例如速度或延迟的近似值,但通常不等同。前面有的论文也注意到了间接度量和直接度量的不同。例如,MobileNet v2比NASNET-A [9]快得多,但它们具有可比较的FLOP。图1(c)(d)进一步简化了这种现象,表明具有相似FLOP的网络具有不同的速度。因此,使用FLOP作为计算复杂性的唯一度量是不够的,并且可能导致次优设计。
间接(FLOP)和直接(速度)指标之间的差异可归因于两个主要原因。首先,FLOP没有考虑几个对速度有相当大影响的重要因素。一个因素是存储器访问成本(MAC)。在诸如组卷积的某些操作中,这种成本占运行时的很大一部分。它可能是具有强大计算能力的设备(例如GPU)的瓶颈。在网络架构设计期间,不应忽略此成本。另一个是并行化程度。在相同的FLOP下,具有高并行度的模型可能比具有低并行度的模型快得多。
其次,具体取决于部署平台,具有相同FLOP的操作可能具有不同的运行时间。例如,张量分解广泛用于早期工作[20,21,22]以加速矩阵乘法。然而,最近的工作[19]发现[22]中的分解在GPU上甚至更慢,尽管它将FLOP降低了75%。我们调查了这个问题并发现这是因为最新的CUDNN [23]库专门针对3×3卷积而优化。我们不能想当然的认为3×3卷积比1×1卷积慢9倍。
通过这些观察,我们建议应该考虑两个原则来进行有效的网络架构设计。首先,应该使用直接度量(例如,速度)而不是间接度量(例如,FLOP)。其次,应在目标平台上评估此类指标。
在这项工作中,我们遵循这两个原则,并提出一个更有效的网络架构。在第2节中,我们首先分析了两个具有代表性的最先进网络ShuffleNet V1和MobileNet V2的运行时性能。然后,我们推出了四个有效网络设计指南,这些指南不仅仅考虑了FLOP。虽然这些指南与平台无关,但我们会执行一系列受控实验,以便在两个不同平台(GPU和ARM)上通过专用代码优化对其进行验证,从而确保我们的结论是最先进的。
在第3节中,根据指南,我们设计了一个新的网络结构。由于受到ShuffleNet V1的启发,它被称为ShuffleNet V2。通过第4节中的综合验证实验证明,它比以前的网络在两个平台上都更快,更准确。图1(a)(b)给出了比较的概述。例如,考虑到40M FLOP的计算复杂度预算,ShuffleNet v2分别比ShuffleNet v1和MobileNet v2精确3.5%和3.7%。
我们的研究是在两个广泛采用的硬件上进行的,为CNN库进行工业级优化。我们注意到我们的CNN库比大多数开源库更高效。因此,我们确保我们的观察和结论对于工业实践具有可靠性和重要性。
其他设置包括:打开完全优化选项(例如张量融合 — 用于减少小操作的开销)。输入图像大小为224×224。每个网络随机初始化并评估100次。使用平均运行时间。为了开始我们的研究,我们分析了两个最先进的网络,ShuffleNet v1和MobileNet v2的运行时性能。它们在ImageNet分类任务上都非常高效和准确。它们广泛用于移动设备等低端设备。虽然我们只分析这两个网络,但我们注意到它们代表了当前的趋势。其核心是组卷积和深度卷积,它们也是其他最先进网络的关键组件,如ResNeXt,Xception ,MobileNet 和CondenseNet 。
整个运行时间被分解为不同的操作,如图2所示。我们注意到FLOPs度量仅考虑卷积部分。虽然这部分消耗的时间最多,但其他操作包括数据I / O,数据混洗和逐元素操作(AddTensor,ReLU等)也占用了相当多的时间。因此,FLOP对实际运行时间的估计不够准确。
基于这一观察,我们从几个不同方面对运行时间(或速度)进行了详细分析,并为有效的网络架构设计推导出一些实用指南。
回顾下ShuffleNet v1。 ShuffleNet是一种先进的网络架构,它广泛应用于移动设备等低端设备,它激发了我们的工作。因此,首先对其进行审查和分析。
根据ShuffleNet v1所述,轻量级网络面临的主要挑战是,在给定的计算预算(FLOP)下,只能使用有限数量的特征信道。为了在不显着增加FLOP的情况下增加通道数,在ShuffleNet v1中采用了两种技术:逐点组卷积和瓶颈状结构。然后引入“channel shuffle”操作以实现不同信道组之间的信息通信并提高准确性。构建块如图3(a)(b)所示。
如第2节所述,逐点组卷积和瓶颈结构都会增加MAC(G1和G2)。这个成本是不可忽视的,特别是对于轻量级的模型。此外,使用太多组违反了G3。在直连通道中进行逐元素相加的操作也是不合需要的(G4)。因此,为了实现高模型容量和效率,关键问题是如何保持大量且同样宽的信道,既没有密集卷积也没有太多组。
Channel Spilt 和 ShuffleNet V2:为了达到上述目的,我们引入了一个名为channel split的简单运算符。如图3(c)所示。在每个单元的开始处,c个特征通道的输入被分成两个分支,分别具有 c − c ′ c-c^{'} c−c′和 c ′ c^{'} c′个通道。按照G3,一个分支是恒等函数。另一个分支由三个卷积组成,这三个卷积具有相同的输入和输出通道以满足G1。不同于ShuffleNet V1,两个1×1的卷积不再是分组的了。这部分是为了遵循G2,部分原因是拆分操作已经产生了两个组。
卷积后,两个分支连接在一起。因此,通道数保持不变(G1)。然后使用与ShuffleNet V1中相同的“channel shuffle“操作来实现两个分支之间的信息通信。
shuffle后,进入了下一个网络块。请注意,ShuffleNet v1中的“Add“操作不再存在。ReLU和depthwise convolutions等元素操作仅存在于一个分支中。此外,三个连续的元素操作,”Concat“,“Channel Shuffle”和”Channel Split“,合并为单个逐元素操作。根据G4,这些更改是有益的。
对于空间下采样,该单元稍作修改,如图3(d)所示。删除了通道拆分运算符。因此,输出通道的数量加倍。
建议的构建块(c)(d)以及由此产生的网络称为ShuffleNet V2。基于上述分析,我们得出结论,该架构设计高效,因为它遵循所有准则。
重复堆叠构建块以构建整个网络。为简单起见,我们设置 c ′ = c / 2 c^{'} = c/2 c′=c/2。整体网络结构类似于ShuffleNet v1,并总结在表5中。只有一个区别:在全局平均池化之前添加额外的1×1卷积层以混合特征,这在ShuffleNet v1中是不存在的。与ShuffleNet v1类似,缩放每个块中的通道数以生成不同复杂度的网络,标记为0.5×,1×等。
网络准确率分析:ShuffleNet v2不仅高效,而且准确。主要有两个原因。首先,每个构建块的高效率使得能够使用更多的特征信道和更大的网络容量。
其次,在每个块中,一半的特征通道(当 c ′ = c / 2 c^{'} = c/2 c′=c/2时)直接通过该块并入下一个块。这可以被视为一种特征重用,与DenseNet和CondenseNet类似。
在DenseNet中,为了分析特征重用模式,绘制了层间权重的l1范数,如图4(a)所示。很明显,相邻层之间的连接比其他层更强。这意味着所有层之间的密集连接可能引入冗余。最近的CondenseNet也支持这一观点。
在ShuffleNet V2中,很容易证明第 i i i个和第 ( i + j ) (i + j) (i+j)个构建块之间的直接连接的“通道”的数量是 r j c r^jc rjc,其中 r = 1 − c ′ / c r =1-c^{'}/c r=1−c′/c(这里不应该有括号吧)。换句话说,特征重用量随着两个块之间的距离增大而呈指数级衰减。在远程块之间,特征重用变得更弱。对于r = 0.5,图4(b)绘制了与(a)中类似的可视化图。注意(b)中的模式类似于(a)。
因此,ShuffleNet V2的结构设计实现了这种类型的特征重用模式。与DenseNet一样,它具有高精度特征重用的类似优点,但如前所述,它的效率更高。这在实验中得到验证,见表8。
我们的对比实验在ImageNet 2012分类数据集上执行。按照惯例,相比之下,所有网络都有四个级别的计算复杂度,即大约40,140,300和500+ MFLOPs。这种复杂性是移动场景的典型值。其他超参数和协议与ShuffleNet v1完全相同。
我们将与以下网络架构进行比较:
表8总结了所有结果。我们从不同方面分析这些结果。
准确率 vs. FLOPs:很明显,所提出的ShuffleNet v2模型在很大的范围内表现优于所有其他网络,特别是在较小的计算预算下。此外,我们注意到MobileNet v2使用224×224大小的图像在40 MFLOP级别上效果很差,这可能是由于频道太少造成的。相比之下,我们的模型没有这个缺点,因为我们的高效设计允许使用更多的通道。此外,虽然我们的模型和DenseNet都重用了特征,但我们的模型效率更高,如第3节所述。
表8还将我们的模型与其他最先进的网络进行了比较,包括CondenseNet ,IGCV2和IGCV3。我们的模型在各种复杂程度上表现更好。
推理速度 vs. FLOPs/Accuracy:对于四个具有良好准确性的架构,ShuffleNet v2,MobileNet v2,ShuffleNet v1和Xception,我们将它们的实际速度与FLOP进行比较,如图1(c)(d)所示。附录表1提供了有关不同分辨率的更多结果。
例如,在500MFLOPs时,ShuffleNet v2比MobileNet v2快58%,比ShuffleNet v1快63%,比Xception快25%。在ARM上,ShuffleNet v1,Xception和ShuffleNet v2的速度相当;但是,MobileNet v2要慢得多,特别是在较小的FLOP上。我们认为这是因为MobileNet v2具有更高的MAC(参见第2节中的G1和G4),这在移动设备上非常重要。
与MobileNet v1,IGCV2和IGCV3相比,我们有两个观察结果。首先,尽管MobileNet v1的准确性不是很好,但它在GPU上的速度要快于所有同类产品,包括ShuffleNet v2。我们认为这是因为它的结构满足了大多数提议的指南(例如,对于G3,MobileNet v1的片段甚至比ShuffleNet v2更少)。其次,IGCV2和IGCV3很慢。这是由于使用了太多的卷积组([27,28]中的4或8)。两项意见均与我们提出的指引一致。
最近,自动模型搜索[9,10,11,35,36,37]已成为CNN架构设计的一种有前途的趋势。表8中的底部评估了一些自动生成的模型。我们发现它们的速度相对较慢。我们认为这主要是由于使用了太多碎片(见G3)。尽管如此,这一研究方向仍然很有希望。例如,如果模型搜索算法与我们提出的指南相结合,并且在目标平台上评估直接度量(速度),则可以获得更好的模型。
最后,图1(a)(b)总结了精确度与速度的结果,即直接度量。我们得出结论,ShuffeNet v2在GPU和ARM上都是最好的。
和其他模型比较:ShuffeNet v2可与其他技术相结合,进一步提升性能。当配备Squeezeand-excitation(SE)模块时,ShuffleNet v2的分类精度提高了0.5%,但代价是速度有一定的损失。块结构如附录图2(b)所示。结果显示在表8中(底部)。
泛化到大的模型:尽管我们的主要对比实验是针对轻量级情况进行的,但ShuffleNet v2可用于大型模型(例如,FLOP≥2G)。表6比较了50层ShuffleNet v2(附录中的详细信息)与ShuffleNet v1和ResNet-50的对应部分。 ShuffleNet v2在2.3GFLOPs上仍然优于ShuffleNet v1,超过ResNet-50,FLOP减少40%。
对于非常深的ShuffleNet v2(例如超过100层),为了使训练更快收敛,我们通过添加残差路径稍微修改基本的ShuffleNet v2单元(详见附录)。表6显示了一个配有SE [8]组件的164层ShuffleNet v2模型(详见附录)。与先前最先进的模型相比,它获得了更高的精度[8],FLOP更少。
目标检测:为了评估泛化能力,我们还测试了COCO对象检测[38]任务。我们使用最先进的轻量级探测器Light-Head RCNN作为我们的框架并遵循相同的训练和测试协议。只有骨干网被我们的网络替换。模型在ImageNet上预先训练,然后在检测任务上进行微调。对于训练,我们使用COCO中的train + val进行训练,除了来自minival的5000张图像,并使用minival集进行测试。精度度量是COCO标准mmAP,即检测框的IoU阈值从0.5到0.95的平均mAP。
将ShuffleNet v2与其他三种轻量级模型进行比较:Xception,ShuffleNet v1 和MobileNet v2,分为四个复杂程度。表7中的结果表明ShuffleNet v2表现最佳。
将检测结果(表7)与分类结果(表8)进行比较,有趣的是,在分类上,准确度等级为ShuffleNetv2≥MobileNetv2> ShuffeNet v1> Xception,而在检测时,等级变为ShuffleNet v2>Xception≥ShuffleNet v1≥MobileNetv2。这表明Xception在检测任务方面很有用。这可能是由于Xception构建块的感受域比其他对比算法(7对3)更大。受此启发,*我们还通过在每个构建块中的第一个逐点卷积之前引入额外的3×3深度卷积来扩大ShuffleNet v2的感受野。该变体表示为ShuffleNet v2 。只需几个额外的FLOP,它进一步提高了准确性。
我们还在GPU上对运行时间进行基准测试。为了公平比较,批量大小设置为4以确保完全利用GPU。由于数据复制的开销(分辨率高达800×1200)和其他特定检测操作(如PSRoI Pooling),不同算法之间的速度差距小于分类的速度差距。尽管如此,ShuffleNet v2仍然胜过其他人,例如比ShuffleNet v1快40%左右,比MobileNet v2快16%。
此外,变体ShuffleNet v2 *具有最佳精度,并且仍然比其他方法更快。这激发了一个实际问题:如何增加感受野的大小,这对于高分辨率图像中的目标检测至关重要。我们将来会研究这个话题。
我们建议网络架构设计应考虑直接度量,如速度,而不是像FLOP那样的间接度量。我们提出实用指南和新颖的架构,ShuffleNet v2。综合实验验证了我们新模型的有效性。我们希望这项工作能够激发未来的平台意识和更实用的网络架构设计工作。
本文通过理论分析和实验验证,推翻了ShuffleNet V1,MobileNet V1 V2,Xception中的很多重要结论。厉害厉害