【笔记整理】轻量级神经网络 MobileNetV3
文章目录
- 【笔记整理】轻量级神经网络 MobileNetV3
- 1、深度可分离卷积
- 2、翻转残差块和线性瓶颈结构
- 3、h-swish 函数和 SE 模块
- 4、网络结构搜索
近年来关于 CNN 的研究在飞速发展,CNN 模型在目标检测、图像分割等领域都取得了不错的研究成果。为了提高模型在这些领域的检测准确率,越来越多的研究者们在网络设计深度上做研究,比如 ResNet 残差模块的提出为 CNN 在特征提取的发展上奠定了理论基础和实践方向,使得模型在后来发展中取得了卓越的性能改进。残差模块虽然有效解决了模型梯度消失的问题,但模型结构变得十分复杂,网络深度甚至多达一百多层,计算量也大大增加,模型的训练更多需要依靠高算力的服务器,尤其在一些实际应用中,比如对于自动驾驶,实时目标检测任务来说,这些庞大而又复杂的模型很难满足工业上的要求。
为了平衡 CNN 模型在检测准确率和计算开销上的性能,Google 团队在 2017 年提出了轻量级的神经网络模型 MobileNetV1,其核心是运用深度可分离卷积(depthwise separable convolution)的思想构建模型,同时引入两个全局性超参数(宽度因子和分辨率因子),能够有效的平衡模型延迟度和准确度两者之间的关系,相比于其它 CNN 网络模型,MobileNetV1 参数更少,计算速度更快。Google 团队在 2018 年提出的 MobileNetV2则借鉴了 ResNet 残差连接的思想,利用深度可分离卷积在高维通道特征图上相较于标准卷积而言计算速度更快的优点,引入了翻转残差(inverted residuals)和线性瓶颈(linear bottleneck)模块有效避免梯度消失的问题。在 2019 年 Google 团队在 MobileNetV2 基础块上进行了改进,在其深度卷积层和分离卷积层之间引入了 Squeeze-Excited 模块,对特征进行压缩处理,提出了 MobileNetV3 网络。
MobileNetV3 使用 hswish 激活函数替代 swish 激活函数,提高了模型运算效率。在网络结构上,通过一种基于终端的网络结构搜索算法(platform-aware neural architecture search,MnasNet)优化每个轻量级网络模块以及不同模块间的连接关系,进而生成一个初始网络结构。接着使用网络自适应算法(Platform-Aware Neural Network Adaptation,NetAdapt)在设置好优化目标下对MnasNet 生成的初始网络结构进行层级的参数优化,进而得到全局最优的模型。轻量级神经网络可以应用在算力较低的硬件设备上,使得 CNN 这个强大的特征提取器可以普及到任何终端设备,完成设备的功能扩展以及应用的开发。
1、深度可分离卷积
卷积层是 CNN 中最核心的一层,在提取特征时使用卷积核完成卷积运算。在图像处理中,卷积核通过线性运算可以对图像的局部特征进行提取,对图像局部区域进行感知,随着 CNN 卷积层数的增加,CNN 可以获得更大的局部区域感知视野,进而完成对整张图像的感知。
通常卷积核包括 4 个参数:卷积核高度
D
h
D_ℎ
Dh,卷积核宽度
D
w
D_w
Dw,卷积核通道数
M
M
M,卷积核个数
N
N
N。其中卷积核的尺寸大小一般是奇数 × 奇数,即
D
h
D_ℎ
Dh =
D
w
D_w
Dw,最常见的是 1×1,3×3 或 5×5,因此这里用
D
k
D_k
Dk 来共同表示
D
h
D_h
Dh 和
D
w
D_w
Dw。
在单通道卷积运算中,卷积操作可以把卷积核当作一个滑动窗口,从左往右、从上到下依次和图像被“遮住”的区域进行卷积操作,每次完成对应位置相乘再相加的点积运算,待扫描完整张图片之后,得到的一个矩阵即为一个特征图。在多通道卷积运算中,对每个通道得到的特征图按相应位置进行相加,得到最终的特征图。传统卷积操作如下图所示。
CNN 在做卷积运算时,除了卷积核 4 个参数外,还引入卷积核每次滑动的步长(stride)和填充值(padding)。如果 stride 设置为 1,则相邻两次扫描的局部区域在感知视野之间存在较大的重复区域,如果 stride 值大于
D
k
D_k
Dk,则相邻两次扫描的局部区域在感知视野之间存在原图信息上的丢失。使用 padding 可以对原特征图边缘进行像素 0 的填充,当卷积核扫描输入数据时,它能延伸到边缘以外的伪像素,从而使输入和输出的特征图大小保持一致。其中 padding 有两种模式:1)Valid padding:padding 值为 0,对原特征图或原始图像不进行任何处理,不允许卷积核超出原特征图或原始图像边界;2)Same padding:padding 值为
D
k
−
1
2
\frac{D_k−1}{2}
2Dk−1 ,对原特征图或原始图像进行像素 0 的填充,允许卷积核超出原特征图或原始图像边界,并使得卷积后特征图的大小与原来的一致。
设输入特征尺寸为
s
i
z
e
i
n
×
s
i
z
e
i
n
size_{in} × size_{in}
sizein×sizein,通道数为
c
h
a
n
n
e
l
i
n
channel_{in}
channelin,则输入特征维数,输出特征的维数和卷积核参数之间存在如下特定关系:
1)输入特征的通道数 c h a n n e l i n channel_{in} channelin = 卷积核的通道数
2)输出特征的通道数 c h a n n e l o u t channel_{out} channelout = 卷积核的个数 N N N
3)输出特征的尺寸 s i z e o u t size_{out} sizeout为:
s i z e o u t = ⌊ s i z e i n + 2 × p a d d i n g − D k s t r i d e ⌋ + 1 size_{out} = \lfloor \frac{size_{in} + 2 \times padding - D_k}{stride} \rfloor + 1 sizeout=⌊stridesizein+2×padding−Dk⌋+1
因此对于每一次传统的卷积运算,卷积参数总数 P a r a m n u m Param_{num} Paramnum 和卷积计算量 𝐶𝑜𝑠𝑡 分别为
P a r a m n u m = D k × D k × M × N Param_{num} = D_k \times D_k \times M \times N Paramnum=Dk×Dk×M×N C o s t = D k × D k × M × N × s i z e o u t × s i z e o u t Cost = D_k \times D_k \times M \times N \times size_{out} \times size_{out} Cost=Dk×Dk×M×N×sizeout×sizeout
MobileNet 中最大的突破在于引入了深度可分离卷积,将传统的卷积操作分解成逐通道卷积(Depthwise Convolutional,DW)和逐点卷积(Pointwise Convolutional,PW)两部分。深度可分离卷积操作如下图所示。
与传统卷积相比,每个卷积层的 DW 卷积核的个数只有一个,其通道数和输入特征图的通道数保持一致,因此每次 DW 操作时只会得到一种类型的特征图,不能对原始特征进行升维和降维功能。为了解决这个问题,MobileNet 引入了逐点卷积(PW),其实际上是使用
1
×
1
×
M
×
N
1 \times 1 \times M \times N
1×1×M×N 的卷积核对 DW 卷积得到的特征图进行传统的卷积操作(
M
M
M 为 PW 卷积核的通道数,
N
N
N 为 PW 卷积核的个数),深度可分离卷积最终输出的特征的通道数即为 PW 卷积核的个数。
在 MobileNet 的每个卷积层中,先进行 DW 卷积再进行 PW 卷积,DW 卷积核个数只有一个,目的是为了获得对图像中局部区域的感知,而 PW 卷积核尺寸只有 1 × 1,可以通过扩展PW 卷积核个数来实现特征的升维和降维,相较于传统卷积而言,降低了升维和降维带来的参数量的增加。
对于每一次深度可分离卷积运算,卷积参数总数 P a r a m n u m Param_{num} Paramnum 和卷积计算量 𝐶𝑜𝑠𝑡 分别为
P a r a m n u m = D k × D k × M + 1 × 1 × M × N Param_{num} =D_k \times D_k \times M + 1 \times 1 \times M \times N Paramnum=Dk×Dk×M+1×1×M×N C o s t = D k × D k × M × s i z e o u t × s i z e o u t + s i z e o u t × s i z e o u t × 1 × M × N Cost = D_k \times D_k \times M \times size_{out} \times size_{out} + size_{out} \times size_{out} \times 1 \times M \times N Cost=Dk×Dk×M×sizeout×sizeout+sizeout×sizeout×1×M×N
深度可分离卷积和传统卷积的计算量比较如下:
D k × D k × M × s i z e o u t × s i z e o u t + s i z e o u t × s i z e o u t × 1 × M × N D k × D k × M × N × s i z e o u t × s i z e o u t = 1 N + 1 D k 2 \frac{D_k \times D_k \times M \times size_{out} \times size_{out} + size_{out} \times size_{out} \times 1 \times M \times N}{D_k \times D_k \times M \times N \times size_{out} \times size_{out}} \\ = \frac{1}{N} + \frac{1}{D^2_k} Dk×Dk×M×N×sizeout×sizeoutDk×Dk×M×sizeout×sizeout+sizeout×sizeout×1×M×N=N1+Dk21
可以看到,如果仅生成一种类型的特征图(𝑁 = 1),深度可分离卷积的方法在参数量和计算量上都不如传统卷积好,随着生成越来越多类型的特征图,深度可分离卷积就能够节省更多的参数。由于卷积核大小 D k D_k Dk 一般远小于卷积核的个数 N N N,因此深度可分离卷积的计算速度比正常卷积的快 D k 2 D_k^2 Dk2。
尽管 MobileNet 相较于其他庞大而又结构复杂的模型已经很轻量了,但还可以使用宽度缩放因子
α
∈
(
0
,
1
]
\alpha \in (0, 1]
α∈(0,1] 和分辨率缩放因子
ρ
∈
(
0
,
1
]
\rho \in (0, 1]
ρ∈(0,1]对 MobileNet 进一步轻量化。
对于宽度缩放因子 𝛼,将每层的输入输出通道数分别缩放为
α
M
\alpha_M
αM 和
α
N
\alpha_N
αN,缩放后的参数量
P
a
r
a
m
n
u
m
Param_{num}
Paramnum 和计算量 𝐶𝑜𝑠𝑡 如下式子所示:
P a r a m n u m = D k × D k × α M + 1 × 1 × α M × α N C o s t = D k × D k × α M × s i z e o u t × s i z e o u t + s i z e o u t × s i z e o u t × α M × α N Param_{num} = D_k \times D_k \times \alpha M + 1 \times 1 \times \alpha M \times \alpha N \\ Cost = D_k \times D_k \times \alpha M \times size_{out} \times size_{out} + size_{out} \times size_{out} \times \alpha M \times \alpha N Paramnum=Dk×Dk×αM+1×1×αM×αNCost=Dk×Dk×αM×sizeout×sizeout+sizeout×sizeout×αM×αN
通过为 DW 卷积核的通道数和 PW 卷积核的个数增加一个缩放因子 𝛼,可以得到如下多种规格的 MobileNet:1.0 MobileNet-224
、0.75 MobileNet-224
、0.5 MobileNet-224
,其中卷积核数量和通道数的减少会降低模型的分类精度。
对于分辨率缩放因子𝜌,将每层的输入输出特征图的尺寸分别缩放为 𝜌𝑠𝑖𝑧𝑒𝑜𝑢𝑡,结合宽度缩放因子 𝛼,缩放后的参数量和计算量分别为:
P a r a m n u m = D k × D k × α M + 1 × 1 × α M × α N C o s t = D k × D k × α M × ρ s i z e o u t × ρ s i z e o u t + ρ s i z e o u t × ρ s i z e o u t × α M × α N Param_{num} = D_k \times D_k \times \alpha M + 1 \times 1 \times \alpha M \times \alpha N \\ Cost = D_k \times D_k \times \alpha M \times \rho size_{out} \times \rho size_{out} + \rho size_{out} \times \rho size_{out} \times \alpha M \times \alpha N Paramnum=Dk×Dk×αM+1×1×αM×αNCost=Dk×Dk×αM×ρsizeout×ρsizeout+ρsizeout×ρsizeout×αM×αN
可以发现改变 𝜌 并没有改变 MobileNet 模型的参数量,只改变模型输出特征图的尺寸大小。通过分辨率缩放因子 𝜌,可以得到如下多种规格的 MobileNet:1.0 MobileNet-224、1.0 MobileNet192、1.0 MobileNet-160,其中 MobileNet 输出特征图尺寸的减少会降低模型的分类精度。
2、翻转残差块和线性瓶颈结构
在 MobileNetV2 中,作者借鉴了 Residual 残差块的思想,通过跨层的跳跃连接实现残差的正向传播,并且在反向传播时放大残差模块中关于权重的更新。残差块如下图所示。
在残差块中,输入的特征首先经过 1 × 1 卷积的压缩,然后利用 3 × 3 的卷积进行特征提取,最后再用 1 × 1 的卷积将整个特征图的通道数变回去,整个过程实现“降维-卷积-升维”,这样设计的目的是减少 3 × 3 卷积核在特征提取时的计算量,提高整个残差模块的计算效率。
标准的的残差块并不适用于MobileNet的深度可分离卷积操作,由上式子(param,cost)可知,深度可分离卷积随着PW卷积核个数的增加计算效率会越高,因此需要通过翻转残差块来提高MobileNetV2 的性能,翻转残差块如下图所示。
在翻转残差块中,输入的特征首先经过 1 × 1 的 PW 卷积进行特征图通道的扩张,然后使用 3 × 3 的 DW 卷积进行特征提取,最后再用 1 × 1 的 PW 卷积将特征图的通道数压缩回去,整个过程实现“升维-卷积-降维”,因此整个模块所做的是与标准残差块相反的操作。
在翻转残差块中使用的是 Relu6 激活函数,该函数为 Relu 函数设置了值为 6 的上界,函数表达式如下所示,函数图像如下图所示。
R e l u 6 = m i n ( 6 , m a x ( 0 , x ) ) Relu6 = min(6,max(0,x)) Relu6=min(6,max(0,x))
在 MobileNetV2 中,作者认为 Relu 激活函数在对低维空间进行非线性变换时,容易丢失特征的关键信息,因此在 MobileNetV2 中引入线性瓶颈结构,即在翻转残差模块中执行了第二次PW 卷积降维操作之后,用 linear 线性映射代替 Relu 激活函数进行特征提取。翻转残差模块中的线性瓶颈结构如下图所示。
相比于 MobileNetV1,MobileNetV2 在 DW 卷积之前先进行 PW 卷积,主要原因是 DW 卷积没有改变通道数的能力,上一层特征图有多少通道它就只能输出多少通道的特征图,如果上一层特征图的通道数很少,DW 卷积只能在低维空间上提取特征,这样效果并不好,因此这里在 DW 卷积之前使用 PW 卷积,在原来深度可分离卷积操作的基础上设计了翻转残差模块,提高 DW 卷积的特征提取能力,并有效避免梯度消失的问题。
3、h-swish 函数和 SE 模块
由于 Relu6 函数在处理低维特征时容易出现信息丢失问题,而 sigmoid 函数不存在这个问题,因此可以用 swish 函数来替代 Relu6,函数如下式所示,图像如下图所示。
s w i s h [ x ] = x ⋅ s i g m o i d ( β x ) swish[x] = x \cdot sigmoid(\beta x) swish[x]=x⋅sigmoid(βx)
考虑到 sigmoid 函数在 CPU 中计算开销比 Relu 函数大,因此 MobileNetV3 使用 R e L U 6 ( x + 3 ) 6 \frac{ReLU_6(x+3)}{6} 6ReLU6(x+3)函数分段线性模拟 sigmoid 函数,如下图所示:
最终将 swish 函数替换成 h-swish 函数,函数表达式如下式所示,函数图像如下图所示。
h − s w i s h [ x ] = x R e L U 6 ( x + 3 ) 6 h-swish[x] = x \frac{ReLU6(x+3)}{6} h−swish[x]=x6ReLU6(x+3)
MobileNetV3借鉴了Squeeze-and-Excite(SE)模块与残差块并联整合的想法,在MobileNetV2 的翻转残差块基础上加入了 SE 模块,对 DW 卷积后的特征进行增强,其中 MobileNet V3-SE 模块如下图所示。
在 MobileNetV3-SE 模块中,先对 DW 卷积特征图进行全局平均池化 (GAP),获得一个
1
×
1
×
C
1 \times 1 \times C
1×1×C的向量; 接着设置 SE ratio 为 0.25,经过第一次全连接和激活操作之后,将输出通道数压缩为原来的
1
4
\frac{1}{4}
41;接着经过第二次全连接和激活操作,将输出通道数扩张为 𝐶,SE 模块输出
1
×
1
×
C
1 \times 1 \times C
1×1×C 的向量。最终将
1
×
1
×
C
1 \times 1 \times C
1×1×C 向量与 DW 卷积后的
H
×
W
×
C
H \times W \times C
H×W×C 特征图逐通道相乘,实现特征增强。SE 模块对输入特征图的整个通道进行压缩,输出的 scale 可以把重要的特征进行增强,不重要的特征进行减弱,让提取的特征更具有指向性。
4、网络结构搜索
MobileNetV3 使用基于终端的的网络结构自动搜索算法 MnasNet 生成一个初始网络,使用下式对每个 Block 内的超参数进行搜索和优化,其中 A C C ( m ) ACC(m) ACC(m)表示第 m m m 个模型在 COCO 测试集上的预测准确率, L A T ( m ) LAT(m) LAT(m)是第 m m m 个模型的预测时延, T A R TAR TAR是人为设置下模型预测时允许的最大时延, w w w是时延惩罚项。
A C C ( m ) × [ L A T ( m ) / T A R ] w ACC(m) × [LAT(m)/TAR]^w ACC(m)×[LAT(m)/TAR]w
关于每个 Block 的参数搜索空间如下:
-
卷积算子:传统卷积算子,深度可分离卷积算子,倒置瓶颈卷积算子;
-
卷积核尺寸:3 × 3, 5 × 5;
-
跳跃连接算子:最大池化,平均池化,残差连接块,不使用跳跃连接;
-
卷积核个数:𝐹𝑖;
-
每个块包含的层数:𝑁𝑖;
网络结构搜索问题是一个多目标的搜索问题,在 MnasNet 中使用强化学习方法来寻找该问题的帕累托最优解。首先将搜索空间中的每个 Block 映射成一个 token 向量,用于表示智能体在基于模型参数 𝜃 下,选择要将哪个 Block 加入到现有的模型中,MnasNet 的优化目标是最大化如下式所示的期望奖励函数。
J = E P ( α 1 : T ; θ ) [ R ( m ) ] J = E_P(\alpha_{1:T};\theta) [R(m)] J=EP(α1:T;θ)[R(m)]
其中 m m m 表示通过动作 α 1 : T \alpha_{1:T} α1:T 采样得到的唯一模型,而 R ( m ) R(m) R(m)是该模型通过式上上式子 计算的指标值。
作者在使用 MnasNet 优化网络结构时发现,对于小模型而言,时延的增加会导致模型精度 的急剧增大,为了让 NetAdapt 参数优化过程更加平稳,需要将式 (2.14) 中的 w = 0.07 修改为 w = 0.15 w= 0.15 w=0.15 来加大因时延增加对优化指标带来的惩罚。
MnasNet在确定好Block块内部层结构以及Block块之间的连接关系之后,使用NetAdapt 对MnasNet优化得到的网络结构进行层级的参数优化,优化目标设置为 Δ A c c ∣ Δ L a t e n c y ∣ \frac{ΔAcc}{|ΔLatency|} ∣ΔLatency∣ΔAcc。关于NetAdapt 的参数优化算法如下:
-
使用 MnasNet 优化得到一个网络结构;
-
每一步的迭代过程如下(如果大于预期设置好的时延则迭代结束):
1)增加关于时延变化量的约束,如果当前探索到的局部最优模型相较于全局最优模型,
其时延变化量大于 𝛿,则将当前的局部最优模型作为全局最优模型;2)对上一步得到的预训练模型的层结构参数,通过删除或随机初始化参数方式进行微
调。在对当前步的模型进行 𝑇 步微调之后计算其在 COCO 数据集上的准确率;3)输出当前全局最优的模型;