摘要
论文介绍一个效率极高的CNN架构ShuffleNet,专门应用于计算力受限的移动设备。新的架构利用两个操作:逐点群卷积(pointwise group convolution)和通道混洗(channel shuffle),与现有先进模型相比在类似的精度下大大降低计算量。在ImageNet和MS COCO上ShuffleNet表现出比其他先进模型的优越性能。
Introduction
现许多CNNs模型的发展方向是更大更深,这让深度网络模型难以运行在移动设备上,针对这一问题,许多工作的重点放在对现有预训练模型的修剪、压缩或使用低精度数据表示。
论文中提出的ShuffleNet是探索一个可以满足受限的条件的高效基础架构。论文的Insight是现有的先进basic架构如Xception
和ResNeXt。ResNeXt在小型网络模型中效率较低,因为大量的1×1卷积耗费很多计算资源,论文提出了逐点群卷积(pointwise group convolution)帮助降低计算复杂度;但是使用逐点群卷积会有副作用,故在此基础上,论文提出通道混洗(channel shuffle)帮助信息流通。基于这两种技术,我们构建一个名为ShuffleNet的高效架构,相比于其他先进模型,对于给定的计算复杂度预算,ShuffleNet允许使用更多的特征映射通道,在小型网络上有助于编码更多信息。
论文在ImageNet和MS COCO上做了相关实验,展现出ShuffleNet设计原理的有效性和结构优越性。同时论文还探讨了在真实嵌入式设备上运行效率。
方法
针对群卷积的通道混洗
现代卷积神经网络会包含多个重复模块。其中,最先进的网络例如Xception和ResNeXt将有效的深度可分离卷积或群卷积引入构建block中,在表示能力和计算消耗之间取得很好的折中。但是,我们注意到这两个设计都没有充分采用1×11×1的逐点卷积,因为这需要很大的计算复杂度。例如,在ResNeXt中3×3卷积配有群卷积,逐点卷积占了93.4%的multiplication-adds。
在小型网络中,昂贵的逐点卷积造成有限的通道之间充满约束,这会显著的损失精度。为了解决这个问题,一个直接的方法是应用通道稀疏连接,例如组卷积(group convolutions)。通过确保每个卷积操作仅在对应的输入通道组上,组卷积可以显著的降低计算损失。然而,如果多个组卷积堆叠在一起,会有一个副作用: 某个通道输出仅从一小部分输入通道中导出,如下图(a)所示,这样的属性降低了通道组之间的信息流通,降低了信息表示能力。
如果我们允许组卷积能够得到不同组的输入数据,即上图(b)所示效果,那么输入和输出通道会是全关联的。具体来说,对于上一层输出的通道,我们可做一个混洗(Shuffle)操作,如上图©所示,再分成几个组,feed到下一层。
对于这个混洗操作,有一个有效高雅(efficiently and elegantly)的实现:
对于一个卷积层分为g组,
- 有g×n个输出通道
- reshape为(g,n)
- 再转置为(n,g)
- 平坦化,再分回g组作为下一层的输入
这样操作有点在于是可微的,模型可以保持end-to-end训练.
shuffle unit
从图2 (a)中瓶颈单元的设计原理开始,构建了一个ShuffleNet unit,便于构建实际模型。
图(a)是一个残差模块,图(b)即ShuffleNet unit。对于主分支部分,我们可将:
-
第一个1×1卷积替换为逐点组卷积,再作通道混洗(即(b))。
-
主分支最后的1×1Conv改为1×1GConv
-
为了适配和恒等映射做通道融合。配合BN层和ReLU激活函数构成基本单元.
图(c)即是做降采样的ShuffleNet unit,这主要做了两点修改:
- 在shortcut分支加入步长为2的
3×3
平均池化
- 原本做元素相加的操作转为了通道级联,这扩大了通道维度,增加的计算成本却很少
归功于逐点群卷积和通道混洗,ShuffleNet unit可以高效的计算。相比于其他先进的单元,在相同设置下复杂度较低。
例如:给定输入大小h×w×c,通道数为c。对于的bottleneck通道为m:
- ResNet unit需要FLOPSS计算量。
- ResNeXt需要FLOPS
- 而ShuffleNet unit只需要FLOPS.
其中g代表组卷积数目。即表示:给定一个计算限制,ShuffleNet可以使用更宽的特征映射。我们发现这对小型网络很重要,因为小型网络没有足够的通道传递信息。
需要注意的是:虽然深度卷积可以减少计算量和参数量,但在低功耗设备上,与密集的操作相比,计算/存储访问的效率更差。故在ShuffleNet上我们只在bottleneck上使用深度卷积,尽可能的减少开销.
NetWork Architecture
在上面的基本单元基础上,我们提出了ShuffleNet的整体架构:
主要分为三个阶段:
- 每个阶段的第一个block的步长为2,下一阶段的输出通道翻倍
- 每个阶段内的除步长其他超参数保持不变
- 每个ShuffleNet unit的bottleneck通道数为输出的1/4(和ResNet设置一致)
这里主要是给出一个baseline。在ShuffleNet Unit中,参数g控制逐点卷积的连接稀疏性(即分组数),对于给定的限制下,越大的g
会有越多的输出通道,这帮助我们编码更多的信息。
定制模型需要满足指定的预算,我们可以简单的使用放缩因子s控制通道数,ShuffleNets×即表示通道数放缩到s倍。总体的复杂度大约会改变倍。
实验
实验在ImageNet的分类集上做评估,大多数遵循ResNeXt的设置,除了两点:
- 权重衰减从1e-4降低到了4e-5
- 在数据预处理中使用稍微不那么咄咄逼人的比例增强
这样做的原因是小型网络在训练过程通常会遇到欠拟合而不是过拟合问题。
消融实验
the Importance of Pointwise Group Convolutions
为了评估逐点卷积的重要性,比较相同复杂度下组数从1到8的ShuffleNet模型,同时我们通过放缩因子s控制网络宽度,扩展为3种:
从结果来看,有组卷积的一致比没有组卷积(g=1g=1)的效果要好。注意组卷积可允许获得更多通道的信息,我们假设性能的收益源于更宽的特征映射,这帮助我们编码更多信息。并且,较小的模型的特征映射通道更少,这意味着能从特征映射上获取多的收益。
表2还显示,对于一些模型,随着g增大,性能上有所下降。意味组数增加,每个卷积滤波器的输入通道越来越少,损害了模型表示能力。
值得注意的是,对于小型的ShuffleNet 0.25×,组数越大性能越好,这表明对于小模型更宽的特征映射更有效。受此启发,在原结构的阶段3删除两个单元,即表2中的
arch2
结构,放宽对应的特征映射,明显新的架构效果要好很多.
Channel Shuffle vs. No Shuffle
Shuffle操作是为了实现多个组之间信息交流,下表表现了有无Shuffle操作的性能差异:
在三个不同复杂度下带Shuffle的都表现出更优异的性能,尤其是当组更大(arch2,g=8),具有shuffle操作性能提升较多,这表现出Shuffle操作的重要性。
Comparison with Other Structure Units
我们对比不同unit之间的性能差异,使用表1的结构,用各个unit代替阶段2-4之间的Shuffle unit,调整通道数保证复杂度类似。
可以看到ShuffleNet的表现是比较出色的。有趣的是,我们发现特征映射通道和精度之间是存在直观上的关系,以38MFLOPs为例,VGG-like, ResNet, ResNeXt, Xception-like, ShuffleNet模型在阶段4上的输出通道为50, 192, 192, 288, 576,这是和精度的变化趋势是一致的。我们可以在给定的预算中使用更多的通道,通常可以获得更好的性能。
上述的模型不包括GoogleNet或Inception结构,因为Inception涉及到太多超参数了,做为参考,我们采用了一个类似的轻量级网络PVANET。结果如下:
Comparison with MobileNets and Other Frameworks
相比于不同深度的模型对比,可以看到我们的模型要比MobileNet的效果要好,这表明ShuffleNet的有效性主要来源于高效的结构设计,而不是深度。
简单的架构设计使其很容易装备最新的先进技术,我们发现SE模块也会与shuffle net主干相结合起作用。
有趣的是,虽然理论上复杂度的增加可以忽略,但我们发现带有SE模块的ShuffleNet通常要比移动设备上的“原始”ShuffleNet慢25% ~ 40%,这意味着对低成本架构设计的实际加速性能评估至关重要。
与其他模型对比:
Generalization Ability
我们在MS COCO目标检测任务上测试ShuffleNet的泛化和迁移学习能力,以Faster RCNN为例:
ShuffleNet的效果要比同等条件下的MobileNet效果要好,我们认为收益源于ShuffleNet的设计。
Actual Speedup Evaluation
评估ShuffleNet在ARM平台的移动设备上的推断速度。三种分辨率输入做测试,由于内存访问和其他开销,原本理论上4倍的加速降低到了2.6倍左右。
代码
- TensorFlow
- Caffe
参考
轻量级网络——ShuffleNet解读