轻量化网络系列 | 解读ShuffleNet V1-V2

ShuffleNet V1 论文原文:ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices

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

1. ShuffleNet V1

文章标题:ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices

作者单位:Megvii Inc(Face++)

网络精度:TOP-1 Accuracy 67.4%(1x, g=3)or 67.6%(1x, g=8)

1.1 核心思路

与 MobileNet V1 所提实验结论相类似,ShuffleNet V1 也发现 1x1 卷积将会耗费了大量的计算时间,为此 ShuffleNet V1 提出逐点群卷积来减少计算时间,但逐点群卷积存在不同组间的信息无法进行交互的问题,因此文章还提出通道混洗的操作来帮助信息流通。( ShuffleNet V1 很多结构设计思想在 ShuffleNet V2 中被推翻,通道混洗操作被保留)

1.2 详解

1. Pointwise Group Convolution(逐点群卷积)

文章发现,诸如 Xception 和 ResNeXt 等 SOTA 的网络基础结构,在小型网络中效率很低,原因在于其中的 1x1 卷积占用了大量的算力资源,对此提出逐点群卷积以减少 1x1 卷积的计算复杂度。这里的逐点群卷积类似于 AlexNet 中的分组卷积,不同的是二者所使用的卷积核大小不同,ShuffleNet V1 使用 1x1 大小的卷积核,而 AlexNet 使用 5x5 或 3x3 大小的卷积核。

2. Channel Shuffle(通道混洗)

在这里插入图片描述

通道混洗的做法:

1)假设输入特征图的通道数为 c ,将通道分为 g 组(组数 g 可以控制逐点卷积的稀疏连接),每组内包含 n 个通道,即 c = g × n c=g×n c=g×n,在通道方向上可重组为一个 g × n g×n g×n 的矩阵;

2)对 g × n g×n g×n 的矩阵进行转置,得到 n × g n×g n×g 的新矩阵;

3)在 n × g n×g n×g 的新矩阵行方向上进行展平操作,以 n 为距离进行重新分组,得到混洗后的输出通道。

3. ShuffleNet V1单元

在这里插入图片描述

文章将 (a) 称作 residual block,ShuffleNet V1 的模块单元便是在 (a) 的基础上将所有的 1x1 卷积替换为逐点群卷积,并在第一个逐点群卷积后进行通道混洗操作,而第二个逐点群卷积后不再进行通道混洗操作(重复且无必要),另外参照 Xception 移除 3x3 深度卷积后的 ReLU 激活函数。卷积步长为 2 时,在 shortcut 路径上增加步长为 2 的平均池化,并将通道间逐元素的相加改为按照通道方向的拼接操作。

4. 网络结构

在这里插入图片描述

在 3 个 stage 中都存在多个重复单元,并且仅在 Stage2 中的第一个逐点群卷积仅进行逐点卷积操作,即不进行分组。

5.ShuffleNet V1的性能表现

下表给出 ShuffleNet V1 取不同组数和缩放比例时的性能表现及相应 FLOPs 。

在这里插入图片描述

其中,ShuffleNet S× 中的 S 代表 filter 数量相较于 ShuffleNet 1× 的比例,所对应的 MFLOPs 也相应变化 S 2 S^2 S2倍。另外,当 g=1 时,ShuffleNet V1 退化为 Xception 的结构。

在相同 FLOPs 下,与其他网络的比较:

在这里插入图片描述

与 MobileNet V1 的比较:

在这里插入图片描述

2. ShuffleNet V2

文章标题:ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design

作者单位:Megvii Inc(Face++);Tsinghua University

网络精度:TOP-1 Accuracy 69.4%(1x) 74.9%(2x)

2.1 核心思路

即使是相同 FLOPs 的网络其运行速度也存在差异,仅用 FLOPs 衡量计算复杂度并在此基础进行优化网络是远远不够的。对此,ShuffleNet V2 从内存访问代价(Memory Access Cost,MAC)和 GPU 并行性的方向分析如何设计网络以减少运行时间,进而更直接地提高模型的效率,从理论推算和实验结论两个角度进行分析,给出 4 个设计准则:

  1. 使用输入通道和输出通道相同的卷积操作;
  2. 谨慎使用分组卷积;
  3. 减少网络分支数;
  4. 减少 element-wise 操作。

注:ShuffleNet V1 违背准则 1 和 2 。

2.2 详解

在一些论文利用张量分解的方式减少了 75% 的 FLOPs ,理论上应该加快了模型运算速度,但实际部署在 GPU 上却慢了很多。论文认为,这是因为 CUDNN 针对 3x3 卷积进行了优化,所以不可想当然认为 3x3 卷积会比 1x1 卷积慢 9 倍。文章给出了不同平台的网络运算时间占比情况:

在这里插入图片描述

其中,FLOPs 仅体现了卷积部分的运算状况(所以更加证实 FLOPs 是片面的,不能作为唯一的衡量标准)。

