4. 数值表示基础
模型量化的本质,是用更少比特、更规整的数值格式去近似原本的浮点权重与激活。要真正理解量化误差从哪里来、为什么某些层一量化就掉点,必须先回到数值表示本身:一个数在计算机里如何被编码、能表示多大范围、能分辨多小的间隔。本章围绕定点与浮点、整数表示、位宽、动态范围、精度,以及对称/非对称量化中的零点与缩放因子展开,这些概念是后续所有量化算法与嵌入式部署的公共语言。
一、核心原理:浮点与定点的表示差异
浮点数采用“符号位 + 指数 + 尾数”的科学计数法结构,例如 FP32 为 1 位符号、8 位指数、23 位尾数。指数决定动态范围,尾数决定有效精度,因此浮点可以在极大与极小值之间灵活滑动小数点,代价是硬件需要浮点运算单元、功耗和面积较高。定点数则约定小数点位置固定,常见做法是用整数加一个全局缩放因子来隐式表示小数,例如把 0.25 存成整数 64、缩放因子取 1/256。定点运算可以完全复用整数 ALU,速度快、功耗低,非常适合 MCU、NPU 和 DSP。
从数学上看,量化就是把连续实数映射到有限整数集合:
q = round(x / s) + z
x_hat = (q - z) * s
其中:
x 原始浮点值
s 缩放因子 scale,实数步长
z 零点 zero-point,整数
q 量化后的整数
x_hat 反量化还原值
这个公式贯穿整门课程。s 决定“一格代表多少”,z 决定“整数 0 对应哪个真实值”。理解这两点,就理解了大半量化。
二、位宽、动态范围与精度
位宽 n 决定整数可表示的数量:无符号整数范围是 [0, 2^n − 1],有符号补码范围是 [−2^(n−1), 2^(n−1) − 1]。位宽越大,动态范围和精度通常越好,但存储、带宽和算力开销也越大。嵌入式部署中常见的 INT8 相比 FP32 可减少约 4 倍存储与带宽,并让整数乘加吞吐显著提升。
动态范围指可表示的最大值与最小值之比,精度指相邻可表示值之间的最小间隔。二者存在权衡:同样 8 位,若把范围拉得很宽,步长 s 就变大,小数值会被粗糙地合并;若把范围压得很窄,精度提高却容易溢出。因此量化校准的核心任务,就是根据真实数据分布选择合适的截断范围。
关键关系:对非对称量化,s = (x_max − x_min) / (2^n − 1),z = round(−x_min / s)。对对称量化,s = max(|x_max|, |x_min|) / (2^(n−1) − 1),z = 0。位宽 n 固定时,范围与精度此消彼长。
三、对称与非对称量化、零点与缩放因子
对称量化以 0 为中心,整数区间关于 0 对称,零点固定为 0。它实现简单、乘加友好,适合权重这类近似零均值分布的数据。非对称量化允许整数区间整体平移,用零点 z 把真实的最小值对齐到整数 0,把最大值对齐到整数上限,因此能更充分地利用位宽,适合激活值这类经过 ReLU 后明显非负、分布偏移的数据。
零点 z 的物理含义是“真实世界中的 0 对应哪个整数”。当 z ≠ 0 时,反量化必须减去它,否则会引入固定偏置。缩放因子 s 则是量化网格的步长,s 越小分辨率越高,但可覆盖范围越窄。二者共同定义了量化器,也决定了推理时卷积、矩阵乘如何从浮点公式改写为整数公式。
四、案例与场景:同一组数据的两种量化
假设某层激活值范围为 [−1.0, 3.0],采用 INT8。若用对称量化,s = 3.0 / 127 ≈ 0.0236,z = 0,负半轴被浪费,实际只用到约 127 个码点覆盖 [−3, 3]。若用非对称量化,s = (3.0 − (−1.0)) / 255 ≈ 0.0157,z = round(1.0 / 0.0157) ≈ 64,整个 [−1, 3] 被均匀铺满 256 个码点,分辨率提升约 33%。这就是 ReLU 后激活更适合非对称量化的原因。
| 对比项 | 对称量化 | 非对称量化 |
|---|---|---|
| 零点 z | 固定为 0 | 由 x_min 计算得到 |
| 缩放因子 s | max(|x|) / (2^(n−1)−1) | (x_max − x_min) / (2^n − 1) |
| 适用数据 | 权重、零均值分布 | 激活、非负或偏移分布 |
| 整数运算 | 更简单,无零点修正 | 需处理零点项,略复杂 |
| 位宽利用率 | 分布不对称时偏低 | 较高 |
五、误区与复盘
- 误区一:位宽越高一定越好。位宽提升会带来存储、带宽和功耗上升,嵌入式端常常在 INT8 与 INT4 之间权衡,关键看任务精度容忍度。
- 误区二:忽略零点导致反量化偏置。非对称量化中若忘记减 z,输出会整体偏移,表现为系统性误差而非随机噪声。
- 误区三:用全局范围做校准。离群值会把 s 拉大,导致正常值分辨率骤降。常用做法是用百分位截断(如 99.9%)或逐通道缩放。
- 误区四:把动态范围和精度混为一谈。范围是“能表示多大”,精度是“能分辨多小”,二者由 s 和 n 共同决定,必须分开评估。
工程建议:权重优先尝试对称量化,激活优先尝试非对称量化;先用校准集统计每层 x_min/x_max,再计算 s 与 z,最后用余弦相似度或任务指标验证量化前后输出偏差。理解 s 与 z,是读懂所有量化推理引擎配置项的前提。