MobileNet_v2详解
一、背景介绍
MobileNet_v1看起来已经不错了,但有人在实际使用的时候, 发现depthwise layer
的卷积核在训练之后不少参数为0,这很可能是因为ReLU导致神经元死亡。另外,MobileNet_v1没有引入shortcut
,无法复用特征。
二、思路提出
2.1 Linear Bottlenecks
假设将许多张图片作为网络的输入,经过第i
层输出并**之后得到一个的张量,如果把这个张量看作是个具有维的点构成,那我们可以进一步把这个张量视为manifold of interest
(可以理解为有用的特征)。这里manifold
是流形,如果以前没接触的话可以先移步流形学习的基本思想-知乎。
根据流形的思想,虽然对于神经网络的每一层,我们得到的是许多个维的像素,但是这些高维数据里蕴含的信息实际上也存在于低维流形之中。作者说本来这个想法可以通过MobileNet_v1提出的width multiplier
来验证,通过直接降维以达到让manifold of interest
覆盖一整个低维子空间,我猜意思可能类似于下图,让3维空间中的一部分数据通过流形学习降维并覆盖满二维空间:
但是作者发现CNN里有个非线性变换ReLU,所以这想法不行。因为涉及到流形,不行的原因我解释不了(论文里每个单词我都认得,但是我看不懂),所以后面我就直接放结论了。
作者认为ReLU会造成信息的丢失,但是输入数据的channel
越多,信息保存得越好。假设在2维空间有一组由m个点组成的螺旋线数据作为输入,利用随机矩阵映射到n维空间上并进行ReLU运算,然后再利用投影回到2维空间得到$X_m^{’} $,即:
再将和进行比较,就可以看出ReLU的作用。如下图所示,可以看到在n = 2,3
的时候,和原来相比已经丢失很多信息了,但是n = 15, 30
的时候情况会好很多:
我的理解是:因为ReLU会把负值归零,所以对于维的像素,如果越大,这么多特征经过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 bottleneck
。linear bottleneck
本质上就是将的卷积层之后的ReLU替换成了Linear Layer
,而称作bottleneck
是因为通道数明显改变了。下图带有纹理的方块就是指Linear Layer
,原本MobileNet_v1里的pointwise layer
之后使用ReLU的,但是这里换成了线性函数。
2.2 Inverted residuals
在Linear Bottleneck
的基础上,作者还想引入ResNet的残差连接,以实现特征复用和缓解梯度消失/爆炸,所以提出了inverted residual
。
图(a)是ResNet里的Residual block
,图(b)就是MobileNet_v2提出的inverted residual block
。两者区别在哪呢?图上蓝色方块的厚度表示通道数量,可以看出Residual block
是先降维再进行升维,而inverted residual block
是先升维再进行降维,即如下图所示:
具体来说,ResNet是先将通道数降为原来的0.25
倍,最后通过的卷积升维至原输入的通道数;MobileNet_v2则是先将输入的通道数升维至6
倍,最后通过的卷积降维至原输入的通道数。因为两者升降维顺序恰好相反,所以后者称为inverted residual
。MobileNet_v2里升维的系数,也就是这里的6
倍,称为expansion ratio
,用于升维的这一个卷积称为expansion layer
。因为之前提到在高维下ReLU保留的信息更完整,所以要先升维,防止ReLU在通道数少的情况下造成信息丢失。另外,要注意的是,这里的残差连接的是两个bottleneck
,即通道数较小的两层,而原来的Residual block
连接的是通道数较大的两层。至少在MobileNet里,前者设计的shortcut
效果更好。
再来和MobileNet_v1对比一下,MobileNet_v2多了一个卷积,那参数量和计算量变大了吗?答:没有。因为MobileNet_v2的设计理念可以将输入和输出通道数大大降低,使得Multi-Adds、参数量以及运行时间都比MobileNet_v1少,并且准确率更高。