4. 量化基本概念
在自动驾驶模型部署中,量化并不是简单地把浮点数“截断成整数”,而是通过一组可计算的映射关系,把连续浮点值压缩到有限整数区间,并在推理时尽量保持数值语义不变。理解量化,必须同时掌握四个关键词:映射方式(对称/非对称)、粒度(逐张量/逐通道)、量化参数(scale 与 zero_point)以及反量化公式。它们共同决定了量化误差、硬件适配性和最终精度。
一、量化的核心原理:仿射映射
量化最常用的数学模型是仿射变换。设浮点值为 x,量化后的整数为 q,则基本关系为:
q = round(x / scale) + zero_point
x_hat = (q - zero_point) * scale
其中 scale 是缩放因子,表示一个整数单位对应多少浮点值;zero_point 是零点偏移,表示浮点 0 映射到整数域中的哪个值。反量化时,用整数减去 zero_point 再乘 scale,就得到近似浮点值 x_hat。量化误差主要来自 round 的舍入,以及 scale 和 zero_point 能否覆盖真实数据分布。
关键理解:量化参数不是“超参数拍脑袋”,而是由待量化张量的最小值 x_min 和最大值 x_max 推导出来的。不同映射方式,推导公式不同。
二、对称量化与非对称量化
对称量化要求浮点 0 精确映射到整数 0,即 zero_point = 0。它通常把浮点范围约束为 [-max_abs, max_abs],其中 max_abs = max(|x_min|, |x_max|)。对于 n 位有符号整数,量化范围为 [-2^(n-1)+1, 2^(n-1)-1],因此:
scale = max_abs / (2^(n-1) - 1)
q = clamp(round(x / scale), -2^(n-1)+1, 2^(n-1)-1)
x_hat = q * scale
对称量化的优点是计算简单、零点固定,适合权重和部分激活;缺点是当数据分布明显偏斜时,会浪费一侧整数范围。例如 ReLU 后的激活值全部非负,若强行对称量化,负半轴完全闲置,有效分辨率下降。
非对称量化允许 zero_point 不为 0,把任意 [x_min, x_max] 映射到整数区间 [q_min, q_max]。对于 n 位无符号整数,通常 q_min = 0,q_max = 2^n - 1。其参数为:
scale = (x_max - x_min) / (q_max - q_min)
zero_point = round(q_min - x_min / scale)
q = clamp(round(x / scale) + zero_point, q_min, q_max)
x_hat = (q - zero_point) * scale
非对称量化能更充分利用整数范围,特别适合激活值分布不对称的层,如 ReLU、Sigmoid 之后的张量。代价是 zero_point 引入额外偏移,部分硬件对非对称乘加支持不如对称高效。
三、逐张量量化与逐通道量化
映射方式解决“怎么映射”,粒度解决“对谁统一映射”。逐张量量化(per-tensor)为整个张量计算一组 scale 和 zero_point。实现简单、参数少,但若张量内不同通道数值范围差异大,小范围通道会被大范围通道“淹没”,量化误差显著。逐通道量化(per-channel)为每个通道单独计算一组参数,通常用于卷积权重,因为卷积核不同输出通道的权重分布差异往往很大。
| 对比维度 | 逐张量量化 | 逐通道量化 |
|---|---|---|
| 量化参数数量 | 1 组 scale / zero_point | 每通道 1 组,共 C 组 |
| 计算与存储开销 | 低 | 略高,但通常可忽略 |
| 对通道差异的适应 | 差,易被极值通道主导 | 好,各通道独立缩放 |
| 典型应用 | 激活、部分轻量权重 | 卷积权重、深度可分离卷积 |
| 硬件友好性 | 高,统一参数易向量化 | 需按通道索引参数,部分 NPU 需专门支持 |
四、案例:一个卷积层的量化参数计算
假设某卷积层权重为 int8 对称逐通道量化,某通道权重范围是 [-0.42, 0.36]。先取 max_abs = 0.42,则:
scale = 0.42 / 127 ≈ 0.003307
若浮点权重 w = 0.20:
q = round(0.20 / 0.003307) = round(60.48) = 60
反量化:x_hat = 60 * 0.003307 ≈ 0.1984
误差:0.20 - 0.1984 = 0.0016
若改为逐张量量化,而该张量整体 max_abs = 2.5,则 scale = 2.5 / 127 ≈ 0.01969,同样 w = 0.20 会被量化为 round(10.16) = 10,反量化约 0.1969,误差增大到 0.0031。可见逐通道量化对权重分布差异大的层更精细。
工程建议:在自动驾驶感知模型中,卷积权重优先使用逐通道对称量化;激活值若经过 ReLU,优先使用逐张量非对称量化。这样能在精度和部署效率之间取得较好平衡。
五、常见误区与复盘
- 误区一:量化就是四舍五入。实际上 scale 和 zero_point 的选取决定了舍入前的映射,参数选错,舍入再精确也无意义。
- 误区二:对称量化一定比非对称差。对称量化在权重上常表现更好,因为权重通常近似零均值;非对称更适合非负激活。
- 误区三:逐通道量化一定全面优于逐张量。逐通道增加参数索引和硬件调度成本,若通道分布接近,收益有限。
- 误区四:只看量化误差,不看反量化。推理时很多算子直接在整数域计算,反量化公式用于理解误差来源和校准,不可忽略。
排障提示:若量化后某层精度骤降,先检查该层权重的 max_abs 是否被离群值拉大,再确认是否误用了逐张量量化;对激活则检查 x_min/x_max 校准集是否覆盖真实驾驶场景分布。
掌握对称/非对称、逐张量/逐通道以及量化参数与反量化公式,是后续进行校准、量化感知训练和部署调优的基础。只有把映射方式、粒度和参数计算三者统一理解,才能在低精度推理中既压住模型体积和延迟,又守住自动驾驶所要求的安全精度底线。