量化基础:模型量化原理、定点与浮点表示、对称与非对称量化、量化误差来源
TinyML 模型部署到 MCU、DSP 或 NPU 等资源受限设备时,首要挑战是模型体积与计算开销。浮点模型(通常为 FP32)在嵌入式平台上往往无法直接高效运行,因为大多数低功耗处理器缺乏浮点运算单元(FPU),或浮点运算功耗过高。量化(Quantization)正是解决这一问题的核心手段:通过将连续浮点数值映射到离散整数空间,在保持模型功能基本不变的前提下,显著压缩模型体积并加速推理。本章将系统讲解量化的数学原理、数值表示方式、映射策略以及误差产生的根源,为后续 QAT(量化感知训练)与 BN(Batch Normalization)融合调参打下坚实的理论基础。
模型量化原理:从连续域到离散域的映射
量化本质上是将连续浮点数值 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/NPU | DSP/部分 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 调参的前提。
- 舍入误差(Rounding Error):浮点值映射到最近整数时产生的误差,最大为 0.5 个量化步长。这种误差在权重和激活值中均存在,属于不可避免的固有误差。
- 截断误差(Clipping Error):当浮点值超出量化范围时被强制截断到边界值。例如,某激活值为 3.5,而量化范围上限为 3.0,则产生 0.5 的截断误差。这种误差可通过选择合适的 scale 来减小。
- 零点偏移误差(Zero-point Offset):非对称量化中零点取整导致的误差,尤其在零点附近的小数值会被错误映射。
- 梯度失配(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,使得主要分布区间的量化步长变大。
针对上述问题,工程师采取以下优化措施:
- 对第一层输入改用非对称量化,并统计实际分布后手动设置 min=0, max=4,将量化步长缩小至 4/255 ≈ 0.0157。
- 对第三层卷积采用 QAT 训练,在训练过程中加入伪量化节点,让模型自适应量化噪声。
- 对全连接层使用百分位裁剪(99.9%),排除极端值对 scale 的影响。
优化后模型精度恢复至 93.1%,仅下降 1.1 个百分点,且推理速度提升 3.2 倍,内存占用减少 72%。该案例表明,量化误差的分布往往不均匀,需要结合数据分布特征进行针对性调整。
常见误区与总结复盘
经验提醒:量化不是简单的"压缩",而是对模型数值分布的重新建模。在开始量化之前,务必先统计各层权重和激活值的分布直方图,了解数据的真实范围与分布形态。这能帮助你快速判断应该使用对称还是非对称量化,以及是否需要裁剪异常值。
常见误区包括:
- 误区一:认为所有层都适合相同的量化配置。实际上,不同层的数据分布差异巨大,逐层选择量化参数是精度优化的关键。
- 误区二:忽略 BN 层的影响。BN 在训练时引入的动态统计量在推理时被固定,若直接量化未融合 BN 的模型,误差会被放大。
- 误区三:过度追求小 scale。虽然小 scale 能降低舍入误差,但会增大截断风险,需要在两者间取得平衡。
- 误区四:认为 QAT 可以完全消除量化误差。QAT 只是让模型适应量化噪声,无法消除量化本身的离散化限制。
总结而言,量化基础的核心在于理解浮点到定点的映射机制、对称与非对称量化的适用场景,以及误差来源的分布特征。掌握这些原理后,才能在实际部署中做出合理的量化策略选择,并为后续的 QAT 训练与 BN freeze 调参提供理论依据。在下一阶段的课程中,我们将深入探讨如何在训练过程中模拟量化效应,以及如何通过 BN 层的特殊处理进一步提升量化模型的精度。