轻量化网络:MobileNetV2 论文理解

1. 介绍

paper地址:https://arxiv.org/abs/1801.04381

论文是在2018年1月提出的,题目叫:MobileNetV2: Inverted Residuals and Linear Bottlenecks,可以知道论文的创新点是 Inverted ResidualsLinear Bottlenecks 这两个技术。这篇论文旨在提升准确率减少内存的占用

 

2. 讨论和直觉

2.1 深度可分离卷积(Depthwise Separable Convolutions)

那我们先回顾一下深度可分离卷积,这是在MobileNetV1 论文提出的,思想是把一个标准的卷积线性分解为两个卷积层,一个是深度卷积(dw conv),让它在每一个输入通道上只使用一个过滤器(filter);第二个层就是 1x1 conv层,也叫逐点卷积(pw conv),它能把多个卷积层线性结合。

计算复杂度:

输入tensor为:h_i\times w_i\times d_i,卷积核:\large K\in \mathbb{R}^{k\times k\times d_i\times d_j},则会产生的输出tensor为h_i\times w_i\times d_j

标准卷积的计算量为:h_i\cdot w_i\cdot d_i\cdot d_j\cdot k\cdot k

可分离卷积的计算量为:h_i\cdot w_i\cdot d_i\left ( k^2+d_j \right ) \;\;\; (1)

当k=3时,计算量减少了8~9倍。

(更正一下,上图的output的wi和hi位置写反了)

 

2.2 Linear Bottlenecks

 为什么需要线性瓶颈层?答:它可以防止非线性层破坏信息,非线性ReLU函数会破坏特征。

原理:

L_i层包含激活函数的输入tensor为h_i\times w_i\times d_i,其中h_i\times w_i 看作“像素”,d_i看作“维度”。在实际的图像中,每一层的激活函数形成一个“兴趣流形(manifold of interest)”,兴趣流形在神经网络中可以嵌入到低维的子空间。还记得在MobileNetV1中的那个宽度缩放因子(width multiplier parameter)吗?它就是用来对维度d_i进行缩放的(在MobileNetV1论文里d_i也叫输入通道)。可是直觉告诉我们,在深层卷积神经网络中,是一个非线性的映射,比如说ReLU函数就会产生非线性。

我们再来说细一点,假如S是一个非零量,S = ReLU(Bx),从B的输入点映射到S,要使这个映射是线性变换,只有在 S>0 (也即x>0)的时候才会具有这种线性变换。可见使用ReLU函数不可避免地丢失了部分通道信息。然而,我们丢失的这部分信息的激活流形仍然保留在其他的通道里

如果想要让兴趣流形保留下来,兴趣流行应该位于高维激活空间的低维子空间,它的要求:

(1)兴趣流形在ReLU函数后还是一个非零量,则是线性变换

(2)ReLU能够保存输入流形的完整信息,前提是位于输入空间的低维子空间。

上图所示,从低维空间嵌入到高维度空间的ReLU转换示例。初始的螺旋使用随机矩阵T嵌入到一个n维空间,ReLU紧随其后,再使用T的逆矩阵 T^{-1} 降维转化为2D的维度。我们发现当n=2,3 时,信息丢失严重,某些点出现坍塌。当n=15至30时,信息能比较好的保存,这个转化后就变得高度非凸(因为ReLU是非线性函数)。得出结论——兴趣流行应该位于高维激活空间的低维子空间。

使用线性重要性:它可以防止非线性层破坏信息,在bottlenecks中的非线性层会使模型降低好几个百分点。作者验证在传统的resitual block里面移除非线性,在CIFAR数据集上的表现得到提升,进一步证明了我们的直觉。

所以在这里作者具体的操作是:在 bottleneck 的最后一个 1x1 conv 层,把ReLU函数替换为Linear 线性函数,以防止ReLU破坏特征。

在上图中描述的是可分离卷块的演化过程。图(a)是标准的卷积;(b)是深度可分离卷积;(c)是带线性瓶颈层的深度可分离卷积;(d)是具有扩张的瓶颈层。

 

2.3 Inverted residuals

我们在传统的residual 加shortcut,目的是:提高梯度跨层传播的能力。而反向设计大大提高了内存效率(请看论文 Session 5 )。

图中带有对角斜线的层没有使用非线性,用厚度来表示每个block的输入通道。

为啥叫Inverted residual block? 从图(a)中看到传统的residual block输入 channels是较大的,先“压缩”再用3x3 dw conv 提取特征,这样得到的特征就少了,遵循的步骤是:压缩--> 提特征-->扩张;而Inverted residual 输入 channel 可以相对较少,先“扩张”通道再提取特征,然后再进行压缩。步骤是:扩张-->提特征-->压缩。这个过程刚好和residual相反,所以叫inverted residual (倒置残差块)

 

bottleneck block的结构如上表所示,block size为h\times w,扩张因子t,kernel size为k,输入通道d',输出通道d'',所以总的计算量为这三层layer相加:

(1\times 1\times h\times w\times d'\times td') + (k\times k\times h\times w\times td'\times 1)+ (1\times 1\times h\times w\times td'\times d'')

=h\cdot w\cdot d'\cdot t(d'+k^2+d'')

相比于上面的公式(1),这里确实多了一个1x1 conv 层,但是我们输入维度(指 input channel)和输出维度(output channel)更小了啊。

 

3. 网络模型架构

Bottleneck residual 块的结构在上面的Table1已经给出,整个模型架构:

先是一个全卷积层,然后再接多个bottleneck residual 层,还有conv2d和avgpool 层。用ReLU6作为非线性函数,因为它具有好的鲁棒性,计算复杂度也比较低。卷积核使用3x3作为标准,在训练的时候使用dropout和batch normalization。除了第一层全卷积外,整个网络使用一个固定的扩张率,扩张率在5~10之间性能差不多,论文中作者使用的是6。作者经验:小的网络就使用较小的扩张率,较大的网络就用较大的扩张率。

下图是对比不同架构的网络的卷积块的实现方法。MobileNet V1 和 MobileNet V2 我们都比较熟悉了,注意一下MobileNet V2 输入的步长stride=1时,使用了一个快捷连接,步长为2时则不用,主要是为了与shortcut的维度匹配。ShuffleNet使用的是Group Conv(组卷积)和shuffling来实现,它还使用residual 的方法,让内部块(inner blocks)比输出块(output blocks)更窄。

 

论文中还介绍了内存效率的计算,以及如何提升推理的效率等,读者可以多自行分析,这些部分我也没有看明白。作者尝试了MobileNet V2在图片分类、目标检测、语义分割等任务,都得到不错的表现。

再次说明了MobileNet V2 特别适用于手机端,它有非常好的内存效率来做推理,同时它也适用于目前所有网络架构。


References:

[1] MobileNetV2: Inverted Residuals and Linear Bottlenecks

[2] 轻量化网络:MobileNet-V2

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liguiyuan112

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值