3、量化原理与scale概念:线性量化、对称/非对称量化、scale与zero-point的定义及数学关系
在Edge AI部署中,PTQ(训练后量化)的核心任务是将浮点模型映射为低比特整数模型,而这一映射的数学根基正是线性量化。理解scale(缩放因子)与zero-point(零点)的定义及其推导关系,是后续进行量化参数检查、校准数据集选取以及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)计算得到。
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校准阶段,我们需要从校准数据集上收集每个张量的浮点统计值,然后按照以下步骤计算量化参数:
- 收集范围:前向推理校准集,记录每个张量的最小值和最大值(或使用百分位截断,如99.99%分位)。
- 确定量化域:根据目标位宽确定q_min和q_max。INT8为[-128, 127],UINT8为[0, 255],INT16为[-32768, 32767]。
- 计算scale:对于对称量化,scale = max(|r_min|, |r_max|) / q_max;对于非对称量化,scale = (r_max - r_min) / (q_max - q_min)。
- 计算zero_point:对称模式下直接置0;非对称模式下,zero_point = round(q_min - r_min / scale),并做clamp处理。
- 验证映射:检查浮点0是否被精确映射(对称模式必须满足),以及r_min和r_max是否落在量化范围内。
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 常见误区与总结复盘
误区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),这将为理解后续的量化误差分析打下坚实基础。