Searching for MobileNetV3
1. 摘要
基于网络架构搜索和 NetAdapt 算法,作者提出了新一代的 MobileNets,并通过一些先进的结构对其进行了改进。
作者发布了两个模型 MobileNetV3-Large 和 MobileNetV3-Small 分别应用于资源较多和较少的场景,这些模型也可以被调整并应用到目标检测和语义分割等其它领域。
2. 高效的网络构建块
MobileNetV1 引入了深度可分离卷积作为传统卷积的有效替代,MobileNetV2 引入了线性瓶颈和反转残差结构来构建更加高效的网络层,MnasNet 在 MobileNetV2 的基础上基于 SENet 的思想在瓶颈结构中引入了轻量级的注意力机制。
MobileNetV3 结合了上面这些结构块来构建最高效的模型,除此之外,作者还对 swish 作了改进来作为网络中的激活函数。
作者将注意力模块放在了扩展层的深度卷积后面,此外每一层的非线性激活函数也不一定相同。
3. 网络搜索
网络搜索技术已经是一个用来发现和优化网络架构的强有力工具。针对 MobileNetV3,作者先利用 NAS 优化每个网络块来搜索全局的网络架构,然后再利用 NetAdapt 算法来按顺序微调每一个单独的层。
4. 网络改进
4.1. 重新设计代价比较大的层
通过网络搜索得到模型后,作者观察到网络中一些前面和后面的层比其余的层计算代价更高,因此,作者提出了一些改进来在减少时延的同时保持准确率。
当前基于 MobileNetV2 的变种网络都在最后用一个 1×1 的卷积来扩展到一个高维空间(比如通道数为 1280)用于预测最后的分类。这个操作一般是在池化之前,比如是应用到一个空间大小为 7×7 的特征图上,现在作者将这个 1×1 的卷积放到了池化层后面,这样特征图的空间大小就变成了 1×1,可以大大减少计算量和时延。
一旦这个层被迁移到池化层后面,那么其前面一个瓶颈结构的投影层也就没有必要再存在来降低计算量了,所以作者移除了前面的特征提取层和投影层,来进一步降低计算复杂性。
可以看到,原始最后阶段的 960-960 深度卷积特征提取层和 960-320 的投影层被移除了。
另一个计算代价比较高的层是一开始的卷积层,现在的移动端网络一般都采用 3×3 的卷积,卷积核个数为 32。作者发现这个层采用 hard swish 激活函数和其它激活函数效果一样好,并将卷积核个数减少到了 16 个。
4.2. 非线性激活函数
最近提出了一个称之为 swish 的激活函数用来作为 ReLU 的替代品,其可以显著提高网络的准确性。
虽然这个激活函数可以提高准确率,但在移动设备上 sigmoid 函数计算代价是很高的,所以作者对它进行了两个方面的改进。
- 用分段线性的函数来硬模拟 sigmoid;
这样做在实际中有三个好处:ReLU6在几乎所有的软件和硬件上都可以实现;在量化模式下,可以消除 sigmoid 带来的潜在数值精度损失;hard-swish 可以用分段线性函数来实现减少导致时延的内存访问次数。
- 将 swish 应用在较深的网络层就可以带来大部分好处,因此作者只在网络的后半段应用它们;
4.3 大的 squeeze-and-excite 层
这里 SE 层的中间通道数作者设置为扩展层通道数的四分之一,这样做可以在适当增加参数量的情况下提升准确率,对时延没有明确影响。
4.4 网络结构
exp size
表示扩展层的通道数,#out
表示输出通道数,SE
表示是否有 squeeze-and-excite 层,NL
代表激活函数为 ReLU 或者 Hard-Swish,s
表示步长。上面是 MobileNetV3-Large 的结构,下面是 MobileNetV3-Small 的结构。
5. 实验结果
在 Pixel 系列手机上性能对比如下所示:
同样地,我们也可以用宽度乘子和分辨率乘子进一步调整网络大小:
采用不同的激活函数结果对比如下:
获取更多精彩,请关注「seniusen」!