ECCV 2018 | 旷视科技提出新型轻量架构ShuffleNet V2:从理论复杂度到实用设计准则

近日,旷视科技提出针对移动端深度学习的第二代卷积神经网络 ShuffleNet V2。研究者指出过去在网络架构设计上仅注重间接指标 FLOPs 的不足,并提出两个基本原则和四项准则来指导网络架构设计,最终得到了无论在速度还是精度上都超越先前最佳网络(例如 ShuffleNet V1、MobileNet 等)的 ShuffleNet V2。在综合实验评估中,ShuffleNet V2 也在速度和精度之间实现了最佳权衡。研究者认为,高效的网络架构设计应该遵循本文提出的四项准则。本文已被 ECCV 2018 收录。


1 简介

深度卷积网络(CNN)的结构经过多年改进变得更加准确和快速。自 2012 年 AlexNet [1] 取得里程碑式突破,各种新型结构层出不穷,一次次刷新 ImageNet 分类准确率,这些结构包括 VGG [2]、GoogLeNet [3]、ResNet [4、5]、DenseNet [6]、ResNeXt [7]、SE-Net [8] 和神经网络架构自动搜索 [9–11]。

除了精度,计算复杂度是另一个重要的考虑因素。现实世界的任务通常是当目标平台(如硬件)和应用场景(如自动驾驶需要低延迟)既定时,在有限算力之下实现最优的精度。这催生出一系列针对轻量级架构设计和速度-精度更好权衡的研究,包括 Xception [12]、MobileNet [13]、MobileNet V2 [14]、ShuffleNet V1[15] 和 CondenseNet [16] 等等。在这些研究中,组卷积(group convolution)和深度卷积(depthwise convolution)至关重要。

度量计算复杂度的常用指标是浮点运算数,即 FLOPs。然而,FLOPs 是一种间接指标。它只是本文真正关心的直接指标(如速度或延迟)的一种近似形式,通常无法与直接指标划等号。先前研究 [17,18,14,19] 已对这种差异有所察觉。比如,MobileNet V2 [14] 要远快于 NASNET-A [9],但是两者 FLOPs 相当。图 1 (c) (d) 进一步解释了这一现象,它表明 FLOPs 近似的网络也会有不同的速度。所以,将 FLOPs 作为衡量计算复杂度的唯一标准是不够的,这样会导致次优设计。

图 1:四个网络架构在两个硬件平台、四种不同计算复杂度上的(验证集 ImageNet 分类)精度、速度和 FLOPs 结果。(a, c) GPU 结果,batchsize= 8。(b, d) ARM 结果,batchsize = 1。本文提出的 ShuffleNet V2(右上)在所有情况下取得了最优性能。

间接指标 (FLOPs) 和直接指标(速度)之间存在差异的原因可以归结为两点。首先,对速度有较大影响的几个重要因素对 FLOPs 不产生太大作用。其中一个因素是内存访问成本 (MAC)。在某些操作(如组卷积)中,MAC 占运行时间的很大一部分。对于像 GPU 这样具备强大计算能力的设备而言,这就是瓶颈。在网络架构设计过程中,内存访问成本不能被简单忽视。另一个因素是并行度。当 FLOPs 相同时,高并行度的模型可能比低并行度的模型快得多。

其次,FLOPs 相同的运算可能有着不同的运行时间,这取决于平台。例如,早期研究 [20–22] 广泛使用张量分解来加速矩阵相乘。但是,近期研究 [19] 发现张量分解在 GPU 上甚至更慢,尽管它减少了 75% 的 FLOPs。本文研究人员对此进行了调查,发现原因在于最近的 CUDNN [23] 库专为 3×3 卷积优化:当然不能简单地认为 3×3 卷积的速度是 1×1 卷积速度的 1/9。

据此,研究者提出了高效网络架构设计应该考虑的两个基本原则:第一,应该用直接指标(例如速度)替换间接指标(例如 FLOPs);第二,这些指标应该在目标平台上进行评估。在这项研究中,作者遵循这两个原则,并提出了一种更加高效的网络架构。

第 2 部分,作者首先分析了两个代表性的当前最优网络 [15,14] 的运行性能,然后推导出高效网络设计的四个准则,它们扬弃了仅考虑 FLOPs 所带来的局限性。尽管这些准则独立于硬件平台,但研究者通过一系列可控实验,以专用的代码优化在两个不同的硬件平台(GPU 和 ARM)上验证其性能,确保本论文提出的准则是当前最佳的。

