简介

ShuffleNet V2是对ShuffleNet V1的改进,是关于模型压缩和加速的文章。目前大部分关于模型加速和压缩的文章对比加速时的效果都是FLOPs,这个指标主要衡量的就是卷积层的乘法操作。但是具有相似网络特征的FLOPs有不同的速度,因此,仅仅使用FLOPs来作为计算复杂度的唯一指标是不够的。下图©(d)中相同的MFLOPs的网络实际速度差别却很大,说明以FLOPs作为指标是有问题的。
ShuffleNet V2论文记录
间接(FLOPs)和直接(speed)指标差异主要有两个原因。(1)内存访问消耗时间(MAC),比如组卷积开销占了运行时的很大一部分,可能会成为计算能力强的设备(如GPU)的瓶颈。另一个是并行度,相同FLOPs情况下,一个并行度高的模型可能比并行度低的模型快的多。(2)根据平台的不同,使用相同的FLOPs操作可能会有不同的运行时间。
有效的网络架构设计应该考虑两个原则:(1)使用直接度量(如速度),而不是间接度量(如FLOPs)。(2)应该在目标平台上评估这些度量。
为什么FLOPs相同的模型速度差别会这么大?接下来的四个实验一次介绍所要证明的内容。

G1

第一个实验是关于卷积层的输入输出特征通道数对MAC的影响。结论是卷积层的输入和输出特征通道数相等时MAC最小,此时的模型速度最快
假设一个1 * 1卷积层的输入特征通道数是C1,输出特征通道数是C2,输出特征尺寸是h和w,这样一个1 * 1的卷积层的FLOPs就是下式,这里省略了1 * 1.
ShuffleNet V2论文记录
接下来看存储空间,因为是1 * 1卷积,所以输入特征和输出特征的尺寸是相同的,这里用h和w表示,其中hwc1表示输入特征所需存储空间,hwc2表示输出特征所需存储空间,c1c2表示卷积核所需存储空间。
ShuffleNet V2论文记录
根据均值不等式可以得到下面的式子,将MAC和B带入公式,就得到c1-c2的差的平方大于等于0,因此等式成立的条件是c1=c2,也就是说当输入输出通道数相等时,在给定FLOPs前提下,MAC达到取值的下界。
ShuffleNet V2论文记录
因此有了下面这个实验,这些实验由10个block组成,每个block包含两个1 * 1卷积层,第一个卷积层的输入输出通道分别是c1和c2,第二个卷积层相反。下图结果分别表示不同的c1:c2比例,但是每种比例的FLOPs都是相同的,可以看出在c1和c2比例接近1:1时的速度最快,这与前面介绍的c1和c2相等时MAC达到最小值对应。
ShuffleNet V2论文记录

G2

第二个实验是关于卷积的group操作对MAC的影响。结论是过多的group操作会增大MAC,从而使模型速度变慢。
group卷积通过将所有信道之间的稠密卷积变为稀疏(仅在信道组内)来降低计算复杂度(FLOPs),它允许使用更多通道,并增加网络的容量(因此有更好的准确性),通道数的增加导致更多的MAC,过多的群卷积会增加MAC。
像ShuffleNet,Xception其实都借鉴了卷积的group操作来加速模型,因为group操作可以大大减少FLOPs,因此即便适当加宽网络也不会使得FlOPs超过原来不带group的卷积操作,这样就能带来明显的效果提升。但是FLOPs不怎么增加不代表速度变快,例如相同层数的ResNet和ResNeXt,ResNeXt的速度要慢很多,差不多只有ResNet速度的一半,但是相同层数的ResNeXt的参数量和FLOPs都和ResNet差不多,所以引出了group操作对速度带来的问题。
带group操作的1 * 1卷积的FLOPs如下所示,g表示group数量。这是因为每个卷积核都只和c1/g个通道的输入特征做卷积,所以多一个除数g。
ShuffleNet V2论文记录

