剪枝综述
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
深度学习模型剪枝的评述
摘要
近年来,深度神经网络在机器视觉和自然语言处理领域都取得了巨大的成功。然而,要将这些模型部署到诸如机器人芯片、智能手机等微型嵌入式设备上仍是一个巨大的挑战。因此,对于这样的平台,模型压缩是一种降低内存消耗和计算复杂度的合理解决方案,目前处理这一问题的技术手段仍然是模型剪枝,而通道级别的模型剪枝又是最有效的手段之一。因此如何有效的实现通道级别的模型剪枝是至关重要的,并且一直是一个具有大量研究成果的主题。
本文阐述了近年来出现的通道级别模型剪枝的主要技术手段,我们主要讨论各个论文的研究成果和遇到的问题,以及根据共同的特点按类别组织的解决方案列表,并且还列出了各个实验结果之间的比较。
关键词:深度学习,模型压缩,通道剪枝
一.引言
在最近这几年中,深度学习赢得了越来越多的关注,并且促进了非常多领域的突破,这依赖于深度神经网络百万甚至千万级别的参数量,和图形处理器的高速计算能力都起着至关重要的作用。
然而,深度学习模型不管在训练还是在部署到设备上时都存在需要问题。比如,[1]在2012年的ImageNet Challenge中取得了突破性的成果,使用了包含6000万个参数的5个卷积层和3个全连接层的网络。通常需要两到三天的时间在NVIDIA K40机器来训练整个模型的ImagetNet数据集。有时在仅依赖于全连接层的架构中,参数的数量可以增长到数十亿[2]。另一方面,卷积运算消耗了大量的计算资源,而这在移动设备上是非常稀缺的,数十亿的网络参数对于嵌入式设备来说也是高存储开销。以VGG-16模型为例,它拥有超过1.38亿个参数,占用超过500MB的内存空间。同时,224×224图像的分类需要300亿次浮点运算(FLOPs)。显然,将如此大的模型直接部署到嵌入式设备中是不切实际的。
因此,在精度没有明显下降的情况下压缩深度模型是一个关键问题。在这种情况下,许多模型压缩方法也相继被提出。最近的一些压缩和加速方法,包括权值剪枝[3-5]、网络量化[6-8]、低秩近似[9,10]、高效模型设计[11-12]。神经元剪枝方法[3]通过去除一些不那么重要的连接,使权值变得稀疏。网络量化针对存储空间压缩问题,提出了一种降低参数表示精度的网络量化[7]算法。低秩近似[9]利用低秩矩阵技术将权值矩阵分解成几个存储空间较小的小矩阵。但是以上方法或多或少存在一些问题,权值剪枝与网络量化需要特殊的软硬件结合使用才能达到好的效果,低秩近似对于1*1的卷积并无效果。而高效模型设计更多关注设计一些不同的网络模型而不是优化已有的卷积运算或者网络架构来压缩加速。
通道剪枝[4,5]是另一种权值剪枝方法,不同于神经元剪枝。与去除单个神经元连接相比,修剪整个通道有两个优点。首先,它不引入原始网络结构的稀疏性,因此不需要对生成的模型进行特殊的软硬件实现。其次,推理阶段不需要庞大的磁盘存储和运行时内存。
本文综述了近年来通道剪枝在深神经网络的压缩和加速研究进展,这些研究引起了深度
学习界的广泛关注,并取得了一定的进展。在表1中,我们总结了三种不同的方案对模型的通道进行删除,分别是单层剪枝、全局剪枝、多分枝网络剪枝。
表1 模型通道删除方案列表
二.单层剪枝
2.1遗传算法
遗传算法模拟人工种群进化过程,求解优化问题[13,14]。遗传算法的核心思想是包含交叉和变异的遗传算子,它使我们能够探索更大的解空间。突变算子用于保持遗传多样性,避免在产生下一代时出现局部极小值。交叉算子有利于不同个体间的基因交换。遗传算法已经广泛应用于函数优化等各个领域,比如:函数优化、自适应控制、模式识别等。
算法1 遗传算法对单层神经网络模型进行剪枝
Step1:初始化:t = 0;生成初始种群{I m,n}N n=1;初始化交叉概率P C,变异概率P M,种群个体数,和最大迭代数T。
Step2:输入:待修剪层的黑森矩阵和参数、压缩率r和训练集{x i,y i}。
Step3:输出:一组二进制序列,编码了想要的卷积核最合适的结构。
Step4:当t < T,执行:
Step5:预测:通过海森矩阵计算第t代中每个个体的适应度{I m,n}N n=1;
Step6:选择:通过轮盘赌算法从{I m,n}N n=1到{I m+1,n}N n=1中选择最适合的个体;
Step7:交叉:随机地选择两个个体{ I m+1,p, I m+1,q},然后用概率P C进行交叉运算;
Step8:突变: 随机地选择一个没有交叉的个体{ I m+1,r}然后用概率P M进行突变操作;
Step9:更新t = t + 1;
Step10:结束循环。
算法1中包含了利用遗传算法对神经网络模型中的单层进行剪枝的算法过程。其中,突变算子用于保持遗传多样性,避免产生下一代时局部极小值。首先从单个I m,n中选择随机二进制序列,每个位置被选中的概率是1/l,其中l是二进制编码序列的长度。然后根据小概率PM对所选位进行倒转,如果所选的位是0,那么它就会以P M的概率变为1,反之亦然。交叉算子从两个选定的亲本I m,p和I m,q中产生新的后代,这有助于整个种群的基因流动。交
叉算子采用单点交叉,就像突变算子一样,首先选择一个与突变概率相同的交叉序列,然后从I m;p中复制从开始到交叉点的二进制序列;然后剩余的用很小的概率P C从I m;q中复制。论文中两个概率都设置为0.1,如果设置太大会变成随机搜索。然后每个下一代都用同样的方法。
由算法1的输出可得一个二进制序列,该序列即代表当前层的通道掩码,1则保留,0则删除。
2.2.套索回归
套索回归类似于岭回归,Lasso会就回归系数向量给出惩罚值项。此外,它能够减少变化程度并提高线性回归模型的精度。
Lasso 回归与Ridge回归有一点不同,它使用的惩罚函数是L1范数,而不是L2范数。这导致惩罚(或等于约束估计的绝对值之和)值使一些参数估计结果等于零。使用惩罚值越大,进一步估计会使得缩小值越趋近于零。这将导致我们要从给定的n个变量中选择变量。如果预测的一组变量是高度相关的,Lasso 会选出其中一个变量并且将其它的收缩为零。
图1 用于加速卷积层的通道修剪
图1描述了针对单个卷积层的通道修剪算法。算法的目标是减少特征图B的通道,同时保持输出特征图C。一旦通道被修剪,我们可以移除将这些通道作为输入的过滤器的相应通道。此外,产生这些通道的过滤器可以也要移除。很明显,通道修剪涉及两个要点。第一个是频道选择,因为我们需要选择适当的通道组合以保持为很多信息。二是重建。我们需要使用选定的渠道。
在此基础上,论文提出了两个步骤。首先,由于穷举搜索对于极小的网络也是不可行的,我们提出了一种基于LASSO回归的方法来求出具有代表性的信道并剔除冗余信道。
通常为了用C通道修剪一个特征图,如果对于n×c×k h×k w形状的卷积滤波器W应用于N×c×k h×k w形状的输入量X从该特性中取样,生成了N×n输出矩阵Y。这里的N是样本数,n为输出通道数,k h,k w是filter大小。修剪输入通道从C到所需的C’(0≤C’≤C),同时把重建误差降到最小,就有如下公式:
||·||F是Frobenius 范数,简称F-范数,是一种矩阵范数。Xi 是N × k h k w矩阵在输入张量X中第i(i = 1,…, c)个通道的切片。W i是n × k h k w滤波器W中的第i个通道的切片。长为c的系数向量β用来选择通道。βi (i在β中)是一个掩码,表示是否i个channel要被删除。如果βi = 0,那么X i将不再有用,可以安全的删除特征图中的通道,W i也可以被移除。C’是剩余要重新训练的通道数,这不需要手动设置,因为可以从期望的加速率计算出来。对于全