关于ShuffleNet V2的一些个人理解(欢迎批评指正) 您所在的位置:网站首页 shufflenetv2准确率多少 关于ShuffleNet V2的一些个人理解(欢迎批评指正)

关于ShuffleNet V2的一些个人理解(欢迎批评指正)

2024-06-22 02:16| 来源: 网络整理| 查看: 265

ShuffleNet V2

ShuffleNet V2是孙剑等人发表在ECCV2018的文章,也是之前ShuffleNet的升级版,全名为**ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design**。这篇文章提出了一些比较新颖的观点,阅读完之后,获益颇多。本文就是我对该论文中所提思想的一些个人理解。 ShuffleNet系列均为轻量级网络,其结构涉及到Group Convolution以及Depthwise Convolution的相关知识,所以在此先介绍一下。

1 Group Convolution

所谓Group Convolution,即为对输入的feature map进行分组,对每组采用对应的卷积核进行卷积。为了便于理解,我分别对传统的卷积方式和分组卷积方式绘制了相应的示意图,如下面两图所示。 在这里插入图片描述                                        图1 传统卷积方式,其参数量为: K × K × C × N {K}\times{K}\times{C}\times{N} K×K×C×N。 在这里插入图片描述                                                    图2 Group Convolution 上图是Group Convolution Operation,对比以上两种卷积方式,可以发现采用Group Convolution方式之后卷积核的参数量将会相应的减少为原来的 1 G \frac{1}{G} G1​( K × K × C × N {K}\times{K}\times{C}\times{N} K×K×C×N vs. K × K × C G × N {K}\times{K}\times\frac{C}{G}\times{N} K×K×GC​×N),此时计算量也会降低为传统方式的 1 G \frac{1}{G} G1​,所以分组卷积将会带来网络整体速度极大提升,所以目前几乎所有的轻量级网络都采用这种卷积方式减少参数量,提高网络运行效率,因为对于轻量级网络来说,整体网络执行的效率是衡量其性能的一个重要指标。 至于Depthwise Convolution,其是Group Convolution的一种特殊形式,即在分组时设定 G = C = N G=C=N G=C=N,然后用1*1卷积进行通道调整即可,对此感兴趣的朋友可以参考这篇博客。

2 Channel Shuffle

首先来回顾一下ShuffleNet V1。V1中提出了ShuffleNet unit结构,这个结构实际上是基于ResNeXt中Residual unit结构而设计的。ResNeXt在原来ResNet的Residual unit结构基础上,将中间的 3 × 3 3\times3 3×3卷积变换为Depthwise Convolution,这样使得网络整体参数量大大减少。ShulleNet unit进一步将Residual unit块中的 1 × 1 1\times1 1×1卷积改换为 1 × 1 1\times1 1×1的分组卷积(论文中称为Pointwise Group Convolution)以进一步加速网络,如下图所示。 在这里插入图片描述                                       图3 ResNeXt中的Residual unit(a)和ShuffleNet unit(b) 但是前面分组卷积(Group Convolution)示意图(图2)所示,分组卷积会带来一些弊端,因为相比传统卷积,分组卷积中每个卷积核所提取的特征都在所分组内,故卷积核的表达能力会受到限制,而输出的feature map中的每个通道的信息都只跟输入中所分组内的通道的feature map信息相关,这样就会在一定程度上阻碍各个通道之间的信息流动,也在一定程度上降低了卷积层的表达能力,影响网络的最终性能(V1原文描述:a)Each output channel only relates to the input channels within the group. No cross talk. b)It is clear that outputs from a certain group only re-late to the inputs within the group. This property blocks information flow between channel groups and weakens representation.)。所以作者提出了channel shuffle的操作,其旨在让卷积操作可以得到不同分组中的通道信息,提升卷积核的表达能力,由于channel shuffle的操作所消耗的时间(简单的矩阵转置和平铺)是可以忽略不记的,因此ShuffleNet在加速网络的同时也保证了网络的性能。下图即为我绘制的ShuffleNetv1中channel shuffle操作示意,这里 N = 4 , G = 3 N=4, G=3 N=4,G=3。 在这里插入图片描述                                             图4 Channel Shuffle Operation示意图

3 Four Guidelines for Efficient Network Design

