前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ShuffleNetV2:高效网络的4条实用准则

ShuffleNetV2:高效网络的4条实用准则

作者头像
小草AI
发布2019-08-09 14:11:05
1.2K0
发布2019-08-09 14:11:05
举报

转自:CVer

代码语言:javascript
复制
2018年 清华大学&Face++ Ningning Ma
提出指导高效CNN网络设计的4种方案,并改进了shufflenetv1

论文:ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design

arXiv:https://arxiv.org/abs/1807.11164

1. 背景介绍

在高效网络上(特别是移动端),网络必须在有限的计算能力中达到最优的精度。目前很多论文研究着 轻量级架构设计和速度-精度的权衡。

比如Xception、MobileNet、MobileNetv2、ShuffleNet、CondenseNet等等。在这些有效的网络结构中,Group Convolution(组卷积) 和 Depth-wise convolution(深度卷积) 起到关键性作用。

1. 组卷积 Group Convolution: 将feature map拆分成几组,分别进行卷积,最后再将卷积结果的feature map 合并. 最早在AlexNet中出现。因为当时GPU内存有限,逼迫将feature map拆分到两个GPU上分别卷积再融合。 2. 深度卷积 Depth-wise convolution: 对每一个通道进行各自的卷积,输出相同的通道数,再用进行跨通道的标准

卷积来融合信息。Xception 就是典型的代表 3. 极大减少了参数,性能还有点提高(未知有无理论证明能完全替代普通卷积)。Alex认为组卷积实现类似正则的作用。

速度(Speed)是直接指标,但不同设备不好比较, 故以往常用 FLOPs(乘或加的次数)来度量复杂度。但FLOP是一种间接指标,它不能直接作为评判的标准(如Mobilev2和Nasnet相比,他们的Flops相似,但是前者快很多)。

个人体会: 在WRN和Resnet上,WRN的Flops和参数量远大于Resnet情况下,WRN比Resnet快很多。且ResNext比WRN慢很多。shufflenetv2论文中在两种硬件环境中测试四种不同速度和FLOPs的网络结构。观察知道FLOPs不能替代Speed这评判指标。

间接指标(Flops)和直接指标(速度)之间存在差异有两种:

  • 1. 对速度影响较大的因素,但没有影响到FLOPs。
    • 如内存访问成本(MAC, memory access cost),它在如组卷积中占大量运行时间,导致MAC是瓶颈。
    • 又如并行度(degree of parallelism),FLOPs相同情况下,高并行的模型可能会快很多。
  • 2. 运行平台不同。
    • 相同的FLOPs的运算在不同的平台上运行也会导致速度差异。
    • 如以前会采用张量分解来加速矩阵乘法,但张量分解在GPU上运行会慢很多。作者调查发现最近的CUDNN库中有专门为

    卷积进行了优化,也就是说张量分解后的运行速度有可能慢与优化库中的张量乘法。

于是作者认为高效网络架构的设计应该考虑两个基本原则:

  • 1 用直接指标(如速度)评估,而不是间接指标(如Flops)。
  • 2 在同一环境平台上进行评估。

论文也是按照这两个原则,对多种网络(包括shufflenetv2)进行评估。

2. 高效网络设计的4条实用准则

作者发现 组卷积和深度卷积是目前较优网络的关键,且FLOPs数仅和卷积有关。虽然卷积操作耗费大量时间,但是其他内部过程如 I/O、data shuffle、element-wise操作(Add、ReLU等)都会耗费一定的时间。

作者提出设计高效网络的4条准则:

  • G1 相同通道宽度可以最小化内存访问成本MAC。
  • G2 过多的组卷积会增加内存访问成本MAC
  • G3 网络内部碎片操作会降低并行度
  • G4 Element-wise操作不容忽视

G1 相同通道宽度可以最小化内存访问成本MAC

考虑无bias的

卷积。如果输入的通道数为

, 卷积后输出通道数为

. 让

分别表示feature map的高和宽。假设cache足够大。

那么普通卷积的Flops数为

.

tips:

为这两层各自的输出值(activate),

为两层间卷积核的参数量。

则得出:

tips:

上面不等式指出,同FLOPs情况下,如果相邻两层它们的通道数相等时,MAC将达到最小值。文中采用简单两层卷积网络,实验验证了这结果。

但是实际情况下G1的前提条件“cache足够大”不一定满足。设备缓存不够大时很多计算库会采用复杂的缓存机制,这会导致MAC值和理论值有偏差。

G2 过多的组卷积会增加内存访问成本MAC

组卷积能够大量减少FLOPs,也成功被应用于多种优秀网络。

延续G1中的符号定义及公式,此处的FLOPs为

,则

tips:

,

从式子看出,若组卷积的组数

增加,则 MAC 也会增大。故太多的组卷积会增加内存访问成本。

文中采用控制变量法实验验证了这准则。

G3 网络内部碎片操作会降低并行度

碎片(Fragmentation)是指多分支上,每条分支上的小卷积或pooling等(如外面的一次大的卷积操作,被拆分到每个分支上分别进行小的卷积操作)。

如在NasNet-A就包含了大量的碎片操作,每条分支都有约13个操作,而ResnetV1上就只有2或3个操作。虽然这些Fragmented sturcture能够增加准确率,但是在高并行情况下降低了效率,增加了许多额外开销(内核启动、同步等等)。

文中采用控制变量实验验证了这准则。

G4 Element-wise操作不容忽视

Element-wise操作指的是 ReLU、AddTensor、AddBias等等。虽然这些操作只增加了一点点FLOPs,但是会带来很高的MAC,尤其是Depthwise Convolution深度卷积。

