2、量化基础回顾:定点数表示、对称/非对称量化、量化参数(scale/zero-point)、量化误差来源
在深入训练后量化(PTQ)的校准集构建之前,必须先厘清量化的数学本质与工程实现。量化本质上是将连续的浮点实数空间映射到离散的整数空间,这一过程不可避免地引入信息损失。理解定点数表示、对称/非对称量化策略、量化参数(scale与zero-point)的数学含义,以及误差产生的底层机制,是后续设计校准集、评估代表性分布的前提。本节将系统梳理这些基础概念,并揭示它们与PTQ校准集构建之间的直接关联。
2.1 定点数表示与量化映射
定点数表示是量化的物理基础。在硬件加速器(如NPU、DSP、GPU Tensor Core)中,整数运算的吞吐量远高于浮点运算,且功耗更低。定点数通过约定小数点的固定位置,用整数寄存器表示实数。例如,Q7.8格式表示7位整数位、8位小数位,其精度为2^-8≈0.0039。然而,现代深度学习量化通常不直接采用固定Q格式,而是采用均匀仿射量化(Uniform Affine Quantization),即通过scale和zero-point两个参数,将浮点张量映射到整数张量。
量化映射的数学表达式为:
q = clamp(round(r / s) + z, q_min, q_max)
其中,r为原始浮点值,s为缩放因子(scale),z为零点(zero-point),q为量化后的整数值。反量化过程为:r_hat = (q - z) × s。这里的r_hat是原始值的近似重建。该映射的核心在于确定s和z,而这两个参数完全取决于浮点数值的动态范围(即最小值和最大值)。这正是校准集存在的意义——通过校准集估计张量的数值分布范围。
2.2 对称量化与非对称量化
根据zero-point的取值,量化分为对称与非对称两种策略。
- 对称量化:强制
z=0,即浮点0映射到整数0。此时s = r_max / q_max,通常取r_max = max(|r_min|, |r_max|)。对称量化的优点是推理时无需考虑zero-point的偏移计算,硬件实现简单,适合权重(权重分布通常关于0对称)。缺点是若激活值分布偏向正区间(如ReLU输出),则负半轴的量化区间被浪费,导致精度损失。 - 非对称量化:允许
z≠0,浮点0映射到任意整数。此时s = (r_max - r_min) / (q_max - q_min),z = round(q_min - r_min / s)。非对称量化充分利用了整个整数动态范围,对偏态分布(如激活值)更友好,但推理时需要额外的zero-point偏移运算。
| 对比维度 | 对称量化 | 非对称量化 |
|---|---|---|
| zero-point | 恒为0 | 非0整数 |
| 动态范围利用 | 可能浪费一半区间 | 完全利用 |
| 硬件开销 | 低(无偏移计算) | 高(需偏移修正) |
| 适用场景 | 权重、分布对称的激活 | ReLU后的激活、偏态分布 |
| PTQ校准难度 | 只需估计r_max | 需同时估计r_min和r_max |
在PTQ实践中,权重通常采用对称量化,激活值根据分布特性选择对称或非对称。校准集的构建必须覆盖激活值的真实分布范围,否则会导致严重的裁剪误差。
2.3 量化参数:scale与zero-point的确定
量化参数的确定是PTQ的核心步骤。给定校准集上某张量的浮点值集合,确定s和z的常见方法包括:
- MinMax法:直接取校准集上的最小值和最大值作为
r_min和r_max。该方法简单,但对异常值敏感,一个离群点就会扩大量化范围,降低整体精度。 - 百分位法:取校准集分布的0.1%或1%分位点作为边界,截断极端值,以换取更精细的中间分辨率。该方法在PTQ中广泛使用,但分位点的选择需要经验。
- KL散度法:通过最小化原始分布与量化后分布的KL散度来确定最优阈值。该方法由TensorRT推广,计算量较大,但精度通常优于MinMax。
- 均方误差最小化法:直接优化
s和z,使量化前后张量的均方误差最小。该方法需要迭代优化,适合离线校准。
校准集的质量直接影响这些参数的估计。如果校准集不能代表推理时的真实数据分布,那么估计出的r_min和r_max将偏离实际,导致量化后的模型在真实场景中精度下降。
2.4 量化误差来源分析
量化误差主要来源于三个方面:舍入误差、裁剪误差和模型参数敏感性。
- 舍入误差:由
round()操作引入,属于均匀分布噪声,其方差为s²/12。该误差无法消除,但可以通过减小s(即缩小量化范围)来降低。 - 裁剪误差:当浮点值超出
[r_min, r_max]范围时,被强制截断到边界值。裁剪误差的幅度远大于舍入误差,且会导致梯度失真。校准集若未覆盖极端值,推理时遇到超出范围的激活值,将产生严重裁剪。 - 敏感性误差:不同层对量化的敏感度不同。某些层(如检测头的输出层)对数值精度极其敏感,微小的量化误差就会导致目标框偏移。校准集需要特别关注这些敏感层的输入分布。
2.5 案例拆解:一个卷积层的量化参数估计
假设某卷积层的激活值输出(经过ReLU)在某个校准集上的统计如下:
- 样本数:1000张图片的特征图
- 最小值:0.0(ReLU后恒非负)
- 最大值:12.5
- 均值:0.8
- 标准差:1.2
- 存在少量离群点:最大可达25.0(约0.01%的像素)
初始现象:若直接使用MinMax法,则r_min=0,r_max=25.0,量化步长s=25/255≈0.098。由于大部分激活值集中在0~3之间,步长0.098导致这些值的量化误差较大,相对误差可达12%。
分析判断:离群点虽然绝对值大,但占比极低,对最终任务精度贡献有限。若采用99.99%分位点,则r_max≈12.5,步长s=12.5/255≈0.049,主分布区间的量化精度提升一倍。代价是超过12.5的极少数激活值被裁剪,但裁剪误差对整体输出的影响可忽略。
实际操作:在PTQ校准过程中,我们选择使用百分位法(99.99%),并统计校准集上每个通道的分布。对于该层,最终确定r_min=0,r_max=12.5,s=0.049,z=0(非对称量化,z=0因为r_min=0)。
结果对比:采用MinMax法时,模型在验证集上的Top-1准确率下降2.1%;采用百分位法后,准确率仅下降0.3%。
复盘经验:校准集的构建必须包含足够的分布尾部信息,但也要容忍合理的离群点。盲目追求覆盖所有极端值,反而会稀释主分布的分辨率。这提示我们在构建校准集时,应通过统计检验(如Kolmogorov-Smirnov检验)确保校准集与验证集的分布一致性。
2.6 常见误区与总结
z计算错误,会导致所有值偏移一个常数,产生系统性偏差。校准时应验证z的物理意义:浮点0对应的整数。