【Comprssion】《Deep Compression:Compressing Deep Neural Networks with Pruning,Trained QuantizationXXX》

在这里插入图片描述
ICLR-2016 Best Paper



1 Background and Motivation

Networks 是 computationally intensive and memory intensive,很难 deploy on embedded system!因为:

  • large storage overhead
  • energy consumption

作者的目标是 reduce the storage and energy required to run inference on such large networks so they can be deployed on mobile devices!

提出了 Deep Compression 方法,a three stage pipeline(Prunning,Trained Quantization,Huffman Coding)

2 Advantages / Contributions

Prunning,Trained Quantization,Huffman Coding 三管齐下,

  • AlexNet by 35x, from 240MB to 6.9MB,VGG-16 by 49x from 552MB to 11.3MB,with no loss of accuracy!(amazing)

This allows fitting the model into on-chip SRAM cache rather than off-chip DRAM (energy consuming)memory.

3 Method

在这里插入图片描述
在这里插入图片描述

3.1 Network Prunning

在这里插入图片描述
三步走,先正常训练,再剪枝(小于设定阈值的 weight 会被 remove),最后 retrain,来更新 remaining sparse connection (多次进行)

效果:9x AlexNet,13x VGG-16

权重矩阵稀疏化后,0 比较多,采用 compressed sparse row (CSR) or compressed sparse column (CSC) format 存储,CSR 或者 CSC 原理如下,用三个数组来存储原来的矩阵

在这里插入图片描述
原图来自 模型压缩算法: Deep Compression

参数量为 2 a + n + 1 2a+n+1 2a+n+1

  • a a a is the number of non-zero elements
  • n n n is the number of rows or columns

为了进一步压缩,论文中存数组的 index 没有用绝对索引,而用的相对索引,下图给出了相对索引超过编码范围的处理方法!

在这里插入图片描述
eg,最大编码为 3-bit,8个位置的间隔时!

第一行就是索引绝对值 0-15,第二行是相对索引值(前后两个参数间的距离),第三行是存储的参数值,

比如值 0.9 在绝对位置 4 上,1.7 在绝对位置 15 上,相差 11,超过了 3-bit 可以编码的最大范围8,我们怎么建立 1.7 的相对索引呢?

我们就在隔绝对位置 4 后面 3-bit 位置处,也就是 4+8 = 12 绝对位置处补 0, 11-8 = 3,只剩下 3 个位置的间隔了,所以我们就可以在绝对位置 15 那里编码相对位置 3(而不是 11 了,通过在 8 间隔的绝对位置12处补0)

3.2 Trained Quantization and Weight Sharing

在这里插入图片描述
假设输入 1 ∗ 4 1*4 14,输出 1 ∗ 4 1*4 14,weight matrix 就是 4 ∗ 4 4*4 44 了!上图上面的行就是 weight matrix,下面的行是对应的 gradient matrix!

将 weight 划分为几个 bins,上图中一种颜色就代表一种 bin,2-bit bin 的话就划分为 0,1,2,3 共四个 bin!划分规则是通过 cluster 方法,value 比较相近的划分到一个 bin 中!
比如 2.09,2.12,1.92,1.87 比较接近,划分在一个 bin 中(上图上面一行中的蓝色表示),all the weights in the same bin share the same value,权重共享后,所有的蓝色都用 value 2 表示,所有橙色都用 0 代表!

同样的规则也作用于下面一行的 gradient matrix,最后统一梯度更新,你看上面的例子,16 个 value,分成 4 个 bin(2-bit unit) 后,只需要更新 16 /4 = 4 倍参数!

