【第27篇】MobileNetV2:倒置残差和线性瓶颈

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情

摘要

在本文中,我们描述了一种新的移动架构 MobileNetV2,它提高了移动模型在多个任务和基准测试以及不同模型大小范围内的最新性能。 我们还描述了在我们称为 SSDLite 的新框架中将这些移动模型应用于对象检测的有效方法。 此外,我们演示了如何通过我们称之为 Mobile DeepLabv3 的 DeepLabv3 的简化形式来构建移动语义分割模型。

基于倒置残差结构,其中快捷连接位于薄瓶颈层之间。 中间扩展层使用轻量级深度卷积来过滤特征作为非线性源。 此外,我们发现去除窄层中的非线性以保持代表性很重要。 我们证明这可以提高性能并提供导致这种设计的直觉。

最后,我们的方法允许将输入/输出域与转换的表达性分离,这为进一步分析提供了一个方便的框架。 我们测量了我们在 ImageNet [1] 分类、COCO 对象检测 [2]、VOC 图像分割 [3] 上的性能。 我们评估权衡 精度与乘加 (MAdd) 测量的操作数量以及实际延迟和参数数量之间的关系。

1、简介

神经网络彻底改变了机器智能的许多领域,为具有挑战性的图像识别任务提供了超人的准确性。 然而,提高准确性的动力往往是有代价的:现代最先进的网络需要大量的计算资源,超出了许多移动和嵌入式应用程序的能力。

本文介绍了一种专门为移动和资源受限环境量身定制的新神经网络架构。 我们的网络通过显着减少所需的操作和内存数量,同时保持相同的准确性,推动了移动定制计算机视觉模型的最新技术。

我们的主要贡献是一个新的层模块:具有线性瓶颈的倒置残差。该模块将低维压缩表示作为输入,首先将其扩展为高维并使用轻量级深度卷积进行过滤。 随后将特征投影回具有线性卷积的低维表示。 官方实现在 [4] 中作为 TensorFlow-Slim 模型库的一部分提供。

该模块可以在任何现代框架中使用标准操作有效地实现,并允许我们的模型使用标准基准在多个性能点上击败最先进的技术。 此外,这个卷积模块特别适用于移动设计,因为它允许通过从不完全实现大型中间张量来显着减少推理期间所需的内存占用。 这减少了许多嵌入式硬件设计中对主存储器访问的需求,这些设计提供少量非常快速的软件控制高速缓存。

2、相关工作

在过去几年中,调整深度神经架构以在准确性和性能之间取得最佳平衡一直是一个活跃的研究领域。 由众多团队进行的手动架构搜索和训练算法的改进都导致了对早期设计(如 AlexNet [5]、VGGNet [6]、GoogLeNet [7])的显着改进。 和 ResNet [8]。 最近在算法架构探索方面取得了很多进展,包括超参数优化 [9、10、11] 以及各种网络修剪方法 [12、13、14、15、16、17] 和连通性学习 [18、19] . 大量的工作也致力于改变内部卷积块的连接结构,例如在 ShuffleNet [20] 或引入稀疏性 [21] 和其他 [22]。

最近,[23,24,25,26]开辟了将包括遗传算法和强化学习在内的优化方法引入建筑搜索的新方向。 然而,一个缺点是最终的网络非常复杂。 在本文中,我们追求的目标是开发关于神经网络如何运行的更好直觉,并使用它来指导最简单的网络设计。 我们的方法应该被视为对 [23] 中描述的方法和相关工作的补充。 在这种情况下,我们的方法类似于 [20, 22] 所采用的方法,并允许进一步提高性能,同时提供对其内部操作的一瞥。 我们的网络设计基于 MobileNetV1 [27]。 它保留了其简单性并且不需要任何特殊的操作员,同时显着提高了其准确性,在移动应用程序的多个图像分类和检测任务上实现了最先进的水平

3、预备、讨论和直觉

3.1、深度可分离卷积

