MobileNet_v2详解

一、背景介绍

  MobileNet_v1看起来已经不错了,但有人在实际使用的时候, 发现depthwise layer的卷积核在训练之后不少参数为0,这很可能是因为ReLU导致神经元死亡。另外,MobileNet_v1没有引入shortcut,无法复用特征。

MobileNet_v2详解

二、思路提出

2.1 Linear Bottlenecks

  假设将许多张图片作为网络的输入,经过第i层输出并**之后得到一个hi×wi×dih_i \times w_i \times d_i的张量,如果把这个张量看作是hi×wih_i \times w_i个具有did_i维的点构成,那我们可以进一步把这个张量视为manifold of interest(可以理解为有用的特征)。这里manifold流形,如果以前没接触的话可以先移步流形学习的基本思想-知乎

  根据流形的思想,虽然对于神经网络的每一层,我们得到的是许多个did_i维的像素,但是这些高维数据里蕴含的信息实际上也存在于低维流形之中。作者说本来这个想法可以通过MobileNet_v1提出的width multiplier来验证,通过直接降维以达到让manifold of interest覆盖一整个低维子空间,我猜意思可能类似于下图,让3维空间中的一部分数据通过流形学习降维并覆盖满二维空间:

MobileNet_v2详解

  但是作者发现CNN里有个非线性变换ReLU,所以这想法不行。因为涉及到流形,不行的原因我解释不了(论文里每个单词我都认得,但是我看不懂),所以后面我就直接放结论了。

  作者认为ReLU会造成信息的丢失,但是输入数据的channel越多,信息保存得越好。假设在2维空间有一组由m个点组成的螺旋线XmX_m数据作为输入,利用随机矩阵TT映射到n维空间上并进行ReLU运算,然后再利用T1T^{-1}投影回到2维空间得到$X_m^{’} $,即:
y=ReLU(TXm)Xm=T1y y = ReLU(TX_m) \\ X_m^{'} = T^{-1}y

再将XmX_mXmX_m^{'}进行比较,就可以看出ReLU的作用。如下图所示,可以看到在n = 2,3的时候,XmX_m^{'}和原来相比已经丢失很多信息了,但是n = 15, 30的时候情况会好很多:

MobileNet_v2详解

  我的理解是:因为ReLU会把负值归零,所以对于did_i维的像素,如果did_i越大,这么多特征经过ReLU后可能保留下的信息也就会越多,如果只有2/3维,那么一不小心就容易丢失信息。这类似于分散投资的想法,不要把所有鸡蛋放在一个篮子里。作者的原话也是大概这个意思:

when ReLU collapses the channel, it inevitably loses information in that channel. However if we have lots of channels, and there is a structure in the activation manifold that information might still be preserved in the other channels.

总之,作者最后得到了两个结论

  • 如果经过ReLU后输入还是非零的,那ReLU实际上只是一个线性变换
  • 仅当输入可以被嵌入到低维流形里时,ReLU可以保留输入的完整信息。我的理解是,因为ReLU会造成信息丢失,但是如果输入没有信息冗余的话,ReLU是保留不了完整信息的。

  基于这两个结论,作者提出了本文关键linear bottlenecklinear bottleneck本质上就是将1×11 \times 1的卷积层之后的ReLU替换成了Linear Layer,而称作bottleneck是因为通道数明显改变了。下图带有纹理的方块就是指Linear Layer,原本MobileNet_v1里的pointwise layer之后使用ReLU的,但是这里换成了线性函数。
MobileNet_v2详解

2.2 Inverted residuals

  在Linear Bottleneck的基础上,作者还想引入ResNet的残差连接,以实现特征复用和缓解梯度消失/爆炸,所以提出了inverted residual
MobileNet_v2详解

  图(a)是ResNet里的Residual block,图(b)就是MobileNet_v2提出的inverted residual block。两者区别在哪呢?图上蓝色方块的厚度表示通道数量,可以看出Residual block是先降维再进行升维,而inverted residual block是先升维再进行降维,即如下图所示:
MobileNet_v2详解

  具体来说,ResNet是先将通道数降为原来的0.25倍,最后通过1×11 \times 1的卷积升维至原输入的通道数;MobileNet_v2则是先将输入的通道数升维至6倍,最后通过1×11 \times 1的卷积降维至原输入的通道数。因为两者升降维顺序恰好相反,所以后者称为inverted residual。MobileNet_v2里升维的系数,也就是这里的6倍,称为expansion ratio,用于升维的这一个1×11 \times 1卷积称为expansion layer因为之前提到在高维下ReLU保留的信息更完整,所以要先升维,防止ReLU在通道数少的情况下造成信息丢失。另外,要注意的是,这里的残差连接的是两个bottleneck,即通道数较小的两层,而原来的Residual block连接的是通道数较大的两层。至少在MobileNet里,前者设计的shortcut效果更好。

MobileNet_v2详解

  再来和MobileNet_v1对比一下,MobileNet_v2多了一个1×11 \times 1卷积,那参数量和计算量变大了吗?答:没有。因为MobileNet_v2的设计理念可以将输入和输出通道数大大降低,使得Multi-Adds、参数量以及运行时间都比MobileNet_v1少,并且准确率更高。

参考资料