量化基础:模型量化原理、定点与浮点表示、对称与非对称量化、量化误差来源

TinyML 模型部署到 MCU、DSP 或 NPU 等资源受限设备时,首要挑战是模型体积与计算开销。浮点模型(通常为 FP32)在嵌入式平台上往往无法直接高效运行,因为大多数低功耗处理器缺乏浮点运算单元(FPU),或浮点运算功耗过高。量化(Quantization)正是解决这一问题的核心手段:通过将连续浮点数值映射到离散整数空间,在保持模型功能基本不变的前提下,显著压缩模型体积并加速推理。本章将系统讲解量化的数学原理、数值表示方式、映射策略以及误差产生的根源,为后续 QAT(量化感知训练)与 BN(Batch Normalization)融合调参打下坚实的理论基础。

量化核心概念与误差传导链路 浮点表示 (FP32) 符号位1 + 指数8 + 尾数23 动态范围: ~1e-38 ~ 3.4e38 定点表示 (INT8) 符号位1 + 整数位 + 小数位 动态范围: -128 ~ 127 映射 对称量化 零点 z = 0, 范围 [-α, α] 公式: q = round(r / scale) 非对称量化 零点 z ≠ 0, 范围 [min, max] 公式: q = round(r/scale) + z 量化误差来源 ① 舍入误差 (rounding) ② 截断误差 (clipping) ③ 零点偏移误差 ④ 梯度失配 (QAT中) ⑤ 激活值分布不均 ⑥ BN统计量偏差 量化误差传导路径 权重量化误差 → 激活量化误差 → 梯度量化误差 → 损失面畸变

模型量化原理:从连续域到离散域的映射

量化本质上是将连续浮点数值 r 映射到有限离散整数集合 q 的过程。在 TinyML 场景中,最常见的量化位宽为 8 位(INT8),因为 8 位整数运算在 ARM Cortex-M 系列、RISC-V 等主流 MCU 上均有硬件指令支持,且模型体积可压缩至原来的 1/4。量化的数学表达式为:

q = clamp(round(r / scale) + zero_point, q_min, q_max)

其中 scale(缩放因子)和 zero_point(零点)是量化参数,round() 为四舍五入函数,clamp() 将结果限制在目标整数范围内。反量化(dequantization)则是将整数还原为浮点近似值:

r_approx = (q - zero_point) × scale

这一映射过程必然引入信息损失,因为浮点数的连续空间被压缩到有限个离散点上。量化参数的选择直接决定了映射的精度和误差分布。

定点与浮点表示:精度与效率的权衡

浮点数(FP32)采用科学计数法表示,由符号位、指数位和尾数位组成,能够表达极大和极小的数值范围,但硬件实现复杂、功耗高。定点数(Fixed-point)则使用固定的小数点位置,仅由整数位和小数位构成,硬件实现简单、运算速度快。在 TinyML 设备上,定点 INT8 运算比 FP32 快 2-4 倍,功耗降低 5-10 倍,且内存带宽需求大幅下降。

特性FP32 浮点INT8 定点INT16 定点
动态范围~1e-38 ~ 3.4e38-128 ~ 127-32768 ~ 32767
精度约 7 位有效数字整数精度整数精度
存储占用4 字节1 字节2 字节
典型硬件带 FPU 的 MCU普通 MCU/NPUDSP/部分 NPU
适用场景原型验证、PC 端边缘推理、模型部署精度敏感型边缘任务

选择定点格式时,需要根据模型权重和激活值的实际分布范围确定小数位宽。例如,若某层权重范围在 [-1.0, 1.0] 之间,使用 Q7.8 格式(1 位符号 + 7 位整数 + 8 位小数)可提供约 0.004 的精度,足以覆盖大多数 CNN 权重分布。

对称与非对称量化:零点处理的两种策略

对称量化将浮点范围对称地映射到整数范围,零点固定为 0。其优点是计算简单,无需处理零点偏移,适合权重分布近似对称的场景(如经过 BN 层后的权重)。非对称量化则允许零点不为 0,能够更精细地利用整数范围,适合激活值分布偏向某一侧的情况(如 ReLU 输出恒为非负)。

核心公式对比:

  • 对称量化: scale = max(|r_min|, |r_max|) / 127,q = round(r / scale)
  • 非对称量化: scale = (r_max - r_min) / 255,zero_point = round(-r_min / scale) - 128

实际工程中,权重通常使用对称量化(因为 BN 融合后权重分布近似正态且对称),激活值则根据实测分布选择对称或非对称。例如,MobileNetV2 的 ReLU6 激活输出范围固定在 [0, 6],使用非对称量化可将量化步长缩小至 6/255 ≈ 0.0235,而对称量化则需要 6/127 ≈ 0.0472,精度提升一倍。

