作者 | 薰风初入弦

转载自知乎

导读:本文作者为我们详细讲述了 ICLR 2016 的最佳论文 Deep Compression 中介绍的神经网络压缩方法。

神经网络压缩一直是一个重要的研究方向,而目前业界最认可的压缩方法莫过于 ICLR 2016 的最佳论文 Deep Compression,算法流程如下图所示:

图 1:Deep Compression算法示意图

上图为 Deep compression 论文介绍的神经网络压缩方法,可分为三步:

  1. 剪枝:舍弃权重绝对值较小的权重,并将剩余权重以稀疏矩阵表示。

  2. 量化:将剪枝结果进行进一步量化,具体的是构建一组权值码本,使模型中的权值共享码本中的其中一个权重值,以减少每个权重保存所需的比特数。

  3. 霍夫曼编码(可选):通过霍夫曼编码,进一步地压缩索引值以及权重数值地存储空间。

Deep Compression 通过上述三个步骤之后,可以系统地压缩任意训练好的神经网络,达到 35 到 49 倍的压缩率。

1. 剪枝

首先,Deep Compression 通过设定一个阈值  实现一个简单的剪枝,若权重  的绝对值大于阈值则保留这个权值,否则这个权值则会被抛弃(置零)。这等价于如下所示的公式:

若阈值设置得当,则权重矩阵应会从稠密矩阵转为一个稀疏矩阵(也可以是一个稀疏矩阵变得更加稀疏),由此权值矩阵可以使用存储稀疏矩阵的压缩存储方式存储,例如CSR(compressed sparse row) 或CSC(compressed sparse column)。Deep Compression在CSR和CSC的基础上,将索引值转为3比特的偏移量值(若超出3比特则需要补零),下面举一个简单的例子:

假设稀疏矩阵原来的存储方式为:

表 1:传统稀疏矩阵的存储方法

现在的存储方式为:

表 2:基于偏移量的稀疏矩阵索引存储

偏移量相较于索引值可以使用更少的比特进行存储,如果偏移量超过 3 比特可以表示的范围,则需要补充额外的 0 权重。

注意,这里的剪枝过程不止进行一次。通常情况下,模型进行一次剪枝之后需要再次训练,然后对训练结果再次剪枝,之后还要再次训练……重复这一过程直到保持精度的前提下模型无法继续剪枝为止。

2. 量化

量化从定义上指使用较低的位数,以一定的误差为代价,去表示一个高位数表示的值。

Deep Compression 的量化为创建一个权值码本,所有的权重大小都只能从码本中进行选择,即进行整个模型之间的权值共享。量化具体分为以下三步:

1. 初始化 k-means 质心:Deep Compression 量化过程中的权重聚类使用了 k-means 算法,因此 k-means 质心的初始化非常关键。常见的初始化方法三种:均匀初始化、随机初始化和按密度初始化,论文中证明最好使用均匀初始化,均匀初始化的方法是在权值的最小值  与最大值  之间线性插值,得到均匀的初始化结果,如公式所示,其中  是初始化的第个质心, 为量化的位数,则有: 

2. 确定对应关系:即确定各个权值分别对应码本中的哪个权值,对应关系通过上一步初始化的 k-means 算法确定。同一个聚类簇中的权重共享聚类中心的权值。

3. 权值微调:通过再训练微调 k-means 的质心,即码本中的权值(只微调质心的权值,所有权重与码本权值的对应关系不变)如下图所示:

图 2:参数量化及码本权重更新示意图

如上图所示,首先所有权重和正常的神经网络一样计算梯度。但由于剪枝的作用,矩阵实际上已经是稀疏矩阵,权值矩阵中为 0 则表示该连接被移除,因此这些位置的梯度被舍弃(置 0 )。而剪枝后,每一个权值对应的聚类结果(即对应码本中的权值)已经确定,在图中的聚类索引表示聚类的结果,同时该结果在权重和梯度图中以对应的颜色标注,例如权重中的 2.09(第一行第一列)和 2.12(第二行第四列)为同一类,量化之后他们的值也都是质心的值。

