论文:https://arxiv.org/abs/1807.11164
1 摘要
目前,神经网络架构设计主要由计算复杂度的间接度量(FLOP — 乘加数)衡量。然而,直接度量(例如,速度)还取决于诸如存储访问量和硬件平台特性等其他因素。因此,本文评估目标平台上的直接度量,而不仅仅考虑FLOP。基于一系列对照实验,本文为高效的网络设计提供了几个实用指南。最终提出了称为ShuffleNet V2的新架构。全面的对比实验验证了我们的模型在速度和准确性权衡方面是最先进的。
2 简介
深度卷积神经网络(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)和直接(速度)指标之间的差异可归因于两个主要原因。第一,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%。
3 高效网络设计实用指南
我们的研究在两个广泛采用的硬件平台上进行,并对运行的CNN库进行了工业级优化。我们的CNN库比大多数开源库更高效。因此,我们确保我们的观察和结论对于工业实践很适用。
- GPU:使用单个NVIDIA GeForce GTX 1080Ti。卷积库是CUDNN 7.0。我们还激活了CUDNN的基准测试功能,分别为不同的卷积选择最快的算法。
- ARM:Qualcomm Snapdragon 810。我们使用高度优化的基于Neon的实现。评估时只使用单个线程。
其他设置包括:打开所有的优化选项(例如张量融合 — 用于减少小操作的开销)。输入图像大小为224×224。每个网络随机初始化并评估100次,使用平均运行时间作为最终评估标准。
为了开始我们的研究,我们分析了两个最先进的网络,ShuffleNet v1和MobileNet v2的推理性能。它们在ImageNet分类任务上都非常高效和准确,广泛用于移动设备等低计算能力的设备。虽然我们只分析这两个网络,但我们注意到它们代表了当前的趋势,这两个网络的核心是组卷积和深度分离卷积,它们也是其他最先进网络(如ResNeXt,Xception ,MobileNet 和CondenseNet)的关键组件 。
我们统计了各操作的耗时,如图2所示。我们注意到FLOPs度量仅考虑了卷积部分,虽然这部分消耗的时间最多,但其他操作包括数据I / O,数据混洗和逐元素操作(AddTensor,ReLU等)也占用了相当多的时间。因此,FLOP对实际运行时间的估计是不够准确的。
基于这一观察,我们从几个不同的方面对运行时间(或速度)进行了详细分析,并为有效的网络架构设计推导出一些实用指南。
-
G1:相同的channel可最大限度地降低内存访问成本(MAC):轻量化网络通常采用深度可分离卷积,其中逐点卷积(即1×1卷积)占了绝大部分的计算量。我们研究了1×1卷积的核心形状,其由两个参数指定:输入通道的数量c1和输出通道的数量c2。设h和w为特征映射图的空间大小,1×1卷积的FLOP为B = h * w * c1 * c2。
为简单起见,我们假设计算设备中的高速缓存足够大以存储整个特征映射图和参数。因此,存储器的访问成本(MAC)或存储器的访问次数 MAC = hw(c1 + c2)+ c1c2。注意,这两项分别对应于输入/输出特征映射图和卷积核所占用的存储空间。
根据均值不等式( c 1 + c 2 ≥ 2 c 1 c 2 , c 1 = c 2 c_1 + c_2 \geq 2\sqrt{c_1c_2},c_1 =c_2 c1+c2≥2c1c2,c1=c2时,等号成立),因此有
因此,MAC的下限和FLOP有关。并且当输入和输出通道的数量相等时,MAC达到下限。
上面的结论是理论上的。实际上,许多设备上的缓存都不够大。此外,现代计算库通常采用复杂的阻塞策略来充分利用缓存机制。因此,实际MAC可能偏离理论MAC。为了验证上述结论,我们进行了如下实验。通过重复堆叠10个网络块来构建基准网络。每个块包含两个卷积层,第一个包含c1输入通道和c2输出通道,第二个相反。
表1通过在固定总FLOP的同时改变c1:c2的比值来测试运行速度。很明显,当c1:c2接近1:1时,MAC更小,网络评估速度更快。
-
G2:组卷积的组数越大,MAC越大:组卷积是轻量化网络的核心,它通过将所有channel之间的密集卷积改变为稀疏(仅在同一组内)来降低计算复杂度(FLOP)。一方面,因为组卷积相比普通卷积降低了计算量,因此在给定FLOP的情况下使用组卷积可以使用更多的channel,增加了网络的容量(从而提高了精度)。然而,另一方面,增加的channel数导致更多的MAC。
正式地,遵循G1和公式(1)中的符号,1×1组卷积的MAC和FLOP之间的关系是:
1 * 1的组卷积的Flop为:B = h w c 1 c 2 g \frac{hwc_1c_2}{g} ghwc1c2
其中g是组的数量。很容易看出,给定固定输入形状c1×h×w和计算成本B,MAC随着g的增大而增加。
为了研究实践中的影响,通过堆叠10个逐点组卷积层来构建基准网络。表2报告了在FLOP相同时不同组大小的模型的运行速度。很明显,使用大的组数会显著降低运行速度。例如,在GPU上,g=8比g=1(标准密集卷积)慢两倍,而ARM上则慢30%。这主要是由于MAC的增加。
因此,我们建议应根据目标平台和任务仔细选择组数目。轻易使用大的组是不明智的,虽然这样允许我们可以使用更多的通道,但是快速增加的计算成本带来的损失会轻易地抵消掉准确度增加带来的好处。
-
G3:网络碎片程度会降低推理的并行度:在GoogLeNet系列和自动生成的体系结构[9,11,10]中,每个网络块都广泛采用了一种“多路径”结构。许多小型操作(这里称为“碎片操作”)被用来代替几个大的操作。例如,在NASNET-A中,碎片运算符的数量(即一个构建块中的单个卷积或池化操作的数量)为13。相比之下,在ResNet等常规结构中,此数字为2或3。
虽然这种碎片结构已被证明有利于提升准确性,但它可能会降低效率,因为它对具有强大并行计算能力的设备(如GPU)不友好。它还引入了额外的开销,例如内核启动和同步。
为了量化网络碎片如何影响效率,我们评估了一系列具有不同碎片程度的网络块。每一个基础块都由1到4个 1 x 1 1 x 1 1x1卷积组成,所不同的是排列方式为顺序排列还是并行排列。块结构如下图所示。每个块重复堆叠10次。表3中的结果表明,碎片程度越大,在GPU上的速度会显著降低,例如: 4分段结构比1分段结构慢3倍。在ARM上,速度降低相对较小。
-
G4:逐元素操作的执行时间是不可忽略的:如图2所示,在像ShuffleNet V1和MobileNet V2这样的轻量级模型中,逐元素操作占用了相当多的时间,尤其是在GPU上。这里,逐元素运算包括ReLU,AddTensor,AddBias等。它们具有小的FLOP但是相对较重的MAC。特别地,我们还将深度分离卷积视为逐元素运算符,因为它也具有较高的MAC / FLOP比。
为了验证这个结论,我们在ResNet中尝试了“瓶颈”单元(1×1卷积后跟3×3卷积,然后是1×1卷积,带有ReLU和直连通道)的不同变体,表4中报告了不同变体的运行时间。在删除ReLU和直连通道后(减少了逐元素操作的计算量),我们观察到在GPU和ARM上都获得了大约20%的加速。
-
结论和讨论:基于上述指导原则和实验结果,我们得出结论,高效的网络架构应该:
1)使用“平衡卷积"(相等的通道数);
2)注意使用组卷积的成本;
3)降低碎片化程度;
4)减少逐元素操作。这些理想的属性取决于超出理论FLOP的平台特性(例如内存操作和代码优化)。它们应该被用于实际的网络设计。
轻量级神经网络架构的最新进展主要基于FLOP的度量,并未考虑上述这些特性。例如,ShuffleNet v1严重依赖于组卷积(违反了G2)和bottleneck网络块(违反了G1)。MobileNet v2 使用了违反G1的反向bottleneck结构,并且在“thick”特征图上使用深度分离卷积和ReLU,违反了G4。自动生成的结构[9,11,10]高度碎片化违反了G3。
4 ShuffleNet V2:一种高效的架构
回顾下ShuffleNet v1,它是一种先进的网络架构,它广泛应用于移动设备等低端设备,它激发了我们的工作。因此,首先对其进行审查和分析。
根据ShuffleNet v1所述,轻量级网络面临的主要挑战是,在给定的计算预算(FLOP)下,只能使用有限数量的channel。为了在不显着增加FLOP的情况下增加通道数,在ShuffleNet v1中采用了两种技术:逐点组卷积和bottleneck结构。然后引入“channel shuffle”操作以实现不同channel组之间的信息交互并提高准确性。网络基础块如图3(a)(b)所示。
如第2节所述,逐点组卷积和bottleneck结构都会增加MAC(G1和G2),这个成本是不可忽视的,特别是对于轻量级的模型。此外,使用太多组违反了G3。在直连通道中进行逐元素相加的操作也是不合需要的(G4)。因此,关键问题是如何在保持较大channel的情况下,既不使用密集卷积也不使用太大的组卷积时,实现高容量和高效率的模型。
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“操作来实现不同channel之间的信息交互。
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不仅高效,而且准确。主要有两个原因,首先,每个构建块的高效率使得能够使用更多的channel,从而网络的容量更大。其次,在每个块中,一半的特征通道(当
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。
5 实验
我们的对比实验在ImageNet 2012分类数据集上执行。按照惯例,相比之下,所有网络都有四个级别的计算复杂度,即大约40,140,300和500+ MFLOPs。这些计算量是移动场景的下典型值。其他超参数与ShuffleNet v1完全相同。
我们将与以下网络架构进行比较:
- ShuffleNet v1:在ShuffleNet v1中,比较了一系列组号g。最后建议g = 3在准确度和速度之间有更好的权衡。,这也符合我们的观察。在本文中,我们主要使用g = 3。
- MobileNet v2 :它比MobileNet v1更好。为了全面比较,我们报告了原始论文和我们重新实现版本的准确性,因为原始论文中的一些结果不可用。
- Xception:原始Xception模型[12]非常大(FLOP> 2G),这超出了我们的比较范围。最近的工作[34]提出了一种改进的轻量级Xception结构,它显示了准确性和效率之间更好的权衡。所以,我们与这个变体进行比较。
- DenseNet:原始论文仅报告大型模型的结果(FLOP> 2G)。为了直接比较,我们按照表5中的体系结构设置重新实现它,其中阶段2-4中的构建块由11个DenseNet块组成。我们调整通道数以满足不同的目标复杂性。
表8总结了所有结果。我们从不同方面分析这些结果。
准确率 vs. FLOPs:很明显,本文所提出的ShuffleNet v2模型在很大的范围内表现优于所有其他网络,特别是在较小的计算量下。此外,我们注意到MobileNet v2使用224×224大小的图像在40 MFLOP级别上效果很差,这可能是由于channel太少造成的。相比之下,我们的模型没有这个缺点,因为我们的高效设计允许使用更多的通道。此外,虽然我们的模型和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比ResNet-50减少了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 *具有最佳精度,并且仍然比其他方法更快。这激发了一个实际问题:如何增加感受野的大小,这对于高分辨率图像中的目标检测至关重要。我们将来会研究这个话题。
6 总结
我们建议网络架构设计应考虑直接度量,如速度,而不是像FLOP那样的间接度量。我们提出实用指南和新颖的架构,ShuffleNet v2。综合实验验证了我们新模型的有效性。我们希望这项工作能够激发未来的平台意识和更实用的网络架构设计工作。