前一篇文章《CNN 模型 ShuffleNet》介绍了一个高效的CNN模型ShuffleNet,通过分组卷积和Channel Shuffle运算提高了模型的效率。本文介绍了ShuffleNet的升级版本ShuffleNetV2。ShuffleNetV2详细探究了会影响模型效率的原因,提出了四个可以提高模型效率的准则,并基于这些准则对ShuffleNet进行了改进。
1.模型计算复杂度的度量
不同硬件下不同型号的速度、精度和最大速度之间的关系
FLOPs指的是浮点操作数,即计算量,是衡量模型计算复杂度的常用指标。但FLOPs不是直接指标,不能用来准确衡量两种模型的计算速度。例如,美孚ETV 2号和Nasnet-A型号采用相同的FLOPs,美孚ETV 2号比NASNET-A快得多
如上图所示,图A和C在GPU上训练,图B和D在ARM上训练。从图C和图D可以看出,在相同的FLOPs下,不同模型的计算速度有很大的不同。ShuffleNetV2的作者认为造成这种差异的主要原因有两个:
有很多影响速度的因素是FLOPs没有考虑到的,比如MAC内存访问成本)和模型并行性。在包卷积中,MAC的成本占运行成本的很大一部分。对于GPU这样计算能力强的硬件来说,这个成本会比较大,所以不能简单忽略。此外,模型的并行性也是影响速度的重要因素。在相同的FLOPs下,高并行度的模型速度更快。同样的FLOPs在不同的硬件GPU、ARM)上运行速度是不一样的,不同的计算库也会影响速度比如CUDNN的不同版本)。因此,ShuffleNetV2的作者认为在设计模型结构时应该遵循以下两个原则:
你应该使用直接测量速度)而不是间接测量FLOPs)。需要在不同的硬件平台上进行评估。下图是Mobilene ETV 2和ShuffleNet在不同硬件平台上的时间成本图。
ShuffleNet和Mobilene ETV 2在不同平台上的时间共享
00-1010作者通过实验得到了四条提高模型效率的有用准则。
2.1 G1:相同的通道数可以降低MAC。
给定11卷积层,其输入维数为c1,输出维数为c2,特征图大小为H W,其对应的FLOPs为:
FLOPs计算公式
卷积对应的MAC值包括输入输出特征图和卷积核权重。在内存充足的前提下,MAC的值为:
媒体访问控制计算公式
是b FLOPs的值,我们固定b的值即保证模型FLOPs相同)。根据平均不等式,可以得到以下公式。不等式只在c1=c2时得到最小值,即输入输出通道相同时,MAC为最小值:
媒体访问控制的下限
作者还用实验验证了c1和c2比值对速度的影响。结果如下表所示。在实验中,作者保持了模型的FLOPs一致。可以看出,c1=c2时模型最快。
G1实验
2.2 G2:过多的数据包卷积会增加MAC
组卷积用于ShuffleNet和MobileNet,因为它可以减少模型的FLOPs,但是当FLO
Ps 值固定时,分组 g 越多,MAC 也会越大。分组卷积的 FLOPs 计算公式如下:
当 FLOPs 值固定,输入的 feature map 尺寸固定 c1×h×w 时,MAC 与分组数量 g 成正比,如下所示:
作者用实验验证了在 FLOPs 固定的情况下,分组数量 g 对于模型速度的影响,结果如下表所示,可以看到 g=1 时模型比较快。
2.3 G3: 模型碎片化会降低并行度
在 GoogleNet、NASNET-A 等网络中采用了不少多路结构,在一个 Block 里面包含很多小的操作,例如多个小的卷积操作或者池化操作。虽然这种碎片化的结构对于模型准确性有利,但是会降低效率,因为它对于具有具有强大的并行计算能力的设备不友好,例如GPU。
作者通过实验验证了碎片化结构对模型速度的影响,实验中保持各模型 FLOPs 值相同,结果如下表所示。
2.4 G4: 元素操作是不可忽略的
模型中的一些元素级操作 element-wise operators) 通常 FLOPs 值不大,但是 MAC 值却比较大,常见的元素级操作包括 ReLU、Add 等。作者使用 ResNet 中的 bottleneck 单元进行实验,发现移除 ReLU 和 shortcut 后可以提高 20% 的速度,实验结果如下表所示。
3.ShuffleNetV2
根据上面提到的四种实践指导准则,我们可以发现 ShuffleNet 和 MobileNetV2 中存在的问题。其中 ShuffleNet 存在的问题:
使用了大量的分组卷积,违反了 G2。使用了 bottleneck 结构,即输入、输出 channel 大小不一样,违反了 G1。
MobileNetV2 存在的问题:
使用了 bottleneck 结构,违反了 G1。在 feature map 上使用了 depthwise 卷积和 ReLU,违反了 G4。
下图展示了 ShuffleNetV2 的结构,其中图 a 是 ShuffleNet,图 b 是进行下采样 即设置 stride,减小 feature map 的尺寸) 的 ShuffleNet,图 c 是 ShuffleNetV2,图 d 是进行下采样的 ShuffleNetV2。
ShuffleNetV2 使用了一种新的操作 channel split,如上图 c 所示。channel split 会把原始通道数 c 拆成两个部分 c-c’ 和 c’,根据原则 G3,其中一个分支保持不变,另一个分支包含三个卷积操作,这些卷积操作输入输出的通道数是一样的,保证 G1 满足。
ShuffleNetV2 中的 1×1 卷积不再分组,一方面这满足了 G2,另一方面 channel split 操作本身就已经将通道分为了两组。经过卷积之后,ShuffleNetV2 会将两个分支拼接在一起 concat),而不是采用 Add 操作,从而减少元素级操作,满足 G4。最后 ShuffleNetV2 再用 channel shuffle 混合通道。
ShuffleNetV2 的整体结构如下表:
4.实验效果
5.参考文献
ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design