论文名称:ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices
论文下载:https://arxiv.org/abs/1707.01083
论文年份:2017
论文被引:3925(2022/05/11)
论文代码:https://github.com/tensorpack/tensorpack/tree/master/examples/ImageNetModels,https://github.com/open-mmlab/mmpose
为了将卷积神经网络应用于嵌入式设备,本文基于逐点分组卷积和通道混洗模块的新型架构——ShuffleNet。ShuffleNet 允许更多的特征图通道,这有助于编码更多信息,对非常小的网络的性能尤其重要
We introduce an extremely computation-efficient CNN architecture named ShuffleNet, which is designed specially for mobile devices with very limited computing power (e.g., 10-150 MFLOPs). The new architecture utilizes two new operations, pointwise group convolution and channel shuffle, to greatly reduce computation cost while maintaining accuracy. Experiments on ImageNet classification and MS COCO object detection demonstrate the superior performance of ShuffleNet over other structures, e.g. lower top-1 error (absolute 7.8%) than recent MobileNet [12] on ImageNet classification task, under the computation budget of 40 MFLOPs. On an ARM-based mobile device, ShuffleNet achieves ∼13× actual speedup over AlexNet while maintaining comparable accuracy.
我们引入了一种计算效率极高的 CNN 架构,名为 ShuffleNet,它专为计算能力非常有限(例如 10-150 MFLOPs)的移动设备而设计。新架构利用两个新操作,逐点组卷积和通道混洗 (shuffle),在保持准确性的同时大大降低了计算成本。 ImageNet 分类和 MS COCO 对象检测的实验证明了 ShuffleNet 优于其他结构的性能,例如在 40 MFLOPs 的计算预算下,在 ImageNet 分类任务上的 top-1 错误(绝对 7.8%)低于最近的 MobileNet [12]。在基于 ARM 的移动设备上,ShuffleNet 比 AlexNet 实现了 ~13 倍的实际加速,同时保持了相当的准确性。
构建更深、更大的卷积神经网络 (CNN) 是解决主要视觉识别任务的主要趋势 [21, 9, 33, 5, 28, 24]。最准确的 CNN 通常具有数百层和数千个通道 [9, 34, 32, 40],因此需要数十亿次 FLOP 的计算。本报告探讨了相反的极端:在非常有限的计算预算中以数十或数百 MFLOP 追求最佳精度,重点关注无人机、机器人和智能手机等常见移动平台。请注意,许多现有的工作 [16, 22, 43, 42, 38, 27] 专注于修剪、压缩或以低bit表示“基本”网络架构。在这里,我们旨在探索一种专门为所需的计算范围设计的高效基本架构。
我们注意到,由于昂贵的密集 1×1 卷积,Xception [3] 和 ResNeXt [40] 等最先进的基本架构在极小的网络中效率降低。我们建议使用逐点组卷积 (Group Conv) 来降低 1 × 1 卷积的计算复杂度。为了克服组卷积带来的副作用,我们提出了一种新颖的通道混洗 (Channel Shuffle) 操作来帮助信息在特征通道之间流动。基于这两种技术,我们构建了一个称为 ShuffleNet 的高效架构。与 [30, 9, 40] 等流行结构相比,对于给定的计算复杂度预算,ShuffleNet 允许更多的特征图通道,这有助于编码更多信息,对非常小的网络的性能尤其重要。
我们在具有挑战性的 ImageNet 分类 [4, 29] 和 MS COCO 对象检测 [23] 任务上评估我们的模型。一系列对照实验显示了我们设计原则的有效性以及优于其他结构的性能。与最先进的架构 MobileNet [12] 相比,ShuffleNet 以显着的优势实现了卓越的性能,例如在 40 MFLOPs 级别,ImageNet top-1 错误绝对降低了 7.8%。
我们还检查了真实硬件的加速,即现成的基于 ARM 的计算内核。 ShuffleNet 模型在 AlexNet [21] 上实现了 ∼13 倍的实际加速比(理论加速比为 18 倍),同时保持了相当的精度。
高效的模型设计:过去几年,深度神经网络在计算机视觉任务中取得了成功 [21,36,28],其中模型设计发挥了重要作用。在嵌入式设备上运行高质量深度神经网络的需求不断增长,这鼓励了对有效模型设计的研究 [8]。例如,
与我们同时,最近的一项工作 [46] 采用强化学习和模型搜索来探索有效的模型设计。所提出的移动 NASNet 模型实现了与我们对应的 ShuffleNet 模型相当的性能(26.0% @ 564 MFLOPs vs. 26.3% @ 524 MFLOPs for ImageNet 分类错误)。但是 [46] 没有报告极小的模型(例如复杂度小于 150 MFLOPs)的结果,也没有评估移动设备上的实际推理时间。
分组卷积(Group Convolution):分组卷积的概念最初是在 AlexNet [21] 中引入的,用于将模型分布在两个 GPU 上,在 ResNeXt [40] 中已经很好地证明了它的有效性。 Xception [3] 中提出的深度可分离卷积概括了 Inception 系列 [34, 32] 中可分离卷积的思想。最近,MobileNet [12] 利用深度可分离卷积并在轻量级模型中获得了最先进的结果。我们的工作以一种新颖的形式概括了分组卷积和深度可分离卷积。
Channel Shuffle Operation:据我们所知,虽然 CNN 库 cuda-convnet [20] 支持“随机稀疏卷积”层,相当于随机通道shuffle 后跟一个分组卷积层。这种“随机混洗”操作有不同的目的,后来很少被利用。最近,另一项并发工作 [41] 也采用这种思想进行两阶段卷积。然而,[41] 并没有专门研究通道混洗本身的有效性及其在微型模型设计中的使用。
模型加速:这个方向旨在加速推理,同时保持预训练模型的准确性。
现代卷积神经网络 [30, 33, 34, 32, 9, 10] 通常由具有相同结构的重复构建块组成。其中,最先进的网络,如 Xception [3] 和 ResNeXt [40] 将有效的深度可分离卷积或组卷积引入构建块,以在表示能力和计算成本之间取得良好的平衡。然而,我们注意到两种设计都没有完全考虑到 1×1 卷积(在 [12] 中也称为逐点卷积),这需要相当大的复杂性。例如,在 ResNeXt [40] 中,只有 3×3 层配备了组卷积。因此,对于 ResNeXt 中的每个残差单元,逐点卷积占据 93.4% 的乘法加法(如 [40] 中建议的基数 = 32)。在微型网络中,昂贵的逐点卷积会导致有限数量的通道来满足复杂性约束,这可能会严重损害准确性。
为了解决这个问题,一个直接的解决方案是在 1 × 1 层上应用通道稀疏连接,例如组卷积。通过确保每个卷积只对相应的输入通道组进行操作,组卷积显着降低了计算成本。但是,如果多个组卷积堆叠在一起,则会产生一个副作用:来自某个通道的输出仅来自一小部分输入通道。图1 (a) 说明了两个堆叠组卷积层的情况。很明显,某个组的输出只与组内的输入有关。此属性会阻塞通道组之间的信息流并削弱表示。
如果我们允许组卷积从不同组中获取输入数据(如图 1 (b) 所示),输入和输出通道将完全相关。具体来说,对于上一层生成的特征图,我们可以先将每组中的通道划分为几个子组,然后将不同的子组馈入下一层中的每个组。这可以通过通道混洗操作有效而优雅地实现(图 1 ©):假设一个卷积层具有 g 个组,其输出具有 g × n 个通道;我们首先将输出通道维度重塑为 (g, n),转置然后将其展平作为下一层的输入。请注意,即使两个卷积的组数不同,该操作仍然有效。此外,channel shuffle 也是可微分的,这意味着它可以嵌入到网络结构中进行端到端训练。
Channel shuffle 操作使得构建具有多个组卷积层的更强大的结构成为可能。在下一小节中,我们将介绍一个具有通道混洗和组卷积的高效网络单元。
利用通道混洗操作,我们提出了一种专门为小型网络设计的新颖的 ShuffleNet 单元。我们从图2 (a) 中的瓶颈单元 [9] 的设计原理开始。
为简单起见,不会在第二个逐点层之后应用额外的通道混洗操作,因为它会产生可比较的分数。批量归一化 (BN) [15] 和非线性的使用与 [9, 40] 类似,只是我们没有按照 [3] 的建议在深度卷积之后使用 ReLU。对于 ShuffleNet 应用 stride 的情况,我们简单地做两处修改,见图 2 ©:
由于带有通道混洗的逐点组卷积,可以有效地计算 ShuffleNet 单元中的所有组件。与 ResNet [9](瓶颈设计)和 ResNeXt [40] 相比,我们的结构在相同设置下的复杂度更低。例如,给定输入大小 c × h × w 和瓶颈通道 m,ResNet 单元需要 hw(2cm + 9m^2) FLOP,ResNeXt 有 hw(2cm + 9m^2/g) FLOP,而我们的 ShuffleNet 单元只需要 hw(2cm /g + 9m) FLOPs,其中 g 表示卷积的组数。换句话说,给定计算预算,ShuffleNet 可以使用更广泛的特征图。我们发现这对于小型网络至关重要,因为小型网络通常没有足够数量的通道来处理信息。
此外,在 ShuffleNet 中,深度卷积仅在瓶颈特征图上执行。尽管深度卷积通常具有非常低的理论复杂度,但我们发现难以在低功耗移动设备上有效实现,这可能是由于与其他密集操作相比,计算/内存访问率更差。 [3] 中也提到了这种缺点,它有一个基于 TensorFlow [1] 的运行时库。在 ShuffleNet 单元中,我们有意仅在瓶颈上使用深度卷积,以尽可能地防止开销。
基于 ShuffleNet 单元,我们在表 1 中展示了整体 ShuffleNet 架构。所提出的网络主要由一组 ShuffleNet 单元组成,分为三个阶段。每个阶段的第一个构建块应用 stride = 2。一个阶段内的其他超参数保持不变,下一个阶段的输出通道加倍。与 [9] 类似,我们将每个 ShuffleNet 单元的瓶颈通道数设置为输出通道的 1/4。我们的目的是提供尽可能简单的参考设计,尽管我们发现进一步的超参数调整可能会产生更好的结果。
在 ShuffleNet 单元中,组数 g 控制逐点卷积的连接稀疏性。表 1 探索了不同的组数,我们调整了输出通道以确保总体计算成本大致不变(~140 MFLOPs)。显然,对于给定的复杂性约束,较大的组数会导致更多的输出通道(因此更多的卷积滤波器),这有助于编码更多的信息,尽管由于相应的输入通道有限,它也可能导致单个卷积滤波器的退化。在 4.1.1 节中,我们将研究这个数字在不同计算约束下的影响。
要将网络自定义为所需的复杂性,可以简单地在通道数量上应用比例因子 s。例如,我们将表 1 中的网络表示为“ShuffleNet 1×”,那么“ShuffleNet s×”表示将 ShuffleNet 1× 中的过滤器数量缩放 s 倍,因此总体复杂度大约是 ShuffleNet 1× 的 s^2 倍。
我们主要在 ImageNet 2012 分类数据集 [29, 4] 上评估我们的模型。我们遵循 [40] 中使用的大部分训练设置和超参数,但有两个例外:(i)我们将权重衰减设置为 4e-5 而不是 1e-4,并使用线性衰减学习率策略(从 0.5 降低)为 0); (ii) 我们在数据预处理中使用了稍微不那么激进的规模扩大。 [12] 中也引用了类似的修改,因为这样的小型网络通常会遭受欠拟合而不是过拟合。在 4 个 GPU 上训练一个模型进行 3×10^5 迭代需要 1 或 2 天,其批量大小设置为 1024。为了进行基准测试,我们比较了 ImageNet 验证集上的单次裁剪 top-1 性能,即裁剪 224×224 中心视图从 256× 输入图像和评估分类精度。我们对所有模型使用完全相同的设置,以确保公平比较。
ShuffleNet的核心思想在于pointwise group convolution和channel shuffle操作。在本小节中,我们分别评估它们。
为了评估逐点组卷积的重要性,我们比较了相同复杂度的 ShuffleNet 模型,其组数范围从 1 到 8。如果组数等于 1,则不涉及逐点组卷积,然后 ShuffleNet 单元变为“Xception-像” [3] 结构。为了更好地理解,我们还将网络的宽度缩放到 3 个不同的复杂度,并分别比较它们的分类性能。结果如表 2 所示。
从结果中,我们看到具有组卷积 (g > 1) 的模型始终比没有逐点组卷积 (g = 1) 的模型表现更好。较小的模型往往会从分组中受益更多。例如,对于 ShuffleNet 1×,最佳条目 (g = 8) 比对应项好 1.2%,而对于 ShuffleNet 0.5× 和 0.25×,差距分别变为 3.5% 和 4.4%。请注意,对于给定的复杂性约束,分组卷积允许更多的特征图通道,因此我们假设性能增益来自更广泛的特征图,这有助于编码更多信息。此外,较小的网络涉及更薄的特征图,这意味着它从扩大的特征图中受益更多。
表 2 还显示,对于某些模型(例如 ShuffleNet 0.5×),当组数变得相对较大(例如 g = 8)时,分类分数会饱和甚至下降。随着组数的增加(因此特征图更宽),每个卷积滤波器的输入通道变得更少,这可能会损害表示能力。有趣的是,我们还注意到,对于 ShuffleNet 等较小的模型,0.25× 较大的组数往往会始终如一地获得更好的结果,这表明更宽的特征图为较小的模型带来更多好处。
shuffle 操作的目的是为多个组卷积层启用跨组信息流。表 3 比较了 ShuffleNet 结构(例如,组数设置为 3 或 8)在有/没有通道 shuffle 的情况下的性能。评估是在三种不同的复杂程度下进行的。很明显,channel shuffle 不断提高不同设置的分类分数。特别是当组数相对较大时(例如 g = 8),具有通道混洗的模型明显优于对应的模型,这表明了跨组信息交换的重要性。
最近在 VGG [30]、ResNet [9]、GoogleNet [33]、ResNeXt [40] 和 Xception [3] 中领先的卷积单元在大型模型(例如 ≥ 1GFLOPs)中追求最先进的结果,但确实没有充分探索低复杂度的条件。在本节中,我们调查了各种构建块,并在相同的复杂性约束下与 ShuffleNet 进行了比较。
为了公平比较,我们使用如表 1 所示的整体网络架构。我们将阶段 2-4 中的 ShuffleNet 单元替换为其他结构,然后调整通道数以确保复杂度保持不变。我们探索的结构包括:
我们使用完全相同的设置来训练这些模型。结果如表 4 所示。在不同的复杂性下,我们的 ShuffleNet 模型明显优于大多数其他模型。有趣的是,我们发现特征图通道和分类精度之间存在经验关系。例如,在38个MFLOPs的复杂度下,VGG-like、ResNet、ResNeXt、Xception-like、ShuffleNet模型的Stage 4(见表1)的输出通道分别为50、192、192、288、576,这是一致的随着精度的提高。由于 ShuffleNet 的高效设计,我们可以为给定的计算预算使用更多的通道,因此通常会产生更好的性能。
请注意,上述比较不包括 GoogleNet 或 Inception 系列 [33, 34, 32]。我们发现为小型网络生成这样的 Inception 结构并非易事,因为 Inception 模块的原始设计涉及太多超参数。作为参考,第一个 GoogleNet 版本 [33] 有 31.3% 的 top-1 错误,代价是 1.5 GFLOP(见表 6)。更复杂的 Inception 版本 [34, 32] 更准确,但是,涉及显着增加的复杂性。最近,Kim 等人提出了一种名为 PVANET [19] 的轻量级网络结构,它采用 Inception 单元。我们重新实现的 PV ANET(输入大小为 224×224)具有 29.7% 的分类错误,计算复杂度为 557 MFLOPs,而我们的 ShuffleNet 2x 模型(g = 3)在 524 MFLOPs 中得到 26.3%(见表 6)。
最近提出的 MobileNets [12],主要关注移动设备的高效网络架构。MobileNet 从 [3] 中汲取了深度可分离卷积的思想,并在小型模型上实现了最先进的结果。表 5 比较了各种复杂程度下的分类分数。很明显,我们的 ShuffleNet 模型在所有复杂性方面都优于 MobileNet。尽管我们的 ShuffleNet 网络是专门为小型模型(< 150 MFLOPs)设计的,但我们发现它仍然比 MobileNet 更好,因为它具有更高的计算成本,例如以 500 MFLOPs 为代价,比 MobileNet 1× 准确 3.1%。对于较小的网络(~40 MFLOPs),ShuffleNet 比 MobileNet 高出 7.8%。请注意,我们的 ShuffleNet 架构包含 50 层,而 MobileNet 只有 28 层。为了更好地理解,我们还在 26 层架构上尝试了 ShuffleNet,方法是在第 2-4 阶段删除一半的块(参见表 5 中的“ShuffleNet 0.5×浅层(g = 3)”)。结果表明,较浅的模型仍然明显优于相应的 MobileNet,这意味着 ShuffleNet 的有效性主要来自其高效的结构,而不是深度。
表 6 将我们的 ShuffleNet 与一些流行的模型进行了比较。结果表明,具有相似精度的 ShuffleNet 比其他网络更有效。例如,ShuffleNet 0.5× 理论上比 AlexNet [21] 快 18 倍,分类分数相当。我们将在第 4.5 节评估实际运行时间。
还值得注意的是,简单的架构设计可以很容易地为 ShuffeNets 配备最新的进展,例如 [13, 26]。例如,在 [13] 中,作者提出了 Squeeze-and-Excitation (SE) 块,该块在大型 ImageNet 模型上实现了最先进的结果。我们发现 SE 模块也与主干 ShuffleNets 结合使用,例如,将 ShuffleNet 2× 的 top-1 error 提高到 24.7%(如表 5 所示)。有趣的是,虽然理论复杂度的增加可以忽略不计,但我们发现带有 SE 模块的 ShuffleNets 通常比移动设备上的“原始”ShuffleNets 慢 25 ∼ 40%,这意味着实际的加速评估对于低成本架构设计至关重要。在 4.5 节我们将做进一步的讨论。
为了评估迁移学习的泛化能力,我们在 MS COCO 对象检测任务上测试了我们的 ShuffleNet 模型 [23]。我们采用 Faster-RCNN [28] 作为检测框架,并使用公开发布的 Caffe 代码 [28, 17] 进行默认设置的训练。与 [12] 类似,模型在 COCO train+val 数据集上进行训练,不包括 5000 张小型图像,我们在小型集上进行测试。表 7 显示了在两种输入分辨率上训练和评估的结果的比较。将 ShuffleNet 2× 与复杂度相当的 MobileNet(524 与 569 MFLOPs)进行比较,我们的 ShuffleNet 2× 在两种分辨率上都大大超过了 MobileNet;我们的 ShuffleNet 1× 在 600× 分辨率上也取得了与 MobileNet 相当的结果,但复杂度降低了 ∼4×。我们推测,这一显著收益部分归功于 ShuffleNet 的简单架构设计,没有花里胡哨。
最后,我们在 ARM 平台的移动设备上评估 ShuffleNet 模型的实际推理速度。尽管具有较大组数(例如 g = 4 或 g = 8)的 ShuffleNets 通常具有更好的性能,但我们发现它在我们当前的实现中效率较低。根据经验,g = 3 通常在准确性和实际推理时间之间进行适当的权衡。如表 8 所示,测试使用了三种输入分辨率。由于内存访问和其他开销,我们发现每降低 4 倍的理论复杂度通常会在我们的实现中导致 ∼2.6 倍的实际加速。尽管如此,与 AlexNet [21] 相比,我们的 ShuffleNet 0.5 倍模型在可比的分类精度下仍然实现了 ∼13 倍的实际加速比(理论加速比为 18 倍),这比之前的 AlexNet 级模型或加速方法(如 [14)要快得多, 16, 22, 42, 43, 38]。