神经网络量化(三)

2.4 实际考虑因素

  当对具有多个层的神经网络进行量化时,我们面临着一个庞大的量化选择空间,包括量化方案、粒度和位宽。在本节中,我们探讨一些实际考虑因素,以帮助减少搜索空间。
  请注意,在本文中,我们只考虑均匀的位宽。这意味着无论是权重还是激活,所选择的位宽在所有层中保持不变。均匀的位宽在硬件上得到了更广泛的支持,但一些最近的研究也探索了异构位宽或混合精度的实现。

2.4.1 对称量化与非对称量化

  对于每个权重和激活的量化,我们必须选择一种量化方案。一方面,非对称量化更具表达力,因为有一个额外的偏移参数,但另一方面可能会有计算开销。为了理解为什么会出现这种情况,考虑当非对称权重 W ^ \hat{W} W^ = sw(Wint−zw)与非对称激活 x ^ \hat{x} x^ = sx(xint − zx)相乘时会发生什么:
公式 13

  第一个术语是如果两个操作都以对称格式存在时的情况。第三和第四个术语仅取决于比例、偏移和权重值,这些值是预先已知的。因此,这两个术语可以预先计算并以几乎没有成本的方式添加到层的偏置项中。然而,第二个术语取决于输入数据x。这意味着对于每个数据批次,在推断过程中我们需要计算一个额外的术语。这可能导致延迟和功耗方面的显著开销,因为这相当于添加了一个额外的通道。
  因此,一种常见的方法是使用非对称激活量化和对称权重量化,以避免额外的数据相关术语。

2.4.2 每张量和每通道量化

  在第2.2.3节中,我们讨论了不同级别的量化粒度。由于所有定点加速器都支持,权重和激活的每张量量化已经成为标准做法。然而,当权重的分布在通道之间有显著差异时,权重的每通道量化可以提高准确性。回顾方程(3)中的量化MAC操作,我们可以看到加速器可以通过应用单独的每通道权重比例因子来实现每通道权重量化,而无需重新缩放。激活的每通道量化要难得多,因为我们无法将比例因子从求和中分离出来,因此需要为每个输入通道重新缩放累加器。虽然权重的每通道量化越来越成为常见做法,但并非所有商用硬件都支持。因此,重要的是检查您的目标设备是否支持。

3 后训练量化

表 1

表1 对称均匀权重量化器不同范围设置方法的消融研究,同时保持激活值为FP32。在5次运行中的平均ImageNet验证准确率(%)

  后训练量化(PTQ)算法将预训练的FP32网络直接转换为定点网络,而无需原始训练流程。这些方法可以是无需数据的,或者可能需要一个小的校准集,这通常是容易获取的。此外,几乎没有超参数调整使得它们可以通过单个API调用作为黑盒方法来以计算效率的方式量化预训练的神经网络。这使得神经网络设计师不必成为量化专家,从而可以更广泛地应用神经网络量化。
  PTQ过程中的一个基本步骤是为每个量化器找到良好的量化范围。我们在第2.2节中简要讨论了量化范围的选择如何影响量化误差。在本节中,我们首先讨论了实践中常用的各种寻找良好量化参数的方法。然后,我们探讨了PTQ过程中常见的问题,并介绍了最成功的克服这些问题的技术。使用这些技术,我们提出了一个标准的后训练量化流程,在大多数常见场景中效果最好,并最后介绍了一组改进量化模型性能的调试步骤。

3.1 量化范围设置

  量化范围设置是指确定量化网格的截断阈值qmin和qmax(参见方程7)的方法。范围设置的关键权衡是截断和舍入误差(在第2.2节中描述),以及它们对每个配置的量化器的最终任务损失的影响。这里描述的每种方法在这两个量之间提供了不同的权衡。这些方法通常优化局部成本函数,而不是任务损失。这是因为在PTQ中,我们的目标是计算速度快的方法,而不需要端到端的训练。权重通常可以在不需要校准数据的情况下进行量化。然而,确定激活量化的参数通常需要一些批次的校准数据。
  最小-最大值法(Min-max)为了覆盖张量的整个动态范围,我们可以定义量化参数如下:
公式 14,15

其中V表示要量化的张量。这样可以避免截断误差。然而,这种方法对异常值很敏感,因为强烈的异常值可能导致过多的舍入误差。
  均方误差法(MSE)缓解大异常值问题的一种方法是使用基于均方误差的范围设置。在这种范围设置方法中,我们找到使原始张量和量化张量之间均方误差最小的qmin和qmax
公式 16
在这里, V ^ \hat{V} V^(qmin, qmax)表示V的量化版本,||.||F表示Frobenius范数。优化问题通常使用网格搜索、黄金分割法或具有闭式解的解析逼近方法来解决。文献中存在几种这种范围设置方法的变体,但它们在目标函数和优化方面都非常相似。
表 2

(表2 激活量化的不同范围设置方法的消融研究,同时保持权重为FP32。在5次运行中的平均ImageNet验证准确率(%))

交叉熵  对于某些层,被量化的张量中的所有值可能并不同等重要。一个这样的情况是分类网络中最后一层的logits量化,其中保留量化后最大值的顺序是重要的。均方误差可能不适合用于此,因为它将张量中的所有值都同等对待,而不考虑它们的顺序。对于更多类别的情况,通常会有大量不重要的小或负logits和少量重要的较大值。在这种情况下,均方误差会在试图减小较多小logits的量化误差的同时,对少量重要logits产生较大的量化误差。在这种特定情况下,有益的是最小化以下交叉熵损失函数:
公式 17

其中H(·, ·)表示交叉熵函数,ψ是softmax函数,v是logits向量。

基于BN的范围设置  激活量化的范围设置通常需要一些校准数据。如果一个层具有批归一化激活,激活的每个通道的均值和标准差等于学习到的批归一化偏移和缩放参数。可以使用以下方法找到适合激活量化器的参数:
公式 18,19
其中β和γ是每个通道学习到的偏移和缩放参数的向量,α > 0。使用α = 6,以便只剪裁大的异常值。

比较  在表1中,我们比较了权重量化的范围设置方法。对于高位宽,均方误差和最小-最大方法大致相当。然而,在较低位宽下,均方误差方法明显优于最小-最大方法。在表2中,我们对激活量化进行了类似的比较。我们注意到,均方误差与交叉熵结合的最后一层,表示为MSE + Xent,在较低位宽下优于其他方法。该表还清楚地展示了在最后一层使用交叉熵而不是均方误差目标的好处。

