量化基础:定点数与浮点数表示、量化参数(scale、zero-point)、对称与非对称量化
在深入INT8校准集偏差问题之前,必须先建立扎实的量化理论基础。量化的本质是用有限位宽的离散数值去近似连续(或高精度)的实数张量,而这一过程涉及三个核心问题:数值如何表示、映射参数如何定义、映射策略如何选择。本节将逐一拆解。
1. 定点数与浮点数表示
计算机中的数值表示主要分为两大类:定点数(Fixed-point)与浮点数(Floating-point)。两者的根本区别在于小数点的位置是否固定。
- 定点数:小数点位置固定。例如Q7.8格式表示7位整数位、8位小数位。其优点是硬件实现简单、计算延迟低;缺点是动态范围有限,容易溢出或精度不足。
- 浮点数:采用科学计数法表示,由符号位、指数位和尾数位组成。例如FP32(1位符号+8位指数+23位尾数)和FP16(1位符号+5位指数+10位尾数)。其优点是动态范围大,适合训练和推理中的中间计算;缺点是硬件开销大、功耗高。
在深度学习推理中,我们通常将FP32权重和激活值量化为INT8(8位定点数),以换取更小的模型体积和更快的推理速度。INT8的表示范围是[-128, 127](有符号)或[0, 255](无符号),具体取决于硬件支持。
2. 量化参数:scale(缩放因子)与 zero-point(零点)
量化映射的核心公式如下:
// 浮点转整数(量化)
q = round(r / scale) + zero_point
// 整数转浮点(反量化)
r = (q - zero_point) * scale
其中:
- scale(缩放因子):一个正浮点数,表示每个整数步长对应的浮点区间大小。scale = (r_max - r_min) / (q_max - q_min)。
- zero_point(零点):一个整数,表示浮点值0映射到哪个整数。它保证了浮点0在量化后能被精确表示,这对卷积层中padding(通常为0)至关重要。
例如,若某层激活值范围为[-2.0, 6.0],量化到INT8([-128, 127]),则:
scale = (6.0 - (-2.0)) / (127 - (-128)) = 8.0 / 255 ≈ 0.03137
zero_point = round(-(-2.0) / 0.03137) + (-128) = round(63.75) - 128 = 64 - 128 = -64
此时浮点值0对应整数-64,反量化时(-64 - (-64)) * 0.03137 = 0,精确还原。
3. 对称量化与非对称量化
根据zero_point的取值方式,量化策略分为两类:
| 特性 | 对称量化 | 非对称量化 |
|---|---|---|
| 零点 | 固定为0 | 可任意整数 |
| 映射范围 | [-r_max, r_max] 对称 | [r_min, r_max] 任意 |
| 计算复杂度 | 低(无需零点修正) | 高(需额外减法) |
| 适用场景 | 权重(分布近似对称) | 激活值(分布可能偏斜) |
| 精度损失 | 对偏斜分布较大 | 对偏斜分布更友好 |
对称量化中,zero_point固定为0,公式简化为:q = round(r / scale)。由于不需要处理零点偏移,硬件实现更高效,但若浮点分布不对称(如ReLU后的激活值全为正),则会导致量化范围浪费一半。
非对称量化通过引入zero_point,可以精确覆盖浮点的实际分布范围,从而减小量化误差。代价是计算时需要额外的零点修正操作,在部分硬件(如GPU Tensor Core)上可能影响吞吐。
4. 量化误差的来源与影响
量化误差主要来自两个方面:
- 舍入误差:浮点值映射到整数网格时,小数部分被舍入,产生最大0.5个step的误差。
- 截断误差:超出量化范围的浮点值(即离群值)被截断到边界值,产生较大误差。
当校准集分布与真实数据分布不一致时,会导致scale和zero_point估计偏差,进而放大上述两类误差。例如,若校准集缺少某些大数值样本,则scale会被低估,导致真实推理时大量激活值被截断。
5. 案例:一个典型的量化参数计算流程
以下是一个基于校准集统计的量化参数计算流程(以TensorRT的校准为例):
1. 收集校准数据(通常500~1000张代表性图片)
2. 前向推理,记录每层激活值的直方图
3. 根据直方图确定最优截断阈值(如使用KL散度最小化)
4. 计算scale = 阈值 / 127(对称)或 (max-min)/255(非对称)
5. 计算zero_point(非对称时)
6. 保存量化参数到校准缓存文件(.cache)
若校准集偏差(例如只包含白天场景的图片),则直方图无法覆盖夜晚场景的激活值分布,导致scale偏大或偏小,最终在真实场景中产生精度退化。
6. 常见误区与复盘
复盘一个真实案例:某团队在量化MobileNetV2时,校准集仅使用了100张图像,且全部为室内场景。部署到户外场景后,模型精度从71.2%骤降至63.8%。分析发现,户外图像的亮度分布更广,导致激活值最大值超出校准集统计范围,scale被低估约15%,大量激活值被截断。重新采集包含室内外混合的500张校准图像后,精度恢复至70.6%。
这一案例说明,校准集的代表性是量化成功的前提。后续章节将深入探讨校准集偏差的具体诊断方法和修复策略。