基本介绍
《Deep Compression : Compressing Deep Neural Networks With Pruning, Trained Quantization and Huffman Coding》 是ICLR16的best paper, 其核心的想法是在不损失模型精度的情况下,将ALexNet, VGG-16等普遍使用的模型进行压缩,使此类模型移植到微型嵌入式或者移动设备成为可能。
总体框架
Deep Compression 的实现流程包括三个阶段的内容,分别为:
- Pruning(剪枝)
- Quantization(量化与权值共享)
- Huffman Coding(哈弗曼编码)
通过联合上述三个部分的内容,达到了相对较好的效果。接下来,将针对上述三部分逐个进行分析:
Pruning(剪枝)
剪枝的基本思想就是将神经网络得到的参数矩阵转换为稀疏矩阵,采用CSR(compressed sparse row)或者CSC(compressed sparse column)的方式来进行矩阵数据的存储。
由于将参数矩阵转换为稀疏矩阵,然后使用CSR或者CSC的方式进行存储是一种常用的方式,因此不在此处进行赘述,详情可以参考Sparse Matrix from Wiki.
Quantization and weights-sharing(量化与权值共享)
这个步骤相当于k-means聚类,将网络的参数聚类成若干个权值,再用索引记录该权值。
对于CONV卷积层,论文中用8 bits索引一个权值(所以,总共有256个共享权值,即聚类中心),而对于FC全连接层,则使用5bits。作者通过这个方法,在AlexNet上能做到准确度完全不降。
这样该步骤能做到的压缩率为
其中 nn 为连接权值的个数,kk 是聚类个数,代表某个聚类则需使用 log2(k)log2(k) 个bits,每个权值用 bb 个bits表示。
文中给了一个例子,不同颜色表示不同的聚类,反向传播的时候也是如此。
聚类中心初始化
聚类中心的初始化会影响聚类的效果,进而影响神经网络预测的准确度。
- 随机初始化(Forgy initialization):即随机选择k个权值进行初始化。(蓝色点表示,集中在两个概率密度的尖峰)
- 密度线性初始化(Density-based initialization ):在累积概率分布等间距取样k个,找到相对应的初始化值进行初始化。(绿色点表示,比随机初始化更加集中)
- 线性初始化(Linear initialization):在权值的分布范围内等间距选择k个权值来初始化。(红色点表示)
有论文指出,数值大的权值在神经网络中起的作用很大,但是这些大权值所占在比例少.
因此,对于Forgy initialization和Density-based initialization 更难表示好这些大权值。
实验结果也比较了这三种初始化方法的差异并证实了该论点。如图:
在压缩比一样的情况下,线性初始化跑出的结果略高于前两种初始化方式。
Huffman Coding(哈弗曼编码)
使用最为典型的哈弗曼编码将得到的数据进一步进行压缩。
总结
仔细通读了这篇文章,总体而言,思路相当清晰,表征了三种实现方式的main idea,同时通过大量的实验数据对提出方法的效果进行了佐证。但是细节方面基本完全没有涉及,因此关于很多具体的实现后期可能需要参考源代码。
由于项目需要,后期可能会在了解DSD训练技术以及EIE推理技术的基础之上,针对SqueezeNet进行深入分析。