论文作者:Mark Sandler, Andrew Howard, Menglong Zhu, Andrey Zhmoginov, Liang-Chieh Chen
相关代码:
摘要
文章介绍了新的提高应用于多任务上的轻型网络;介绍了将模型应用于新的SSDLite框架上。这个模型是基于倒置残差结构; 发现移除比较narrow的神经网络层中的非线性比较重要。分别在分类和目标检测的任务上做了实验。
【这篇文章主要提出的是inverted bottleneck结构和结构中线性的加入,都是为了在传播过程中可以最大化保留输入数据的信息】
简介
神经网络被运用在很多需要人工智能技术的地方,并且能够很好的提升实现任务的效率和精度。然而这些的前提是需要有大量的计算资源,如果希望将这些模型应用于手机一些计算资源匮乏的设备,那么将会收到很大的限制。本篇文章介绍了一种新的轻型网络计算机视觉模型,可以用在手机等移动设备上并且保持同样的准确率。
本篇文章的主要贡献是新型的网络模块:inverted residual linear bottleneck 【转置残差线性的bottleneck结构,其实看了结构之后就很好理解他的名称了】。模块的输入是低维度的压缩特征,在经过模块时先被拓展到高维然后经过轻型卷积。之后特征在线性卷积后被投射回低纬度。Tensoflow-slim库中有官方的应用。
相关文章
- 近来有很多模型的设计都提高了任务的准确度 AlexNet, VGGNet, GoogLeNet, ResNet
- 也有很多对训练超参的优化
- 还有一些文章提出对网络结构模块内部链接进行改造 ShuffleNet, 或者引入稀疏性
- 进来还有一些利用集中于遗传网络和强化学习进行网络搜索的方法。
在本篇文章中,我们理智于构建一个简单而高效的网络,本网络的构建是基于MobileNetV1完成的,在提升精度的前提下,保持了网络建构的简单并且不需要引入其他的特殊的操作。
初期工作,讨论和直觉设计
Depthwise Seperable Convolution
深度分离卷积最基本的想法就是将一个全连接卷及操作划分为两步卷积操作,在这两步操作之下可以大大减少卷积的参数。
两步操作如下:
Depthwise Convolution
深度卷积这个叫法说起来很泛泛,但实际上很好理解。就是对输入的的每一层channel进行一个卷积操作。在标准的卷及操作中,一个 $h_i\times w_i\times d_i$ 的输入,经过一个 $k\times k\times d_i\times d_j$ 的kernel之后,(在适当的padding下),会生成一个 $h_i\times w_i\times d_j$ 的输出。【$d_j$ 是卷积kernel的个数】,简化一下来说,在标准的卷积操作中,在和一个 $k\times k\times d_i$ 的kernel做卷积后的结果会是 $h_i\times w_i\times 1$ 的特征。
但是在深度卷积操作中, $k\times k\times d_i$ 这个kernel中的每一层分别对 $h_i\times w_i\times d_i$ 的每一层进行卷积,就可以得到一个 $h_i\times w_i\times d_i$ 的结果, 所以少了很多乘法的操作。
【可以理解为我们现在有$d_i$ 个 $k\times k \times 1$ 的kernel,其中每一个kernel分别对$h_i\times w_i\times d_i$ 中的每一层进行卷积,然后再排列在一起】
Pointwise Convolution
那既然通过之前的一步产生了 $h_i\times w_i\times d_i$ 的特征,那么这一步就通过 $d_j$ 个 $1\times 1\times d_i$ 的kernel,对将它变为 $h_i\times w_i\times d_j$ 维。这一步其实是对之前产生的特征进行组合。
在标准的卷积操作下,得到一个 $h_i\times w_i\times d_j$ 的特征需要的乘法操作是: $k\times k\times d_i \times(h_i \times w_i) \times d_j$ 【这里基本按照卷积操作顺序写的,每一次卷积需要做$k\times k\times d_i$ 次乘法,一共做$h_i \times w_i$ 次,一共有 $d_j$ 个kernel】
在深度卷积网络下,得到一个 $h_i\times w_i\times d_j$ 的特征时需要的乘法操作是:$k \times k\times h_i\times w_i\times d_i$【depthwise】+ $h_i\times w_i\times d_i \times d_j$ 【pointwise】 = $h_i\times w_i\times d_i(k^2+d_j)$, 乘法减少了大概 $k^2$ 倍
Linear Bottleneck
假设现在的神经网络有 $n$ 层,每一层 $L_i$ 都有一个大小为 $h_i\times w_i\times d$ 的activation tensor。这部分将讨论这些acti tensor 的基本性质。【大概是个高维的activation function ?】
通俗来讲,对于每一组输入的真实图片,我们说对于任意一层 $L_i$ 的层激活函数形成了“manifold of interest”。长久以来我们都假设神经网络中的“manifold of interest”可以被更低纬度的子空间来表示。也就是说,如果我们看深度卷积中某一层的d-channel的tensor,信息是隐藏在某些manifold中的,也就是说我们可以用子空间来表示这些(有效)信息。
简单来说,实现这个目标可以通过降维来实现。MobileNetv1的时候就用过一个width multiplier参数实现了部分的提升。根据这个width multiplier带来的启发,我们可以将激活空间降维直到“manifold of interest”布满整个空间。然而这个操作被神经网络做存在的非线性ReLu给打断了。在一维空间中,ReLu会产生一个射线状的形状;在高维空间中ReLu会变成有n个节点的分段线性曲线。
这里举的这个ReLu的例子,我觉得是这样。
- 一方面是说非零部分的信息会保留的比较完整,这说明了ReLu的线性部分可以保留输入的全部信息。
- 另一方面是为了说明在高维加入非线性会对传递的信息造成影响,在高维丢失的信息可以在重新投射回低维空间后看的更加明显。于是举例说明了一个二维螺旋线的输入,分别在升维之后通过非线性ReLu方程后,再重新降维至本来的低维空间时的二维螺旋线。可以看到,ReLu非线性对这些螺旋线在某些channel上会有影响,也就是造成了信息损失。然而当我们升维的channel数越多(升维越高),信息在某些channel被保留住的可能性就越大。也就是说,当我们的输入manifold 可以再某个特定的subspace保留并且不受到ReLu的影响。
这样的话就总结出来了 “manifold of interest” 应该被投射在高维激活空间的某个低维子空间内。
- 如果 “manifold of interest” 在经过ReLu之后仍旧是非零的,那么这部分是由ReLu中的Linear部分产生的;
- 只有当输入manifold存在于输入的低维子空间时, ReLu可以保留输入manifold完整的信息。
由这两点,我们就可以得出优化现在神经网络结构的hints:
若“manifold of interest”是存在于低维地空间的话,我们可以通过在卷积模块中加入线性的bottleneck结构来捕捉这个信息
倒置残差
bottleneck block 和 residual block结构是类似的,每一个block的输入都会跟随一些bottleneck 然后是一些展开模块。经典的残差结构和倒置残差结构。经典的残差模型是将bottle部分比较厚的地方连接起来,但是倒置的残差网络是把bottle neck连接起来。【这部分应该就是应景之前传递的时候要将特征变到高维之后再使用非线性】
信息流
这部分好像也没说啥内容
Model Architecture
这部分更加细节介绍网络结构的每个模块。
这是一个由channel数 $k$ 变为$k’$ 的,expansion系数为 $t$ 的Bottleneck residual block的具体形式:
整体的网络结构如下:
- kernel size的大小一般都是标准的 $3\times 3$
- 也会用到dropout和batchnorm
- 拓展倍数expansion rate 常数设置在 5-10之间得到的结果都差不多,对于大一点的网络,用的系数会大一些,小的网络用到的系数小
- 对除了最后一层的所有层都用到了width mutiplier
Implementation Notes
Memory efficient inference
(这部分大概在说计算资源?)
Bottleneck Residual Block
(这部分再说用了residual block之后计算量减少了很多)
Experiments
ImageNet 分类任务
- RMSPropOptimizer decay = 0.9, momentum = 0.9
- BatchNorm,standard weight decay 是0.00004
- Learning rate是0.045, learning rate decay 是每个epoch下降0.98
Object Detection
- SSDLite:SSD结构中的标准卷积都替换为深度分离卷积。
Semantic Segmentation
- MobileNetV2 被当做是 DeepLabV3中的特征提取部分
- 有以不同的发现:
- 添加不同尺度,包括添加左右翻转的图片不适合移动设备的应用
- output_stride = 16的效果更好
- MobileNetV1作为特征提取的框架已经很好了
- 在MobileNetV2的倒数第二层连接 DeepLabV3的分割头效果比直接连在最后一层好,因为他有320个channel
- DeepLabV3分割头真的很消耗时间,去除ASPP部分可以省下很多时间并且准确度不会下降很多
总结
这篇文章主要就是提出在神经网络操作过程中如何保留更多的信息。最主要的一点自然是:inverted residual with linear bottleneck 了。