到场:道作家:Ranjeet Singh

模子剪枝,不可无视的推测服从晋升方法

剪枝是常用的模子压缩方法之一,本文对剪枝的原理、效果举行了简单先容。

目前,深度进修模子需求大宗算力、内存和电量。当我们需求施行及时推测、配备端运转模子、盘算资源有限的状况下运转浏览器时,这便是瓶颈。能耗是人们关于目今深度进修模子的主要担忧。而办理这一题目的方法之一是进步推测服从。

大模子 => 更众内存援用 => 更众能耗

剪枝恰是进步推测服从的方法之一,它可以高效生成范围更小、内存应用率更高、能耗更低、推测速率更速、推测准确率耗损最小的模子,此类技能还包罗权重共享和量化。深度进修从神经科学中吸取过灵感,而剪枝同样受到生物学的启示。

跟着深度进修的开展,目今最优的模子准确率越来越高,但这一进步随同的是资本的添加。本文将对此举行议论。

挑衅 1:模子范围越来越大

我们很难通过无线更新(over-the-air update)分布大模子。

来自 Bill Dally NIPS 2016 workshop on Efficient Methods for Deep Neural Networks 的演讲。

挑衅 2:速率

运用 4 块 M40 GPU 教练 ResNet 的时间,所有模子遵照 fb.resnet.torch 教练。

教练时间之长限制了板滞进修研讨者的生产服从。

挑衅 3:能耗

AlphaGo 运用了 1920 块 CPU 和 280 块 GPU,每场棋局光电费就需求 3000 美元。

这关于挪动配备意味着:电池耗尽

关于数据中心意味着:总体具有资本(TCO)上升

办理方案:高效推测算法

  • 剪枝

  • 权重共享

  • 低秩迫近

  • 二值化收集(Binary Net)/三值化收集(Ternary Net)

  • Winograd 变换

剪枝所受到的生物学启示

人工神经收集中的剪枝受启示于人脑中的突触修剪(Synaptic Pruning)。突触修剪即轴突和树突完备阑珊和死亡,是许众哺乳动物小年期和芳华时代爆发的突触消逝进程。突触修剪从公出生时就开端了,不停继续到 20 众岁。


Christopher A Walsh. Peter Huttenlocher (1931–2013). Nature, 502(7470):172–172, 2013.

修剪深度神经收集

[Lecun et al. NIPS 89] [Han et al. NIPS 15]

神经收集一般如上图左所示:下层中的每个神经元与上一层有连接,但这意味着我们必需举行大宗浮点相乘操作。完美状况下,我们只需将每个神经元与几个其他神经元连接起来,不必举行其他浮点相乘操作,这叫做「希罕」收集。

希罕收集更容易压缩,我们可以推测时代跳过 zero,从而改良延迟状况。

假如你可以依据收集中神经元但奉献对其举行排序,那么你可以将排序较低的神经元移除,取得范围更小且速率更速的收集。

速率更速/范围更小的收集关于挪动配备上运转它们十分主要。

假如你依据神经元权重的 L1/L2 范数举行排序,那么剪枝后模子准确率会下降(假如排序做得好的话,可以下降得稍微少一点),收集一般需求颠末教练-剪枝-教练-剪枝的迭代才干恢复。假如我们一次性修剪得太众,则收集可以告急受损,无法恢复。于是,实行中,剪枝是一个迭代的进程,这一般叫做「迭代式剪枝」(Iterative Pruning):修剪-教练-重复(Prune / Train / Repeat)。

念更众地了解迭代式剪枝,可参考 TensorFlow 团队的代码:

https://github.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+')
forkin[.25,.50,.60,.70,.80,.90,.95,.97,.99]:
ranks={}
forlinlist(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+')
forkin[.25,.50,.60,.70,.80,.90,.95,.97,.99]:
ranks={}
forlinlist(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_h6J

To 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)

初学剪枝模子压缩
4
相关数据
范数技能

范数(norm),是具有“长度”看法的函数。线性代数、泛函剖析及相关的数学范畴,是一个函数,其为向量空间内的所有向量付与非零的正长度或大小。半范数反而可认为非零的向量付与零长度。

二值化技能

二值化是将像素图像转换为二进制图像的进程。

剪枝技能

剪枝顾名思义,便是删去少许不主要的节点,来减小盘算或搜寻的繁杂度。剪枝许众算法中都有很好的运用,如:计划树,神经收集,搜寻算法,数据库的计划等。计划树和神经收集中,剪枝可以有用缓解过拟合题目并减小盘算繁杂度;搜寻算法中,可以减小搜寻范围,进步搜寻服从。

引荐作品
暂无评论
暂无评论~