2. 量化基础:定点数与浮点数、均匀量化与非线性量化、量化误差分析

各位同学,咱们今天聊点实在的。量化这件事,说白了就是怎么用有限的比特数,去表示一个连续变化的数值。你想想看,神经网络里的权重和激活值,原本都是32位浮点数,精度高得吓人。但咱们做低功耗芯片的,最怕的就是这种「奢侈」。每多一个比特,存储和计算的开销就翻倍。所以,量化就是要把这些「大款」请下神坛,用更少的比特干活。

2.1 定点数与浮点数:两种不同的「算盘」

先说说最基础的概念。浮点数,比如FP32,它用符号位、指数位和尾数位来表示一个数。好处是动态范围大,能表示从极小到极大的数。但坏处也明显——硬件实现复杂,功耗高。我当年做第一个AI加速器项目时,用的就是FP32,结果芯片面积大得吓人,功耗根本压不住。

定点数就简单多了。它没有指数,只有整数部分和小数部分。比如Q4.4格式,就是4位整数,4位小数。硬件实现起来,就是个整数乘法器加个移位操作,功耗和面积都小得多。

核心对比:

  • 浮点数:动态范围大,精度高,但硬件复杂,功耗高。
  • 定点数:动态范围有限,精度固定,但硬件简单,功耗低。

在激活压缩中,我们几乎只用定点数。因为激活值的分布通常比较集中,不需要那么大的动态范围。

我的经验: 我个人习惯在项目初期先用浮点模型跑一遍,看看激活值的分布范围。然后根据这个范围,选择合适的定点格式。比如,如果激活值都在[-1, 1]之间,那用Q1.7格式就足够了,整数位1位,小数位7位。

2.2 均匀量化与非线性量化:两种「切蛋糕」的方式

量化,本质上就是把一个连续的区间,切成若干个小段,每个小段用一个离散值表示。怎么切,就是均匀量化和非线性量化的区别。

2.2.1 均匀量化:一刀切

均匀量化最简单。就是把整个区间等分成若干份。比如,把[-1, 1]区间等分成256份,每份的宽度就是2/256 = 0.0078125。每个落在小段里的值,都用该段的中点或端点表示。

好处是硬件实现极其简单,就是个线性映射。坏处是,如果数据分布不均匀,比如大部分值集中在0附近,而两端很少,那就会浪费很多量化等级。

注意: 我曾经在一个语音识别项目里用过均匀量化,结果发现大部分激活值都集中在0附近,而两端的量化等级几乎没用。这导致量化误差很大,模型精度掉了好几个点。后来我换成了非线性量化,才把精度拉回来。

2.2.2 非线性量化:看人下菜碟

非线性量化就不一样了。它根据数据的分布,在值密集的地方切得细一些,在值稀疏的地方切得粗一些。常见的非线性量化方法有对数量化、幂次量化等。

比如对数量化,它把数据映射到对数域,然后在对数域进行均匀量化。这样,在原始域中,靠近0的地方量化步长小,精度高;远离0的地方量化步长大,精度低。这正好符合很多神经网络激活值的分布特点——大部分值集中在0附近。

关键区别:

特性 均匀量化 非线性量化
硬件复杂度 低 高
对数据分布的适应性 差 好
典型应用 权重量化、简单激活 复杂激活、长尾分布
量化误差 均匀分布 非均匀分布

2.3 量化误差分析:到底损失了多少?

量化必然带来误差。咱们得搞清楚这些误差从哪来,有多大,怎么控制。

2.3.1 误差来源

量化误差主要来自两个方面:

  • 截断误差:当原始值超出量化范围时,被强行截断到边界值。比如,量化范围是[-1, 1],但原始值是1.2,那就只能被量化为1.0。
  • 舍入误差:当原始值落在两个量化等级之间时,被四舍五入到最近的等级。比如,量化步长是0.1,原始值是0.15,那就被舍入到0.2。

2.3.2 误差度量

我们通常用以下几个指标来衡量量化误差:

  • 均方误差 (MSE):所有量化误差的平方的平均值。这是最常用的指标。
  • 信噪比 (SNR):信号功率与噪声功率的比值。SNR越高,量化质量越好。
  • 最大误差 (MAE):所有量化误差中值最大的那个。这个指标对异常值很敏感。

避坑指南: 我曾经在一个项目中,只关注了MSE,结果模型精度还不错。但部署到芯片上后,发现个别样本的推理结果完全错误。后来一查,是MAE太大,导致某些关键激活值被严重扭曲。所以,我建议你同时关注MSE和MAE,尤其是对安全攸关的应用。

2.3.3 误差与比特数的关系

一般来说,量化比特数每增加1位,量化误差大约降低一半(6dB)。但这只是理论值,实际中还要考虑数据分布和量化方法。

比如,对于均匀量化,量化步长Δ = (max - min) / 2^N,其中N是比特数。量化误差的方差大约是Δ^2 / 12。所以,比特数越多,Δ越小,误差也越小。

但对于非线性量化,情况就复杂了。因为量化步长不是常数,误差分布也不均匀。不过,我们可以通过调整量化曲线,让误差在关键区域更小。

2.4 知识体系总览

为了让你更直观地理解本章的知识结构,我画了一张图。你可以看到,量化基础主要分为三个部分:数值表示、量化方法和误差分析。这三者相互关联,共同决定了量化方案的好坏。

量化基础知识体系 量化基础知识体系 数值表示 量化方法 误差分析 定点数 浮点数 均匀量化 非线性量化 截断误差 舍入误差 核心关系 数值表示决定了量化范围 → 量化方法决定了量化步长分布 → 误差分析评估量化质量

2.5 小结

嗯,这一章的内容就这些。总结一下:

  • 定点数比浮点数更适合低功耗硬件,但要注意动态范围。
  • 均匀量化简单,但可能浪费量化等级;非线性量化更灵活,但硬件复杂。
  • 量化误差不可避免,但我们可以通过选择合适的比特数和量化方法,把误差控制在可接受范围内。

我个人觉得,量化没有银弹。每个项目都要根据数据分布、硬件约束和精度要求,去找到那个平衡点。多试几次,你就有感觉了。