MODEL COMPRESSION VIA DISTILLATION AND QUANTIZATION 论文笔记

  • 摘要

  深度神经网络(DNN)继续取得重大进展,解决从图像分类到翻译或强化学习的任务。受到相当大关注的领域的一个方面是在资源受限的环境中有效地执行深度模型,例如移动或嵌入式设备。本文重点讨论了这个问题,并提出了两种新的压缩方法,它们共同利用大型网络称为“教师”权重量化和蒸馏,进入压缩的“学生”网络。我们提出的第一种方法称为量化蒸馏,并在训练过程中利用蒸馏,将蒸馏损失(相对于教师网络表示)纳入较小的学生网络的训练,其权重被量化为有限的一组水平。第二种方法,可微分量化,通过随机梯度下降优化量化点的位置,以更好地适应教师模型的行为。我们通过卷积和循环体系结构的实验来验证这两种方法。我们表明,量化的浅学生可以达到与最先进的全精度教师模型相似的准确度水平,同时提供高达数量级的压缩,并且推理加速在深度减少中几乎是线性的。总而言之,我们的结果使得资源受限环境的DNN能够利用在功能更强大的设备上开发的架构和精度提升。

  • 预处理
  • 量化过程

  我们首先定义一个缩放函数sc:R->[0; 1],将值从任意范围得到的矢量归一化为值为[0;1]给定这样的函数,量化函数的一般结构如下:(见论文公式1)

  缩放缩放功能有各种规格; 在本文中,我们将使用线性缩放,量化函数可以改写为论文公式2

  Bucketing该公式的一个问题是对于整个矢量使用相同的比例因子,其维度可能很大。 幅度不平衡会导致精度的显着损失,其中缩放矢量的大多数元素被推到零。 为避免这种情况,我们将使用分段,例如 Alistarh等人(2016),也就是说,我们将缩放函数分别应用于某个固定大小的连续值的bucketing。 这里的权衡是我们为每个bucketing获得更好的量化精度,但是必须为每个bucketing存储两个浮点缩放因子。 我们在第5节中描述了压缩比较。函数Q^也可以用几种方式定义。 我们将考虑量化点的均匀和非均匀放置。

  均匀量化。 我们固定了参数s≥1,描述了所采用的量化级数。 直观地,均匀量化考虑在0和1之间的s + 1个等间隔点(包括这些端点)。 确定性版本将每个(缩放的)矢量坐标vi分配给最接近的量化点,而在随机版本中,我们概率地执行舍入,使得得到的值是的vi的无偏估计,具有最小方差

  非均匀量化非均匀量化将一组量化点作为输入p1::: ps并将每个元素vi量化为这些点中最接近的点。 为简单起见,我们仅定义此函数的确定性版本。

  • 随机量化等于增加高斯噪声

  在本节中,我们列出了均匀量化函数的一些有趣的数学属性。 显然,随机均匀量化是其输入的无偏估计E[Q(v)]=v

  我们感兴趣的是将此功能应用于神经网络; 由于标量积是神经网络最常用的运算,我们想研究QT(v)•x的性质,其中v是网络中某个层的权重向量,x是输入。 见论文公式(5)

  这意味着量化权重等效于向每个层的输出(在激活函数之前)添加渐近正态分布的零均值误差项。 该误差项的方差取决于s。 这将量化与主张将噪声添加到神经网络的中间激活中作为正则化器联系起来,例如 Gulcehre等2016)

  • 量化蒸馏

  上下文如下:给定一项任务,我们考虑一个训练有素的最先进的深层模型来解决它 - 教师和压缩的学生模型。 学生被压缩的意思是1)它比老师浅; 2)它的量化是在其权重以有限的比特宽度表示的意义上。 标准蒸馏(Ba&Caruana,2013; Hinton等,2015)的策略是让学生利用训练好的教师模型达到类似的准确度。 我们注意到先前已经使用蒸馏来获得紧凑的高精度合奏编码(Hinton等,2015),我们相信这是第一次通过量化用于模型压缩。

  鉴于此设置,我们需要解决两个问题。 首先是如何将知识从老师转移到学生。 为此,学生将使用Hinton等人定义的蒸馏损失(2015),作为两个目标函数之间的加权平均值:具有软目标的交叉熵,由温度参数T控制,以及具有正确标签的交叉熵。 我们将读者推荐给Hinton等人。 (2015)关于蒸馏损失的精确定义。

  第二个问题是如何在量化神经网络的背景下使用蒸馏损失。一种直观的方法是依靠投影梯度下降,其中在全精度训练中采用梯度步骤,然后将新参数投影到一组有效解。关键的是,我们将每个投影步骤的误差累积到下一步的梯度中。人们可以将这个过程想象成收集每个权重是否需要移动到下一个量化点的证据。至关重要的是,如果梯度很小,误差累积会阻止算法卡在当前解决方案中,这会在天真的投影梯度方法中发生。这与BinaryConnect技术采用的方法类似,但存在一些差异。李等人(2017)也详细检查了这些动态。与BinnaryConnect相比,我们使用蒸馏而不是从头开始学习,因此学习更有效。我们也不限于二进制表示,而是使用可变的位宽量化功能和bucketing,如第2节中所定义。

  图1所示的该过程的另一种观点是,我们在全精度模型上执行SGD步骤,但计算量化模型上的梯度,表示相对于蒸馏损失。 考虑到这一切,我们提出的算法是:

  • 可区分的量化
  • 一般说明

  我们通过利用非均匀量化点放置,引入可微分量化作为提高量化神经网络精度的一般方法。 特别是,我们将使用2.1节中定义的非均匀量化函数。 实验上,我们发现在这种情况下随机和确定性量化之间几乎没有区别,因此这里将集中于更简单的确定性量化函数。

  令p =(p1; :::; ps)为量化点的矢量,并且让为我们的量化函数,如前所述。 理想情况下,我们希望找到一组量化点p,它们在使用Q(v; p)量化模型时最小化精度损失。 关键的观察是,为了找到这个集合p,我们可以使用随机梯度下降,因为我们能够计算Q相对于p的梯度。

  量化神经网络的一个主要问题是,pi应该替换给定权重的决定是离散的,因此梯度为零:∂Q(v; p)/∂v=0几乎无处不在:这意味着我们不能通过量化函数反向传播梯度。 为了解决这个问题,通常使用直通估计器的变体,参见例如 Bengio等(2013)Hubara等2016)另一方面,作为所选择的pi的函数的模型是连续的并且可以区分; 关于pj的Q(v; p)i的梯度几乎无处不在,并且很简单

  其中αi是缩放因子的第i个元素,假设我们使用的是bucketing方案。 如果没有使用bucketing,则αi =α。 否则它会根据权重vi所属的bucketing而改变。

  因此,我们可以使用我们在训练原始模型时使用的相同损失函数,并且利用上述公式和通常的反向传播算法,我们能够相对于量化点p计算其梯度。 然后我们可以使用标准SGD算法最小化关于p的损失函数。 然后算法变为以下:

  关于效率的说明优化点p可能比训练原始网络慢,因为我们必须执行正常的前向和后向传递,此外我们需要量化模型的权重并执行向后传递以获得p的梯度然而,根据我们的经验,差分量化需要一个数量级的迭代,以便收敛到一个好的解决方案,并且可以有效地实现。

  权重共享经过仔细检查,这种方法可以与权重共享联系起来,Han等人2015年权重共享使用k均值聚类算法来找到权重的良好聚类,采用质心作为聚类的量化点。 训练网络修改质心的值,以类似的方式聚合梯度。 不同之处在于对质心点的初始分配,更重要的是,质心的权重分配从未改变。 相反,在每次迭代时,我们将权重重新分配给最接近的量化点,并使用不同的初始化。

  • 讨论和附加的启发式

  虽然损失关于p是连续的,但是改变每个权重量化的方式时会产生间接影响。 这会对学习过程产生重大影响。 作为一个极端的例子,我们可以有退化,其中所有权重都由相同的量化点表示,使得学习变得不可能。 或者pi的多样性减少,导致非常少的权重以非常高的精度表示,而其余的权重被迫以更低的分辨率表示。

  为避免此类问题,我们依赖于以下一组启发式方法。 未来的工作将考虑为如何将pi分配给权重添加强化学习损失。

  选择好的起点初始化起始量化点的一种方法是使它们均匀间隔,这将对应于用作均匀量化函数的起始点。 可微分量化算法需要能够使用量化点来更新它; 因此,为了确保使用每个量化点,我们将点初始化为权重值的分位数。 这确保了每个量化点与相同数量的值相关联,并且我们能够更新它。

  在重要的位置重新分配位并非网络中的所有层都需要相同的准确度。 每个权重对最终预测的重要程度的度量是每个权重向量的梯度的范数。 因此,在初始阶段,我们运行前向和后向传递一定次数来估计每层中权重向量的梯度,我们计算多个minibatchs的平均梯度并计算范数; 然后,我们根据简单的线性比例分配与每个权重相关联的点数。 总之,我们估计

  我们使用此值来确定哪些层对量化最敏感

  使用此过程时,我们将在某些层中使用超过指定位数的值,而在其他层中使用的位数则更少。 我们可以通过使用霍夫曼编码来减少这种效应的影响,参见第5节; 在任何情况下,请注意,虽然点的总数保持不变,但如果图层具有较大比例的权重,则为图层分配更多点将增加整体位复杂度。

  使用蒸馏损失在上面描述的算法中,损失是指我们用于训练原始模型的损失。 另一种可能的规范是将未量化的模型视为教师模型,将量化模型视为学生,并将未量化和量化模型的输出之间的蒸馏损失用作损失。 在这种情况下,我们正在优化我们的量化模型,使其不是在原始损失方面表现最佳,而是模仿未量化模型的结果,这应该更容易学习模型并提供更好的结果。

  超参数优化上述算法是一个与原始算法非常相似的优化问题。 像往常一样,为了获得最佳结果,我们应该尝试使用超参数优化和不同的梯度下降变体。

  • 压缩

  我们现在分析使用b位和bucketing大小为k时节省的空间。 令f为全精度权重(32位)的大小,并且令N为“vector”的大小,我们正在量化。 全精度需要fN位,而量化矢量需要bN + 2fN/k。 (我们使用每权重b位,为每个bucketing加上缩放因子)。 因此,尺寸增加

  对于可微分量化,我们还必须存储量化点的值。 由于这个数字不依赖于N,所需的空间量可以忽略不计,为简单起见我们忽略它。 例如,在256个bucketing大小时,每个组件使用2个比特对于全精度可以节省14.2倍的空间,而4位可节省7.52倍的空间。 在512个bucketing大小时,2比特节省是15.05倍,而4比特产生7.75倍压缩。

  霍夫曼编码。 为了节省额外的空间,我们可以使用霍夫曼编码来表示量化值。 实际上,每个量化值可以被认为是指向全精度值的指针; 在非均匀量化的情况下是pk,在均匀量化的情况下是k = s。 然后,我们可以计算模型所有权重的每个索引的频率,并计算最佳霍夫曼编码。 最佳编码的平均比特长度是我们实际用于编码值的比特量。 这解释了附录中某些尺寸增益表中存在小数位。

  • 实验结果
  • 小数据集

  方法我们将从较小数据集的一组实验开始,这使我们可以更仔细地覆盖参数空间。 我们将以下方式描述的方法的性能进行比较:我们将教师模型,蒸馏模型和较小模型视为基线:蒸馏模型和较小模型具有相同的结构,但蒸馏模型在有老师网络的情况下使用蒸馏损失进行训练。而较小的模型直接训练目标。 此外,我们比较量化蒸馏和可微分量化的性能。 此外,我们还将在有和没有bucketing的情况下使用PM(“事后”)量化,其在训练之后均匀地量化权重而无需任何额外的操作。 所有结果都是在bucketing大小为256的情况下获得的,我们发现这些结果可凭经验提供良好的压缩精度权衡。 有关数据集和模型的详细信息,请参阅附录A.

  CIFAR-10实验对于CIFAR-10上的图像分类,我们测试了不同训练技术对蒸馏模型精度的影响,同时改变了CNN架构的参数,例如量化级别和模型大小。 表1包含全精度训练,有和没有bucketing的PM量化以及我们的方法的结果。 定义的学生模型的下方左侧的百分比分别是普通模型和蒸馏模型的精度(以全精度训练)。 更多细节见附录表11。 我们还尝试了一个额外的模型,其中学生比老师更深,在那里我们获得量化为4位的学生能够比老师获得更高的准确度,压缩率大于7倍。

  我们使用广泛的残差网络(Zagoruyko&Komodakis,2016)进行了可进行差分量化的额外实验,从而获得更高的精度; 见表3。

  总的来说,量化蒸馏似乎是在整个位宽和体系结构范围内具有最佳精度的方法。 它对于2位和4位量化显着优于PM,在较大的8bits学生模型上比教师的获得相差0.2%以内的准确度,在4位量化时实现相对较小的准确度损失。 在所有实验中,可微分量化是紧随其后的第二,但它具有更快的收敛速度。 此外,我们强调了在更高的位宽(4和8位)更简单的带bucketing的PM量化方法的良好准确性。

猜你喜欢

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