量化基础:定点数表示、对称/非对称量化、量化参数(scale/zero-point)与量化公式

在深入PTQ(训练后量化)的精度损失分析与校准集修复之前,必须先建立扎实的量化数学与表示基础。量化本质上是将一个高精度连续值域(通常是FP32)映射到一个低精度离散值域(如INT8、INT4)的过程。这个映射并非简单的“取整”,而是涉及数值表示、范围裁剪、缩放与零点偏移等多个环节。理解定点数表示、对称/非对称量化的差异,以及scale(缩放因子)与zero-point(零点)的数学含义,是后续分析量化误差来源、设计校准集修复策略的前提。本章将系统拆解这些核心概念,并给出可直接用于工程实践的公式与判定方法。

量化参数与映射关系总览 FP32 实数域 r ∈ [r_min, r_max] 连续值,高精度 权重/激活值 量化参数 scale (s) = (r_max - r_min) / (q_max - q_min) zero-point (z) = q_min - round(r_min / s) 对称量化: z = 0 非对称量化: z ≠ 0 INT8 量化域 q ∈ [q_min, q_max] 离散值,低精度 [-128, 127] 或 [0, 255] 量化 q = round(r/s) + z 反量化 r ≈ s(q - z) 对称量化 (Symmetric) 范围: [-127, 127] (INT8) zero-point = 0 适合权重(分布近似对称) 计算简单,硬件友好 非对称量化 (Asymmetric) 范围: [0, 255] (INT8) zero-point ≠ 0 适合激活值(分布偏斜) 精度更高,但计算稍复杂

上图展示了量化映射的核心链路:左侧是FP32实数域,右侧是INT8量化域,中间是连接两个域的量化参数。量化过程将实数r映射为整数q,反量化过程则将整数q近似还原为实数r。对称与非对称量化的本质区别在于zero-point是否为0,这直接决定了数值范围的利用效率和计算复杂度。下面逐一展开。

2.1 定点数表示与量化域

核心原理:定点数(Fixed-point)是相对于浮点数(Floating-point)的一种数值表示方式。在硬件加速器(如NPU、DSP、FPGA)中,浮点运算单元面积大、功耗高、速度慢,而定点整数运算则高效得多。量化就是将浮点模型转换为定点模型的过程。INT8量化域有两种常见选择:有符号整数[-128, 127]和无符号整数[0, 255]。有符号整数通常用于权重(因为权重可正可负),无符号整数通常用于激活值(因为ReLU后的激活值非负)。

判断方法:选择量化域时,需要统计目标张量的数值分布。若张量包含正负值且分布大致对称,优先选择有符号整数;若张量全部为非负值(如ReLU输出),则无符号整数能提供更高的分辨率(256个级别 vs 255个级别,且无符号范围更宽)。

量化域数据类型范围典型应用场景
有符号INT8int8_t[-128, 127]权重、偏置、残差连接
无符号INT8uint8_t[0, 255]ReLU后的激活值、特征图
有符号INT4int4_t[-8, 7]极端压缩场景(需谨慎)
经验提醒:在PTQ中,若激活值分布严重偏斜(如长尾分布),使用无符号整数配合非对称量化,通常比有符号整数配合对称量化能获得更低的量化误差。

2.2 量化参数:scale与zero-point的数学定义

核心原理:量化参数是连接实数域与整数域的桥梁。设实数域范围为[r_min, r_max],量化域范围为[q_min, q_max],则scale(缩放因子)定义为:

scale (s) = (r_max - r_min) / (q_max - q_min)

scale表示整数每增加1,对应的实数增加多少。zero-point(零点)定义为实数r_min对应的整数偏移量:

zero-point (z) = q_min - round(r_min / s)

zero-point确保实数0在量化域中有精确的整数表示,这对于处理padding、ReLU等操作至关重要。量化公式为:

q = round(r / s) + z

反量化公式为:

r ≈ s * (q - z)

操作流程:实际工程中,确定scale和zero-point的步骤如下:

  1. 收集张量的数值分布(通过校准集统计或直接计算min/max)。
  2. 确定量化域范围[q_min, q_max](如INT8为[-128, 127]或[0, 255])。
  3. 根据公式计算scale和zero-point。
  4. 对zero-point进行取整,并确保其落在[q_min, q_max]范围内。
案例拆解:假设某层激活值经统计后r_min=0.0,r_max=6.0,使用无符号INT8量化。则s=(6.0-0.0)/(255-0)=0.02353,z=0- round(0.0/0.02353)=0。若r_min=-3.0,r_max=3.0,使用有符号INT8量化,则s=(3.0-(-3.0))/(127-(-128))=6.0/255=0.02353,z=-128 - round(-3.0/0.02353) = -128 - (-127) = -1。注意z=-1意味着实数0对应整数-1,这在实际推理中需要特殊处理。

