论文题名:《Rethinking Bottleneck Structure for Efficient Mobile Network Design》
arxiv:https://arxiv.org/pdf/2007.02269.pdf
本文主要针对MobileNetV2中倒置残差块(inverted residual block)的设计和不足进行了分析,并基于分析结果提出了新颖的sandglass模块,这种轻量级模块有原生残差块和倒置残差块的影子,是一种正向残差设计。
原生残差块组成:1x1卷积(降维)、3x3卷积(空间信息变换)、1x1卷积(升维)
倒置残差块组成:1x1卷积(升维)、3x3深度可分卷积(空间信息变换)、1x1卷积(降维)
这两者的结构如下图1 中a,b所示
原生残差块降维的1x1卷积用于降低模型复杂度,升维的1x1卷积用于和短径连接的数据add。倒置残差块中先升维主要是为了通过增加通道数来提升模型的效果,但本文作者认为这种结构会削弱梯度跨层传播的能力,将特征从高维空间压缩到低维空间,会造成信息丢失,同时这也容易引起梯度混淆问题(特指梯度消失或梯度爆炸),从而影响训练的收敛和最终模型的性能。本文提出的sandglass模块如下图2所示。
sandglass模块是在轻量级的残差块上依据倒置残差块所存在的问题所改进的,个人觉得是非常好理解的,同时这个模块还用到了MobileNetV2中的一些模块设计技巧,采用了线性瓶颈设计,即只在第一个3x3卷积后边和第二个1x1卷积后边使用非线性激活函数relu6,其他层后边使用线性激活函数(y=x),这有助于避免零化现象的出现,进而减少信息损失。
同时科普一下非线性激活函数relu6,relu6就是具有最大输出限制为6的relu函数,主要是为了在移动端设备float16/int8的低精度时也能有很好的数值分辨率,如果对普通relu函数的激活范围不加限制,输出的范围为0到正无穷,如果激活值非常大,分布在一个很大的范围内,则低精度的loat16/int8就无法良好地精确描述如此大范围地数值,从而带来精度地损失。
言归正传,这篇文章我还学到地一个知识点就是对短径连接这边进行改进。考虑到用在移动设备地延时问题,作者不对所有来自短径连接地数据进行add,只选择其中地一部分进行连接,如下图3所示,图3就是对原文里公式地一个可视化展示。我个人认为这种方法或多或少肯定有精度损失地,但是考虑到运用在移动端,速度放在首位,这样就无可厚非了,这种方法可以减少add的时间和降低内存访问的时间,实验表明取特征的一半进行加和,可以保持速度和精度的最佳。