文章分三个步骤压缩模型:
-
Prunes the network:只保留一些重要的连接;
-
Quantize the weights:通过权值量化来共享一些weights;
-
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