模型压缩:

  • 剪枝(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

剪枝简述(模型压缩加速篇)相关推荐

  1. CNN模型压缩加速综述

    前言 自从AlexNet一举夺得ILSVRC 2012 ImageNet图像分类竞赛的冠军后,卷积神经网络(CNN)的热潮便席卷了整个计算机视觉领域.CNN模型火速替代了传统人工设计(hand-cra ...

  2. YoloV5 最强剪枝技术 模型压缩,3ms推理的YoloV5mAP60

    先看效果图: ​ ​ 由于我们修改了model, 没有加pretrain的模型, 但是即便如此, 3个epoch就到了 68.9 的mAP! 前段时间受疫情的影响, 公司希望开发一个口罩佩戴检测的应用 ...

  3. 一文看懂深度学习模型压缩和加速

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 1 前言 近年来深度学习模型在计算机视 ...

  4. 四篇NeurIPS 2019论文,快手特效中的模型压缩了解一下

    在即将过去的 2019 年中,快手西雅图实验室在 ICLR.CVPR.AISTATS.ICML 和 NeurIPS 等顶会上发表了十多篇论文. 除了这些研究方面的成果,针对实际业务,西雅图实验室和快手 ...

  5. 模型转换、模型压缩、模型加速工具汇总

    点击上方"计算机视觉工坊",选择"星标" 干货第一时间送达 编辑丨机器学习AI算法工程 一.场景需求解读   在现实场景中,我们经常会遇到这样一个问题,即某篇论 ...

  6. 对话腾讯AI Lab:即将开源自动化模型压缩框架PocketFlow,加速效果可达50%

    整理 | Jane 出品 | AI科技大本营 [导语]腾讯 AI Lab 机器学习中心今日宣布成功研发出世界上首款自动化深度学习模型压缩框架--PocketFlow,并即将在今年10-11月发布开源代 ...

  7. 腾讯 AI Lab 正式开源PocketFlow自动化深度学习模型压缩与加速框架

    11月1日,腾讯AI Lab在南京举办的腾讯全球合作伙伴论坛上宣布正式开源"PocketFlow"项目, 该项目是一个自动化深度学习模型压缩与加速框架,整合多种模型压缩与加速算法并 ...

  8. 优秀!腾讯AI Lab开源模型压缩与加速框架PocketFlow!

    点击我爱计算机视觉标星,更快获取CVML新技术 PocketFlow,成熟高效的模型压缩与加速框架,经过腾讯内部AI技术商用实践检验,你值得拥有- 以下内容来自腾讯AI实验室(tencent_aila ...

  9. 移动端机器学习模型压缩也自动化了:腾讯新框架为自家模型加速50%

    夏乙 发自 凹非寺 量子位 出品 | 公众号 QbitAI 把深度学习模型压缩部署到手机上直接本地运行的趋势,愈演愈烈.从Google的TensorFlow Lite.苹果的Core ML,到小米今年 ...

最新文章

  1. 16 分频 32 分频是啥意思_Verilog中任意分频的实现
  2. postgresql GUC 参数
  3. 人脸关键点 Stasm
  4. vscode - 添加背景图片
  5. 记一次 .NET 某消防物联网 后台服务 内存泄漏分析
  6. C语言之sprintf使用总结
  7. 要配置php环境_只需修改,要配置Apache的PHP环境,只需修改()。
  8. JVM虚拟机-Class文件之属性表集合
  9. sprintboot 后端将音频流写入到前端播放_freac for mac(音频和CD格式转换器)
  10. 查看python数据的属性
  11. 怎么向前撤回_延迟复工,工资到底怎么算?
  12. Multisim简体中文汉化包下载安装指南
  13. 2019年安徽省学业水平考试计算机,2019年安徽省初中学业水平考试
  14. 数字鉴相器matlab,一种数字鉴相器的设计.pdf
  15. rpm安装java_【CentOS】rpm包安装Jdk
  16. 系统编程之实战小项目-利用LVGL 与 mplayer制作音频播放器
  17. ICP域名备案查询 分享一个可以快速批量查询域名备案信息的平台
  18. Android手机卡顿原因
  19. html5 调用系统相册,iOS之H5调用系统相册相机浏览文件
  20. [IT学习]从网上获取pdf制作vce文件

热门文章

  1. 设置鼠标连接时触摸板禁用、Win10系统电脑触摸板使用方法总结
  2. talent-aio1.0.2 发布,让天下没有难开发的即时通讯
  3. Ubuntu18.04+ros-melodic (包括Ubuntu16.04+ros-kinetic)乐视奥比中光相机在nano、tx2、PC等设备上的安装与使用,并解决无法显示rgb信息的问题
  4. 重磅!苹果公司市值首次突破9000亿美元大关
  5. Module use of python36.dll conflicts with this version of Python
  6. es7版本数据备份与恢复(生产环境)
  7. UIView 绘制渲染机制
  8. 动态规划之扔鸡蛋(或手机)问题
  9. 金山云与天润科技战略合作 推动智慧城市建设
  10. 盘点天才少年稚晖君彭志辉的知识体系