量化里的 Scale 和 Zero-Point 到底是什么

原视频:【量化压缩】scale 和 zero-point 到底是什么:对称与非对称、per-tensor 与 per-channel,7B 从 14G 到 7G UP 主:古希腊掌管代码的神 | 时长:0:58 | tag:量化压缩 链接:https://www.bilibili.com/video/BV1CqJQ6qEoP

一句话结论

量化就是把连续浮点数塞进有限的整数格子(如 INT8 的 256 格):scale 是每个格子的宽度,zero-point 是浮点 0 落在哪个格子。权重分布近似对称,用对称量化(zero-point=0)+ per-channel;激活分布常一边倒,用非对称量化把格子铺满。7B 模型 FP16 是 14 GB,INT8 直接砍到 7 GB。

面试答法

30 秒版:量化的核心公式是 $q = \text{round}(x/s) + z$,反量化 $\hat x = (q-z)\cdot s$。$s$(scale)决定分辨率——把浮点范围等分成 256 份,每份多宽;$z$(zero-point)决定偏移——让浮点的精确 0 能对齐到某个整数格,这对 ReLU、padding 这类"0 有语义"的场景很重要。对称量化令 $z=0$,实现简单、乘法干净,适合以 0 为中心近似对称的权重;非对称量化多存一个 $z$,能把一边倒的分布(如 ReLU 后全正的激活)也铺满全部格子,分辨率翻倍,代价是矩阵乘里多出交叉项。粒度上 per-tensor 全张量共用一个 $s$ 最省事,但一个离群通道就能把 $s$ 撑大、毁掉其他通道的精度,所以权重量化基本都用 per-channel(每个输出通道一个 $s$)。

核心原理

1. 格子模型:scale 管宽,zero-point 管零点

INT8 有 256 个整数格(-128..127 或 0..255)。映射时每个浮点数被吸到最近的格子,误差最多半个格子宽——所以 scale 越小、格子越密,误差越小,但能表示的范围也越小,这是量化的根本权衡(clipping 范围的选择)。

浮点数轴映射到整数格子(视频截图,0:14)

2. 对称 vs 非对称:看分布形状

对称 vs 非对称的格子利用率(视频截图,0:33)

3. 粒度:per-tensor 的离群值问题

per-tensor 全程共用一个 scale:图中通道 3 的最大值 8.0 把 scale 撑到 $8.0/127$,其余通道(最大值 0.3–0.7)实际只能用到 5–11 个格子,精度还不如 4 bit。per-channel 给每个输出通道单独算 scale,各自铺满 127 格——4094 个输出通道就是 4094 个 scale,存储开销可忽略,是权重量化的默认做法。

一个离群通道毁掉所有通道的精度(视频截图,0:44)

易错点与常见追问

修订说明