DEEP COMPRESSION

韩松 ICLR2016 best paper
论文链接:https://doi.org/10.48550/arXiv.1510.00149
参考链接:https://zhuanlan.zhihu.com/p/242859828
关键词:剪枝 权值共享 权值量化
本文原文链接:https://www.yuque.com/xianghao-tb5u4/lqyxog/ueeyh3


0 Abstract

神经网络是计算密集型和内存密集型的,这使得它们很难部署在硬件资源有限的嵌入式系统上。为了解决这一限制,我们引入了深度压缩,一种三阶段的管道:修剪、训练量化和霍夫曼编码,它们一起工作,在不影响其准确性的情况下,将神经网络的存储需求减少35倍至49倍。我们的方法首先通过只学习重要的连接来修剪网络。然后对权重进行量化,实现权重共享,最后采用Huffman编码。在前两步之后,我们重新训练网络来微调剩余的连接和量子化的质心。剪枝,减少连接数9到13;然后量化将表示每个连接的比特数从32减少到5。在ImageNet数据集上,我们的方法将AlexNet所需的存储空间减少了35倍,从240MB减少到6.9MB,而不损失精度。我们的方法将VGG-16的大小从552MB减少了49倍到11.3MB,同样没有损失精度。这允许将模型放入片内SRAM缓存而不是片外DRAM存储器中。我们的压缩方法还有助于在应用程序大小和下载带宽受限的移动应用程序中使用复杂的神经网络。以CPU、GPU和移动GPU为基准,压缩网络具有3到4倍layer-wise的加速和3到7倍的能源效率。

1 Introduction

深度神经网络已经发展成为计算机视觉任务的最先进技术(Krizhevsky等人,2012)(Simonyan &Zisserman, 2014)。虽然这些神经网络非常强大,但大量的权重消耗相当大的存储和内存带宽。例如,AlexNet的Caffemodel超过200MB, VGG-16的Caffemodel超过500MB (BVLC)。这使得深度神经网络在移动系统上的部署变得困难。
首先,对于许多移动优先的公司,如百度和Facebook,各种应用程序通过不同的应用程序商店更新,他们对二进制文件的大小非常敏感。例如,App Store有限制,超过100mb的应用在连接Wi-Fi之前不能下载。因此,将二进制大小增加100MB的特性将比增加10MB的特性受到更多的审查。尽管在移动设备上运行深度神经网络有许多很棒的特性,比如更好的隐私性、更少的网络带宽和实时处理,但巨大的存储开销阻止了深度神经网络被整合到移动应用程序中。

第二个问题是能源消耗。运行大型神经网络需要大量的内存带宽来获取权值,并且需要进行大量的点积运算,而点积运算又会消耗大量的能量。移动设备受到电池的限制,使得深度神经网络等耗电量大的应用程序难以部署。
能源消耗主要是内存访问。在45nm CMOS技术下,一个32位浮点加法运算消耗0.9pJ,一个32位SRAM缓存访问需要5pJ,而一个32位DRAM内存访问需要640pJ,这是一个加法运算的3个数量级。大型网络不适合片上存储,因此需要更昂贵的DRAM访问。例如,运行一个10亿连接的神经网络,在20fps的情况下,仅DRAM访问就需要(20Hz)(1G)(640pJ) = 12.8 W——远远超出了一个典型的移动设备的功率范围。
我们的目标是减少在这样的大型网络上运行推断所需的存储和能量,以便它们可以部署在移动设备上。为了实现这一目标,我们提出了深度压缩:一个三段式pipeline(图1),以保持原始精度的方式减少神经网络所需的存储。首先,我们通过删除冗余的连接来精简网络,只保留最有信息的连接。接下来,将权值量化,以便多个连接共享相同的权值,因此只需要存储代码本(有效权值)和索引。最后,我们采用霍夫曼编码来利用有效权值的偏置分布。
我们的主要见解是,修剪和训练量化能够在不相互干扰的情况下压缩网络,从而导致惊人的高压缩率。它使所需的存储如此之小(几兆字节),所有的权重都可以缓存在芯片上,而不是去消耗能量的芯片外DRAM。基于深度压缩,EIE硬件加速器Han et al.(2016)在压缩模型上工作,实现了显著的加速和能效提升。

2 Network Pruning

网络剪枝在压缩CNN模型方面得到了广泛的研究。在早期的工作中,网络剪枝被证明是降低网络复杂性和过拟合的有效方法(LeCun et al., 1989;汉森,普拉特,1989;Hassibi等人,1993年;Str om, 1997)。最近Han等人(2015)修剪了最先进的CNN模型,不损失精度。我们以这种方法为基础。如图1左侧所示,我们通过普通网络训练来学习连接性。接下来,我们修剪小权值连接:所有权值低于阈值的连接都从网络中删除。最后,我们重新训练网络来学习剩余稀疏连接的最终权值。修剪后AlexNet和VGG-16模型的参数减少了9x和13x。

在这里插入图片描述

我们使用压缩稀疏行(CSR)或压缩稀疏列(CSC)格式存储修剪后的稀疏结构,这需要2a+n+1个数字,其中a为非零元素的数量,n为行或列的数量。为了进一步压缩,我们存储索引差值而不是绝对位置,并对conv层和fc层分别编码为8位和5位。当我们需要一个比边界更大的索引差值时,我们使用图2所示的零填充解决方案:如果差值超过8,即最大的3位无符号数,我们添加一个填充零。这里具体的压缩方法见参考文章。

在这里插入图片描述

3 Trained Quantization And Weight Sharing

网络量化和权值共享通过减少表示每个权值所需的比特数,进一步压缩了修剪后的网络。我们通过让多个连接共享相同的权重来限制需要存储的有效权重的数量,然后对这些共享的权重进行微调。权重共享如图3所示。假设我们有一层有4个输入神经元和4个输出神经元,权值是一个4 x 4矩阵。左上角是权重矩阵,左下角是梯度矩阵。权重被量化为4个容器(用4种颜色表示),同一个容器中的所有权重共享相同的值,因此对于每个权重,我们只需要将一个小的索引存储到共享权重表中。在更新过程中,所有的梯度按颜色分组并相加,乘以学习率并减去上次迭代的共享质心。对于修剪后的AlexNet,我们能够量化为每个CONV层8位(256个共享权值),每个FC层5位(32个共享权值),而不会损失任何精度。为了计算压缩率,给定k个簇,我们只需要log2(k)位来编码索引。一般来说,对于一个有n个连接的网络,每个连接用b比特表示,限制每个连接只有k个共享权值,压缩率为
r = n b n l o g 2 ( k ) + k b r = \frac{nb}{nlog_2(k) + kb} r=nlog2(k)+kbnb
例如,图3显示了一个具有四个输入单元和四个输出单元的单层神经网络的权值。本来有4x4 = 16个权重,但只有4个共享权重:相似的权重被分组在一起共享相同的值。
在这里插入图片描述

最初我们需要存储16个权重,每个权重有32位,现在我们只需要存储4个有效权重(蓝色,绿色,红色和橙色),每个权重有32位,加上16个2位索引,压缩率为 16 × 32 / 4 × 32 + 2 × 16 16\times32/4\times 32 + 2 \times 16 16×32/4×32+2×16

3.1 Weight Sharing

我们使用k-means聚类来确定一个训练好的网络的每一层的共享权值,这样所有落在同一个聚类中的权值将共享相同的权值。各层之间不共享权重。将n个原始权重 W = { w 1 , w 2 , . . . , w n } W = \{w_1, w_2, ..., w_n\} W={w1,w2,...,wn}划分成k个簇 C = { c 1 , c 2 , . . . , c k } C = \{ c_1, c_2, ..., c_k\} C={c1,c2,...,ck},使聚类内平方和(WCSS)最小。
arg ⁡ min ⁡ C ∑ i = 1 k = C ∣ w − c i ∣ 2 \arg\min_{C} \sum_{i=1}^{k=C}\vert w-c_i \vert^2 argminCi=1k=Cwci2
不同于HashNet (Chen et al., 2015)在网络看到任何训练数据之前由哈希函数确定权值共享,我们的方法在网络完全训练后确定权值共享,这样共享的权值就近似于原始网络。

3.2 Initialization of Shared Weights

Centroid初始化会影响聚类的质量,进而影响网络的预测精度。我们研究了三种初始化方法:Forgy(随机)、density-based的和linear-based初始化。在图4中,我们绘制了AlexNet中conv3层的原始权重分布(蓝色为CDF分布函数,红色为PDF概率密度函数)。网络剪枝后,权值呈双峰分布。在底部,它绘制了3个不同的有效权重(质心)。
在这里插入图片描述

**Forgy(随机)初始化:**从数据集中随机选取k个观测值作为初始质心。初始化的质心显示为黄色。由于双峰分布中有两个峰,所以Forgy法倾向于集中在这两个峰附近。
**基于密度的初始化:**线性分隔y轴上权重的CDF,然后找到与CDF的水平交点,最后找到x轴上的垂直交点,它成为一个质心,如蓝色的圆点所示。该方法使两个峰附近的质心密度增大,但比Forgy方法更分散。
**线性初始化:**线性空间之间的质心[最小,最大]的原始权重。与前两种方法相比,这种初始化方法对权重的分布不受影响,是最分散的一种方法。
较大的权重比较小的权重发挥更重要的作用(Han等人,2015),但这些较大的权重的数量较少。**因此对于Forgy初始化和基于密度的初始化,很少有质心的绝对值很大,这导致这少数大的权重不能很好地表示。(如何理解?->应该尽量让值相近的权重值共用一个值,如果这个值较大,这些权重就会一并删掉)**线性初始化不会受到这个问题的影响。
实验部分比较了聚类和微调后不同初始化方法的精度,结果表明线性初始化效果最好。

3.3 Feed-forward and Back-propagation

一维k-means聚类的质心为共享权值。在前馈阶段和反向传播阶段查找权重表有一个间接层次。为每个连接存储共享权重表中的一个索引。在反向传播过程中,计算每个共享权值的梯度,并用于更新共享权值。这个过程如图3所示。损失用L表示,第i列第j行权重用Wij表示,这是Wij单元的质心指数用Iij表示,这层的第k个质心用Ck表示。利用指示函数计算质心的梯度为
在这里插入图片描述

注解:这部分主要解释fine-tune阶段如何计算梯度并更新权重,直观理解就如图3,用公式表达即如上式子。
问:在fine-tune阶段,梯度是小数,而权重是已经量化的整数,那么应当如何更新权重?直接更新会否让权重再次变成小数导致每次权重更新之后都需要再进行一次量化,还是fine-tune阶段完结之后再进行二次量化?
**推测:**可能量化之后模型在fine-tune之前对每一个权重存储了weight和weight_buffer,weight用于存储float,weight_buffer用于存储int,在fine-tune正向推理时用的是weight_buffer中的int,在反向传播更新梯度时使用的是weight中的float,weight更新后weight_buffer之后也会根据上述方法随之更新。

4 Huffman coding

霍夫曼码是一种最优的前缀码,通常用于无损数据压缩(Van Leeuwen, 1976)。它使用变长码字来编码源符号。该表是根据每个符号出现的概率得出的。更常见的符号用更少的比特表示。

在这里插入图片描述

图5给出了AlexNet中量化权重的概率分布和最后一层全连通层的稀疏矩阵指标。两种分布都是有偏的:大部分量化的权重分布在两个峰周围;稀疏矩阵指数差很少在20以上。实验表明,对这些非均匀分布的值进行霍夫曼编码可以节省20% - 30%的网络存储空间(如何理解)

注解:根据稀疏矩阵的分布,又根据Huffman encoding,我们可以将出现次数较多的权重索引进一步采用较短的bit位进行表示,频率较低的用较长的bit位进行编码,由此进一步降低我们对weight index的存储占用空间。

5 Experiments

我们修剪、量化和霍夫曼编码了四个网络:两个在MNIST上,两个在ImageNet数据集上。修剪前后的网络参数和accuracy-1如表1所示。压缩pipeline在不同的网络上节省了35x到49x的网络存储,而不损失精度。AlexNet的总大小从240MB减少到6.9MB,可以放入片内SRAM中,因此不需要存储在消耗能量的DRAM中。
使用Caffe框架进行训练(Jia等,2014)。修剪是通过向blob添加一个掩码来实现的,以屏蔽修剪后的连接的更新。量化和权重共享通过维护一个存储共享权重的码本结构来实现,并在计算每层的梯度后按索引分组。每个共享的权重都通过属于该bucket的所有梯度进行更新。霍夫曼编码不需要训练,在所有微调完成后脱机实现。
具体实验结果数据略。

6 Discussions

6.1 Pruning and Quantization Working Together

图6显示了在不同压缩率下,同时或单独进行修剪和量化的准确率。当单独工作时,如图紫色和黄色线所示,当压缩到原始尺寸的8%以下时,修剪后的网络的精度开始显著下降;当压缩到原始尺寸的8%以下时,量化网络的精度也开始显著下降。但是当合并后,如红线所示,网络可以压缩到原始尺寸的3%,而不损失精度。在最右侧比较了SVD的结果,这是廉价的,但有较差的压缩率。
对比了剪枝、量化、剪枝+量化、SVD的精度损失。
image.png
图7中的三个图显示了CONV层(左)、FC层(中)和所有层(右)在每个连接的比特数更少的情况下,准确度是如何下降的。每个plot都报告top-1和top-5的准确度。虚线只应用量化,但没有修剪;实线同时进行量化和修剪。两者之间差别很小。这表明,修剪与量化很好地工作。图7中的前两个图显示CONV层比FC层需要更多的精度位。对于CONV层,精度显著下降到4比特以下,而FC层的鲁棒性更强:直到2比特精度才显著下降。
验证全连接层、卷积层的权重表示从int8bit逐渐降低位数之后对精度的影响,事实证明,bit数在8位之后还可以继续下降到一定程度。
image.png

6.2 Centroid Initialization

图8比较了三种不同初始化方法相对于top-1精度(左)和top-5精度(右)的精度。网络被量化为2~8位,如图x轴所示。线性初始化在除3比特外的所有情况下都优于密度初始化和随机初始化。线性初始化的初始质心平均分布在x轴上,从最小值到最大值。这有助于保持较大的权值,因为较大的权值比较小的权值发挥更重要的作用,这在网络剪枝Han et al.(2015)中也得到了证明。随机初始化和基于密度的初始化都不能保留大的质心。利用这些初始化方法,由于大的权值很少,将大的权值聚类到小的质心上。相反,线性初始化允许较大的权值有更好的机会形成较大的质心。
注解:这部分实验证明了相比于random/density-based initialization,linear initializatio在剪枝中发挥了更重要的作用。
image.png

6.3 Speedup And Energy Effiency(非重点阅读,简单翻译工作)

“深度压缩”针对的是运行在移动设备上的高度关注延迟的应用程序,这需要实时推断,例如自动驾驶汽车内的嵌入式处理器上的行人检测。等待批处理组装会显著增加延迟。因此,在对性能和能源效率进行基准测试时,我们考虑批batch_size = 1的情况。批处理情况见附录A。
全连接层在模型尺寸中占主导地位(超过90%),深度压缩压缩最多(VGG-16中96%的权值被修剪)。在最先进的目标检测算法,如Fast R-CNN (Girshick, 2015),高达38%的计算时间消耗在FC层的非压缩模型。因此,在FC层上进行基准测试是很有趣的,可以看到深度压缩对性能和能量的影响。因此,我们在AlexNet和VGG-16的FC6、FC7、FC8层上设置了基准。在非批处理的情况下,激活矩阵是一个只有一列的向量,因此计算可以归结为原始模型和剪枝模型的密集/稀疏矩阵-向量乘法。由于当前CPU和GPU上的BLAS库不支持间接查找和相对索引,因此我们没有对量化模型进行基准测试。
我们比较了三种不同的现货硬件:作为桌面处理器的NVIDIA GeForce GTX Titan X和作为移动处理器的Intel Core i7 5930K(与NVIDIA数字开发盒相同的软件包)和NVIDIA Tegra K1。为了在GPU上运行基准测试,我们对原始密集层使用cuBLAS GEMV。对于修剪后的稀疏层,我们将稀疏矩阵以CSR格式存储,并使用cuSPARSE CSRMV内核,该内核在GPU上进行了稀疏矩阵向量乘法优化。为了在CPU上运行基准测试,我们使用MKL CBLAS GEMV用于原始密集模型,使用MKL SPBLAS CSRMV用于修剪后的稀疏模型。
为了比较不同系统之间的功耗,以一致的方式测量功耗是很重要的(NVIDIA, b)。对于我们的分析,我们正在比较整个应用处理器(AP) / SOC和DRAM组合的预调节功耗。在CPU上,该基准测试运行在单个套接字上,使用单个Haswell-E类Core i7-5930K处理器。CPU插座和DRAM电源由Intel提供的pcm电源实用程序报告。对于GPU,我们使用nvidia-smi实用程序报告Titan x的功耗。对于移动GPU,我们使用Jetson TK1开发板,并使用功率计测量总功耗。我们假设在报告Tegra K1的AP+DRAM电源时,交流电到直流转换损耗为15%,稳压器效率为85%,外围组件(NVIDIA, a)消耗的功率为15%。
有批处理和没有批处理时,内存访问与计算特性的比率是不同的。当输入激活被批处理到一个矩阵时,计算变成了矩阵-矩阵乘法,其中局部可以通过分块来改进。矩阵可以被阻塞以适应缓存并有效地重用。在这种情况下,内存访问量为O(n2),计算量为O(n3),内存访问和计算之间的比例为1/n。
在不允许批处理的实时处理中,输入激活为单个向量,计算为矩阵向量乘法。在这种情况下,内存访问量是O(n2),计算量是O(n2),内存访问和计算量是相同的大小(与1/n相反)。这表明MV比MM更受内存限制。因此,减少内存占用对于非批处理情况至关重要。
图9演示了在不同硬件上进行修剪的速度。每个基准测试有6列,显示CPU / GPU / TK1在密集/剪枝网络上的计算时间。时间归一化为CPU。当batch size = 1时,修剪后的网络层比密集网络平均提高3到4倍速度,因为它的内存占用更小,减轻了数据传输开销,特别是对于无法放入缓存的大型矩阵。例如我们实验中最大的VGG16’s FC6层,它包含 25088 × 4096 × 4 B y t e s ≈ 400 M B 25088 \times 4096 \times 4 Bytes \approx 400MB 25088×4096×4Bytes400MB的数据,远远达不到L3缓存的容量。
image.png
在那些允许延迟的应用程序中,批处理改善了内存的局部性,其中权重可以在矩阵-矩阵乘法中被阻塞和重用。在这种情况下,修剪后的网络不再显示它的优势。我们在附录A中给出了详细的计时结果。
图10展示了在不同硬件上修剪的能量效率。我们将功耗与计算时间相乘得到能源消耗,然后归一化到CPU得到能源效率。当batch size = 1时,修剪后的网络层在密集网络上平均消耗3 ~ 7倍能量。据nvidia-smi报道,稠密和稀疏情况下的GPU利用率都是99%。
image.png