1. 4个设计准则的理论推算与实验结论

  • G1:使用相同的输入输出通道数可以最小化 MAC

以常用 1x1 卷积为例,设特征图大小为 h × w h×w h×w ,其输入通道数为 c 1 c_1 c1 ,输出通道数为 c 2 c_2 c2 ,则其对应的 FLOPs 为 B = h w c 1 c 2 B=hwc_1 c_2 B=hwc1c2,那么相对应的 M A C = h w ( c 1 + c 2 ) + c 1 c 2 MAC=hw(c_1+c_2 )+c_1 c_2 MAC=hw(c1+c2)+c1c2 。根据中值定理可以推出:

M A C ≥ 2 h w B + B h w MAC≥2\sqrt{hwB}+\frac{B}{hw} MAC2hwB +hwB

当且仅当 c 1 = c 2 c_1=c_2 c1=c2 时,等号成立。

上述理论推理是建立在设备内存足够大的假设下进行的,而实际设备内存可能出现不充足的情况,文章对此进行实验,得到下表结果(与理论推理相一致)。

在这里插入图片描述

当输入通道数等于输出通道数时,MAC 达到最小,相应的运行速度也最快。

  • G2:MAC和分组卷积的组数成正比

对于逐点群卷积存在

M A C = h w ( c 1 + c 2 ) + c 1 c 2 g = h w c 1 + B g c 1 + B h w MAC=hw(c_1+c_2 )+\frac{c_1 c_2}{g}=hwc_1+\frac{Bg}{c_1} + \frac{B}{hw} MAC=hw(c1+c2)+gc1c2=hwc1+c1Bg+hwB

其中,FLOPs 为 B = h w c 1 c 2 g B=\frac{hwc_1 c_2}{g} B=ghwc1c2

因此,对于一个给定的 h × w × c 1 h×w×c_1 h×w×c1 的特征图,其 MAC 取决于 g 。

下表是相同 FLOPs 下,取 g 的不同值的实验结果,结果显示无论 GPU 还是 CPU 上,g 越大其速度都越慢。

在这里插入图片描述

  • G3:网络的分支数量降低并行能力

通过增加网络分支的方式可以一定程度增加模型精度,但是会降低在诸如 GPU 等具有强大并行计算能力的设备的运行效率。

在这里插入图片描述

分别堆叠 10 次上图的 blocks 进行实验得到下表结果:

在这里插入图片描述

发现 blocks 的效率从高到低排序为:(a)>(b)>(d)> (c)>(e) 。造成这种现象的原因是更多的分支需要更多的卷积核加载和同步操作。

  • G4:不可忽视element-wise操作带来的MAC影响

在这里插入图片描述

在计算 FLOPs 时通常只考虑卷积中的乘法操作,但是一些 element-wise 操作(包括ReLU、卷积偏置、张量加法等)经常被忽略掉。

事实上,在 GPU 设备,看似不多的 element-wise 操作却占据了相当比例的运行时间,尤其是深度卷积这种 MAC / FLOPs 比值较高的卷积操作(暗指 DW 卷积之后不接 ReLU )。

为此,作者使用 bottleneck 单元测试有无 ReLU 和 shortcut 结构对运行速度的影响。

在这里插入图片描述

无 ReLU、无 shortcut 结构的组计算速度最快。

2. ShuffleNet V2 的基本单元

在这里插入图片描述

上图 (c)为 ShuffleNet V2 的基础单元,(d) 为下采样时所使用的模块单元。

为了满足上述 4 条设计准则,作者设计出了高效的 ShuffleNet V2 基本单元。

比如(c), channel split 操作将总通道数 c 的特征图分为 ( c − c ′ ) (c-c') (cc) 通道数分支和 c ′ c' c 通道数分支(简单起见可以设 c ′ = 1 2 c c'=\frac{1}{2}c c=21c),这是为了最大程度满足 G3 (减少网络分支数)。

同时,在左分支不进行任何操作,右分支由三个相同输入输出通道数的卷积组成,这满足了 G1(使用输入通道和输出通道相同的卷积操作)。在右分支的 1x1 卷积没有使用分组卷积的方式,这满足了 G2(谨慎使用分组卷积)。经由两个分支之后,按通道方向进行拼接操作,因此输入通道数c的初始特征图经过该单元通道数依然为c,这又一次满足了 G1 (使用输入通道和输出通道相同的卷积操作)。完成通道拼接后借鉴 ShuffleNet V1 进行通道混洗操作,实现两个分支的通道信息交互。另外, ShuffleNet V2 的网络结构是对单元的堆叠,因此堆叠时拼接操作、通道混洗操作、通道分割操作(Channel Split)三个 element-wise 操作可以合并为一个,这满足了 G4(减少 element-wise 操作)。

3. 网络结构

在这里插入图片描述

4. ShuffleNet V2的性能表现

在这里插入图片描述

在相似 FLOPs 下,ShuffleNet V2 有着更高的精度和速度(尤其在 ARM 上)。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值