2.3 对称量化与非对称量化

核心原理:对称量化强制zero-point=0,即实数0精确映射到整数0。此时量化公式简化为:

q = round(r / s),其中 s = max(|r_min|, |r_max|) / q_max

非对称量化允许zero-point≠0,能够更灵活地适配非对称分布的数据。对称量化的优点是计算简单(无需处理zero-point偏移),硬件实现效率高;缺点是对非对称分布的数据(如ReLU后的激活值)会造成量化范围浪费。例如,若激活值范围为[0, 6.0],对称量化会使用[-6.0, 6.0]的范围,但实际只用了一半的量化级别。

判断方法:选择对称还是非对称量化,需根据张量分布特征:

  • 权重张量:通常分布近似对称(正负值都有),优先选择对称量化,计算效率高。
  • 激活张量:若经过ReLU等操作后非负,优先选择非对称量化;若分布本身对称(如某些归一化层输出),可考虑对称量化。
对比维度对称量化非对称量化
zero-point恒为0可为非0整数
计算复杂度低(无需偏移修正)较高(需处理偏移)
硬件友好度高(简化乘加运算)中(需额外加法)
精度表现对对称分布数据好对偏斜分布数据更好
典型应用权重、某些归一化层激活值、Embedding
风险说明:对称量化在激活值分布严重偏斜时,可能导致大量量化级别被浪费,从而增大量化误差。例如,若激活值范围为[0, 100],对称量化会使用[-100, 100]的范围,但实际数据只占一半的量化区间,有效分辨率降低一半。

2.4 量化误差的来源与影响

核心原理:量化误差主要来源于两个方面:舍入误差(rounding error)和裁剪误差(clipping error)。舍入误差是量化过程中将连续值映射到离散整数时产生的,不可避免但通常较小;裁剪误差是当实数超出量化范围时被强制截断到边界值产生的,误差较大且与数据分布密切相关。

判断方法:评估量化误差时,可以计算量化前后的均方误差(MSE)或信噪比(SNR)。若MSE过大,需要检查是舍入误差主导还是裁剪误差主导。通常,若r_min和r_max设置过窄,裁剪误差会显著增大;若设置过宽,则舍入误差增大(因为scale变大,分辨率降低)。

量化误差分析示例:
原始张量: [0.1, 0.5, 1.2, 2.8, 5.0, 7.3]
量化范围: [0, 7.3], INT8无符号
s = 7.3 / 255 = 0.0286
量化后: [3, 17, 42, 98, 175, 255]
反量化: [0.086, 0.486, 1.201, 2.803, 5.005, 7.296]
MSE = mean((原始-反量化)^2) ≈ 0.0002

实战场景:在PTQ中,校准集的作用就是确定最优的r_min和r_max。若校准集数据分布与真实推理数据分布不一致,会导致量化范围设置不当,进而引入额外误差。这也是后续章节“校准集修复”的核心动机。

案例闭环:某视觉模型在PTQ后精度下降2.3%。分析发现,激活值分布存在长尾(最大值是P99的10倍),直接使用min/max确定量化范围导致scale过大,大部分数据集中在少数量化级别上。修复方案:使用百分位数(如P99.9)替代min/max确定r_max,将裁剪误差控制在可接受范围。修复后精度损失降至0.4%。

2.5 常见误区与总结复盘

常见误区:

  • 误区一:认为对称量化一定比非对称量化精度差。实际上,对于对称分布的数据(如权重),对称量化精度与非对称量化相当,但计算效率更高。
  • 误区二:忽略zero-point的取整影响。zero-point必须为整数,取整操作会引入微小偏移,在深层网络中可能被放大。
  • 误区三:直接使用训练集统计min/max作为量化范围。训练集与推理数据分布可能存在差异,应使用校准集(或验证集)进行统计。
  • 误区四:对所有层使用相同的量化策略。不同层的数值分布差异很大,应逐层或逐通道确定量化参数。

总结复盘:量化基础的核心在于理解scale和zero-point的数学含义,以及对称/非对称量化的适用场景。在实际PTQ流程中,需要根据张量分布特征选择合适的量化域和量化策略,并通过校准集统计确定最优的量化范围。量化误差的平衡(舍入vs裁剪)是后续精度优化的关键切入点。

工程建议:在实现量化算子时,建议将scale和zero-point作为张量的属性(attribute)存储,而非硬编码在算子中。这样便于在PTQ过程中动态调整量化参数,也便于不同硬件后端(如TensorRT、OpenVINO、TFLite)的移植。