论文原文

https://arxiv.org/pdf/1905.02244.pdf

原文翻译

http://tongtianta.site/paper/27865 在通天塔网站上可以找到几乎所有深度学习经典论文或者一些顶会论文的翻译,强烈安利。

设计核心

MobileNetV3是继Google MobileNetV1和MobileNetV2后的新作,主要使用了网络搜索算法(用NAS通过优化每个网络块来搜索全局网络结构,用NetAdapt算法搜素每个层的过滤器数量),同时在MobileNetV2的网络结构基础上进行改进,并提出了新的SE模块和新的H-Swish激活函数。

创新点

1. 引入SE结构


在MobileNetV2的bottlenet结构中加入了SE结构,在Caffe的Prototxt的实现如下:
因为SE结构会消耗一定的时间,所以作者在含有SE的结构中,将expansion layer的channel变为原来的1/4,论文发现这样既提升了精度,也没有增加时间消耗。并且SE结构放在了DepthWise后面。

2. 更改网络末端计算量大的层

MobileNetV2的inverted bottleneck结构是使用了1*1卷积作为最后一层,以扩展到高维度的特征空间(也就是下图中的320->1280那一层的1*1卷积)。这一层的计算量是比较大的。MobileNetV3为了减少延迟并保留高维特性,将该1*1层移到最终的平均池化之后(960->Avg Pool->1*1 Conv)。现在计算的最后一组特征图从7*7变成了1*1,可以大幅度减少计算量。最后在去掉了inverted bottleneck中的DepthWise和1*1降维的层,在保证精度的情况下大概降低了15%的运行时间。

3. 更改初始卷积核的个数

修改头部卷积核channel数量,mobilenet v2中使用的是32 x 3 x 3,作者发现,其实32可以再降低一点,所以这里作者改成了16,在保证了精度的前提下,降低了3ms的速度。

4. H-Swish 激活函数

MobileNetV3引入了新的非线性激活函数:h-swish。它是最近的swish非线性函数的改进版本,计算速度比swish更快(但比ReLU慢),更易于量化,精度上没有差异。其中swish激活函数的公式如下:
s w i s h ( x ) = x δ ( x ) swish(x) = x*\delta(x) swish(x)=xδ(x)
而h-swish的公式如下:
h s w i s h ( x ) = x R e L U ( x + 3 ) 6 h-swish(x)=x\frac{ReLU(x+3)}{6} hswish(x)=x6ReLU(x+3)。简单说下,swish激活函数相对于ReLU来说提高了精度,但因为sigmoid函数而计算量较大。而h-swish函数将sigmoid函数替换为分段线性模拟,使用的ReLU6在众多软硬件框架都可以实现,同时在量化时降低了数值的精度损失。下面这张图提到使用h-swish在量化的时候可以回升15%的精度,还是比较吸引人的。

网络结构

开头提到这篇论文提出了2种结构,一种Small和Large。结构如下:

NAS搜索全局结构和NetAdapt搜索层结构

这一部分确实不太懂,可以查看论文原文。

实验

这里就不说了,在分类,分割的实时网络中肯定都是state-of-art。

补充

在知乎上看到一个回答,蛮有趣的:

结论

基本上上面都把MobileNetV3讲的比较清楚了,但是似乎这次Google开源的这个V3没有达到业界的预期吧,且似乎这篇论文给人的感觉是网络和相关的Trick很容易懂,但是具体是怎么搜索出V3以及预训练模型未开源这些问题仍会使我们一脸懵。但如果从工程角度来讲,毕竟使用简单,效果好也没法再要求什么了是吧(笑)。

参考文章

https://zhuanlan.zhihu.com/p/69315156
http://tongtianta.site/paper/27865

代码实现

Caffe: https://link.zhihu.com/?target=https%3A//github.com/jixing0415/caffe-mobilenet-v3
Pytorch: https://github.com/xiaolai-sqlai/mobilenetv3