第 3 部分,研究者根据这些准则设计了一种新的网络架构。它是 ShuffleNet V1 的改进版,因此被称为 ShuffleNet V2。第 4 部分,综合验证实验的结果表明,ShuffleNet V2 在两个平台上都比先前的网络快得多,并且更加准确。图 1 (a) (b) 给出了对比结果的概览。例如,给定计算复杂度预算 40M FLOPs,ShuffleNet V2 的精度比 ShuffleNet V1 高 3.5%,比 MobileNet V2 高 3.7%。

2 高效网络设计的实用准则

研究者分析了两个移动端当前最佳网络 ShuffleNet V1 和 MobileNet V2 的运行时性能,发现它们的表现代表了当前的研究趋势。它们的核心组件为组卷积和深度卷积,这也是其它当前最佳架构的关键组件,例如 ResNet、Xception、MobileNet 和 CondenseNet 等。

研究者注意到 FLOPs 仅和卷积部分相关,尽管这一部分需要消耗大部分的时间,但其它过程例如数据 I/O、数据重排和元素级运算(张量加法、ReLU 等)也需要消耗一定程度的时间。

基于以上观察,研究者从不同层面做了运行时(速度方面)分析,并提出了设计高效网络架构需要遵循的准则:

  • G1. 相同的通道宽度可最小化内存访问成本(MAC);

  • G2. 过度的组卷积会增加 MAC;

  • G3. 网络碎片化(例如 GoogLeNet 的多路径结构)会降低并行度;

  • G4. 元素级运算不可忽视。

结论和讨论:基于上述准则和实证研究,本文总结出一个高效的网络架构应该:(1)使用「平衡」的卷积(相同的通道宽度);(2)考虑使用组卷积的成本;(3)降低碎片化程度;(4)减少元素级运算。这些所需特性依赖于平台特征(例如内存控制和代码优化),且超越了理论化的 FLOPs。它们都应该在实际的网络设计中被考虑到。

近期,轻量级神经网络架构 [15,13,14,9, 11,10,12] 上的研究进展主要基于 FLOPs 间接指标,并且没有考虑上述四个准则。例如,ShuffleNet V1 [15] 严重依赖组卷积(违反 G2)和瓶颈形态的构造块(违反 G1)。MobileNet V2 [14] 使用一种倒置的瓶颈结构,违反了 G1。它在「厚」特征图上使用了深度卷积和 ReLU 激活函数,违反了 G4。自动生成结构 [9,10,11] 的碎片化程度很高,违反了 G3。

3 新型高效架构 ShuffleNet V2

ShuffleNet V1 回顾

ShuffleNet[15] 是一种先进的网络架构,广泛应用于手机等低配设备。它启发了本文工作,因此首先对其进行回顾与分析。

根据 ShuffleNet V1,轻量级网络的主要挑战是在给定计算预算(FLOPs)时,只能获得有限数量的特征通道。为了在不显著增加 FLOPs 情况下增加通道数量,ShuffleNet V1 采用了两种技术:逐点组卷积核和类瓶颈(bottleneck-like)结构;然后引入「channel shuffle」操作,令不同组的通道之间能够进行信息交流,提高精度。其构建模块如图 3(a)(b) 所示。

如第二部分所述,逐点组卷积和瓶颈结构都增加了 MAC(G1 和 G2)。这个成本不可忽视,特别是对于轻量级模型。另外,使用太多分组也违背了 G3。捷径连接(shortcut connection)中的元素级「加法」操作也不可取 (G4)。因此,为了实现较高的模型容量和效率,关键问题是如何保持大量且同样宽的通道,既没有密集卷积也没有太多的分组。

通道分割和 ShuffleNet V2

为此,本文引入一个简单的操作——通道分割(channel split)。如图 3(c) 所示。在每个单元的开始,c 特征通道的输入被分为两支,分别带有 c−c'和 c'个通道。按照准则 G3,一个分支仍然保持不变。另一个分支由三个卷积组成,为满足 G1,令输入和输出通道相同。与 ShuffleNet V1 不同的是,两个 1×1 卷积不再是组卷积。这部分是为了遵循 G2,部分是因为分割操作已经产生了两个组。

卷积之后,把两个分支拼接起来,从而通道数量保持不变 (G1)。然后进行与 ShuffleNet V1 相同的「Channel Shuffle」操作来保证两个分支间能进行信息交流。

「Shuffle」之后,下一个单元开始运算。注意,ShuffleNet V1 [15] 中的「加法」操作不再存在。像 ReLU 和深度卷积这样的操作只存在一个分支中。另外,三个连续的操作「拼接」、「Channel Shuffle」和「通道分割」合并成一个操作。根据 G4,这些变化是有利的。

对于空间下采样,该单元经过稍微修改,详见图 3(d)。通道分割运算被移除。因此,输出通道数量翻了一倍。

本文提出的构造块 (c)(d),以及由此而得的网络,被称之为 ShuffleNet V2。基于上述分析,本文得出结论:由于对上述四个准则的遵循,该架构设计异常高效。

