深度压缩:采用修剪,量子化训练和霍夫曼编码来压缩深度神经网络
学习模型压缩知识,记录此论文(ICLR2016 的 best paper)学习过程。
论文链接: https://arxiv.org/abs/1510.00149
论文Pytorch实现GitHub链接: https://github.com/mightydeveloper/Deep-Compression-PyTorch
ABSTRACT
DNN是计算密集型和内存密集型的模型,使得他们很难应用在硬件资源受限的嵌入式系统中。因此作者提出了采用修剪、量子训练,霍夫曼编码技术进行模型压缩,过程如下:
- 1.通过网络修剪,只留下重要连接的模型;
- 2.通过量化权重增加共享权重
- 3.霍夫曼编码
在1,2步骤之后,我们对网络进行重新训练,以便对剩余的连接和量化的中心点进行微调;修剪减少了9到13倍的连接数,量化减少了连接比特数,从32减少到5。在ImageNet数据集中,AlexNet模型减小了35倍,从240MB减少到6.9MB,精度不损;VGG-16减小了49倍,从552MB减少到11.3MB,精度不损。这允许将模型拟合到片内SRAM缓存而不是片外DRAM内存中。
作者实验表明,深度压缩的三个阶段:剪枝,量化和霍夫曼编码。
剪枝使权值减少了10×,量化进一步提高了压缩率:在27×~ 31×之间。哈夫曼编码提供了更多的压缩:在35×和49×之间。压缩率已经包含用于稀疏表示的元数据。压缩方案不会造成任何精度损失。
1 INTRODUCTION
模型权重等参数消耗了大量内存、带宽要大等弊端,应用在嵌入式设备上,导致的问题:
- 1.app store限制了APP大小;
- 2.模型消耗能量大
能量消耗主要由内存访问决定。在45nm CMOS技术下,32位浮点数加法使用0:9pJ, 32位SRAM缓存访问使用5pJ, 32位DRAM内存访问使用640pJ,这是加法操作的3个数量级。大型网络不适合芯片存储,因此需要更昂贵的DRAM访问。例如,运行一个10亿个连接神经网络,速度为20fps,仅DRAM访问就需要(20Hz)(1G)(640pJ) = 12:8W——远远超出了典型移动设备的功率包线
下面开始具体介绍 网络修剪、量化训练和共享权重,霍夫曼编码技术
2 NETWORK PRUNING
网络修剪:
从上图的左边的pruning阶段可以看出,其过程是:
- 1.从正常训练出的网络中学习连接
- 2.修剪权重小的连接,小于阈值的都被删掉;
- 3 重新训练网络,其参数从剩余的稀疏连接中获取;
具体修剪可以参考作者2015的另外一篇论文,后续作者也会拜读论文
效果:
- Alexnet和VGG-16的参数减少了9-13倍;