首页 > 编程知识 正文

剪枝(剪枝工具)

时间:2023-05-03 12:54:34 阅读:77713 作者:1778

从TowardsDataScience中选择

作者: Ranjeet Singh机器心编译参与:道路剪枝是一种常用的模型压缩方法,本文简要介绍了剪枝的原理、效果。

目前,深度学习模型需要大量的计算能力、内存和电力。 如果需要执行实时估计、在设备端运行模型,或者在计算资源有限的情况下运行浏览器,这就是瓶颈。 能源消耗是对当前深度学习模式的主要担忧。 解决这个问题的一个方法是提高估计效率。

大型模型=更多内存参考=更多功耗

剪枝是提高估计效率的方法之一,可以有效地生成规模更小、内存利用率更高、功耗更低、估计速度更快、估计精度损失最小的模型,这种技术还包括权重共享和量化。 深度学习灵感来自神经科学,而剪枝也受到生物学的启发。

随着深度学习的发展,目前最优的模型精度越来越高,但这一进步伴随着成本的增加。 本文就此进行讨论。

课题1 :模型规模越来越大

我们很难在无线更新(over-the-air update )上分布大模型。

Bill Dally在nips 2016 workshoponefficientmethodsfordeepneuralnetworks上的演讲。

挑战2 :速度

使用4枚M40 GPU训练ResNet的时间,所有模型均按照fb.resnet.torch训练。

训练时间的长短限制了机器学习研究者的生产效率。

课题3 :耗电量

alpha go使用1920个CPU和280个GPU,每个局面的水电费需要3000美元。

这意味着对于移动设备来说,电池将耗尽

对于数据中心,这意味着总体拥有成本将上升

解决方案:高效的估计算法

剪枝权重共享低秩近似二值化网络(Binary Net ) /三值化网络(Ternary Net ) Winograd变换剪枝受到的生物学启示

人工神经网络中的剪枝对人脑突触修剪Synaptic Pruning有所启示。 突触修剪即轴突和树突的完全衰退和死亡,是许多哺乳动物幼年期和青春期突触消失的过程。 突触修剪从雄性出生时开始,一直持续到20多岁。

christopherawalsh.peterhuttenlocher (19312013 ).Nature,502 ) 7470 ) 3360172172,2013。

裁剪深度神经网络

[ lecunetal.nips 89 ] [ hane tal.nips 15 ]

神经网络通常如上图的左边所示,下层的各神经元与上层连接,这意味着我们必须进行大量的浮点乘法操作。 完美地说,只需要将每个神经元与几个其他神经元连接起来,不需要其他浮点乘法操作。 这被称为“稀疏”网络。

稀疏网络容易压缩,可以通过在估计期间跳过zero来改善延迟。

基于网络中的神经元,但如果可以根据贡献进行排序,则可以删除排序较低的神经元,从而获得更小规模、更快的网络。

更快/更小的网络对于在移动设备上运行至关重要。

根据神经元权重的L1/L2范数进行排序会降低剪枝后的模型精度(如果排序顺利,可能会略有下降),网络通常需要经过训练-剪枝-训练-剪枝的迭代才能恢复如果一次修剪过多,网络可能会严重受损,无法恢复。 因此,实际上,剪枝是一个迭代过程,通常称为“迭代剪枝”(Iterative Pruning )。 修剪-训练-迭代(Prune/Train/Repeat )。

若要了解更多有关迭代剪枝的信息,请参阅TensorFlow团队代码: https://g

ithub.com/tensorflow/model-optimization/blob/master/tensorflow_model_optimization/g3doc/guide/pruning/pruning_with_keras.ipynb

权重修剪

将权重矩阵中的多个权重设置为 0,这对应上图中的删除连接。为了使稀疏度达到 k%,我们根据权重大小对权重矩阵 W 中的权重进行排序,然后将排序最末的 k% 设置为 0。

f = h5py.File("model_weights.h5",'r+')for k in [.25, .50, .60, .70, .80, .90, .95, .97, .99]: ranks = {} for l in list(f[『model_weights』])[:-1]: data = f[『model_weights』][l][l][『kernel:0』] w = np.array(data) ranks[l]=(rankdata(np.abs(w),method= 'dense')—1).astype(int).reshape(w.shape) lower_bound_rank = np.ceil(np.max(ranks[l])*k).astype(int) ranks[l][ranks[l]<=lower_bound_rank] = 0 ranks[l][ranks[l]>lower_bound_rank] = 1 w = w*ranks[l] data[…] = w

单元/神经元修剪

将权重矩阵中的多个整列设置为 0,从而删除对应的输出神经元。为使稀疏度达到 k%,我们根据 L2 范数对权重矩阵中的列进行排序,并删除排序最末的 k%。

f = h5py.File("model_weights.h5",'r+')for k in [.25, .50, .60, .70, .80, .90, .95, .97, .99]: ranks = {} for l in list(f['model_weights'])[:-1]: data = f['model_weights'][l][l]['kernel:0'] w = np.array(data) norm = LA.norm(w,axis=0) norm = np.tile(norm,(w.shape[0],1)) ranks[l] = (rankdata(norm,method='dense')—1).astype(int).reshape(norm.shape) lower_bound_rank = np.ceil(np.max(ranks[l])*k).astype(int) ranks[l][ranks[l]<=lower_bound_rank] = 0 ranks[l][ranks[l]>lower_bound_rank] = 1 w = w*ranks[l] data[…] = w

随着稀疏度的增加、网络删减越来越多,任务性能会逐渐下降。那么你觉得稀疏度 vs. 性能的下降曲线是怎样的呢?

我们来看一个例子,使用简单的图像分类神经网络架构在 MNIST 数据集上执行任务,并对该网络进行剪枝操作。

下图展示了神经网络的架构:

参考代码中使用的模型架构。

稀疏度 vs. 准确率。读者可使用代码复现上图(https://drive.google.com/open?id=1GBLFxyFQtTTve_EE5y1Ulo0RwnKk_h6J)。

总结

很多研究者认为剪枝方法被忽视了,它需要得到更多关注和实践。本文展示了如何在小型数据集上使用非常简单的神经网络架构获取不错的结果。我认为深度学习在实践中用来解决的许多问题与之类似,因此这些问题也可以从剪枝方法中获益。

参考资料本文相关代码:https://drive.google.com/open?id=1GBLFxyFQtTTve_EE5y1Ulo0RwnKk_h6JTo prune, or not to prune: exploring the efficacy of pruning for model compression, Michael H. Zhu, Suyog Gupta, 2017(https://arxiv.org/pdf/1710.01878.pdf)Learning to Prune Filters in Convolutional Neural Networks, Qiangui Huang et. al, 2018(https://arxiv.org/pdf/1801.07365.pdf)Pruning deep neural networks to make them fast and small(https://jacobgil.github.io/deeplearning/pruning-deep-learning)使用 Tensorflow 模型优化工具包优化机器学习模型(https://www.tensorflow.org/model_optimization)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。