文中采用‘bottleneck’单元,进行了一系列对比实验,验证了这准则。

G1-G4的总结:

  • 平衡相邻层的卷积核数
  • 留意组卷积带来的开销
  • 减少碎片化的程度
  • 减少Element-wise操作

讨论其他的网络:

  • ShuffleNet-V1 严重依赖组卷积,违背了G2。
  • Bottleneck结构违背了G1
  • MobileNet-V2 采用了反转bottleneck(违背了G1),且用到了Depth-wise、以及在feature map上采用relu这些trick,违背了G4.
  • 自动搜索生成的网络结构(如NasNet)有很高的碎片,违背了G3.

3. ShuffleNet V2 架构

基于上面种种分析,作者着手改进ShuffleNet V1。

首先ShuffleNetV1是在给定的计算预算(FLOP)下,为了增加准确率,选择采用了 逐点组卷积 和 类似瓶颈的结构,且还引入了 channel shuffle操作. 如下图的(a)、(b)所示。

很明显,逐点组卷积 和 类似瓶颈的结构 增加了MAC(违背G1和G2),采用了太多组卷积违背了G3, ‘Add’ 操作违背了G4,因此关键问题在于如何保持大量同宽通道的同时,让网络非密集卷积也没太多组卷积。

DWConv:深度卷积 (depthwise convolution), GConv:组卷积 (group convolution)

ShuffleNetV2 引入通道分割(channel split)操作, 将输入的feature maps分为两部分

. 根据G3, 一个分支为shortcut流,另一个分支含三个卷积(且三个分支的通道数一样,满足G1)。满足G2:两个

卷积不采用组卷积操作,因为前面的通道分割已经做了分组,降低了组数。

之后分支合并采用拼接(concat),让前后的channel数一样(满足G1). 然后再进行Channel Shuffle(完成和ShuffleNetV1一样的功能)。

shuffle后,以往的ShuffleNetV1是再接一个ReLu(Element-wise)操作,此处将其移到卷积分支中。另外三个连续的Element-wise操作:通道分割、concat、shuffle合并成一个Element-wise操作,这满足了G4. 具体看图(c).

ShuffleNetV2 的空间下采样模块经过些修改,去掉了通道分割,输出的通道数翻倍。详情看图(d).

这是合理的做法,因为下采样后,feature map的尺寸降低了,通道数翻倍是自然的。

4. 讨论

ShuffleNet-V2 不仅高效,还高精度。论文中指出导致的原因有:

  • 每个构建块都很高效,从而能利用更多的feature maps 和 更大的网络容量
  • 特征重用(feature reuse)
    • 因为通道分割,从而有一半(论文设置为

    )的特征直接传到下一个模块中。

    • 这和DenseNet 以及CondenseNet 思想相近。
    • DenseNet分析feature reuse模式发现,越相近的模块,它们的传来的shortcut特征的重要性越大。CondenseNet也支持类似的观点。
    • ShuffleNet-V2也是符合这样的观点, 特征重用信息随着两个模块间的距离呈指数衰减。即

    层的feature maps中,含有

    层feature maps数为

    ,其中

    层的feature maps数,

    为通道分割的参数,论文设为

    .

此篇论文实属业界良心,从源头分析每一步会造成的开销,从理论分析,到控制变量法做足实验,总结出 4 条准则,指导大家设计更高效的网络。

G1准则(相同通道宽度)从VGG、Resnet后大家几乎都默认遵循了, 而G2准则(组卷积问题)很多网络在违背着。主要是组卷积能够提高准确率,但很有意思的是,用了组卷积速度会慢很多,但直到shuffnetv2才开始分析原因(存疑,笔者没找到更早的关于组卷积会变慢的分析)。

而组卷积为什么会变好?“Alex认为group conv的方式能够增加filter之间的对角相关性,而且能够减少训练参数,不容易过拟合,这类似于正则的效果。” 参考自对深度可分离卷积、分组卷积、扩张卷积、转置卷积(反卷积)的理解。https://blog.csdn.net/Chaolei3/article/details/79374563

至于G3准则(碎片操作),文中主要还是对 自主搜索网络结构 方面的工作(如NasNet 进行批判)。这或许可以在自主搜索网络结构方面加上相应的损失函数,从而让搜索出的网络结构除了高准确率外,还具备高效的能力。

违背G4准则(Element-wise操作)是必不可免的。毕竟基于优秀网络上的改进,很多是增加一些Element-wise操作,从而获得准确率的提升。但ShuffleNetV2告诉了我们,Element-wise操作可以简化(如relu的移位)。

且如果让网络变得精简的话,这可能会让网络获得意想不到的提升,比如WRN就打败了很多花里胡哨。

论文还提到特征重用(Feature reuse), 用上了特征重用的方法后效果会提升(Densenet、DPN、残差金字塔之类等等)。之后需要多了解这方面的论文和方法。

猜您喜欢

往期精选▼

1. 用python实现“桶排序”

2. 用Python来点高逼格的,用 python 拟合等角螺线

3. tqdm模块无法单行打印进度条

4. 空洞卷积(dilated convolution)深入详解——优点与缺点

5. 轻量级神经网络系列——MobileNet V3

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习与python集中营 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 转自:CVer
  • 论文:ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
  • 1. 背景介绍
  • 2. 高效网络设计的4条实用准则
  • G1 相同通道宽度可以最小化内存访问成本MAC
  • G2 过多的组卷积会增加内存访问成本MAC
  • G3 网络内部碎片操作会降低并行度
  • G4 Element-wise操作不容忽视
  • G1-G4的总结:
  • 3. ShuffleNet V2 架构
  • 4. 讨论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档