在ShuffleNet V2中,作者提出了设计高效网络结构的四个基本准则。因为目前几乎所有所发表的文章在对比网络加速时所用到的指标都是FLOPs(float-point operations,每秒浮点运算速度),其主要衡量的是卷积操作。但作者认为,FLOPs仅仅是一种间接的度量标准,而更为直接的标准应该是速度、延时等。故作者选取了当前相对先进的轻量级网络(如MoblieNet v2,自家的ShuffleNet)做了对比实验,实验结果如图5。 在这里插入图片描述                                             图 5 FLOPs and speed of four Networks 从上图中可以发现,在同等数量级的FLOPs下,各个Network的处理速度却存在很大的差异,作者将原因归结为两点:1)FLOPs忽略了其他影响最终速度的几个重要因素,一是内存访问的成本(MAC, memory access cost);二是计算的并行度(degree of parallelism),通常高并行计算的模型速度往往更快。2)不同平台的FLOPs是不同的,如GPU和ARM。(注:本文实验中所用的到的GPU为NVIDIA GeForce GTX 1080Ti;ARM为移动端芯片高通骁龙810) 在这里插入图片描述                                             图 6 不同网络模型总体运行时间分解示意 进一步实验之后,作者发现,虽然卷积操作所消耗的时间占据很大比重,但是Element-wise operation(包括ReLU,AddTensor, AddBias)同样不可忽视,如图6。 据此,作者提出了针对高效网络设计的四个指导准则,且四个基本准则都是跨平台的。

G1) Equal channel width minimizes memory access cost .

指导准则一即是从内存访问入手。我们假设某个计算平台的内存是足够充足的,以 1 × 1 1\times1 1×1卷积为例,设其输入通道为 c 1 c_1 c1​,输出通道为 c 2 c_2 c2​,feature map大小均为 h × w {h}\times{w} h×w, 那么此时内存中需要存储Input Feature(式(1)中第一项)和Output Feature(式(1)中第二项)以及卷积核参数(式(1)中第三项),则其MAC(memory access cost)的计算符合下式(此处 B = h w c 1 c 2 B=hwc_1 c_2 B=hwc1​c2​):                                              M A C = h w c 1 + h w c 2 + 1 × 1 × c 1 c 2 MAC=hwc_1+hwc_2+{1}\times{1}\times{c_1 c_2} MAC=hwc1​+hwc2​+1×1×c1​c2​                                                     = h w ( c 1 + c 2 ) + c 1 c 2 =hw(c_1+c_2 )+c_1 c_2 =hw(c1​+c2​)+c1​c2​                                                     ≥ h w × 2 c 1 c 2 + c 1 c 2 \ge hw\times2\sqrt{c_1 c_2}+c_1 c_2 ≥hw×2c1​c2​ ​+c1​c2​                                                     = 2 ( h w ) 2 c 1 c 2 + c 1 c 2 =2\sqrt{(hw)^2c_1c_2}+c_1c_2 =2(hw)2c1​c2​ ​+c1​c2​                                                     = 2 h w B + B / h w =2\sqrt{hwB}+{B}/{hw} =2hwB ​+B/hw                                           (1) 观察式(1)可知,当且仅当 c 1 = c 2 c_1=c_2 c1​=c2​时可取下界。因此作者得出结论,当输入和输出的通道数保持一致时,内存占用最小,此时可以加速模型。为了验证该结论,作者进行了系列实验(通过改变通道数比例,实验中所有模型的总FLOPs是相当的),实验结果如图7。个人理解表格中×n表示不同规模的ShuffleNet网络,代表每层卷积核的个数是标准(×1)ShuffleNet的n倍(也即输出通道数)。对比之下可以发现,当 c 1 : c 2 = 1 : 1 c_1:c_2=1:1 c1​:c2​=1:1时,总体速度最快(无论GPU平台还是ARM平台)。 在这里插入图片描述                                                  图 7 针对准则一的实验对比结果

G2) Excessive group convolution increases MAC.

