文章:https://arxiv.org/abs/1801.04381
代码:https://github.com/tensorflow/models/tree/master/research/slim/nets/mobilenet
在本文中,我们描述了一种新的移动架构MobileNetV2,它改进了移动模型在多个任务和基准数据集上以及不同模型尺寸范围内的最先进性能。我们还描述了在我们称之为SSDLite的新框架中将这些移动模型应用于对象检测的有效方法。此外,我们演示了如何通过简化形式的DeepLabv3构建移动语义分割模型,我们将其称为Mobile DeepLabv3。
基于倒置的残差结构,其中快捷连接位于薄的瓶颈层之间。中间扩展层使用轻量级的深度分离卷积来过滤特征作为非线性的来源。另外,我们发现去除窄层中的非线性以保持模型的表征能力是很重要的。我们认为这可以提高性能并提供导致这种设计的实现。
最后,我们的方法允许输入/输出域与转换的表达性进行分离,这为进一步分析提供了方便的框架。我们测量了模型在ImageNet分类,COCO目标检测,VOC图像分割等方面的表现。我们评估了准确性、乘法加法(MAdd)操作次数、实际延迟和参数数量之间的权衡。
神经网络彻底改变了机器智能的许多领域,使其在富有挑战性的图像识别任务中取得了超越人类准确率的效果。然而,提高准确性通常需要付出代价:现代先进的网络需要超出许多移动和嵌入式设备所支持的高计算资源。
本文介绍了一种专为移动和资源受限环境量身定制的新型神经网络架构。通过在保持相同的精度的同时显著减少所需的操作和内存数量,我们的网络推动了为移动式设备定制计算机视觉模型的最新技术。
我们的主要贡献是一个新颖的层模块:具有线性瓶颈的倒置残差。该模块将低维压缩表示作为输入,首先将其扩展为高维并使用轻量级深度分离卷积进行过滤,随后将特征通过线性卷积映射成低维表示。
该模块可以在任何现代框架中使用标准操作有效地实现,并使我们的模型能够在基准测试集在多个性能指标上击败最新技术。此外,这种卷积模块特别适用于移动设备,因为它可以通过永不完全创建大型中间张量来显着减少推理所需的内存占用。这减少了许多嵌入式硬件设计中对主存储器访问的需求,其提供了少量非常快速的软件控制的高速缓冲存储器。
在过去的几年中,调整深度神经架构以在准确性和性能之间取得最佳平衡一直是一个积极研究的领域。由众多团队执行的手动体系结构搜索和训练算法的改进已经导致对早期设计(如AlexNet,VGGNet ,GoogLeNet和ResNet)的显著改进。最近,在包括超参数优化、网络剪枝、联通学习等在内的算法架构探索方面取得了很多进展。大量的工作也致力于改变内部卷积块的连接结构,如ShuffleNet或引入稀疏性。
最近,[23,24,25,26]开辟了一项新的方向,将遗传算法和强化学习等优化方法引入建筑搜索。然而,一个缺点是最终所得到的网络结构非常复杂。在本文中,我们追求的目标是探索更好的关于神经网络如何运作的直觉,并使用它来指导最简单的网络设计。我们的方法应该被视为与[23]和相关工作中描述的方法相符。从这种角度出发,我们的方法类似于ShuffleNet所采用的方法,并允许进一步改善性能,同时对其内部操作进行了初步解释。我们的网络设计基于MobileNetV1。它保留了其简单性,不需要任何特殊的操作,同时显著提高了其准确性,实现了移动应用中多个图像分类和检测任务的最新技术水平。
深度可分离卷积是许多高效神经网络架构的关键构建块,我们也将它们用于当前的工作中。基本思想是将一个标准卷积用两个独立的分解卷积进行替换。第一层称为逐层卷积,它通过对每个输入通道应用单个卷积滤波器来执行轻量级滤波。第二层是1×1卷积,称为逐点卷积,它通过计算输入通道的线性组合来计算新的特征。
标准卷积对大小为 h i × w i × d i h_i×w_i×d_i hi×wi×di的输入张量 L i L_i Li,并应用卷积核 K ∈ R k × k × d i × d j K\in R^{k×k×d_i×d_j} K∈Rk×k×di×dj以产生大小为 h i × w i × d j h_i×w_i×d_j hi×wi×dj的输出张量 L j L_j Lj。标准卷积层具有 h i ⋅ w i ⋅ d i ⋅ d j ⋅ k ⋅ k h_i·w_i·d_i·d_j·k·k hi⋅wi⋅di⋅dj⋅k⋅k的计算成本。
深度可分离卷积是标准卷积层的插入式重新排列。实际上它的卷积效果几乎和普通卷积一样好,但计算代价只有:
(1) h w × w i × d i × ( k 2 + d j ) h_w \times w_i \times d_i \times(k^2 + d_j) \tag{1} hw×wi×di×(k2+dj)(1)
与传统卷积层相比,高效的深度可分离卷积减少了几乎 k 2 k^2 k2的计算量(实际上是 k 2 d j / ( k 2 + d j ) k^2d_j/(k^2+d_j) k2dj/(k2+dj),因为一般 d j d_j dj远大于 k 2 k^2 k2,所以近似计算量减小了 k 2 k^2 k2倍)。MobileNetV2使用k = 3(3×3深度可分离卷积),因此计算成本比标准卷积小8到9倍,精度只有很小的降低。
考虑有n层的深度神经网络,每层 L i L_i Li的尺寸为 h i × w i × d i h_i×w_i×d_i hi×wi×di。在本节中,我们将讨论这些激活张量的基本属性,我们将其视为具有di维度的 h i × w i h_i×w_i hi×wi“像素”的容器。非正式地,对于输入的真实图像集,我们说层激活集(对于任何层 L i L_i Li)形成了“感兴趣的流形”。长期以来,人们一直认为神经网络中的感兴趣流形可以嵌入到低维子空间中。换句话说,当我们查看深度卷积层的所有单个d通道像素时,在这些值中编码的信息实际上位于某些流形中,而这些流形又可嵌入到低维空间中。
乍一看,这样的事实可以通过简单地减少层的维数来捕获和利用,从而减少操作空间的维度。MobileNetV1已成功利用这一点,通过宽度乘数参数有效地在计算和精度之间进行折衷,并将其纳入其他网络的高效模型设计中。遵循这种直觉,宽度乘数方法允许人们减少激活空间的维数,直到感兴趣的流形覆盖了整个空间。然而,当我们考虑到深度卷积神经网络实际上进行了非线性的坐标转换(例如ReLU)时,这种直觉就会被打破。例如,应用于1D空间线上的ReLU会产生“射线”,而在 R n R^n Rn空间中,它通常会产生具有n个节点的分段线性曲线。
通常,如果变换层ReLU(Bx)的输出具有非零体积S,则映射到S内部的点是通过输入的线性变换B获得的。因此,受线性变换的限制,只有部分输入空间与全部输出空间相对应。换句话说,深度网络仅在输出的非零部分具有线性分类器的能力。我们将补充材料用于更正式的陈述。
另一方面,当ReLU折叠通道时,它不可避免地会丢失该通道中的信息。但是如果我们有很多通道,并且在激活流形中有一个结构,信息可能仍然保留在其他通道中。在补充材料中,我们证明如果输入流形可以嵌入到激活空间的较低维度的子空间中,则ReLU变换将保留信息,同时将所需的复杂性引入可表达函数集合中。
总而言之,我们已经强调了两个属性,这两个属性表明了感兴趣的流形位于高维激活空间的低维子空间中所应满足的要求:
这两个见解为我们提供了优化现有神经架构的经验暗示:假设感兴趣的流形是低维的,我们可以通过将线性瓶颈层插入卷积块来实现这一点。实验证据表明,使用线性层是至关重要的,因为它可以防止非线性破坏太多信息。在第7节中,我们凭经验证明,在瓶颈中使用非线性层确实会使性能受到几个百分点的影响,从而进一步证实了我们的假设。我们注意到在[29]中报告了相似的结论,该工作中从传统残差块的输入中去除了非线性并且取得了在CIFAR数据集的性能提升。
对于本文的其余部分,我们将利用瓶颈卷积。我们将输入瓶颈尺寸与内部尺寸之间的比率称为膨胀比。
线性瓶颈层的含义就是从普通的瓶颈层中移除最后一个ReLU函数。
Fig. 2中的(a)是标准卷积,(b)是分离卷积,©是使用线性瓶颈层的分离卷积,(d)是在线性瓶颈层之后再加上扩展层。
瓶颈块看起来类似于残差块,其中每个块包含一个输入,然后是几个瓶颈,最后是扩展。然而,受瓶颈实际上包含所有必要信息的直觉的启发,同时扩展层仅仅作为伴随非线性转换的实现细节,因此我们在瓶颈之间直接使用直连通道。
图3提供了设计差异的示意图。插入直连通道的动机类似于经典的残差连接:我们希望提高梯度跨越多层反向传播的能力。然而,倒置设计具有更高的内存效率(详见第5节),并且在我们的实验中效果稍好一些。
瓶颈卷积的运行时间和参数数量:基本实现结构如表1所示。对于大小为h×w的块,扩展因子t,输入通道 d ′ d^{'} d′,输出通道 d ′ ′ d^{''} d′′,内核大小k,实现反向残差所需的乘加总数为 h ⋅ w ⋅ d ′ ⋅ t ( d ′ + k 2 + d ′ ′ ) h·w·d^{'}·t(d^{'} + k^2 + d^{''}) h⋅w⋅d′⋅t(d′+k2+d′′)。和式子(1)相比,这个表达式有一个额外的项,因为我们确实有一个额外的1×1卷积,但是我们网络的性质允许我们使用更小的输入和输出维度。在表3中,我们比较了MobileNetV1,MobileNetV2和ShuffleNet之间所需的尺寸的大小。
我们架构的一个有趣特性是它提供了构建块(瓶颈层)的输入/输出域与层转换之间的自然分离 - 这是一种将输入转换为输出的非线性函数。前者可以看作是每层网络的容量,而后者则是表现力。这与常规和可分离的传统卷积块形成对比,传统的卷积块表现力和容量都纠结在一起并且是输出层深度的函数。
特别是,在我们的例子中,当内层深度为0时,由于存在直连通道,底层卷积是仍然是恒等映射函数。当膨胀比小于1时,这是经典的残差卷积块。但是,出于我们的目的,我们表明膨胀率大于1是最有用的。
这种解释使我们能够将网络的表现力与其容量分开研究,我们相信有必要进一步探索这种分离,以便更好地理解网络属性。
现在我们详细描述我们的架构。正如前一节所讨论的,基本构建块是一个带有残差的瓶颈深度可分离卷积。详细结构如表1所示。即先是一个膨胀比为t的 1 × 1 1 \times 1 1×1卷积的扩展层,再使用一个 3 × 3 3 \times 3 3×3的深度可分离卷积,最后使用一个非线性的 1 × 1 1 \times 1 1×1卷积层。MobileNetV2的架构包含具有32个滤波器的初始完全卷积层,接着是表2中描述的19个残差瓶颈层。我们使用ReLU6作为非线性激活函数,因为它在使用低精度计算时具有鲁棒性。我们总是使用内核大小3×3的卷积作为现代网络的标准,并在训练期间使用了dropout和批量归一化。
除第一层外,我们在整个网络中使用恒定的膨胀比。在我们的实验中,我们发现5到10之间的膨胀比导致几乎相同的性能曲线,较小的网络通过略小的膨胀比获得更好的结果,更大的网络使用更大的膨胀比会取得稍微更好的性能。
对于我们所有的主要实验,我们使用应用于设置扩充层的大小为输入层的大小乘以6。例如,对于采用64通道输入张量并产生具有128个通道的张量的瓶颈层,中间扩展层则为64·6 = 384个通道。
超参数折衷:与MobileNet V1中定制的架构到不同的性能点一样,我们通过使用输入图像分辨率和宽度乘数作为可调超参数,实现所需的精度/性能权衡。我们的主要网络(宽度乘数1,224×224),计算成本为3亿乘加,并使用340万个参数。我们探讨了性能权衡,输入分辨率从96变化到224,宽度乘数从0.35变化到1.4。网络计算量范围从7乘加到585M 乘加,而模型大小在1.7M和6.9M参数之间变化。
与MobeilNet V1相比,一个小的实现差异是对于小于1的乘数,我们将宽度乘数应用于除最后一个卷积层之外的所有层。这可以提高较小模型的性能。
倒置的残差瓶颈层允许特别高效的存储实现,这对于移动应用非常重要。例如,使用标准高效的推理实现Tensorflow或Caffe,构建有向无环计算图G,包括表示操作的边和表示中间计算张量的节点。按照计划安排计算是为了最小化需要存储的张量的总数。在最一般的情况下,它搜索所有合理的计算顺序 ∑ ( G ) \sum (G) ∑(G)并选择能够最小化下式的那个。
其中 R ( i , π , G ) R(i,\pi,G) R(i,π,G)是连接到任何 π i ⋯ π n \pi_i \cdots \pi_n πi⋯πn节点的中间张量列表,|A|表示张量A的大小,size(i)是在操作 i i i过程中内部存储所需的内存总量。
对于仅具有普通并行结构的图形(例如残差连接),只有一个非平凡可行的计算顺序,因此,可以简化计算图G上推断所需的总量和存储量限制:
或者重申一下,内存量就是所有操作中组合输入和输出的最大总大小。在下文中我们展示如果我们将瓶颈残差块视为单个操作(并将内部卷积视为一次性张量),则内存总量将由瓶颈张量的大小决定,而不是瓶颈内部(并且更大)张量的大小。
瓶颈残差块:图3b中所示的瓶颈块运算符 F ( x ) F(x) F(x)可以表示为三个运算符的组合 F ( x ) = [ A ⋅ N ⋅ B ] x F(x) = [A \centerdot N \centerdot B]x F(x)=[A⋅N⋅B]x,其中A是线性变换 A : R s × s × k → R s × s × n A:R^{s×s×k} \rightarrow R^{s×s×n} A:Rs×s×k→Rs×s×n,N是非线性逐通道变换: N : R s × s × n → R s ′ × s ′ × n N:R^{s×s×n} \rightarrow R^{s^{'}×s^{'}×n} N:Rs×s×n→Rs′×s′×n,B次是输出域的线性变换: B : R s ′ × s ′ × n → R s ′ × s ′ × k ′ B:R^{s^{'}×s^{'}×n} \rightarrow R^{s^{'}×s^{'}×k^{'}} B:Rs′×s′×n→Rs′×s′×k′。
对于我们的网络N =ReLU6 ◦ dwise ◦ ReLU6,但结果适用于任何逐通道转换。假设输入域的大小是|x|并且输出域的大小是|y|,则计算F(X)所需的存储器可以低至 ∣ s 2 k ∣ + ∣ s ′ 2 k ′ ∣ + O ( max ( s 2 ; s ′ 2 ) ) |s^2k| + |{s^{'}}^2k^{'}| + O(\max(s^2; {s^{'}}^2)) ∣s2k∣+∣s′2k′∣+O(max(s2;s′2))。
该算法基于以下事实:内张量 i i i可以表示为t个张量的连接,每个张量大小为n /t,然后我们的函数可以表示为:
通过累加和,我们只需要一个大小为n/t的中间块始终保存在存储器中。使用n = t,我们最终必须始终只保留中间表示的单个通道,也就是上面公式中的 O ( max ( s 2 ; s ′ 2 ) ) O(\max(s^2; {s^{'}}^2)) O(max(s2;s′2))。使我们能够使用这一技巧的两个约束是(a)内部变换(包括非线性和逐层)是逐通道进行的,以及(b)连续的非逐通道运算符具有显著小的输入输出比(就是说所占用的内存可以忽略不计?)。对于大多数传统的神经网络,这种技巧不会产生显着的改善。
我们注意到,使用t路切分计算 F ( x ) F(x) F(x)所需的乘加运算符的数量与t无关,然而,在现有的实现中,我们发现用一些较小的矩阵乘法替换一个矩阵乘法会因为引起高速缓存缺失降低运行时性能。我们最好设置t是2到5之间的一个小常数。它显着降低了内存需求,但仍然允许人们利用深度学习框架提供的高度优化的矩阵乘法和卷积运算符来获得大部分效率。如果特殊的框架级优化可能导致进一步的运行时改进,但这还有待于进一步观察。
训练参数:我们使用TensorFlow训练我们的模型。我们使用标准RMSPropOptimizer,将衰减和动量设置为0.9。我们在每一层之后使用批量标准化,标准权重衰减设置为4e-5。和MobileNetV1一样,我们使用0.045的初始学习率,以及每个epoch学习率衰减为原来的0.98倍。我们使用16个GPU异步训练,批量大小为96。
结果:我们将我们的网络与MobileNetV1,ShuffleNet和NASNet-A模型进行比较。表4显示了一些选定模型的统计数据,其完整性能图如图5所示。
作者进行了模型比较,并且通过在Google Pixel Phone上部署TF-Lite,测试模型部署在手机上使对图像分类的耗时。
我们评估并比较MobileNetV2和MobileNetV1作为特征提取器的性能,用于在COCO数据集上使用SSD的修改版本进行目标检测。我们还将YOLOv2和原始SSD(以VGG-16作为基础网络)作为基线进行比较。我们没有与其他架构(如Faster-RCNN和RFCN)进行比较,因为我们的重点是移动/实时模型。
SSDLite:在本文中,我们介绍了常规SSD的针对移动场景的变体。我们将SSD预测层中所有的常规卷积层用可分离卷积(深度可分卷积跟随1×1投影)代替。这种设计符合MobileNets的整体设计,并且被认为具有更高的计算效率。我们将此修改版本称为SSDLite。与常规SSD相比,SSDLite显着降低了参数计数和计算成本,如表5所示。
对于MobileNetV1,我们按照[33]中的设置进行操作。对于MobileNetV2,第一层SSDLite附加到第15层的扩展(输出步幅为16)。SSDLite的第二层和其余层附加在最后一层的顶部(输出步幅为32)。此设置与MobileNetV1一致,因为所有图层都附加到相同输出步幅的特征图。
两个MobileNet模型都使用开源TensorFlow对象检测API进行了训练和评估。两种模型的输入分辨率均为320×320。我们对mAP(COCO挑战度量)、参数数量和乘法加法数量进行基准测试和比较。结果如表6所示。
MobileNetV2 SSDLite不仅是最高效的模型,也是三者中最准确的模型。值得注意的是,MobileNetV2 SSDLite的效率提高了20倍,参数数量小10倍,同时在COCO数据集上仍然优于YOLOv2。
反向残差连接:已经有很多论文广泛研究了残差连接的重要性。本文报告的新结果是连接瓶颈的直连通道比连接扩展层的直连通道表现更好(参见图6b进行比较)。
线性瓶颈层:严格来说,线性瓶颈模型的表达能力远低于具有非线性的模型,因为激活只是进行了偏差和缩放等线性操作。然而,我们在图6a中显示的实验表明线性瓶颈提高了性能,验证了非线性破坏低维空间中的信息。
我们描述了一个非常简单的网络架构,使我们能够构建一系列高效的移动模型。我们的基本单元具有多种特性,使其特别适合移动应用。它允许非常高效的内存推理,并仅依赖于利用所有神经框架中都支持的标准操作。
对于ImageNet数据集,我们的架构改进了各种性能点的最新技术水平。
对于物体检测任务,我们的网络在准确性和模型复杂性方面优于COCO数据集上的最先进的实时检测器。值得注意的是,与YOLOv2相比,我们的架构与SSDLite检测模块相结合,计算量减少了20倍,参数减少了10倍。
在理论方面:所提出的卷积块具有独特的属性,允许将网络表达性(由扩展层编码)与其容量(由瓶颈输入编码)分开。对这部分内容进一步探索是未来研究的重要方向。
利用深度分离卷积、线性瓶颈层(移除最后一层的ReLU)、在瓶颈层之间添加残差连接构建基本网络单元,进一步堆砌基本网络单元构建网络,在ImageNet分类上取得了SOTA的效果。使用深度分离卷积对SSD目标检测进行改进,提出SSDLite,在COCO目标检测上取得了较好的结果。作者还对内存占用情况进行了系列分析,结合实验结果证明了MobileNet V2适用于在移动式设备上进行高效准确的计算机视觉任务。