当前位置: 首页 > 编程日记 > 正文

经典不过时,回顾DeepCompression神经网络压缩

640?wx_fmt=jpeg

作者 | 薰风初入弦

转载自知乎

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

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

640?wx_fmt=jpeg

图 1:Deep Compression算法示意图

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

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

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

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

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


1. 剪枝

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

640?wx_fmt=svg

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

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

640?wx_fmt=jpeg

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

现在的存储方式为:

640?wx_fmt=jpeg

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

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

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


2. 量化

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

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

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

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

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

640?wx_fmt=jpeg

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

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

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

640?wx_fmt=svg

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

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


3. 霍夫曼编码

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

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


算法效果分析

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

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

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

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

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

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

转自知乎专栏:

https://zhuanlan.zhihu.com/IsonomiaCS

原文链接:

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

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

福利时刻

入群参与每周抽奖~

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

640?wx_fmt=jpeg

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

640?wx_fmt=png

推荐阅读

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

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

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

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

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

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

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

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

640?wx_fmt=png

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

相关文章:

区块链技术特点之去中心化特性

想知道更多关于区块链技术知识,请百度【链客区块链技术问答社区】 链客,有问必答!! 由于区块链技术去中心化的特性,其在我们生活中的很多重要领域(如金融、管理)等方面具有重要的意义。例如&…

Android APK反编译

转自:http://blog.csdn.net/ithomer/article/details/6727581 一、Apk反编译得到Java源代码 下载上述反编译工具包,打开apk2java目录下的dex2jar-0.0.9.9文件夹,内含apk反编译成java源码工具,以及源码查看工具。 apk反编译工具dex…

Java泛型进阶 - 如何取出泛型类型参数

在JDK5引入了泛型特性之后,她迅速地成为Java编程中不可或缺的元素。然而,就跟泛型乍一看似乎非常容易一样,许多开发者也非常容易就迷失在这项特性里。多数Java开发者都会注意到Java编译器的类型擦除实现方式,Type Erasure会导致关…

C++11中override的使用

override是C11中的一个继承控制关键字。override确保在派生类中声明的重载函数跟基类的虚函数有相同的声明。 override明确地表示一个函数是对基类中一个虚函数的重载。更重要的是,它会检查基类虚函数和派生类中重载函数的签名不匹配问题。如果签名不匹配&#xff…

平头哥发布一站式芯片设计平台“无剑”,芯片设计成本降低50%

导读:8 月 29 日,在上海举行的世界人工智能大会上,阿里巴巴旗下半导体公司平头哥发布 SoC 芯片平台“无剑”。无剑是面向 AIoT 时代的一站式芯片设计平台,提供集芯片架构、基础软件、算法与开发工具于一体的整体解决方案&#xff…

Windows XP下,JDK环境变量配置

2019独角兽企业重金招聘Python工程师标准>>> 1.安装JDK,安装过程中可以自定义安装目录等信息,例如我们选择安装目录为D:\java\jdk1.5.0_08; 2.安装完成后,右击“我的电脑”,点击“属性”; 3.选择…

Markdown语法简介

Markdown是一种方便记忆、书写的纯文本标记语言,用户可以使用这些标记符号以最小的输入代价生成极富表现力的文档。它目标是实现易读易写。Markdown的语法全由一些符号所组成。Markdown语法的目标是成为一种适用于网络的书写语言。 Markdown优点:纯文本…

吴恩达:AI未来将呈现四大发展趋势

作者 | 夕颜出品 | AI科技大本营(ID:rgznai100)导读:8 月 30 日,世界人工智能大会精彩继续。在今天的全球工业智能峰会上,Landing.AI 创始人及首席执行官吴恩达来到现场,做了题为《人工智能是新电力》的演讲…

嵌入式课程安排 嵌入式培训课程大纲参考

嵌入式是一门综合性的学科,现在学习嵌入式开发不是单纯局限于单片机或者Linux,嵌入式课程中包含着非常多的内容。以粤嵌嵌入式课程进行参考,看看我们要学习嵌入式的话,要掌握哪些必备的技能。嵌入式课程安排包含:1、入…