量化误差来源:精度损失的四大根源

量化误差并非单一来源,而是多种因素叠加的结果。理解这些误差来源是进行 QAT 调参的前提。

  1. 舍入误差(Rounding Error):浮点值映射到最近整数时产生的误差,最大为 0.5 个量化步长。这种误差在权重和激活值中均存在,属于不可避免的固有误差。
  2. 截断误差(Clipping Error):当浮点值超出量化范围时被强制截断到边界值。例如,某激活值为 3.5,而量化范围上限为 3.0,则产生 0.5 的截断误差。这种误差可通过选择合适的 scale 来减小。
  3. 零点偏移误差(Zero-point Offset):非对称量化中零点取整导致的误差,尤其在零点附近的小数值会被错误映射。
  4. 梯度失配(Gradient Mismatch):在 QAT 中,前向传播使用量化权重,反向传播使用浮点权重(直通估计器 STE),导致梯度与量化权重不完全匹配,影响收敛。

风险提示:在 PTQ(训练后量化)中,若模型包含 BatchNorm 层,直接量化会导致严重的精度下降。因为 BN 的缩放因子 γ 和偏移 β 在推理时被折叠进卷积层,但折叠后的权重分布可能不再适合均匀量化。此时必须进行 BN 融合(Fold BN)后再量化,或直接采用 QAT 让模型适应量化噪声。

案例拆解:INT8 量化在语音唤醒词模型上的误差分析

某智能家居产品使用 3 层 CNN + 2 层全连接网络实现 10 类唤醒词识别,原始 FP32 模型精度为 94.2%。部署到 Cortex-M4 平台时,工程师直接使用 PTQ 进行 INT8 量化,结果精度骤降至 82.5%。通过逐层分析量化误差,发现以下问题:

  • 第一层卷积:输入为 16kHz 音频的 Mel 频谱特征,数值范围 [0, 15],但分布极度偏斜,80% 的值集中在 [0, 2] 区间。使用对称量化时,scale = 15/127 ≈ 0.118,导致小数值的量化步长过大,量化后大量特征值变为 0。
  • 第三层卷积:经过 BN 层后权重分布呈现双峰形态,对称量化将两个峰之间的间隙放大,导致权重精度损失严重。
  • 全连接层:激活值范围 [-8, 8],但存在少量极端值(如 7.8),拉大了 scale,使得主要分布区间的量化步长变大。

针对上述问题,工程师采取以下优化措施:

  1. 对第一层输入改用非对称量化,并统计实际分布后手动设置 min=0, max=4,将量化步长缩小至 4/255 ≈ 0.0157。
  2. 对第三层卷积采用 QAT 训练,在训练过程中加入伪量化节点,让模型自适应量化噪声。
  3. 对全连接层使用百分位裁剪(99.9%),排除极端值对 scale 的影响。

优化后模型精度恢复至 93.1%,仅下降 1.1 个百分点,且推理速度提升 3.2 倍,内存占用减少 72%。该案例表明,量化误差的分布往往不均匀,需要结合数据分布特征进行针对性调整。

常见误区与总结复盘

经验提醒:量化不是简单的"压缩",而是对模型数值分布的重新建模。在开始量化之前,务必先统计各层权重和激活值的分布直方图,了解数据的真实范围与分布形态。这能帮助你快速判断应该使用对称还是非对称量化,以及是否需要裁剪异常值。

常见误区包括:

  • 误区一:认为所有层都适合相同的量化配置。实际上,不同层的数据分布差异巨大,逐层选择量化参数是精度优化的关键。
  • 误区二:忽略 BN 层的影响。BN 在训练时引入的动态统计量在推理时被固定,若直接量化未融合 BN 的模型,误差会被放大。
  • 误区三:过度追求小 scale。虽然小 scale 能降低舍入误差,但会增大截断风险,需要在两者间取得平衡。
  • 误区四:认为 QAT 可以完全消除量化误差。QAT 只是让模型适应量化噪声,无法消除量化本身的离散化限制。

总结而言,量化基础的核心在于理解浮点到定点的映射机制、对称与非对称量化的适用场景,以及误差来源的分布特征。掌握这些原理后,才能在实际部署中做出合理的量化策略选择,并为后续的 QAT 训练与 BN freeze 调参提供理论依据。在下一阶段的课程中,我们将深入探讨如何在训练过程中模拟量化效应,以及如何通过 BN 层的特殊处理进一步提升量化模型的精度。