2、量化基础回顾:定点数表示、对称/非对称量化、量化参数(scale/zero-point)、量化误差来源

在深入训练后量化(PTQ)的校准集构建之前,必须先厘清量化的数学本质与工程实现。量化本质上是将连续的浮点实数空间映射到离散的整数空间,这一过程不可避免地引入信息损失。理解定点数表示、对称/非对称量化策略、量化参数(scale与zero-point)的数学含义,以及误差产生的底层机制,是后续设计校准集、评估代表性分布的前提。本节将系统梳理这些基础概念,并揭示它们与PTQ校准集构建之间的直接关联。

量化核心概念关系图 浮点实数域 FP32 / FP16 量化 整数域 INT8 / INT16 反量化 重建浮点域 近似原值 量化参数 Scale (s) 步长:s = (rmax-rmin)/(qmax-qmin) Zero-Point (z) 偏移:浮点0对应的整数 q = round(r/s) + z r ≈ (q - z) × s 量化策略 对称量化 (z=0) 非对称量化 (z≠0) 误差来源:舍入/截断/裁剪 误差 量化 噪声 裁剪 偏差 敏感 度

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的常见方法包括:

  1. MinMax法:直接取校准集上的最小值和最大值作为r_min和r_max。该方法简单,但对异常值敏感,一个离群点就会扩大量化范围,降低整体精度。
  2. 百分位法:取校准集分布的0.1%或1%分位点作为边界,截断极端值,以换取更精细的中间分辨率。该方法在PTQ中广泛使用,但分位点的选择需要经验。
  3. KL散度法:通过最小化原始分布与量化后分布的KL散度来确定最优阈值。该方法由TensorRT推广,计算量较大,但精度通常优于MinMax。
  4. 均方误差最小化法:直接优化s和z,使量化前后张量的均方误差最小。该方法需要迭代优化,适合离线校准。

校准集的质量直接影响这些参数的估计。如果校准集不能代表推理时的真实数据分布,那么估计出的r_min和r_max将偏离实际,导致量化后的模型在真实场景中精度下降。

2.4 量化误差来源分析

量化误差主要来源于三个方面:舍入误差、裁剪误差和模型参数敏感性。

  • 舍入误差:由round()操作引入,属于均匀分布噪声,其方差为s²/12。该误差无法消除,但可以通过减小s(即缩小量化范围)来降低。
  • 裁剪误差:当浮点值超出[r_min, r_max]范围时,被强制截断到边界值。裁剪误差的幅度远大于舍入误差,且会导致梯度失真。校准集若未覆盖极端值,推理时遇到超出范围的激活值,将产生严重裁剪。
  • 敏感性误差:不同层对量化的敏感度不同。某些层(如检测头的输出层)对数值精度极其敏感,微小的量化误差就会导致目标框偏移。校准集需要特别关注这些敏感层的输入分布。
风险提示:在PTQ中,最常见的错误是使用训练集作为校准集。训练集通常包含大量数据增强(如随机裁剪、色彩抖动),其分布与真实推理数据存在偏差。直接使用训练集校准,会导致scale估计偏向增强后的分布,而真实场景中的分布可能更集中或更分散,从而引入额外的泛化误差。

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 常见误区与总结

误区一:认为校准集越大越好。实际上,校准集过大可能导致分布过度平滑,掩盖了关键的子分布特征。通常1000~5000张具有代表性的图片即可。
误区二:忽略zero-point的符号影响。在非对称量化中,若z计算错误,会导致所有值偏移一个常数,产生系统性偏差。校准时应验证z的物理意义:浮点0对应的整数。
误区三:将权重和激活的量化范围独立估计。实际上,权重和激活的联合分布会影响输出误差。某些PTQ方法(如AdaRound)会联合优化权重和激活的量化参数。