训练后量化 (PTQ) 可能导致精度下降,尤其是在较低位深时。为解决这个问题,量化感知训练 (QAT) 提供了一种不同的方法。QAT 不对已完全训练好的模型进行量化,而是在训练或微调过程中引入量化的影响。主要思路不是直接使用低精度算术进行整个训练,因为这会给梯度计算带来困难。相反,QAT 在标准浮点训练框架内模拟量化的影响。伪量化的作用实现这种模拟的机制通常被称为“伪量化”或“模拟量化”。它涉及在训练期间将特殊节点或操作插入到模型的计算图中。这些伪量化操作在前向传播中执行以下步骤:量化: 它们接收输入的浮点张量(表示权重或激活),并应用所选的量化方案(例如,使用计算出的比例因子和零点将浮点值映射到8位整数范围)。反量化: 量化后,它们立即使用相同的比例因子和零点,将低精度整数表示形式转换回浮点值。因此,伪量化节点的输出仍然是浮点张量。但是,它的值现在受到了限制;它们仅表示目标低精度数据类型(例如INT8)能够精确表示的那些特定浮点数。从数学上看,如果 $x$ 是输入浮点张量,伪量化过程 $x_{fq}$ 可以表示为: $$ x_{fq} = \text{反量化}(\text{量化}(x, \text{比例}, \text{零点}), \text{比例}, \text{零点}) $$ 在这里,$\text{量化}$ 将 $x$ 映射到低精度范围(如INT8),$\text{反量化}$ 将其映射回浮点范围。关键是 $x_{fq}$ 包含了量化过程中固有的误差或信息损失。带伪量化的前向传播在训练的前向传播过程中,这些伪量化操作被策略性地放置在模型架构内。常见的位置包括:在权重张量之后: 在它们用于矩阵乘法等操作(例如在线性层中)之前。在激活函数之后: 用于模拟层之间传递的中间结果的量化。下图说明了伪量化节点如何改变激活张量在两层之间流动时的前向传播。digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="Arial", fontsize=10]; edge [fontname="Arial", fontsize=10]; subgraph cluster_0 { label = "标准训练前向传播"; style=dashed; color="#adb5bd"; bgcolor="#f8f9fa"; L1 [label="层 1\n输出 (FP32)"]; A1 [label="激活\n(例如, ReLU)"]; L2 [label="层 2\n输入 (FP32)"]; L1 -> A1 [label="x (FP32)"]; A1 -> L2 [label="act(x) (FP32)"]; } subgraph cluster_1 { label = "QAT 前向传播模拟"; style=dashed; color="#adb5bd"; bgcolor="#f8f9fa"; margin=20; L1_qat [label="层 1\n输出 (FP32)"]; A1_qat [label="激活\n(例如, ReLU)"]; FQ_qat [label="伪量化\n(量化 -> 反量化)", shape=ellipse, style=filled, fillcolor="#a5d8ff"]; L2_qat [label="层 2\n输入 (FP32)"]; L1_qat -> A1_qat [label="x (FP32)"]; A1_qat -> FQ_qat [label="act(x) (FP32)"]; FQ_qat -> L2_qat [label="x_fq (FP32, 受限)"]; } }标准训练与QAT前向传播流程对比。在QAT中,伪量化节点在激活值传递到下一层之前,模拟对激活值进行量化的影响。通过使用这些略微改变的、“感知量化误差”的张量 ($x_{fq}$) 进行计算,模型在训练期间学会调整其权重。优化过程(如随机梯度下降)在考虑真实量化后将存在的精度限制下,隐式地最小化损失函数。模型调整其参数,以更好地抵抗量化过程引入的噪声和信息损失。反向传播的难题尽管前向传播模拟相对简单,但反向传播却带来了一个难题。量化函数本身(从浮点数到整数的映射)涉及舍入或向下取整操作,这些操作在几乎所有地方的梯度都为零。这种不可微性意味着标准反向传播无法通过伪量化节点内的 quantize 步骤计算梯度。为解决此问题,QAT 在反向传播期间依赖于一种梯度计算的近似方法。这种被称为“直通估计器 (STE)”的方法,有效使梯度绕过不可微的量化步骤,从而使模型的权重得以更新。我们将在下一节中详细考察STE。总之,通过伪量化节点在训练期间模拟量化影响是QAT的核心机制。它使模型能够主动适应低精度算术的限制,与PTQ相比,这通常会使最终量化模型获得明显更高的精度,尤其对于激进量化(例如4位)更是如此。