论文阅读笔记-DEEP COMPRESSION

本次阅读的论文是斯坦福大学韩松的博士论文《DEEP COMPRESSION: COMPRESSING DEEP NEURAL
NETWORKS WITH PRUNING, TRAINED QUANTIZATION
AND HUFFMAN CODING》

一、Abstract

Why?

近年来,神经网络在人们实际生活中取得了巨大成功,但是,神经网络这类算法存在着一个鲜明的特点,它是一种计算密集型和存储密集型的算法,这就导致神经网络很难在嵌入式设备上部署,本文就旨在解决这一个限制。

How?

作者在文章中提出了一种叫做“Deep Compression"的方法,主要分为三个步骤:pruning, trained quantization and Huffman coding。剪枝(pruning)就是将权重中一些相对不重要的参数剪去(设为0),量化(trained quantization)则是用低比特的数据表示高比特的数据,Huffman coding则是一种常见的数据无损的压缩算法。

Result

通过Deep Compression, 在ImageNet数据集上, 作者将AlexNet模型的存储所需空间缩小了35倍(240MB->6.9MB),并且没有精度损失,同样,将VGG-16模型所占用的存储空间缩小了49倍(552MB->11.3MB),同样也没有精度上的损失。

二、INTRODUCTION

近年来,深度神经网络已经成为了计算机视觉领域十分有力的一个工具,但是,这些强大的深度神经网络都有相当数量的参数,对存储空间和存储带宽提出了很高的要求。

1、在手机等移动工具上,一般都存在这一个问题,例如在苹果的APP STORE上,大于100MB的文件必须在连接wifi的情况下才能下载,这就妨碍了深度神经网络在手机等设备上的部署。

2、手机等移动设备电池续航能力有限,而且散热也差,而深度神经网络在运行时需要频繁的访存以及乘累加运算,这些操作的功耗都是非常高的,因此这一点也限制了深度神经网络的部署。

文章针对这种情况,主要实现以下目标:
1、解决存储空间占用过大的问题
2、解决功耗过高的问题
于是,作者提出了deep compression的方法,将模型的大小压缩至原来的数十倍,使得模型参数能完全放在SRAM内,免去了对DRAM的访问,大大降低了功耗,最终实现了很高的加速比和功率效率。

三、Methods

Network Pruning

如何剪枝

剪枝是一种能有效压缩模型大小和防止过拟合的方法,所谓剪枝,就是剪去一些不重要的连接:设置某个阈值,低于每个阈值的权重都被永久置为0,不再参与今后的计算。每次剪枝之后,我们还可以对模型进行retrain,微调权重,这样不断迭代,直至结果满意为止。
在本文中,我们通过剪枝将AlexNet模型的大小缩减了9倍,将VGG-16的模型大小缩减了13倍。

剪枝后参数的存储

剪枝之后,模型中绝大多数参数都会被置为0,因此,剪枝之后的权重矩阵是一个稀疏矩阵,针对稀疏矩阵的存储方式有很多,例如CSR、CSC等,本文作者采用CSR来存储稀疏化后的权重。
在这里插入图片描述
如上图所示,AA数组存储的是稀疏矩阵中非零元素的值,JA数组存储A中每一行第一个非零元素在AA中的索引,JA中最后一个元素为非零元素个数+1,而IC数组存储的是AA中对应元素的列号,若设A中非零元素有a个,A矩阵有n行,那么采用CSR存储只需要2a+n+1个数据即可。
那么如果有乘法A*v,则操作如下:
for(i=1;i<=n;i++){
y0=0;
for(k=JA[i];k<JA[i+1];k++)
y0+=AA[k]*v[IC[k]];
y[i]=y0;
}

TRAINED QUANTIZATION AND WEIGHT SHARING

量化即用低比特的权重来代替高比特的权重,权重共享则是指让多个权重共享一个值。本文在剪枝之后,即对模型进行量化和权值共享,并且重新训练微调模型。
在这里插入图片描述
如图,是我们进行量化和权值共享的示意图,在上图中,输入神经元为4个,权重矩阵为4x4,我们将这16个权重分为4组,每组的颜色相同,并且它们共享同一个值,这些共享的值则没有必要使用32bit来表示,因为他们可能的取值很少,因此可以用低bit来表示这些共享的全值。下方的矩阵则是梯度矩阵,按照权重矩阵的分组对梯度矩阵分组,相同组内的梯度值相加,乘以学习率后对相应的共享权值进行更新。
在本文中,作者对剪枝后的AlexNet模型进行了量化,将卷积层权重量化为8bit,全连接层权重量化为5bit。
为了计算这种方法的压缩率,作者假定权重有k个组,组的索引则需要 l o g 2 ( k ) log_2(k) log2(k)bit,整个权重矩阵共有n个权重,每个权重用b比特表示,那么压缩率为
r = n b n l o g 2 ( k ) + k b r=\dfrac{nb}{nlog_2(k)+kb} r=nlog2(k)+kbnb

