COMPRESSING DEEP CONVOLUTIONAL NETWORKS USING VECTOR QUANTIZATION 论文笔记

  • 摘要

深度卷积神经网络(CNN)已成为最有前途的物体识别方法,近年来反复展示了图像分类和物体检测的破纪录结果。然而,非常深的CNN通常涉及具有数百万个参数的许多层,使得网络模型的存储非常大。这限制在资源有限的硬件上使用深度CNN,尤其是手机或其他嵌入式设备。在本文中,我们通过研究用于压缩CNN参数的信息理论矢量量化方法来解决该模型存储问题。特别地,我们已经发现在压缩大多数存储要求密集的连接层方面,矢量量化方法比现有的矩阵分解方法具有明显的增益。简单地将k均值聚类应用于权重或进行product量化可以在模型大小和识别准确度之间实现非常好的平衡。对于ImageNet挑战中的1000类别分类任务,我们能够使用最先进的CNN实现16-24倍的网络压缩,只有1%的分类精度损失。

  • 压缩紧密的连接层

在本节中,我们考虑两类压缩密集连接层中的参数的方法。 我们首先考虑矩阵分解方法,然后介绍矢量量化方法。

  • 矩阵分解法

我们首先考虑矩阵分解方法,这些方法已被广泛用于加速CNN(Denton等,2014)以及压缩线性模型中的参数(Denton等,2014)。 特别地,我们考虑使用奇异值分解(SVD)来分解参数矩阵。 给定一个密集连通层中的参数W ,我们将其分解为(公式见论文)

为了使用两个小得多的矩阵近似W,我们可以在U和V中选择具有相应特征值的前k个奇异向量,以重建W:(公式见论文)

