关于剪枝的几种方法



文章目录

  • 关于剪枝的几种方法
  • 前言
  • 一、ThiNet
  • 二、Channel Purning for Accelerating Very Deep Neural Networks
  • 三,基于深度神经网络二阶信息结构化剪枝算法
  • 总结



前言

随着人工智能时代的到来,深度学习也越来越受重视,语音识别,目标检测,自然语言处理等热门的领域目前都会用到深度网络,虽然深度网络可以很好的提取特征,但是这同样也会带来一个很大的问题,就是网络的参数量。我们无法将其运用到一些算力很小的设备上,比如说无人机,手机等。于是对于模型的优化变成了现在很热门的一个研究领域。对于模型的优化主要是对模型的压缩,常用的压缩方法有:剪枝,量化,知识蒸馏。
本次我们主要针对的是模型的剪枝。


提示:以下是本篇文章正文内容,下面案例可供参考

一、ThiNet

先上一下这个方法的示意图:

机器学习导论名词解释剪枝_卷积核


先来看第一行,如果我们可以用i+1层的一个channel的一个子集来近似代替所有的channel的话,我们可以把这层多余的channel删除,并且第i层的一个filter就代表i+1层的一个channel,于是在删除i+1的一个channel的同时,我们又可以把第i层的对应的filter删除

再看第二行,在第i+1层把部分channel删除后,我们会得到更窄的网络,但是第i+2层的维度不会变化,因为i+2层的channel对应的是i+1层的filter的个数。

再看第三行,这行是微调的示意图,这里为了节约时间,当对每一层做了剪枝后,都对当前层微调1-2遍,等所有层都微调完后,再整体调一遍。因此整体上就是上面这三步迭代应用到每一层上,一次对每一层做剪枝。重点:如何选取选择合适的channel?

机器学习导论名词解释剪枝_剪枝_02


这是卷积层输出公式,假设这是我们i层的输出,也就是i+1层的输入。

机器学习导论名词解释剪枝_卷积核_03


这里把每个channel的值定义为这个。

机器学习导论名词解释剪枝_剪枝_04


于是公式(1)便可以简化为上述公式,这是所有channel层的输出。

机器学习导论名词解释剪枝_卷积_05


这是损失函数,其中s便是以前channel的一个子集。作者在此采用贪心算法,去寻找最好的可以保留的s,但是次数计算量有点大,因为我们知道,要保留的通道数肯定比要删除的多,于是此损失函数又可以进一步进化为下面的函数。

机器学习导论名词解释剪枝_权重_06


这样求解的速度会更快。前面讲的都是算法的细节和思想,那怎么应用到深层网络上呢。

这里我们把网络分为单分支和多分枝结构,单分支就按上面的来。而多分支看下图。

机器学习导论名词解释剪枝_剪枝_07


对于上图,我们只剪枝前两层,最后一层的结果需要和开始的那个做element-wise product,这样的话就得保证该block的最后一层卷积的输出channel个数和一开始的那个输出channel一样。对于vgg-16,由于前面10层卷积占据了90%的计算量,而全连接层又占据了86%的参数,因此作者采用对前面10层卷积进行剪枝,达到加速目的,另外将所有全连接层用一个global average pooling 层代替。

二、Channel Purning for Accelerating Very Deep Neural Networks

和上面一样,先来看一下示意图:

机器学习导论名词解释剪枝_权重_08


这篇文章也是针对通道进行剪枝的文章,和第一篇不同的地方在于他们选取channel的标准不一样,让我们看看这篇文章是怎么选取重要通道的吧。

第一步是channel selection ,这一步是采用LASSO regression来做的,就是添加了一个L1正则项,来约束权重,因为L1范数可以使得权重大部分值为0,所以权重会很稀疏,这样就可以把那些稀疏的channel减掉;第二步便是利用剪好的枝去得到权重,这一步用的是最小二乘法,来约束剪枝后的feature map 尽量和剪枝前的feature map相等,也就是最小二乘法值越小越好。

我先来解释一下上面的这个图吧。其中B代表feature map,w代表卷积核,c代表通道数,kh,kw代表卷积核的长和宽,于是一个卷积核的尺度为khkwc,最后n代表最后的feature map的通道数,同时也代表卷积核的个数。原理其实和我们上一篇的原理是一样的,通过减掉B的通道,相当于减掉w中对应的小方块,于是对应的前面一层的filter也可以删除。

所以最关键的步骤就是如何选取合适的channel。

机器学习导论名词解释剪枝_卷积_09


这个公式其实和我们第一篇的那个公式差不多,唯一不同的就是这个公式采用B来稀疏化w的权重,但这个式子没办法直接优化,于是我们就在这个公式的基础上添加了一个正则项用来约束B,如下图:

机器学习导论名词解释剪枝_权重_10


这里作者正则项使用的是L1范数,即绝对值求和.于是整个步骤可以分为两步。

1,先固定w求B,如下图:

机器学习导论名词解释剪枝_卷积_11


2,固定B求w,如下图:

机器学习导论名词解释剪枝_卷积核_12


作者在实验中发现这样迭代操作比较耗时间,因此采取的策略是先不断优化公式3,直到达到上面这个的约束时在优化公式4一次。和上面一样,这种优化方法分为单分支和多分支,其中单分支就用上面的方法就可以直接优化。而多分枝就要按照下图的方法进行剪枝。

机器学习导论名词解释剪枝_机器学习导论名词解释剪枝_13


首先对多分支的第一层先做通道缩减,二三层正常剪枝,左后一层则按Y1+Y2-Y’来优化,其中Y’表示前面层剪枝后得到的结果。

三,基于深度神经网络二阶信息结构化剪枝算法

老样子,先上示意图:

机器学习导论名词解释剪枝_卷积核_14


其实这个示意图已经说的很详细了,第一步:用幂迭代法得到每个通道的hessian矩阵,第二步:用L1范数对每个通道进行处理,并且取前(1-Pi)Ni+1个通道。第三步:将选取的通道置为1,没选取的通道置为0,然后再进行训练。

总结

其实所有的剪枝方法的思想都是一样的,都是选择相对重要的通道从而达到压缩模型的目的,就是不同的论文对通道重要性的评定方法不一样。