轻量化卷积神经网络
MobileNetV1
MobileNet模型的核心就是将原本标准的卷积操作因式分解成一个depthwise convolution和一个1*1的卷积(文中叫pointwise convolution)操作。简单讲就是将原来一个卷积层分成两个卷积层,其中前面一个卷积层的每个filter都只跟input的每个channel进行卷积,然后后面一个卷积层则负责combining,即将上一层卷积的结果进行合并。
![](https://img.haomeiwen.com/i1507799/e595cac9ec9e6f65.png)
Fig3表达的标准卷积(左边)和因式分解后的卷积(右边)的差别。注意到卷积操作后都会跟一个Batchnorm和ReLU操作。
![](https://img.haomeiwen.com/i1507799/67bae6bd2d1e69da.png)
ShuffleNet
Xception和ResNeXt分别引进了深度分离卷积(depthwise separable convolution)和分组卷积(group convolution)来权衡模型表示能力与计算量。但是这些设计都没有考虑其中的1x1卷积(也被称为逐点卷积(pointwise convolutions)),这部分也是需要很大的计算量的。举例来说,ResNeXt中只有3x3卷积采用分组卷积,那么每个残差block中93.4%的乘加计算来自于逐点卷积,在极小的网络中逐点卷积会限制通道的数量,进而影响到模型性能。
为了解决这个问题,一个简单的解决方法就是在通道维度上应用稀疏连接,比如在1x1卷积上也采用分组卷积的方式。但是这样做会带来副作用:输出中的每个通道数据只是由输入中同组的通道数据推导得到的(如图1(a)所示),这会阻碍信息在不同分组的通道间的流动,减弱网络的表示能力。
![](https://img.haomeiwen.com/i1507799/8ec18ba309b3ba38.png)
如果让每个组的卷积可以获得其他组的输入数据(如图1(b)所示),那么输入/输出的各通道就是完全相关的。为了达到这个目的,可以将每组卷积的输出再细分,然后将细分的子组分别传输到下一层的不同组中。这个操作可以由通道重排(channel shuffle)来实现:假设分为g个组进行卷积,每组输出n个通道,那么输出的总通道数就是gxn,先将输出的维度变成(g,n),然后转置,最后还原为nxg的数据即可,结果如图1(c)所示。将通道重排后的数据作为下一层分组卷积的输入即可,这样的操作不要求两个分组卷积层有相同的分组数量。
![](https://img.haomeiwen.com/i1507799/c46de57416d56aeb.png)
之前的网络(ResNeXt、Xception)只对3x3卷积进行分组/逐通道卷积,现在在1x1卷积(也称为pointwise convolution)上也应用分组卷积,称为逐点分组卷积(1x1卷积+分组卷积),然后再加上通道重排操作,就可以在ResNet的基础上构建ShuffleNet,其单元结构见图2。
实际效果
![](https://img.haomeiwen.com/i1507799/4b3a605845e36c71.png)
MobileNetV2
MobileNetV2首先考虑了relu非线性函数的影响,我们知道relu函数只取输入的非负值,且认为这个行为导致了信息损失,而文章却给出了另一个结论。首先文章假设了每一层的特征图激活值形成了一种未知流形,虽然无法直接知道这个流形是什么,但是流形学习中最基本的想法就是高维数据能够映射到低维空间,因而这些激活值构成的流形也是能映射的。在神经网络中这种映射就体现在降低特征图的channel数,类似MobileNet v1中设置了一个超参数宽度乘子α,但是问题是这个宽度因子如何选择?降低到多少channel数能够最大程度的保留所有的信息。映射到一个合适的低维空间即等价于通过这个乘子降低到合适的channel数,且作者认为在宽度乘子作用下能够使得激活值形成的低维流形能够占满整个低维空间。就是在这个条件之下,文章通过公式证明了只有在激活值能够得到输入空间的一个低维流形时,relu函数才能够保留完备的信息。这是第一个性质,另外一个性质是当输入都是非负值时,就算经过relu变换,本质上还是线性变换,这点是显而易见的。
这个性质表明了激活值的channel数量较少时,relu无法保留完备的信息,会丢失很多信息,所以这种情况下不适合用relu,如图7所示,将原始二维信息,经过一个矩阵映射到高维空间中,再经过一个relu,反向映射回原始二维空间,由于原始的二维空间是n=15,30的低维流形,而不是n=2,3的低维流形,所以在n=2,3时信息丢失较多。
![](https://img.haomeiwen.com/i1507799/0c0f2210fbf9320e.png)
基于上述结论,文章提出了linear bottleneck layer,这个结构有三个卷积操作,即先通过1*1的PointwiseConvolution来提升channel数,再接一个DepthwiseConvolution,最后再用PointwiseConvolution将channel数量降下来。Bottleneck就体现在最后的这个降低channel数的PointwiseConvolution,根据之前对relu的研究,这种维数较低的channel之后再加relu会损失信息,所以linear则体现在最后的PointwiseConvolution之后不像之前一样接relu了。
![](https://img.haomeiwen.com/i1507799/081a6c1ab235f1cc.png)
从实验结果上来看线性层确实能够防止非线性破坏过多的信息。
![](https://img.haomeiwen.com/i1507799/ea8fa9deb861e07b.png)
为了获得更强的深层反向梯度传播能力,在v2版本中加入了shortcut连接方式,inverted residuals的inverted体现跟resnet相反的设计方式,传统的resnet模块,往往会将输入channel先用PointwiseConvolution降低,执行了正常的卷积操作之后再用PointwiseConvolution将channel增加还原,而本文的设计则跟这个方式刚好是反的。图10的结果中也可看出加入shortcut连接性能提升很多。
![](https://img.haomeiwen.com/i1507799/155f0759deb39900.png)
整体网络结构
![](https://img.haomeiwen.com/i1507799/3f3532edea7df7df.png)