1、概述
- 压缩主要分为三个阶段:剪枝(
pruning
)、训练分层(trained quantization
)以及 哈夫曼编码(Huffman coding
) - 可以压缩
35
到49
倍,并且不影响精度 - [模型压缩的主要用于还是能够用于小型的设备上,例如手机端等,比如Google的
Mobile Net
, 但是准确度肯定要比正常的电脑端训练的大网络低一些,在所难免] - [一般的训练好的神经网络模型文件有几百兆的大小,比如Google预训练好的模型,计算量也很大,在手机端运行不太现实]
2、Pipline
- 剪枝可以压缩10倍左右,加上分层可以达到27到31倍,再加上哈夫曼编码可以达到35到49倍
- 剪枝:去除多余的连接,比如权重非常小的连接
- 分层:我感觉像是聚类,多个连接共享一个权重
3、剪枝
- 主要是删去权重值
weight
比较小的,(设置为0),可以设置一个阈值(threshold
) - 所以权重矩阵变的比较稀疏,可以采用压缩行存储(
Compressed Row Storage(CRS)
)或列存储来存储稀疏矩阵- 主要包括
3
个数组,浮点值数组val
,两个整形数组col_index
,row_ptr
val(k) = a(i,j), col_index(k) = j
row_ptr
是每行数据第一个非0元素在val
中的索引,最后加上一位非0元素的个数,即row_ptr(n+1) = a+1
- 比如
- 比如
- 主要包括
val | 10 | -2 | 3 | 9 | 3 | 7 | 8 | 7 | 3 … 9 | 13 | 4 | 2 | -1 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
col_index | 1 | 5 | 1 | 2 | 6 | 2 | 3 | 4 | 1 … 5 | 6 | 2 | 5 | 6 |
row_ptr | 1 | 3 | 6 | 9 | 13 | 17 | 20 |
---|---|---|---|---|---|---|---|
- 所以总共需要的大小为:
2a+n+1
a
为矩阵非零元素的个数n
为行数
4、训练分层量化
- 比如所有的权重聚成
4
类,cluster index
表示每个权重对应的类别 - 梯度采用同一类别内进行累加,然后进行微调更新
- 假设有
n
个连接,每个连接的用b
bits
来表示,并假设有k
个cluster
, 只需要$log_2(k)$bits
去表示索引,则压缩率可以为:$$r = {nb \over nlog_2(k)+kb}$$nb
即为没有聚类前总共需要的bits
- $nlog_2(k)+kb$就是聚类索引的
bits
加上聚类后连接需要的bits
- 比如上面的例子为:${1632 \over 162+4*32} = 3.2$
4.1 权值共享
- 使用
k-means
算法进行聚类,确定每一层共享的权重,在一个cluster
中的权重共享,注意这里没有跨层 - 将$W={\{w_1, w_2, … ,w_n\}}$聚为$C={\{c_1,c_2, … ,c_k\}}$类, 其中
n>>k
- 神经网络中一般权重值越大,它的作用也就越大,所以对于前两种初始化方法都是在峰值附近,也就意味着值少的地方很小的概率会被初始化,所以不太好,实验中线性初始化的效果最好(但是大权重值的是很少的)
4.3 前向和反向传播
- 计算时查表就可以了
- 反向传播用于更新聚类中心的权重值
$${\partial L \over \partial C_k} = \sum\limits_{ij}{\partial L \over \partial W_{ij}} {\partial W_{ij} \over \partial C_k} = \sum\limits_{ij} {\partial L \over\partial W_{ij}}\Gamma (I_{ij}=k)$$- 其中
L
是损失函数,$C_k$是第k
个聚类的中心 - $I_{ij}$为聚类中心的索引,如下图,就是同一类别梯度求和
- 其中
5、哈夫曼编码
- 就是按照聚类中心的出现的概率从大到小排序进行
Huffman
编码 - 根据上面的结果,权重大都分布在两个峰值附近,所以利于
huffman
编码
6、结果及讨论
- 没有准确度损失
pruning
和quantization
结合使用效果最好- 和之前别人的工作的比较
SVD
压缩了模型但是精度损失较大
- 缺点就是在运行时现有的
GPU
不能进行间接的矩阵输入查找,以及相对索引CSC
或CSR
, 还有剪枝的操作主要是在全连接层,但是计算量大的卷积层较少,虽然可以通过BLAS libraries
或是specialized hardware
进行加速,但是也是受限的(下篇Paper
中也有提到) - [我觉得剪枝和权值共享其实是能够防止过拟合的,所以准确度没有损失]
- [权值共享时是当前层的权值共享,不是整个网络的权值共享]
Reference
- 本文链接: http://lawlite.me/2017/09/07/论文记录-DeepCompression-CompressingDeepNeuralNetworksWithPruning-TrainedQuantizationAndHuffmanCoding/
- 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议 。转载请注明出处!