模型压缩总体思路离不开两个方向,一是以剪枝,量化编码为代表的方法。将权重低于某一阈值的权重减去,即设置为0,配合上L1正则化,很容易将模型稀疏,但剪枝操作只是把小权重设置为0,网络变得稀疏,要想加快网络运算,需要设定一定的算法,跳过这些0值的运算,这部分即是稀疏矩阵的高效运算内容了。模型压缩的另一思路就是在网络的通道上进行压缩,以SqueezeNet,MobileNet,ShuffleNet等为代表。以下内容来自于参考博客,以及自己的一些野路子理解(不保证准确)。
参考:https://baijiahao.baidu.com/s?id=1589005428414488177&wfr=spider&for=pc
从名字——SqueezeNet 就知道,本文的新意是 squeeze,squeeze 在 SqueezeNet 中表示一个 squeeze 层,该层采用 1*1 卷积核对上一层 feature map 进行卷积,主要目的是减少 feature map 的维数,降低下一层的输入通道。
SqueezeNet虽然名字上是基于VGG上进行的,其实,个人理解,并不是一种通用的模型压缩方法,而更应该理解为一种新的轻型网络结构,不具有通用性。
创新点:
创新点与 inception 系列的思想非常接近!首先 squeeze 层,就是 1*1 卷积,其卷积核数要少于上一层 feature map 数,这个操作从 inception 系列开始就有了,并美其名曰压缩,个人觉得「压缩」更为妥当。
Expand 层分别用 1*1 和 3*3 卷积,然后 concat,这个操作在 inception 系列里面也有。
SqueezeNet 的核心在于 Fire module,Fire module 由两层构成,分别是 squeeze 层+expand 层,如下图 1 所示,squeeze 层是一个 1*1 卷积核的卷积层,expand 层是 1*1 和 3*3 卷积核的卷积层,expand 层中,把 1*1 和 3*3 得到的 feature map 进行 concat。
总体来说,网络通过firemodel,设计了一个轻型分类网络结构,1*1卷积核,在squeeze层,个人感觉,第一个作用是降维,参数降维,第二个作用,起到特征融合的作用,对与上一层的特征图,1*1卷积层在第三维度上,对每一个像素值进行特征融合(1*1 卷积核的计算方式决定的)。而在expand层,1*1和3*3的卷积核,提供了不同的感受野,卷积核的大小,决定了这个卷积核的感受野,即感受不同的尺度信息,或者说邻域信息,等同于用不同大小的眼睛看图片,提取到的特征自然也不一样。
MobileNet 由 Google 团队提出,发表于 CVPR-2017,论文标题:
《MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications》
命名:
MobileNet 的命名是从它的应用场景考虑的,顾名思义就是能够在移动端使用的网络模型。
创新点:
通过采用 depth-wise convolution 的卷积方式,达到:1. 减少参数数量 2. 提升运算速度。(这两点是要区别开的,参数少的不一定运算速度快!还要看计算方式!)
depth-wise convolution 不是 MobileNet 提出来的,也是借鉴,文中给的参考文献是 2014 年的博士论文——《L. Sifre. Rigid-motion scattering for image classification. hD thesis, Ph. D. thesis, 2014》
depth-wise convolution 和 group convolution 是类似的,depth-wise convolution 是一个卷积核负责一部分 feature map,每个 feature map 只被一个卷积核卷积;group convolution 是一组卷积核负责一组 feature map,每组 feature map 只被一组卷积核卷积。Depth-wise convolution 可以看成是特殊的 group convolution,即每一个通道是一组。
MobileNets 精华在于卷积方式——depth-wise separable convolution;采用 depth-wise separable convolution,会涉及两个超参:Width Multiplier 和 Resolution Multiplier 这两个超参只是方便于设置要网络要设计为多小,方便于量化模型大小。
MobileNet 将标准卷积分成两步:
其中3*3*32dw即逐通道卷积,传统的卷积为3*3*32*32,每一个卷积核对输入的32个通道的特征图进行卷积,而这里,一个卷积核只对一个输入通道进行卷积。参数计算量少了32倍。随后使用1*1卷积核进行特征融合,如果没有这一步,则特征图与特征图之间相关性大大降低,通道间几乎无交流。1*1卷积核加强了通道间的交流与特征融合。
ShuffleNet 是 Face++团队提出的,与 MobileNet 一样,发表于 CVPR-2017,但晚于 MobileNet 两个月才在 arXiv 上公开。论文标题:
《ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices》
命名:
一看名字 ShuffleNet,就知道 shuffle 是本文的重点,那么 shuffle 是什么?为什么要进行 shuffle?
shuffle 具体来说是 channel shuffle,是将各部分的 feature map 的 channel 进行有序的打乱,构成新的 feature map,以解决 group convolution 带来的「信息流通不畅」问题。(MobileNet 是用 point-wise convolution 解决的这个问题)
因此可知道 shuffle 不是什么网络都需要用的,是有一个前提,就是采用了 group convolution,才有可能需要 shuffle!!为什么说是有可能呢?因为可以用 point-wise convolution 来解决这个问题。
创新点:
其中 group convolutiosn 非原创,而 channel shuffle 是原创。channel shuffle 因 group convolution 而起,正如论文中 3.1 标题: . Channel Shuffle for Group Convolution;
采用 group convolution 会导致信息流通不当,因此提出 channel shuffle,所以 channel shuffle 是有前提的,使用的话要注意!
ShuffleNet 的创新点在于利用了 group convolution 和 channel shuffle,那么有必要看看 group convolution 和 channel shuffle。
Group convolution
Group convolution 自 Alexnet 就有,当时因为硬件限制而采用分组卷积;之后在 2016 年的 ResNeXt 中,表明采用 group convolution 可获得高效的网络;再有 Xception 和 MobileNet 均采用 depth-wise convolution, 这些都是最近出来的一系列轻量化网络模型。depth-wise convolution 具体操作可见 2.2 MobileNet 里边有简介。
如下图 (a) 所示, 为了提升模型效率,采用 group convolution,但会有一个副作用,即:「outputs from a certain channel are only derived from a small fraction of input channels.」
于是采用 channel shuffle 来改善各组间「信息流通不畅」问题,如下图 (b) 所示。
具体方法为:把各组的 channel 平均分为 g(下图 g=3)份,然后依次序的重新构成 feature map
文中提到两次,对于小型网络,多多使用通道,会比较好。
「this is critical for small networks, as tiny networks usually have an insufficient number of channels to process the information」
所以,以后若涉及小型网络,可考虑如何提升通道使用效率
至于实验比较,并没有给出模型参数量的大小比较,而是采用了 Complexity (MFLOPs) 指标,在相同的 Complexity (MFLOPs) 下,比较 ShuffleNet 和各个网络,还专门和 MobileNet 进行对比,由于 ShuffleNet 相较于 MobileNet 少了 1*1 卷积层,所以效率大大提高了嘛,贴个对比图随意感受一下好了。
ShuffleNet 小结:
解决「信息流通不畅」的问题,MobileNet 采用了 point-wise convolution,ShuffleNet 采用的是 channel shuffle。MobileNet 相较于 ShuffleNet 使用了更多的卷积,计算量和参数量上是劣势,但是增加了非线性层数,理论上特征更抽象,更高级了;ShuffleNet 则省去 point-wise convolution,采用 channel shuffle,简单明了,省去卷积步骤,减少了参数量。
学习了几个轻量化网络的设计思想,可以看到,并没有突破性的进展,都是借鉴或直接使用前几年的研究成果。希望广大研究人员可以设计出更实在的轻量化网络。
通过这几篇论文的创新点,得出以下可认为是发 (Shui) 论文的 idea: