论文笔记《Deep Compression》

参考链接https://zhuanlan.zhihu.com/p/27747628

参考链接http://jikaichen.com/2016/06/15/notes-on-deep-compression/

Stanford的Song Han的这篇文章,获得了ICLR2016 的 best paper。文章其实非常好懂,如下图所示,主要流程分三个阶段,一是对网络剪枝,让连接数量减少;第二是通过共享权重和权重进行索引编码来减小权重数量和存储空间;第三是用霍夫曼编码的方式来编码第二阶段的权重和索引,这样可以进一步压缩空间。

论文笔记《Deep Compression》

一、裁剪:减少权重数量

1、正常的网络训练。

2、剪掉小权重的连接:所有权重低于阈值的连接都从网络中删除。

3、重新训练网络,学习剩余稀疏连接的最终权重。

这一步里面还有一个稀疏网络权重表达的技巧,一般来说表达一个稀疏数组是(index, value)这样成对的值来表示,对应于我们的权重数组就是(index,weight),因为数组比较大,所以index至少得是int型的,一个index需要32个bit,文章巧妙地采用了相对索引来表达,也就是每次存储原先前后两个index的差值,这个值我们可以用比较小的数据类型来存,比如图中用3bit(0-8),当然差值超过8时要补上一个0,这样index的字节数就得到了压缩。实际上卷积层用8bit(0-255)存的,全连接层用5bit(0-32)存的。

论文笔记《Deep Compression》

二、权重共享:减少每个权重的比特数

假设权重矩阵是4x4,我们把权重量化为4种,用不同颜色表示,这样我们只需要保存这四种权值就可以了,每种存一个对应的index,这样做只需要存储2bit(4类=2^2 > 2bit)。如图中,不同颜色的权重用0-3表示这4类

另一个问题是进行权重共享后,权重如何更新,看图中下半部分,累加同一类别的梯度,乘上学习率lr后,对权值进行更新。

论文笔记《Deep Compression》

三、霍夫曼编码

霍夫曼编码是一种常用的无损编码技术,主要的思想是按照符号的概率来进行变长编码,就是出现概率大的符号,我编码短一些,出现概率小的符号编码长一些,这样整体就变小了。