ShuffleNet V2论文解读


摘要

论文地址:https://arxiv.org/pdf/1807.11164.pdf
作者:Face++
概述:论文指出现在的网络通常使用间接量来度量计算复杂度(例如FLOPs),然而实际的运行时间受到很多其他因素的影响例如内存访问开销(memory access cost)和平台的特性,如下图所示,同样的FLOPs却有着截然不同的运行速度

ShuffleNet v2 Fig1.png

直接度量(speed)和间接度量(FLOPs)之间的差距在于主要存在于

(1)许多其他的因素也会影响运行的速度,这是FLOPs不能考虑到的,比如内存访问开销(MAC),分组卷积就会有着非常高的MAC;另一个常见因素是网络的并行程度,在相同FLOPs的条件下,并行度高的网络要比低的网络速度更快
(2)平台的不同,相同的FLOPs在不同的平台上可能有着不同的运行时间,我们不能简单地认为卷积的运行时间就是卷积的九倍

于是文章提出了在设计高效网络时的两个准则

(1)采用直接的度量方式(例如speed),而不是间接地
(2)要在目标平台上进行估计


网络设计准则

采用的硬件设施:
 GPU ———— NVIDIA GeForce GTX 1080Ti + cuDNN 7.0
 ARM ———— 高通骁龙810

实验可得,FLOPs并不是一个能足够精确估计实际时间的度量


ShuffleNet v2 Fig2.png

G1 相同通道数能够减小内存访问开销

首先对depthwise separable convolutions中的卷积进行分析,一次卷积的FLOPs为 ,由此计算,然后利用均值不等式可得

然后将带入可得到结论,当输入输出通道数相等时,MAC最小

ShuffleNet v2 Tab1.png

当输入输出通道数相同时,MAC最小,运行速度更快,因此网络设计时,应尽可能地使输入输出通道数之比尽可能等于1

G2 过多的组卷积增加MAC

分组卷积大大减少了计算复杂度(FLOPS),也能够增加网络容量,但随之带来的是MAC的增加,分组卷积的MAC

其中是组卷积的个数,FLOPs为,容易得出,给定输入和计算量,随着的增加而增加

ShuffleNet v2 Tab2.png

组卷积的使用建议:具体的分组数要根据实际的目标平台和任务来选择,单纯的因为组卷积能够增加通道数从而较为容易的增加准确度而使用大量的组卷积是不明智的选择

G3 网络的分支会影响并行程度

尽管多分支结构的网络能够提高准确度,但是对并行计算能力不强的GPU来说,会大大减小运行效率。为了量化网络分支如何影响网络运行效率,作者对一系列具有不同程度的网络块(blocks)进行了评估,如下图所示


ShuffleNet v2 App1.png
ShuffleNet v2 Tab3.png

网络的分支数增加会减慢网络运行速度

G4 Element-wise操作并不能忽略

ShuffleNet v2 Fig2.png

如图2所示,element-wise操作占据了相当大一部分时间,尤其是在GPU上,这些操作包括:ReLUAddTensorAddBias等等。它们都有着较小的FLOPs但却有较大的MAC,应该将depthwise convolution也视为一种element-wise操作因为它也有着较高的
比率
ShuffleNet v2 Tab4.png

移除ReLU和shortcut,网络速度提高了20%

结论

通过上述的分析,我们得出了一个高效的网络结构应该尽可能的根据如下原则去设计

(1)使用 balanced 卷积(即输入输出通道数相同)
(2)小心使用组卷积来防止大的内存开销
(3)减少网络的分支
(4)减少 element-wise 操作


ShuffleNet V2:全新高效的网络结构

Review of ShuffleNet v1

ShuffleNet v2 Fig3.png

为了增加通道数但又不显著增加FLOPs,主要有以下两种方法:(1)pointwise group convolution;(2)bottleneck-like structures 。然而以上两种方法都会增加MAC(G1 G2),尤其是在轻量级的网络中。此外,使用太多的组卷积违背了 G3 原则。shortcut中的逐个元素的 “+”操作也不可忽视(G4

实现高容量且高效率模型的关键在于如何既不使用 dense convolution(通过增加输出卷积核数目来增加通道数) 也不使用过多 组卷积 来保证通道数目多且等宽

ShuffleNet V2

ShuffleNet v2 Fig3(c).png

基于上述启发,提出了一种名为 channel split 的操作。如图3(c)所示(上图),输入特征通道被分为两个分支和,符合 G3 ,一个分支保留自身映射,另一个分支包含三个有着相同输入输出的通道来满足 G1 ,两个卷积不再是组卷积,部分符合 G2 原则,之所以说部分符合是因为分离操作已经产生了两个组。经过卷积层后,两个分支开始进行融合,通道数保持不变(G1),然后经过 Channel Shuffle 层,一个单元结束。
在shuffling之后,下个单元开始,注意在ShuffleNet v1中 Add 操作不复存在,ReLUdepthwise convolution只存在于一个分支。而且,三个连续的逐个元素操作 “Concat” “Channel Shuffle” 以及 “Channel Split”合并为一个 element-wise操作,根据G4,这些改变有利于提高网络效率。

ShuffleNet v2 Fig3(d).png

完整的网络结构是由上述blocks堆叠而成,简单起见,设置,整体的网络结构与ShuffleNet相似,有一个不同之处在于后加入了一个额外的卷积层用于融合特征。

ShuffleNet v2 Tab5.png

ShuffleNet v1和ShuffleNet v2网络对比

ShuffleNet v2 Fig3_1.png

你可能感兴趣的:(ShuffleNet V2论文解读)