深度可分离卷积是许多高效神经网络架构的关键构建块 [27,28,20],我们也在当前的工作中使用它们。 基本思想是用将卷积分成两个独立层的分解版本替换完整的卷积算子。 第一层称为深度卷积,它通过对每个输入通道应用单个卷积滤波器来执行轻量级滤波。 第二层是 1×1 卷积,称为逐点卷积,负责通过计算输入通道的线性组合来构建新特征。

扫描二维码关注公众号,回复: 13787447 查看本文章

标准卷积采用 h i × w i × d i h_{i}\times w_{i}\times d_{i} 输入张量 L i L_{i} ,并应用卷积核 K R k × k × d i × d j K\in R^{k \times k \times d_{i} \times d_{j}} 以产生 h i × w i × d j h_{i}\times w_{i}\times d_{j} 输出张量 L j L_{j} 。 标准卷积层的计算成本为 h i × w i × d i × d j × k × k h_{i}\times w_{i}\times d_{i}\times d_{j}\times k \times k

深度可分离卷积是标准卷积层的直接替代品。 从经验上讲,它们的工作原理几乎与常规卷积一样好,但只是成本:

h i w i d i ( k 2 + d j ) h_{i} \cdot w_{i} \cdot d_{i}\left(k^{2}+d_{j}\right)

这是depthwise和1×1 pointwise卷积的总和。 与传统层相比,有效的深度可分离卷积减少了几乎 k 2 k^{2} 的计算量。 MobileNetV2 使用 k = 3(3 × 3 深度可分离卷积),因此计算成本比标准卷积小 8 到 9 倍,而准确度仅略有降低 [27]。

3.2、线性瓶颈

考虑一个由 n 层 L i L_{i} 组成的深度神经网络,每个层都有一个维度为 h i × w i × d i h_{i}\times w_{i} \times d_{i} 的激活张量。 在本节中,我们将讨论这些激活张量的基本属性,我们将其视为具有 d i d_{i} 维度的 h i × w i h_{i} \times w_{i} “像素”的容器。 非正式地,对于一组输入的真实图像,我们说这组层激活(对于任何层 L i L_{i} )形成了一个“感兴趣的流形”。 长期以来,人们一直认为神经网络中感兴趣的流形可以嵌入到低维子空间中。 换句话说,当我们查看深度卷积层的所有单个 d 通道像素时,这些值中编码的信息实际上位于某个流形中,而流形又可以嵌入到低维子空间中。

乍一看,可以通过简单地减少层的维数来捕获和利用这样的事实,从而减少操作空间的维数。 这已被 MobileNetV1 [27] 成功利用,通过宽度乘数参数有效地在计算和准确性之间进行权衡,并已被纳入其他网络的有效模型设计中 [20]。 按照这种直觉,宽度乘数方法允许人们减少激活空间的维数,直到感兴趣的流形跨越整个空间。 然而,当我们回忆起深度卷积神经网络实际上具有非线性的每坐标变换(例如 ReLU)时,这种直觉就会被打破。 例如,应用于一维空间中的一条线的 ReLU 会产生一条“射线”, 其中与在 R n R^{n} 空间中一样,它通常会产生具有 n 个关节的分段线性曲线。

不难看出,一般来说,如果一个层变换的结果 ReLU(Bx) 的体积 S 非零,映射到内部 S 的点是通过输入的线性变换 B 得到的,因此表明对应于全维输出的输入空间仅限于线性变换。换句话说,深度网络仅在输出域的非零体积部分具有线性分类器的能力。我们参考补充材料以获得更正式的声明。

另一方面,当 ReLU 折叠通道时,它不可避免地会丢失该通道中的信息。但是,如果我们有很多通道,并且激活流形中有一个结构,那么信息可能仍会保留在其他通道中。在补充材料中,我们表明,如果输入流形可以嵌入到激活空间的显着低维子空间中,那么 ReLU 变换会保留信息,同时将所需的复杂性引入可表达的函数集

总而言之,我们强调了两个属性,这些属性表明感兴趣的流形应该位于高维激活空间的低维子空间中:

  1. 如果感兴趣的流形在 ReLU 变换后保持非零体积,则对应一个线性变换

  2. ReLU 能够保留有关输入流形的完整信息,但前提是输入流形位于输入空间的低维子空间中

这两个见解为我们提供了优化现有神经架构的经验提示:假设感兴趣的流形是低维的,我们可以通过将线性瓶颈层插入卷积块来捕获这一点。 实验证据表明,使用线性层至关重要,因为它可以防止非线性破坏太多信息。 在第 6 节中,我们凭经验表明,在瓶颈中使用非线性层确实会降低几个百分点的性能,进一步验证了我们的假设。 我们注意到,在 [29] 中报告了有助于非线性的类似报告,其中非线性从传统残差块的输入中移除,从而提高了 CIFAR 数据集的性能。

在本文的其余部分,我们将使用瓶颈卷积。 我们将输入瓶颈的大小与内部大小之间的比率称为扩展比率。

image-20220128105334412

3.3、倒置残差

image-20220128105900850

瓶颈块看起来类似于残差块,其中每个块包含一个输入,然后是几个瓶颈,然后是扩展 [8]。 然而,受到瓶颈实际上包含所有必要信息的直觉的启发,而扩展层仅充当伴随张量非线性变换的实现细节,我们直接在瓶颈之间使用快捷方式。图 3 提供了示意图 设计差异的可视化。 插入快捷方式的动机类似于经典的残差连接:我们希望提高梯度在乘法器层中传播的能力。 然而,倒置设计的内存效率要高得多(详见第 5 节),并且在我们的实验中效果更好。

瓶颈卷积的运行时间和参数计数 基本实现结构如表 1 所示。对于大小为 h × w h \times w 、扩展因子为 t 和内核大小为 k 的块,具有 d d^{\prime } 个输入通道和 d d^{\prime \prime} 个输出通道,所需的乘加总数 是 h w d t ( d + k 2 + d ) h \cdot w \cdot d^{\prime} \cdot t\left(d^{\prime}+k^{2}+d^{\prime \prime}\right) 。 与(1)相比,这个表达式有一个额外的项,因为我们确实有一个额外的 1 × 1 卷积,但是我们网络的性质允许我们使用更小的输入和输出维度。 在表 3 中,我们比较了 MobileNetV1、MobileNetV2 和 ShuffleNet 之间每种分辨率所需的大小。

3.4、信息流解读

我们架构的一个有趣特性是它提供了构建块(瓶颈层)的输入/输出域和层转换之间的自然分离——这是一种将输入转换为输出的非线性函数。前者可以看作是网络在每一层的容量,而后者可以看作是表现力。这与常规和可分离的传统卷积块形成对比,在传统卷积块中,表现力和容量都纠缠在一起,并且是输出层深度的函数。

特别是,在我们的例子中,当内层深度为 0 时,由于快捷连接,底层卷积是恒等函数。当扩展比小于 1 时,这是一个经典的残差卷积块 [8, 30]。然而,为了我们的目的,我们表明大于 1 的膨胀比是最有用的。

这种解释使我们能够将网络的表达能力与其容量分开研究,我们相信有必要进一步探索这种分离,以更好地理解网络属性。

4、模型架构

现在我们详细描述我们的架构。 如上一节所述,基本构建块是带有残差的瓶颈深度可分离卷积。 该块的详细结构如表 1 所示。MobileNetV2 的架构包含具有 32 个过滤器的初始全卷积层,随后是表 2 中描述的 19 个残差瓶颈层。由于其鲁棒性,我们使用 ReLU6 作为非线性 当与低精度计算一起使用时[27]。 我们始终使用现代网络的标准内核大小 3 × 3,并在训练期间利用 dropout 和批量归一化。

image-20220128111944480

除第一层外,我们在整个网络中使用恒定的扩展率。 在我们的实验中,我们发现在 5 到 10 之间的扩展率会导致几乎相同的性能曲线,较小的网络在扩展率稍低的情况下效果更好,而较大的网络在扩展率较大的情况下性能稍好。

对于我们所有的主要实验,我们使用 6 的扩展因子应用于输入张量的大小。 例如,对于采用 64 通道输入张量并产生具有 128 通道的张量的瓶颈层,则中间扩展层为 64×6 = 384 通道。

权衡超参数 如在 [27] 中,我们通过使用输入图像分辨率和宽度乘数作为可调超参数来定制我们的架构以适应不同的性能点,可以根据所需的精度/性能权衡进行调整。 我们的主网络(宽度乘法器 1,224 × 224)的计算成本为 3 亿次乘加,并使用了 340 万个参数。 我们探讨了性能权衡,输入分辨率从 96 到 224,宽度乘数从 0.35 到 1.4。 网络计算成本范围从 7 乘加到 585M MAdds,而模型大小在 1.7M 和 6.9M 参数之间变化。

与 [27] 的一个小的实现差异是,对于小于 1 的乘数,我们将宽度乘数应用于除最后一个卷积层之外的所有层。 这提高了较小模型的性能。

5、实施说明

5.1、内存高效推理

倒置残差瓶颈层允许实现特别高效的内存实现,这对于移动应用程序非常重要。使用例如 TensorFlow[31] 或 Caffe [32] 的标准高效推理实现构建了一个有向无环计算超图 G,由边组成 表示表示中间计算张量的操作和节点。 计划计算以最小化需要存储在内存中的张量总数。 在最一般的情况下,它搜索所有合理的计算顺序 Σ(G) 并选择最小化的。

M ( G ) = min π Σ ( G ) max i 1.. n [ A R ( i , π , G ) A ] + size ( π i ) M(G)=\min _{\pi \in \Sigma(G)} \max _{i \in 1 . . n}\left[\sum_{A \in R(i, \pi, G)}|A|\right]+\operatorname{size}\left(\pi_{i}\right)

其中 R ( i , π , G ) R(i, \pi, G) 是连接到任何 π i π n \pi_{i} \ldots \pi_{n} 节点的中间张量列表, A |A| 表示张量 A 的大小,size(i) 是内部所需的内存总量 操作期间的存储 i。

对于仅具有平凡并行结构(例如残差连接)的图,只有一个非平凡的可行计算顺序,因此可以简化计算图 G 上推理所需的内存总量和界限:

M ( G ) = max o p G [ A o p inp  A + B o p out  B + o p ] (2) M(G)=\max _{o p \in G}\left[\sum_{A \in \mathrm{op}_{\text {inp }}}|A|+\sum_{B \in \mathrm{op}_{\text {out }}}|B|+|o p|\right] \tag{2}

或者重申一下,内存量只是所有操作中组合输入和输出的最大总大小。 接下来我们将展示,如果我们将瓶颈残差块视为单个操作(并将内部卷积视为一次性张量),则内存总量将由瓶颈张量的大小决定,而不是由张量的大小决定 在瓶颈内部(并且更大)。

瓶颈残差块 图 3b 所示的瓶颈块算子 F(x) 可以表示为三个算子 F ( x ) = [ A N B ] x \mathcal{F}(x)=[A \circ \mathcal{N} \circ B] x 的组合,其中 A 是线性变换 A : R s × s × k R s × s × n \mathcal{A}: \mathcal{R}^{s \times s \times k} \rightarrow \mathcal{R}^{s \times s \times n} ,N 是一个非线性的每通道变换: N : R s × s × n R s × s × n \mathcal{N}: \mathcal{R}^{s \times s \times n} \rightarrow \mathcal{R}^{s^{\prime} \times s^{\prime} \times n} ,B又是输出域的线性变换: B : R s × s × n R s × s × k \mathcal{B}: \mathcal{R}^{s^{\prime} \times s^{\prime} \times n} \rightarrow \mathcal{R}^{s^{\prime} \times s^{\prime} \times k^{\prime}}

对于我们的网络 N = ReLU 6 \mathcal{N}=\operatorname{ReLU} 6 \circ dwise ReLU 6 \circ \operatorname{ReLU} 6 ,但结果适用于任何每通道转换。 假设输入域的大小为 x |x| ,输出域的大小为 y |y| ,那么计算 F(X) 所需的内存可以低至 s 2 k + s 2 k + \left|s^{2} k\right|+\left|s^{\prime 2} k^{\prime}\right|+ O ( max ( s 2 , s 2 ) ) O\left(\max \left(s^{2}, s^{2}\right)\right)

该算法基于这样一个事实,即内部张量 I \mathcal{I} 可以表示为 t 个张量的串联,每个张量的大小为 n / t n/t ,然后我们的函数可以表示为

F ( x ) = i = 1 t ( A i N B i ) ( x ) \mathcal{F}(x)=\sum_{i=1}^{t}\left(A_{i} \circ N \circ B_{i}\right)(x)

通过累积总和,我们只需要一个大小为 n=t 的中间块始终保存在内存中。 使用 n/ t,我们最终不得不始终只保留一个中间表示的通道。 使我们能够使用此技巧的两个约束是(a)内部变换(包括非线性和深度方向)是每个通道的事实,以及(b)连续的非每个通道运算符具有显着的比率 输入到输出的大小。 对于大多数传统的神经网络,这种技巧不会产生显着的改进。

我们注意到,使用 t-way split 计算 F(X) 所需的乘加运算符的数量与 t 无关,但是在现有的实现中,我们发现用几个较小的矩阵乘法替换一个矩阵乘法会由于缓存增加而损害运行时性能 错过。 我们发现这种方法在 t 是 2 到 5 之间的一个小常数时最有帮助。它显着降低了内存需求,但仍然允许人们利用通过使用高度优化的矩阵乘法和卷积算子获得的大部分效率 由深度学习框架提供。 特殊的框架级别优化是否会导致进一步的运行时改进还有待观察。

6、实验

6.1、ImageNet 分类

训练设置 我们使用 TensorFlow[31] 训练我们的模型。 我们使用标准的 RMSPropOptimizer,衰减和动量都设置为 0.9。 我们在每一层之后使用批量归一化,标准权重衰减设置为 0.00004。 在 MobileNetV1[27] 设置之后,我们使用 0.045 的初始学习率和每个 epoch 0.98 的学习率衰减率。 我们使用 16 个 GPU 异步工作器,批量大小为 96。

image-20220127150726290

结果 我们将我们的网络与 MobileNetV1、ShuffleNet 和 NASNet-A 模型进行比较。 一些选定模型的统计数据如表 4 所示,完整的性能图如图 5 所示。

image-20220127150425012

6.2、物体检测

我们在 COCO 数据集 [2] 上评估和比较 MobileNetV2 和 MobileNetV1 作为对象检测的特征提取器 [33] 与单次检测器 (SSD) [34] 的修改版本的性能。我们还将 YOLOv2 [35] 和原始 SSD(以 VGG-16 [6] 作为基础网络)作为基线进行了比较。我们没有将性能与其他架构进行比较,例如 Faster-RCNN [36] 和 RFCN [37],因为我们的重点是移动/实时模型。

SSDLite:在本文中,我们介绍了常规 SSD 的移动友好型变体。我们用 SSD 预测层中的可分离卷积(深度后跟 1×1 投影)替换所有常规卷积。这种设计符合 MobileNets 的整体设计,并且被认为在计算上更加高效。我们将此修改后的版本称为 SSDLite。与常规 SSD 相比,SSDLite 显着减少了参数数量和计算成本,如表 5 所示。

image-20220127172030762

对于 MobileNetV1,我们遵循 [33] 中的设置。对于 MobileNetV2,SSDLite 的第一层附加到第 15 层的扩展(输出步长为 16)。 SSDLite 的第二层和其余层附加在最后一层之上(输出步幅为 32)。此设置与 MobileNetV1 一致,因为所有层都附加到相同输出步幅的特征图上。

6.3、语义分割

在本节中,我们将用作特征提取器的 MobileNetV1 和 MobileNetV2 模型与 DeepLabv3 [39] 进行移动语义分割任务的比较。 DeepLabv3 采用了 atrous 卷积 [40, 41, 42],这是一种显式控制计算特征图分辨率的强大工具,并构建了五个并行头,包括 (a) Atrous Spatial Pyramid Pooling module (ASPP) [43],其中包含三个 3 × 3 具有不同开口率的卷积,(b)1×1卷积头,和(c)图像级特征[44]。 我们用输出步幅表示输入图像空间分辨率与最终输出分辨率的比率,这是通过适当地应用空洞卷积来控制的。 对于语义分割,我们通常使用输出步幅 = 16 或 8 来获得更密集的特征图。 我们在 PASCAL VOC 2012 数据集 [3] 上进行实验,使用来自 [45] 的额外注释图像和评估指标 mIOU。

为了构建移动模型,我们尝试了三种设计变体:(1) 不同的特征提取器,(2) 简化 DeepLabv3 头部以加快计算速度,以及 (3) 不同的推理策略以提高性能。我们的结果总结在表 7 中。我们观察到:(a) 推理策略,包括多尺度输入和添加左右翻转图像,显着增加了 MAdd,因此不适合设备上的应用程序,(b) 使用output stride = 16 比 output stride = 8 更有效,(c) MobileNetV1 已经是一个强大的特征提取器,只需要比 ResNet-101 [8] 少大约 4.9 - 5.7 的 MAdds (例如,mIOU: 78.56 vs 82.70 和 MAdds:941.9B vs 4870.6B),(d)在 MobileNetV2 的倒数第二个特征图之上构建 DeepLabv3 头部比在原始最后一层特征图上构建 DeepLabv3 头更有效,因为倒数第二个特征map 包含 320 个通道而不是 1280 个通道,通过这样做,我们获得了类似的性能,但所需的操作比 MobileNetV1 对应物少了大约 2.5 倍。 (e) DeepLabv3 头的计算成本很高,并且移除 ASPP 模块显着减少了 MAdds只有轻微的表现e 退化。在表 7 的末尾,我们确定了设备上应用程序的潜在候选者(粗体),它达到 75.32% mIOU,并且只需要 2.75B MAdds。

6.4、消融研究

反向残差连接。 残差连接的重要性已被广泛研究 [8,30, 46]。 本文报告的新结果是,快捷连接瓶颈的性能优于连接扩展层的快捷方式(参见图 6b 进行比较)。

image-20220127180440345

线性瓶颈的重要性。 线性瓶颈模型严格来说不如具有非线性的模型强大,因为激活总是可以在线性状态下运行,并对偏差和缩放进行适当的更改。 然而,我们在图 6a 中显示的实验表明线性瓶颈提高了性能,为非线性破坏低维空间中的信息提供了支持

7、结论和未来工作

我们描述了一个非常简单的网络架构,使我们能够构建一系列高效的移动模型。我们的基本建筑单元具有使其特别适用于移动应用的几个特性。它允许非常节省内存的推理,并依赖于利用所有神经框架中存在的标准操作。

对于 ImageNet 数据集,我们的架构提高了广泛性能点的最新技术水平。对于目标检测任务,我们的网络在准确性和模型复杂性方面都优于 COCO 数据集上最先进的实时检测器。值得注意的是,我们的 与 SSDLite 检测模块相结合的架构比 YOLOv2 少 20 倍的计算量和 10 倍的参数。

在理论方面:所提出的卷积块具有独特的属性,允许将网络表达能力(由扩展层编码)与其容量(由瓶颈输入编码)分开。探索这是未来研究的重要方向.

两种 MobileNet 模型都使用开源 TensorFlow 对象检测 API [38] 进行训练和评估。 两种型号的输入分辨率均为 320 × 320。 我们对 mAP(COCO 挑战指标)、参数数量和乘法加数进行了基准测试和比较。 结果如表 6 所示。MobileNetV2 SSDLite 不仅是最高效的模型,而且是三个模型中最准确的。 值得注意的是,MobileNetV2 SSDLite 的效率提高了 20 倍,体积缩小了 10 倍,同时在 COCO 数据集上仍优于 YOLOv2。

猜你喜欢

转载自juejin.im/post/7085956488908242951