DEEP COMPRESSION: COMPRESSING DEEP NEURAL NETWORKS WITH PRUNING, TRAINED QUANTIZATION AND HUFFMAN

深入理解DEEP COMPRESSION: COMPRESSING DEEP NEURAL NETWORKS WITH PRUNING, TRAINED QUANTIZATION AND HUFFMAN CODING

摘要

神经网络是计算密集型和内存密集型的,这使得它们很难部署在硬件资源有限的嵌入式系统上。为了解决这一局限性,我们引入了“深度压缩”(deep compression),这是一种三级流水线:剪枝、训练量化和哈夫曼编码,它们协同工作,在不影响精度的情况下,将神经网络的存储需求降低35到49。我们的方法首先通过只学习重要的连接来修剪网络。接下来,我们量化权重以强制权重共享,最后,我们应用哈夫曼编码。在前两步之后,我们重新训练网络以微调剩余的连接和量化质心。修剪,将连接数减少9到13,然后将代表每个连接的比特数从32减少到5。在ImageNet数据集上,我们的方法将AlexNet所需的存储空间减少了35 ,从240MB减少到6.9MB,而不损失准确性。我们的方法将VGG-16的大小从552MB减小到11.3MB,同样不损失精度。这使得模型适合于片上SRAM缓存,而不是片外DRAM存储器。我们的压缩方法也有助于在应用程序大小和下载带宽受到限制的移动应用程序中使用复杂的神经网络。以CPU、GPU和移动GPU为基准,压缩网络具有3到4层的加速和3到7倍的能效。

剪枝:学习重要的连接,低于阈值的连接不学习; 可以减少连接数量
量化:量化权值可以通过权值共享,可以减少每一个连接的位数表达
重训练:重训练剩余的连接,和量化质心
降低内存带宽、降低存储带宽、提高推理速度、降低功耗

1.简介

深层神经网络已经发展成为计算机视觉任务的最先进技术(Krizhevsky等人,2012)(Simonyan&Zisserman,2014)。虽然这些神经网络非常强大,但是大量的权值消耗了大量的存储和内存带宽。例如,AlexNet Caffemodel超过200MB,VGG-16 Caffemodel超过500MB(BVLC)。这使得在移动系统上部署深度神经网络变得困难。

首先,对于百度和Facebook这样的移动第一公司来说,各种应用程序都是通过不同的应用程序商店进行更新的,他们对二进制文件的大小非常敏感。例如,App Store有“超过100 MB的应用程序在连接到Wi-Fi之前不会下载”的限制。因此,将二进制文件大小增加100MB的特性将比增加10MB的特性受到更多的关注。虽然在移动设备上运行深度神经网络有很多特性,诸如更好的隐私、更少的网络带宽和实时处理等,巨大的存储开销阻止了深层神经网络被整合到移动应用程序中。

第二个问题是能源消耗。运行大型神经网络需要大量的内存带宽来获取权重,并且需要大量的计算来进行点积运算,而这又会消耗大量的能量。移动设备受到电池的限制,使得诸如深度神经网络这样的耗电量大的应用很难部署。

大量的权值消耗了大量的存储和内存带宽,需要大量的内存带宽来获取权重
网络部署功耗大原因:能量消耗主要由内存访问控制,大量的运算

能量消耗主要由内存访问控制。在45nm CMOS工艺下,32位浮点加法消耗0:9pJ,32位SRAM缓存访问需要5pJ,而32位DRAM内存访问需要640pJ,这是add操作的3个数量级。大型网络不适合片上存储,因此需要更昂贵的DRAM访问。例如,运行一个10亿个连接的神经网络,以20fps的速度运行需要(20Hz)(1G)(640pJ)=12.8W,这远远超出了典型移动设备的功率范围。

我们的目标是减少在如此大的网络上运行推理所需的存储和能量,以便将其部署到移动设备上。为了实现这一目标,我们提出了“深度压缩”:一个三级流水线(图1),以保持原始精度的方式减少神经网络所需的存储量。首先,我们通过删除冗余连接来修剪网络,只保留信息最丰富的连接。接下来,对权重进行量化,使得多个连接共享相同的权重,因此只需要存储码本(有效权重)和索引。
最后,我们应用哈夫曼编码来利用有效权重的有偏分布。

三级流水线:
1.删除冗余连接来修剪网络,只保留信息最丰富的连接
2.接下来,对权重进行量化,使得多个连接共享相同的权重
3.只需要存储码本(有效权重)和索引
应用哈夫曼编码来利用有效权重的有偏分布

我们的主要观点是,剪枝和训练量化能够在不相互干扰的情况下压缩网络,从而获得惊人的高压缩率。它使得所需的存储空间如此之小(几兆字节),所有的权值都可以缓存在芯片上,而不是去片外DRAM,这是一个耗能的过程。基于“深度压缩”,EIE硬件加速器Han等人。(2016年)后来被提议在压缩模型上工作,实现了显著的加速和能效改进。

目标:
1.剪枝和训练量化能够在不相互干扰的情况下压缩网络达到高压缩率
2.所有权值存储在SRAM而不是DRAM(存储在DRAM上读取的过程功耗比较大)  

2. 网络修剪

为了压缩CNN模型,网络剪枝已经得到了广泛的研究。在早期的研究中,网络修剪被证明是降低网络复杂性和过度拟合的有效方法(LeCun等人,1989;Hanson&Pratt,1989;Hassibi等,1993;Str¨om,1997)。最近,Han等人。(2015)删减了最先进的CNN模型,而不损失准确性。我们建立在这种方法之上。如图1左侧所示,我们首先通过正常的网络训练来学习连接性。接下来,我们修剪小权重连接:所有权重低于阈值的连接都将从网络中移除。最后,我们重新训练网络以学习剩余稀疏连接的最终权重。对于AlexNet和VGG-16模型,剪枝减少了9和13个参数。

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

在这里插入图片描述

我们使用压缩稀疏行(CSR)或压缩稀疏列(CSC)格式存储修剪后产生的稀疏结构,这需要2a+n+1个数字,其中a是非零元素的数量,n是行或列的数量。

为了进一步压缩,我们存储索引差而不是绝对位置,并将此差异编码为8位用于conv层,5位用于fc层。当我们需要一个大于边界的索引差时,我们使用图2所示的零填充解决方案:如果差异超过8,即最大的3位(例如)无符号数,我们添加一个填充零。

剪枝:修剪后会产生稀疏结构,使用CSR或CSC格式来存储,大小为2a+n+1(a为非零元素个数,n是行或列) 通过存储索引差来索引位置,索引差最大为8,如果是索引差是8,其值填0(否则越界)conv层编码索引差为8位,fc层为5位

在这里插入图片描述

在这里插入图片描述

例如,图3显示了具有四个输入单元和四个输出单元的单层神经网络的权重。最初有4 x 4=16个权重,但只有4个共享权重:相似的权重被组合在一起以共享相同的值。最初我们需要储存16个权值,每个权值有32位,现在我们只需要存储4个有效权重(蓝色、绿色、红色和橙色),每个都有32位,加上16个2位索引,压缩率为16 x32/(4 x 32+2 x 16)=3.2

3. 量化训练和权重共享

网络量化和权重共享通过减少表示每个权重所需的比特数来进一步压缩修剪后的网络。我们通过让多个连接共享相同的权重来限制需要存储的有效权重的数量,然后对这些共享权重进行微调。
图3显示了权重分担。假设我们有一个有4个输入神经元和4个输出神经元的层,权重是一个4 4矩阵。左上角是4 4权重矩阵,左下角是4 4梯度矩阵。权重被量化为4个仓位(用4种颜色表示),同一个仓位中的所有权重共享相同的值,因此对于每个权重,我们只需要在共享权重表中存储一个小索引。在更新过程中,所有渐变按颜色分组并相加,乘以学习速率并从上一次迭代的共享质心中减去。对于删减的AlexNet,我们可以量化每个CONV层到8位(256个共享权重),每个FC层量化为5位(32个共享权重),而不会损失任何精度。

