论文地址:https://arxiv.org/pdf/1807.11164.pdf
这篇是ECCV2018关于模型加速和压缩的文章,是之前ShuffleNet的升级版。
目前,神经网络架构设计主要由计算复杂度的直接度量引导,即FLOP。然而,直接度量(例如速度)也取决于其他因素,例如存储器访问成本和平台特性。 因此,这项工作提出了评估目标平台上的直接指标,考虑FLOP。 基于一系列对照实验,这项工作得出了几个有效网络设计的实用指南。 因此,提出了一种新的体系结构,称为ShuffleNet V2。综合消融实验验证了我们的模型在速度和准确性权衡方面是最先进的。
1 Introduction
深度卷积中性网络(CNN)的体系结构已经发展了一年,变得更加准确和快速。 自AlexNet [1]的里程碑工作以来,ImageNet分类的准确性已经通过小型结构得到显着改善,包括VGG [2],GoogLeNet [3],ResNet [4,5],DenseNet [6],ResNeXt [7],SE -Net [8]和自动中性架构搜索[9,10,11],仅举几例。
除了准确性,计算复杂性是另一个重要的考虑因素。 真实世界任务通常旨在获得由目标平台(例如,硬件)和应用场景(例如,自动驾驶需要低等待时间)给出的有限计算预算下的最佳准确度。 这激发了一系列针对轻量级架构设计和更快速度准确性权衡的工作,包括Xception [12],MobileNet [13],MobileNet V2 [14],ShuffleNet [15]和CondenseNet [16]等。 一些。 在这些工作中,group conv和depthwise conv 是至关重要的。
为了测量计算复杂度,一个广泛使用的度量标准是浮点运算的数量,或者FLOPs。 但是,FLOP是一种间接测量,近似值,但通常不等于真正关心的直接度量,例如速度或延迟latency。 在以前的作品[17,18,14,19]中已经注意到这种差异。 例如,MobileNet v2 [14]比NASNET-A [9]快很多,但它们具有相近的FLOP。 在图1(c)(d)中进一步简化了这种现象,其表明具有相似FLOP的网络具有不同的速度。 因此,使用FLOP作为计算复杂性的唯一度量是不够的,并且可能导致次优设计。
间接(FLOP)和直接(speed)度量之间的差异可归因于两个主要原因。 首先,FLOP没有考虑几个对速度有可能影响的重要因素。 一个这样的因素是内存访问成本(MAC)。 在诸如组卷积的某些操作中,这种成本构成了运行时间的很大一部分。 它可能是具有强大计算能力的设备(例如GPU)的瓶颈。 在网络架构设计期间,不应该简单地标记该成本。 另一个是并行度。在相同的FLOP下,具有高度并行性的模型可能比具有低并行度的另一个模型快得多。
其次,具有相同FLOP的操作可能具有不同的运行时间,具体取决于平台。 例如,张量分解在早期工作中被广泛使用[20,21,22]来加速矩阵乘法。 然而,最近的工作[19]发现[22]中的分解在GPU上甚至更慢,尽管它将FLOP降低了75%。 我们调查了这个问题并发现这是因为最新的CUDNN [23]库专门针对3×3 conv进行了优化。 我们当然不能认为3×3转换比1×1转换慢9倍。
通过这些观察,我们提出应该考虑两个原则来进行有效的网络架构设计。 首先,应该使用直接度量(例如,速度)而不是间接度量(例如,FLOP)。 其次,应在目标平台上评估此类指标。
在这项工作中,我们遵循这两个原则,并提出一个更有效的网络架构。 在第2节中,我们首先分析了两个代表性的最先进网络的运行时性能[15,14]。 然后,我们推导出四种有效网络设计指南,这些指南不仅仅考虑了FLOP。 虽然这些指南与平台无关,但我们执行一系列受控实验,以在两个不同的平台(GPU和ARM)上验证它们,并使用专门的代码优化,确保我们的结论是最先进的。
在第3节中,根据指南,我们设计了一个新的网络结构。由于受ShuffleNet [15]的启发,它被称为ShuffleNet V2。 通过第4节中的综合验证实验证明,它比以前的网络更快,更准确。图1(a)(b)给出了比较的概述。 例如,考虑到40M FLOP的计算复杂度预算,ShuffleNet v2分别比ShuffleNetv1和MobileNet v2精确3.5%和3.7%。
2 Practical Guidelines for Efficient Network Design
我们的研究是在两个广泛采用的硬件上进行的,这些硬件具有CNN库的行业优化。 我们注意到,我们的CNN库比大多数开源库更有效。 因此,我们确保我们的观察和结论对于工业实践具有可靠性和重要性。
GPU.使用单个NVIDIA GeForce GTX 1080Ti。 卷积语言是CUDNN 7.0 [23]。 我们还**了CORNN的基准测试功能,分别为不同的卷积选择最快的算法。
ARM.A Qualcomm Snapdragon 810.我们使用高度优化的基于Neon的实现。 单个线程用于评估。
其他设置包括:全开启优化选项(例如张量融合,用于减少小操作的开销)。 input image大小为224×224。 每个网络随机初始化并评估100次。 使用平均运行时间。
为了开始我们的研究,我们分析了两个最先进的网络的运行时性能,ShuffleNet v1 [15]和MobileNet v2 [14]。 它们在ImageNet分类任务上都非常高效和准确。 它们广泛用于移动设备等低端设备。 虽然我们只分析这两个网络,但我们注意到它们代表了当前的趋势。 它们的核心是群体卷积和深度卷积,它们是其他最先进网络的其他组成部分,例如ResNeXt [7],Xception [12],MobileNet [13]和CondenseNet [16]。
整个运行时被分解用于不同的操作,如图2所示。我们注意到FLOPs度量仅考虑卷积部分。虽然这部分消耗大部分时间,但其他操作包括data I / O,data shuffle和element- wise的操作(Add Tensor,ReLU等)也是相当多的时间。 因此,FLOP并不是实际运行时的准确联合。
基于这一观察,我们从几个不同方面对运行时(or speed)进行了详细分析,并得出了一些有效的网络架构设计实用指南。
G1) Equal channel width minimizes memory access cost (MAC).
现代网络通常采用深度可分离卷积[12,13,15,14],其中逐点卷积(即1×1卷积)占复杂性的大部分[15]。 我们研究了1×1卷积的核心形状。 该形状由两个参数指定:输入通道数c1和输出通道数c2。 Lethandwbe是特征映射的空间大小,1×1卷积的FLOP是B = hwc1c2。
为简单起见,我们假设计算设备中的高速缓存足够大以存储整个特征映射和参数。 因此,存储器访问成本(MAC)或存储器访问操作的数量是MAC = h * w * (c1 + c2) + c1 * c2。注意这两个术语分别对应于输入/输出特征映射和内核权重的存储器访问。
从均值不等式上来看,我们有
因此,MAC具有FLOP给出的下限。 当输入和输出通道的数量相等时,它到达下限。
结论是理论上的。 实际上,许多设备上的缓存都不够大。 此外,现代计算库通常采用复杂的块策略来充分利用缓存机制[24]。 因此,real MAC可能偏离理论上的。 为了验证上述结论,实验如下进行。 通过重复堆叠10个构建块来构建基准网络。 每个块包含两个卷积层。 第一个包含c1输入通道和c2输出通道,第二个通道通道。表1通过改变ratio c1:c2来报告运行速度,同时修复总FLOP。 很明显,当c1:c2接近1:1时,MAC变小,网络评估速度更快。
G2) Excessive group convolution increases MAC.
group conv是现代网络架构的核心[7,15,25,26,27,28]。 它通过将所有通道之间的密集卷积改变为稀疏(仅在通道组内)来降低计算复杂度(FLOP)。 一方面,它允许在给定固定FLOP的情况下使用更多信道并增加网络容量(从而提高精度)。 然而,另一方面,增加的信道数导致更多的MAC。通常,遵循G1和Eq 1中的符号,1×1组卷积的MAC和FLOP之间的关系是
其中组的数量 g 和 B = h×w×c1×c2 / g是 FLOP。 很容易看出,给定固定输入形状c1×h×w和计算成本B,MAC随着g的增长而增加。
为了研究实践中的影响,通过堆叠10个逐点组卷积层来构建基准网络。 表2报告了在修复总FLOP时使用不同组号的运行速度。 很明显,使用大小的组号会显着降低运行速度。 例如,使用8组比使用GPU上的1组(标准密集卷积)慢两倍,而在ARM上则慢30%。 这主要是由于MAC增加。 我们注意到我们的实现已经过专门优化,并且比按小组计算卷积更快。
因此,我们建议根据目标平台和任务仔细选择组号。 简单地使用大的组号是不明智的,因为这可能使得能够使用更多的通道,因为快速增加的计算成本可以轻易地超过准确性增加的益处。
G3) Network fragmentation reduces degree of parallelism.
GoogLeNet系列[29,30,3,31]和自动生成的体系结构[9,11,10]),“多路径”结构在每个网络块中被广泛采用。 使用了许多小型运算符(这里称为“碎片运算符”)而不是几个大运算符。 例如,在NASNET-A [9]中,分段运算符的数量(即一个构建块中的单个卷积或池化操作的数量)为13.相比之下,在ResNet [4]等常规结构中,此数字为2或3。
虽然这种碎片结构已被证明有利于精确度,但它可能会降低效率,因为它对具有强大并行计算能力的设备(如GPU)不友好。 它还引入了额外的开销,例如kernel launching和同步。
为了量化网络碎片如何影响效率,我们评估了一系列具有不同碎片程度的网络块。 具体地,每个构建块由1到4个1×1个卷积组成,它们以不连续或并行的方式排列。 块结构如附录所示。 每个块重复堆叠10次。 其中2-fragment-series表示一个block中有2个卷积层串行,也就是简单的叠加;4-fragment-parallel表示一个block中有4个卷积层并行,类似Inception的整体设计。表3中的结果表明,碎片在GPU上显着降低了速度,例如: 4片段结构比1片段慢3倍。 在ARM上,速度降低相对较小。
G4) Element-wise operations are non-negligible
如图2所示,在像[15,14]这样的轻量级模型中,元素操作占用了相当多的时间,尤其是在GPU上。 这里,元素方面的运算符包括ReLU,Add Tensor,Add Bias等。它们具有小的FLOP但是相对较重的MAC。 特别地,我们还考虑了逐步卷积[12,13,14,15]作为元素运算符,因为它还具有高MAC / FLOP比率。
为了验证,我们在ResNet [4]中试验了“瓶颈”单元(1×1转换后跟3×3转换,然后是1×1转换,具有ReLU和快捷连接)。 ReLU和快捷操作将分别删除。 表4中报告了不同变体的运行时间。在删除ReLU和快捷方式后,我们观察到在GPU和ARM上获得了大约20%的加速。
Conclusion and Discussions
基于上述指导原则和经验研究,我们得出结论,有效的网络架构应该
1)使用“平衡”卷积(等通道宽度);equal channel width
2)了解使用group convolution的成本;
3)降低碎片程度;
4)减少element-wise。
这些理想的属性取决于超出理论FLOP的平台特性(如内存操作和代码优化)。 它们应该用于实际的网络设计。
轻量级神经网络架构[15,13,14,9,11,10,12]的最新进展主要基于FLOP的度量,并未考虑上述这些特性。 例如,ShuffleNet v1 [15]严重依赖于群组卷积(针对G2)和类似瓶颈的构建块(针对G1).MobileNet v2 [14]使用了违反G1的倒置瓶颈结构。 它在“厚”特征映射上使用深度卷积和ReLU。 这违反了G4。 自动生成的结构[9,11,10]高度分散并违反了GN3。
3 ShuffleNet V2: an Efficient Architecture
Review of ShuffleNet v1[15]
ShuffleNet是一个最先进的网络架构。 它广泛应用于移动设备等低端设备。 它激发了我们的工作。 因此,首先对其进行审查和分析。
根据[15],轻量级网络面临的主要挑战是,在给定的计算芽数(FLOP)下,只有有限数量的特征通道是可以承受的。 为了在不显着增加FLOP的情况下增加通道数,在[15]中采用了两种技术:逐点组卷积和瓶颈状结构。 然后引入“信道混洗”操作以在不同信道组之间进行信息通信并提高准确性。 构建块如图3(a)(b)所示。
如第2节所述,逐点组卷积和瓶颈结构都会增加MAC(G1和G2)。 这个成本是不可忽视的,特别是对于轻量级模型。 此外,使用太多组违反了G3。 快捷方式连接中的元素方式“添加”操作也是不合需要的(G4)。 因此,为了实现高模型容量和效率,关键问题是如何保持大量且同样宽的信道,既没有密集卷积也没有太多群组。
Channel Split and ShuffleNet V2
为了达到上述目的,我们引入了一个简单的运算符称作 channel split。 如图3(c)所示。 在每个单元的开始处,将特征信道的输入分成具有c-c'和c'信道的两个分支。 在GN3之后,一个分支仍然是identity。 另一个分支由三个卷积组成,具有相同的输入和输出通道以满足G1。 与[15]不同,这两个1×1卷积不再是分组的。 这部分是为了跟随G2,部分是因为分裂操作已经产生了两组。
卷积后,两个分支连接在一起。 因此,通道数保持不变(G1)。 然后使用与[15]中相同的“信道混洗”操作来实现两个分支之间的信息通信。
洗牌后,下一个单位开始。 请注意,DruffleNet v1 [15]中的“添加”操作不再存在。 像ReLU和深度卷积的元素操作只在一个分支中运行。 此外,三个连续的逐元素操作“Concat”,“Channel Shuffle”和“Channel Split”被合并为单个元素操作。 根据G4,这些变化是有益的。
对于空间下采样,该单元稍作修改,如图3(d)所示。 删除了通道拆分运算符。 因此,输出通道的数量加倍。
拟议的构建块(c)(d)以及由此产生的网络被称为ShuffleNet V2。 基于上述分析,我们得出结论,这种架构设计非常高效,因为它遵循所有准则。
重复堆叠构建块以构建整个网络。为简单起见,我们setc'= c / 2。 整体网络结构类似于Shuf-fleNet v1 [15]并总结在表5中。只有一个区别:在全球平均池化混合功能之前添加了一个额外的1×1卷积层,这在ShuffleNet v1中不存在。 与[15]类似,每个块中的通道数量被缩放以生成不同复杂度的网络,标记为0.5×,1×等。
未完待续。。。。。。。。。。