【Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huff】论文笔记

追随Song Han大神的第二篇网络压缩论文(ICLR’16),论文链接:https://arxiv.org/abs/1510.00149
这篇论文是【Learning both Weights and Connections for Efficient Neural Networks】的升级版

效果:

大概能实现35-49倍的压缩。
在ImageNet数据集上,将AlexNet所需的存储量从240MB减少到了6.9MB(35×),而不会降低准确性。 VGG-16的尺寸从552MB缩小到11.3MB(49×),而且不会降低精度。

主要思想:

裁剪,权重共享和量化,Huffman编码
这里写图片描述

裁剪:

具体的裁剪方法和步骤和这篇论文类似【Learning both Weights and Connections for Efficient Neural Networks】,见我的另一篇博客https://blog.csdn.net/liujianlin01/article/details/80590986

这里主要写一下裁剪完后的权重保存方法(上篇博客提到过)
作者将经过权值修剪后的稀疏网络用一种紧凑的存储方式CSC或CSR来表示。这里举个例子来解释下什么是CSR:
假设有一个原始稀疏矩阵W,CSR可以将原始矩阵表达为三部分,即A,IR,IC :
这里写图片描述
其中,A是原始矩阵W中所有非零元素,长度为a,即非零元素个数;
IR中第一个元素固定为0,元素之间的差值代表了原始矩阵W中该行非0元素的数量。 IR[k] =IR[k−1]+ (W中第k-1行非0元素的数量)。长度为n+1, n是矩阵A的行数;
IC是A中每个元素在原始矩阵W中对应的列号,长度为a。
所以将一个稀疏矩阵转为CSR表示,需要的空间为2*a+n+1个,同理CSC也是类似。
作者在存储权重时采用了存储index difference而非绝对index(我上篇博客讲的存储方式)来进一步压缩模型。
这里写图片描述
其中,第一个非零元素的存储的是他的绝对位置,后面的元素依次存储的是与前一个非零元素的索引差值。卷积层中将差值编码为8bit,全连接层为5bit。
以论文中的图为例,如果采用3bit,则最大能表述的差值为8,当两个非零元素的位置差值超过8,则将中间那个位置插入0,防止差值溢出,无法索引到后面的元素。

权重共享和量化:

网络量化和权重共享通过减少表示每个权重所需的位数来进一步压缩修剪的网络。通过使多个连接共享相同的权重来限制我们需要存储的有效权重的数量,然后对这些共享权重进行微调。
这里写图片描述
假设我们有一个有4个输入神经元和4个输出神经元的层,权重为4×4矩阵。左上角是4×4权重矩阵,左下角是4×4梯度矩阵。论文中将上面4×4矩阵权重量化为4个bin(用4种颜色表示),同一个bin中的所有权重共享相同的值。因此在进行权重的存储时,只需要存储4个bin代表的有效权重和16个权重索引即可。
论文中提到压缩率为16 * 32/ (4 * 32 + 2 * 16)= 3/2 ,但是将索引位置表示成2位,笔者表示有点懵!(x,y各只占1位?)
对于修剪的AlexNet,论文中将每个卷积层层量化为8位(256个共享权重),每个全连接层量化为5位(32个共享权重),不会损失任何精度。
在更新期间,对所有相同颜色的梯度进行求和,乘以学习率并从共享质心中减去,得到新的共享质心。

选取质心的方式:K-means聚类

论文中使用K-means,对每一层都做一个weight的聚类,将属于同一个cluster的权重共享同一个权值大小。 但是跨层的weight不进行共享权值。注意的是权重的共享是在网络训练完之后做的。

质心初始化:

作者论文中给出了3种初始化方法,并进行了比较。
1)Forgy (随机初始化):从数据集中随机选择k个观测值,并将这些观测值用作初始质心。初始化的质心显示为黄色。由于双峰分布有两个峰值,Forgy方法倾向于集中在这两个峰值附近。
2)基于密度的初始化:将y轴上的权重的CDF线性地间隔开,然后找到与CDF的水平交点,最后在x轴上找到垂直交点,这成为质心,如蓝点所示。该方法使两个峰值附近的质心密度更高,但比Forgy方法散射更多。
3)线性初始化:将原始权重的[min,max]之间的质心线性地间隔开来。该初始化方法对于权重的分布是不变的,并且与前两种方法相比是最分散的。
这里要注意一点,大权重的作用要比小权重要重要的多,虽然Forgy(random), density-based方法比较好的拟合了数据分布,但是它们忽略了那些绝对值较大的权重,而线性初始化就不会有这个问题。作者采用了线性初始化,实验也证明了其正确性。
这里写图片描述

Huffman编码:

霍夫曼编码是通常用于无损数据压缩的最佳前缀码。它使用可变长度的码字来编码源码元。霍夫曼编码使用变长编码表对源符号进行编码,其中变长编码表是通过一种评估来源符号出现机率的方法得到的,出现机率高的字母使用较短的编码,反之出现机率低的则使用较长的编码,这便使编码之后的字符串的平均长度、期望值降低,从而达到无损压缩数据的目的。
这里写图片描述
上图显示了AlexNet中量化权重的概率分布和最后一个完全连接层的稀疏矩阵索引。
两种分布都有偏差:大部分量化权重分布在两个峰值附近;稀疏矩阵指数差异很少超过20个。
实验表明,霍夫曼编码这些非均匀分布值可以节省20%至30%的网络存储空间。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值