MobileNetV3 与 Lottery Ticket Hypothesis 笔记

MobileNetV3:在 NAS 基础上的工程微调

读完 MobileNetV3 的论文,整体感觉没有以前那些经典工作那么有冲击力,不过性能好能部署就是好东西。先来看实验效果:

Pixel 1 延迟与 ImageNet top-1 精度的折线图,分小模型(20–40ms)与大模型(40–150ms)两栏,MobileNetV3 small/large 位于 MnasNet、ProxylessNAS、MobileNetV2 之上构成最优前沿
图 1:Pixel 1 延迟与 top-1 ImageNet 精度的权衡。所有模型输入分辨率 224,V3-Large 与 V3-Small 用 0.75、1、1.25 倍宽度因子勾勒最优前沿,延迟在同一设备的单大核上用 TFLite 测得。

总体思路是在 MnasNet 的基础上得到种子结构(seed architecture),再进行微调。Large 版本直接拿 MnasNet 的搜索结果,Small 版本则修改了目标函数,降低 latency 的权重、增大精度的重要性,重新搜索了一遍。

MnasNet 使用的目标函数为:

ACC(m)×[LAT(m)TAR]wACC(m) \times \left[\frac{LAT(m)}{TAR}\right]^{w}

其中 w 的大小用于控制 latency 的重要性。

NetAdapt 微调

第二步用 NetAdapt 对种子结构进行微调。NetAdapt 的主要目标是在约束 latency 的情况下找到最好的精度,输入一个已训练好的 seed architecture:

  1. 以平台感知 NAS 找到的种子网络结构作为起点。
  2. 在每一步:
    1. 生成一组新的候选结构(proposals)。每个候选都是对结构的一次修改,相比上一步至少带来 δ\delta 的延迟下降。
    2. 对每个候选,复用上一步预训练好的模型并填充到新结构中,按需对缺失权重做截断或随机初始化;将每个候选 finetune TT 步,得到精度的粗略估计。
    3. 按某个指标选出最优候选。
  3. 重复上一步,直到达到目标延迟。

从种子结构出发,利用 NetAdapt 生成一批 latency 至少下降 delta 的候选结构,然后将种子的权重通过截断或随机初始化的方式对齐到候选结构,再做 finetune,取精度最好的:

ΔAccΔlatency\frac{\Delta Acc}{|\Delta latency|}

这个过程重复多次,最终得到目标 latency 下精度最佳的模型。

头尾与激活函数的改动

得到上述模型之后,还做了一些手工调整,主要改了头部、尾部和激活函数。

头部改变:将初始卷积的输出通道数减半。

尾部改变如下图:

原始尾部与高效尾部的对比示意图:高效版本把 Avg-Pool 提前到 1x1 卷积扩展之后,省去三层昂贵计算
图 2:原始尾部与高效尾部的对比。更高效的尾部在网络末端去掉三层昂贵计算,且不损失精度。

激活函数更改为:

h-swish[x]=xReLU6(x+3)6\text{h-swish}[x] = x \, \frac{\text{ReLU6}(x+3)}{6}

最终得到的整体结构如下:

InputOperatorexp size#outSENLs
2242×3224^2 \times 3conv2d-16-HS2
1122×16112^2 \times 16bneck, 3x31616-RE1
1122×16112^2 \times 16bneck, 3x36424-RE2
562×2456^2 \times 24bneck, 3x37224-RE1
562×2456^2 \times 24bneck, 5x57240RE2
282×4028^2 \times 40bneck, 5x512040RE1
282×4028^2 \times 40bneck, 5x512040RE1
282×4028^2 \times 40bneck, 3x324080-HS2
142×8014^2 \times 80bneck, 3x320080-HS1
142×8014^2 \times 80bneck, 3x318480-HS1
142×8014^2 \times 80bneck, 3x318480-HS1
142×8014^2 \times 80bneck, 3x3480112HS1
142×11214^2 \times 112bneck, 3x3672112HS1
142×11214^2 \times 112bneck, 5x5672160HS1
142×11214^2 \times 112bneck, 5x5672160HS2
72×1607^2 \times 160bneck, 5x5960160HS1
72×1607^2 \times 160conv2d, 1x1-960-HS1
72×9607^2 \times 960Pool, 7x7---HS-
12×9601^2 \times 960conv2d 1x1, NBN-1280-HS1
12×12801^2 \times 1280conv2d 1x1, NBN-k---
表 1:MobileNetV3-Large 的结构规格。SE 表示该 block 是否含 Squeeze-And-Excite;NL 表示非线性类型,HS 为 h-swish、RE 为 ReLU;NBN 表示不做 batch normalization;s 表示 stride。
InputOperatorexp size#outSENLs
2242×3224^2 \times 3conv2d, 3x3-16-HS2
1122×24112^2 \times 24bneck, 3x31616RE2
562×2456^2 \times 24bneck, 3x37224-RE2
282×2428^2 \times 24bneck, 3x38824-RE1
282×4028^2 \times 40bneck, 5x59640HS1
142×4014^2 \times 40bneck, 5x524040HS1
142×4014^2 \times 40bneck, 5x524040HS1
142×4014^2 \times 40bneck, 5x512048HS1
142×4814^2 \times 48bneck, 5x514448HS1
142×9614^2 \times 96bneck, 5x528896HS2
72×967^2 \times 96bneck, 5x557696HS1
72×967^2 \times 96bneck, 5x557696HS1
72×967^2 \times 96conv2d, 1x1-576HS1
72×5767^2 \times 576Pool, 7x7---HS7
12×5761^2 \times 576conv2d 1x1-1280-HS1
12×12801^2 \times 1280conv2d 1x1-k-HS-
表 2:MobileNetV3-Small 的结构规格,符号含义同表 1。

