论文链接:Methods for Pruning Deep Neural Networks
近年来,随着嵌入式设备的广泛使用,在嵌入式设备上运行神经网络模型有了很大的需求,然而当前的网络结构越来越复杂,因此对网络进行修剪成为了比较热门的问题。
本文将一系列减小网络结构的方法分为了以下八部分,分别是:
本文主要介绍前三种方法,更细节的分类如下图所示:
基于数量级的方法可以细分为:
基于相似度和聚类方法比较少,因此不进行细分。
利用灵敏度分析的方法可以细分为:
当评估剪枝方法,以下措施用来比较他们的性能:
论文Learning both Weights and Connections for Efficient Neural Networks首先介绍了权重剪枝的方法:将权重低于某个阈值的全部被剪枝,之后进行fine-tuned直到准确率达到预期。
该论文的作者在LeNet、AlexNet、VGGNet上分别进行了实验验证了剪枝的作用。另一个针对L1和L2正则化的结论表明,不进行fine-tuned的情况下L1正则化更好,进行fine-tuned则L2正则化更好。另外,前面的网络层对剪枝更加敏感,因此迭代式剪枝方式更好。
彩票理论:对于一个已经训练好的网络,一定存在它的一个子网络可以在不超过原网络训练轮数的情况下达到和原网络相当的准确率。这个子网络就类似于买彩票。
在LeNet和MNIST数据的实验中,研究者尝试了两种方法,第一种是完成训练后剪枝p%的参数,将剩余的参数重新初始化并重新训练,第二种方法是进行n轮迭代式剪枝。研究者们得到了如下结论:
在比较大的网络如AlexNet和VGGNet的结论表明,彩票理论依赖于学习率,较小的学习率更容易找到“彩票”。
在之后的论文Rethinking the Value of Network Pruning中,研究者对彩票理论提出了质疑。该作者使用了三种剪枝方法,分别是结构化剪枝(每层剪枝的通道比例是预定义的),自动化剪枝(全局剪枝比例确定,每层剪枝比例由算法决定),非结构化权重剪枝(只有权重的剪枝比例是预定义的)。
根据以上三种方法进行的实验,作者得出的结论是对于结构化和自动剪枝,随机初始化依旧有效,对于非结构化剪枝,在小型数据集可以去得不错的结果,大型数据集需要进行fine-tuning。
在后续的研究中,针对以下几个问题进行了更多的实验:
经过大量实验得到的结论是:
一些作者指出,尽管修剪权值的方法会导致更少的参数,但它们需要专门的库或硬件来处理产生的稀疏权值矩阵。相反,更高粒度级别的修剪(例如修剪过滤器和通道)可以从许多当前工具包中已有的优化中获益。这导致了许多旨在剪枝特征映射和过滤器的方法,这些方法将在本节中总结。
本部分主要从三个方向来阐述:
论文 Channel-level Acceleration of Deep Face Representations提出了两种通道剪枝的方法,Inbound pruning和Reduce and Reuse pruning
Inbound pruning目的是为了减少输入到过滤器的通道数,其核心思想是使用不同的样本作为输入时,评估输入通道对输出特性映射的贡献变化的程度。这种方法的实现方式是用一些图片样本输入网络,使用特征图中由于通道而产生的差异作为其贡献的度量。
给定Wji为第j个过滤器对应第i个输入通道,和Xip为第i个通道第p个样本的输入,则第j个输出特征图的贡献Y可以被定义为:
根据上述定义,评估该贡献的方差的方法如下:
经过评估后将低于阈值的通道全部剪枝掉
Reduce and Reuse pruning目的是减少输出通道数,其思想是当输入不同的样本时,评估输出特征图的变化。
该方法首先计算输出特征图的方差,m为输入通道数,N为样本数:
然后,Reduce和Reuse使用这个度量来保留一定比例的输出特征图以及导致最大方差的相应过滤器。
去掉输出特征图存在一定问题,因为它被期望作为下一层的输入通道。为了克服这个问题,他们使用其他通道来近似一个被移除的通道。也就是说,如果、’分别是修剪一层之前和之后的一层输出,目标是找到一个矩阵A,满足:
然后将矩阵A作为1x1滤波器的附加卷积层包含进来。
作者使用人脸数据集,利用了一层一层剪枝的方法,即每剪枝一层就进行一次fine-tuning。他们对以上两种方法独立和合在一起进行了实验并和使用随机剪枝(一种低等级估计方法)、Fitnets(一种蒸馏方法)进行比较。
在使用Inbound修剪方法的实验中总体准确率保持在84%以上。在Reduce和Reuse方法的实验中,他们尝试了不同级别的修剪:对早期层分别进行50%、75%和90%,然后对后期层进行50%修剪。对后面的层采用较低的修剪率遵循一个观察结果,即对后面的层进行大量修剪会导致精度的显著降低。
他们的实验结果表明:
论文 An Entropy-based Pruning Method for CNN Compression介绍了一种基于熵的评估方法来评估不同过滤器的重要程度。在他们的方法中,如果一个特征图包含较少的信息。其对应的过滤器就不是很重要,可以被剪枝。
为了计算特定特征图的熵值,作者首先采样数据并获得了每个过滤器特征图的集合。使用全局平均池化方法将每个特征映射简化为一个点度量,并将与每个过滤器相关的度量集离散为q个组。然后使用滤波器的熵()来评估滤波器的鉴别能力
Pi 是样本属于组i的概率。
作者采用了后剪枝+fine-tuning方法和layer wise剪枝(在剪枝一层之后,他们只需要一到两个epoch的学习就可以进行微调),后者的方法在整体训练完后剪枝和每剪枝一层进行fine-tuning之间取得了平衡。
作者在VGG16和Resnet上进行了实验,并与基于权重的剪枝和APoz进行了比较,得出的结论如下:
论文 Network Trimming: A Data-Driven Neuron Pruning Approach towards Efficient Deep Architectures提出了一种直接的方法,其思想是基于输出特征映射中的零的数量是其冗余的表现。根据这种思想,他们提出了一种 average number of zero activations(APoZ)方法,该方法统计在Relu激活函数之后0的平均数来作为弱过滤器的证明。
该方法在LeNet和VGGNet进行实验,首先找到最适合剪枝的层,然后迭代的进行剪枝来保证准确率,最后他们进行了重新训练和微调权重的实验,并倾向于后者得到更好的结果。
对于LeNet,作者发现主要的参数集中在第二层卷积和第一个全连接层,所以他们将注意力主要集中在对这两层进行剪枝,最终的结果是过滤器数量由50减小到24,全连接层从500减小到252。
对于VGGNet,作者也是把注意力集中在512个过滤器的卷积层和4096个节点的全连接层,最终压缩率达到2.59.
论文 Pruning Filters for Efficient ConvNets剪枝的方法是剪枝掉一层中绝对值和最小的过滤器。过滤器的大小定义如下:m为输入特征图的数量,Wji为产生第j个特征图的过滤器
在计算完所有的sj后,去除掉一定比例最小的过滤器以及相关的特征图,每剪枝完一层就进行一次fine-tuning,之后再剪枝下一层。
作者在VGGNet和ResNet上进行了实验,在VGGNet8-13层中的比较小的过滤器,50%的剪枝不会影响准确率。在ResNet-56和ResNet-110中,最合适的剪枝率分别是3.7%和32.4%。
作者将该方法和基于方差的方法(见第一小节)进行了对比,发现能够在不使用额外数据的情况下取得相当的效果。
论文 Filter Pruning via Geometric Median for Deep Convolutional Neural Networks Acceleration认为如果大多数的权重都很小,那么最终可能会删除大量的过滤器,如果大多数过滤器的值都很大,那么就不会删除任何过滤器,即使可能存在相对较小的过滤器。
因此,他们提出了一种观点,即过滤器的几何中值共享其他过滤器的大部分共同信息。因此,如果一个接近它的过滤器被删除,那么其他过滤器可以覆盖它。计算几何中值可能很耗时,所以他们通过假设其中一个过滤器将是几何平均值来近似计算。他们的剪枝策略是使用一个固定的剪枝因子对所有层重复剪枝和微调。
他们对一些方法进行了评估,包括修剪小滤波器(第四小节)、ThiNet(第六小节)、软滤波器修剪和NISP。这些方法在CIFAR-10和ImageNet数据训练的ResNets上进行评估,修剪率分别为30%和40%。一般来说,不同方法的精度下降是相似的,尽管与其他方法(例如,ThiNet 36.7%, Soft filter pruning 41%, NISP 44%)相比,在ResNet-50上使用几何中值方法时,FLOPS显著降低(53.5%)。
论文 ThiNet: A Filter Level Pruning Method for Deep Neural Network Compression将剪枝任务定义为一个优化问题,该问题的目标是找到最接近输出特征映射的输入通道子集。然后可以删除不在子集中的通道及其相应的过滤器。解决优化问题的计算具有挑战性,因此他们使用贪婪算法,首先找到贡献最少的通道,将其添加到要删除列表,并在剩下的通道重复这个过程,直到选择的通道数量等于被剪枝的数量。一旦识别出待保留滤波器的一个子集,利用最小二乘法求出使滤波器W最小的滤波器的权值:
Y是在输出通道中m个样本点,X是对应的输入通道。
作者进行了两个实验。第一个实验作者将VGGNet中全连接层替换为全局平均池化层,之后用ThiNet、APoZ、剪枝小的过滤器方法(第四小节)进行剪枝。他们的结果表明,相对于ApoZ, ThiNet在精度上的退化更小,相比于使用剪枝小过滤器的方法,减少了FLOPS的数量。
第二个实验中作者对ResNet和VGGNet在Imagenet数据集上进行了训练。当仅对VGGNet的前十个卷积层使用ThiNet,参数量减少了5%,准确率上升了1%,当使用全局平均池化,参数量减少了94%,准确率降低了1%。对ResNet中每个残差块的前两层卷积使用ThiNet,结果表明,ThiNet能够将参数数量减半,top-1精度损失1.87%。
论文 Approximated Oracle Filter Pruning for Destructive CNN Width Optimization和ThiNet目的类似,也是是识别并移除对下一层的特征映射产生最小影响的子集。
然而,ThiNet中采用的搜索过程是贪婪的自底向上的方法,而AOFP采用的是自顶向下的二分搜索,随机选择一层中的一半过滤器并设置为剪枝。在下一层生成的特征图上删除这些过滤器的效果会根据设置为修剪的每个过滤器进行测量和记录。对不同的随机选择重复这个过程,每个过滤器的平均效果用来表示去除一个过滤器的影响。去掉后会产生最坏效果的前50%的过滤器被保留下来,并重复这个过程,除非这将导致不可接受的精度降低。与ThiNet等方法相比,AOFP在对一层进行修剪之前不需要确定修剪速率。
在和其他剪枝方法在不同网络结构上的结果表明AOFP能够显著减少FLOPS而不会大幅降低精度。
论文 Channel Pruning for Accelerating Very Deep Neural Networks也将通道选择看成优化问题。具体优化公式如下,W为过滤器,X为输入通道,Y为输出通道结果,β是[0,1]范围内的数,p是值留存的通道数。
不同于ThiNet的贪心搜索,该方法使用L0正则化方法和L1正则化方法进行Lasso回归
作者在VGGNet、ResNet和Xception网络上都进行了实验,另外,作者发现这种剪枝模型可以使用迁移学习应用在目标检测任务上。
一些作者已经发现了移除可能不必要地重复功能的相似参数的方法的潜力。以下两小节描述了两个相对较近的研究,说明了相似性和聚类度量如何用于修剪。
论文 Reducing duplicate filters in deep neural networks 中作者使用余弦相似度来寻找相似的过滤器,公式如下
作者分别在CIFAR数据集上使用MLP和CNN上进行实验。并和修剪小过滤器的方法进行对比,他们的主要发现是值得注意的,即在MLP中,随着第一层节点数量的增加,使用相似度方法更好,因为过多的参数会导致更多相似的权重。而在CNN中,修剪小过滤器的方法更好。
论文 Redundant feature pruning for accelerated inference in deep neural networks提出使用聚类方法来识别不同的过滤器。他们首先利用凝聚层次聚类( agglomerative hierarchical clustering)方法对相似的过滤器进行分组,然后从每个簇中随机选择一个过滤器,并从网络中删除其他过滤器。凝聚集群以一种自下而上的方式工作,从集群中的个体开始,反复合并被认为相似的集群。两个簇之间的相似性度量决定了两个簇是否被合并。
他们在CIFAR-10上用VGG-16和在ImageNet上用ResNet-34进行了各种实验。首先,他们考虑了改变两个聚类合并时的相似度阈值的影响,确定了随着对相似度的要求降低,聚类(和过滤器)的数量也会减少。
对于使用CIFAR-10数据对VGG-16进行的试验,他们表明,一旦确定了最优的相似阈值,他们的方法实现了比其他方法更好的剪枝率和准确性,包括小滤波器剪枝、网络sliming、一种使用正则化来识别弱通道的方法,以及一种使用灵敏度分析的尝试学习方法。
剪枝的主要目的是去除对模型精度影响最小的权值、过滤器和通道。上面描述的基于量级和相似性的方法通过使用影响精度的权重、过滤器和通道的属性隐式地解决了这一目标。相比之下,本节介绍了使用灵敏度分析的方法,目的是建模扰动权值对损失函数的影响。
第一小节以骨架化的描述开始,骨架化是最早提出使用敏感性分析的研究之一。第二到四小节介绍了使用泰勒级数近似扰动权值对损失函数的影响的一系列研究的发展,从最初开发mlp方法的工作到最近旨在剪枝cnn的研究。
尽管使用泰勒级数近似主导这一类方法,新的灵敏度分析方法正在崛起,第五和第六小节描述了有潜力的两种方法:一种使用智能体(Agent),这意味着学习过滤器来剪枝,另一个采用多臂赌博机的使用。
论文 Skeletonization: A Technique for Trimming the Fat from a Network via Relevance Assessment.介绍了一种最早的剪枝神经网络节点的骨架化(Skeletonization)方法。为了计算移除节点的效果,作者引入了注意强度的概念来表示节点在计算激活时的重要性。给定节点的注意强度a,激活函数f,节点j的输出y可以被定义为:
节点ρ的重要性或相关性可以被定义为当a设为0和1时的区别,并且可以通过损失对注意强度的导数来进行估计
虽然作者试图利用二次损失函数进行训练,但他们得出的结论是,考虑到输出和目标与训练密切相关,当计算ρ时,二次损失函数表现不佳。因此,他们在计算ρ时采用了线性损失函数
其中t是输出单元j的目标,y是来自网络的相应输出。
另外,作者注意到导数随时间并不稳定,因此他们使用了权重平均方法
许多研究通过泰勒公式来分析权重对损失的影响,给定权重的变化∆w,损失变化∆ℒ的泰勒级数近似可以表述为
H为海森矩阵,元素均为损失对权重的二阶导数
许多方法采用这种估计方法,假定三阶导可忽略不计。
在OBD(Optimal Brain Damage)算法中, 假设一阶项可以忽略,因为网络将被训练成达到局部最小值,从而产生一个简化的二次逼近。
当权重数量很多,计算海森矩阵需要很大的算力,所以作者假设损失的变化可以由海森矩阵的对角线元素来估计,因此有以下方法来计算权重的突出度s
其中二阶导的计算方式和反向传播类似
OBS算法中,作者使用了海森矩阵的全部元素,OBS使用单位向量e表示选择第m个权值作为被剪枝的权值,将剪枝重新定义为基于约束的优化任务:
使用拉格朗日乘子可以转化为:
通过求导和以上的限制条件,突出度s可以被计算为:
作者得到的结论表明,在XOR问题上,OBS算法表现较好,并且能够显著减少权重的数量。
论文 Pruning Convolutional Neural Networks for Resource Efficient Inference介绍了一种方法通过泰勒公式建模当一个特征图被去掉后的结果。相比于OBD和OBS认为一阶导可以被忽略,该论文作者使用了一阶导估计,忽略了更高阶的项。作者认为,尽管一阶梯度趋于零,但是损失变化的期望值与方差成正比,方差不为零,是达到局部解时稳定性的度量。给定一个具有N个元素Yij的特征映射,使用Taylor级数的一阶近似可以得到以下损失绝对变化的度量:
该度量的尺度在不同的层会有所不同,因此作者在利用该度量在网络的所有层上选择特征映射时,在每一层内应用L2归一化。
他们采用的剪枝过程包括使用该方法选择一个特征图,剪枝,然后在重复此过程之前对网络进行微调,直到满足一个停止条件,考虑到在保持准确性的同时减少 FLOPs 的需要。
他们的实验揭示了一些有趣的发现:
在后续的研究中,作者承认上述方法存在一些局限性;也就是说,假设所有层都具有相同的重要性对跳连(在ResNet架构中使用)不起作用,而且评估特性映射中更改的影响会导致内存需求的增加。因此,他们提出了另一种公式,也使用泰勒级数近似,但基于估计由于去掉第m个参数而造成的平方损失:
gm是一阶导梯度,Hm是海森矩阵的第m行。过滤器的重要性就由计算总和来表示。
所采用的剪枝算法如下。在每个阶段,他们利用固定数量的小批量估计每个滤波器的重要性,然后,根据其重要性,预定义数量的神经元被删除。然后对网络进行微调,并重复这一过程,直到达到一个修剪目标,如期望的过滤器数量或可接受的精度下降的极限。
论文 Learning to Prune Filters in Convolutional Neural Networks提出使用智能体(Agent),每层一个,目的是学习要剪枝哪些过滤器。每个Agent都采用神经网络的形式,将一层过滤器作为输入并学习输出β,其中βi = 1表示应保留第i个滤波器,βi =0表示应剪枝第i个滤波器。
为Agent建模的网络经过训练,通过最大化奖励函数来寻找最有效的过滤器,奖励函数是两个函数的乘积,一个衡量表现,另一个表示模型的相对规模。给定E(验证集)、网络在剪枝前的性能p*、b(可容忍的精度降低),奖励R定义为:
定义为:
定义为:
为了训练代理,他们使用一种尝试和学习的方法,在网络上尝试β的样本设置,并计算相应的奖励,以提供一组使用策略梯度方法训练代理所需的示例
与其他研究一样,他们的评估是在CIFAR10上使用VGG和ResNet进行分类任务。他们还评估了在PASCAL VOC数据上使用FCN-32s网络和在CamVid数据上使用SegNet网络的语义分割任务。结果还可以。
论文 Optimizing deep learning networks using multi-armed bandits,Pruning Neural Networks Using Multi-Armed Bandits提出了一个框架多臂赌博机,用于评估应该删除哪些权重和过滤器。MABs指的是一种基于对赌徒建模的框架,赌徒面对一堆老虎机,为了获得最大回报,需要选择玩哪台机器。在每次拉杠杆之前,赌徒将根据之前的奖励历史知道预期回报或回报,并能够利用这一点来决定下一步拉哪只手以实现他或她的目标。MABs的目标可以是最大化累积奖励或找到最好的臂。当目标是最大化累积奖励时,赌徒的一个关键决策便是决定是使用迄今为止最好的臂还是探索其他臂以获得更大的奖励。相反,当目标是寻找最佳的臂时,一个关键的决定是选择一个能够使人们高度相信最终选定的臂确实是最适合开发的臂。
通过将重量、节点或特征图谱与多臂赌博机联系在一起,和将遗憾定义为移除权重/节点/特性图后的平均损失增加,他们能够探索各种MAB算法的使用,例如 UCB (Upper Confidence Bounds),汤普森抽样,UGapEb来剪枝神经网络。
实证评价是基于在剪枝网络上训练UCI数据集的库,CIFAR-10和卷积网络,和SVHN数据,表明基于UCB的MAB方法优于 magnitude pruning 和OBD、OBS效果相当,但是会使用更少的时间。他们还评估了在牛津花卉和UCSDBirds的数据上使用MAB方法剪枝的AlexNet。结果表明,在不进行任何微调和不影响精度的情况下,可以剪枝这些网络上超过27%的权值。