论文记录-Deep Compression:Compressing DeepNeural Networks With Pruning, Trained Quantization And Huffman

1、概述

  • 压缩主要分为三个阶段:剪枝(pruning)、训练分层(trained quantization)以及 哈夫曼编码(Huffman coding)
  • 可以压缩3549倍,并且不影响精度
  • [模型压缩的主要用于还是能够用于小型的设备上,例如手机端等,比如Google的Mobile Net, 但是准确度肯定要比正常的电脑端训练的大网络低一些,在所难免]
  • [一般的训练好的神经网络模型文件有几百兆的大小,比如Google预训练好的模型,计算量也很大,在手机端运行不太现实]

2、Pipline

  • 剪枝可以压缩10倍左右,加上分层可以达到27到31倍,再加上哈夫曼编码可以达到35到49倍
    • 剪枝:去除多余的连接,比如权重非常小的连接
    • 分层:我感觉像是聚类,多个连接共享一个权重

Pipline

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
    • 比如
      矩阵
val10-23937873 … 91342-1
col_index151262341 … 56256
row_ptr1369131720

- 所以总共需要的大小为:2a+n+1
- a为矩阵非零元素的个数
- n为行数

4、训练分层量化

  • 比如所有的权重聚成4类,cluster index表示每个权重对应的类别
  • 梯度采用同一类别内进行累加,然后进行微调更新

trained quantization
- 假设有n个连接,每个连接的用b bits来表示,并假设有kcluster, 只需要 log2(k) bits去表示索引,则压缩率可以为:

r=nbnlog2(k)+kb

- nb即为没有聚类前总共需要的 bits
- nlog2(k)+kb 就是聚类索引的 bits加上聚类后连接需要的 bits
- 比如上面的例子为: 1632162+432=3.2

4.1 权值共享

  • 使用k-means算法进行聚类,确定每一层共享的权重,在一个cluster中的权重共享,注意这里没有跨层
  • W={w1,w2,...,wn} 聚为 C={c1,c2,...,ck} 类, 其中n>>k
    • 优化函数为:
      argminci=1kwci|wci|2

4.2 共享权重的初始化方法(三种)

  • Forgy: 就是随机初始化方法初始化聚类的中心,如下图,因为权重分布有两个峰值,初始化的值都在峰值附近
  • 基于密度的初始化方法:如下图,先是根据累积分布函数(CDF)线性等分y轴,然后根据CDF找到对应的x轴的坐标,即为聚类的中心。(也是在峰值附近,和Forgy方法相比更分散一些)
  • 线性:就是根据权重的最小值和最大值等分,分散性最大

centroids initialization

  • 神经网络中一般权重值越大,它的作用也就越大,所以对于前两种初始化方法都是在峰值附近,也就意味着值少的地方很小的概率会被初始化,所以不太好,实验中线性初始化的效果最好(但是大权重值的是很少的

4.3 前向和反向传播

  • 计算时查表就可以了
  • 反向传播用于更新聚类中心的权重值
    LCk=ijLWijWijCk=ijLWijΓ(Iij=k)

    • 其中L是损失函数, Ck 是第k个聚类的中心
    • Iij 为聚类中心的索引,如下图,就是同一类别梯度求和
      权重

5、哈夫曼编码

  • 就是按照聚类中心的出现的概率从大到小排序进行Huffman编码
  • 根据上面的结果,权重大都分布在两个峰值附近,所以利于huffman编码

6、结果及讨论

  • 没有准确度损失
    result
  • pruningquantization 结合使用效果最好
    pruning and quantization
  • 和之前别人的工作的比较
    • SVD 压缩了模型但是精度损失较大

和之前的工作比较

  • 缺点就是在运行时现有的GPU不能进行间接的矩阵输入查找,以及相对索引 CSCCSR(下篇论文中也有提及)
  • [我觉得剪枝和权值共享其实是能够防止过拟合的,所以准确度没有损失]
  • [权值共享时是当前层的权值共享,不是整个网络的权值共享]

Reference

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值