deep compression

来源:互联网 发布:装修报价预算软件 编辑:程序博客网 时间:2024/05/22 07:54

文章分三个步骤压缩模型:

  1. Prunes the network:只保留一些重要的连接;

  2. Quantize the weights:通过权值量化来共享一些weights;

  3. Huffman coding:通过霍夫曼编码进一步压缩;

1.Prunes the network

prunes的过程为:

训练一个网络;

把模型的权值矩阵weight的很小的值进行剪枝,方法是设定一个阈值,权值小于该阈值的值为0,剪枝后的weight为稀疏矩阵;

重新训练这个剪枝后的网络;

为了进一步压缩模型,对于剪枝后的稀疏矩阵weight的index的存储,不再采用绝对位置,而是采用相对位置:

上图中为采用3bits,即0-8的数值来保存相对位置,当相对位置值超过8时,填充0.

论文中,相对位置即index的保存,卷积层采用8bits,全连接层采用5bits.

2.Quantize the weights

采用聚类的方法(k-means聚类),将weight矩阵中的权重值聚类为k类,属于同一类的共享同一个权值,如下图:

对于大小为n为权重矩阵,每个权重占用内存为b bits,将权值聚类为k类,则压缩率计算公式如下:

例如,上图中为将权重矩阵weights聚类为4类(k=4)的结果,聚类后的0,1,2,3类的权值分别为-1.00,0.00,1.50,2.00.weights矩阵的权值由float(32bits)变成了int(2bits),另外再加上k个32bits的共享权值即可,这样模型约减小了16 ∗ 32/(4 ∗ 32 + 2 ∗ 16) = 3.2倍.

在权值更新的时候,计算的梯度按照权重矩阵weight的聚类类别(如上图中不同的颜色代表不同的类别)来分组,将每组的梯度值求和,如图中第二行所示.得到求和值后,乘以学习率,便可以更新权值.

需要注意的是,这里的聚类是对每一层的weight分别聚类,同一个类别共享一个权值,不同层的weight不共享权值.

3.Huffman Coding

霍夫曼编码为可变长编码,下图为将Alenxlet最后一个全连接层的量化权重矩阵weights和对应的稀疏矩阵索引的概率分布图:

有图可知,量化矩阵weights权值主要分布在两个峰值附近,稀疏矩阵索引的距离基本在20以内,试验表明采用霍夫曼编码这些非线性分布值,可以节约20%-30%的网络容量.

参考论文:

DEEP COMPRESSION: COMPRESSING DEEP NEURAL NETWORKS WITH PRUNING, TRAINED QUANTIZATIONAND HUFFMAN CODING