ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
1. 摘要
最近,神经网络的架构设计都是基于计算复杂度的间接度量,比如 FLOPs。然而,直接的度量比如运行速度,其实也会依赖于内存访问和平台特性等其它因素。
因此本文建议直接在目标平台上用直接度量进行测试。基于一系列控制条件实验,作者提出了设计高效网络结构的一些实用指导思想,并据此提出了一个称之为 ShuffleNet V2 的新结构。
2. 介绍
为了衡量计算复杂度,一个广泛采用的度量方式是浮点运算的次数 FLOPs,但是,它是一个间接的度量,是对我们真正关心的直接度量比如速度或者时延的一种近似估计。在以前的工作中,这种不一致已经被学者们所发现,比如 MobileNet v2 要比 NASNET-A 快很多,但是它们两者具有差不多的 FLOPs。
上图中在 GPU 和 ARM 两个平台上,具有相同 FLOPs 的模型运行速度也会相差很多。因此只用 FLOPs 来衡量计算复杂度是不充分的,也会导致得不到最优的网络设计。
导致这种不一致的主要有两个原因:一是影响速度的几个重要因素只通过 FLOPs 是考虑不到的,比如 MAC(Memory Access Cost)和并行度;二是具有相同 FLOPs 的模型在不同的平台上可能运行速度不一样。
因此,作者提出了设计有效网络结构的两个原则。一是用直接度量来衡量模型的性能,二是直接在目标平台上进行测试。
3. 高效网络设计的实用指导思想
首先,作者分析了两个经典结构 ShuffleNet v1 和 MobileNet v2 的运行时间。
可以看到,虽然以 FLOPs 度量的卷积占据了大部分的时间,但其余操作也消耗了很多运行时间,比如数据输入输出、通道打乱和逐元素的一些操作(张量相加、激活函数)。因此,FLOPs 不是实际运行时间的一个准确估计。
G1:同样大小的通道数可以最小化 MAC。
深度可分离卷积中的点卷积比如 1×1 占据了大部分的复杂度。假设输入的特征图大小为 \(h*w*c_1\),那么输出通道数为 \(c_2\) 的 1×1 卷积的 FLOPs 为 \(B=hwc_1c_2\)。
简单起见,我们假设计算设备的缓存足够大能够存放下整个特征图和参数。那么内存访问代价就为 \(MAC=hw(c_1+c_2)+c_1c_2\),这三项分别代表输入特征图、输出特征图和参数的代价。所以我们有:
\[
\begin{aligned}
MAC&=hw(c_1+c_2)+c_1c_2 \\
&=\sqrt{(hw)^2(c_1+c_2)^2}+\frac{B}{hw}\\
&\geqslant\sqrt{(hw)^2 4c_1c_2}+\frac{B}{hw}\\
&=2\sqrt{hwB}+\frac{B}{hw}
\end{aligned}
\]
当且仅当 \(c_1=c_2\) 时,MAC 取得最小值。但是这个结论只是理论上成立的,实际中缓存容量可能不够大,缓存策略也因平台各异。所以作者进一步设计了一个对比试验来验证,基准的网络由 10 个块组成,每个块有两层卷积,第一个卷积层输入通道数为 \(c_1\) 输出通道数为 \(c_2\),第二层与第一层相反,然后固定总的 FLOPs 调整 \(c_1:c_2\) 的值测试实际的运行速度,结果如下所示:
可以看到,当比值接近 1:1 的时候,网络的测试速度最快。
G2:太多的分组卷积会增加 MAC。
分组卷积是现在网络结构设计的核心,它通过通道之间的稀疏连接(也就是只和同一个组内的特征连接)来降低计算复杂度。一方面,它允许我们使用更多的通道数来增加网络容量进而提升准确率,但另一方面随着通道数的增多也对带来更多的 MAC。
针对 1×1 的分组卷积,我们有:
\[B=h*w*1*1*\frac{c_1}{g}*\frac{c_2}{g}*g=\frac{hwc_1c_2}{g}\]
\[MAC=hw(c_1+c_2)+\frac{c_1c_2}{g}=hwc_1+\frac{Bg}{c_1}+\frac{B}{hw}\]
其中 \(B\) 是需要的浮点数运算次数,\(g\) 是分组卷积的组数,可以看到,如果给定输入特征图的大小和计算代价,那么 MAC 与组数成正比。作者通过叠加 10 个分组点卷积层设计了实验,在保证计算代价相同的情况下采用不同的分组组数测试模型的运行时间,结果如下所示:
可以看到,分为 8 个组要比 1 个组慢得多。因此,作者建议要根据目标平台和任务小心地选择分组的组数,不能简单地因为可以提升准确率就选择很大的组数,而忽视了因此带来的巨大计算负担。
G3:网络碎片化会减少并行度。
在 Inception 结构中,一般会有多个分支,其中的每一个卷积或者池化操作称之为一个碎片操作。这种碎片结构有利于提升准确率,但却对设备的并行计算不友好,而且也会带来同步等额外的开销。因此,作者设计了下面的一系列结构块,堆叠 10 次组成一个网络,然后在同等 FLOPs 的情况下测试它们各自的运行速度。
实验结果如下所示,可以看到在 GPU 上碎片结构会大大降低运算速度,而在 CPU 上则不是那么明显。
G4:逐元素的操作不可忽视。
这里逐元素(Element-wise)的操作包括张量相加,ReLU 等,它们的 FLOPs 很小但却会有相对较大的 MAC,这里作者认为深度卷积也是逐元素的操作,因为它们的 MAC/FLOPs 比值比较大。
作者采用了 ResNet 的瓶颈结构来实验,也就是一个 conv 1×1->conv 3×3->conv 1×1 的结构,分别去掉其中的 ReLU 和跳跃连接,然后测试它们各自的运行速度。可以看到无论是去掉其中哪一个操作,运行速度都会加快。
因此,高效的网络结构应该满足:1. 使用平衡的卷积,也就是通道数一样;2. 合理使用分组卷积;3. 减少碎片度;4. 减少逐元素操作。这些在实际中都应该被考虑到而不是仅仅只关注 FLOPs,比如 ShuffleNet V1 严重依赖分组卷积,这违反了 G2;MobileNet v2 利用了反转瓶颈结构,这违反了 G1,而且在通道数较多的扩展层使用 ReLU 和深度卷积,违反了 G4,它是自动生成的结构碎片化很严重,这违反了 G3。
4. ShuffleNet V2
ShuffleNet V1 引入了分组点卷积、瓶颈结构和通道打乱,这与上面的指导思想相违背,因此我们要做的就是维持一个较大并且等宽的通道但不利用密集卷积或者太多的分组卷积。
因此作者引入了一个通道分割(channel split)操作,如上图(c)所示。在每个单元的开始,我们将特征图的 \(c\) 个通道分为两部分: \(c-c'\) 个通道和 \(c'\) 个通道,根据 G3 碎片尽可能少,其中一部分保持不变,另一部分包含三个通道数一样的卷积来满足 G1。两个 1×1 的卷积不进行分组一部分是为了满足 G2 一部分是因为通道分割已经分成了两组。最后,对两部分的特征进行拼接,这样通道数依然保持不变,最后进行一个通道打乱来保证两部分的信息进行交互。
针对空间下采样,通道分割被移除,然后输出通道数变为两倍,详细信息如上图(d)所示。
上述的基本块叠加在一起来组成最后的 ShuffleNet V2,其中 \(c'=c/2\),在平均池化后还有一个额外的 1×1 的卷积来对特征进行混合,详细信息如下表所示。同样,我们也可以对每一个块的通道数进行缩放来进一步调整网络的大小。
ShuffleNet V2 不仅仅非常高效,而且准确率也很高。有两个主要的原因:一是高效的基本块可以允许我们的特征通道数比较多,网络容量比较大;二是一半的特征图直接进入到下一个模块,这可以看作是一种类似于 DenseNet 和 CondenseNet 的特征复用。
在 DenseNet 中,作者分析了不同层之间权重的相关性,如下图左边所示,可以看到,相邻层之间的关联性是远远大于其它层的,这也就是说所有层之间的密集连接可能是多余的。
在 ShuffleNet V2 中,可以证明,第 \(i\) 层和第 \(i+j\) 层之间直接相连的特征图通道数为 \(r^jc\),其中 \(r=(1-c')/c\)。换句话说,特征复用的数量随着两个块之间的距离是指数级衰减的,如上图右边所示。
5. 实验结果
此外,ShuffleNet V2 的结构也可以用来构建大的模型或者和残差结构、SE 等相结合具体细节可参考原论文。
获取更多精彩,请关注「seniusen」!
ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design的更多相关文章
- 轻量架构ShuffleNet V2:从理论复杂度到实用设计准则
转自:机器之心 近日,旷视科技提出针对移动端深度学习的第二代卷积神经网络 ShuffleNet V2.研究者指出过去在网络架构设计上仅注重间接指标 FLOPs 的不足,并提出两个基本原则和四项准则来指 ...
- (转)Illustrated: Efficient Neural Architecture Search ---Guide on macro and micro search strategies in ENAS
Illustrated: Efficient Neural Architecture Search --- Guide on macro and micro search strategies in ...
- [place recognition]NetVLAD: CNN architecture for weakly supervised place recognition 论文翻译及解析(转)
https://blog.csdn.net/qq_32417287/article/details/80102466 abstract introduction method overview Dee ...
- [Architecture Design] 累进式Domain Layer
[Architecture Design] 累进式Domain Layer 前言 本篇的内容大幅度的简化了分析设计.面向对象等等相关知识,用以传达累进式Domain Layer的核心概念.实际开发软件 ...
- [Architecture Design] 跨平台架构设计
[Architecture Design] 跨平台架构设计 跨越平台 Productivity Future Vision 2011 在开始谈跨平台架构设计之前,请大家先看看上面这段影片,影片内容是微 ...
- [Architecture Design] 3-Layer基础架构
[Architecture Design] 3-Layer基础架构 三层式体系结构 只要是软件从业人员,不管是不是本科系出身的,相信对于三层式体系结构一定都不陌生.在三层式体系结构中,将软件开发所产出 ...
- Architecture Design Process
Architecture Design Process The architecture design process focuses on the decomposition of a system ...
- .NET Best Practices: Architecture & Design Patterns (5 Days Training)
.NET Best Practices: Architecture & Design Patterns (5 Days Training) .NET最佳实践:架构及设计模式 5天培训课程 课程 ...
- 论文笔记系列-Efficient Neural Architecture Search via Parameter Sharing
Summary 本文提出超越神经架构搜索(NAS)的高效神经架构搜索(ENAS),这是一种经济的自动化模型设计方法,通过强制所有子模型共享权重从而提升了NAS的效率,克服了NAS算力成本巨大且耗时的缺 ...
随机推荐
- feign 多参数问题
参考: https://stackoverflow.com/questions/43604734/springboot-feignclient-method-has-too-many-paramter ...
- Hyperledger Fabric(4)链码ChainCode
智能合约,是一个抽象的概念,智能合约的历史可以追溯到 1990s 年代.它是由尼克萨博(Nick Szabo)提出的理念,几乎与互联网同龄. 我们这里所说的智能合约只狭义的指区块链中.它能够部署和运行 ...
- MobileNet系列
最近一段时间,重新研读了谷歌的mobilenet系列,对该系列有新的认识. 1.MobileNet V1 这篇论文是谷歌在2017年提出了,专注于移动端或者嵌入式设备中的轻量级CNN网络.该论文最大的 ...
- hdu2159 二维02bag
设f[i][j]为杀第j只怪时耐久度为i的最大经验值 完全背包类型:有N种物品和一个容量为V 的背包,每种物品都有无限件可用.放入第i种物品的耗费的空间是Ci,得到的价值是Wi. 求解:将哪些物品装入 ...
- java多线程的四种实现方式
主要有四种:继承Thread类.实现Runnable接口.实现Callable接口通过FutureTask包装器来创建Thread线程.使用ExecutorService.Callable.Futur ...
- shell更改xml中的指定值
sed -i 's;<id>.*<\/id>;<id>新内容<\/id>;g' your.xml
- 在table中加入<hr />标签为什么横线会跑到上边?
这是我今天在写页面的时候发现的一个问题,万能的百度已经帮我找到答案啦!!!在此分享给你们吧 table>[caption|thead>tr|tbody>tr]>[th|td] ...
- CF1111E Tree 动态规划+LCT
这个题的思路非常好啊. 我们可以把 $k$ 个点拿出来,那么就是求将 $k$ 个点划分成不大于 $m$ 个集合的方案数. 令 $f[i][j]$ 表示将前 $i$ 个点划分到 $j$ 个集合中的方案数 ...
- spring 视图解析 ——InternalResourceViewResolver
原文:https://www.cnblogs.com/lyj-gyq/p/8963885.html Spring自带了13个视图解析器,能够将逻辑视图名转换为物理实现 首先将会介绍 InternalR ...
- MFC界面库BCGControlBar v30.1——Grid/Report控件
亲爱的BCGSoft用户,我们非常高兴地宣布BCGControlBar Professional for MFC和BCGSuite for MFC v30.1正式发布!此版本包含themed find ...