其中 SE-block 按如下方式嵌入到 block 里面:

MobileNetV3 block 示意:1x1 升维、3x3 深度卷积、Pool 与两层 FC(ReLU、hard-σ)构成的 SE 旁路,再经 1x1 降维并接残差连接
图 3:MobileNetV2 + Squeeze-and-Excite。与原 SE 不同,这里把 squeeze-and-excite 放在残差层内部,并按层选用不同的非线性。

MobileNetV2 里 stride=2 的 block 结构如下图,在 V3 中 stride=2 与 stride=1 同样以是否有 residual 连接来区分,residual 和 SE 模块并不冲突:

MobileNetV2 的两种 block:stride=1 block 由 1x1 升维、3x3 深度卷积、1x1 线性投影组成并带残差 Add;stride=2 block 结构相同但无残差连接
图 4:MobileNetV2 的 stride=1 与 stride=2 block,区别在于是否带残差连接。

THE LOTTERY TICKET HYPOTHESIS:找到可训练的稀疏小网络

这篇文章的核心思想是,可以通过一种迭代的非结构化剪枝方式找到一个小网络,而这个迭代剪枝过程也是对大网络的训练过程。

最终得到的小网络大概是整个大网络的 10%~20% 大小,对这个小网络采取与大网络相同的初始化方式,可以更快地训练到与大网络相匹配的精度,这就是所谓的 lottery。

整个训练迭代过程如下图,这个过程通常会迭代很多次,重要的是每次都初始化为 theta_0:

识别中奖彩票(winning tickets)。 训练一个网络,然后剪掉幅值最小的权重,剩下未被剪掉的连接就构成了中奖彩票的结构。本文独特之处在于:每个未剪连接的值会被重置回它在原网络训练之前的初始化值。核心实验如下:

  1. 随机初始化一个神经网络 f(x;θ0)f(x; \theta_0)(其中 θ0Dθ\theta_0 \sim \mathcal{D}_\theta)。
  2. 训练网络 jj 次迭代,得到参数 θj\theta_j
  3. 剪掉 θj\theta_jp%p\% 的参数,生成掩码 mm
  4. 把剩余参数重置回它们在 θ0\theta_0 中的值,得到中奖彩票 f(x;mθ0)f(x; m \odot \theta_0)

并且这样的效果会随着剪枝程度的增加越发明显:剪枝越多,得到的小网络在随机初始化下就越难训练,初始化变得越来越重要,与剪枝前的网络保持同样的初始化方式则会很容易训练。

与《Rethinking the Value of Network Pruning》的对比

另一篇文章《Rethinking the Value of Network Pruning》则表示随机初始化其实也可以得到很好的性能,不过需要合适的学习率。

两篇文章也有一些小的区别:

  1. 该文章主要使用的是结构化剪枝,小的数据集上使用的是非结构化剪枝,与 lottery 的全部非结构化剪枝有所区别。
  2. 该文章主要是在大网络上剪枝,但是 lottery 主要是在小网络上做的。
  3. 优化方式也有所区别,lottery 那篇使用的优化策略并不算是分类任务上的主流配置。

该文章发现在结构化剪枝的时候并没有 lottery 里观察到的那种区别,lottery 下得到的结构在不同的初始化方式下区别其实不大;在非结构化剪枝的时候,主要区别来源于学习率的不同。

VGG-16 与 ResNet-50 在 CIFAR-10 上的测试精度随剪枝比例变化曲线,分迭代剪枝(a)与一次性剪枝(b),对比中奖彩票与随机初始化在学习率 0.1 与 0.01 下的表现
图 5:在 CIFAR-10 上对 VGG-16 与 ResNet-50 做迭代/一次性非结构化剪枝,与 Lottery Ticket Hypothesis 的对比,每点为 5 次运行的平均。只有学习率较小(0.01)时用中奖彩票作初始化才带来提升,但这一小学习率本身的精度低于常用的大学习率(0.1)。