Linux网站架构系列之Apache----进阶篇

本篇博文为Linux网站架构系列之apache的第二篇,我将带大家一起学习apache的编译参数,目录结构和配置文件等方面的知识,实现对apache服务的进一步掌握,并使之能更好的应用到生产实战中去。一、编译参数在上篇的apache部署中&#x…

仅用10天设计的JavaScript,凭什么成为程序员最受欢迎的编程语言?

导语:在这个世纪之交诞生的 JavaScript,没人想到会发展为当今世界上最流行的语言之一。它不够成熟,不够严肃,甚至连名字都是模仿的 Java。那么,JavaScript 的成功是依靠运气和完美时机的侥幸吗?其实不然——…

C++11中= delete;的使用

C11中,对于deleted函数,编译器会对其禁用,从而避免某些非法的函数调用或者类型转换,从而提高代码的安全性。 对于 C 的类,如果程序员没有为其定义特殊成员函数,那么在需要用到某个特殊成员函数的时候&…

vue 使用scss

使用vue-cli模板创建的项目中,使用scss步骤 1. cmd命令: cnpm install sass-loader --save-devcnpm install node-sass --sava-dev2.查看package.json文件中是否已自动添加以下信息 3. 转载于:https://www.cnblogs.com/duanzhenzhen/p/10453495.html

EBS form日历可选范围设置(calendar.setup )介绍

Calendar是Template提供给我们的standard object.可以使我们方便的为日期型字段提供日期的选择列表.form中设置日历方法:1. 为日期型字段指定LOV(ENABLE_LIST_LAMP)2. 在字段的KEY–LISTVAL事件中编写代码:Calendar.showCalendar Package包含如下几个Procedure:1. Calendar.sho…

人工智能对地球环境科学的推进

一项德国耶拿[1]和汉堡[2]科学家在《自然》杂志发起的研究表明,人工智能可以有效地推进我们对于地球气候系统的理解。特别是在当前深度学习的潜力还未被完全开发的情况下。在人工智能的帮助下一些复杂的动态环境,如飓风,森林火灾,…

从概念到应用,终于有人把数据挖掘讲明白了

作者:陈封能(Pang-Ning Tan)、迈克尔斯坦巴赫(Michael Steinbach)等来源 | 大数据(ID: hzdashuju)【导语】数据采集和存储技术的迅速发展,加之数据生成与传播的便捷性&am…

C++11中default的使用

在C11中,对于defaulted函数,编译器会为其自动生成默认的函数定义体,从而获得更高的代码执行效率,也可免除程序员手动定义该函数的工作量。 C的类有四类特殊成员函数,它们分别是:默认构造函数、析构函数、拷…

Android开发:setAlpha()方法和常用RGB颜色表----颜色, r g b分量数值(int), 16进制表示 一一对应...

