《Deep Compression》论文笔记

本文介绍了一种深度模型压缩方法,包括剪枝、量化和霍夫曼编码三个阶段,有效减少了模型大小,如将AlexNet从240MB压缩至6.9MB。剪枝阶段移除不重要的连接,量化阶段减少权重表示的比特数并强制权重共享,霍夫曼编码进一步压缩模型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 概述

神经网络的模型是计算密集且内存密集的,这就制约了其在嵌入式设备上的使用。文章中的方法分为三个阶段:剪枝、量化训练、霍夫曼编码。量化阶段只会保留重要的filter;量化权重来强制权重共享;使用霍夫曼编码进一步减少模型占用。在前面的两步里面会进行finetune,剪枝会剪除9倍到13倍的连接(全连接?),量化把bit位规定到5。文章的方法将AlexNet从240MB压缩到了6.9Mb,VGG从552MB压缩到了11.3MB。
论文中提出的模型压缩方法可以使用下面这幅图来进行概括,分别表示pruning、quantization、Huffman Encoding三个阶段:
在这里插入图片描述

2. Pruning

总的来说是根据阈值来的,详细步骤如下:
(1)使用常规的网络训练方法学习网络的连接
(2)剪裁小权重的连接:将连接的权重小于某一个 阈值 的连接移除掉。
(3)使用剪裁之后的权重重新学习网络,使得网络连接稀疏
这里对pruning之后的稀疏结构使用压缩稀疏行(compressed sparse row,CSR)或压缩稀疏列(compressed sparse column,CSC)进行保存,这种格式需要2a+n+12a + n + 12a+n+1个数字,其中aaa是非零元素的数量,nnn是行或列的数量。为了更近一步压缩,这里存储的是位置偏移而不是绝对空间位置,对卷积层使用8 bits编码,全连接层使用5 bits编码。当需要一个比边界大的索引差时,使用零填充作为解决方案,见下图。以防偏移超过8,最大的3位使用无符号数,加一个补零。
在这里插入图片描述

3. 量化与权值共享

网络的量化与权值共享通过压缩每个权重的bit数更进一步压缩网络的大小。通过权值共享限制有用权值的个数,之后再次基础上进行finetune。
在这里插入图片描述
权值共享的示意图如图3所示。对于原始的权重大小为4∗44*444的,对应的梯度矩阵也是4∗44*444的,那么通过量化之后分别将其量化为444个,是原来的14\frac{1}{4}41,从而减少参数的数量。
在论文中给出了压缩比的计算公式,如下所示:
r=nbn⋅log2(k)+kbr=\frac{nb}{n\cdot log_2^{(k)}+kb}r=nlog2(k)+kbnb
使用上图中的权值共享作为例子,对于原始给定的4∗4=164*4=1644=16个权重用444个权重去代表,也就是使用4个32位的数字与16个2bit来存储原来16个32位的数据,那么压缩比为:16∗324∗32+2∗16=3.2\frac{16*32}{4*32+2*16}=3.2432+2161632=3.2

3.1 权值共享

这里在每个层中使用k-means方法进行聚类,每个类中的数据使用其中心数值代表。若原始存在nnn个权重W={w1,w2,…,wn}W=\{w_1,w_2,\dots,w_n\}W={w1,w2,,wn}聚类到kkk个中心C={c1,c2,…,ck}C=\{c_1,c_2,\dots,c_k\}C={c1,c2,,ck},其中kkk远小于nnn,那么这个问题可以转化为下面的最优化问题:
在这里插入图片描述

3.2 共享权值的初始化

上一小节中讲到了使用聚类算法去实现权值聚类,从而实现参数共享。那么聚类中心的初始化就很重要了,论文中讨论了三种初始化方式:Forgy、Density-based、Linear。论文中使用AlexNet中的conv3层进行实验,得到下图中的结果:
在这里插入图片描述

3.3 前向与反向传播

通过前面的聚类压缩等,前向与反向按照对应的映射表来实现的。对于每个聚类之后的共享权值其梯度计算表示为:
在这里插入图片描述

4. 霍夫曼编码

对于AlexNet中的全连接层,其权值分布如下图所示,在得到其分布的情况下使用霍夫曼编码进一步编码,压缩空间:
在这里插入图片描述

5. 实验结论

论文中分别使用MINIST与ImageNet数据集进行实验,将AlexNet从240MB压缩到了6.9MB,详见下表。
在这里插入图片描述
作者在实现pruning的时候是在blob上使用mask来控制连接的;在量化与权值共享的时候,量化和权重共享是通过维护一个存储共享权重的码本结构,以及在计算每个层的梯度后按索引分组来实现的。每个共享的权重都被更新为该bucket中的所有梯度;对于霍夫曼编码是finetune完成之后离线完成的。

6. 讨论

6.1 网络量化与剪裁

这里论文对网络量化与剪裁它们的关系与组合的效果,下面这幅图是单独量化、剪裁、量化剪裁组合与矩阵分解对网络精度的影响:
在这里插入图片描述
在论文中指出在未剪裁网络上进行量化与剪裁之后网络再量化,对于网络精度的影响曲线,见下图
在这里插入图片描述
可以在图中看到在三个场景下实线部分都是较虚线部分略好的,论文中给出的解释是:剪裁和为剪裁的网络在参数量上肯定是不一样的,那么在相同的聚类中心数目下,剪裁之后的网络再进行量化得到的误差相对来说更小一些。

6.2 聚类初始化方法

在上面的内容中说到了三种聚类的初始化方法,论文这里对其进行了细致比较,见下图
在这里插入图片描述
从上图可以看出,uniform init初始化(Linear)好于其它的初始化方法,文中给出的解释是:这样的选择方式很好照顾到了权值中比较大的成分,从而有利于网络性能,给出的直观解释就是权值越大,越重要。

7. 个人感悟

这篇文章是一篇较为工程性质的文章,给出了如何实现model压缩的思路以及流程。剪枝、量化、编码都涉及到了,需要网络压缩比较厉害的可以仔细研究一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值