当生成梯度矩阵后,对聚类质心进行微调,即对同一类的所有权值的梯度求和,再乘以学习率(这里为了方便,假定学习率 lr=1 ),进行梯度下降,公式如下:

其中,  为第  次权值微调的结果,lr 为学习率,  为类聚属于  类的所有权值  构成的集合,  表示权值对应的梯度。微调过程的初值为第一步初始化得到的 k-means 质心。

微调过后,最终 Deep Compression 存储的是一个数据内容是码本索引的稀疏矩阵外加一个存储索引对应权值(质心)的码本。如此一来,就可以将存储权重所需的比特数进一步降低,达到压缩的目的。

3. 霍夫曼编码

采用变长的位数存储索引值,总的来说能够让占比较多的索引值用较长的比特数表示,而出现次数较少的则用较多的比特数表示,已达到进一步压缩的效果。

通过如上三步,我们就能得到一个被 Deep Compression 充分压缩的模型。

算法效果分析

为了得到具体的压缩比,首先要考虑最终模型保存了哪些内容。实际上,Deep Compression 保存了一个由稀疏矩阵构成的索引集合,以及一个索引对应权重的码本。

假设权重经过k-means聚类后(共  类),其索引可以由  个比特表示,而是码本中一个权值所需要的位数。则假设共有  个权重参与量化。则量化可以带来的压缩率为:

而且,在量化之前权重已经经过了一次剪枝,因此实际上的权重数比压缩前更少,因此压缩率还要再除以剪枝后的权重留存的比率  ,综上,最后 Deep Compression 的压缩率为:

实验中,若参数设置合理,并进行反复剪枝,在精度降低较小(1%以内)的情况下 Deep Compression 可以在 VGG Net 上实现高达 49 的压缩比!直至目前为止,49 倍压缩比都是一个非常高的数字。

薰风说:深度神经网络模型的压缩,无外乎两种方案:减少模型的参数量/减少每个参数占用的内存。在众多的压缩方法中,剪枝解决了前者的问题,而量化解决了后者的问题。

Deep Compression 巧妙地通过一个 pipeline 同时解决了两个问题,这也是它所以达到那么好效果的原因。

转自知乎专栏:

https://zhuanlan.zhihu.com/IsonomiaCS

原文链接:

https://zhuanlan.zhihu.com/p/77737098

(*本文为 AI 科技大本营转载文章,转载请联系原作者)

福利时刻

入群参与每周抽奖~

扫码添加小助手,回复:大会,加入福利群,参与抽奖送礼!

AI ProCon 大会优惠票限时抢购中,三人拼团,每人立减600元!识别海报二维码,即刻购票~

推荐阅读

  • 可惜了,你们只看到“双马会”大型尬聊

  • 60+业内技术专家,9大核心技术专题,AI ProCon倒计时一周!

  • 小团队如何玩转物联网开发?

  • 一文看懂机器学习中的常用损失函数

  • DeepMind提图像生成的递归神经网络DRAW,158行Python代码复现

  • KDD 2019高维稀疏数据上的深度学习Workshop论文汇总

  • 5G 改变社会的真相在这里!

  • 程序员如何解决并发冲突的难题?

你点的每个“在看”,我都认真当成了喜欢

