量化基础:定点数表示、对称/非对称量化、量化参数(scale/zero-point)与量化公式
在深入PTQ(训练后量化)的精度损失分析与校准集修复之前,必须先建立扎实的量化数学与表示基础。量化本质上是将一个高精度连续值域(通常是FP32)映射到一个低精度离散值域(如INT8、INT4)的过程。这个映射并非简单的“取整”,而是涉及数值表示、范围裁剪、缩放与零点偏移等多个环节。理解定点数表示、对称/非对称量化的差异,以及scale(缩放因子)与zero-point(零点)的数学含义,是后续分析量化误差来源、设计校准集修复策略的前提。本章将系统拆解这些核心概念,并给出可直接用于工程实践的公式与判定方法。
上图展示了量化映射的核心链路:左侧是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个级别,且无符号范围更宽)。
| 量化域 | 数据类型 | 范围 | 典型应用场景 |
|---|---|---|---|
| 有符号INT8 | int8_t | [-128, 127] | 权重、偏置、残差连接 |
| 无符号INT8 | uint8_t | [0, 255] | ReLU后的激活值、特征图 |
| 有符号INT4 | int4_t | [-8, 7] | 极端压缩场景(需谨慎) |
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的步骤如下:
- 收集张量的数值分布(通过校准集统计或直接计算min/max)。
- 确定量化域范围[q_min, q_max](如INT8为[-128, 127]或[0, 255])。
- 根据公式计算scale和zero-point。
- 对zero-point进行取整,并确保其落在[q_min, q_max]范围内。
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 |
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。若校准集数据分布与真实推理数据分布不一致,会导致量化范围设置不当,进而引入额外误差。这也是后续章节“校准集修复”的核心动机。
2.5 常见误区与总结复盘
常见误区:
- 误区一:认为对称量化一定比非对称量化精度差。实际上,对于对称分布的数据(如权重),对称量化精度与非对称量化相当,但计算效率更高。
- 误区二:忽略zero-point的取整影响。zero-point必须为整数,取整操作会引入微小偏移,在深层网络中可能被放大。
- 误区三:直接使用训练集统计min/max作为量化范围。训练集与推理数据分布可能存在差异,应使用校准集(或验证集)进行统计。
- 误区四:对所有层使用相同的量化策略。不同层的数值分布差异很大,应逐层或逐通道确定量化参数。
总结复盘:量化基础的核心在于理解scale和zero-point的数学含义,以及对称/非对称量化的适用场景。在实际PTQ流程中,需要根据张量分布特征选择合适的量化域和量化策略,并通过校准集统计确定最优的量化范围。量化误差的平衡(舍入vs裁剪)是后续精度优化的关键切入点。