深度网络模型压缩DEEP COMPRESSION

原创 2017年07月26日 19:29:22

DEEP COMPRESSION


主要流程:

  1. pruning(剪枝)
  2. trained quantization(量化训练)
  3. Huffman coding(霍夫曼编码)

首先通过学习重要的连接来修剪网络;接下来,量化权重以实施权重共享;最后,应用霍夫曼编码。实际效果可以将AlexNet 无准确率损失压缩35倍,240MB到6.9MB,VGG-16压缩49倍,552MB到11.3MB。
fig1

Network Pruning


首先通过正常的网络训练学习连接。接下来,修剪小重量连接:从网络中删除重量低于阈值的所有连接。 最后,我们重新训练网络来学习剩余稀疏连接的最终权重。

使用压缩稀疏列(CSR)或压缩稀疏列(CSC)格式存储从剪枝产生的稀疏结构,这需要(2a + n + 1)个数字,其中a是非零元素的数量,n是 行或列。
关于这种压缩方式,wiki上有很好的解释,这是对稀疏矩阵的一种编码方式。
csr
为了进一步压缩,剪枝时候,只保留权值大于指定阈值的数,用存储索引差(diff)而不是原始的绝对位置(inx)来表示,对于索引差大于设定的span值,还会进行补零处理。例如设置span=8,idx=4和idx=1之间的位置差为3,无需补0。例如15和4之间距离为11大于span=8,所以在4+8=12的位置插入0,idx=15相对idx=12为3。span值在卷积层设置为8,全连接层为5。
fig2

Trained Quantization And Weight Sharing


权重分享是一个比较重要的操作。如图所示,首先通过使多个连接共享相同权重来限制需要存储的有效权重的数量(上面),然后微调这些共享权重(下面)。

fig3

原来的权重值可以用索引值和量化值替代,从而大大减小网络的规模。
压缩率计算方法如下公式所示:

rate
n代表连接数,b代表每一个连接需要b bits表示,k表示量化k个类,k类只需要用log2(k)个bit表示,n个连接需要nlog2(k)索引,还需要用kb表示量化中心的数值。 最初有4×4 = 16个权重,但只有4个共享权重:类似的权重被分组在一起以共享相同的值。 原来我们需要存储16个权重,每个都有32位,现在我们只需要存储4个有效权重(蓝色,绿色,红色和橙色),每个都有32位,连同16个2位索引,压缩率为16 * 32 /(4 * 32 + 2 * 16)= 3.2。

Weight Shearing


作者采用了K-means聚类方法,把权值量化为k个类。原始的n个权重W=w1,w2,......,wn使用聚类算法变为k个聚类中心C=c1,c2,......,ck。聚类算法最小化类内误差,目标函数如下所示:

loss

Initialization of Shared Weights


聚类中心C的初始化影响着量化方式,作者也采用了不同的初始化方法:随机初始化,基于密度初始化,线性初始化。
绝对值较大的权重比较小的重量更重要,但是这些权重的数目较少。 因此,对于随机初始化和基于密度的初始化,很少的质心具有很大的绝对值。 线性初始化不会受到此问题的困扰。 实验部分比较了聚类和微调后不同初始化方法的准确性,表明线性初始化效果最好。

Feed-forward and Back-propagation


一维k均值聚类的质心是共享的权重。 在前馈阶段和反向传播阶段中查找重量表有一个间接级别。 为每个连接存储共享权重表中的索引。 在反向传播期间,计算每个共享权重的梯度并用于更新共享权重。
g

Huffman Coding


霍夫曼编码是常见的无损编码方式,最后使用这种方式进一步压缩模型。

huffman

总结


整个流程较为清晰:稀疏编码,量化共享,概率编码,达到的效果也不错:

result

更值得注意的是速度和功耗上:

speed

但是我也好奇这个东西解码出来有多大= =
Github Demo上解码出来是232.57MB,跟原始的大小没什么区别,那么使用的时候还是需要再解码吧,所以感觉还是和理想的差一点。

版权声明:本文为博主原创文章,转载请标注出处。

神经网络压缩:Deep Compression

本次介绍的方法为“深度压缩”,文章来源与2016ICLR最佳论文 《Deep Compression: Compression Deep Neural Networks With Pruning, T...
  • shuzfan
  • shuzfan
  • 2016年05月12日 14:22
  • 11495

deep_ocr 是使得 OCR 比 tesseract 更好的中文识别、身份证识别等等

deep ocr 估计很多开发员使用tesseract做中文识别,但是结果不是一般的差,譬如下面的图片 $ tesseract -l chi_sim test_data.png out_test...
  • c2a2o2
  • c2a2o2
  • 2017年07月26日 16:48
  • 815

Deep Learning(深度学习)之(六)【深度神经网络压缩】Deep Compression (ICLR2016 Best Paper)

Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman co...
  • boon_228
  • boon_228
  • 2016年06月20日 08:48
  • 9329

deepCrowd.zip

  • 2017年04月07日 10:57
  • 52.05MB
  • 下载

【深度神经网络压缩】Deep Compression (ICLR2016 Best Paper)

做过深度学习的应该都知道,NN大法确实效果很赞,在各个领域轻松碾压传统算法,不过真正用到实际项目中却会有很大的问题: 1. 计算量非常巨大;2. 模型特别吃内存;怎么办?使用网络压缩技术咯!《Deep...
  • cyh24
  • cyh24
  • 2016年06月19日 01:51
  • 16061

基于Caffe的CNN剪枝

背景 传统的CNN网络训练完之后,全连接层的权值矩阵动辄就几十万、几百万个参数值,可见CNN模型的庞大,但是仔细观察CNN的权值矩阵就会发现,里面有很多的参数的绝对值都很小,比如在-0.001到0....
  • zhouyusong_bupt
  • zhouyusong_bupt
  • 2016年07月05日 17:03
  • 7551

剪枝+再训练:稀疏化DeepID2

压缩的核心剪枝再训练 算法流程 剪枝准则 实验分析 本次介绍的依然是压缩网络的方法,不过有了具体的应用场景:压缩的模型是DeepID2+。方法来源于《2015 arxiv: Sparsifyin...
  • shuzfan
  • shuzfan
  • 2016年06月17日 15:52
  • 6077

模型压缩——将模型复杂度加入loss function

这里介绍2017ICLR OpenReview中的一篇有关网络压缩的文章《Training Compressed Fully-Connected Networks with a Density-Div...
  • shuzfan
  • shuzfan
  • 2016年11月15日 14:28
  • 1691

深度学习模型压缩加速

1、剪枝(1)Deep Compression这篇文章(Stanford的Song Han)如图 1所示,剪枝需要三个步骤,首先是训练一个普通的神经网络;然后我们选择一个阈值,将权重小于阈值的连接剪开...
  • qq_27248897
  • qq_27248897
  • 2017年10月11日 23:28
  • 208

CNN 模型压缩与加速算法综述

导语:卷积神经网络日益增长的深度和尺寸为深度学习在移动端的部署带来了巨大的挑战,CNN模型压缩与加速成为了学术界和工业界都重点关注的研究领域之一。...
  • qq_40027052
  • qq_40027052
  • 2017年11月27日 14:59
  • 4913
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度网络模型压缩DEEP COMPRESSION
举报原因:
原因补充:

(最多只允许输入30个字)