上述构建模块被重复堆叠以构建整个网络。为简单起见,本文令 c' = c/2。整个网络结构类似于 ShuffleNet V1(见表 5)。二者之间只有一个区别:前者在全局平均池化层之前添加了一个额外的 1×1 卷积层来混合特征,ShuffleNet V1 中没有该层。与 ShuffleNet V1 类似,每个构建块中的通道数量可以扩展以生成不同复杂度的网络,标记为 0.5×、1×等。

图 3:ShuffleNet V1 [15] 和 ShuffleNet V2 的构造块。(a)ShuffleNet 基本单元;(b) 用于空间下采样 (2×) 的 ShuffleNet 单元;(c) ShuffleNet V2 的基本单元;(d) 用于空间下采样 (2×) 的 ShuffleNet V2 单元。DWConv:深度卷积 (depthwise convolution)。GConv:组卷积 (group convolution)。

表 5:ShuffleNet V2 的整体架构,复杂度包含四个级别。

图 4:DenseNet [6] 和 ShuffleNet V2 中特征重用模式的图示。(a) 模型中卷积层的滤波器绝对权重平均值。像素颜色 (s,l) 编码连接层 s 和 l 的权重的平均 L1 范数。(b) 像素颜色 (s,l) 表示直接连接 ShuffleNet V2 中模块 s 和 l 的通道数量。所有像素值都归一化到 [0,1] 区间。

4 实验结果

本文的 Ablation 实验是在 ImageNet 2012 分类数据集上展开的。按照一般原则,所有的对比网络有四种不同的计算复杂度,分别是 40,140,300 和 500+ MFLOPs。这样的复杂度在移动端场景中很典型。超参数及其他设置与 ShuffleNet V1 一样。本文对比的网络架构分别是 ShuffleNet V1,MobileNet V2,Xception,DenseNet。具体结果如下表所示:

表 6:大模型的结果。

表 7:ShuffleNet V2 在 COCO 目标检测任务上的性能。输入图像大小是 800×1200。FLOPs 行列出了输入图像大小为 224×224 时的复杂度水平。至于 GPU 速度评估,批大小为 4。未测试 ARM,因为 [34] 中所需的 PSRoI 池化操作目前在 ARM 上不可行。

表 8:多个网络架构在两个平台、四个计算复杂度级别上的(验证集、单中心裁剪)分类误差和速度对比。为方便起见,结果按照复杂度级别分组。GPU 的批大小是 8,ARM 的批大小是 1。除了 [*] 160 × 160 和 [**] 192 × 192,图像大小均为 224×224。由于目前缺少高效实现,本文不提供 CondenseNets [16] 的速度测量结果。

5 结论

本文提出,网络架构设计应该考虑直接指标,比如速度,而不是间接指标,比如 FLOPs。更重要的是,本文还给出四个重要的实用设计准则,以及一个全新的架构——ShuffleNet V2,综合实验已经证实了其有效性。研究者希望本文的工作可以启迪未来的网络架构设计,更加具有平台意识,并朝着实用的方向发展。

论文:ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design

论文下载地址:https://pan.baidu.com/s/1so7aD3hLKO-0PB8h4HWliw

摘要:目前,神经网络架构设计主要由计算复杂度的间接指标(即 FLOPs)来指导。但是,直接指标(如速度)还依赖于其他因素,如内存访问成本和平台特点。因此,本文提出在目标平台上评估直接指标,而不是只考虑 FLOPs。基于一系列对比实验,本文得出多个高效、实用的网络设计准则,并据此得到了一个新的架构 ShuffleNet V2。综合对比实验证明了该模型在速度和精度的权衡方面达到当前最优水平。

理论ECCV 2018ECCV移动端轻量化旷视科技
4
相关数据
自动驾驶技术技术

从 20 世纪 80 年代首次成功演示以来(Dickmanns & Mysliwetz (1992); Dickmanns & Graefe (1988); Thorpe et al. (1988)),自动驾驶汽车领域已经取得了巨大进展。尽管有了这些进展,但在任意复杂环境中实现完全自动驾驶导航仍被认为还需要数十年的发展。原因有两个:首先,在复杂的动态环境中运行的自动驾驶系统需要人工智能归纳不可预测的情境,从而进行实时推论。第二,信息性决策需要准确的感知,目前大部分已有的计算机视觉系统有一定的错误率,这是自动驾驶导航所无法接受的。

范数技术

范数(norm),是具有“长度”概念的函数。在线性代数、泛函分析及相关的数学领域,是一个函数,其为向量空间内的所有向量赋予非零的正长度或大小。半范数反而可以为非零的向量赋予零长度。

池化技术

