1. 介绍
paper地址:https://arxiv.org/abs/1801.04381
论文是在2018年1月提出的,题目叫:MobileNetV2: Inverted Residuals and Linear Bottlenecks,可以知道论文的创新点是 Inverted Residuals 和 Linear Bottlenecks 这两个技术。这篇论文旨在提升准确率和减少内存的占用。
2. 讨论和直觉
2.1 深度可分离卷积(Depthwise Separable Convolutions)
那我们先回顾一下深度可分离卷积,这是在MobileNetV1 论文提出的,思想是把一个标准的卷积线性分解为两个卷积层,一个是深度卷积(dw conv),让它在每一个输入通道上只使用一个过滤器(filter);第二个层就是 1x1 conv层,也叫逐点卷积(pw conv),它能把多个卷积层线性结合。
计算复杂度:
输入tensor为:,卷积核:,则会产生的输出tensor为
标准卷积的计算量为:
可分离卷积的计算量为:
当k=3时,计算量减少了8~9倍。
(更正一下,上图的output的wi和hi位置写反了)
2.2 Linear Bottlenecks
为什么需要线性瓶颈层?答:它可以防止非线性层破坏信息,非线性ReLU函数会破坏特征。
原理:
层包含激活函数的输入tensor为,其中 看作“像素”,看作“维度”。在实际的图像中,每一层的激活函数形成一个“兴趣流形(manifold of interest)”,兴趣流形在神经网络中可以嵌入到低维的子空间。还记得在MobileNetV1中的那个宽度缩放因子(width multiplier parameter)吗?它就是用来对维度进行缩放的(在MobileNetV1论文里也叫输入通道)。可是直觉告诉我们,在深层卷积神经网络中,是一个非线性的映射,比如说ReLU函数就会产生非线性。
我们再来说细一点,假如S是一个非零量,,从B的输入点映射到S,要使这个映射是线性变换,只有在 S>0 (也即x>0)的时候才会具有这种线性变换。可见使用ReLU函数不可避免地丢失了部分通道信息。然而,我们丢失的这部分信息的激活流形仍然保留在其他的通道里。
如果想要让兴趣流形保留下来,兴趣流行应该位于高维激活空间的低维子空间,它的要求:
(1)兴趣流形在ReLU函数后还是一个非零量,则是线性变换
(2)ReLU能够保存输入流形的完整信息,前提是位于输入空间的低维子空间。
上图所示,从低维空间嵌入到高维度空间的ReLU转换示例。初始的螺旋使用随机矩阵T嵌入到一个n维空间,ReLU紧随其后,再使用T的逆矩阵 降维转化为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为,扩张因子t,kernel size为k,输入通道,输出通道,所以总的计算量为这三层layer相加:
相比于上面的公式(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