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

在TinyML的工程实践中,模型量化(Quantization)是连接“训练好的浮点模型”与“可部署的嵌入式设备”之间的关键桥梁。绝大多数微控制器(MCU)和低功耗DSP并不具备高效的浮点运算单元,而是以整数或定点运算为主。理解量化的底层原理,不仅有助于我们正确选择量化方案,更直接决定了模型恢复(Fine-tuning/Recovery)策略的制定。本节将深入剖析量化的数学本质、数值表示差异、两种主流量化范式以及误差产生的根源,为后续的QAT(量化感知训练)实操打下坚实的理论基础。

浮点表示 (FP32) 定点/整数表示 (INT8) 量化参数 数值范围: ±3.4×10³⁸ 精度: 23位尾数 表示: (-1)^S × M × 2^E 硬件: 需要FPU,功耗高 TinyML: 不适用 数值范围: -128 ~ 127 精度: 均匀间隔 表示: Qm.n 格式 硬件: ALU直接支持,低功耗 TinyML: 主流选择 Scale (s): 缩放因子 Zero Point (z): 零点 公式: r = s(q - z) 对称: z = 0 非对称: z ≠ 0 量化误差来源与传递链路 权重裁剪误差 激活离散化误差 舍入/截断误差 梯度失配误差 误差累积导致模型精度下降 → 需要QAT(量化感知训练)进行恢复 核心思想: 在训练过程中模拟量化噪声,让网络自适应

上图展示了浮点到定点的映射关系以及量化误差的主要来源。在TinyML部署链路中,我们通常将FP32模型转换为INT8或INT16格式。这一转换过程并非简单的数据类型替换,而是涉及数值表示论、信息论和统计学的综合工程决策。下面我们从最基础的数值表示开始,逐步拆解量化的核心机制。

3.1 定点与浮点表示:TinyML的数值基石

3.1.1 浮点数的困境与定点的优势

在PC或服务器端,深度学习模型默认使用IEEE 754标准的FP32(32位浮点数)表示。FP32拥有约7位有效十进制数字的精度,动态范围可达10⁻³⁸到10³⁸。然而,在Cortex-M系列等MCU上,FP32运算需要软件模拟(Soft-FPU)或依赖昂贵的硬件FPU,这会消耗大量时钟周期和电能。例如,在STM32F4系列上,一次FP32乘法需要约5个周期,而一次INT8乘法仅需1个周期,功耗降低约10倍。

定点数(Fixed-Point)通过固定小数点位置来表示实数。其核心思想是:用整数运算模拟实数运算。一个定点数通常表示为 Qm.n 格式,其中 m 表示整数位宽,n 表示小数位宽。例如,Q4.4 表示用4位整数和4位小数组成一个8位定点数,其分辨率为 1/16 = 0.0625。

关键对比:FP32的精度是“动态”的(大数精度低,小数精度高),而定点数的精度是“均匀”的(无论数值大小,绝对误差恒定)。对于神经网络而言,权重和激活值通常分布在[-1, 1]或[0, 6]的小范围内,均匀精度恰好能满足需求,且硬件实现极其高效。

3.1.2 从FP32到INT8的映射数学

现代TinyML框架(如TensorFlow Lite for Microcontrollers)普遍采用仿射变换(Affine Transform)进行量化映射。给定浮点实数 r,其量化后的整数 q 满足:

r = s × (q - z)

其中:

  • s(Scale):缩放因子,是一个浮点数,表示整数每变化1个单位对应的浮点步长。计算公式为:s = (r_max - r_min) / (q_max - q_min)。
  • z(Zero Point):零点,是一个整数,表示浮点数值0对应的量化整数。它确保了浮点0可以被精确表示,这对填充(Padding)和ReLU等操作至关重要。

反量化(Dequantization)则是上述公式的逆运算。在推理时,卷积运算会先执行整数乘加,最后再通过一次反量化得到浮点结果(或直接输出整数结果供下一层使用)。

3.2 对称量化与非对称量化:两种范式的博弈

3.2.1 对称量化(Symmetric Quantization)

对称量化强制零点 z = 0,即浮点0映射到整数0。此时映射关系简化为 r = s × q。这种模式通常用于量化权重(Weights),因为权重分布往往关于0对称(正负值均有)。

特性对称量化非对称量化
零点 (z)固定为0可自由选择(通常非0)
计算复杂度低(无需处理零点偏移)高(需额外减去零点)
动态范围利用率低(若数据分布偏斜,浪费精度)高(能充分利用INT8的256个级别)
典型应用权重、某些激活函数(如Tanh)激活值(如ReLU后的非负分布)
硬件友好度极高(无偏移累加)中等(需要额外的加法运算)

3.2.2 非对称量化(Asymmetric Quantization)

非对称量化允许 z ≠ 0。它通过记录实际的最小值和最大值,将浮点范围 [r_min, r_max] 映射到整数范围 [q_min, q_max]。例如,ReLU后的激活值范围是 [0.0, 6.0],若使用对称量化,则负半轴的量化级别被浪费;而非对称量化可以将 [0.0, 6.0] 完整映射到 [-128, 127],从而获得更高的分辨率(步长更小)。

实战经验:在QAT中,我们通常对权重使用对称量化(因为权重分布相对稳定且对称),对激活值使用非对称量化(因为激活值经过ReLU后非负,非对称能显著降低量化噪声)。这种混合策略是TensorFlow Lite默认的量化方案。

3.3 量化误差来源:精度损失的四大元凶

