MobileNetV3 与 Lottery Ticket Hypothesis 笔记
MobileNetV3:在 NAS 基础上的工程微调
读完 MobileNetV3 的论文,整体感觉没有以前那些经典工作那么有冲击力,不过性能好能部署就是好东西。先来看实验效果:

总体思路是在 MnasNet 的基础上得到种子结构(seed architecture),再进行微调。Large 版本直接拿 MnasNet 的搜索结果,Small 版本则修改了目标函数,降低 latency 的权重、增大精度的重要性,重新搜索了一遍。
MnasNet 使用的目标函数为:
其中 w 的大小用于控制 latency 的重要性。
NetAdapt 微调
第二步用 NetAdapt 对种子结构进行微调。NetAdapt 的主要目标是在约束 latency 的情况下找到最好的精度,输入一个已训练好的 seed architecture:
- 以平台感知 NAS 找到的种子网络结构作为起点。
- 在每一步:
- 生成一组新的候选结构(proposals)。每个候选都是对结构的一次修改,相比上一步至少带来 的延迟下降。
- 对每个候选,复用上一步预训练好的模型并填充到新结构中,按需对缺失权重做截断或随机初始化;将每个候选 finetune 步,得到精度的粗略估计。
- 按某个指标选出最优候选。
- 重复上一步,直到达到目标延迟。
从种子结构出发,利用 NetAdapt 生成一批 latency 至少下降 delta 的候选结构,然后将种子的权重通过截断或随机初始化的方式对齐到候选结构,再做 finetune,取精度最好的:
这个过程重复多次,最终得到目标 latency 下精度最佳的模型。
头尾与激活函数的改动
得到上述模型之后,还做了一些手工调整,主要改了头部、尾部和激活函数。
头部改变:将初始卷积的输出通道数减半。
尾部改变如下图:

激活函数更改为:
最终得到的整体结构如下:
| Input | Operator | exp size | #out | SE | NL | s |
|---|---|---|---|---|---|---|
| conv2d | - | 16 | - | HS | 2 | |
| bneck, 3x3 | 16 | 16 | - | RE | 1 | |
| bneck, 3x3 | 64 | 24 | - | RE | 2 | |
| bneck, 3x3 | 72 | 24 | - | RE | 1 | |
| bneck, 5x5 | 72 | 40 | ✓ | RE | 2 | |
| bneck, 5x5 | 120 | 40 | ✓ | RE | 1 | |
| bneck, 5x5 | 120 | 40 | ✓ | RE | 1 | |
| bneck, 3x3 | 240 | 80 | - | HS | 2 | |
| bneck, 3x3 | 200 | 80 | - | HS | 1 | |
| bneck, 3x3 | 184 | 80 | - | HS | 1 | |
| bneck, 3x3 | 184 | 80 | - | HS | 1 | |
| bneck, 3x3 | 480 | 112 | ✓ | HS | 1 | |
| bneck, 3x3 | 672 | 112 | ✓ | HS | 1 | |
| bneck, 5x5 | 672 | 160 | ✓ | HS | 1 | |
| bneck, 5x5 | 672 | 160 | ✓ | HS | 2 | |
| bneck, 5x5 | 960 | 160 | ✓ | HS | 1 | |
| conv2d, 1x1 | - | 960 | - | HS | 1 | |
| Pool, 7x7 | - | - | - | HS | - | |
| conv2d 1x1, NBN | - | 1280 | - | HS | 1 | |
| conv2d 1x1, NBN | - | k | - | - | - |
| Input | Operator | exp size | #out | SE | NL | s |
|---|---|---|---|---|---|---|
| conv2d, 3x3 | - | 16 | - | HS | 2 | |
| bneck, 3x3 | 16 | 16 | ✓ | RE | 2 | |
| bneck, 3x3 | 72 | 24 | - | RE | 2 | |
| bneck, 3x3 | 88 | 24 | - | RE | 1 | |
| bneck, 5x5 | 96 | 40 | ✓ | HS | 1 | |
| bneck, 5x5 | 240 | 40 | ✓ | HS | 1 | |
| bneck, 5x5 | 240 | 40 | ✓ | HS | 1 | |
| bneck, 5x5 | 120 | 48 | ✓ | HS | 1 | |
| bneck, 5x5 | 144 | 48 | ✓ | HS | 1 | |
| bneck, 5x5 | 288 | 96 | ✓ | HS | 2 | |
| bneck, 5x5 | 576 | 96 | ✓ | HS | 1 | |
| bneck, 5x5 | 576 | 96 | ✓ | HS | 1 | |
| conv2d, 1x1 | - | 576 | ✓ | HS | 1 | |
| Pool, 7x7 | - | - | - | HS | 7 | |
| conv2d 1x1 | - | 1280 | - | HS | 1 | |
| conv2d 1x1 | - | k | - | HS | - |
其中 SE-block 按如下方式嵌入到 block 里面:

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

THE LOTTERY TICKET HYPOTHESIS:找到可训练的稀疏小网络
这篇文章的核心思想是,可以通过一种迭代的非结构化剪枝方式找到一个小网络,而这个迭代剪枝过程也是对大网络的训练过程。
最终得到的小网络大概是整个大网络的 10%~20% 大小,对这个小网络采取与大网络相同的初始化方式,可以更快地训练到与大网络相匹配的精度,这就是所谓的 lottery。
整个训练迭代过程如下图,这个过程通常会迭代很多次,重要的是每次都初始化为 theta_0:
识别中奖彩票(winning tickets)。 训练一个网络,然后剪掉幅值最小的权重,剩下未被剪掉的连接就构成了中奖彩票的结构。本文独特之处在于:每个未剪连接的值会被重置回它在原网络训练之前的初始化值。核心实验如下:
- 随机初始化一个神经网络 (其中 )。
- 训练网络 次迭代,得到参数 。
- 剪掉 中 的参数,生成掩码 。
- 把剩余参数重置回它们在 中的值,得到中奖彩票 。
并且这样的效果会随着剪枝程度的增加越发明显:剪枝越多,得到的小网络在随机初始化下就越难训练,初始化变得越来越重要,与剪枝前的网络保持同样的初始化方式则会很容易训练。
与《Rethinking the Value of Network Pruning》的对比
另一篇文章《Rethinking the Value of Network Pruning》则表示随机初始化其实也可以得到很好的性能,不过需要合适的学习率。
两篇文章也有一些小的区别:
- 该文章主要使用的是结构化剪枝,小的数据集上使用的是非结构化剪枝,与 lottery 的全部非结构化剪枝有所区别。
- 该文章主要是在大网络上剪枝,但是 lottery 主要是在小网络上做的。
- 优化方式也有所区别,lottery 那篇使用的优化策略并不算是分类任务上的主流配置。
该文章发现在结构化剪枝的时候并没有 lottery 里观察到的那种区别,lottery 下得到的结构在不同的初始化方式下区别其实不大;在非结构化剪枝的时候,主要区别来源于学习率的不同。
