上一篇(1)中,整理了几篇关于结构稀疏化的论文,那几篇中的方法要么是基于Dense Topology的稀疏化设计,要么是基于某些参数指标的剪枝方法,实际上都没有摆脱normal convolution操作,以及其他如ReLU等的element-wise的操作。

本文从改进卷积操作使其更高效的角度,整理了几篇压缩网路的论文。

相关工作 - 压缩网路

这一类的方法,大多是针对传统CNN中会产生大量参数的结构进行修改(卷积层等),采用特定的策略设计更加紧凑、参数利用率更高的结构。

1 - SqueezeNet

这篇论文是在2016年提出的,目标是在保证精度不损失的前提下,将原始的AlexNet压缩多达510倍(模型大小小于0.5M)

作者在设计SqueezeNet时,通过对CNN的微架构(卷积层的结构;element-wise操作等)和宏架构(微架构块的堆叠得到的完整网路结构)的分析,提出了压缩结构设计的三点策略

  • 使用1*1卷积替代3*3卷积 - 这样,可以使得参数数量减少为原来的1/9
  • 减少3*3卷积的输入channel数 - 针对这一点,作者设计了squeeze layers结构来实现
  • 尽可能将降采样层放到网路的后面层

前两点是针对规模压缩的策略,而最后一点,是为了提高图像处理的质量。不论是从直观上,还是实验验证,解析度更高的特征图,可以提供更多的图像信息,而经过降采样操作之后,会损失一定的位置敏感信息。

结合上述三点策略,作者提出了一个类似Inception结构的网路单元——fire module。一个fire module由一个squeeze层(1*1卷积)和一个expend(1*1卷积和3*3卷积)层组成。利用squeeze层进行输入通道压缩。除了使用fire module取代normal convolution之外,在设计上和训练上还采用了以下策略

  • 保证expend层的1*1和3*3卷积的特征图大小一致,3*3卷积采用了zero-padding
  • 使用ReLU作为激活函数
  • fire-9之后采取50%的dropout
  • 去掉全连接层,使用global average pooling

最终,只使用fire module的网路结构把AlexNet从240M压缩到了4.8M,继续使用deep compression对参数压缩,从32bit压缩至6bit,最终得到的模型只有0.47M

SqueezeNet中的fire module实际上就是大量使用了现在常用的bottleneck压缩结构,来实现压缩的;对于卷积操作而言,SqueezeNet依然采用的是normal convolution,所以对速度的提升依然不尽人意,还有更大的压缩空间。

2 - MobileNet

MobileNet是Google团队针对移动端设备部署提出的一个轻量级网路架构

MobileNet使用了depthwise separable convolution(深度可分离卷积)取代normal convolution来实现更高效的网路结构。深度可分离卷积在计算上,本质上是冗余更少的稀疏化表达

在操作上,深度可分离卷积首先针对每个输入channel做一次3*3卷积(这里的卷积输入通道就相当于1),然后针对所有通道进行一次1*1卷积

这一块提到的稀疏化表达,实际上并不仅仅在normal convolution的channel上。

Google的InceptionV3中,就有尝试过使用1*n和n*1卷积,从实验结果上看,效果与一个n*n的卷积核效果类似

同理对于常规卷积而言,除了卷积核的冗余信息,通道上的冗余信息也是可以想像到的

对于常规卷积(有zero-padding,输入输出特征图大小一致)来说

  • 特征图大小 H 	imes W
  • 输入通道 M
  • 输出通道 N
  • 卷积核大小 K

计算量为

M 	imes H 	imes W 	imes K^2 	imes N

而使用了深度可分离卷积之后,计算量变为了

M 	imes H 	imes W 	imes N + M 	imes H 	imes W 	imes K^2

经过这样的结构改进之后,模型规模大大减少,而且主要的计算量就集中到了1*1卷积上,因此为了进一步压缩,作者针对深度可分离卷积的通道进行了进一步压缩,加入了宽度因子和解析度因子对特征图和通道数进行进一步缩放。

深度可分离卷积,可以看作是对常规卷积操作的分解

常规卷积在计算上,一次性实现了对通道信息和特征图局部信息的整合;而深度可分离卷积将这两个过程分开,先对特征图局部的信息进行提取整合,再对通道信息进行整合

从规模上看,深度可分离卷积大大降低了卷积操作的参数量和规模,但是效果上并没有相关的对比证明哪种更好。

3 - ShuffleNet

ShuffleNet是Face++团队提出的面向移动端设备部署的网路结构。

在MobileNet中,采用分组的卷积方式证明在压缩效果上十分有效,同时精度也可以维持在与常规卷积类似的精度上,但是深度可分离卷积虽然有1*1卷积进行通道信息整合,但是实际上相比于常规卷积,通道间信息流的传递,还是受到了阻碍,因此Face++团队在分组卷积的基础上加入了shuffle(打乱/重排序)的机制

在设计上,网路结构主要有以下几个创新点

  • 结合skip connection
  • 将1*1的常规卷积改为group convolution
  • 加入channel shuffle操作,对通道进行打乱

小结

这几篇算是压缩网路结构的开山之作,而且后续也都推出了V2甚至更多的改进版本

个人认为其中最核心的思想,就是针对卷积操作的稀疏化,大多都是采用分组卷积的方式,深度可分离卷积可以看作是分组数最极端的情况;而同样,分组卷积带来的就是channel层面的信息流传递问题,再加入打乱通道的操作,一定程度上缓解了这个问题,这种shuffle的思想在MSRA提出的IGCV中也有体现。

之后会继续整理相关的网路压缩论文,包括其他方面的,还有这几篇的后续改进。


未完待续

——2019年9月20日


推荐阅读:
相关文章