作者在 AlexNet 中,用 8-bit ((256 shared weights,256个 bin)来量化 conv layer,5-bit(32 shared weights,32 个 bin)来量化 fc layer!

压缩率可以表示为
在这里插入图片描述

  • n n n :参数个数,也就是原始 weight matrix 的大小,本质上是 connections 数
  • b b b :存储参数的比特位数
  • k k k :表示 k k k clusters,也就是多少个 bins, k 个 bins 需要 l o g 2 k log_2^{k} log2k bit 来编码

上面例子中,

压缩前,weight matrix 大小是 4 ∗ 4 = 16 = n 4*4 = 16 = n 44=16=n,每个 value 用 32-bit 存储,所以 参数量为 16 ∗ 32 16*32 1632 bit

压缩后 weight matirx 大小为 4,每个 value 用 32-bit 存储,然后还要记录一个 16 2-bit 的 indices,也就是存储下面这个图的参数:
在这里插入图片描述

压缩比为

r = 16 ∗ 32 16 ∗ 2 + 4 ∗ 32 = 32 / 40 = 3.2 r = \frac{16*32}{16*2+4*32} = 32/40 = 3.2 r=162+4321632=32/40=3.2

在网络训练完了以后,才 shared weight,具体实现就是 cluster,公式如下

原来权重,
在这里插入图片描述
聚类后的权重,
在这里插入图片描述
最小化 minimize the within-cluster sum of squares(WCSS)
在这里插入图片描述

众所周知,cluster 算法很受质心初始化的影响,作者尝试了多种初始化方法,对比如下
在这里插入图片描述
左边的图是三种初始化方法,概率密度函数和累计分布函数

  • Forgy(random), 根据真实的概率密度,随机初始化
  • density-based, 根据真实的概率密度,按照密度划分区间,越密的地方区间划分的越多(让每个区间等密度)
  • linear initialization, 最大值和最小值之间,均匀的划分区间,每个区间等距离

这里要多说一句,正常的话学出来的权重应该是正态分布,大部分的权重很小,集中在 0 附近,由于 pruning 裁剪了大部分小于设定阈值的权重,所以真实的概率密度由正态分布变成了双峰分布!

右边的图是 linear initialization 和,linear initialization 之后 的效果!

作者发现 linear initialization 效果最好,因为绝对值大的权重比较重要,网络中,大的权重又比较少,如果聚类中心没有大的权重,这些重要的权重很可能被聚成小权重!

linear initialization 能尽可能多的保证大的权重,从上面的左图可以看出

3.3 Huffman Coding

在这里插入图片描述
Huffman 编码是 optimal prefix code,是根据 each symbol 的 occurrence probability 来编码!只要不是均匀分布,都可以通过 Huffman 编码来压缩!

上图左边是权重索引,右边是 Sparse Matrix Loaction 索引,右图可以看出相邻位置的权重最多,位置相隔大的权重少!

这两个图可以看出,权重是非均匀的分布,可以用 Huffman 编码!

存储减少20%~30%。

4 Experiments

4.1 Datasets

  • MNIST
  • ImageNet

在这里插入图片描述

4.2 LENET-300-100 AND LENET-5 ON MNIST

在这里插入图片描述
quantization 里面需要 Weight bits(聚类) 和 Index bits(索引矩阵)

huffman 编码可以进一步压缩

在这里插入图片描述
LeNet-5,5 的意思是 conv 5x5

4.3 ALEXNET ON IMAGENET

在这里插入图片描述

4.4 VGG-16 ON IMAGENET

table 5

5 DISCUSSIONS

5.1 PRUNING AND QUANTIZATION WORKING TOGETHER

Fig 6、7
1+1 > 1,pruning 和 quantization 中西结合效果更好

在这里插入图片描述
这三个图,横坐标是 conv 或者 fc 的 weight bits——用 8-bit 来编码 conv(conv 聚类成 2 8 2^8 28 类),5-bit 来编码 fc(fc 聚类成 2 5 2^5 25 类)——纵坐标是 ImageNet 的 acc,实线虚线是 quantization + 有无 pruning

可以看出,在 bits 比较小的时候,quantization+pruning 效果会稍好于 quantization!

这个图想说,pruning doesn’t hurt quantization,即便直接 quantization 效果也能接受!但先 pruning ,让weight 大幅度减少,再 quantization 会更好一点!

在这里插入图片描述

5.2 CENTROID INITIALIZATION

Fig 8
比较三种初始化方法,uniform init 最好!前面也分析了,这种初始化能尽可能多的保留大(重要)的权重!

5.3 SPEEDUP AND ENERGY EFFICIENCY

Fig 9、Fig 10
在这里插入图片描述
fc 层在 AlexNet 和 VGG 中占了绝大部分的权重,所以对比此部分能直观的体现效果!

  • NVIDIA GeForce GTX Titan X (GPU)
  • Intel Core i7 5930K (CPU)
  • NVIDIA Tegra K1(嵌入式)

三种芯片,两个一组(有无 pruning),对比 speed 和 energy(功耗乘以计算时间),baseline 是在 CPU 上的效果!单位统一换成 CPU 计量方式

在 batch size 为 1 的条件下计算的,因为 batch size 大的话,Waiting for a batch to assemble significantly adds latency.

batch-size 大于 1 的话结果如下

在这里插入图片描述
在这里插入图片描述

5.4 RATIO OF WEIGHTS, INDEX AND CODEBOOK

在这里插入图片描述
weight bits 和 index bits roughly half and half

6 Conclusion(Own)

  • 题目 trained 这个词用的很恰当,在训练好了以后,后处理,这也是 with no loss of accuracy 的功臣之一
  • weight bits(感觉包括 pruning 的稀疏矩阵 和 quantization 的 weight 聚类编码) 和 Index bits(感觉包括 pruning 的相对位置编码 和 quantization 的索引矩阵)
  • 从模型大小的角度入手,模型小了以后,能放在 SRAM 上,能耗更小!没从计算优化的角度
  • 人均 985 上的论坛看到了一句话,感觉很有道理,压缩本质,一个是减少权重数(pruning)一个是减少权重的存储(quantization),作者说,两个我都要
  • 需要非常值得注意的一点,数据精度是没有变的,float-32 或者 float-64,只是存储的形式进行了编码(聚类)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值