3.2 跨层均衡

  量化误差的一个常见问题是同一张量中的元素可能具有显著不同的大小。如前一节所讨论的,量化网格的范围设置试图在剪裁和舍入误差之间找到一个良好的平衡。不幸的是,在某些情况下,它们之间的大小差异非常大,以至于即使对于适度的量化(例如INT8),我们也无法找到一个合适的平衡。Nagel等人(2019)表明,这在深度可分离层中特别普遍,因为每个输出特征只有少数权重负责,这可能导致权重的变异性较大。此外,他们指出,批归一化折叠会加剧这种效应,并且可能导致与各种输出通道连接的权重之间存在较大的不平衡(见图5)。对于更细粒度的量化粒度(例如每通道量化),后者对于更广泛使用的按张量量化来说不是一个大问题。几篇论文(指出,具有深度可分离卷积的高效模型,如MobileNetV1和MobileNetV2,在PTQ下显示出显著下降甚至随机性能。
图 5

(图5 MobileNetV2中第一个深度可分离层在BN折叠后的每个(输出)通道的权重范围。箱线图显示了每个通道的最小值和最大值,第二和第三四分位数以及中位数。)

图 6

(图6 单通道重新缩放的示意图。将第一层的通道按比例因子si进行缩放,将导致第二层中等效通道的重新参数化为1/si。)

  Nagel等人(2019年)提出了一种解决这种不平衡问题的方法,而无需使用逐通道量化。Meller等人(2019年)在同时进行的工作中也提出了类似的方法。在这两篇论文中,作者观察到对于许多常见的激活函数(例如ReLU、PreLU),存在着正的缩放等变性:
公式 20
  其中s是非负实数。这种等变性对于任何一次齐次函数都成立,并且可以通过缩放其参数化(例如ReLU6)来扩展到任何分段线性函数。我们可以利用这种正的缩放等变性来处理神经网络中的连续层。给定两个层,h = f( W ( 1 ) W^{(1)} W(1)x + b ( 1 ) b^{(1)} b(1))和y = f( W ( 2 ) W^{(2)} W(2)h + b ( 2 ) b^{(2)} b(2)),通过缩放等变性,我们有:
公式 21

  其中S = diag(s)是一个对角矩阵,其值Sii表示神经元i的缩放因子si。这使我们可以重新参数化我们的模型,其中 W ( 2 ) W^{(2)} W(2)= W ( 2 ) W^{(2)} W(2)S, W ( 1 ) W^{(1)} W(1) = S ( − 1 ) S^{(-1)} S(1) W ( − 1 ) W^{(-1)} W(1) b ( 1 ) b^{(1)} b(1) = S ( − 1 ) S^{(-1)} S(1) b ( 1 ) b^{(1)} b(1)对于CNN,缩放将是逐通道的,并相应地在空间维度上进行广播。我们在图6中说明了这个重新缩放的过程。
表 3

  为了使模型对量化更加稳健,我们可以找到一个缩放因子si,使得重新缩放层中的量化噪声最小化。Nagel等人(2019年)通过跨层均衡(CLE)过程实现了这一点。他们通过在连续层之间均衡动态范围来证明了最佳权重均衡是通过设置S来实现的:
公式 22
  Meller等人(2019年)的算法引入了一个类似的缩放因子,该因子还考虑了中间激活张量。然而,他们对这种方法的最优性没有证明。
  Nagel等人(2019年)在吸收高偏差方面进一步指出,在某些情况下,特别是在经过CLE之后,高偏差可能导致激活的动态范围差异。因此,他们提出了一种程序,如果可能的话,将高偏差吸收到下一层中。为了将来自第一层(后面跟着ReLU激活函数f)的c吸收到第二层,我们可以进行以下重新参数化:
公式 23

其中 b ~ ( 2 ) \tilde{b} ^{(2)} b~(2) = W ( 2 ) W^{(2)} W(2) c + b ( 2 ) b^{(2)} b(2) h ~ \tilde{h} h~ = h - c, b ~ ( 1 ) \tilde{b} ^{(1)} b~(1) = b ( 1 ) b^{(1)} b(1) - c。在第二步中,我们利用了对于具有ReLU函数f的层,存在一个非负向量c,使得r(Wx + b - c) = r(Wx + b) - c。平凡解c = 0对所有x都成立。然而,根据x的分布和W和b的值,可能存在一些值ci > 0,使得这个等式对经验分布中的(几乎)所有x都成立。这个值等于
公式 24

其中min(x)在一个小的校准数据集上进行评估。为了消除对数据的依赖性,作者建议通过批量归一化层的偏移和缩放参数来估计(24)的右边,这导致ci = max(0, βi - 3γi)。
在表3中,我们展示了将MobileNetV2量化为8位的CLE和偏差吸收的效果。由于跳跃连接打破了层之间的等变性,我们仅将跨层等化应用于每个残差块内的层。与Krishnamoorthi(2018年)类似,我们观察到将MobileNetV2量化为INT8时,模型性能接近随机。应用CLE使我们的性能恢复到FP32性能的2%以内,接近每通道量化的性能。我们注意到吸收高偏差会导致FP32性能略微下降,因为它是一种近似,但由于更精确的激活量化,它提高了量化性能1%。综合考虑,CLE和偏差吸收,然后进行每个张量量化的结果比每通道量化更好。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值