2. 量化误差的数学建模

量化误差这东西,说白了就是「精度换速度」时付出的代价。我刚开始做QAT时,总觉得误差就是四舍五入那点事,后来才发现——没那么简单。

这一节,咱们就把它拆开揉碎,看看误差到底是怎么来的,分布长什么样,以及均匀量化和非线性量化到底差在哪。

2.1 量化误差的统计学本质

先问个问题:一个浮点数被量化成定点数,误差是固定的吗?

不是。它是个随机变量。

你想想看,输入数据是连续分布的,量化网格是离散的。每个浮点数落到网格之间,误差大小取决于它离最近量化点的距离。这个距离,在统计上服从某种分布。

我习惯把量化误差建模为加性噪声:

Q(x) = x + e(x)

其中 e(x) 就是量化误差。对于均匀量化,e(x) 的范围是 [-Δ/2, Δ/2],Δ 是量化步长。

这里有个关键假设:当输入信号足够复杂、变化足够快时,e(x) 近似服从均匀分布。我在项目中验证过,对于图像、语音这类信号,这个假设基本成立。

核心结论:均匀量化误差的方差 = Δ²/12。这个公式你最好记下来,后面分析信噪比时经常用到。

2.2 均匀量化的误差分布

均匀量化,就是量化步长处处相等。比如 int8 量化,把 [-128, 127] 均匀分成 256 份。

误差分布长什么样?

  • 概率密度函数:在 [-Δ/2, Δ/2] 上均匀分布,高度为 1/Δ
  • 均值:0(无偏估计)
  • 方差:Δ²/12
  • 信噪比:SNR ≈ 6.02B + 4.77 dB(B 为量化位数)

嗯,这里要注意:这个 SNR 公式成立的前提是输入信号满量程。如果信号幅度很小,实际 SNR 会差很多。我曾经在部署语音模型时踩过这个坑——输入音量太小,量化后 SNR 掉了 10 个 dB,模型直接没法用。

实战技巧:做 QAT 时,建议先统计激活值的分布范围,然后选择合适的缩放因子。别直接用默认的 [-1, 1] 映射,那往往不是最优的。

2.3 非线性量化的误差分布

均匀量化简单,但有个致命问题:它对大数值和小数值「一视同仁」。可实际上,神经网络里的权重和激活值,往往集中在 0 附近,尾巴拖得很长。

这时候,非线性量化就派上用场了。

常见的非线性量化方式包括:

  • 对数量化:量化步长随数值增大而增大
  • 幂次量化:量化点按幂函数分布
  • 查表量化:根据数据分布自定义量化网格

误差分布有什么变化?

对于对数量化,小数值区域的量化步长很小,误差也小;大数值区域步长大,误差也大。这正好匹配了神经网络权重的分布特点——大部分权重集中在 0 附近,需要高精度;少数大权重,精度要求不高。

我做过一个实验:用 4-bit 对数量化替代 8-bit 均匀量化,在某个 NLP 模型上精度只掉了 0.3%,而均匀量化掉了 1.8%。差距很明显。

注意:非线性量化虽然精度好,但硬件实现复杂。很多 NPU 只支持均匀量化。做 QAT 前,先确认目标硬件的支持情况。

2.4 误差分布的可视化对比

光说理论不够直观,咱们画个图看看。

均匀量化 vs 非线性量化误差分布对比 均匀量化误差分布 均匀分布 U(-Δ/2, Δ/2) 误差 e 概率 非线性量化误差分布 小误差概率高 大误差概率低 误差 e 概率 均匀量化:误差均匀分布,方差固定 非线性量化:小误差概率高,大误差概率低,更匹配实际数据分布

从图上能看出来,均匀量化的误差像个「平顶山」,到处都一样高。而非线性量化更像「尖峰」,大部分误差集中在 0 附近,只有少数误差比较大。这正好解释了为什么非线性量化在神经网络上表现更好——大部分权重和激活值只需要小误差就够了。

2.5 误差建模的实战意义

搞清楚了误差分布,能干什么?

  1. 预估精度损失:根据方差公式,可以估算量化后 SNR 下降多少
  2. 指导量化策略:如果误差分布偏斜严重,说明均匀量化不合适,该换非线性了
  3. 辅助 QAT 训练:在损失函数中加入误差正则项,引导模型适应量化噪声

我记得有一次,一个模型量化后精度掉了 5%。我一看误差分布,发现激活值集中在很小的范围内,均匀量化的步长太大。后来改用 per-channel 量化,误差分布变窄了,精度只掉了 1.2%。

小技巧:训练时可以在 forward 中插入一个「伪量化」操作,统计每层的误差分布。如果某层误差方差特别大,优先调整它的量化参数。

2.6 总结一下

量化误差不是玄学,它有明确的数学规律。均匀量化误差服从均匀分布,方差 Δ²/12;非线性量化误差分布更集中,更适合神经网络。理解这些分布特性,能帮你更精准地做量化决策。

下一节,咱们会把这些理论用到实际代码里,看看怎么在 PyTorch 中实现 QAT 训练。到时候你会发现,数学建模的每一步,都能对应到具体的工程实践上。


公众号:蓝海资料掘金营,微信deep3321