量化过程本质上是有损压缩。理解误差来源是设计QAT恢复策略的前提。误差主要来自以下四个方面:

3.3.1 权重裁剪误差(Clipping Error)

当浮点权重超出量化范围 [r_min, r_max] 时,会被强制截断到边界值。例如,若权重最大值为1.2,而量化范围设定为[-1.0, 1.0],则1.2会被裁剪为1.0。这种误差在极端值(Outliers)较多的模型中尤为明显。

3.3.2 激活离散化误差(Discretization Error)

即使权重完全在范围内,浮点激活值在映射到整数时也会产生舍入误差。由于INT8只有256个离散级别,相邻两个量化级别之间的差值(即Scale s)决定了最大绝对误差为 s/2。如果激活值分布不均匀,某些区间的相对误差会非常大。

3.3.3 舍入与截断误差(Rounding/Truncation Error)

在反量化或累加过程中,浮点运算结果需要转换为整数。常见的舍入方式有:四舍五入(Round-to-Nearest)、向下取整(Floor)、向上取整(Ceil)。在硬件中,为了节省电路,常使用截断(Truncation)方式,这会导致系统性偏差(Bias),累积后可能造成输出分布偏移。

3.3.4 梯度失配误差(Gradient Mismatch)

这是QAT中最核心的问题。在标准反向传播中,损失函数对权重的梯度依赖于浮点权重值。但在量化模型中,前向传播使用的是量化后的权重 q,而反向传播时,∂L/∂w 无法直接通过量化函数(因为量化函数的导数几乎处处为0)。如果直接忽略量化,梯度会失真;如果使用直通估计器(STE,Straight-Through Estimator),则梯度被近似为恒等映射,这会导致优化方向偏离真实最优解。

风险提示:在PTQ(训练后量化)中,梯度失配问题不存在(因为不训练),但权重裁剪和激活离散化误差会直接导致精度骤降。QAT的核心价值就在于通过“伪量化”(Fake Quantization)节点在训练中模拟这些误差,让网络在优化过程中自动调整权重分布,从而抵消量化噪声的影响。

3.4 案例拆解:一个MobileNetV1的量化误差诊断

为了更直观地理解上述误差,我们以一个在Visual Wake Words数据集上训练的MobileNetV1模型为例(输入尺寸96×96×3,FP32精度约87%)。

初始现象:直接使用PTQ(TensorFlow Lite默认的INT8转换)后,模型精度骤降至71%,下降了16个百分点。

分析过程:

  1. 检查权重分布:通过直方图工具发现,第一层卷积权重存在少量极端值(最大值为2.3),而大部分权重集中在[-0.5, 0.5]。对称量化范围被极端值拉大,导致有效精度降低。
  2. 检查激活分布:第3层深度可分离卷积的激活值范围是[0, 8.5],但其中95%的数据集中在[0, 2]区间。非对称量化虽然覆盖了范围,但Scale s = 8.5/255 ≈ 0.033,导致[0,2]区间内的分辨率仅为0.033,相对误差较大。
  3. 定位瓶颈:通过逐层对比量化前后输出的余弦相似度,发现第5层(下采样层)的相似度仅为0.82,是误差的主要来源。

QAT恢复策略与结果:

  • 在TensorFlow中插入tf.quantization.fake_quant_with_min_max_vars节点,对权重和激活进行伪量化。
  • 训练3个epoch(学习率从0.001线性衰减至0.0001),让网络适应量化噪声。
  • 训练后,权重分布自动收缩,极端值被抑制(最大值降至1.8),激活分布也略微向中心靠拢。
  • 最终量化模型精度恢复至85.5%,仅比FP32低1.5个百分点。

复盘经验:QAT并非万能。在本案例中,若将训练epoch增加到10个,精度可恢复至86.2%,但继续增加收益甚微。这说明QAT主要解决的是“分布适配”问题,而非“容量提升”问题。此外,对于有BatchNorm层的模型,QAT时需要将BN层折叠到卷积层中,否则伪量化节点的位置会与BN参数更新产生冲突。

3.5 常见误区与总结复盘

在理解量化基础时,工程师常陷入以下误区:

  • 误区一:认为量化只是“精度换速度”的简单交易。实际上,合理的量化设计(如混合对称/非对称)可以在几乎不损失精度的情况下获得4倍以上的存储压缩和2-3倍的推理加速。
  • 误区二:忽视零点偏移的影响。在非对称量化中,若零点 z 未正确对齐,会导致卷积运算中的偏置项产生严重错误。例如,当 z=128 时,累加器中的数值会整体偏移,必须使用INT32累加器并执行“减去零点”操作。
  • 误区三:混淆“量化感知训练”与“训练后量化”。PTQ是零成本方案,但精度损失不可控;QAT需要修改训练流程,但能显著提升鲁棒性。在TinyML项目中,若模型较大(>100KB)或任务对精度敏感(如医学信号检测),应直接采用QAT。
  • 误区四:忽略数据预处理的一致性。量化模型的输入通常需要归一化到与训练时相同的范围(如[-1,1]或[0,1])。若部署时输入缩放因子与训练时不匹配,会引入额外的输入量化误差。
总结:量化是TinyML部署的“第一性原理”。掌握定点与浮点的数学映射、对称与非对称的适用场景、以及四大误差来源,是后续实施QAT(第4章)和模型恢复(第5章)的基石。在实际项目中,建议先使用PTQ快速评估精度下限,再针对性地引入QAT进行微调,以达到精度与效率的最佳平衡。