池化(Pooling)是卷积神经网络中的一个重要的概念,它实际上是一种形式的降采样。有多种不同形式的非线性池化函数,而其中“最大池化(Max pooling)”是最为常见的。它是将输入的图像划分为若干个矩形区域,对每个子区域输出最大值。直觉上,这种机制能够有效的原因在于,在发现一个特征之后,它的精确位置远不及它和其他特征的相对位置的关系重要。池化层会不断地减小数据的空间大小,因此参数的数量和计算量也会下降,这在一定程度上也控制了过拟合。通常来说,CNN的卷积层之间都会周期性地插入池化层。

激活函数技术

在 计算网络中, 一个节点的激活函数定义了该节点在给定的输入或输入的集合下的输出。标准的计算机芯片电路可以看作是根据输入得到"开"(1)或"关"(0)输出的数字网络激活函数。这与神经网络中的线性感知机的行为类似。 一种函数(例如 ReLU 或 S 型函数),用于对上一层的所有输入求加权和,然后生成一个输出值(通常为非线性值),并将其传递给下一层。

权重技术

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

分类数据技术

一种特征,拥有一组离散的可能值。以某个名为 house style 的分类特征为例,该特征拥有一组离散的可能值(共三个),即 Tudor, ranch, colonial。通过将 house style 表示成分类数据,相应模型可以学习 Tudor、ranch 和 colonial 分别对房价的影响。 有时,离散集中的值是互斥的,只能将其中一个值应用于指定样本。例如,car maker 分类特征可能只允许一个样本有一个值 (Toyota)。在其他情况下,则可以应用多个值。一辆车可能会被喷涂多种不同的颜色,因此,car color 分类特征可能会允许单个样本具有多个值(例如 red 和 white)。

超参数技术

在机器学习中,超参数是在学习过程开始之前设置其值的参数。 相反,其他参数的值是通过训练得出的。 不同的模型训练算法需要不同的超参数,一些简单的算法(如普通最小二乘回归)不需要。 给定这些超参数,训练算法从数据中学习参数。相同种类的机器学习模型可能需要不同的超参数来适应不同的数据模式,并且必须对其进行调整以便模型能够最优地解决机器学习问题。 在实际应用中一般需要对超参数进行优化,以找到一个超参数元组(tuple),由这些超参数元组形成一个最优化模型,该模型可以将在给定的独立数据上预定义的损失函数最小化。

张量技术

张量是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数,这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。其坐标在 维空间内,有 个分量的一种量,其中每个分量都是坐标的函数,而在坐标变换时,这些分量也依照某些规则作线性变换。称为该张量的秩或阶(与矩阵的秩和阶均无关系)。 在数学里,张量是一种几何实体,或者说广义上的“数量”。张量概念包括标量、矢量和线性算子。张量可以用坐标系统来表达,记作标量的数组,但它是定义为“不依赖于参照系的选择的”。张量在物理和工程学中很重要。例如在扩散张量成像中,表达器官对于水的在各个方向的微分透性的张量可以用来产生大脑的扫描图。工程上最重要的例子可能就是应力张量和应变张量了,它们都是二阶张量,对于一般线性材料他们之间的关系由一个四阶弹性张量来决定。

验证集技术

验证数据集是用于调整分类器超参数(即模型结构)的一组数据集,它有时也被称为开发集(dev set)。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

准确率技术

分类模型的正确预测所占的比例。在多类别分类中,准确率的定义为:正确的预测数/样本总数。 在二元分类中,准确率的定义为:(真正例数+真负例数)/样本总数

Alex网络技术

AlexNet是一个卷积神经网络的名字,最初是与CUDA一起使用GPU支持运行的,AlexNet是2012年ImageNet竞赛冠军获得者Alex Krizhevsky设计的。该网络达错误率大大减小了15.3%,比亚军高出10.8个百分点。AlexNet是由SuperVision组设计的,由Alex Krizhevsky, Geoffrey Hinton和Ilya Sutskever组成。

堆叠技术

堆叠泛化是一种用于最小化一个或多个泛化器的泛化误差率的方法。它通过推导泛化器相对于所提供的学习集的偏差来发挥其作用。这个推导的过程包括:在第二层中将第一层的原始泛化器对部分学习集的猜测进行泛化,以及尝试对学习集的剩余部分进行猜测,并且输出正确的结果。当与多个泛化器一起使用时,堆叠泛化可以被看作是一个交叉验证的复杂版本,利用比交叉验证更为复杂的策略来组合各个泛化器。当与单个泛化器一起使用时,堆叠泛化是一种用于估计(然后纠正)泛化器的错误的方法,该泛化器已经在特定学习集上进行了训练并被询问了特定问题。

推荐文章
暂无评论
暂无评论~