ShuffleNet V1/V2整理阅读

写在前面

ShuffleNet是旷视提出的两个轻量级网络,是目前最快的几个轻量级网络之一。这里主要对两个版本的论文进行阅读整理。不足之处还请路过的大神指点。


 

ShuffleNet V1

Group Convolution

这算是整个ShuffleNet的优化核心,Group Convolution操作早在AlexNet的时候就被拿来进行速度的优化了,其运算的过程可以参考这里,简单的说就是对一个输入通道为N的特征图进行的卷积操作拆分为对g个通道为N/g的特征图进行卷积,这样的方法在速度和参数上都会有大幅的提升。下表以卷积核为 D K × D K D_K×D_K DK×DK,特征图大小为 D F × D F D_F×D_F DF×DF,输入通道数为N,输出通道数为M简单的说明一下速度和参数的提升:

No GroupWith Group
Parameter N × M × D K × D K N×M×D_K×D_K N×M×DK×DK N g × M g × D K × D K × g \frac{N}{g}×\frac{M}{g}×D_K×D_K×g gN×gM×DK×DK×g
Computation D F × D F × N × M × D K × D K D_F×D_F×N×M×D_K×D_K DF×DF×N×M×DK×DK D F × D F × N g × M g × D K × D K × g D_F×D_F×\frac{N}{g}×\frac{M}{g}×D_K×D_K×g DF×DF×gN×gM×DK×DK×g

可以看到两个参数均缩小的g倍,也就是说当group number越大,优化的越好(但是在ShuffleNetV2中作者论证出group number对于网络的速度来讲并不是越大越好,g=1是对速度最友好的)。

 

Channel Shuffle

对于上述的Group Convolution,很容易想到一个问题就是在卷积的时候,仅仅是将这一个Group的特征图进行了融合,但是不同的组别之间缺没有充分的连接,长此以往,不同的特征图对于对方的了解就越来越少,虽然网络的全连接层会帮助不同特征图相互连接,但是可以预想的是这样的连接融合的次数较少,不如不分组的情况。
基于上述的情况,作者提出把每个组的特征图分为一定组在每一层都进行一定程度的乱序结合,以这样的方式增加特征图的连接融合次数,过程如下图所示:
在这里插入图片描述

 

ShuffleNet unit

整个单元其实比较好理解,直接上图如下:
在这里插入图片描述
图(a)是使用DWconv的bottleneck操作;图(b)是使用添加了Channel Shuffle之后的单元模型(该单元模型并不进行图像大小的调整),Channel Shuffle操作在1×1的卷积操作之后,也就是先对通道进行了收缩,随后进行通道调整,最后卷积在调整回原来的通道数;图(c)是使用该单元进行池化的操作,值得注意的是经过该单元之后,通道数为原先的2倍。
作者也说道,对于ResNet的bottleneck操作,一共需要的操作为 h w ( 2 c m + 9 m 2 ) hw(2cm+9m^2) hw(2cm+9m2),其中hw为图像的宽度和高度,cm为输入通道数和收缩到的通道数,卷积核默认为3×3,而本文的shuffleNet单元的整体操作花费为 h w ( 2 c m g + 9 m ) hw(\frac{2cm}{g}+9m) hw(g2cm+9m),其中 m 2 − > m m^2->m m2>m得益于采用了DWConv,而GConv的贡献主要在于两端的1×1卷积操作。

 

ShuffleNet Architecture

ShuffleNet的网络结构如下图所示:
在这里插入图片描述
可以看到,随着分组的增加,最终的复杂度(论文中以FLOPS作为衡量标准)相应的减少,这和我们对于Group Convolution操作的期望相同;随之而来的一个问题是,采用了这样的方式会对准确率有影响吗?出人意料的,该改进也比传统的网络优秀一些。
在这里插入图片描述
除了标准网络,作者也按照MobileNetV1的思路,对于网络设置了一些超参数s,表示通道数的多少,例如s=1,即标准的网络结构,通道数如上图所示;s=0.5表明每个stage的输出和输入通道数都为上图中通道数的一半,其他的类似。通过通道缩放s倍,整个计算复杂度和参数均下降 s 2 s^2 s2倍。下表是作者的一些实验数据。
在这里插入图片描述
上表中有一个很有意思的现象,就是在s=0.5的时候,较大的group参数居然导致准确率的下降,而s=0.25的时候,较大的group参数使得准确率提高;这里作者也仅仅是一笔带过,只是说当每一组的特征图数变少,可能影响网络的表征能力。

 

