目前,神经网络架构设计多以计算复杂度的间接度量为指导,即FLOPs。然而,直接度量如速度,还取决于其他因素,例如内存访问成本和平台特性(硬件平台)。因此,这项工作建议评估目标平台上的直接度量,而不仅仅是考虑FLOPs.(so,为何19年的PeleeNet还会被FLOPs所误导呢)
基于一系列的对照实验,本工作得出了有效网络设计的几个实用准则。因此,提出了一种新的体系结构,称为ShuffleNet V2。消融实验验证了我们的模型在速度和精度折衷方面是最先进的。
深度卷积神经网络(cnn)的架构已经发展了多年,变得更加准确和快速,自AlexNet以来,一系列的新颖的架构显著提高了ImageNet的分类精度。除了精度之外,计算复杂度是另一个重要的考虑因素。现实世界的任务通常旨在在目标平台(例如硬件)和应用场景(例如,自动驾驶需要低延迟)给定的有限计算预算下获得最佳精度。这激发了一系列朝着轻量级架构设计和更好的速度-精度权衡的工作,群卷积和深度卷积在这些工作中是至关重要的
为了衡量计算复杂度,广泛使用的是浮点运算FLOPs,然而FLOPs只是一个近似值,它并没有考虑到硬件平台、内存访问成本等因素。这在以往的实验中已经被注意到,低FLOPs并不意味着实际速度快,甚至可能更慢
间接(FLOPs)和直接(速度)度量之间的差异可归因于两个主要原因。首先,FLOPs没有考虑对速度有很大影响的几个重要因素,如MAC(内存访问成本)和并行度,在相同的FLOPs下,具有高并行度的模型可能比具有低并行度的模型快得多。
其次,根据平台的不同,具有相同FLOPs的操作可能有不同的运行时间。例如,早期的作品[20,21,22]广泛使用张量分解来加速矩阵乘法。然而,最近的工作[19]发现[22]中的分解在GPU上甚至更慢,尽管它减少了75%的FLOPs。我们调查了这个问题,发现这是因为最新的CUDNN[23]库专门针对3 × 3卷积进行了优化。我们当然不能认为3 × 3卷积比1 × 1卷积慢9倍。
根据这些观察,我们提出了有效的网络架构设计应该考虑两个原则:
首先,应该使用直接度量(例如,速度)而不是间接度量(例如,FLOPs)
其次,这些指标应该在目标平台上进行评估
在本文中,我们遵循这两个原则,提出了一个更有效的网络架构
我们的研究是在两种广泛采用的硬件上进行的,并对CNN库进行了行业级优化。我们注意到我们的CNN库比大多数开源库更高效。因此,我们确保我们的观察和结论是坚实的,对工业实践具有重要意义
– GPU使用1080Ti,卷即库是CUDNN 7.0,我们还激活了CUDNN的基准测试函数,分别为不同的卷积选择最快的算法。
– ARM采用骄龙810,我们使用高度优化的基于Neon的实现,单个线程用于评估。
其他设置包括:完全优化选项(例如张量融合,用于减少小操作的开销)被打开。输入图像大小为224 × 224。每个网络随机初始化并评估100次。使用平均运行时间。
整个运行时被分解为不同的操作,如图2所示。我们注意到FLOPs度量只考虑卷积部分。虽然这部分消耗了大部分时间,但其他操作,包括数据I/O,数据shuffle和元素操作(AddTensor, ReLU等)也占用了相当多的时间。因此,FLOPs并不是对实际运行时间足够准确的估计。
基于这一观察,我们从几个不同的方面对运行时(或速度)进行了详细的分析,并得出了一些有效的网络体系结构设计的实用指导方针:
现代网络通常采用深度可分离卷积,其中点卷积(1*1)占据了大部分的复杂度,我们设h和w为特征映射的空间大小,c1,c2为输入输出通道数,FLOPs为B = hwc1c2
为简单起见,我们假设计算设备中的缓存足够大,可以存储整个特征映射和参数。因此,内存访问成本MAC = hw(c1 + c2)+ c1 c2
在这个假设下,内存访问成本(MAC)的计算看起来是使用了一个相对简化的模型来考虑存储整个特征映射和参数的情况。
**hw(c1 + c2):这一部分估算了从内存中读取整个特征映射所需的成本。**每个像素点都有 (c1 + c2) 个数据需要被读取(假设一个像素点的数据包含输入通道和输出通道的信息),这样乘以 h)和 w 就是整个特征映射的读取成本。
c1 × c2:这一部分估算了存储卷积核参数的成本。由于假设了存储了整个参数,所以是 c1 times c2个参数需要被读取。
从均值不等式中,我们得到
即当输入和输出通道的数量相等时,MAC有一个由FLOPs给出的下界。
为了验证上述结论,我们进行了如下实验。基准网络是通过重复堆叠10个构建块来构建的,每个块包含两个卷积层,第一个包含c1个输入通道和c2个输出通道,第二个则相反。
表1通过改变比率c1: c2来报告运行速度,同时固定总FlOPs。可以看出,当c1: c2趋近于1:1时,MAC越小,网络评估速度越快
群卷积是现代网络架构的核心,它通过将所有信道之间的密集卷积变为稀疏(仅在信道组内)来降低计算复杂度(FLOPs)。一方面,它允许在给定固定FLOPs的情况下使用更多的信道并增加网络容量(因此准确性更高)。然而,另一方面,通道数量的增加导致MAC的增加
根据G1和Eq. 1中的符号,1 × 1群卷积的MAC和FLOPs之间的关系为:
注意,此处FLOPs(B)已经是hwc1c2/g
很容易看出,给定固定的输入形状c1 × h × w和计算成本B, MAC随着g的增长而增加。
为了研究在实际应用中的影响,通过叠加10个点向群卷积层构建了一个基准网络。表2报告了在固定总flop时使用不同组号的运行速度。很明显,使用较大的组数会显著降低运行速度。
因此,组数过多是不明智的,因为这样会使用更多的通道,准确性提高的好处很容易被快速增加的计算成本所抵消。
GoogLeNet系列在每个网络块中广泛采用“多路径”结构。使用了许多小的操作符(这里称为“碎片操作符”),而不是几个大的操作符。
虽然这种碎片化结构已被证明有利于准确性,但它可能会降低效率,因为它对GPU等具有强大并行计算能力的设备不友好。它还引入了额外的开销,例如内核启动和同步。(碎片化结构可能导致内存访问变得不连续和不规则,这可能会影响GPU的并行计算能力)
为了量化网络碎片化如何影响效率,我们评估了一系列不同碎片化程度的网络块。具体来说,每个构建块由1到4个1 × 1的卷积组成,它们按顺序或并行排列。块结构在附录中有说明。每个块重复堆叠10次。
从表3的结果可以看出,碎片化显著降低了GPU上的速度,例如4 fragment结构比1 fragment结构慢3倍。
如图2所示,在轻量级模型中,元素操作占用了相当多的时间,特别是在GPU上。这里,元素操作符包括ReLU、AddTensor、AddBias等。它们具有较小的FLOPs,但相对较重的MAC。特别地,我们还考虑深度卷积作为元素的运算符,因为它也具有较高的MAC/FLOPs比率
为了验证,我们在ResNet中实验了“瓶颈”单元(1 ×1 conv,然后是3×3 conv,然后是1×1 conv,带有ReLU和快捷连接)。ReLU和快捷操作分别被删除。表4报告了不同变体的运行时间。我们观察到在移除ReLU和快捷方式后,在GPU和ARM上都获得了大约20%的加速
基于上述指导方针和实证研究,我们得出结论,一个高效的网络架构应该1)使用“平衡”卷积(相等的通道宽度);2)意识到使用群卷积的代价;3)降低碎片化程度;4)减少元素操作。这些理想的属性取决于超出理论FLOPs的平台特性(例如内存操作和代码优化)
轻量级神经网络架构的最新进展主要基于FLOPs的度量,而不考虑上面的这些属性。例如,ShuffleNet v1严重依赖于群卷积(针对G2)和瓶颈类构建块(针对G1)。MobileNet v2使用了违反G1的反向瓶颈结构。它在“厚”特征映射上使用深度卷积和relu。这违反了G4。自动生成的结构是高度碎片化的,违反G3
hh
对比之前的guidelines,发现ShuffleNet存在一系列问题:点群卷积和瓶颈结构都会增加MAC (G1和G2)。这个成本是不可忽略的,特别是对于轻量级的模型。此外,使用太多的组违反了G3。快捷连接中的元素“Add”操作也是不可取的(G4)。
得出:为了获得较高的模型容量和效率,关键问题是如何在不密集卷积和不太多组的情况下保持大量等宽的通道
通道拆分操作如上图c:
在每个单元开始时,将c个特征通道的输入分为两个支路,分别为c - c’和c’通道。遵循G3,一个分支是身份映射,另一个分支由三个具有相同输入和输出通道的卷积组成,以满足G1。与[15]不同,这两个1 × 1卷积不再是群卷积的,这部分是为了遵循G2,部分是因为拆分操作已经产生了两个组。
卷积后,两个分支连接起来。因此,通道数保持不变(G1)。然后使用“通道洗牌”操作来实现两个分支之间的信息通信
洗牌后,下一个单元开始。注意,在ShuffleNet v1中不再存在“添加”操作。像ReLU和深度卷积这样的元素操作只存在于一个分支中。此外,三个连续的元素操作,“Concat”,“Channel Shuffle”和“Channel Split”,被合并为单个元素操作。根据G4,这些变化是有益的。
对于空间下采样,该单元稍作修改(why?不可以通过池化嘛),如图(d)所示。通道分割操作符被删除。因此,输出通道的数量增加了一倍
提出的构建块©(d)以及由此产生的网络称为ShuffleNet V2。基于上述分析,我们得出结论,该架构设计是高效的,因为它遵循了所有的指导方针
构建块被反复堆叠以构建整个网络。为简单起见,设c '= c/2。整体网络结构与ShuffleNet v1相似,如表5所示。只有一个区别**:在全局平均池化之前增加了一个额外的1 × 1卷积层来混合特征**,每个区块中的通道数被缩放以生成不同复杂度的网络,标记为0.5×、1x等。
ShuffleNet v2不仅高效,而且准确,主要有两个原因。首先,每个构建块的效率高,可以使用更多的特征通道和更大的网络容量。其次,在每个块中,一半的特征通道(当c‘ = c/2)直接穿过区块并加入下一个区块。这可以看作是一种特征重用
在DenseNet[6]中,为了分析特征重用模式,绘制了层间权值的11范数,如图4(a)所示。很明显,相邻层之间的连接比其他层更强。这意味着所有层之间的密集连接可能会引入冗余
在ShuffleNet V2中,很容易证明第i层和(i+j)层构建块之间的“直连”通道数为r^j * c,其中r = (1 -c ') /c。换句话说,特征重用的数量随着两个块之间的距离呈指数衰减。在相距较远的块之间,特性重用变得更弱。图4(b)绘制了与(a)相似的可视化图,当r = 0.5时,注意(b)中的模式与(a)相似。
因此,ShuffleNet V2的结构通过设计实现了这种类型的特征重用模式。它与DenseNet共享相似的特征重用以获得高精度的好处,但如前所述,它的效率要高得多。这在实验中得到了验证
我们的消融实验是在ImageNet 2012分类数据集上进行的。按照惯例,所比较的所有网络都具有四个级别的计算复杂度,即大约40、140、300和500+ MFLOPs。这种复杂性在移动场景中很常见。其他超参数和协议与ShuffleNet v1完全相同
与ShuffleNet、MobileNet V2、Xception、DenseNet网络架构进行比较,结果见上表
准确性vs. FLOPs:很明显,提议的ShuffleNet v2模型比所有其他网络都要好得多,特别是在较小的计算预算下。此外,我们注意到MobileNet v2在224 × 224图像大小下以40 MFLOPs级别执行pooly(???so??)这可能是由于通道太少造成的。相比之下,我们的模型没有这个缺点,因为我们的高效设计允许使用更多的通道。此外,虽然我们的模型和DenseNet[6]都重用了特征,但我们的模型效率更高
我们建议网络架构设计应该考虑直接指标,如速度,而不是间接指标,如FLOPs。我们提出了实用的指导方针和一个新颖的体系结构,ShuffleNet v2。综合实验验证了新模型的有效性,我们希望这一工作能够启发未来具有平台意识和实用性的网络架构设计工作。