6.deep compression 论文总结

1.背景:

问题:深度网络 计算和内存密集(大存储开销,能量消耗),很难部署到硬件资源有限的嵌入式系统/移动系统

解决方案:通过 pruning, trained quantization and Huffman coding 压缩模型,不影响正确率

2.介绍

去掉不太重要的权值 ----> 压缩权值本身的大小

在这里插入图片描述

  • pruning:学习重要的connections,去除冗余连接.
    (1)过程:
    输入:原始网络
    第一步:通过正常的网络训练学习连接
    第二步:修剪 小权重 的连接(权重低于阈值)
    第三步:重新训练网络,学习剩余稀疏连接的权重
    第四步:再修剪连接,训练网络,直到不影响原始正确率
    (2)存储修剪后的稀疏结构:
    稀疏矩阵用compressed sparse row(CSR)和compressed sparse column(CSC)的格式进行压缩
    存储需要 2a+n+1 存储单元 (a:非零元素 , n:行/列)
    为了进一步压缩,存储索引差值而不是绝对位置( index的字节数就可以被压缩),
    减少存储元素位置index所带来的额外存储开销
    ( conv layer:8 bits ,fc:5 bits 差值大于界限用零填充)
    在这里插入图片描述
    一个4*4的矩阵可以用一维16数组表示,剪枝时候,只保留 权值大于指定阈值的数,用相对距离来表示,例如idx=4和idx=1之间的位置差为3,如果位置差大于设定的span,那么就在span位置插入0。例如15和4之间距离为11大于span(8),所以在4+8的位置插入0,idx=15相对idx=12为3。这里span阈值在卷积层设置为8,全连接层为5。

  • trained quantization:用共享权重来量化网络。(量化:降低表示数据所用的位数)
    在这里插入图片描述
    (1)过程
    假设有一个层,它有4个输入神经元,4个输出神经元,那么它的权值就是4*4的矩阵;
    图中左上是weight矩阵,左下是gradient矩阵。可以看到,图中作者把 weight矩阵
    聚类成了4个cluster(由4种颜色表示)。属于同一类的weight共享同一个权值大小(看中间的白色矩形部分,每种颜色权值对应一个cluster index);
    由于同一cluster的weight共享一个权值大小,所以我们只需要存储权值的index。用4个权值和16个索引就可以计算得到4
    4权重矩阵连接的权值。 在 权值更新 的时候,对不同层求导,所有的gradients按照weight矩阵的颜色来分组(同样量化为4类),同一组的gradient求和(得到每类的偏置),得到是sum乘上learning rate再减去共享的centroids(和量化中心一起更新得到新的权值。),得到一个fine-tuned centroids,

    聚类得到k个聚类中心, 并记录对应index.
    再训练, 得到梯度值.
    累加同一聚类簇的梯度值, 并乘以学习率
    更新聚类中心.

    (2)原理
    通过 减少代表每个权重所需的bits 进一步压缩修剪之后的网络
    通过 共享权重 限制需要存储的有效权重数量(微调共享权重)
    (3)权值共享:
    对每一层 使用 K均值聚类 识别共享的权重,相同的cluster里共享权重,而不是通过layers共享
    跨层的weight不进行共享权值
    一维k均值聚类的 centroids(质心) 就是共享的权重
    (4)初始化共享权重
    K-means 聚类,初始点的选择对于结果有着非常大的影响
    Centroid initialization 影响权重聚类的质量和网络预测的准确性
    3种初始化方法:随机初始化、基于密度、线性初始化
    大权重 比 小权重 更重要 。 (但是 随机初始化 和 基于密度 very few centroids 有大的绝对值 来代表大权重)
    线性初始化表现结果更好。
    (5)前向传播和反向传播
    在前向传播和反向传播之间 在查找权重表 时有一个间接阶段 (共享权重的索引表)
    存储codebook (有效权重) 和索引

  • Huffman coding:利用有效权重的偏置分布。
    (1)霍夫曼编码 是 无损数据压缩最常用的 最优前缀编码
    (2)使用变长的 codewords(密语) 来编码原始信号。经常出现的信号用 fewer bits 表示
    (3)主要用于解决编码长短不一带来的冗余问题,卷积层统一采用8bit编码,而全连接层采用5bit,所以采用这种熵编码能够更好地使编码bit均衡,减少冗余。

3.实验和结论

  • 实验:
    (1)pruning:通过添加mask ,屏蔽被裁剪连接的更新
    (2)quantization and weight sharing:
    maintaining a codebook structure that stores the shared weight, and
    group-by-index after calculating the gradient of each layer.
    Each shared weight is updated with all the gradients that fall into that bucket
    (3)Huffman coding :不要求训练 、 在所有微调完成后脱机实现.
  • 讨论
    (1)pruning 和 trained quantization 分别单独工作 没有一起工作的效果好
    (2)pruning 和 trained quantization 压缩网络时互补干扰
    (3)不同压缩bit对精度的影响,表明conv层比fc层更敏感, 因此需要更多的bit表示。
  • 结论
    (1)pruning and quantization在压缩中贡献很大 (compressed 32x),哈夫曼编码贡献很小(compressed 40x)
    Pruning:把连接数减少到原来的 1/13~1/9;
    Quantization:每一个连接从原来的 32bits 减少到 5bits
    (2)pruned network 在很多硬件中都成为了基准,但是quantized network并没有。
    因为现成的库不支持间接矩阵条目查找,也不支持CSC或CSR格式的相对索引
    (3)深度压缩 对 实时图形处理、快速目标检测 都很重要

4.补充

  • (1)传统的神经网络需要在训练前确定与修正架构,因此训练过程并不会提升架构的性能。而若直接选择复杂的架构,那么过多的参数又会产生过拟合问题。因此,选择适当容量(capacity)的模型和消除冗余对计算效率和准确度的提升至关重要
  • (2)目前每层权值修剪的比例仍然是预设的,这个比例需要迭代试验以实现在尽可能压缩权值的同时保证精度。所以如何自动化选取阈值就成为了后面一个继续深入的课题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值