为什么MobileNet及其变体(如ShuffleNet)会变快&什么时候会受限

Introduction

在本文中,我概述了高效CNN模型(如MobileNet及其变体)中使用的组成部分(building blocks),并解释了它们如此高效的原因。特别地,我提供了关于如何在空间和通道域进行卷积的直观说明。

在高效的模型中使用的组成部分

在解释具体的高效CNN模型之前,我们先检查一下高效CNN模型中使用的组成部分的计算量,看看卷积在空间和通道域中是如何进行的。

在这里插入图片描述

假设 H x W 为输出feature map的空间大小,N为输入通道数,K x K为卷积核的大小,M为输出通道数,则标准卷积的计算量为 HWNK²M 。
这里重要的一点是,标准卷积的计算量与
(1)输出特征图H x W的空间大小,
(2)卷积核K的大小,
(3)输入输出通道的数量N x M
成正比。
当在空间域和通道域进行卷积时,需要上述计算量。通过分解这个卷积,可以加速 CNNs,如图所示。

卷积

3x3
在这里插入图片描述
上图为标准卷积,k=2
每个通道都是全连接的,即输出的那个点和所有通道都有关系,所以计算量是下图
在这里插入图片描述
空间部分是有感受野的,所以只是局部的

1x1

pointwise convolution

Pointwise卷积相当于在通道之间“混合”信息。主要用于改变输出通道特征维度。Pointwise计算量为HWNM。
在这里插入图片描述

分组卷积

分组卷积是卷积的一种变体,将输入的feature map的通道分组,对每个分组的通道独立地进行卷积。
假设 G 表示组数,分组卷积的计算量为 HWNK²M/G,计算量变成标准卷积的1/G。
在这里插入图片描述

深度可分离卷积

在深度卷积中,对每个输入通道分别进行卷积。它也可以定义为分组卷积的一种特殊情况,其中输入和输出通道数相同,G等于通道数。group=C组(既Depthwise 是Grouped Convlution的特殊简化形式)计算量为HWK²M
(是普通卷积计算量的1/N,通过忽略通道维度的卷积显著降低计算量)
在这里插入图片描述
在这里插入图片描述

Channel Shuffle

Grouped Convlution导致模型的信息流限制在各个group内,组与组之间没有信息交换,这会影响模型的表示能力。因此,需要引入group之间信息交换的机制,即Channel Shuffle操作。

Channel shuffle是一种操作(层),它改变 ShuffleNet 中使用的通道的顺序。这个操作是通过张量reshape和 transpose 来实现的。
在这里插入图片描述
右边就有交换层的位置,也就换了组,即,组间信息交换

Efficient Models

下面,对于高效的CNN模型,我将直观地说明为什么它们是高效的,以及如何在空间和通道域进行卷积。

ResNet (Bottleneck Version)

ResNet 中使用的带有bottleneck 架构的残差单元是与其他模型进行进一步比较的良好起点。具有bottleneck架构的残差单元由conv1x1、conv3x3、conv1x1组成。第一个conv1x1减小了输入通道的维数,降低了随后的conv3x3的计算量。最后的conv1x1恢复输出通道的维数。

ResNeXt

ResNeXt是一个高效的CNN模型,可以看作是ResNet的一个特例,将conv3x3替换为成组的conv3x3。通过使用有效的分组conv,与ResNet相比,conv1x1的通道减少率变得适中,从而在相同的计算代价下获得更好的精度。

MobileNet (Separable Conv)

MobileNet是一个可分离卷积模块的堆叠,由depthwise conv和conv1x1 (pointwise conv)组成。
可分离卷积在空间域和通道域独立执行卷积。这种卷积分解显著降低了计算量,从 HWNK²M 降低到HWNK² (depthwise) + HWNM (conv1x1), HWN(K² + M) 。一般情况下,M>>K(如K=3和M≥32),减小率约为1/8-1/9。
这里重要的一点是,计算量的bottleneck现在是conv1x1!
在这里插入图片描述
在这里插入图片描述

ShuffleNet