how to weight sharing

作者在本文中采用k-means聚类算法进行权值的共享,设有n个权重,目标是分为k组,那么每组中所有的权重都共享一个权值。

initialization of shared weights

在进行k均值聚类时,初始的k个聚类中心的选取对聚类结果有较大影响,本文介绍了三种初始化聚类中心的方法:

1、Forgy (random) initialization

在数据集中随机选取k个点作为k个聚类中心。

2、Density-based initialization

基于密度进行选取。

3、Linear initialization

在[xmin,xmax]区间内等距离的选取k个点作为聚类中心。

feed-forwarded and back-propagation

Huffman Coding

四、Experiments

作者一共剪枝、量化、哈夫曼编码了4个神经网络,两个基于MNIST,两个基于ImageNet。

LENET-300-100 AND LENET-5 ON MNIST

LeNet-300-100是一个全连接神经网络,共有两个隐藏层,分别有300和100个神经元,而LeNet-5则是一个卷积神经网络,有两个卷积层和两个全连接层,他们在MNIST的错误率分别为1.6%和0.8%。
下表是四个神经网络的实验结果
在这里插入图片描述
下面两个表是两个Lenet的压缩情况
在这里插入图片描述

ALEXNET ON IMAGENET

下表是AlexNet的实验结果,压缩前后模型精度基本无损失。
在这里插入图片描述

VGG-16 ON IMAGENET

下表是VGG-16的实验结果。
在这里插入图片描述

五、Discussion

PRUNING AND QUANTIZATION WORKING TOGETHER

作者通过实验发现,剪枝和量化一起使用的效果要好于剪枝或量化单独使用时的效果。
下图是不同压缩方法下模型准确率和压缩率的关系,可以看到,剪枝和量化一起使用时的效果是最佳的。
在这里插入图片描述
下图则是量化前是否进行剪枝对最终量化结果的影响。
在这里插入图片描述

CENTROID INITIALIZATION

作者比较了三种聚类中心初始化方法对模型最终结果的影响,如下图
在这里插入图片描述
可以看到,uniform init优于其余两种方法。

SPEEDUP AND ENERGY EFFICIENCY

作者指出,deep compression主要用于对延迟比较敏感的场合,需要设备作出实时的反应,因此,batchsize不等于1是不符合实际应用场景的,下面讨论batchsize=1下的情况。
我们知道,在卷积神经网络中,FC层占据了整个网络超过90%的权重参数,因而本文的模型压缩方法主要还是对FC层起作用,为了比较Deep Compression前后的差别,我们把主要目光聚焦在全连接层,作者在三个平台上进行了实验,分别是
1.NVIDIA GeForce GTX Titan X as desktop processor
2.Intel Core i7 5930K as desktop processor
3.NVIDIA Tegra K1 as mobile processor
下图显示了不同平台上剪枝后模型的Speeding up

在这里插入图片描述
下图显示了不同平台上剪枝前后的Energy Efficiency
在这里插入图片描述
此外,作者还讨论了是否进行Batch Process的不同,如果进行Batch,那么每次读入一个矩阵,并和权重矩阵相乘,访存为 O ( n 2 ) O(n^2) O(n2),计算为 O ( n 3 ) O(n^3) O(n3),则存储-计算比为 O ( 1 / n ) O(1/n) O(1/n),而如果不进行Batch,那么每次读入的是一个向量,和权重矩阵相乘,类似的可以得到存储-计算比为O(1),由此可见,不进行Batch时存储-计算比较低, S o   r e d u c i n g   t h e   m e m o r y   f o o t p r i n t   i s   c r i t i c a l   f o r   t h e   n o n − b a t c h i n g   c a s e . \color{#FF0000}{So~ reducing ~the ~memory ~footprint ~is ~critical~ for~ the ~non-batching~ case.} So reducing the memory footprint is critical for the nonbatching case.

RATIO OF WEIGHTS, INDEX AND CODEBOOK

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FPGA硅农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值