如何评价mobilenet v2 ?

如何评价mobilenet v2 ? Inverted Residuals and Linear Bottlenecks: Mobile Networ…
关注者
1,378
被浏览
258,203

28 个回答

总结一句话就是 业界良心。 另外说点其他答主没提到的东西。

其他答主都已经回答了两个关键的改进: inverted residual 以及Linear Bottlenecks。 问题是 为什么要这么改进呢?


MobileNet1.0 的遗留问题

结构问题:

MobileNet1.0 的结构其实非常简单, 论文里头是一个非常复古的直筒结构, 类似于VGG一样。 这种结构的性价比其实不高, 后续一系列的ResNet, DenseNet等结构已经证明通过复用图像特征, 使用concat/eltwise+ 等操作进行融合, 能极大提升网络的性价比。

有个小插曲: 之前有Google的人来访问的时候提到, MobileNet其实是他们两年前的工作...因为发现一直没人占这个坑, 所以就挂到arxiv上了....... 所以这个结构比较复古也是说得通的。


Depthwise Convolution 的潜在问题:

Depthwise Conv确实是大大降低了计算量, 而且NxN Depthwise + 1X1 PointWise的结构在性能上也能接近NxN Conv。 在实际使用的时候, 我们发现Depthwise 部分的kernel比较容易训废掉: 训完之后发现depthwise训出来的kernel有不少是空的... 当时我们认为是因为depthwise每个kernel dim 相对于vanilla conv要小得多, 过小的kernel_dim, 加上ReLU的激活影响下, 使得神经元输出很容易变为0, 所以就学废了: ReLU对于0的输出的梯度为0, 所以一旦陷入了0输出, 就没法恢复了。 我们还发现,这个问题在定点化低精度训练的时候会进一步放大。

在MobileNetV2中我们也看到了Google在这点上类似的解释, 用ReLu中 不同的Output/dim比值,对特征的分部空间可视化, 来直观解释特征/神经元退化问题。


Inverted residual 以及Linear Bottlenecks的影响:

缓解特征退化:

Linear Bottleneck 通过去掉Eltwise+ 的特征去掉ReLU, 减少ReLU对特征的破坏; Invered residual 有两个好处: 1. 复用特征, 2. 旁支block内先通过1x1升维, 再接depthwise conv以及ReLU, 通过增加ReLU的InputDim, 来缓解特征的退化情况.


效率优先的网络结构设计:

以前大多数的模型结构加速的工作都停留在压缩网络参数量上。 其实这是有误导性的: 参数量少不代表计算量小; 计算量小不代表理论上速度快(带宽限制)。 ResNet的结构其实对带宽不大友好: 旁路的计算量很小,eltwise+ 的特征很大,所以带宽上就比较吃紧。由此看Inverted residual 确实是个非常精妙的设计! 其实业界在做优化加速, 确实是把好几个层一起做了, 利用时空局部性,减少访问DDR来加速。 所以 Inverted residual 带宽上确实是比较友好。


所以总结一下: 这个确实是非常良心, 而且实用靠谱的东西,业界良心。

我来补充下附录里的内容,顺便贴几张图帮助理解。


近两年是深度可分离卷积(Depth-wise Separable Convolution)大红大紫的两年,甚至有跟ResNet的Skip-connection一样成为网络基本组件的趋势。Xception论文指出,这种卷积背后的假设是跨channel相关性和跨spatial相关性的解耦。应用深度可分离卷积的另一个优势即是参数量的节省(这一点其实也是解耦的结果,参数描述上享受了正交性的乘法增益)。


然而,这一假设的成立与否还是存疑的,目前我们也没有足够的工具去描述和证明这一假设。深度可分离卷积的主要应用目的还是在对参数量的节省上(如Light-Head R-CNN中改进Faster R-CNN的头部,本篇中的SSDLite用可分离卷积轻量话SSD的头部),用于控制参数的数量(MobileNet V1中的Width Multiplier和Resolution Multiplier)。


另一方面,网络中的feature map被认为在channel维度存在冗余,常利用1x1卷积进行channel数的压缩后再进行3x3可分离卷积的运算。演化过程如下:

图a中普通卷积将channel和spatial的信息同时进行映射,参数量较大;图b为可分离卷积,解耦了channel和spatial,化乘法为加法,有一定比例的参数节省;图c中进行可分离卷积后又添加了bottleneck,映射到低维空间中;图d则是从低维空间开始,进行可分离卷积时扩张到较高的维度(前后维度之比被称为expansion factor,扩张系数),之后再通过1x1卷积降到原始维度。

这里要指出的一点是,观察和设计一个网络时,隐含的会有“状态层”和“变换层”的划分。当上图中c和d的结构堆叠起来时,其事实上是等价的。在这个视角下,我们可以把channel数少的张量看做状态层,而channel数多的张量看做变换层。这种视角下,在网络中传递的特征描述是压缩的,进行新一轮的变换时被映射到channel数相对高的空间上进行运算(文中称这一扩张比例为扩张系数,实际采用的数值为6),之后再压缩回原来的容量。


于是,自然地引出了文章的主要贡献:Inverted Residual和Linear Bottleneck。


第一点是skip-connection位置的迁移,即从连接channel数多的特征表述迁移为连接channel数少的特征表述。如下图:


第二点是用线性变换层替换channel数较少的层中的ReLU,这样做的理由是ReLU会对channel数低的张量造成较大的信息损耗。我个人的理解是ReLU会使负值置零,channel数较低时会有相对高的概率使某一维度的张量值全为0,即张量的维度减小了,而且这一过程无法恢复。张量维度的减小即意味着特征描述容量的下降。


因而,在需要使用ReLU的卷积层中,将channel数扩张到足够大,再进行激活,被认为可以降低激活层的信息损失。文中举了这样的例子:

上图中,利用nxm的矩阵B将张量(2D,即m=2)变换到n维的空间中,通过ReLU后(y=ReLU(Bx)),再用此矩阵之逆恢复原来的张量。可以看到,当n较小时,恢复后的张量坍缩严重,n较大时则恢复较好。


对应的,文中的基本单元是“扩张-变换-压缩”的范式,而在本文的附录中,作者给出了支撑这一范式的信息损失界的证明。大体的结论是,对于算符y=ReLU(Bx),可以取足够大的矩阵B,使得以足够高的概率,y所在空间的容量(n-volume,翻译可能失准,望指出)相对x所在空间容量的损失足够的小(也并非足够,而是小于某个跟B的维度相关的界)。

这一证明有两个地方值得注意,一是它实际上给出了作者用于衡量信息损失的标准,即变换前后张量所在空间的容量(n-volume),二是采用了概率的描述,考虑到了网络参数的随机初始化的事实(这一点跟PAC理论的描述框架类似)。


附录中的引理二同样有启发性,它给出的是算符y=ReLU(Bx)可逆性的条件,这里隐含的是把可逆性作为了信息不损失的描述(可逆线性变换不降秩)。作者也对MobileNet V2进行了实验,验证这一可逆性条件:

图比较小了,建议看原文附录中原图。

上面图中a、b分别为训练前后的对比,最低的紫色虚线即为可逆性条件。可以看到有部分层是不满足这一可逆性条件的(即绿线低于紫色虚线的部分)。


总结来说,我认为文章提出的两点改进都是有启发价值的(甚至会成为指导网络设计的标准范式),附录中的证明也有很多可供补充和建立规范化定义及描述语言的余地,对网络结构设计的探索仍然任重道远。


最后贴上我的笔记:


(学历尚浅,欢迎讨论和指正)