SVD的近似由沿着S中的特征值的衰减控制.SVD方法在Frobenius范数的意义上是最优的,其最小化了近似矩阵和原始W之间的MSE误差。两个低秩矩阵U'和V'以及特征值必须存储因此,给定m,n和k的压缩率计算为mn = k(m + n + 1)。

  •  向量量化

  1.二值化

  我们从量化参数矩阵的最简单方法开始。 给定参数W,我们采用矩阵的符号作为量化结果。

  这种方法主要受到Dropconnect(Wan et al。,2013)的启发,它在训练期间将部分参数(神经元)随机设置为0。 在这里,我们采取更积极的方法,如果它是正的,则打开每个神经元,当它是负的时将其关闭。 从几何角度来看,假设密集连接层是一组超平面,我们实际上是将每个超平面四舍五入到最近的坐标。 该方法将数据压缩32倍,因为每个神经元由一位表示。

  2.使用k-means进行标量量化

  另一种简单的方法是对参数执行标量量化。 对于W,我们可以将其所有标量值收集为w,并对值进行k-means聚类(公式见论文)

  其中w和c都是标量。 在聚类之后,w中的每个值被分配一个聚类索引,并且可以由聚类中心的c形成码本。 在预测期间,我们可以直接在c中查找每个wij的值。 因此,重建矩阵是:(公式见论文)

  对于这种方法,我们只需要将索引和码本存储为参数。 给定k个中心,我们只需要log2(k)位来编码中心。 例如,如果我们使用k = 256个中心,则每个簇索引只需要8位。 因此,压缩率是32 = log2(k),假设我们使用原始W的浮点数并假设码本本身可以忽略不计。 尽管这种方法很简单,但我们的实验表明,这种方法在压缩参数方面具有令人惊讶的良好性能

  3.Product 量化

  接下来,我们考虑用于压缩参数的结构化矢量量化方法。 特别是,我们考虑使用product量化(PQ)(Jegou等,2011),它探讨了向量空间中结构的冗余。 PQ的基本思想是将向量空间划分为许多不相交的子空间,并在每个子空间中执行量化。 由于假设每个子空间中的向量都是冗余的并且通过在每个子空间中执行量化,我们能够更好地探索冗余结构。 具体来说,给定矩阵W,我们将它逐列分成几个子矩阵:(公式见论文)

  注意,PQ可以应用于矩阵的x轴或y轴。 在我们的实验中,我们评估了两种情况。

  对于这种方法,我们需要为每个子向量存储索引和码本。 特别是,与标量量化情况相反,这里的码本不可忽略。

  4.Residual 量化

  我们考虑的第三种量化方法是残差量化(Chen et al。,2010),它是结构化量化的另一种形式。 基本思想是首先将矢量量化为k个中心,然后递归地量化残差。 例如,给定一组向量wi,在第一阶段,我们首先使用k-means聚类将它们量化为k个不同的向量:(公式见论文)

  每个向量wz将由其最近的中心c1j表示。 接下来,我们计算所有数据点的wz和c1j之间的残差r1z,并将残差矢量r1z递归地量化为k个不同的码字c2j。 最后,可以通过在每个阶段添加相应的中心来重建矢量:(公式见论文)

  5.其他方法和讨论

  上述(KM,PQ和RQ)是用于压缩矩阵的三种不同类型的矢量量化方法。 KM仅捕获每个神经元的冗余(单个标量); PQ探索了一些局部冗余结构; 并且RQ试图探索权重向量之间的全局冗余结构。 研究学习参数的行为中存在哪种冗余将是有趣的。

  许多基于学习的二值化或product量化方法是可用的,例如Spectral Hashing(Weiss等人,2008),Iterative Quantization(Gong等人,2012)和Catesian kmeans(Norouzi&Fleet,2013)等。 然而,它们不适合于该特定任务,因为我们需要存储非常大的学习参数矩阵(例如,旋转矩阵)。 因此,我们不考虑本文中的其他方法。 在执行PQ时探索W中的结构也很有趣。 特别是,因为在不同滤波器的一组输出上学习W,所以将来自特定滤波器的输出分组在一起或将来自不同滤波器的特定维度分组在一起可能是有趣的。 然而,在我们的初步调查中,我们在进行PQ时通过探索这种结构没有发现任何改善。 因此,我们按默认顺序对这些维度进行分组。

  • 实验
  • 实验设置

  我们在ILSVRC2012基准图像分类数据集上评估了这些不同的方法。 该数据集包含来自1000个对象类别的100多万个训练图像。 它还具有20,000个图像的验证集,每个类别包含20个图像。 我们对标准训练集进行了训练,对参数进行了压缩,并在验证集上进行了测试。

  我们使用的卷积神经网络,来自Zeiler&Fergus(2013),包含5个卷积层和3个密集连接层。 首先将所有输入图像调整为最小尺寸257,之后我们对进行随机裁剪到分辨率为225X225。 然后将图像馈送到5个不同的卷积层中,各自的滤波器尺寸为7,5,3,3和3.前两个卷积层之后是局部响应归一化层和最大池化层。 此时我们已经获得了三个完全连接的尺寸为9216X2048,2048X2048和2048X1000的层。我们在这里使用的非线性函数是RELU。 在70个epochs之后,网络在1个GPU上训练了大约5天。 学习率从0.02开始,每5-10个epochs减半; 重量衰减设定为0.0005;动量设定为0.9。

  为了评估不同的方法,我们使用验证集上的分类准确度作为评估协议。 我们使用精度@ 1和精度@ 5来评估不同的参数压缩方法。 目标是在相同的压缩率下得到更高的精度或相同的精度实现更高的压缩率。

  • Product 量化分析

  我们首先对基于PQ的参数压缩进行了分析,因为PQ有几个不同的参数。 我们使用了不同数量的簇k = 4;8; 16(对应于2; 3; 4位)。 对于每个固定的k,我们显示不同段尺寸(列)尺寸s = 1;2;3; 4的结果,它将压缩率从低变为高。 如3.2.3节所述,我们能够对x轴或y轴执行PQ,因此显示两种情况的结果。 我们将在对齐分段大小时比较不同的PQ方法,并将它们与对齐的压缩率进行比较。

  对于不同的轴对准,图1和图2(图见论文)中报告了精度@ 1的结果。 从图1中的结果可以看出,通过使用更多的中心k和更小的段大小s,我们能够获得更小的分类误差。 例如,在图1中,红色曲线的分类错误总是比其他方法小得多。 该结果与先前对PQ的观察结果一致(即,在每个片段中使用更多中心通常可以获得较低的量化误差率)。 但是,当我们考虑码本的大小并测量相同压缩率的准确度时,如图2所示,我们发现使用更多的中心并不总是有帮助的

  因为他们会积极地增加码本的大小。 例如,当我们使用k = 16个中心时,分类误差显然不低于我们使用较少数量的聚类时(例如k = 8)。 这种差异是因为码本本身使用了太多的存储空间,并且压缩率非常低。 当我们比较压缩x轴和y轴的结果时,x轴的结果略好一些。 这种改进可能是因为x轴有更多的尺寸,这使得码本尺寸更大,从而减少了信息的损失。 在下一组实验中,我们将中心数量固定为8(每段3位),因为这种方法在压缩率和准确度之间实现了良好的平衡。

  • 整体比较

  下面的图3包含了我们在此介绍的所有量化方法的比较。 与上面的部分类似,我们提出了与压缩率有关的分类错误。 对于没有要调谐的参数的二进制量化,压缩率为32.对于PQ,我们每段使用8个中心并改变每个段的维度(从1到4)以实现不同的压缩率。 对于kmeans(KM),我们将簇的数量从1改为32以实现32和1之间的压缩率。对于SVD,我们改变输出维度以实现不同的压缩率。 RQ的表现不尽如人意; 在这里,我们仅报告256个中心的结果,其中t = 2; 3次迭代。 我们还尝试使用较少数量的RQ中心,但发现性能更差。

  精度@ 1和精度@ 5都显示在图3中,我们看到这两个数字的趋势是一致的。 特别是,SVD在压缩和加速卷积层方面取得了令人瞩目的成果(Denton等,2014),但在压缩密集连接层方面效果不佳。 这种差异主要是因为仍然需要为SVD存储两个分解矩阵,

  这不是为节省存储而优化的。 有些令人惊讶的是,kmeans虽然简单,但却能很好地完成这项任务。 我们能够使用KM实现4-8倍的压缩率,同时保持精度损失在1%以内。 应用PQ等结构化量化方法可以进一步提高KM的结果以外的性能。 对于RQ,我们发现它无法实现非常高的压缩率,主要是因为码本大小太大。 给定相同的压缩率,其准确性也比其他方法差得多。 最后,最简单的二值化方法运行得相当好。 我们无法改变其压缩率,但考虑到相同的压缩率,其性能可与KM或PQ相媲美。 此外,它的存储非常简单。 因此,当目标是非常极度地压缩数据时,这种方法也是一个不错的选择。

  KM,PQ和RQ之间的比较提出了一些有趣的见解。 首先,KM工作得相当好,可以在不牺牲性能的情况下实现下降压缩率。 这些结果表明每个神经元之间存在相当大的冗余。 应用PQ工作得更好,这意味着在这些权重矩阵中存在非常有意义的子向量局部结构。 RQ对于这样的任务非常糟糕,这可能意味着这些权重向量中的全局结构很少。

  • 单层误差分析

  我们还对压缩每个单层的分类错误率进行了额外的分析,同时将其他层固定为未压缩。 结果报告在图4中(仅适用于精度@ 1)。 我们发现压缩第八层和第九层隐藏层通常不会导致性能显着下降,但压缩第十层和最终分类层会导致精度下降得多。 将所有三个层压缩在一起通常会导致更大的误差,尤其是当压缩率很高时。 最后,一些样本预测结果如图5所示。

  • 应用于图像检索

  本节介绍了压缩CNN在图像检索中的应用,以验证压缩网络的泛化能力。 在实际的工业应用中,许多情况下不允许将照片上传到服务器,或者将大量照片上传到服务器是不可承受的。 实际上,由于带宽限制,我们只能将一些处理过的数据(例如,图像的特征或散列)上传到服务器。 鉴于上面压缩的CNN,我们能够在手机端使用压缩的CNN处理图像,并通过仅上载处理的特征在数据库侧执行检索。

  我们在Holidays数据集上进行了实验(Jegou等,2008)。 这是一个广泛使用的标准基准数据集,用于图像检索,包含500个不同实例的1491个图像; 每个实例包含2-3个图像。 查询图像的数量固定为500; 其余用于填充数据库。 我们使用平均精度(mAP)来评估不同的方法。 我们使用每个压缩的CNN模型从最后一个隐藏层生成2048维激活特征,并将它们用作图像检索的特征。 我们使用余弦距离来测量图像特征之间的相似性。

  根据表1的结果,不同方法的趋势与分类结果相似; 即,PQ始终比其他方法更好地工作。 一个令人惊讶的发现是,具有2个中心(1位)的kmeans给出了高结果 - 甚至高于原始特征(我们还验证了方差为0.1%)。 然而,这是一个特殊情况,可能是因为应用程序是接近重复的图像检索,并且因为将值量化为二进制对于小图像变换更加稳健。 然而,因为我们的目标是最好地重建原始权重矩阵,这种二元kmeans案例的改进确实表明它不是一个非常准确的近似。 我们在这里没有报告RQ的结果,因为它的性能非常差。

  总之,我们发现矢量量化CNN可以安全地应用于图像分类以外的问题。

  • 讨论

  我们已经解决了在嵌入式系统中应用矢量量化来压缩深度卷积神经网络的存储问题。 我们的工作系统地研究了如何压缩深度卷积神经网络的10^8个参数,以节省模型的存储。 与之前考虑使用矩阵分解方法的方法不同,我们提出研究一系列用于压缩参数的矢量量化方法。 我们发现通过简单地使用kmeans对参数值进行标量量化,我们能够获得8-16的参数压缩率,而不会超过0.5%top5精度损失。 此外,通过使用结构化量化方法,我们能够将参数进一步压缩多达24倍,同时将前五精度的损失保持在1%以内。

  通过压缩参数超过20倍,我们解决了在嵌入式设备中应用最先进的CNN的问题。 鉴于具有大约200MB参数的最先进模型,我们能够将它们减少到不到10MB,这使我们能够轻松部署这些模型。 本文的另一个有趣的含义是我们的实证结果证实了Denil等人的研究结果(2013)即CNN中的有用参数约为5%(我们能够将它们压缩约20倍)。

  将来,在嵌入式设备上探索压缩模型的硬件高效操作以加速计算将是有趣的。 将微调应用于压缩层以提高性能也很有趣。 虽然本文主要关注压缩密集连接层,但研究是否可以应用相同的矢量量化方法来压缩卷积层将是有趣的。

 

posted @ 2019-01-16 17:36  赌书香  阅读(793)  评论(0编辑  收藏  举报