和前面不同的是这里卷积核的存储量多了一个除数g。
这样可以得到MAC和B之间的关系,如下图公式所示,可以看出在B不变时,g越大,MAC也越大
ShuffleNet V2论文记录
下面实验时验证卷积的group操作对速度的影响,其中c表示c1+c2的和,通过控制这个参数可以使得每个实验的FLOPs相同,可以看出随着g的增大,c也在不断增大,和前面说的在基本不影响FLOPs的前提下,引入group操作后可以适当增加网络宽度吻合。从速度上看,group数量的增加对速度的影响比较大,原因就是group数量的增加带来MAC的增加,而MAC的增加带来速度的降低。

ShuffleNet V2论文记录

G3

第三个实验是关于模型设计的分支数量对模型速度的影响。结论是模型中的分支数量越少,模型速度越快
fragment简单理解为网络的支路数量,为了研究fragment对模型的影响,作者做了下面这个实验。其中2-fragment-series表示一个block中有2个卷积层串行,也就是简单的叠加。4-fragment-parallel表示一个block中有4个卷积层并行,类似Inception结构设计。可以看出在相同FLOPs情况下,单卷积层(1-fragment)的速度最快。因此模型支路越多对于模型计算越不利,这样带来的影响就是模型速度变慢。ShuffleNet V2论文记录

G4

第四个实验是关于element-wise操作对模型速度的影响,结论是element-wise操作带来的时间消耗远比在FLOPs上体现的数值要多,因此要尽可能减少element-wise操作
虽然element-wise类型的操作FLOPs比较低,但是带来的时间消耗还是非常明显的。比如下图作者对ShuffleNet V1和MobileNet V2的几种层操作的时间消耗做了分析,常用的FLOPs指标其实主要表示的是卷积层的操作,而element-wise操作虽然基本上不增加FLOPs,但是带来的时间消耗也不能忽视。
ShuffleNet V2论文记录
因此做了实验四是基于ResNet的bottleneck进行的,short-cut其实表示的就是element-wise操作。这里作者也将depthwise convolution归为element-wise操作,因为depthwise convolution也具有低FLOPs,高MAC的特点。
ShuffleNet V2论文记录

ShuffleNet V2结构

下图是ShuffleNet V1和ShuffleNet V2的结构对比,其中(a)和(b)是ShuffleNet V1的两种不同block结构,后者对特征图做了尺寸缩小。(c)和(d)是ShuffleNet V2的两种不同的block结构。从(a)和(c)的对比可以看出首先(c)在开始出增加了一个channel spilt操作,在开始时将输入特征通在通道维度上分成两个分支,通道数分别为c‘和c-c’,实际使用时c‘=c/2,左边分支做同等映射,右边分支包含3个连续的卷积,并且输入和输出的通道数相同,符合G1。两个1 * 1卷积不是组卷积,符合G2。两个分支相当于已经分成两组,两个分支的输出不再是Add操作,而是concat在一起。紧接着对两个分支concat结果进行channel shuffle,保证两个分支的信息交流。对于下采样模块,没有channel spilt,而是每个分支都是直接copy一份输入,每个分支都有stride=2的下采样,最后concat在一起后,特征图空间大小减半,但是通道数翻倍。
ShuffleNet高效的原因:(1)每个构建块的高效率使得可以使用更多的特征信道和更大的网络容量。(2)在每个块中,有一半的通道直接通过块并加入下一块,可以看作是特征重用(如DenseNet)。
ShuffleNet V2论文记录
下图是ShuffleNet V2的整体结构示意图。与ShuffleNet V1不同的是,ShuffleNet V2在平均池化层之前增加了1 * 1的卷积来混合特征,ShuffleNet V1没有。ShuffleNet V2论文记录

实验结果

下图是关于一些模型在速度,精度,FLOPs上的详细对比。可以看出在同等条件下,ShuffleNet V2相比其他模型速度较快,而且准确度也稍好一点。同时作者还设计了大的ShuffleNet V2网络,相比于ResNet结构,其效果照样具有竞争力。
ShuffleNet V2论文记录
从一定程度上说,ShuffleNet V2借鉴了DenseNet网络,把shortcut结构从Add换成concat,这实现了特征重用。但是不同于DenseNet,ShuffleNet V2不是密集的concat,而且concat之后有channel shuffle以混合特征,这是ShuffleNet既快又好的重要原因。
本文借鉴了几位优秀的博主,让我对这篇论文有了更加深入的了解

相关文章: