今天开始阅读轻量级分类网络MobileNet v2, 这里写下阅读笔记,方便以后复习。
论文标题:MobileNetV2: Inverted Residuals and Linear BottleNecks
这篇论文描述了一种新的移动端框架, 即MobileNetV2, 在多个任务和数据集中被证实是移动端模型的最优模型(state-of-the-art)。论文也描述了在目标检测中应用这些移动端模型的有效方法,并将这种方法用于一个新颖的框架,称为SSDLite。另外,论文也验证了怎样搭建一个移动端语义分割模型,它是一个删减版的DeepLabv3,被称为 Mobile DeepLabv3。
MobileNetV2是基于反向残差架构(inverted residual),它的捷径连接(shortcut connections)是在细化的瓶颈层之间(thin bottleneck layers)。中间扩展层使用了轻量基于深度卷积来过滤特征并把它的输出作为非线性的输入。另外,论文发现移除比较窄的层中的非线性是很重要的,这样可以保持模型的表达能力。论文证实了这样可以提升模型性能,并给模型设计提供指导。
(问题1:什么是细化的瓶颈层?这个细化指的是什么?
问题2:什么是比较窄的层?这个窄如何定义?)
最终,MobileNetV2允许从转换表示中解耦输入与输出,这为以后的分析提供了一个方便的框架。论文在ImageNet分类数据集, COCO目标检测数据集和VOC图像分割数据集中测量模型性能。论文在如下几个方面对模型的权衡效果进行评估:模型准确性,模型计算量(Multi-Adds),实际延迟以及模型参数量。
神经网络变革了机器智能的很多领域,对于有挑战性的图像识别任务能够超出人类的准确性。然而,准确性的提升往往需要较多的计算资源,但是这些资源需求往往超出移动端和嵌入式应用的限制。
论文介绍了一个新的神经网络架构,它是为移动端和有资源限制的环境专门设计的。论文网络实现了移动端定制计算机视觉模型的最优(state-of-the-art),在减少计算量和内存需求的同时保证了相同的准确率。
论文的主要贡献是提出一个新颖的层模块:带线性瓶颈的反向残差(the inverted residual with linear bottoleneck)。这个模块将低维压缩表示作为输入,然后被扩展到高维,通过轻量级的基于深度的卷积进行过滤。特征通过线性卷积紧接着被映射回低维表示。官方实现是TensorFlow-Slim模型库的一部分。
这个模块可通过任何一个现代框架使用标准操作进行有效实现。论文的模型在多个标准数据集打败了当时最优模型。论文提出的这个卷积模块尤其适用于移动端设计,因为它能在推理阶段明显减少内存需要(在推理阶段从来不会完全实例化大的内部张量)。这减少了很多嵌入式硬件设计的主存访问需要,很多嵌入式硬件提供了少量快速的软件控制缓存。
这部分主要从初始的人工设计神经网络开始介绍,包括AlexNet, VGG, InceptionNet, Resnet, 并介绍了一些关于网络的优化方法;然后介绍了基于泛化算法和增强学习的模型结构搜索方法,属于自动设计模型的范畴,并指出这种方法通常输出比较复杂的模型。最后论文介绍了本论文的目标是给开发者提供更好地指导,并给出最简单的网络设计。
论文提出的MobileNetV2是基于MobileNetV1,保留了简单性,不需要任何特别的操作,同时提升了准确性,在移动应用的多个分类任务和检测任务重实现最优。
(这里只是简单总结了论文中这一章节的内容,如果感兴趣,可自行阅读原始论文)。
基于深度可分离的卷积是将标准卷积分解为两个独立层,即基于深度的卷积层和基于点的 1 × 1 1\times 1 1×1卷积层。基于深度的卷积层用于过滤特征,对输入特征每一通道使用一个单通道卷积核;基于点的卷积层用于对基于深度的卷积层的输出特征进行线性组合,产生新的特征表示。和标准卷积相比,计算量减少了大约 k 2 k^2 k2倍, k k k指卷积核大小,一般取 k = 3 k=3 k=3,因此,这里计算量一般减少 8 − 9 8-9 8−9倍。
MobileNetV2就是用 3 × 3 3\times 3 3×3基于深度的可分离卷积。
考虑一个由 n n n层组成的深度神经网络,每一层 L i L_{i} Li都有一个激活张量,它的维度是 h i × w i × d i h_{i}\times w_{i}\times d_{i} hi×wi×di。这一节将讨论这些激活张量的基本属性,论文中将这些激活张量视为具有 d i d_{i} di维, h i × w i h_{i}\times w_{i} hi×wi个像素的容器。对于一个将真实图像作为输入集,这些层激活张量的集合构成了一个“感兴趣流形(manifold of interest)”。关于神经网络中的感兴趣流形,一直以来都有这样一个假设:它可以被嵌入到低维子空间中。换句话说,当我们观察一个深度卷积层的所有单一的 d d d通道像素时,被编码进这些值中的信息实际上是在一些流形里面,它们依次可嵌入到一个低维子空间当中(注意,流形的维数不同于子空间的维数,可通过一个线性变换将流形嵌入到子空间中)。
有这样一个事实:通过简单减少层的维数就可以减少操作空间的维数。MobileNetV1中通过一个宽度乘法因子参数(对输入通道数乘以一个参数 α \alpha α, α < = 1 \alpha <=1 α<=1)将计算量和准确率有效权衡就成功利用了这点,它也已经融入其它网络模型设计当中。遵循这一直觉,宽度乘法器方法允许我们减少激活空间的维数除非感兴趣流形跨越整个空间,然而深度卷积神经网络中使用的非线性坐标变换,比如ReLU,破坏了这一直觉。举个例子:ReLU在 1 1 1维空间中将一条直线变成一条射线(ray),在 n n n维空间中呢,将产生带有 n n n个关节点的分段线性曲线。
(这段属于硬翻译,个人理解就是通过减少层的维数-输入通道数 就可以减少模型计算量,MobileNetV1中的宽度乘法器就是这种,但是需要满足一个条件 - 感兴趣流形必须要跨越整个输入空间,也就是不能有信息损失,但是深度卷积网络中应用的ReLU这种非线性变换则会造成信息损失。)
一般来说,如果层中变换 R e L U ( B x ) ReLU(Bx) ReLU(Bx)的结果有非0的容量 S S S,那么可以对输入经过一个线性变换 B B B得到这些被映射到 S S S内部的点,因此说明了一部分的输入空间是和整个维度的输出相关联的。换句话说,深度网络仅在输出域的非零部分有线性分类的能力。更官方的论述开参考论文中的附录内容。
上图主要表达了:原始低维数据被嵌入到高维空间后,经过ReLU这类非线性坐标变换后,输入数据的损失对比,从图中可以看出,空间维度越大( > 15 >15 >15),经过ReLU后原始数据损失相对小一些。
另一方面,当 R e L U ReLU ReLU封闭了某一通道,毫无疑问将损失那个通道的信息。然而,如果我们有很多通道,那么在激活流形中有ReLU这样一个结构,其它通道中仍然保留了这个信息。在附录中说明了:如果输入流形可以被嵌入到激活空间的低维子空间中,那么 R e L U ReLU ReLU变换可以保留这个信息同时将所需的复杂性引入这个表示函数集中(不理解这句话是什么意思)。
根据这一明确需求:兴趣流形应该位于高维激活空间的低维子空间中,论文提出了两条性质:
上面这两条见解给论文优化已有的神经架构提供了宝贵经验:假设兴趣流形是低维的,那么通过在卷积模块中插入线性瓶颈(linear bottleneck)可以获取到它。实验证据表明使用线性层对于减少信息破坏是至关重要的。在第6章中证实了在瓶颈中使用非线性层确实降低了几个百分比的性能,这进一步验证了假设。在CIFAR数据集中,在传统残差模块的输入中移除非线性确实提升了性能。
论文的余下部分将使用瓶颈卷积,论文将输入瓶颈的大小和内部大小的这个比率称为扩展比率(expansion ratio)。
(个人理解,线性瓶颈就是将瓶颈卷积后的ReLU非线性变换替换为线性变换,减少输入信息损失,提高准确率;)
瓶颈模块和残差模块相似,每一个模块包括一个输入,紧跟着就是几个瓶颈层,然后跟着扩展层。然而,受直觉的启发,瓶颈层实际上包含所有需要的信息,这里扩展层仅仅作为一个实现细节,它对张量使用了一个非线性变换,模型中直接在瓶颈层间使用捷径(shortcuts)。
Figure.3中可视化了普通残差模块和瓶颈层残差模块的差异。这里瓶颈层引入捷径的目的和普通残差模块相似:在多层间提升梯度传播的能力。这个反向设计主要考虑内存利用。
Table.1展示了瓶颈卷积的基本实现机构。对于一个模块大小为 h × w h\times w h×w,扩展因子为 t t t,核大小为 k k k,输入通道为 d ′ d^{'} d′,输出通道为 d ′ ′ d^{''} d′′,运算量(Multiply-Add)为:
论文架构的一个有趣的性质是:瓶颈层的输入输出域间有一个自然的分割,变换层是一个非线性函数,它将输入转换为输出。瓶颈层可被视为网络在每一层的容纳能力,变换层则被视为表现力。这与传统的卷积块(常规的和可分离的)形成了对比,在传统卷积块中,表现力和容纳能力是纠缠在一起的,是输出层深度的函数。
特别在论文的用例中,当内层深度是0时,由于快捷连接的存在,卷积变为恒等函数。当扩展比率小于1时,这就是经典的残差模块。论文中瓶颈层则需要这个扩展比率大于1。
此次解析允许我们将模型的表现力从模型的容纳能力中分离出来单独研究,我们相信这种分离研究保证了能够为网络性质提供一个更好地理解。
(这小结也是直译,感觉没有什么有用信息,可能个人对英语理解能力有限吧)
这部分将详细描述模型架构。模型的基本模块是带残差的瓶颈深度可分离卷积,Table.1详细描述了这个模块的组成。MobileNetV2包含有32个过滤器的初始卷积层,紧跟着19个残差瓶颈层,如Table.2所示。论文使用了 R e L U 6 ReLU6 ReLU6这一非线性函数,主要是考虑兼容低精度计算机。使用了卷积核大小为 3 × 3 3\times 3 3×3,在训练中使用dropout和batch normalization(避免过拟合的方法)。
除了第一层外,整个网络使用常量扩展比率。论文通过实验发现,这个扩展比率在 5 − 10 5-10 5−10间有相似的性能,小网络用小的扩展比率性能好一些,大的网络用大的扩展比率会得到较好的额性能。
论文实验中使用扩展比率为 6 6 6。比如,瓶颈层输入张量为 64 − c h a n n e l 64-channel 64−channel,生成 128 − c h a n n l e 128-channle 128−channle的输出,中间扩展层是 64 ∗ 6 = 384 64*6=384 64∗6=384 channels。
超参数权衡 论文网络中,宽度乘法因子是1,输入图像大小为 224 × 224 224\times 224 224×224,计算量(Multiply-Adds)为300 百万(million),参数量为3.4 百万(million)。为了权衡模型性能,论文使用输入分辨率从96到224,宽度乘法因子从0.35 到1.4进行了实验。网络计算量(Multiply-Adds)从7 到 585 M,模型大小在1.7M 到6.9M之间。
论文模型对所有层使用宽度乘法因子,最后一个卷积层除外,这能够提升小模型的性能。
反转残差瓶颈层允许内存高效实现,对于移动端应用来说这是非常重要的。推理阶段一个标准的高效实现使用TensorFlow或者Caffe,构造一个有向无环图 G G G,它的边表示操作,节点表示中间计算的张量。为了最小化内存中的张量数,需要规划计算过程。一般来说,可以搜索所有可能的计算顺序 ∑ ( G ) \sum(G) ∑(G),然后挑选一个使下列公式最小的一个:
这里, R ( i , π , G ) R(i, \pi, G) R(i,π,G)表示中间张量的列表,这个中间张量可连接于 π i . . . π n \pi_{i}...\pi_{n} πi...πn中任何一个节点。 ∣ A ∣ |A| ∣A∣表示张量 A A A的大小, s i z e ( i ) size(i) size(i)表示在操作 i i i执行过程中内部存储内存的总量。
对于仅有普通平行结构的图来说,比如残差连接,仅有一个特别的计算顺序以及推理所需的总记忆量和记忆上限,简化后的计算公式为:
内存用量可被简化为操作过程中输入与输出用量总和的最大值。如果将一个瓶颈残差模块视为一个单操作(将内部卷积视为用完即释放的一个张量),内存总量可由瓶颈层张量大小来表示,而不是瓶颈层内部张量大小(这个是更大的)。
(个人理解:用每一瓶颈层输入与输出张量的和的最大值来计算内存用量)
瓶颈残差模块
这一部分主要对瓶颈残差模块的内存计算进行分析,得出当瓶颈残差模块中间扩展层的扩展系数 t ∈ [ 2 , 5 ] t\in[2,5] t∈[2,5]时,在不影响模型运行性能的前提下,能够减少内存需求,详细内容这里就不说明了,感兴趣可以自行阅读论文。
(个人理解:其实这一章节是对内存实现的优化,不理解也没关系,不影响对MobileNetV2的理解,其实读完这一部分,个人也不是很理解优化内存的原理,哈哈)
这里仅贴出实验结果数据,就不进行详细说明了
到这里,论文就读完了,附录里的内容就不说了,都是公式定理证明之类的,比较枯燥,主要是自己不太理解,就不记录了,以免误导大家。
其实MobileNetV2的主要贡献就是引入了一个新的模块:带残差的瓶颈卷积模块,理解这个模块,大家也就掌握了MobileNetV2的核心。
这篇论文篇幅较长,个人感觉不太容易阅读,尤其是对线性瓶颈层的介绍部分,很多地方都是硬翻译加上个人理解,很多英语词汇不知道用中文怎么表达,望大家见谅。