ShuffleNet的动机是如上所述,conv1x1是可分离卷积的瓶颈。可以看作是ResNet的压缩版本。虽然conv1x1已经是有效的,似乎没有改进的空间,分组conv1x1可以用于此目的!
这里重要的building block是channel shuffle层,它在分组卷积中对通多在组间的顺序进行“shuffles”。如果没有channel shuffle,分组卷积的输出在组之间就不会被利用,导致精度下降。
在这里插入图片描述
存在问题:
1、channel shuffle在工程实现占用大量内存和指针跳转,这部分很耗时。

2、channel shuffle的规则是人工设计,分组之间信息交流存在随意性,没有理论指导。

MobileNet-v2

MobileNet-v2采用类似ResNet中带有bottleneck架构残差单元的模块架构;用深度可分离卷积(depthwise convolution)代替conv3x3,是残差单元的改进版本。

与标准的 bottleneck 架构相反,第一个conv1x1增加了通道维度,然后执行depthwise conv,最后一个conv1x1减少了通道维度。

通过如上所述对building blocks 进行重新排序,并将其与MobileNet-v1(可分离的conv)进行比较,我们可以看到这个体系结构是如何工作的(这种重新排序不会改变整个模型体系结构,因为MobileNet-v2是这个模块的堆叠)。
在这里插入图片描述

上述模块可以看作是可分离卷积的一个改进版本,其中可分离卷积中的单个conv1x1被分解为两个conv1x1。让T表示通道维数的扩展因子,两个 conv1x1 的计算量为 2HWN²/T ,而可分离卷积下的conv1x1的计算量为 HWN²。在[5]中,使用T = 6,将 conv1x1 的计算成本降低了3倍(一般为T/2)。

FD-MobileNet

在这个模型中,与MobileNet相比,下采样在较早的层中执行。这个简单的技巧可以降低总的计算成本。其原因在于传统的向下采样策略和可分离变量的计算代价。

从VGGNet开始,许多模型采用相同的下采样策略:执行向下采样,然后将后续层的通道数增加一倍。对于标准卷积,下采样后计算量不变,因为根据定义得 HWNK²M 。而对于可分离变量,下采样后其计算量减小;由 HWN(K² + M) 降为 H/2 W/2 2N(K² + 2M) = HWN(K²/2 + M)。当M不是很大时(即较早的层),这是相对占优势的。

什么时候又会受限

工程上提升和传统比效果有折扣
这要从内存访问的角度考虑,更多分支会带来更多的访问时间。
MobileNet在移动端效果好,PC机效果没那么好
很多原因是 CPU 和 GPU 计算方式有区别
CPU 有cache,并不总从内存取数据,for时命中率高可以快很多,再快十几倍很正常
GPU简单来说不受缓存影响,
mobilenet 就是利用了分离的技巧,用更多的层数换取了更高的缓存命中率,所以对 CPU 计算更友好。mobilenet 是希望提高移动端计算的速度,目前为止移动端神经网络推理大多数情况下还是使用 CPU 进行。

mobilenet 是希望提高移动端计算的速度,目前为止移动端神经网络推理大多数情况下还是使用 CPU 进行。

举个简单栗子,两个矩阵相乘,简单直白的三重循环就搞定,时间复杂度 O(mnk),可是同样是三重循环,实际运行速度可以差好多倍。简单调换一下三重循环的内外顺序,就可以做到。是不是很神奇?我打赌现在大批做算法的同学,听都没听过这种事情。这在以前,可是学计算机要掌握的基础知识啊。

后记

看完这些,希望你已经没有想看源码的冲动了。
如果是这样的话,不妨点个赞吧。

为何要点赞?

如果本文解决了你的困惑,不妨点个赞鼓励一下。
不管你信不信,也不管你同不同意,实际上,你的每一次点赞都标志着你自身的进步。而打赏乃是点赞的高级形式
曾经有无数个点赞的机会,但是我都没有好好珍惜,假如时光可以倒流,我一定为他们也为自己点赞。

引用
https://medium.com/@yu4u/why-mobilenet-and-its-variants-e-g-shufflenet-are-fast-1c7048b9618d

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值