剪枝简述(模型压缩加速篇)

模型压缩:

  • 剪枝(Pruning)
  • 量化(Quantization)
  • 低秩分解(Low-rank factorization)
  • 知识蒸馏(Knowledge distillation)

剪枝

为什么可以剪枝

  • 深度神经网络可分为训练和推理两个阶段。训练阶段是根据数据学习模型中的参数(对神经网络来说主要是网络中的权重);推理阶段中将新数据喂进模型,经过计算得出结果。而过参数化是指训练阶段我们需要大量的参数来捕捉数据中的微小信息,而一旦训练完成到了推理阶段,我们并不需要这么多的参数。
  • 这样的假设就支持我们可以在部署前对模型进行简化

剪枝后的好处

  • 1)最直接的好处就是计算量的减小,从而使计算时间更少,功耗更小
  • 2)Memory footprint变小,可以放到更低端的设备上跑。还有个额外的性能好处是本来需要既慢又耗电的DRAM参与,现在有可能放在SRAM就搞定
  • 3)Size更小的包有利于应用发布和更新。如一些手机市场会对应用的大小有限制,另外也有利于车OTA升级

剪枝的定义

  • 核心问题是成如何有效地裁剪模型且最小化精度的损失
  • 其中对于pruning带来的精度损失,使用了iterative pruning方法进行补偿,可以让精度几乎没有损失。这让大家意识到DNN参数冗余程度如此之大,可榨油水如此之多
  • 从network pruning的粒度来说,可以分为结构化剪枝(Structured pruning)和非结构化剪枝(Unstructured pruning)两类
    • 非结构化剪枝:它裁剪的粒度为单个神经元。如果对kernel进行非结构化剪枝,则得到的kernel是稀疏的,即中间有很多元素为0的矩阵,除非下层的硬件和计算库对其有比较好的支持,pruning后版本很难获得实质的性能提升
    • 结构化剪枝:这几年的研究很多是集中在structured pruning上。Structured pruning又可进一步细分:如可以是channel-wise的,也可以是filter-wise的,还可以是在shape-wise的。

怎么去剪枝

  • Network pruning的基本思想就是剪裁最不重要的部分
    在这里插入图片描述

  • 1、在什么地方剪裁:

    • 一个最简单的启发就是按参数(或特征输出)绝对值大小来评估重要性,然后用贪心法将那部分干掉,这类称为magnitude-based weight pruning。还有人提出采用Average Percentage of Zeros,即APoZ来衡量activation的重要性。它定义为activation中为0的比例。

    • 第二种思路就是考虑参数裁剪对loss的影响。其实前面提到的始祖级的OBD和OBS就是属于此类

    • 第三个思路是考虑对特征输出的可重建性的影响,即最小化裁剪后网络对于特征输出的重建误差。

    • 另外还有基于其它的准则对权重进行重要性排序

      贪心算法的缺点就是只能找到局部最优解为它忽略了参数间的相互关系。那自然肯定会有一些方法会尝试考虑参数间的相互关系,试图找导全局更优解

    • 散空间下的搜索

    • 规划问题

    • Bayesian方法

    • 基于梯度的方法

    • 基于聚类的方法

  • 2、具体剪裁多少
    研究的是给定裁剪量的前提下如何做pruning,如采用什么样的criteria去做参数选取,然而其实还有个核心问题是在哪里裁剪多少,即sparsity ratio的确定。sparsity ratio定义为层中为0参数所占比例,有些文章中也称为pruning rate等。(predifined)和自动(automatic)两种方式Predefined方法由人工指定每一层的比例进行裁剪,因此目标结构是提前确定。而automatic方法会根据所有的layer信息(即全局信息)由pruning算法确定每层裁剪比例,因此目标结构一开始并不确定。

    • 从某种意义上来说,著名的MobileNet。multiplier参数也是一种predefined的network pruning方法。只是它比较简单粗暴,将相同的裁剪比例用于所有层,且裁剪后权重不重用,2019年提出的EfficientNet将这种参数调节更进一步,提出compound scaling method将width, depth, resolution按特定比例一起调节,但它们调节参数都是针对网络中所有层的,粒度比较粗。显然,网络中不同层对于pruning的敏感(sensitivity)程度是不一样的,只有根据层的属性为每层设置最适合的sparsity ratio才是最优的,这种为每层专设的称为local sparsity,相对地前面那种就称为global sparsity。发现卷积层比全连接层对pruning更敏感,另外不同的卷积层之间敏感度也不一样,如第一层卷积对pruning就相对更敏感,ResNet中每个stage中第一个和最后一个residual block比中间block更敏感等。**这里就引申出一个重要问题,就是如何确定每一层的最优的sparsity ratio。**在predefined这类方式中,一种就是通过前面的提到的sensitivity analysis进而确定每一层的sparsity ratio
    • 另观automatic方法,如上所说,它需要pruning算法从全局信息中自动得到每层裁剪多少。用强化学习来学习每一层最优的sparsity ratio
  • 3、剪裁之后的精度补偿
    当模型经过pruning,一般会带来精度损失,因此我们在pruning的同时也需要考虑精度的恢复

    • 中在进行channel pruning后,直接通过least square来得到最小化特征重建精度下的新参数,因此不需要fine-tuning来恢复精度,是一种inference-time pruning方法。它的好处是pruning过程不需要训练环境。
    • One-shot pruning指一趟头的裁剪,但这种往往对精度影响很大。人们发现裁完后进行fine-tuning可以弥补pruning带来的精度损失,因此很多方法会在pruning后做fine-tuning。比较经典的是training,pruning,fine-tuning三段式。后面两个阶段交替进行,每次pruning后损失的精度可以由后面的fine-tuning来弥补,该过程也称为iterative pruning。简单说就是砍一刀回点血,再砍一刀再回点血这样,不一步到位是因为有些实验表明一下子砍太狠就难回血了。automated gradual pruning算法,它基于开始阶段冗余多可以裁得快,越到后面越裁得快的指导思想,给出在n步的pruning中,如何从初始sparsity ratio渐变到目标sparsity ratio的方法。
  • 4、重新审视假设

    • 比如一开始提到的over-parameterization对训练是否真的那么有益,还有原网络的权重是否在pruning中很重要,paper2019中提出The Lottery Ticket Hypothesis,即一个随机初始化,密集的网络包含一个子网络,这个子网络如果沿用原网络的权重初始化,在至多同样迭代次数训练后就可以比肩原网络的测试精度。同时它还给出了找这种子网络结构的方法。文章认为这个子结构和它的初始值对训练的有效性至关重要,它们被称为『winning logttery tickets』。paper2018中提出不仅over-parameterization对于训练不是重要的,而且从原网络中重用其权重也未必是很好的选择,它可能会使裁剪后的模型陷入局部最小。如果原网络的权重或其初始值不重要的话,那剩下最重要的就是pruning后的网络结构了。换句话说,某种意义上来说,pruning即是neural architecture search(NAS),只是由于 它只涉及层的维度,搜索空间相比小一些。但这也是它的优点,搜索空间小了自然搜索就高效了。
  • 5、保留模型Capacity

    • Pruning按最初的字面意思理解就是给模型做减法。之前的主流pruning方法中,被裁剪的部分一般也就直接丢弃不会再拿回来了,即模型的capacity在iterative pruning的过程中不断减少。这样的话,一旦有参数被不适当地裁剪掉,便无法被恢复。而这两年,学界正在尝试在模型压缩过程中保留被裁剪部分能力或者扩充能力的方法。2018paper中提出SFP(Soft filter pruning)让被裁剪的filter在训练中仍能被更新,这样它仍有机会被恢复回来。2016paper中提出在pruning的基础上加了splicing操作,避免不合适的pruning带来的影响。2017paper提出在pruning的基础上加了splicing操作,避免不合适的pruning带来的影响
    • Pruning的副作用就是可能会损害模型的capacity。尽管前面的各种方法让该影响尽可能小,但我们往往只能在有限的数据集上做。因此,很可能对于大部分简单的样本pruning对其没有影响,但对于小部分难的数据会有较大影响。那有没有可能在保留网络capacity的同时又能精简计算呢?一些学者尝试结合dynamic NN来达到该目的,即网络执行哪些模块由输出决定。如2017paper提出引入Dynamic Deep Neural Networks,对于给定输入,哪部分神经元被执行由网络本身中的controller module来确定。这个module通过强化学习进行训练。2017paper将pruning建模为马尔可夫决策过程(Markov decision process)并通过强化学习来学习pruning策略当然,这类方法也有些局限,如由于保留了网络原始capacity,因此size不会减少。另外由于执行哪部分是动态的,因此对于硬件加速会有影响(如算子间的fusion)。

