4. 训练后量化基础

训练后量化(Post-Training Quantization, PTQ)是STM32N6 NPU模型部署中最常用的压缩手段。它的核心思想是:在不重新训练的前提下,用一组校准数据统计浮点张量的动态范围,然后把这个范围线性映射到定点整数区间。理解这个映射过程,是后续调优量化精度的前提。

一、仿射映射:量化的数学本质

量化本质是一个仿射变换。设浮点实数 r,量化后的整数 q,则:

q = round(r / S) + Z
r ≈ S × (q − Z)

其中 S 是缩放因子(scale),Z 是零点(zero-point)。S 决定了每个整数步长代表多大的浮点跨度,Z 则保证浮点零能被整数精确表示。STM32N6 NPU 的权重与激活通常使用 8 位整数(int8),因此 q 的取值范围是 [−128, 127]。

缩放因子由浮点范围决定。若浮点张量的最小值为 r_min、最大值为 r_max,则:

S = (r_max − r_min) / (q_max − q_min)
Z = round(q_min − r_min / S)

例如某层激活经校准后范围为 [−3.2, 4.8],映射到 int8 的 [−128, 127]:S = 8.0 / 255 ≈ 0.03137,Z = round(−128 − (−3.2/0.03137)) ≈ round(−128 + 102) = −26。这意味着浮点 0 对应整数 −26,浮点 4.8 对应整数 127。

二、对称量化与非对称量化

对称量化强制 Z = 0,即浮点零映射到整数零,正负范围对称。它要求 r_max = −r_min,通常取绝对值最大值 |r|_max 作为边界,S = |r|_max / 127。对称量化的优点是计算简单,卷积中的乘加可以省去零点修正项,NPU 硬件执行效率更高;缺点是当数据分布明显偏斜(例如 ReLU 后的激活全为非负)时,会浪费一半整数区间,精度下降。

非对称量化允许 Z ≠ 0,能贴合任意分布。对于 ReLU 输出这类单边分布,非对称量化可以把 [0, 6.0] 完整映射到 [−128, 127],而对称量化只能映射到 [0, 127],有效位宽减半。代价是每次乘加后需要额外处理零点偏移,硬件实现更复杂。

STM32N6 NPU 对权重通常采用对称量化(per-channel),对激活采用非对称量化(per-tensor),这是硬件数据通路与精度折中的结果。

三、per-tensor 与 per-channel 的差异

per-tensor 量化对整个张量使用同一组 (S, Z)。它实现简单,但当一个卷积层的多个输出通道数值范围差异很大时,小范围通道会被大范围通道“淹没”。例如某层 64 个输出通道,通道 0 的权重范围是 [−0.05, 0.05],通道 63 是 [−1.2, 1.2],若统一用 S = 1.2/127 ≈ 0.00945,通道 0 的权重只能落到整数 −5 到 5 之间,量化误差极大。

per-channel 量化对每个输出通道单独计算 S(通常仍取 Z = 0)。上例中通道 0 的 S = 0.05/127 ≈ 0.000394,能充分利用整数区间。代价是每个通道需要存储一个 scale,推理时逐通道缩放。STM32N6 NPU 的权重存储支持 per-channel scale,因此卷积权重推荐使用 per-channel 对称量化;激活由于是运行时动态产生的,通常只能 per-tensor。

浮点→定点映射与 per-tensor / per-channel 对比 仿射映射原理 r_min r_max q q = round(r/S) + Z r ≈ S × (q − Z) S = (r_max−r_min)/255 Z = q_min − r_min/S 对称 vs 非对称量化 对称 (Z=0) −|r|max +|r|max 单边分布浪费一半区间 非对称 (Z≠0) r_min r_max 完整覆盖单边分布 per-tensor 与 per-channel 量化差异(64 通道卷积权重示例) per-tensor:统一 S S = 1.2/127 ≈ 0.00945(被大通道主导) ch0 ch1 ch2 … ch63 ch0 权重仅落到整数 −5~5,量化误差大 per-channel:逐通道 S S_ch0 = 0.05/127 ≈ 0.000394 ch0 ch1 ch2 … ch63 ch0 充分利用整数区间,精度显著提升 STM32N6 NPU:权重 per-channel 对称量化,激活 per-tensor 非对称量化

四、STM32N6 NPU 上的实际差异

在 STM32N6 的 NPU 数据通路中,权重以 per-channel 对称 int8 存储,每个输出通道附带一个 32 位浮点 scale。推理时,NPU 先完成整数乘加,再按通道乘以 S_weight × S_activation 还原到浮点域,最后重新量化为下一层的 int8 激活。这个“反量化—再量化”过程由硬件流水线完成,开发者只需在量化工具中正确设置粒度。

激活的 per-tensor 非对称量化意味着每层激活只有一个 (S, Z)。如果某层激活分布随输入变化剧烈,固定 scale 会导致溢出或精度损失。此时可以在校准阶段使用更多样本,或对敏感层保留浮点(混合量化)。

per-channel 并非越多越好。若通道数很大,scale 存储和逐通道缩放会带来额外带宽与计算开销。STM32N6 NPU 对 per-channel 有硬件加速,但仍建议仅在权重上使用,激活保持 per-tensor。

五、校准与参数确定

PTQ 的精度高度依赖校准。常用方法有 min-max、移动平均 min-max、KL 散度等。min-max 直接取校准集上的全局极值,简单但对离群点敏感;KL 散度通过最小化量化前后分布差异选择截断阈值,能缓解离群点影响。在 STM32Cube.AI 或 ST Edge AI 工具链中,通常提供 --calibration 选项指定校准数据,并可选 per_channel 开关。

一个实用的校准流程是:从训练集或验证集中抽取 100~500 个代表性样本,覆盖不同场景;对每层激活统计 min/max;若某层激活范围异常大,检查是否存在离群通道,必要时改用 KL 校准或对该层做混合量化。校准完成后,用验证集评估量化模型与浮点模型的精度差,通常要求 top-1 下降不超过 1%~2%。

六、小结与工程建议

浮点到定点的映射是仿射变换,S 和 Z 决定了量化精度。对称量化计算高效,适合权重;非对称量化贴合分布,适合激活。per-tensor 实现简单但精度受限,per-channel 精度更高但需硬件支持。STM32N6 NPU 的组合策略是权重 per-channel 对称、激活 per-tensor 非对称。工程上应优先保证校准集代表性,再根据精度反馈决定是否启用 per-channel 或混合量化。