1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 深度学习模型压缩方法(3)-----模型剪枝(Pruning)

深度学习模型压缩方法(3)-----模型剪枝(Pruning)

时间:2024-02-09 12:56:02

相关推荐

深度学习模型压缩方法(3)-----模型剪枝(Pruning)

link

前言

上一章,将基于核的稀疏化方法的模型压缩方法进行了介绍,提出了几篇值得大家去学习的论文,本章,将继续对深度学习模型压缩方法进行介绍,主要介绍的方向为基于模型裁剪的方法,由于本人主要研究的为这个方向,故本次推荐的论文数量较多,但都是非常值得一读的。

基于模型裁剪的方法

对以训练好的模型进行裁剪的方法,是目前模型压缩中使用最多的方法,通常是寻找一种有效的评判手段,来判断参数的重要性,将不重要的connection或者filter进行裁剪来减少模型的冗余。同样也分为regular和irregular的方式。 这类方法最多,下面列举几篇典型的方案。作者在裁剪的时候同样会考虑每一层对裁剪的敏感程度,作者会单独裁剪每一层来看裁剪后的准确率。对于裁剪较敏感的层,作者使用更小的裁剪力度,或者跳过这些层不进行裁剪。目前这种方法是实现起来较为简单的,并且也是非常有效的,它的思路非常简单,就是认为参数越小则越不重要。Network Trimming: A Data-Driven Neuron Pruning Approach towards Efficient Deep Architectures 论文地址

作者认为,在大型的深度学习网络中,大部分的神经元的激活都是趋向于零的,而这些激活为0的神经元是冗余的,将它们剔除可以大大降低模型的大小和运算量,而不会对模型的性能造成影响,于是作者定义了一个量APoZ(Average Percentage of Zeros)来衡量每一个filter中激活为0的值的数量,来作为评价一个filter是否重要的标准。APoZ定义如下:作者认为通过weight值的大小很难判定filter的重要性,通过这个来裁剪的话有可能裁掉一些有用的filter。因此作者提出了一种基于熵值的裁剪方式,利用熵值来判定filter的重要性。 作者将每一层的输出通过一个Global average Pooling将feature map转换为一个长度为c(filter数量)的向量,对于n张图像可以得到一个n*c的矩阵,对于每一个filter,将它分为m个bin,统计每个bin的概率,然后计算它的熵值 利用熵值来判定filter的重要性,再对不重要的filter进行裁剪。第j个feature map熵值的计算方式如下:Designing Energy-Efficient Convolutional Neural Networks using Energy-Aware Pruning 论文地址

这篇文章也是今天的CVPR,作者认为以往的裁剪方法,都没有考虑到模型的带宽以及能量的消耗,因此无法从能量利用率上最大限度的裁剪模型,因此提出了一种基于能量效率的裁剪方式。 作者指出一个模型中的能量消耗包含两个部分,一部分是计算的能耗,一部分是数据转移的能耗,在作者之前的一片论文中(与NVIDIA合作,Eyeriss),提出了一种估计硬件能耗的工具,能够对模型的每一层计算它们的能量消耗。然后将每一层的能量消耗从大到小排序,对能耗大的层优先进行裁剪,这样能够最大限度的降低模型的能耗,对于需要裁剪的层,根据weight的大小来选择不重要的进行裁剪,同样的作者也考虑到不正确的裁剪,因此将裁剪后模型损失最大的weight保留下来。此文的方法比较有意思,作者认为,既然我无法直观上的判定filter的重要性,那么就采取一种随机裁剪的方式,然后对于每一种随机方式统计模型的性能,来确定局部最优的裁剪方式。 这种随机裁剪方式类似于一个随机mask,假设有M个潜在的可裁剪weight,那么一共就有2^M个随机mask。假设裁剪比例为a,那么每层就会随机选取ML*a个filter,一共随机选取N组组合,然后对于这N组组合,统计裁剪掉它们之后模型的性能,然后选取性能最高的那组作为局部最优的裁剪方式。 算法流程如下:作者发现,在最后一个卷积层中,经过LDA分析发现对于每一个类别,有很多filter之间的激活是高度不相关的,因此可以利用这点来剔除大量的只具有少量信息的filter而不影响模型的性能。 作者在VGG-16上进行实验,VGG-16的conv5_3具有512个filter,将每一个filter的输出值中的最大值定义为该filter的fire score,因此对应于每一张图片就具有一个512维的fire向量,当输入一堆图片时,就可以得到一个N*512的fire矩阵,作者用intra-class correlation来衡量filter的重要性:本文为的CVPR,应用场景为人脸识别的模型:DeepID。作者认为,如果一层中的某个神经元的激活与上一层的某个神经元的激活有很强的相关性,那么这个神经元对于后面层的激活具有很强的判别性。也就是说,如果前后两层中的某对神经元的激活具有较高的相关性,那么它们之间的连接weight就是非常重要的,而弱的相关性则代表低的重要性。如果某个神经元可以视为某个特定视觉模式的探测器,那么与它正相关的神经元也提供了这个视觉模式的信息,而与它负相关的神经元则帮助减少误报。作者还认为,那些相关性很低的神经元对,它们之间的连接不一定是一点用也没有,它们可能是对于高相关性神经元对的补充。在全连接层中,计算方式如下:可以看出来,基于模型裁剪的方法很多,其思路源头都是来自于Oracle pruning 的方法,即挑选出模型中不重要的参数,将其剔除而不会对模型的效果造成太大的影响,而如何找到一个有效的对参数重要性的评价手段,在这个方法中就尤为重要,我们也可以看到,这种评价标准花样百出,各有不同,也很难判定那种方法更好。在剔除不重要的参数之后,通过一个retrain的过程来恢复模型的性能,这样就可以在保证模型性能的情况下,最大程度的压缩模型参数及运算量。目前,基于模型裁剪的方法是最为简单有效的模型压缩方式。(未完待续)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。