Shuffle操作有无的对比

作者也对比了网络添加shuffle和不添加shuffle的区别,如下图
在这里插入图片描述
可以看到,网络添加了shuffle操作之后准确率确实有了一部分的提升。

 

与MobileNet的对比

下图是ShuffleNet与MobileNet的对比,可以看到精确度上提高不少。
在这里插入图片描述


 

ShuffleNet V2

如MobileNetV2一样,ShuffleNetV2也是对深度神经网络的深层探讨,但是不一样的地方在于,ShuffleNetV2的优化点更精细一些,完全瞄准轻量化这个目标而设计。

 

对于网络复杂度的考虑

作者上来就提出了一个被大家广泛忽略的一个问题:我们广泛使用的FLOPs真的可以很好的反应我们网络的复杂度吗?显然答案是否定的,作者举出的例子是MobileNetV2的FLOPs和NASNET-A是相当的,但是速度却快出了后者很多。下图是更多的作证。
在这里插入图片描述
所以作者这里提出,仅仅使用FLOPs作为衡量标准是不全面的,其中一个忽略的因素就是MAC(memory access cost),实际上,很多网络的操作都跟该因素息息相关,而另一个被忽略的因素就是网络设计的平行度(parallelism),作者研究说在相同的FLOPs下,平行度高的模型比平行度低的模型速度要快很多。
同时,除了上面的因素,速度还和运行的硬件平台息息相关,比如使用了加速库cudnn的话,3×3的卷积操作会被加快,而在ARM平台上,这样的好处显然是没有的。
所以针对以上的发现,作者提出直接的对网络速度测量应该代替FLOPs,并针对网络的速度提出了四点指导建议。

 

4个guide lines

由于这几个建议描述也比较多,但是原理都不难,这里就用结论一笔带过。

1. 相同维度的通道数将最小化MAC

在这里插入图片描述
作者为了验证卷积层两端的通道数对于速度的影响,自己搭建了一个验证网络,参数如上表所示,可以看到当两端的通道数之比为1:1的时候,模型的速度是最快的(不同比例的通道数不一致主要是为了保证FLOPs是相同的)。

 

2. 过多的分组卷积会加大MAC

在这里插入图片描述
从上表可以看到,越多的分组会导致速度急速下降,特别是在GPU上,下降的十分严重,一个显卡跑的话,8个Group Convolution会使得速度下降4倍!(这一这里作者依旧是在不同的条件下使用不同的通道数保证FLOPs是一样的)

 

3. 碎片操作将减小网络的平行度

这里的碎片操作指的是将一个大的卷积操作分为多个小的卷积操作进行。
作者这里使用自己搭建了一些网络进行验证,网络的结构如下(这里作者似乎并没有保证FLOPs是一样的):
在这里插入图片描述
最终的结果如下所示:
在这里插入图片描述
这里有一个比较有趣的结果,就是我们认为可能增加平行度的平行结构,最后居然减低了速度,不过这里由于还有下一个guide line的实验说到了元素级的操作也会对速度有一定的影响,因此这里还不能下定论到底是因为平行还是因为最后的相加拉低了时间。

 

4. 不要忽略元素级操作

这里元素级操作指的就是Relu,TensorAdd,BiasAdd等等的矩阵元素级操作,可以推测到这些操作其实基本没有被算到FLOPs中,但是对于MAC这个参数的影响确实比较大的。
作者为了验证这个想法,对bottleneck这个层级进行了相应的修改,测试了是否含有Relu和short-cut两种操作的情况,对比如下:
在这里插入图片描述
结论一目了然,没有两种操作的时候,更快一些。而且一个有意思的现象是,去掉short-cut对于速度的提升比Relu快一些,可以想到的是Relu只是对一个tensor进行操作,而short-cut是对两个tensor进行的操作。

 

结论(这里的结论很好,有必要重申一下)

作者首先简要总结了一下4个guideline

1). 使用“平衡的”的卷积层(输入输出通道相同);
2). 小心使用分组卷积;
3). 减少使用碎片化的操作;
4). 减少元素级的操作;

随后作者分析道最近的一些比较火的网络结构:
ShuffleNetV1违反了G2,bottleneck的结构违反了G1,而MobileNetV2使用的inverse bottleneck的结构违反了G1,其中夹杂的DWconv和Relu都违反了G4,自动生成结构(auto-generated structures)高度碎片化违反了G3。


 

ShuffleNetV2结构

作者首先复盘了ShuffleNetV1,认为目前比较关键的问题是如何在全卷积或者分组卷积中维护大多数的卷积是平衡的。针对这个目标,作者提出了Channel Split的操作,同时构建了ShuffleNetV2。

Channel Split操作

在这里插入图片描述
上图中(a)(b)是ShuffleNetV1的层结构,而后面的(c)(d)是ShuffleNetV2的层结构。下面稍微讲一下笔者结合论文的理解。
Channel Split操作将整个特征图分为c’组(假设为A组)和c-c’(假设为B组)两个部分,主要有三个好处:

  • 把整个特征图分为两个组了,但是这样的分组又不像分组卷积一样,增加了卷积时的组数,符合G2;
  • 这样分开之后,将A组认为是通过short-cut通道的,而B组经过的bottleneck层的输入输出的通道数就可以保持一致,符合G1;
  • 同时由于最后使用的concat操作,没有用TensorAdd操作,符合G4;

可以看到,这样一个简单的通道分离的操作带来了诸多好处;但是从理论上来说,这样的结构是否还符合short-cut的初衷(即bottleneck学到的是残差Residual部分)?这里笔者也不好妄加揣测,但是可以想到的是经过后面的Channel Shuffle的乱序之后,每个通道应该都会经过一次bottleneck结构。

上述的结构是不改变输入输出通道数和特征图大小的情况,而池化操作使用图(d)代替了,跟ShuffleNetV1类似,经过这样的结构之后,图像通道数扩张为原先的2倍。

 

ShuffleNetV2网络结构

相似于ShuffleNetV1,网络也使用了4个不同的stage,结构如下图:
在这里插入图片描述
值得特别注意的是!channel数都异常的小!这里作者并没有特别的解释这个现象(按照MobileNetV2中对于Relu的分析,这个地方似乎有点儿激进?)。

 

ShuffleNetV2的分析

作者得到的结果是ShuffleNetV2既高效而且准确,主要分析有两点原因:

  • 1). 每个结构层(building block)的高效率使得能够使用更多的特征通道和更大的网络容量(这个地方并没有很理解);
  • 2). 在每个结构层,都有一部分的通道直接通道下一个结构层,提高了特征的重用度;

论文有对比了DenseNet和ShuffleNetV2重用度的区别,如下图:
在这里插入图片描述
可以看到,在特征重用方面,ShuffleNetV2在不同层之间保持了连接,但是不像DenseNet,过远的层之间也会有很大的连接。

 

ShuffleNetV2的结果对比

这部分就是很枯燥的对比,这里直接放图,有趣的地方会说一下:
在这里插入图片描述
上述结果中有一个现象是MobileNetV1的速度在GPU上是最快的,作者说明这个现象是因为MobileNetV1比于之后的几个轻量级网络,具有更贴近的4个guide line的设计,因此在GPU的速度更快,但是我们看到,在CPU上,ShuffleNet又扳回一城,而且快了许多。
在这里插入图片描述
这个图中带*号的模型是作者从Xception中得到了一些启发,表明更大的感受野对于detection的任务更友好,因此作者在每个结构的1×1卷积之前添加了一个3×3的DWconv卷积层增大感受野,结果确实有所提升。


 

总结

不得不承认,ShuffleNet系列确实是很不错的工作,V2更是对网络的速度进行了深入的思考,秉着一切服务于速度的思路而提出了该结构,从准确度上来说,也丝毫不逊色于其他网络。

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值