深度神经网络模型压缩

深度学习近几年非常火,网络不断涌现,从AlexNet,GoogleNet,VggNet到ResNet,DenseNet,这些网络不断地提升各大分类比赛,识别比赛的精度,因此研究者们又开始着手于深度学习的实际应用,试图将深度学习算法能够应用在手机,嵌入式等移动设备和终端设备中。我本人之前也在思考:卷积神经网络固然在图像,计算机视觉等方面大显神通,但是它们参数量之大,占用大量内存,消耗大量资源和电量,它们又如何能够在资源有限的终端设备跑起来呢?恰好前些日子选择研究方向,我就选择了模型压缩。大家可能发现,从VggNet到DnseNet,模型的参数越来越少,虽然网络变深了。也就是说,它们用到了一些策略,在减少参数的同时,保证模型的效果提升。

关于模型压缩,其实已经出现了很多方法,在2016年,来自Song Han的the best paper (ICRL)提出了基于裁剪,量化,霍夫曼编码三步走的方法获得广泛关注,使得更多的人开始投入到模型压缩的研究当中;大家可以参考此博文:Deep compression

2017年,在CVPR一篇paper中,根据filter(权重矩阵)的低秩和稀疏性质,提出采用低秩和稀疏分解的方法对模型进行压缩;为便于大家学习,给出论文title:On Compressing Deep Models by Low Rank and Sparse Decomposition.

还有基于教师——学生网络学习的方法等等,在这里我不一一列举。我接下来要介绍另外一种方法,也是我本人觉得很看好的一种,那就是精细模型设计,精细模型的目标是设计一个轻量型网络。我之所以看好它的原因是:它从一开始是就使用一些策略对模型本身进行改进,而其他方法基本都是在有一个已经训练好而且性能也好的网络前提下对模型进行裁剪,压缩等,步骤比较繁琐。此外工业界本来就不追求最高的精度,往往是考虑精度和资源上的折中,虽然轻量型模型表现的性能也相当好,关键是该方法真的很简单。

接下来,我要介绍一些网络,包括Iception系列,Xception,Resnet,Resnext,Mobilenet ,ShuffleNet.虽然后面两个模型相当典型,但是前面几个模型也需要提一下,因为后者借鉴了前者的思想。

在具体讲模型之前,先说说1*1卷积核的作用,因为它真的是一个很高效的卷积核。
现在很多网络都不同程度加入了1*1卷积核。
作用 :
(1)加入非线性。一个卷积核只含有一个参数,但是经过一次卷积操作,就加入了非线性激励,提升了网络的表达能力。
(2)具有升维和降维的作用。一张RGB图像,含有三个channel,如果用2个1*1卷积核对它作卷积,那么深度由原来的3变为2;如果用4个1*1卷积核对它作卷积,深度则变为4,这就是降维和升维。具体看如下图:
1

我们再来看一个例子
3
我们来分别计算左边和右边所需要的参数:
第一种:256维的输入经过3*3*256卷积核,输出为256维,那么参数量为:
256*3*3*256=589824
第二种:虽然输入和输出维度相同,但是利用1*1卷积核降维和升维的特点,参数量变为:256*1*1*64+64*3*3*64+64*1*1*256=69632,参数量下降了9倍左右。
由此可以体现出卷积核的威力。

接下来,介绍InceptionV1结构,也就是Googlenet。看如下图:2
对比作图和右图,右图加入了1*1卷积核,目的就是为了降维,从上面的例子可以知道,降维减少了参数,此外,我们发现,这里使用了3中卷积核,相当于混合模型,这样可以提取更多的特征,同时增加了网络深度,加入了更多的非线性。

INception V2和V3继续做了改进:看下图:
4
5*5卷积核用两个3*3卷积核代替,参数从25减少至18,还加深了层数。
5
用1*3和3*1卷积核代替3*3卷积核,参数减少了,这是普遍适用的(1*n和n*1代替n*n),大家可以自己动手算一算,的确可以这样做。

因此上面的网络就改进成类似于下面的结构:
6
9
另外,filter concat 指的是维度上的拼接,通常是在第四维。