6.4 Ratio Of Weights, Index And Codebook(非重点阅读)

修剪使权值矩阵变得稀疏,因此需要额外的空间来存储非零元素的索引。量化为代码本增加了存储空间。实验部分已经包括了这两个因素。图11显示了量化四个网络时三个不同组件的分解。因为权重和稀疏索引平均都用5位编码,它们的存储大约是一半一半。代码本的开销非常小,通常可以忽略不计。
比较对比了不同网络的权重、索引、Codebook的占用比例
image.png
image.png

7 Related Work

神经网络通常是过度参数化的,深度学习模型存在显著的冗余(Denil et al., 2013)。这将导致计算和内存使用量的浪费。有各种各样的建议来消除冗余:
Vanhoucke等人(2011)探索了使用8位整数(vs 32位浮点)激活的定点实现。Hwang,Sung(2014)提出了一种具有三元权值和3bit激活的定点网络的优化方法。Anwar等人(2015)使用L2误差最小化对神经网络进行量化,并在MNIST和CIFAR-10数据集上取得了更好的精度。Denton等人(2014)利用神经网络的线性结构,找到适当的低秩参数逼近,并将精度保持在原始模型的1%以内。
本文的经验成功与理论研究的+1/0/-1权值的类随机稀疏网络(Arora et al., 2014)是一致的,这些网络被证明具有很好的特性(如可逆性),并允许一个可证明的多项式时间算法进行训练。
很多工作都集中在将网络参数放入存储桶中,只需要存储存储桶中的值。HashedNets(Chen et al., 2015)通过使用哈希函数随机分组连接权值来减少模型大小,从而使同一哈希桶内的所有连接共享一个单一的参数值。在他们的方法中,权值的划分是由哈希函数预先确定的,而不是通过训练来学习的,这不能捕捉到图像的本质。Gong等人(2014)使用矢量量化压缩深度卷积,导致1%的精度损失。两种方法都只研究了全连通层,忽略了卷积层。
也有其他尝试通过用全局平均池化取代全连接层来减少神经网络参数的数量。Network architecture(Lin et al., 2013) 和GoogLenet(Szegedy et al., 2014)的网络通过采用这种想法,在几个benchmark上取得了SOTA的结果。然而,迁移学习,即重用在ImageNet数据集中学习的特性,并通过只微调全连接层将其应用到新任务中,在这种方法中更加困难。Szegedy等人(2014)注意到了这个问题,并促使他们在他们的网络顶部添加线性层以实现迁移学习。
网络剪枝被用于降低网络复杂度和减少过拟合。早期的修剪方法是偏置权重衰减(Hanson &普拉特,1989)。Optimal Brain Damage(LeCun et al., 1989)和Optimal Brain Suregeon(Hassibi et al., 1993)根据损失函数的Hessian修剪网络以减少连接数,并提出这种修剪比基于大小的修剪(如重量衰减)更准确。最近的一项工作(Han et al., 2015)成功地修剪了几种最先进的大型网络,并表明参数的数量可以减少一个数量级。也有尝试减少压缩和加速的激活数量Van Nguyen等人(2015)。

8 Future Work

虽然经过剪裁的网络已经在各种硬件上进行了基准测试,但权重共享的量化网络还没有进行基准测试,因为现成的cuSPARSE或MKL SPBLAS库不支持间接矩阵条目查找,也不支持CSC或CSR格式的相对索引。因此,深度压缩在缓存中适合模型的全部优势还没有完全展现出来。一种软件解决方案是编写支持此功能的定制GPU内核。一种硬件解决方案是构建定制的ASIC架构,专门遍历稀疏量化的网络结构,也支持定制的量化位宽。我们希望这种架构的能量以片内SRAM访问为主,而不是片外DRAM访问。

9 Conclusion

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

看完的话点个赞哦,谢谢!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Milk_exe

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

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

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

打赏作者

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

抵扣说明:

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

余额充值