剪枝总结

  • 这几年network pruning作为模型压缩中的主力之一,正在受到越来越多的关注。当然,各种更好的pruning参数选取方法一定还会层出不穷。另外,从趋势来看,以下几个方向值得关注:

  • 如前面提到,network pruning方法与NAS的界限已经模糊了。事实上,NAS分支上也有一类搜索加速方法,如One-Shot Architecture Search是先有一个大网络,然后做减法。NAS与模型压缩两个一开始看似关系不是那么大的分支最后似乎走到一块去了。这两个分支今天有了更多的交集,也必将擦出更多的火花。

  • 挑战已有的固有的假设。如前面对于over-parameterization与重用已有参数是否有有益的反思非常有意思。这样的工作会给我们非常大的启发,从而根本改变解决问题的思路。

  • 随着AutoML的大潮,越来越多的东西开始自动化。模型压缩能拉下吗?当然不能。经过前面的介绍我们知道,像ADC,RNP,N2N Learning这些工作都是试图将pruning中部分工作自动化。而且对于其它的模型压缩方法,如quantization,也有一些空间可以自动化,如2018年论文《HAQ: Hardware-Aware Automated Quantization》考虑网络中不同层信息的冗余程度不一样,因此可以用不同位数进行量化。

  • 这几年机器学习最火热的分支之一GAN,正在不断渗透到已有领域,在pruning中也开始有它的身影。如2019年论文《Towards Optimal Structured CNN Pruning via Generative Adversarial Learning》采用了GAN的思想,让generator生成裁剪后网络,discrimintor来判别是否属于原网络还是裁剪后网络,从而进行更有效的网络结构化裁剪。

  • 与硬件结合,如稀疏计算的支持。现在虽然有像cuSPARSE这样的计算库,但底层硬件GPU本身设计并不是专门为稀疏数据处理打造的。如果能将稀疏计算和处理能力做进芯片那必将极大提高计算效率,如早些年有像EIE这样的尝试。在现在神经网络芯片的大潮下,相信这样的案例会越来越多。

  • 如文章一开始提到的,模型压缩方法中pruning只是其中一种,它与其它方法并不冲突,因此与其它方法,如knowledge distillation,quantization等的深度结合,是值得研究的方向。

  • 和其它机器学习分支一样,很多人提出很多算法,各家都说自家的好。一个分支发展到一定时候,就需要benchmark来进行客观的横向比较。Google在2019年论文《The State of Sparsity in Deep Neural Networks》正是这方面的尝试。相信以后也会有越来越多的benchmark,和针对性的竞赛。

参考链接:https://blog.csdn.net/qq_34795071/category_9942409.html

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栋哥爱做饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值