Background

从VGG开始,人们一直在追求更深更大的网络。Residual Block的出现更是大大推动了人们对"deeper"的趋向。然而在计算的本质不变的情况下(常规卷积),模型的计算复杂度和depth、width等一定是成正相关的,因此这对高效果CNN的部署带来了很大的压力。

这种压力催生了各种压缩计算量的新模型。MBNet开创性地从压缩模型参数量和计算量的角度使用了depthwise separable convolution代替常规卷积。这种卷积先利用k*k的depthwise conv快速地逐通道提取feature,再使用pointwize conv融合层间信息,近似地达到原来k*k常规卷积的功效,但大大缩小了参数量和计算量。

  • 感性认识上,考虑每一片out channel生成的过程:k*k常规卷积在做层间feature融合的时候,对每颗kernel,有k*k个纵向量代表着层间融合权重;而depthwise separable convolution则始终只有一个纵向量(也就是那颗在pointwize的1*1 kernel)在做层间融合,因此直接减少了k*k倍的计算量。
  • 理性分析上(过程不做赘述),计算量减少到了 $\frac{1}{cout} + \frac{1}{k\times k}$ 。由于cout通常远大于k*k,所以可以视为计算量减少了k*k倍。


为什么depthwise separable convolution需要pointwise的一步?是因为depthwise(group)conv会破坏层间交流的广度(考虑运算细节就会发现)。因此如果想把pointwise conv也换成group conv来进一步降低计算量,就需要想办法解决层间交流的问题。(如ShuffleNet进行了channelwise-shuffle,让 $\ge 2$ 次的group conv堆叠,在一定程度上保持了层间交流的广度)

然后来总结一下MBv1和MBv2。



MBv1

MBv1是第一个面向移动端部署的小网络,同时也让人们关注了到DW+PW conv减少参数的作用。

  • MBv1对卷积过程改造的思路是,直接把k*k conv置换为k*k DW conv + 1*1 PW conv。即:

  • $ \text{Standard}:\ \ I\ \xrightarrow[conv]{k\times k} \xrightarrow[]{\mathcal{N}} \xrightarrow[]{\sigma} \ O $

  • $ \text{MB v1 }:\ \ I\ \xrightarrow[DWconv]{k\times k} \xrightarrow[]{\mathcal{N}} \xrightarrow[]{\sigma} \ F\ \xrightarrow[PWconv]{1\times 1} \xrightarrow[]{\mathcal{N}} \xrightarrow[]{\sigma} \ O $

  • 此外,MBv1还支持模型的更进一步压缩(通过 $\alpha$(width multiplier) 和 $\rho$(resolution multiplier) 分别对feature宽度(channel数)和输入图像分辨率进行压缩)。

  • 最后,MBv1还是Fully Convolutional的。网络的head部分使用了global pooling + 1*1conv,使得其能作用于任意尺寸的输入上;并且还通过stride2来实现平缓降维。这两处对CNN的整体设计也有所启示。


先DW再PW这种方式压缩了大量的计算量,使MBv1硬件指标表现非常出色。同时,MBv1在ImageNet上的表现还挺不错(baseline版70.6)。由此可见DW+PW的强大之处。



MBv2

当然,google并不止步于MBv1。MBv2的出现,伴随着Inverted Residuals这一款经典block的提出,把DW+PW的应用推向了高潮。

google提出了MBv1容易发生特征退化的问题,并进行了对应的改进,进而得到了MBv2。

google指出,ReLU类激活函数的稀疏性可能会导致低维流形被破坏,因此:改进①:在每个block最后的那一次PW(也是做降维的那次PW)之后不接任何激活函数,线性地把feature直接传递下去。这也是“Linear Bottleneck”大名的由来;改进②:在做DW之前做一次增加channel数的PW,升维后再接ReLU,再把feature给DW层。

原文是这样说的:

Examples of ${ReLU}$ transformations of low-dimensional manifolds embedded in higher-dimensional spaces. In these examples the initial spiral is embedded into an n-dimensional space using random matrix $T^{-1}$ followed by ${ReLU}$, and then projected back to the ${2D}$ space using $T^{-1}$. In examples above $n = 2, 3$ result in information loss where certain points of the manifold collapse into each other, while for $n = 15$ to $30$ the transformation is highly non-convex.

  • 原文生成了一些二维中的螺旋线上的点集 $u_{2\times n}$ 作为2维流形(实际上是模拟了一个一维流形在二维中的嵌入),并通过随机的线性空间变换 $T_{m\times n}$ 将其映射到m维空间,然后经过 $ReLU$ 后通过广义逆 $T^{-1}$ 再映射回低维,结果发现映射到m较小的空间中的流形在映射回来后发生了坍塌,feature被破坏。

  • 从流形嵌入的角度来看,其实提feature的过程就是把流形从在高维中的嵌入“抽离”的过程。由此得到一个很显然很暴力的做法就是直接减少channel数。MBv1正是通过不断尝试不同的 $\alpha$(width multiplier),使channel数少到刚好容纳下manifold of interest来达到这一目的的。但是上述实验已经说明 $ReLU$ 类激活函数会破坏流形,因此我们很难能通过这种思路把channel数降到一个理想的程度。

  • 原文简单总结得到两点:一是在瓶颈层降维时,如果想让manifold of interest保留在ReLU的非零输出中,其实就对应着ReLU的非负段变换,即线性变换。因此我们不妨直接使用线性变换,这对应着改进①;二是如果非要用ReLU(比如DW之后),为了使ReLU的稀疏性不破坏流形,可以让channel数多一点,使其确实能容纳我们的manifold of interest(就算某些channel上发生了坍缩,另外多出来的那些channel还能继续把feature传递下去),这对应着改进②。

  • 此外,对于改进②,还可以理解为这在一定程度上加强了channel间的交流(DW前后都有交流),因此网络的表现取得了提升。

光是这一点,MBv2相比MBv1就应该能得到较大的提升了。而且MBv2还把经典的skip connect引入了进来。这下这东西可以被称为block了,并且与两头大中间小的Residual Block形成对比,故被称之为Inverted Residual。这样其实也缓解了PW对计算量贡献过高的局面。

下面放出常规conv、MBv1、MBv2的block对比:

  • $ \text{Standard}:\ \ I\ \xrightarrow[\text{conv}]{k\times k} \xrightarrow[]{\mathcal{N}} \xrightarrow[]{\sigma} \ O $

  • $ \text{MB v1 }:\ \ I\ \xrightarrow[\text{DWconv}]{k\times k} \xrightarrow[]{\mathcal{N}} \xrightarrow[]{\sigma} \ F\ \xrightarrow[\text{PWconv}]{1\times 1} \xrightarrow[]{\mathcal{N}} \xrightarrow[]{\sigma} \ O $

  • $ \text{MB v2 }:\ \ I\ \xrightarrow[\text{PWconv}]{1\times 1} \xrightarrow[]{\mathcal{N}} \xrightarrow[]{\sigma} \ F_1\ \xrightarrow[\text{DWconv}]{k\times k} \xrightarrow[]{\mathcal{N}} \xrightarrow[]{\sigma} \ F_2\ \xrightarrow[\text{PWconv}]{1\times 1} \xrightarrow[]{\mathcal{N}} \xrightarrow[]{\text{linear}} \ F_3\ \xrightarrow[(residual)]{\oplus\ I} \ O $

最后再提一下MBv2的表现,MBv2即使深度比MBv1低了不少,表现却更加优秀(baseline版有72.0,参数仅3.4M,要知道MBv1的baseline版都有4.2M啊)。MBv2实在是小网络中的经典,这也使得它成为之后许多NAS工作大量选用的block.

发表评论

关闭菜单