杂家前文Android颜色对照表只有颜色和十六进制,有时候需要设置r g b分量的int值,如paint.setARGB(255, 127, 255, 212);就需要自己计算下分量的各个值。这里提供一个带有r g b分量的int型的颜色表。注意paint.setAlpha()及paint.setARGB(&…

【redis】c/c++操作redis(对于hiredis的封装)

前言 最近一直在学习redis&#xff0c;通过c/cpp来执行redis命令&#xff0c;使用的是hiredis客户端来实现的。 先简单贴一下代码 头文件 #include <vector> #include <string> #include <hiredis/hiredis.h> typedef enum en_redisResultType {redis_reply_…

OpenCV代码提取:transpose函数的实现

OpenCV中的transpose函数实现图像转置&#xff0c;公式为&#xff1a;目前fbc_cv库中也实现了transpose函数&#xff0c;支持多通道&#xff0c;uchar和float两种数据类型&#xff0c;经测试&#xff0c;与OpenCV3.1结果完全一致。实现代码transpose.hpp&#xff1a;// fbc_cv …

只给测试集不给训练集,要怎么做自己的物体检测器?

9 月5 日&#xff0c;下周四&#xff0c;大家期待已久的由《动手学深度学习》作者&#xff0c;亚马逊首席科学家亲自带领的「深度学习实训营」就要在北京开营了。今天&#xff0c;李沐已经把这次深度学习实训营白天的教学内容和代码上传到 Gituhub 和 D2L.ai 网站了&#xff0c…

MYSQL忘记登录密码

1、关闭Mysql&#xff1a; 如果 MySQL 正在运行&#xff0c;首先杀之 killall -TERM mysqld 2、另外的方法启动 MySQL &#xff1a;bin/safe_mysqld --skip-grant-tables 3、可以不需要密码就进入 MySQL 了。 然后就是 >use mysql>update user set passwordpassword(&qu…

OpenCV代码提取:flip函数的实现

OpenCV中实现图像翻转的函数flip&#xff0c;公式为&#xff1a;目前fbc_cv库中也实现了flip函数&#xff0c;支持多通道&#xff0c;uchar和float两种数据类型&#xff0c;经测试&#xff0c;与OpenCV3.1结果完全一致。实现代码flip.hpp&#xff1a;// fbc_cv is free softwar…

NLP这两年:15个预训练模型对比分析与剖析

作者 | JayLou来源 | 知乎前言在之前写过的《NLP的游戏规则从此改写&#xff1f;从word2vec, ELMo到BERT》一文中&#xff0c;介绍了从word2vec到ELMo再到BERT的发展路径。而在BERT出现之后的这大半年的时间里&#xff0c;模型预训练的方法又被Google、Facebook、微软、百度、O…

大三下学期第一周总结

本周以是开学第一周了&#xff0c;在生活方面&#xff0c;生活琐事确实变多了起来。每天上课&#xff0c;看着老师熟悉的面庞&#xff0c;如履春风。感觉学习没有那么多的陌生恐惧。学习是一方面&#xff0c;身体锻炼不能落下。一周至少保证三小时及其以上的运动。身体是革命的…

AD rodc扩展报错

AD rodc扩展报错AD RODC抢夺FSMO五大角色后&#xff0c;架构扩展报错&#xff0c;解决办法参考链接&#xff1a;http://support.microsoft.com/kb/949257/en-us

Dropout、梯度消失/爆炸、Adam优化算法,神经网络优化算法看这一篇就够了

作者 | mantch来源 | 知乎1. 训练误差和泛化误差对于机器学习模型在训练数据集和测试数据集上的表现。如果你改变过实验中的模型结构或者超参数&#xff0c;你也许发现了&#xff1a;当模型在训练数据集上更准确时&#xff0c;它在测试数据集上却不⼀定更准确。这是为什么呢&am…

入行AI,你需要一本Python机器学习入门

​目前机器学习红遍全球。男女老少都在学机器学习模型&#xff0c;分类器&#xff0c;神经网络和吴恩达。你也想成为一份子&#xff0c;但你该如何开始&#xff1f;今天小编推荐这本《Python机器学习》教你快速入门。​01什么是机器学习&#xff1f;从出生的那天起&#xff0c;…

通过transpose和flip实现图像旋转90/180/270度

在fbc_cv库中&#xff0c;提供了对图像进行任意角度旋转的函数rotate&#xff0c;其实内部也是调用了仿射变换函数warpAffine。如果图像仅是进行90度倍数的旋转&#xff0c;是没有必要用warpAffine函数的。这里通过transpose和flip函数实现对图像进行顺时针90度、180度、270度的…

DIY强大的虚拟化环境-技术可行性部分

【技术可行性部分】大体的cpu支不支持呀&#xff0c;实际效果使用呀&#xff0c;截图效果截图嵌套虚拟化[esxi&#xff0c;xenserver&#xff0c;Hyper-V]嵌套虚拟化&#xff1a;经过各种查资料&#xff0c;和测试验证[只测过intel的&#xff0c;amd的有类似的文章请去下面的资…