论文链接:https://pan.baidu.com/s/1so7aD3hLKO-0PB8h4HWliw
目前,神经网络结构大多数都是以计算复杂度(FLOPS)作为间接度量标准来指导设计的,然而,实际上一个网络模型的训练或推理过程Flops等计算复杂度也只是其影响其整体效率的一个因素,其它像内存读写/外部数据IO操作、平台特性等都会对整体的实际运行效率产生影响。为实际生产考虑,我们不应只限于去片面追求理论Flops的减少,更应该去看所设计的网络实际部署在不同类型芯片上时却具有的实际时间消耗。基于一系列可控实验,我们的工作对于高效网络设计提出了几个实用的建议,由此一个新结构ShuffleNet V2就诞生了,同时我们通过实验也证明了我们的模型在速度和准确率之间取得了很好的平衡。
在神经网络设计过程中,除了精度,计算复杂度是另一个很重要的因素。真实世界的任务往往都是在一个计算力预算下追求最好的精确度,这刺激了一系列在模型精确度和更好的速度间取得平衡的工作,组卷积和深度卷积在其中发挥了重要的作用。
为了衡量计算复杂度,一个广泛使用的度量标准是浮点运算的次数-FLOPS,然而FLOPS是一个间接的指标,它通常和我们真正关心的直接度量标准(比如速度或延迟)并不完全等价,在以前的很多工作中都已经注意到了这点,举个例子,MobileNet v2 和 NASNET-A 的计算复杂度相近,但是MobileNet v2要比NASNET-A快很多,这种现象如Figure1中©和(d)所示,相近计算复杂度的网络仍然有不同的速度。因此,仅仅使用FLOPS作为计算复杂度的唯一度量标准是远远不够的,它可能会导致一个次优设计。
间接指标和直接指标之间的差异可以归结为两个原因:
在这些观察下,我们提出了两个在高效神经网络结构设计中需要考虑的原则。首先,直接度量标准(速度)替代间接度量标准(FLOPS);其次,应该选择同一种目标平台进行评估。
在本文的工作中,我们遵从了上面说的两个原则,并且提出了一种更高效的网络结构。在Section 2中,我们首先分析了两种代表性的网络结构运行时间的表现;接着我们提出了针对高效网络结构设计的四个指导意见,而不仅仅考虑FLOPS,这些指导意见是与平台无关的,我们在两种不同的平台上(GPU和ARM)上进行了一系列可控制的实验来验证我们的指导意见是合理的,并且做了代码优化来确保我们的结论是最先进的。
在Section 3中,根据上面的四个指导建议,我们设计了一种新型的网络结构ShuffleNet V2,它在两个平台上都展示出了相比先前的网络更快的速度和更高的准确率。通过在Section 4中的压缩验证实验,Figure 1 (a)(b)给了一个压缩的观点,举个例子,在给定40MFLOPS的计算预算下,ShuffleNet v2要比ShuffleNet v1和MobileNet v2的准确率分别高3.5%和3.7%。
我们的研究是在两个广泛应用的硬件系统上进行的,我们注意到我们的CNN库比其他开源的CNN库更高效,因此确保了我们的观察结果和结论是坚实且重要的。
一些相关设置:
我们选取MobileNet v2和ShuffleNet v1作为代表型的网络结构进行分析,整体的运行时间被分解为不同操作所占用的时间集合(Figure 2所示),我们注意到FLOPS度量仅仅代表的是卷积部分,虽然这部分占比很大,但是其他部分,诸如数据I/0、数据清洗、元素级操作(张量相加、ReLU等)也应该被考虑。基于这样的观察结果,我们对运行时间从不同层面进行了细节化的分析,并且提出了几条实用性的指导建议。
G1) 输入输出通道数相同时,内存访问成本(MAC)最小化
现在的网络中经常采用深度分离卷积,其中逐点卷积占据了整个计算复杂度的百分之九十多。我们研究 1x1 卷积,假定输入通道数和输出通道数分别为 c1和 c2, h 和 w分别为feature map的尺寸,那么 1x1 卷积操作的FLOPS为 B = hwc1c2 。
为了简单化,我们假定计算设备中的缓存足够大可以存储整个特征图和参数,因此内存访问成本为 MAC = hw(c1 + c2) + c1c2。
根据均值定理,有:
MAC的下界由FLOPS,即B给定,当且仅当c1 = c2时(输入和输出通道数相同),不等式取等号。这个结论是理论上的,实际中许多设别上的缓存并不总是足够大,现代计算库经常采用块策略来充分利用缓存机制,因此真实的MAC和理论上是由区别的。为了验证我们的结论,我们设计了基准测试实验,重复堆叠10个块,每个块包含两个卷积层,第一个卷积层的输入输出通道分别为c1和c2,或者第二个卷积层这样设置,得到下图的实验结果:
G2) 过多的分组卷积会加大内存访问成本(MAC)
分组卷积是现代神经网络结构的一个核心结构,它通过将各通道间的密集卷积转变为稀疏结构大大降低了计算复杂度(FLOPS)。一方面,它允许在固定FLOPS下使用更多的通道进而提升网络的性能;另一方面,通道数的增加导致MAC的增加。
我们继续使用G1中有关参数符号的声明,对于 1x1 的分组卷积来说 B = hwc1c2/g,其MAC为:
给定FLOPS下,内存访问成本会随着分组数g的增加而增加。为了验证这个结论,我们设计了一个基准测试网络,由10个逐点分组卷积层堆叠而成,table2展示了在给定整体FLOPS下不同分组的运行速度。
G3) 网络碎片化的结构会减小并行度
在GoogLeNet和自动生成结构中,一个"多路径"的结构被广泛采用在每一个块中。尽管这样的碎片化结构对准确率的提升是有益的,但是它在并行度高的计算平台(如GPU)运行效率并不好,同时还会引入内核启动和同步这样的额外开销。
实验设置:
为了验证上面的想法,我们设计了bottleneck单元,然后分别对是否移除ReLU和shortcut做了四种情况的研究,结果如上面的table4所示,我们观察到不管是对GPU还是ARM平台,移除了ReLU和shortcut之后都获得了近乎20%的加速。
Conclusion and Discussions
基于上面的指导建议和经验研究,我们得出了一个高效的网络结构应该注意的地方:
目前的轻量级网络结构主要是是以FLOPS作为度量标准设计的,而没有考虑以上的几点属性。举个例子,ShuffleNet v1使用了过多的分组卷积(与G2违背)、bottleneck-like块(与G1违背);MobileNet v2使用倒置的bottleneck结构(与G1违背),同时使用了深度卷积和ReLU在"thick"特征图上(与G4违背);自动生成结构过多的使用了碎片化结构(与G3违背)。
轻量级网络的主要挑战是在给定计算力预算下特征通道的数目是非常有限的,为了增加通道数的同时不太改变FLOPS,逐点分组卷积和bottleneck-like结构被广泛采用,同时通道清洗操作增强了不同组通道之间的信息交流,提升了模型的精度。构建的块结构如Figure 3中的(a)(b)所示。
正如在Section2中讨论的那样,ShuffleNet v1中充满了对四个建议的违反。逐点组卷积和bottleneck结构会增加MAC(与G1和G2相违背);使用太多的组违反了G3;shortcurt中的element-wise加操作违反了G4。因此,为了使模型更高效,关键就在于如何保持等宽的通道以及使用密集的卷积操作而不是太多的组卷积。
3.1 通道拆分和ShuffleNet V2
为了实现上面的目的,我们设计了一种叫做通道拆分的操作,就如Figure 3中的©图,在每个单元开始,将c个通道的输入拆分为两个分支,一个分支遵从G3,做恒等映射;另一个分支过三个卷积层的同时保证输出通道数与输入通道数相同(遵从G1),两个 1x1 的卷积没有再使用分组卷积(遵从G2),其实拆分这个操作本身就已经分了两个组了;在卷积之后,两个分支进行拼接,通道数不变,之后的通道清洗操作增强了两个分支之间的信息交流。在这里我们发现,ShuffleNet v1中的"Add"操作不见了,像ReLU和深度卷积这样的element-wise也仅在一个分支中存在,“拼接”、“通道清洗”、“通道拆分”可以合着看成单独的element-wise操作,遵从了G4。
对于下采样单元(stride=2),单元被修正为(d)所示,通道拆分被移除了,输出的通道数翻倍。整体的网络结构和ShuffleNet v1很相似(如table5所示)。一个额外的 1x1 卷积层用在GlobalPool层之前是为了混合通道特征,在每个块中的通道数按比例缩放得到不同FLOPS的网络,标记为 0.5x,1x等。
3.2 网络精度的分析
ShuffleNet V2不仅高效,而且精度也很高。主要的原因有两点:
在DenseNet中,为了分析特征重用模式,我们绘制了层间权重的平均L1范数如Figure 4(a),很明显相邻层的联系要远远比其他层之间更加紧密,这意味着所有层之间的密集连接可能会带来冗余,最近的CondenseNet也支持这个观点。
在ShuffleNet V2中,很容易证明第 i 个块和第 (i + j) 个块之间“直接连接”的通道数为r**j x c,这里的 r = 1-c’/c(这里我感觉是论文的地方有问题),换句话来讲,两个块之间特征重用的数量是指数衰减的,Figure 4(b)绘制了各层间特征重用的比例。
本文的 Ablation 实验是在 ImageNet 2012 分类数据集上展开的。按照一般原则,所有的对比网络有四种不同的计算复杂度,分别是 40,140,300 和 500+ MFLOPs。这样的复杂度在移动端场景中很典型。超参数及其他设置与 ShuffleNet V1 一样。本文对比的网络架构分别是 ShuffleNet V1,MobileNet V2,Xception,DenseNet。具体结果如下表所示:
Table8是关于一些模型在速度、精度、FLOPs上的详细对比。实验中不少结果都和前面几点发现吻合,比如MobileNet v1速度较快,很大一部分原因是因为简单的网络结构,没有太多复杂的支路结构;IGCV2和IGCV3因为group操作较多,所以整体速度较慢;Table8最后的几个通过自动搜索构建的网络结构,和前面的第3点发现对应,因为支路较多,所以速度较慢。