网络量化:减少表示每个权重所需的比特数来进一步压缩修剪后的网络 权值共享:让多个连接共享相同的权重 来限制需要存储的有效权重的数量,然后对这些共享权重进行微调。

图3:左上角的矩阵为权值矩阵,权值矩阵相同颜色的值相加求平均,他们都共享这个平均值作为他们的权值,  对于每个权重,我们只需要在共享权重表中存储一个小索引(cluster index)(索引值的存储位数用log(k)位来表示,k个共享权值)。还有存储k个共享权值(32位)

我们可以量化每个CONV层到8位(256个共享权重),每个FC层量化为5位(32个共享权重) -----意思是conv层有258个共享权值,索引值用8位来表示,然后存储256个共享权值(32位)

为了计算压缩率,有k个集群(共享权值的个数),我们只需要[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在这里插入图片描述
个比特数去存储索引值。通常,对于具有n个连接且每个连接用b位表示的网络,将连接限制为只有k个共享权重将导致压缩率为:

在这里插入图片描述

例如,图3显示了具有四个输入单元和四个输出单元的单层神经网络的权重。最初有4 x 4=16个权重,但只有4个共享权重:相似的权重被组合在一起以共享相同的值。最初我们需要储存16个权值,每个权值有32位,现在我们只需要存储4个有效权重(蓝色、绿色、红色和橙色),每个都有32位,加上16个2位索引,压缩率为16 x32/(4 x 32+2 x 16)=3.2

3.1 权值共享

我们使用k-均值聚类来确定训练后的网络各层的共享权值,使得属于同一簇的所有权值共享相同的权值。权重不会跨层共享。我们将n个原始权重[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在这里插入图片描述
分成k个簇[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在这里插入图片描述
,n >> k,从而使簇内平方和(WCSS)最小化:

在这里插入图片描述

与HashNet(Chen et al.,2015)不同的是,在网络看到任何训练数据之前,权重共享是由散列函数确定的,我们的方法是在网络完全训练后确定权重共享,从而共享的权重近似于原始网络。

通过k-均值聚类的方法来确定训练后的网络各层的共享权值,使得属于同一簇的所有权值共享相同的权值。权重不会跨层共享。

3.2 共享权重初始化

质心初始化影响聚类的质量,进而影响网络的预测精度。我们研究三种初始化方法:Forgy(随机)、基于密度的初始化和线性初始化。在图4中,我们在AlexNet中绘制了conv3层的原始权重分布(蓝色为CDF,红色为PDF)。网络剪枝后权值呈双峰分布。在底部,它用3种不同的初始化方法绘制了有效权重(质心)(以蓝色、红色和黄色显示)。在这个例子中,有13个集群。

在这里插入图片描述

  • Forgy(random)初始化从数据集中随机选择k个观测值,并将这些作为初始质心。初始化的质心显示为黄色。由于双峰分布中存在两个峰,Forgy方法倾向于集中在这两个峰附近。
  • 基于密度的初始化在y轴上线性间隔权重的CDF,然后找到与CDF的水平交点,最后找到x轴上的垂直交点,该交点成为质心,如蓝色圆点所示。这种方法使两个峰值附近的质心更密集,但比前述方法更分散。
  • 线性初始化将质心线性间隔在原始权重的[min,max]之间。与前两种方法相比,这种初始化方法对权值的分布具有不变性,是最分散的方法。

较大的权重比较小的权重起着更重要的作用(Han等人,2015),但这些权重较大的权重较少。因此,对于随机初始化和基于密度的初始化,很少有质心具有较大的绝对值,这导致这几个大权重的表示不好。线性初始化不受此问题的影响。实验部分比较了精度对不同的初始化方法进行聚类和微调后,表明线性初始化效果最好。

使用k-均值聚类的方法来确定共享权值,k-均值聚类的好换决定了量化的质量,影响网络的预测精度;质心初始化影响聚类的质量,进而影响网络的预测精度。线性的初始化方式具有更好的效果
K-Means算法思想简单,效果却很好,是最有名的聚类算法。
聚类算法的步骤如下:  
1:初始化K个样本作为初始聚类中心;  
2:计算每个样本点到K个中心的距离,选择最近的中心作为其分类,直到所有样本点分类完毕;  
3:分别计算K个类中所有样本的质心,作为新的中心点,完成一轮迭代。 通常的迭代结束条件为新的质心与之前的质心偏移值小于一个给定阈值。

3.3 前馈和反向传播

一维k-means聚类的质心是共享权重。在前向和后向传播阶段有一级间接寻址查找权重表。为每个连接存储共享权重表的索引。在反向传播过程中,计算每个共享权重的梯度并用于更新共享权重。这个过程如图3所示。

在这里插入图片描述

在这里插入图片描述

4. 哈夫曼编码

哈夫曼码是一种最佳的前缀码,通常用于无损数据压缩(Van Leeuwen,1976)。它使用可变长度的码字来编码源符号。该表由每个符号的出现概率导出。更常见的符号用更少的比特表示。
图5显示了AlexNet中最后一个完全连通层的量化权重和稀疏矩阵索引的概率分布。两种分布都是有偏的:大多数量化权重分布在两个峰值附近;稀疏矩阵指数差很少超过20。实验表明,用哈夫曼编码这些非均匀分布的值可以节省20%——30%的网络存储。

在这里插入图片描述

哈夫曼编码参考

通过哈夫曼编码的方式编码权重索引值,这样可以进一步压缩索引值的存储位数,从而进一步压缩网络

5.实验

我们对四个网络进行了剪枝、量化和哈夫曼编码:两个在MNIST上,两个在ImageNet数据集上。修剪前后的网络参数和精度-1如表1所示。压缩管道跨不同网络将网络存储节省35 到49 而不损失准确性。AlexNet的总大小从240MB减小到6.9MB,足够小,可以放入片上SRAM中,无需将模型存储在能耗高的DRAM内存中。

训练是在Caffe框架下进行的(Jia等人,2014年)。修剪是通过向blob添加一个掩码来实现的,以屏蔽修剪后的连接的更新。量化和权重共享通过保持存储共享权重的码书结构来实现,并在计算每个层的梯度后按索引分组。每个共享权重都会使用落入该桶中的所有渐变进行更新。哈夫曼编码不需要训练,在所有的微调完成后就可以离线实现。

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

我们首先用LeNet-300-100和LeNet-5网络对MNIST数据集进行了实验(LeCun等人,1998)。LeNet-300-100是一个完全连接的网络,有两个隐藏层,分别是300和100个神经元,在Mnist上达到1.6%的错误率。LeNet-5是一个具有两个卷积层和两个完全连通层的卷积网络,在Mnist上可以达到0.8%的错误率。表2和表3显示了压缩管道的统计数据。压缩率包括码本和稀疏索引的开销。大部分的节省来自修剪和量化(压缩32 ),而哈夫曼编码提供了一个边际增益(压缩40 )

对四个网络进行了剪枝、量化和哈夫曼编码:LENET-300-100 AND LENET-5 在MNIST上,ALEXNET和VGG-16在ImageNet数据集上。结果如表一

在这里插入图片描述

5.2 ALEXNET ON IMAGENET

我们进一步研究了ImageNet ILSVRC-2012数据集的深度压缩性能,该数据集有1.2M训练示例和50k验证示例。我们使用AlexNet-Caffe模型作为参考模型,它有6100万个参数,前1名的准确率为57.2%,前5名的准确率为80.3%。表4显示,AlexNet可以压缩到原始大小的2.88%,而不会影响精度。每个CONV层有256个共享权重,用8位编码;每个FC层有32个共享权重,仅用5位编码。相对稀疏索引用4位编码。哈夫曼编码压缩了额外的22%,结果总共压缩了35 。

AlexNet可以压缩到原始大小的2.88%,而不会影响精度。每个CONV层有256个共享权重,用8位编码;每个FC层有32个共享权重,仅用5位编码。相对稀疏索引用4位编码。哈夫曼编码压缩了额外的22%,结果总共压缩了35倍。

在这里插入图片描述

5.3 VGG-16 ON IMAGENET

在AlexNet上取得了令人满意的结果,我们还研究了一个更大、更新的网络,VGG-16(Simonyan&Zisserman,2014),在同一个ILSVRC-2012数据集上。VGG-16有更多的卷积层,但仍然只有三个完全连接的层。按照类似的方法,我们积极压缩卷积层和完全连接层,以实现有效权重的显著减少,如表5所示。

VGG16网络整体压缩了49倍。CONV层的权值用8位表示,FC层用5位表示,不影响精度。最大的两个完全连接的层可以被修剪到小于其原始大小的1.6%。这种减少对于实时图像处理非常关键

在这里插入图片描述

VGG16网络整体压缩了49 。CONV层的权值用8位表示,FC层用5位表示,不影响精度。最大的两个完全连接的层可以被修剪到小于其原始大小的1.6%。这种减少对于实时图像处理非常关键,因为在图像中很少重用这些层(与批处理不同)。这对于快速目标检测算法也很关键,其中一个CONV通道由多个FC通道使用。减少的层将适合片上SRAM,并具有适度的带宽要求。如果不减少带宽,带宽要求是禁止的

6.讨论

6.1修剪和量化协同工作

图6显示了在不同压缩率下,修剪和量化一起或单独的精确度。单独工作时,如紫色和黄色线所示,当压缩到原始大小的8%以下时,修剪网络的精度开始显著下降;当压缩到原始大小的8%以下时,量化网络的精度也开始显著下降。但当合并时,如红线所示,网络可以压缩到原始大小的3%,而不会损失精度。在最右边比较了SVD的结果,SVD虽然便宜,但是压缩率很低。

图7中的三个图显示了CONV层(左)、FC层(中间)和所有层(右)的每个连接的比特数是如何降低的。每个图都报告了前1名和前5名的精确度。虚线只应用量化而不进行修剪;实线同时进行量化和修剪。两者之间差别不大。这表明剪枝与量化一起工作得很好。

修剪和量化一起或单独的精确度。当压缩到原始大小的8%以下时,修剪网络的精度开始显著下降;当压缩到原始大小的8%以下时,量化网络的精度也开始显著下降。但当合并时,如红线所示,网络可以压缩到原始大小的3%,而不会损失精度。

在这里插入图片描述

在这里插入图片描述

图7中的前两个图显示CONV层比FC层需要更多的精度。对于CONV层,量化到4位以下精度显著下降,而FC层更健壮:直到2位精度才显著下降。

图7中的前两个图显示CONV层比FC层需要更多的精度。对于CONV层,精度显著下降到4位以下,而FC层更健壮:

直到2位精度才显著下降。

6.2质心初始化

图8比较了三种不同的初始化方法相对于前1个精度(左)和前5个精度(右)的精度。网络被量化为2 ~ 8位,如x轴所示。除3位外,线性初始化在所有情况下都优于密度初始化和随机初始化

在这里插入图片描述

在这里插入图片描述

线性初始化的初始质心在x轴上均匀分布,从最小值到最大值。剪枝在保持较大权值方面比保持较大权重更为重要。(2015年)。随机初始化和基于密度的初始化都不会保留较大的质心。由于这些初始化方法的质心较大,所以聚类权重较小。相比之下,线性初始化允许较大的权重有更好的机会形成较大的质心。

6.3加速和能效

深度压缩针对的是运行在移动设备上的延迟极大的应用程序,这需要实时推理,例如在自主车辆内的嵌入式处理器上检测行人。等待批处理组装会显著增加延迟。因此,在对性能和能效进行基准测试时,我们考虑批量大小=1的情况。分批情况见附录A。

全连通层在模型尺寸上占主导地位(90%以上),通过深度压缩得到的压缩量最大(VGG-16中96%的权重被剪除)。在最先进的目标检测算法中,如fast R-CNN(Girshick,2015),未压缩模型上FC层的计算时间消耗高达38%。因此,在FC层上进行基准测试很有意思,看看深度压缩对性能和能量的影响。因此,我们在AlexNet和VGG-16的FC6、FC7、FC8层上设置了我们的基准。在非批处理的情况下,激活矩阵是一个只有一列的向量,因此计算可以归结为原始/修剪模型的稠密/稀疏矩阵向量乘法。由于目前在CPU和GPU上的BLAS库不支持间接查找和相对索引,所以我们没有对量化模型进行基准测试。

我们比较了三种不同的现成硬件:NVIDIA GeForce GTX Titan X和Intel Core i7 5930K作为桌面处理器(与NVIDIA Digits Dev Box相同的软件包)和作为移动处理器的NVIDIA Tegra K1。为了在GPU上运行基准测试,我们使用cuBLAS GEMV作为原始密集层。对于修剪后的稀疏层,我们将稀疏矩阵以CSR格式存储,并使用了在GPU上进行稀疏矩阵向量乘法优化的cuSPARSE CSRMV内核。为了在CPU上运行基准测试,我们使用MKL CBLAS GEMV作为原始的稠密模型,MKL SPBLAS CSRMV用于修剪稀疏模型。

要比较不同系统之间的功耗,必须以一致的方式测量功率(NVIDIA,b)。在我们的分析中,我们比较了整个应用处理器(AP)/SOC和DRAM组合的预调节能力。在CPU上,这个基准测试运行在一个带有一个Haswell-E类核心i7-5930K处理器的单插槽上。CPU插槽和DRAM电源由Intel提供的pcm电源实用程序报告。对于GPU,我们使用nvidia smi实用程序报告Titan X的功率。对于移动GPU,我们使用Jetson TK1开发板,并使用功率计测量总功耗。我们假设15%的AC-to-DC转换损耗,85%的调节器效率和15%的外围元件功耗(NVIDIA,a)来报告Tegra K1的AP+DRAM功率。

表6:AlexNet在不同的权重分配和量化攻击性下的准确度。8/5位量化没有精度损失;8/4位量化,更易于硬件使用,其精度损失可忽略不计,为0.01%;4/2位量化导致1.99%和2.60%的精度损失。

在这里插入图片描述

全连通层在模型尺寸上占主导地位(90%以上),通过深度压缩得到的压缩量最大(VGG-16中96%的权重被剪除),在最先进的目标检测算法中,如fast R-CNN(Girshick,2015),未压缩模型上FC层的计算时间消耗高达38%。

9.总结

我们提出了“深度压缩”,即在不影响精度的情况下压缩神经网络。我们的方法是修剪不重要的连接,使用权重共享量化网络,然后应用哈夫曼编码。我们重点介绍了我们在AlexNet上的实验,它在不损失准确性的情况下,将重量存储减少了35倍。对于VGG-16和LeNet网络,我们给出了相似的结果,在不损失精度的情况下,压缩了49 倍和39 倍。这导致将convnets放入移动应用程序的存储需求更小。经过深度压缩后,这些网络的大小适合片上SRAM缓存(5pJ/存取),而不需要片外DRAM内存(640pJ/存取)。这有可能使深度神经网络在移动设备上运行更节能。
我们的压缩方法也有助于在应用程序大小和下载带宽受到限制的移动应用程序中使用复杂的神经网络。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值