论文原文
https://arxiv.org/pdf/1807.11164.pdf
介绍
我已经介绍过MobileNetV1,MobileNetV2,MobileNetV3,ShuffleNetV1这几个针对移动端设计的高效网络,ShuffleNetV2是ShuffleNetV1的升级版。接着我们就来看看这篇论文。论文首先说道,目前大部分的模型加速和压缩的论文在对比加速效果时的指标都是FLOPS,这个指标主要衡量的就是乘法指令的数量。而这篇论文提出,通过一系列实验发现FLOPS并不能完全衡量模型的速度,看下面的图©和图(d)。我们发现在FLOPS相同的情况下,速度却有较大的区别。所以接下来就针对相同FLOPS会出现速度差异的这个问题,做了一系列工程实验,并在ShuffleNetV1的基础上提出方法进行改善就得到了ShuffleNetV2了。
在这里论文提出内存访问消耗的时间是需要计算,这对速度影响比较大,但是很难在FLOPS指标中体现出来。这个指标是后续一些实验的优化目标,我下面就将每个实验独立出来翻译理解一下。
实验1
探索卷积层的输入输出特征通道数对MAC指标的影响。
实验结论是卷积层的输入和输出特征数相等时MAC最小,此时模型的速度最快。
这里的结论也可以由理论推导出来,如下:
假设一个11卷积层的输入特征通道数是c1,输出特征尺寸是h和w,输出特征通道数是c2,那么这样一个11卷积层的FLOPS就是 B=c1∗c2∗h∗w∗1∗1。
接下来看看存储空间,因为是1*1卷积,所以输入特征和输出特征的尺寸是相同的,这里用h和w表示,其中 hwc1表示输入特征所需要的存储空间, hwc2表示输出特征所需空间, c1c2表示卷积核所需存储空间。
MAC=hw(c1+c2)+c1c2,根据均值不等式推出:
MAC>=2hwB+hwB(1) 。再把MAC和B带入式子1就得到 (c1−c2)2>=0,因此等式成立的条件是c1=c2,也就是输入特征通道数和输出通道特征数相等时,在给定FLOPs前提下,MAC达到取值的下界。
实验2
探索卷积的group操作对MAC的影响。
实验结论是过多的group操作会增大MAC,从而使模型变慢。
Mobilenet,ShuffleNetV1,Xception都使用了深度可分离卷积,也就是分组卷积来加速模型,这是因为分组卷积可以大大减少FLOPS。
和前面一样,带group操作的1*1卷积的FLOPs如下所示,多了一个除数g,g表示group数量。这是因为每个卷积核都只和c1/g个通道的输入特征做卷积,所以多个一个除数g,即是:
B=hwc1c2/g,同理MAC为 MAC=hw(c1+c2)+gc1c2,这样就能得到MAC和B之间的关系了,如下面的公式所示,可以看出在B不变时,g越大,MAC就越大。
MAC=hw(c1+c2)+gc1c2=hwc1+c1Bg+hwB。
下面Table2是关于卷积的group参数对模型速度的影响,其中c代表c1+c2的和,通过控制这个参数可以使得每个实验的FLOPS相同,可以看出随着g的不断增大,c也不断增大,这和前面说的再基本不影响FLOPS的前提下,引入group操作后可以适当增加网络宽度吻合。
实验3
探索模型设计的分支数量对模型速度的影响。
实验结论是模型中的分支数量越少,模型速度越快。
论文用了fragment表示网络的支路数量。这次实验结果如下:
其中2-fragment-series表示一个block中有2个卷积层串行,也就是简单的重叠。而2-fragment-parallel表示一个block中有2个卷积层并行,类似于Inception的整体设计。可以看出在相同FLOPS的情况下,单卷积层(1-fragment)的速度最快。因此模型支路越多(fragment程度越高)对于并行计算越不利,导致模型变慢,在GPU上这个影响更大,在ARM上影响相对小一点。
实验4
探索element-wise操作对模型速度的影响。
实验结论是element-wise操作所带来的时间消耗远比在FLOPS上体现的数值要多,因此要尽可能减少element-wise操作。
在文章的开头部分的Fig. 2:
可以看到FLOPS主要表示的是卷积层的时间消耗,而ElementWise操作虽然基本不增加FLOPS,但是带来的时间消耗占比却不可忽视。
因此作者做了实验4,实验4是运行了10次ResNet的bottleneck来计算的,short-cut表示的就是element-wise操作。同时作者这里也将depthwise convolution归为element-wise操作,因为depthwise-wise convolution也具有低FLOPS,高MAC的特点。
ShuffleNetV2 bottleneck结构设计
这张图中的(a)和(b)是ShuffleNet V1的两种不同block结构,两者的差别在于(b)对特征图分辨率做了缩小。©和(d)是ShuffleNet V2的两种不同结构。从(a)和©对比可知©在开头增加了一个channel split操作,这个操作将输入特征通道数c分成了c-c’和c’,在论文中c’取c/2,这主要是为了改善实验1。然后©取消了11卷积层中的group操作,这主要为了改善实验2的结论,同时前面的channel split其实已经算是变相的group操作了。其次,channel shuffle操作移动到了concat操作,这主要为了改善实验3的结果,同时也是因为第一个11卷积层没有group操作,所以在其后面跟channel shuffle也没有太大必要。最后是将element-wise add操作替换成concat,这和前面的实验4的结果对应。b)和(d)的对比也是同理,只不过因为(d)的开始处没有channel split操作,所以最后concat后特征图通道数翻倍。
ShuffleNet V2网络结构
不同stage的输出通道倍数关系和上面介绍bottleneck吻合,每个stage都是由Figure3©和(d)所示的block组成,block的具体数量对应于Repeat列。
实验结论
从表中可以看到,ShuffleNet V2在速度和精度上对比众多轻量级网络都是State of Art。
总结
论文的构思很像我们在工作时解决问题的方式,先是分析影响模型的速度可能有哪些因素,然后针对这些因素做出一系列实验,最后针对这些实验提出解决方案,最后得出了这个网络。这种思路在整个开发过程中都是通用的。
代码实验
Caffe: https://github.com/anlongstory/ShuffleNet_V2-caffe
Keras: https://github.com/opconty/keras-shufflenetV2
参考文章
https://blog.csdn.net/u014380165/article/details/81322175
https://zhuanlan.zhihu.com/p/69286266