接下来,提一下ResNet. 自ResNet问世以来,很多网络都会借鉴它的残差单元,因为它可以让网络变得很深但是精度却会越来越高,并且对浅层和深层特征进行了融合。大家可以了解一下为什么它的效果那么好,我的上一篇博文大致说了原因。请参考:resnet
13

接下来介绍比较典型的网络之一:Mobilenet. 它首次提出了depthwise separable convolution 思想。思想就是:将传统的卷积操作分成两步,假设原来是3*3的卷积,那么depthwise separable convolution就是先用M个3*3卷积核一对一卷积输入的M个feature map,不求和,生成M个结果,然后用N个1*1的卷积核正常卷积前面生成的M个结果,求和,最后得到N个结果,即所谓的分离——合并操作。
11
我们可以得到计算复杂度之比为:
12
计算复杂度大大下降。

接下来,介绍group convolution and channel shuffle 思想,这也是最近才提出来的shufflenet所采用的思想。

group convolution思想主要借鉴了Alexnet网络的训练,当时Alexnet采用了两块GPU并行训练,将卷积核分为了两组;此外,之前Mobilenet由于大量使用1*1卷积核,导致1*1卷积核所占据的计算量占据了总网络的70%——80%左右。研究者认为可以继续降低卷积操作的计算量。

假设输入feature map的数量是N,该卷积层的filter数量是M,那么M个filter中的每一个filter都要和N个feature map的某个区域做卷积,然后相加作为一个卷积的结果。假设你引入group操作,设group为g,那么N个输入feature map就被分成g个group,M个filter就被分成g个group,然后在做卷积操作的时候,第一个group的M/g个filter中的每一个都和第一个group的N/g个输入feature map做卷积得到结果。原始计算复杂度为M*N,现在变为(M/g*N/g*g),变为原来的1/g.

10

Group 操作的确是降低了复杂度,但是也但是也带来了新的问题,从图中,我们可以看到每个group中的信息只在这个group中流通,也就是各个group之间没有信息的交流,这不利于提取更多的特征,因此由通过channel shuffle来实现通道重排。

所以,在进行GConv2之前,对其输入feature map做一个分配,也就是每个group分成几个subgroup,然后将不同group的subgroup作为GConv2的一个group的输入,使得GConv2的每一个group都能卷积输入的所有group的feature map。

channel shuffle操作: reshape, transpose, flatten,看个简单的例子:

14

shufflenet unit 如下:

15

pointwise group convolutions其实就是带group的卷积核为1*1的卷积,也就是说pointwise convolution是卷积核为1*1的卷积。在ResNeXt中主要是对3*3的卷积做group操作,但是在ShuffleNet中,对1*1的卷积做group的操作,我们可以认为1*1的卷积操作的计算量不可忽视。

还有人提出Global Average Pooling思想,也就是来代替全连接层。因为全连接层的参数占据了总网络的很大一部分,所以就想用别的层来代替它。

Global Average Pooling做法很简单,是对每一个单独的feature map取全局average。要求输出的nodes和分类category数量一致,这样后面就可以直接接softmax了。
18
Global Average Pooling的好处有:
(1) 因为强行要求最后的feature map数量等于category数量,因此feature map就会被解析为categories confidence maps.
(2) 没有参数,所以不会过拟合;
(3) 对一个平面的计算,使得利用了空间信息,对于图像在空间中变化更鲁棒;

总结一下,轻量型模型的设计用到了很多策略。
在卷积核方面:
1 现在多使用1*1卷积核来降维和升维;
2 使用不同尺寸的卷积核来代替单一尺寸卷积核(见Inception网络)
3 使用group convolution and channel shuffle(见 shufflenet)
4 使用depthwise separable convolution (见 Mobilenet )
在连接方面,会借鉴ResNet 的残差单元或者Densenet单元,基本是在该单元上进行改进。

在以后的精细模型设计中,肯定会用到这些策略,不知道,把这些策略结合起来设计的轻量型模型会有什么结果呢?

今天时间比较多,所以就把前些日子看的论文和相关知识总结了一下。接触深度学习也没多久,今天作总结的目的是巩固知识,以后也会用到,当然有理解不明白的东西,如果你看到了,若觉得有错误,欢迎指出,网上的资源非常多,我们总能找到我们需要的知识。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值