简介
该文是对 M o b i l e N e t V 1 {\rm MobileNetV1} MobileNetV1的进一步改进,基本模块还是深度可分离卷积。在此基础上,作者引入带线性瓶颈模块的反向残差模块从而得到 M o b i l e N e t V 2 {\rm MobileNetV2} MobileNetV2。实验证明 M o b i l e N e t V 2 {\rm MobileNetV2} MobileNetV2在多项实时性视觉任务上均达到 S O T A {\rm SOTA} SOTA。 论文原文
0. Abstract
论文提出新的适用于移动端的架构, M o b i l e N e t V 2 {\rm MobileNetV2} MobileNetV2,基于反向残差结构和线性模块。最后,作者在图像分类、目标检测、图像分割等视觉任务上证明了 M o b i l e N e t V 2 {\rm MobileNetV2} MobileNetV2的有效性。
论文贡献:(一)指出在低维空间下使用非线性变换会丢失大量有用信息,从而设计处线性瓶颈模块;(二)提出反向残差模块,由此得到 M o b i l e N e t V 2 {\rm MobileNetV2} MobileNetV2;(三) M o b i l e N e t V 2 {\rm MobileNetV2} MobileNetV2在多项实时性视觉任务上达到了 S O T A {\rm SOTA} SOTA。
1. Introduction
论文的主要创新点是提出带有线性模块的反向残差结构,该结构以低维的压缩特征为输入,将其扩展到高维后使用轻量级深度卷积,最后使用线性结构将特征映射回低维。
2. Related Work
M o b i l e N e t V 2 {\rm MobileNetV2} MobileNetV2的设计主要基于 M o b i l e N e t V 1 {\rm MobileNetV1} MobileNetV1,在后者的基础上, M o b i l e N e t V 2 {\rm MobileNetV2} MobileNetV2显著提高了模型精度,并在多项视觉任务上达到 S O T A {\rm SOTA} SOTA。
3. Preliminaries, discussion and intuition
3.1 Depthwise Separable Convolutions
根据上一文,深度可分离卷积的计算量为: h i ⋅ w i ⋅ d i ( k 2 + d j ) (1) h_i\cdot w_i\cdot d_i(k^2+d_j)\tag{1} hi⋅wi⋅di(k2+dj)(1)
其中, h i h_i hi、 w i w_i wi和 d i d_i di表示输入特征图的尺寸, k k k表示卷积核的大小, d i d_i di表示输出特征图的通道数。
3.2 Linear Bottlenecks
考虑一个由 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的激活张量。对于一组输入图像,作者将一系列激活层称为兴趣流型(manifold of interest),有研究表明兴趣流型可以嵌入到低维子空间中。即,当我们观察卷积层中所有单个 d d d通道的像素时,像素值信息位于某流型中,则其可嵌入到低维子空间中。
乍一看,该想法容易得到验证,即减少层维度从而减少激活空间的维度,而 M o b i l e N e t V 1 {\rm MobileNetV1} MobileNetV1中通过宽度缩放系数达到模型精度和速度的折中即证明了这一点。基于宽度缩放的观点,可以减少激活空间的维度从而使兴趣流型横跨整个空间。然而,深度神经网络中的非线性函数会破坏这一假设。如, R e L U {\rm ReLU} ReLU应用于一维空间时会产生一条射线,在 R n {\mathcal R}^n Rn空间内即会得到 n n n条互连的线性曲线。
显然,如果 R e L U ( B x ) {\rm ReLU}(Bx) ReLU(Bx)含有一个非零值 S S S,则映射到 S S S内部的点是通过线性变换 B B B作用于输入得到的。从而表明对于全部输出空间,仅对应于线性变换部分的输入空间。换句话说,深度网络在非零值处仅有线性分类的能力。
此外,由于 R e L U {\rm ReLU} ReLU破坏了特征图的通道维度,而必然会带来信息的丢失。然而,如果我们有很多通道,在丢失部分通道信息时,有价值的兴趣流型仍可能存在于其他通道中。作者证明,如果输入流型可以嵌入到激活空间的一个低维子空间中,那么 R e L U {\rm ReLU} ReLU变换在引入其非线性时也保留了信息。
作者总结了兴趣流型位于高维激活空间的低维子空间的必要性:如果兴趣流型在经过 R e L U {\rm ReLU} ReLU变换后得到非零值,则对应于线性变换;只有当输入流型位于输入空间的低维子空间时, R e L U {\rm ReLU} ReLU才能保留输入流型的完整信息。
基于上述两点,作者提出了针对当前神经网络的优化:假设兴趣流型是低维的,则可以通过在卷积块插入线性模块来获得兴趣流型信息。后续实验证明使用线性模块的有效性,它可以避免信息过多地丢失。
3.3 Inverted Residuals
左图是经典的残差模块,1 x 1
(降维)、3 x 3
(卷积)、1 x 1
(升维),期间均使用非线性激活函数;右图是论文提出的反向残差结构,1 x 1
(点卷积升维)、3 x 3
(深度卷积 + 非线性激活函数)、1 x 1
(降维 + 非线性激活函数)。由于前面提到非线性激活函数仅在低维空间中损失较多信息,所以在反向残差结构中仅在高维空间中使用非线性激活函数。
反向残差结构的计算量: h ⋅ w ⋅ d ′ ⋅ t ( d ′ + k 2 + d ′ ′ ) (2) h\cdot w\cdot d'\cdot t(d'+k^2+d'')\tag{2} h⋅w⋅d′⋅t(d′+k2+d′′)(2)
其中,
(
h
×
w
×
d
′
)
(h\times w\times d')
(h×w×d′)表示输入大小,
t
t
t表示扩张系数即第一次升维的倍数、
k
k
k表示卷积核大小,
d
′
′
d''
d′′表示输出特征图的通道数。如下:
4. Model Architecture
图中的bottleneck
即为图2中的右图结构,其中
n
n
n表示模块的重复次数。这里,如果输入特征图的通道数是
64
64
64,输出通道数是
128
128
128,扩张系数是
t
=
6
t=6
t=6,那么在反向残差结构中的中间通道数为
64
×
6
=
384
64\times6=384
64×6=384。
5. Implementation Notes
Memory efficient inference
对于计算图 G G G而言,其由表示运算的边和表示张量的节点构成。最小化整个计算图等价于最小化计算数与张量数,即计算图的拓扑结构: M ( G ) = min π ∈ ∑ ( G ) max i ∈ 1 , . . . , n [ ∑ A ∈ R ( i , π , G ) ∣ A ∣ ] + s i z e ( π i ) (3) M(G)=\min_{\pi\in\sum(G)}\max_{i\in1,...,n}\left[\sum_{A\in R(i,\pi,G)}|A|\right]+size(\pi_i)\tag{3} M(G)=π∈∑(G)mini∈1,...,nmax⎣⎡A∈R(i,π,G)∑∣A∣⎦⎤+size(πi)(3)
其中, R ( i , π , G ) R(i,\pi,G) R(i,π,G)表示中间张量列表, ∣ A ∣ |A| ∣A∣表示张量 A A A的大小, s i z e ( i ) size(i) size(i)表示操作 i i i所占用内存。其中,内层最大化保证最大张量所需的内存;外层最小化保证整体计算图所需内存最少。
对于仅含平行结构(如残差连接)的计算图,则计算图所需最小内存可简化为: M ( G ) = max o p ∈ G [ ∑ A ∈ o p i n p ∣ A ∣ + ∑ B ∈ o p o u t ∣ B ∣ + ∣ o p ∣ ] (4) M(G)=\max_{op\in G}\left[\sum_{A\in{\rm op}_{inp}}|A|+\sum_{B\in{\rm op}_{out}}|B|+|op|\right]\tag{4} M(G)=op∈Gmax⎣⎡A∈opinp∑∣A∣+B∈opout∑∣B∣+∣op∣⎦⎤(4)
即此时计算图所需内存大小为所有输入输出及其对应操作的大小。
Bottleneck Residual Block 瓶颈残差块 F ( x ) \mathcal F(x) F(x)如图2中的右图所示,其可以看作是三个部分的组合,即 F ( x ) = [ A ∘ N ∘ B ] x \mathcal F(x)=[A\ \circ\ \mathcal N \ \circ\ B]x F(x)=[A ∘ N ∘ B]x。其中 A A A是线性变换 R s × s × k → R s × s × n \mathcal R^{s\times s\times k}\rightarrow \mathcal R^{s\times s\times n} Rs×s×k→Rs×s×n; N \mathcal N N是针对每个通道的非线性变换 R s × s × n → R s ′ × s ′ × n \mathcal R^{s\times s\times n}\rightarrow \mathcal R^{s'\times s'\times n} Rs×s×n→Rs′×s′×n; B B B是线性变换 R s ′ × s ′ × n → R s ′ × s ′ × k ′ \mathcal R^{s'\times s'\times n}\rightarrow \mathcal R^{s'\times s'\times k'} Rs′×s′×n→Rs′×s′×k′。
对于结构 N = R e L U 6 ∘ d w i s e ∘ R e L U 6 \mathcal N={\rm ReLU6}\ \circ\ {\rm dwise}\ \circ\ {\rm ReLU6} N=ReLU6 ∘ dwise ∘ ReLU6,其作用于每个通道。设输入域的大小为 ∣ x ∣ |x| ∣x∣,输出域的大小为 ∣ y ∣ |y| ∣y∣,则 F ( X ) F(X) 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 \mathcal I I可以表示为 t t t个大小为 n / t n/t n/t的张量的级联,则 F ( x ) F(x) F(x)可以表示为: F ( x ) = ∑ i = 1 t ( A i ∘ N ∘ B i ) ( x ) (5) F(x)=\sum_{i=1}^t(A_i\ \circ\ N\ \circ\ B_i)(x)\tag{5} F(x)=i=1∑t(Ai ∘ N ∘ Bi)(x)(5)
通过累加和,我们仅需在内存中保存一个大小为 n / t n/t n/t的中间块。如果 n = t n=t n=t,则我们仅需保留中间结果的单个通道。而使用上述两个技巧的限制是:内部变换是逐通道的;非逐通道运算的输入输出具有显著比。对于大多数传统神经网络而言,该技巧不会产生显著的影响。
注意到,使用 t t t划分的方式计算 F ( X ) F(X) F(X)所需乘法加法操作与参数 t t t无关,但当前的实现方式,即使用多个小矩阵乘法代替大矩阵乘法,将降低运行性能,这主要是由于访问未命中率的提高。作者发现,最佳的 t t t值是 2 2 2或 5 5 5。这时,模型显著降低了其所占内存,并且仍受益于高效的矩阵乘和卷积操作。
6. Experiments
6.1 ImageNet Classification
7. Conclusions and future work
论文提出一种简单高效的模块以构建适用于移动端的神经网络结构,主要部分是带线性瓶颈模块的反向残差结构,最终设计了 M o b i l e N e t V 2 {\rm MobileNetV2} MobileNetV2。实验结果表明,通过引入反向残差结构, M o b i l e N e t V 2 {\rm MobileNetV2} MobileNetV2在多项实时性视觉任务上均达到了 S O T A {\rm SOTA} SOTA。
参考
- Sandler M, Howard A, Zhu M, et al. Mobilenetv2: Inverted residuals and linear bottlenecks[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2018: 4510-4520.