经典不过时,回顾DeepCompression神经网络压缩相关推荐

  1. 第三十三课.一些经典的优化策略与神经网络变种

    目录 全局最优与局部最优 Hebb学习规则 常用的三种优化技巧 补充内容:快照集成 补充内容:神经网络剪枝 经典网络变种 小波神经网络 RBF网络 ART网络 SOM网络 Hopfield网络 基于遗 ...

  2. 2021 神经网络压缩 (李宏毅

    首先,为什么需要对神经网络模型进行压缩呢?我们在之前的课程中介绍过很多大型的深度学习模型,但当我们想要将这些大模型放在算力比较小的边缘设备或者其他IoT设备里面,就需要对大模型进行压缩. Lower ...

  3. 深度神经网络压缩与加速总结

    深度神经网络压缩与加速综述 1. 深度神经网络压缩与加速的任务 2. 模型压缩与加速方法 (1) 参数剪枝 (2) 参数共享 (3) 低秩分解 (4) 紧性滤波设计 (5) 知识蒸馏 3. 深度神经网 ...

  4. Intel发布神经网络压缩库Distiller:快速利用前沿算法压缩PyTorch模型

    Intel发布神经网络压缩库Distiller:快速利用前沿算法压缩PyTorch模型 原文:https://blog.csdn.net/u011808673/article/details/8079 ...

  5. 【AITISA 第11次标准会议新一代人工智能产业技术创新战略联盟——AI标准工作组】神经网络压缩组会议

    文章目录 首先,百度提出增加飞桨作为神经网络压缩的测评框架的提案 神经网络表示--第一部分:卷积神经网络 基于数据生成的无需数据的神经网络压缩技术 首先,百度提出增加飞桨作为神经网络压缩的测评框架的提 ...

  6. 多模态语义分析_「CV学霸开讲」卷积神经网络压缩、多模态的语义分析研究

    原标题:「CV学霸开讲」卷积神经网络压缩.多模态的语义分析研究 [新智元导读]2017年度百度奖学金10位候选人中,人大的陈师哲和北大的王云鹤所学专业主要集中在计算机视觉,本文将详细呈现CV学子的求学 ...

  7. 神经网络压缩库Distiller学习

    课题需要来学习一下Intel开源的Distiller神经网络压缩库. Intel 主要根据以下特征和工具构建了 Distiller: 集成了剪枝.正则化和量化算法的框架 分析和评估压缩性能的一组工具 ...

  8. Distiller:神经网络压缩研究框架

    Distiller是由Intel AI Lab维护的基于PyTorch的开源神经网络压缩框架.主要包括: 用于集成剪枝(pruning),正则化(regularization)和量化(quantiza ...

  9. 神经网络压缩库 Distiller

    Distiller 是 Intel 开源的一个用于神经网络压缩的 Python 包,可减少深度神经网络的内存占用.提高推断速度并节省能耗.Distiller 为 PyTorch 环境提供原型和分析压缩 ...

最新文章

  1. 比特安索孟雄晖:软件授权的新开始
  2. Oracle EXPDP/IMPDP示例
  3. KVM硬件辅助虚拟化之 EPT(Extended Page Table)
  4. python 流式编程_python 使用yield进行数据的流式处理
  5. 利用Quartz2D-contex绘制三角形
  6. VTK:一个面向对象的可视化类库(zz)
  7. 展示29个美丽的iPhone壁纸
  8. 跨网页的新手引导_做自媒体的新手要注意什么,这些坑不能踩,这些事不能做...
  9. 【编译原理】简明自底向上分析算法总结:LR(0),SLR,LR(1),LALR分析算法
  10. 超级计算机预测未来,超级计算机预测未来
  11. Mapper 接口的如何起作用
  12. Java中instanceof关键字的用法
  13. <script>标签通过src属性调用js文件
  14. VINS的理解(I-V)
  15. 业余无线电通信_享年109岁,美国最年长业余无线电爱好者因感染新冠肺炎逝世...
  16. hibernate中mappedby的理解
  17. 中级口译口试心得(转)
  18. linux unix novel,《手机》:书写的是语言,表达的是孤独www.smallnovel.com
  19. writing Typecho Plugin记录
  20. SVN合作开发的注意事项

热门文章

  1. 利用phpmailer类邮件发送
  2. Linux多线程实践(6) --Posix读写锁解决读者写者问题
  3. zabbix二次开发之从mysql取值在运维平台js图表展现
  4. 在任何设备上都完美呈现的30个华丽的响应式网站
  5. mysql 从零开始_MySQL从零开始:01 数据库简介
  6. Excel VBA附合导线平差自动计算表
  7. Jmeter调试工具---Debug Sampler
  8. 【bzoj1853】[Scoi2010]幸运数字 容斥原理+搜索
  9. 多线程并行和并发的区别
  10. Spring整合Hibernate的步骤