高效神经网络推理量化方法综述
1. 神经网络量化概述
神经网络(NN)的推理和训练计算量都很大,因此数值的高效表示尤为重要。而且当前大多数神经网络模型存在严重的过参数化问题,这为在不影响精度的前提下降低比特精度提供了机会。与传统研究不同,神经网络对激进的量化和极端离散化具有很强的鲁棒性,即使量化模型与原始非量化模型之间存在较大误差,也能实现良好的泛化性能。此外,神经网络的分层结构为量化提供了额外的探索维度,不同层对损失函数的影响不同,这促使人们采用混合精度的量化方法。
2. 量化的基本概念
2.1 问题设定与符号表示
假设神经网络有 $L$ 层可学习参数,记为 ${W_1, W_2, …, W_L}$,$\theta$ 表示所有这些参数的组合。在监督学习问题中,目标是优化以下经验风险最小化函数:
[L(\theta) = \frac{1}{N} \sum_{i=1}^{N} l(x_i, y_i; \theta)]
其中,$(x, y)$ 是输入数据和对应的标签,$l(x, y; \theta)$ 是损失函数(如均方误差或交叉熵损失),$N$ 是数据点的总数。第 $i$ 层的输入隐藏激活记为 $h_i$,对应的输出隐藏激活记为 $a_i$。我们假设已经有以浮点精度存储的训练好的模型参数 $\theta$。量化的目标是将参数 $\theta$ 以及中间激活图(即 $h_i$,$a_i$)的精度降低到低精度,同时尽量减少对模型泛化能力/准确性的影响。为此,需要定义一个将浮点值映射到量化值的量化算子。
2.2 均匀量化
均匀量化需要定义一个将神经网络权重和激活量化到有限值集的函数。一个流行的量化函数如下:
[Q(r) = \text{Int}(\frac{r}{S}) - Z]
其中,$Q$ 是量化算子,$r$ 是实值输入(激活或权重),$S$ 是实值缩放因子,$Z$ 是整数零点。$\text{Int}$ 函数通过舍入操作(如四舍五入和截断)将实值映射到整数值。这种量化方法也称为均匀量化,因为得到的量化值(即量化级别)是均匀间隔的。可以通过反量化操作从量化值 $Q(r)$ 恢复实值 $r$:
[\tilde{r} = S(Q(r) + Z)]
由于舍入操作,恢复的实值 $\tilde{r}$ 不会与 $r$ 完全匹配。
2.3 对称和非对称量化
在均匀量化中,缩放因子 $S$ 的选择很重要,其计算公式为:
[S = \frac{\beta - \alpha}{2^b - 1}]
其中,$[\alpha, \beta]$ 表示裁剪范围,$b$ 是量化比特宽度。确定缩放因子之前,需要先确定裁剪范围,这个过程通常称为校准。一种直接的选择是使用信号的最小值/最大值作为裁剪范围,即 $\alpha = r_{min}$,$\beta = r_{max}$,这是一种非对称量化方案,因为裁剪范围不一定关于原点对称。也可以选择对称裁剪范围 $\alpha = -\beta$,例如基于信号的最小值/最大值选择 $-\alpha = \beta = \max(|r|)$,这是对称量化方案。非对称量化通常会得到比对称量化更紧密的裁剪范围,这在目标权重或激活不平衡时(如 ReLU 后的激活始终为非负值)尤为重要。对称量化通过将零点设为 $Z = 0$ 简化了量化函数:
[Q(r) = \text{Int}(\frac{r}{S})]
对称量化在量化权重时被广泛采用,因为消除零点可以降低推理过程中的计算成本,并且实现更简单。然而,对于激活,非对称激活中的偏移导致的交叉项是与数据无关的静态项,可以被吸收到偏置中(或用于初始化累加器)。使用信号的最小值/最大值进行对称和非对称量化是一种流行的方法,但这种方法容易受到激活中离群数据的影响,可能会不必要地增加范围,从而降低量化分辨率。可以使用百分位数代替最小值/最大值,或者选择 $\alpha$ 和 $\beta$ 来最小化实值与量化值之间的 KL 散度。
| 量化类型 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 对称量化 | 实现简单,可降低计算成本 | 对于范围不对称的情况不是最优 | 权重量化 |
| 非对称量化 | 裁剪范围更紧密 | 实现相对复杂 | 激活不平衡的情况 |
2.4 范围校准算法:静态与动态量化
确定裁剪范围 $[\alpha, \beta]$ 的方法有多种,另一个重要的区别是裁剪范围的确定时间。对于权重,裁剪范围可以静态计算,因为在大多数情况下,参数在推理过程中是固定的。但激活图会因每个输入样本而不同,因此有两种量化激活的方法:动态量化和静态量化。
-
动态量化
:在运行时为每个激活图动态计算裁剪范围。这种方法需要实时计算信号统计信息(如最小值、最大值、百分位数等),开销非常高,但由于为每个输入精确计算了信号范围,通常能获得更高的精度。
-
静态量化
:裁剪范围在推理前预先计算并保持静态。这种方法不会增加计算开销,但与动态量化相比,精度通常较低。一种流行的预计算方法是运行一系列校准输入来计算激活的典型范围。可以使用多种不同的指标来找到最佳范围,如最小化原始未量化权重分布与相应量化值之间的均方误差(MSE),也可以考虑使用其他指标,如熵,但 MSE 是最常用的方法。另一种方法是在神经网络训练期间学习/施加这个裁剪范围。
| 量化类型 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 动态量化 | 精度高 | 计算开销大 | 对精度要求高且计算资源充足的场景 |
| 静态量化 | 无计算开销 | 精度较低 | 对计算开销敏感的场景 |
2.5 量化粒度
在大多数计算机视觉任务中,一层的激活输入会与许多不同的卷积滤波器进行卷积,每个卷积滤波器的值范围可能不同。因此,量化方法的一个区别在于为权重计算裁剪范围 $[\alpha, \beta]$ 的粒度,可分为以下几种:
-
层量化
:通过考虑一层卷积滤波器中的所有权重来确定裁剪范围。这种方法实现简单,但由于每层中每个卷积滤波器的范围可能差异很大,通常会导致次优的精度。例如,参数范围相对较窄的卷积核可能会因同一层中另一个范围较宽的核而失去量化分辨率。
-
组量化
:可以将一层内的多个不同通道分组来计算裁剪范围(激活或卷积核)。这种方法在单个卷积/激活中参数分布差异很大的情况下可能会有帮助,但不可避免地会带来考虑不同缩放因子的额外成本。
-
通道量化
:为每个卷积滤波器使用固定值作为裁剪范围,独立于其他通道。每个通道分配一个专用的缩放因子,这确保了更好的量化分辨率,通常能获得更高的精度。
-
子通道量化
:将通道量化方法极端化,根据卷积或全连接层中的任何参数组来确定裁剪范围。但这种方法会增加相当大的开销,因为在处理单个卷积或全连接层时需要考虑不同的缩放因子。因此,组量化可以在量化分辨率和计算开销之间取得良好的平衡。
| 量化粒度 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 层量化 | 实现简单 | 精度可能较低 | 对精度要求不高的场景 |
| 组量化 | 可处理参数分布差异大的情况 | 有额外成本 | 单个卷积/激活中参数分布差异大的情况 |
| 通道量化 | 量化分辨率高,精度高 | 开销相对较小 | 目前量化卷积核的标准方法 |
| 子通道量化 | 量化分辨率极高 | 开销大 | 一般不常用 |
2.6 非均匀量化
非均匀量化允许量化步长和量化级别非均匀间隔。其正式定义如下:
[Q(r) = X_i, \text{ if } r \in [\Delta_i, \Delta_{i+1})]
其中,$X_i$ 表示离散量化级别,$\Delta_i$ 表示量化步长(阈值)。非均匀量化在固定比特宽度下可能实现更高的精度,因为可以通过更多地关注重要值区域或找到合适的动态范围来更好地捕捉分布。例如,许多非均匀量化方法是为权重和激活的钟形分布设计的,这些分布通常有长尾。一种典型的基于规则的非均匀量化是使用对数分布,其中量化步长和级别呈指数增长而不是线性增长。另一个流行的分支是基于二进制代码的量化,其中实值向量 $r \in R^n$ 通过表示 $r \approx \sum_{i=1}^{m} \alpha_i b_i$ 量化为 $m$ 个二进制向量,其中缩放因子 $\alpha_i \in R$,二进制向量 $b_i \in {-1, +1}^n$。由于没有用于最小化 $r$ 与 $\sum_{i=1}^{m} \alpha_i b_i$ 之间误差的闭式解,以前的研究依赖于启发式解决方案。为了进一步改进量化器,最近的工作将非均匀量化表述为一个优化问题:
[\min_{Q} |Q(r) - r|^2]
此外,量化器本身也可以与模型参数一起联合训练,这些方法称为可学习量化器,量化步长/级别通常通过迭代优化或梯度下降进行训练。除了基于规则和基于优化的非均匀量化,聚类也有助于减轻量化导致的信息损失。
2.7 微调方法
量化后通常需要调整神经网络中的参数,有两种方法:量化感知训练(QAT)和训练后量化(PTQ)。
2.7.1 量化感知训练
给定一个训练好的模型,量化可能会对训练好的模型参数产生扰动,使模型偏离以浮点精度训练时收敛的点。可以通过使用量化参数重新训练神经网络模型来解决这个问题,使模型收敛到损失更好的点。一种流行的方法是量化感知训练(QAT),在这种方法中,通常的前向和反向传播在浮点精度的量化模型上进行,但模型参数在每次梯度更新后进行量化(类似于投影梯度下降)。特别重要的是在以浮点精度进行权重更新后进行这种投影。使用浮点进行反向传播很重要,因为在量化精度下累积梯度可能会导致零梯度或误差很大的梯度,特别是在低精度情况下。在反向传播中,一个重要的微妙之处是如何处理不可微的量化算子。一种流行的方法是使用直通估计器(STE)来近似该算子的梯度,STE 本质上忽略了舍入操作,用恒等函数进行近似。尽管 STE 是一种粗略的近似,但在实践中通常效果很好,除了超低精度量化(如二进制量化)。虽然 STE 是主流方法,但文献中也探索了其他方法,如随机神经元方法、组合优化、目标传播、Gumbel-softmax 等,还有一些方法尝试使用正则化算子来强制权重进行量化,这些方法通常称为非 STE 方法。但这些方法通常需要大量的调整,到目前为止,STE 方法是最常用的方法。此外,一些先前的工作发现,在 QAT 期间学习量化参数也是有效的,例如 PACT 学习均匀量化下激活的裁剪范围。
下面是量化感知训练的流程:
graph TD;
A[预训练模型] --> B[量化模型];
B --> C[使用训练数据进行微调];
C --> D[调整参数并恢复精度];
综上所述,量化是提高神经网络推理效率的重要方法,不同的量化方法各有优缺点,在实际应用中需要根据具体情况选择合适的方法。同时,量化感知训练等微调方法可以帮助恢复量化带来的精度损失。
2.7.2 训练后量化
训练后量化(PTQ)是在不重新训练模型的情况下对模型进行量化的方法。其操作步骤如下:
1.
校准数据选择
:选取一小部分训练数据作为校准数据。
2.
计算裁剪范围和缩放因子
:使用校准数据计算模型中各层的裁剪范围 $[\alpha, \beta]$ 和缩放因子 $S$。常见的计算方法有使用信号的最小值/最大值、百分位数、最小化 KL 散度或最小化均方误差等。
3.
模型量化
:根据计算得到的裁剪范围和缩放因子,对模型的参数($\theta$)以及中间激活图($h_i$,$a_i$)进行量化。
与量化感知训练(QAT)相比,PTQ 不需要重新训练模型,因此计算成本较低,但通常会导致一定的精度损失。不过,通过合理选择校准数据和校准方法,可以在一定程度上减少精度损失。
| 微调方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 量化感知训练(QAT) | 能有效恢复量化带来的精度损失,可学习量化参数 | 计算成本高,需要重新训练模型 | 对精度要求高且计算资源充足的场景 |
| 训练后量化(PTQ) | 计算成本低,无需重新训练模型 | 精度损失相对较大 | 对计算成本敏感,对精度要求不是极高的场景 |
3. 随机量化
随机量化是一种特殊的量化方法,它在量化过程中引入了随机性。与确定性量化方法(如前面介绍的均匀量化、非均匀量化等)不同,随机量化的结果不是唯一确定的,而是具有一定的概率分布。
随机量化的一种常见实现方式是在量化过程中添加随机噪声。例如,在均匀量化中,可以在量化前对输入值 $r$ 加上一个随机噪声 $\epsilon$,然后再进行量化:
[Q(r + \epsilon) = \text{Int}(\frac{r + \epsilon}{S}) - Z]
其中,$\epsilon$ 是一个随机变量,其分布可以根据具体需求进行设计。
随机量化的优点在于它可以在一定程度上减少量化误差的累积,提高模型的鲁棒性。特别是在低精度量化的情况下,随机量化可以避免量化误差的集中,使得模型在不同的输入下表现更加稳定。然而,随机量化也增加了量化过程的复杂性,并且需要额外的计算资源来生成和处理随机噪声。
4. 量化方法的选择与应用建议
在实际应用中,选择合适的量化方法需要综合考虑多个因素,如模型的类型、计算资源、精度要求等。以下是一些选择和应用量化方法的建议:
4.1 权重量化
- 对称量化 :由于对称量化可以简化计算,降低推理成本,并且在大多数情况下能满足权重量化的精度要求,因此是权重量化的常用方法。特别是在使用 GPU 或 CPU 进行推理时,对称量化可以更高效地映射到硬件。
- 通道量化 :对于卷积核的量化,通道量化是目前的标准方法。它可以为每个通道分配独立的缩放因子,确保更好的量化分辨率,从而提高模型的精度。
4.2 激活量化
- 非对称量化 :当激活值的分布不平衡时(如 ReLU 后的激活始终为非负值),非对称量化可以得到更紧密的裁剪范围,从而提高量化精度。
- 动态量化 :如果对精度要求较高,并且计算资源充足,可以考虑使用动态量化。动态量化为每个输入样本动态计算裁剪范围,能更准确地捕捉激活值的分布,通常能获得更高的精度。但由于其计算开销大,在实际应用中需要谨慎使用。
- 静态量化 :对于计算资源有限的场景,静态量化是一个不错的选择。通过预先计算裁剪范围,可以避免实时计算的开销,但需要注意选择合适的校准方法和校准数据,以减少精度损失。
4.3 微调方法
- 量化感知训练(QAT) :如果对模型的精度要求很高,并且有足够的计算资源和训练数据,可以使用量化感知训练。QAT 可以在量化的同时调整模型参数,使模型收敛到损失更好的点,从而有效恢复量化带来的精度损失。
- 训练后量化(PTQ) :当计算资源有限,或者希望在不重新训练模型的情况下进行量化时,训练后量化是一个可行的选择。通过合理选择校准方法和校准数据,可以在一定程度上减少精度损失。
4.4 其他考虑因素
- 非均匀量化 :虽然非均匀量化在理论上可以实现更高的精度,但由于其实现复杂,难以高效地部署在通用计算硬件上,因此在实际应用中使用相对较少。只有在对精度要求极高,并且有足够的计算资源和技术支持时,才考虑使用非均匀量化。
- 随机量化 :随机量化可以提高模型的鲁棒性,但增加了量化过程的复杂性和计算开销。在对模型鲁棒性要求较高的场景下,可以考虑使用随机量化,但需要权衡其带来的收益和成本。
5. 总结
量化是提高神经网络推理效率的重要技术,通过降低模型参数和中间激活图的精度,可以减少计算量和存储需求,从而实现低功耗的计算机视觉应用。本文介绍了多种量化方法,包括均匀量化、非均匀量化、对称量化、非对称量化、动态量化、静态量化等,以及量化后的微调方法,如量化感知训练和训练后量化。同时,还讨论了随机量化的概念和应用。
在实际应用中,需要根据具体的场景和需求选择合适的量化方法。不同的量化方法各有优缺点,需要综合考虑模型的类型、计算资源、精度要求等因素。通过合理选择和应用量化方法,可以在保证模型精度的前提下,显著提高神经网络的推理效率。
未来,随着深度学习技术的不断发展,量化方法也将不断创新和完善。例如,研究人员可能会探索更高效的量化算法,提高量化的精度和鲁棒性;或者将量化技术与其他优化技术相结合,进一步提升神经网络的性能。同时,随着硬件技术的进步,量化方法也将更好地与硬件进行融合,实现更高效的计算和存储。
希望本文能够为读者提供关于量化方法的全面了解,并在实际应用中提供有益的参考。
超级会员免费看
1671

被折叠的 条评论
为什么被折叠?



