DEEP COMPRESSION: COMPRESSING DEEP NEURAL NETWORKS WITH PRUNING, TRAINED QUANTIZATION AND HUFFMAN CODING 论文笔记

  • 摘要

  神经网络既是计算密集型又是内存密集型,使得它们难以部署在具有有限硬件资源的嵌入式系统上。为了解决这个限制,我们引入了“深度压缩”,一个三阶段流水线:修剪,训练量化和霍夫曼编码,它们协同工作以减少神经网络的存储需求,在不影响他们的准确性的基础上能够压缩35到49倍。我们的方法首先通过仅学习重要的连接来修剪网络。接下来,我们量化权重以强制权重共享,最后,我们应用霍夫曼编码。在前两步之后,我们重新训练网络以微调剩余的连接和量化的质心。修剪,减少连接数量9到13倍。量化,然后将表示每个连接的位数从32减少到5.在ImageNet数据集上,我们的方法将AlexNet所需的存储空间减少了35倍,从240MB减少到6.9MB,而不会降低精度。我们的方法将VGG-16的尺寸缩小了49倍,从552MB到11.3MB,再次没有损失准确性。这允许将模型拟合到片上SRAM缓存而不是片外DRAM存储器。我们的压缩方法还有助于在应用程序的大小和下载带宽受限的移动应用程序中使用复杂的神经网络。基于CPU,GPU和移动GPU的基准测试,压缩网络能做到3到4倍分层加速和3到7倍更好的能源效率。

  • 网络剪枝

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

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

  为了进一步压缩,我们存储索引差而不是绝对位置,用卷积层的8位和fc层的5位来编码差值。 当我们需要一个大于界限的索引差时,我们的零填充解决方案如图2所示(图请见论文):如果差值超过8,最大的3位(作为示例)无符号数,我们添加填充零。

  • 训练量化和权重共享

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

  权重分配如图3所示。假设我们有一个有4个输入神经元和4个输出神经元的层,权重是4X4矩阵。 在左上方是4X4权重矩阵,在左下方是4X4梯度矩阵。 权重被量化为4个区间(用4种颜色表示),同一个区间中的所有权重共享相同的值,因此对于每个权重,我们需要仅将小的索引存储到共享权重表中。 在更新期间,所有渐变按颜色分组并且相加在一起,乘以学习速率并从上次迭代中的共享质心中减去。 对于经过修剪的AlexNet,我们能够为每个CONV层量化为8位(256个共享权重),并为每个FC层量化5位(32个共享权重),而不会有任何精度损失。

  为了计算压缩率,给定k个簇,我们只需要log2(k)位来编码索引。 通常,对于具有n个连接的网络,并且每个连接用b比特表示,将连接约束为仅具有k个共享权重将导致以下压缩率:(公式见论文)

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

  • 权重共享

  我们使用k均值聚类来识别训练网络的每个层的共享权重,以便落入同一群集的所有权重将共享相同的权重。 权重不是跨层共享的。 我们分割n个原始权重W 到k个聚类中心,以便最小化参数与聚类中心的平方和(WCSS):(公式见论文)

  与HashNet不同(Chen et al。,2015),哈希的权重共享是在网络看到任何训练数据之前由哈希函数确定的,我们的方法在网络完全训练之后确定权重共享,使得共享权重接近原始网络。

  • 初始化共享权重

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

   Forgy(随机)初始化从数据集中随机选择k个观测值并将其用作初始质心。 初始化的质心以黄色显示。 由于双峰分布中存在两个峰,因此Forgy方法倾向于集中在这两个峰周围。

   基于密度的初始化线性地将权重的CDF在y轴上间隔开,然后找到与CDF的水平交点,最后在x轴上找到垂直交点,其变为质心,如蓝点所示。 这种方法使质心在两个峰值周围更密集,但比Forgy方法更加分散。

  线性初始化线性地将原始权重的[min,max]之间的质心隔开。 这种初始化方法对于权重的分布是不变的,并且与前两种方法相比是最分散的。

  较大的重量比较小的重量起着更重要的作用(Han et al。,2015),但这些较大的重量较少。 因此,对于Forgy初始化和基于密度的初始化,非常少的质心具有大的绝对值,这导致这些少量大权重的不良表示。 线性初始化不会遇到此问题。  实验部分比较了聚类和微调后不同初始化方法的准确性,表明线性初始化效果最好。

  • 前向传播和反向传播

  一维k均值聚类的质心就是是“共享权重”。 在前馈阶段和反向传播阶段期间存在一级间接查找权重表。 为每个连接存储共享权重表的索引。 在反向传播期间,计算每个共享权重的梯度并用于更新共享权重。 该过程如图3所示。(图见论文)

  • 哈夫曼编码

  霍夫曼代码是通常用于无损数据压缩的最佳前缀代码(Van Leeuwen,1976)。 它使用可变长度码字来编码源符号。 哈夫曼表来自每个符号的发生概率。 更常见的符号用更少的比特表示。

  图5显示了AlexNet中量化权重的概率分布和最后一个完全连接层的稀疏矩阵索引。 两种分布都是有偏差的:大多数量化权重分布在两个峰值周围; 稀疏矩阵索引差异很少超过20.实验表明,对这些非均匀分布值进行编码的霍夫曼可以节省20%~30%的网络存储量。

  • 实验

  我们修剪,量化和霍夫曼编码了四个网络:两个在MNIST上,两个在ImageNet数据集上。 修剪前后的网络参数和精度如表1(见论文)所示。压缩管道在不同网络中将网络存储空间节省35到49,而不会降低精度。 AlexNet的总大小从240MB减少到6.9MB,这足够小,可以放入SRAM,无需将模型存储在耗能的DRAM内存中。

  使用Caffe框架进行训练(Jia et al。,2014)。 通过向blob添加掩码来实现修剪,以掩盖已修剪连接的更新。 通过维护存储共享权重的码本结构以及在计算每个层的梯度更新索引之后来实现量化和权重共享。 每个共享权重都使用与之相关的所有梯度进行更新。 霍夫曼编码不需要训练,并且在完成所有微调之后离线实施。

  • MNIST数据集上的LENET-300-100和LENET-5框架

  我们首先使用LeNet-300-100和LeNet-5网络对MNIST数据集进行了实验(LeCun等,1998)。 LeNet-300-100是一个完全连接的网络,有两个隐藏层,分别有300和100神经元,在mnist数据集上只有1.6%的错误率。

  LeNet-5是一个卷积网络,具有两个卷积层和两个完全连接的层,在Mnist上只有0.8%的错误率。 表2和表3显示了压缩过程的统计信息。 压缩率包括码本和稀疏索引的开销。 大部分节省来自修剪和量化(压缩32X),而霍夫曼编码提供边际增益(压缩40X)

  • IMAGENET数据集上的ALEXNET框架

  我们在ImageNet ILSVRC-2012数据集上进一步检查深度压缩的性能,该数据集具有1.2M训练样例和50k验证样例。 我们使用AlexNet Caffe模型作为参考模型,该模型具有6100万个参数,并且实现了top1精度57.2%和top5精度80.3%。 表4(见论文)显示,AlexNet可以压缩到其原始大小的2.88%,而不会影响准确性。 每个CONV层中有256个共享权重,它们用8比特编码,每个FC层有32个共享权重,仅用5比特编码。 相对稀疏的索引用4位编码。 压缩的霍夫曼编码额外压缩了22%,总共压缩了35倍。

  • IMAGENET数据集上的VGG-16框架

  看到在AlexNet上的有希望的结果,我们还在同一个ILSVRC-2012数据集上验证了更大更新的网络VGG-16(Simonyan&Zisserman,2014)。 VGG-16具有更多的卷积层,但仍然只有三个完全连接的层。 按照类似的方法,我们积极压缩卷积层和完全连接层,以实现有效权重数量的显着减少,如表5所示(见论文)。

  VGG16网络整体压缩了49倍。 CONV层中的权重用8bits表示,FC层使用5bits,这不会影响精度。 两个最大的完全连接层每个都可以修剪到其原始尺寸的不到1.6%。 这种减少对于实时图像处理至关重要,在图像处理中这些图层的重复使用很少(与批处理不同)。 这对于快速物体检测算法也很关键,其中许多FC通道使用一个CONV通道。 减少的层将适合在SRAM上使用并满足适度的带宽要求。 如果没有减少,带宽要求就会受到限制。

  • 讨论
  • 剪枝和量化协同工作

  图6(见论文)显示了在一起或单独进行修剪和量化的不同压缩率下的精度。 当单独工作时,如紫色和黄色线所示,当压缩到原始尺寸的8%以下时,修剪网络的准确度开始显着下降; 当压缩低于其原始大小的8%时,量化网络的准确度也开始显着下降。 但是当组合时,如红线所示,网络可以压缩到原始大小的3%而不会损失准确性。 在最右侧比较了SVD的结果,这是方便实现但压缩率差的。

  图7中的三个图显示了CONV层(左),FC层(中)和所有层(右)的每个连接的bits减少时精度如何下降。 每个图都报告了top1和top5的准确度。 虚线仅应用量化但没有修剪; 实线同时进行量化和修剪。 两者之间差别很小。 这表明修剪和量化协同工作得很好。

  量化在修剪网络上运行良好,因为未经修剪的AlexNet有6000万个权重进行量化,而被修剪的AlexNet只有670万个权重进行量化。 给定相同数量的质心,后者具有较少的误差。

  图7中的前两个图表显示CONV层比FC层需要更多的精度。 对于CONV层,精度显着下降到4bits以下,而FC层更稳健:直到2bits才能显着降低精度。

  • 中心初始化

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

  线性初始化的初始质心在x轴上均匀分布,从最小值到最大值。 这有助于保持较大的权重,因为较大的权重比较小的权重发挥更重要的作用,这也在Han等人2015年)的网络修剪工作中显示随机和基于密度的初始化都不保留大的质心。 使用这些初始化方法,大权重被聚集到小质心,因为很少有大权重。 相反,线性初始化允许大权重更好地形成大质心。

  • 速度和能源效率

  Deep Compression针对在移动设备上运行的极其看重延迟的应用程序,这需要实时推断,例如在自动驾驶汽车内的嵌入式处理器上进行行人检测。 等待批处理组装会显著增加延迟。 因此,在对性能和能效进行基准测试时,我们考虑批量大小为1的情况。批量处理的情况见附录A.

  完全连接层是模型大小的主要部分(超过90%)并且通过深度压缩这部分(在VGG-16中修剪的96%权重)得到最大压缩。 在诸如快速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格式存储稀疏矩阵,并使用cuSPARSE CSRMV内核,该内核针对GPU上的稀疏矩阵向量乘法进行了优化。 为了在CPU上运行基准测试,我们使用MKL CBLAS GEMV作为原始密集模型,使用MKL SPBLAS CSRMV作为修剪后的稀疏模型。

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

  

猜你喜欢

转载自www.cnblogs.com/dushuxiang/p/10289232.html