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 小结
嗯,这一章的内容就这些。总结一下:
- 定点数比浮点数更适合低功耗硬件,但要注意动态范围。
- 均匀量化简单,但可能浪费量化等级;非线性量化更灵活,但硬件复杂。
- 量化误差不可避免,但我们可以通过选择合适的比特数和量化方法,把误差控制在可接受范围内。
我个人觉得,量化没有银弹。每个项目都要根据数据分布、硬件约束和精度要求,去找到那个平衡点。多试几次,你就有感觉了。