指导准则二讨论了Group Convolutiond对MAC的影响。我们知道Group Convolution的目的是减少参数量,这样便可以在加宽网络模型(增加卷积核数量)的前提下,也不会增加FLOPs。但从前面的分析可知,FLOPs并不是唯一影响速度的因素,不增加FLOPs不代表会加快速度,这是由于分组卷积中分组的多少和MAC同样存在重要联系。我们依旧采用准则一中的假设,只做一点修改,将 1 × 1 1\times1 1×1卷积换为Group Convolution,分组数为 g g g,此时每一组中卷积核的通道数为 c 1 / g c_1/g c1​/g, 则此时的MAC为:                                              M A C = h w c 1 + h w c 2 + 1 × 1 × ( c 1 / g ) c 2 MAC=hwc_1+hwc_2+{1}\times{1}\times{({c_1}/{g})c_2} MAC=hwc1​+hwc2​+1×1×(c1​/g)c2​                                                     = h w c 1 + h w c 2 + c 1 c 2 / g =hwc_1+hwc_2+{c_1 c_2}/g =hwc1​+hwc2​+c1​c2​/g                                                     = h w c 1 + B g / c 1 + B / h w = hwc_1+{Bg}/c_1+B/{hw} =hwc1​+Bg/c1​+B/hw                                    (2) 此处 B = h w ( c 1 / g ) c 2 B=hw(c_1/g)c_2 B=hw(c1​/g)c2​。 观察式(2)可知,随着分组数的增加,MAC也会增加,因此准则二即是要求在设计模型时,应选取合适的分组,不可盲目增加分组数,否则速度依然可能无法获得明显地提升,而对于轻量级网络,模型速度的提升是至关重要的。关于准则二的对比实验如图8所示,可以看出,随着分组( g = 1 g=1 g=1 → \to → g = 8 g=8 g=8)增加,模型运行速度出现了明显的下降。 在这里插入图片描述                                                  图 8 针对准则二的实验对比结果

G3) Network fragmentation reduces degree of parallelism.

在指导准则三中,作者认为网络模型中支路(文章中采用fragmentation一词)数量会影响计算的并行度,从而影响网络模型的运行速度。无论这种fragmentation是并行的,还是串行的,作者认为其都对设备(如GPU)的并行计算度产生了负面影响(原文:Though such fragmented structure has been shown beneficial for accuracy, it could decrease efficiency because it is unfriendly for devices with strong parallel computing powers like GPU)。在进行验证指导准则三时,作者选取了图9所示的几种结构(fragment-series是单路几个卷积的串连;fragment-parallel表示一个block中有多个卷积层并行,类似Inception的整体设计)进行了实验,实验结果如图10。从结果可以看出,在相同FLOPs的情况下,单卷积层(1-fragment)的速度最快。因此模型支路越多(fragment程度越高)对于并行计算越不利,这样带来的影响就是模型速度变慢,比如Inception这样的网络。 在这里插入图片描述                                              图 9 针对准则进行对比实验时采用的支路结构 在这里插入图片描述                                                  图 10 针对准则三的实验对比结果

G4) Element-wise operations are non-negligible.

指导准则四即是前面所提及的Element-wise 操作对速度的影响。之前的图6已经直观显示出ReLU,AddTensor, AddBias等Element-wise 操作所占用的时间消耗也是不容忽视的,虽然它们并不会增加FLOPs。为了进一步探究其对运行速度的影响,作者选取ResNet中的bottleneck unit结构进行了对比实验,实验结果如图11。在实验中,作者分别移除了bottleneck unit结构中的ReLU和shortcut操作作为对比。结果最终显示当ReLU、shortcut两部分操作均被移除之后,整体速度是最快的。 在这里插入图片描述                                                  图 11 针对准则四的实验对比结果

4 ShuffleNet V2

