3、量化原理与scale概念:线性量化、对称/非对称量化、scale与zero-point的定义及数学关系

在Edge AI部署中,PTQ(训练后量化)的核心任务是将浮点模型映射为低比特整数模型,而这一映射的数学根基正是线性量化。理解scale(缩放因子)与zero-point(零点)的定义及其推导关系,是后续进行量化参数检查、校准数据集选取以及scale对齐调试的前提。本节将系统拆解线性量化的数学本质、对称与非对称两种模式的适用场景,并给出从浮点范围到定点参数的完整计算流程。

线性量化参数映射关系图 浮点域 (FP32) r ∈ [r_min, r_max] 权重/激活张量 实际值范围 量化映射公式 q = round(r / scale) + zero_point r = (q - zero_point) × scale scale: 缩放因子 | zero_point: 零点 整数域 (INT8) q ∈ [q_min, q_max] INT8: [-128, 127] UINT8: [0, 255] 对称量化 (Symmetric) zero_point = 0 scale = max(|r_min|, |r_max|) / q_max 范围: [-scale×q_max, scale×q_max] 适用: 权重分布近似对称 | 硬件友好 非对称量化 (Asymmetric) zero_point ≠ 0 scale = (r_max - r_min) / (q_max - q_min) zero_point = round(q_min - r_min / scale) 适用: 激活值分布偏斜 | 精度更高

3.1 线性量化的数学本质

线性量化假设浮点实数与整数之间存在一个仿射变换关系,即通过一个缩放因子和一个偏移量完成双向映射。这种映射是均匀的——相邻整数之间的浮点间隔恒等于scale值。数学上,量化过程可表示为:

q = clamp(round(r / scale) + zero_point, q_min, q_max)
r_approx = (q - zero_point) × scale

其中,scale(缩放因子)表示每个整数步长对应的浮点数值范围,zero_point(零点)表示浮点值0映射到整数域时的偏移量。这两个参数一旦确定,整个张量的量化映射关系即被唯一锁定。在PTQ流程中,scale和zero_point通常基于校准数据集统计出的浮点数值范围(r_min, r_max)计算得到。

核心理解:线性量化的本质是“等间隔采样”。scale决定了采样密度,zero_point决定了采样起点。两者共同将连续的浮点分布压缩到离散的整数网格上,量化误差来源于舍入操作和范围截断。

3.2 对称量化与非对称量化对比

根据zero_point是否为0,线性量化分为对称和非对称两种模式。对称量化强制zero_point=0,浮点范围关于原点对称;非对称量化则允许zero_point取任意整数,能更灵活地适配偏斜分布的数据。

对比维度 对称量化 非对称量化
zero_point 恒为0 可为任意整数
scale计算公式 scale = max(|r_min|, |r_max|) / q_max scale = (r_max - r_min) / (q_max - q_min)
浮点0映射 精确映射到整数0 映射到zero_point
表示范围利用率 若分布偏斜,浪费部分整数区间 充分利用全部整数区间
硬件实现 无需额外偏移计算,效率高 需额外处理zero_point偏移
典型应用 权重张量(分布近似对称) 激活张量(ReLU后非负分布)

在实际Edge AI模型中,权重通常采用对称量化,因为训练后的权重分布往往关于0近似对称;而激活值经过ReLU等激活函数后呈现单侧分布,使用非对称量化能显著降低量化误差。例如,一个取值范围为[0, 6.5]的激活张量,若用对称INT8量化,则有效精度仅为6.5/128≈0.051,而非对称量化可达到6.5/255≈0.025,精度提升一倍。

3.3 scale与zero-point的推导流程

在PTQ校准阶段,我们需要从校准数据集上收集每个张量的浮点统计值,然后按照以下步骤计算量化参数:

  1. 收集范围:前向推理校准集,记录每个张量的最小值和最大值(或使用百分位截断,如99.99%分位)。
  2. 确定量化域:根据目标位宽确定q_min和q_max。INT8为[-128, 127],UINT8为[0, 255],INT16为[-32768, 32767]。
  3. 计算scale:对于对称量化,scale = max(|r_min|, |r_max|) / q_max;对于非对称量化,scale = (r_max - r_min) / (q_max - q_min)。
  4. 计算zero_point:对称模式下直接置0;非对称模式下,zero_point = round(q_min - r_min / scale),并做clamp处理。
  5. 验证映射:检查浮点0是否被精确映射(对称模式必须满足),以及r_min和r_max是否落在量化范围内。
工程经验:在计算zero_point时,务必使用 round 而非 floor 或 ceil,否则会引入系统性偏移。同时,zero_point必须clamp到[q_min, q_max]范围内,防止溢出。

3.4 案例拆解:一个卷积层的量化参数计算

假设某Edge AI模型中第一个卷积层的权重张量经校准统计后,浮点范围为[-1.8, 2.4],激活张量范围为[0.0, 12.8]。我们分别计算其量化参数:

# 权重张量(对称量化,INT8)
r_min = -1.8, r_max = 2.4
scale_w = max(|-1.8|, |2.4|) / 127 = 2.4 / 127 ≈ 0.01890
zero_point_w = 0

# 激活张量(非对称量化,INT8)
r_min = 0.0, r_max = 12.8
scale_a = (12.8 - 0.0) / (127 - (-128)) = 12.8 / 255 ≈ 0.05020
zero_point_a = round(-128 - 0.0 / 0.05020) = round(-128) = -128

验证映射关系:对于权重,浮点值2.4映射到整数q = round(2.4/0.01890) + 0 = 127,浮点值-1.8映射到q = round(-1.8/0.01890) = -95,均在有效范围内。对于激活,浮点值12.8映射到q = round(12.8/0.05020) + (-128) = 255 - 128 = 127,浮点值0映射到q = 0 + (-128) = -128,映射正确。

若此处误将激活也采用对称量化,则scale_a = 12.8/127 ≈ 0.10079,量化步长增大一倍,导致激活值的量化噪声从0.025提升到0.050,模型精度可能下降0.5%~1.5%。这个案例说明,根据数据分布特性选择量化模式是PTQ调优的第一步。

3.5 常见误区与总结复盘

误区1:忽略zero_point的存在。有些工程师在手工推导时只计算scale,将zero_point默认为0,导致非对称量化时映射错误。务必在代码中显式传递zero_point参数。

误区2:使用min/max直接计算scale而不做截断。实际张量分布常有长尾异常值,直接使用绝对min/max会放大scale,降低有效精度。建议使用百分位截断(如99.99%)或KL散度校准。

误区3:对称量化时误用r_max而非max(|r_min|,|r_max|)。若权重范围为[-2.0, 1.0],仅用r_max=1.0计算scale会导致负半轴严重截断。

总结本节要点:线性量化通过scale和zero_point两个参数完成浮点到整数的仿射映射;对称量化适合权重,非对称量化适合激活;scale决定量化步长,zero_point决定偏移基准。在PTQ实操中,正确计算并验证这两个参数是后续scale对齐检查的基础。建议读者在代码中实现一个简单的量化参数计算函数,并用随机张量验证映射的往返误差(round-trip error),这将为理解后续的量化误差分析打下坚实基础。