ShuffleNet V2:在阐述完网络设计的四个基本准则之后,作者依据所提出的四个基本准则,重新设计了ShuffleNet unit的结构。 在这里插入图片描述                                                  图 12 ShuffleNet V2 unit结构 如图12(a),首先作者提出来channel split操作,将输入的feature channels分为两路: c − c ′ c-c' c−c′和 c c c channels。其中一路为恒等映射(依据指导准则G3不做fragmentation),另一路与ResNet的残差相似,包含三层卷积( 1 × 1 1\times1 1×1, 3 × 3 3\times3 3×3, 1 × 1 1\times1 1×1)操作,依据指导准则G1,这三层卷积保持相同的通道。 另外可以注意到ShuffleNet v1中的pointwise group convolution不再存在,两个 1 × 1 1\times1 1×1卷积均为普通卷积,旨在减少分组数(一方面也是由于前面的split操作已经将算作一次分组了),这依据指导准则G2。之后两路汇合,采用的是Concat操作而不是V1版本中的Add操作(见图3),这样一来保持整个unit结构输入输出通道相同(均为 c c c),符合指导原则G1,另一方面,Add操作被替换为Concat,所有Element-wise operation(如ReLU,depthwise convolutions)都只出现在一路中,这些都符合指导准则G4。同时应该注意到,Channel Shuffle操作移到了Concat后面,因为 1 × 1 1\times1 1×1卷积不在是分组卷积了,所以原来跟在其后的Channel Shuffle操作也不再必要了。 为了下采样和通道扩充,作者设计了如图12(b)的ShuffleNet unit,在这个结构中,开始的channel split操作被移除了,从而保证最后通道数增加一倍。另外这两路都加入了stride为2的 3 × 3 3\times3 3×3 DWConv用以减小feature map尺寸,以达到下采样的目的。 在整体网络设计中ShuffleNet V2和V1也稍有不同:ShuffleNet V2在最后的Global Averaged Pooling操作前加入了一个 1 × 1 1\times1 1×1卷积层,目的是为了进一步提取特征(图13)。50层的ShuffleNet V2整体结构如图13(截取自原文附录)。作者经过多组实验,证明了ShuffleNet V2相比V1以及其他轻量级网络(如MobileNetv2,Xception like版等),其在保证准确率的同时,明显的提升了执行效率,这进一步证明上述四个高效网络设计的基本指导准则是可行的。ShffleNet unit不仅可以用在轻量级网络上,也可应用在大型网络模型中,实验表明其同样可以在提升效率的同时保证相当的准确率。(以上具体实验细节请参考论文中的数据) 在这里插入图片描述                              图 13 V2中在Global Averaged Pooling之前加入1*1卷积层(图片来自文章) Feature Reuse:我们知道Densenet中的密集连接块使得每两层卷积之间都是紧密相关的,这使得前一层的特征可以直接被后面的层复用。不难理解,这种密集连接的操作可以增加网络的表达能力,因此可以在一定程度上提升网络的性能。同样地,ShuffleNet V2中也可以实现feature reuse。让我们回顾一下ShuffleNet V2 unit结构,试想当 c ′ = c / 2 c'=c/2 c′=c/2(这是文章网络结构中所使用的)时,那么就将会有一半的feature channels 直接流入下一个block,这就实现了特征复用的效果。 继续思考下去,虽然Densenet中的密集连接块实现了很强的特征复用,但是对于太深的网络而言,特征提取不足的问题往往是不存在的,这么密集的连接块反而可能会造成大量的特征冗余,对于深层网络,反而会影响其性能。反过来我们考虑一下这个问题会不会发生在ShuffleNet V2中,为了方便理解,我以图解的形式来说明这个问题,如图14。 在这里插入图片描述                                    图 14 “directly-connect” channels between buiding blocks

上图中每个杏黄色块代表ShuffleNet unit中的支路的一系列卷积操作( 1 × 1 1\times1 1×1, 3 × 3 3\times3 3×3, 1 × 1 1\times1 1×1),流向两条支路的channels分别是 c ′ c' c′和 c − c ′ c-c' c−c′,图中开始的第一个building block记作第i个block, 其后依次 + 1 +1 +1,则直接流入第 i + 1 i+1 i+1个block的channels为 c c − c ′ c = c − c ′ c\frac{c-c'}{c}=c-c' ccc−c′​=c−c′个,其通道占比为 c − c ′ c \frac{c-c'}{c} cc−c′​。由于Concat之后通过一个buiding block的通道数并没有改变,那么接着直接流入第i+2个block的通道数占比也为 c − c ′ c \frac{c-c'}{c} cc−c′​,那么从第 i i i个直接流入第 i + 2 i+2 i+2个block的通道占比为 ( c − c ′ c ) 2 (\frac{c-c'}{c})^2 (cc−c′​)2,故直接流入的通道数为 c ( c − c ′ c ) 2 c(\frac{c-c'}{c})^2 c(cc−c′​)2。令r= c − c ′ c \frac{c-c'}{c} cc−c′​(注:文章中这里应该是写错了: 1 − c ′ c \frac{1-c'}{c} c1−c′​),则从第 i i i个building block直接流入第 i + j i+j i+j个building block的通道数为 c r j cr^j crj。讨论到这里,结果一目了然,在ShuffleNet V2中,直接流入下层的通道数是随着block的距离称指数衰减的,距离越远,通道直接的相关性就越低。因此虽然ShuffleNet V2与Densenet类似实现了特征复用,但并不会造成大量的特征冗余。 以上就是我个人对ShuffleNet V2这篇文章的个人理解,多有拙见请见谅,另外本博客为个人原创,转载请注明出处。

参考博客

[1]ShuffleNet v2算法笔记



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有