LLM 量化精读笔记 · 01 数值编码与计算机表示基础(信息论 · 整数 · IEEE 754 · 舍入与截断)
定位:前置知识章。量化本质上是在回答"一个数用多少 bit、以什么格式表示"——所以它站在三块地基之上:信息论(bit 是什么、能压缩到什么程度)、编码(整数/浮点在硬件里怎么编码)、计算机组成(为什么位宽直接决定性能)。本章把这三块地基一次性补齐,全部内容都以"服务于后面的量化推导"为取舍标准。 对应:MIT 6.5940 Lecture 5 开头的数据类型总览;Inference Engineering Ch5 的 Number Formats 前情;经典教材 IEEE 754 部分。 学完本章你应该能:① 说出 b bit 能表示多少种取值、均匀分布的熵是多少;② 手写 4-bit 补码并解释为什么用补码;③ 手算一个数的 FP32/FP16 位模式,解释 exponent bias、次正规数、machine epsilon;④ 分清 6 种舍入模式,并解释为什么量化用 round-half-even;⑤ 分清"截断(truncation)“和"饱和(clamp)",并证明截断噪声是舍入的 4 倍。
目录(本章) #
- 本章目标
- 信息论三件套:bit、熵、率失真
- 整数表示
- 定点数与 scale 的世界
- IEEE 754 浮点数
- 舍入(Rounding)
- 截断(Truncation)与饱和(Clamp)
- 计算机组成视角:为什么 bit 少就快
- 预备知识$\to$量化概念映射表
- 习题与解答
- 延伸阅读
1. 本章目标 #
用一句话概括本章的位置:
量化的全部数学(02 章)都在做一件事:把一个实数 r 用"有限个 bit"表示出来;而"有限个 bit 能表示什么、表示得有多准、代价是什么"正是本章的内容。
后面的章节会频繁用到本章的四个结论,先记住它们:
- b bit 只有$2^b$种位模式——这是所有压缩的起点。
- 整数用补码表示,INT8 的范围是 [−128, 127]——量化公式里的 qmin/qmax 就是从这来的。
- 浮点 = 符号位 + 偏置指数 + 尾数,指数位换动态范围、尾数位换精度——FP16/BF16/FP8 的全部区别都在这句话里。
- 舍入误差 ≤ 半步长($\Delta /2$),截断误差 ≤ 一步长($\Delta$)且噪声功率是舍入的 4 倍——所以量化默认"四舍五入"而不是"直接砍掉”。
2. 信息论三件套:bit、熵、率失真 #
2.1 bit:信息的基本单位 #
一个 bit 有两种状态(0/1)。b 个 bit 可以组成 $2^b$ 种不同的位模式:
$b = 1 \to 2$种取值$b = 4 \to 16$种取值 $b = 8 \to 256$种取值$b = 16 \to 65,536$种取值
这就是量化格式表里"Distinct Values Representable"($FP16/BF16 = 65,536$,$FP8 = 256$,$FP4 = 16$)的来历。位宽 b 直接决定了"码本"(codebook)的大小。
信息量的定义(Shannon):一个概率为 p 的事件,其信息量为
$I = -\log_2(p)$(单位:bit)
直觉:p 越小,事件越"意外",信息量越大。log2 让"两个独立事件合起来的信息量 = 各自信息量之和",这是 bit 取对数的根本原因。
2.2 熵:表示一个分布最少需要多少 bit #
一个随机变量 X 的熵(entropy)是它的平均信息量:
$$ H(X) = -\sum _i p_{i} \cdot \log_2(p_{i}) $$熵是"无损压缩"的下界:用 b 个 bit 表示 X 的所有可能取值,如果 b < H(X) 就一定会有信息损失;如果$b \ge \lceil H\rceil$理论上可以做到无损。
两个极端:
| 分布 | H(bit) | 含义 |
|---|---|---|
| 均匀分布在$2^b$个值上 | b | 每个值等概率,无法压缩 |
| $P(0)=0.9, P(1)=0.1$ | ≈ $0.469$ | 大量冗余,理论上 1 bit 足够甚至还可以进一步压缩 |
均匀分布时$H = b$,正好等于位宽。这就是为什么"均匀量化 + 均匀分布"是最理想的情形:码本没有浪费。
2.3 率失真:有损压缩的边界(直觉版) #
无损压缩的下界是熵 H;但量化是有损的。率失真理论回答:给定允许的失真 D,最小需要的速率 R(D) 是多少(R 随 D 增大而减小)。
对量化而言:
码本大小$2^b ↔$速率 b bit 量化误差$\varepsilon ^{2} ↔$失真 D
“每$bit \approx 6 dB$"(02 章会完整推导)本质就是均匀量化器的一条率失真曲线:速率每 +1 bit,失真(噪声功率)÷4,即 SNR +6 dB。
不需要掌握率失真定理的证明,但要建立这个直觉:量化是在"速率"和"失真"之间沿着一条曲线做交易,而不同的编码方式(均匀网格、非均匀网格、浮点)对应不同的曲线。 后续每一篇论文(GPTQ/AWQ/QuIP#…)都是在"同样的 b bit 预算下,把曲线往左上方推”。
2.4 信息论视角预演:outlier 问题 #
假设某个权重张量 90% 的值在$[-1, 1]$,10% 的值在$\pm 100$附近。它的熵其实不高(大部分值集中在小区间),但动态范围很大。
如果用一个均匀网格覆盖$[-100, 100]$,绝大多数码字落在没人用的区域:
网格: -100 ... -1 ... 0 ... 1 ... 100
实际值: ████████████████
码字利用率: ~1%(90% 的值挤在 1% 的码字里)
结果:正常值的有效位宽被 outlier 稀释(02 章算过:范围只用了 1/100,等效丢约 6.6 bit)。这就是 LLM.int8()、SmoothQuant、AWQ 要解决的同一个问题。先有信息论的框架,才能看懂他们为什么这么设计。
3. 整数表示 #
3.1 无符号整数(Unsigned) #
b bit 无符号整数表示$0 \sim 2^b - 1$:
4-bit 无符号:$0000=0, 0001=1, ..., 1111=15$
适合"天然非负"的量(地址、计数)。量化的非对称形式会用到它:值域$[0, 255]$对应无符号 INT8。
3.2 有符号整数:补码(Two’s Complement)——硬件唯一真解 #
b bit 补码表示范围:
$$ [-2^{b-1}, 2^{b-1} - 1] $$4-bit 例子:
| 位模式 | 补码值 | 位模式 | 补码值 | |
|---|---|---|---|---|
| 0111 | 7 | 1000 | −8 | |
| 0011 | 3 | 1101 | −3 | |
| 0001 | 1 | 1111 | −1 | |
| 0000 | 0 | 1001 | −7 |
求负数:按位取反 + 1。
求 -5 的 4-bit 补码: $5 = 0101 \to$取反$1010 \to +1 \to 1011$(= $-5$)✓
为什么硬件用补码?三个原因:
- 加减法统一:$a - b = a + (-b)$,同一套加法器处理所有情况,不需要专门的减法器。
- 0 唯一:0000 和 1000 不会同时表示 0(原码/反码都有$\pm 0$问题,见 3.3)。
- 符号位自然融入:最高位就是符号位(1 为负),但不用单独判断,加法器自动处理。
记忆法:补码 = “取反加一”;最小的负数(1000)是"取反加一"自指(−8 的补码还是 1000),这是它比 7 多一个的原因。
3.3 原码 / 反码的坑(为什么被淘汰) #
| 编码 | 表示 -0? | 4-bit 的 -0 位模式 | 问题 |
|---|---|---|---|
| 原码(sign-magnitude) | 是 | 1000 | 比较大小要判符号;$\pm 0$两个零 |
| 反码(ones’ complement) | 是 | 1111 | 加法需要循环进位修正 |
| 补码 | 否 | 无 | 加法统一、0 唯一 |
有意思的是:浮点数恰恰用的是"原码"思想(符号位 + 尾数绝对值),因为浮点运算不需要比较整数大小,而原码的对称性($\pm 0$)在浮点里是刻意保留的(见 5.3)。
3.4 溢出:饱和(Saturation)vs 环绕(Wraparound) #
INT8 的 127 + 1 会怎样?取决于硬件/软件策略:
环绕(wraparound):$127 + 1 = -128$(模$2^{8}$,补码天然行为) 饱和(saturation):$127 + 1 = 127$(clamp 到边界)
量化里的 clamp(q, qmin, qmax) 就是饱和。饱和牺牲一点动态范围,但不会让数值"跳到对面去"——这对神经网络非常重要:一个溢出变成 −128 的激活值会彻底破坏后续计算。
3.5 从整数编码到量化:qmin/qmax 的来源 #
量化公式里的量化值域直接来自整数编码:
INT8 无符号:$q \in [0, 255] \to$用于非对称量化 INT8 有符号:$q \in [-128, 127] \to$对称量化默认值域 对称量化的实际网格:$q \in [-127, 127]$(用$2^{b-1}-1$作分母时,-128 不参与)
以后看到"对称 INT8 用 127 做分母、有些 kernel 用 128"不要困惑——127 来自$2^{b-1}-1$(保证$\pm$对称且 0 精确),128 来自$2^{b-1}$(把补码的 −128 也用上)。两个约定各有拥趸,不影响原理。
4. 定点数与 scale 的世界 #
4.1 定点数(Fixed-Point) #
定点数 = 整数 + 一个固定的缩放因子 scale:
真实值 = 整数 q × scale s
Q 格式记法:Qm.n 表示 m 位整数 + n 位小数(如 Q1.7 表示 1 位整数位、7 位小数位,共 8 bit)。
4.2 量化就是"把浮点转定点" #
回看 02 章的对称量化公式:
$$ q = \operatorname{round}(r / s), \hat{r} = q \cdot s $$这就是定点化的标准流程:除以$scale \to$取整$\to$乘回 scale。整数 q 就是定点表示,s 就是定点格式的步长。
定点算术的硬件含义:矩阵乘全部用整数乘加,累加器用 FP32(或 INT32)防溢出,最后再乘回 scale。Tensor Core 的整数/低精度浮点乘加单元就是干这个的。
记住这个等价:量化后的推理 = 定点矩阵乘 + 少量 scale 换算。所有"量化推理 kernel"的复杂性都来自怎么把 scale 运算塞进这条流水线(11 章讲 QServe 时深入)。
5. IEEE 754 浮点数 #
5.1 从科学计数法到二进制 #
十进制科学计数法:$3.75 = 1.875 \times 10^{1}$。二进制版本:
$$ 3.75 = 11.11_{2} = 1.111_{2} \times 2^{1} $$浮点存储的就是这三个要素:符号、指数、尾数。
5.2 FP32 位布局与手算 #
$FP32 = 1$位符号 + 8 位指数 + 23 位尾数(隐含 1 位前导 1,共 24 位有效精度):
值= $(-1)^s \times 1.m \times 2^{e - 127}$
其中 e 是指数字段(8 bit,无符号$0\sim 255$),$bias = 127$(指数是"偏置编码",excess-127)。为什么要 bias?让指数部分变成无符号整数,比较大小/排序更简单。
手算 −3.75:
- 符号:负数$\to s = 1$
- $3.75 = 11.11_{2} = 1.111_{2} \times 2^{1} \to$指数真值= $1 \to e = 1 + 127 = 128 = 10000000_{2}$
- 尾数:111 后面补 20 个 0(23 位) 结果:1 10000000 11100000000000000000000 十六进制:0xC0700000
手算 0.1(演示"十进制小数转二进制不精确"):
$0.1 = 0.0001100110011001100110011..._{2}$(0011 无限循环) 规格化:$1.1001100110011... \times 2^{-4}$ 指数:$e = 127 - 4 = 123$ 尾数只取 23 位,第 24 位是$1 \to$舍入进位 结果:存储值= $0.100000001490116119384765625 \ne 0.1$
这就是"$0.1 + 0.2 \ne 0.3$“的根源:0.1 和 0.2 在二进制下都是无限循环小数,存储时已经被舍入。量化同理——先接受"表示本身就带误差”,才能理性地讨论"量化误差"。
5.3 特殊值、次正规数与 machine epsilon #
FP32 指数全 0 / 全 1 时进入特殊状态:
| 指数字段 | 尾数字段 | 含义 | 值 |
|---|---|---|---|
| $e = 0$ | $m = 0$ | $\pm 0$ | 有 +0 / −0(原码思想的残留) |
| $e = 0$ | $m \ne 0$ | 次正规数(subnormal) | $(-1)^s \times 0.m \times 2^{-126}$ |
| $1 \le e \le 254$ | 任意 | 规格化数(normal) | $(-1)^s \times 1.m \times 2^{e-127}$ |
| $e = 255$ | $m = 0$ | $\pm \infty$ | 溢出/除零 |
| $e = 255$ | $m \ne 0$ | NaN | 0/0、√负 等非法运算 |
次正规数(denormal)存在的意义:让数值在接近 0 时"平滑下溢"而不是直接跳成 0(避免除以接近 0 的数时出现空洞)。代价是精度和速度都差一些。
machine epsilon:1 与下一个可表示的浮点数之间的距离:
$\varepsilon = 2^{-M}$,M 为尾数位数
$$ \begin{aligned} FP32: \varepsilon &= 2^{-23} \approx 1.19e-7 FP16: \varepsilon &= 2^{-10} \approx 9.77e-4 BF16: \varepsilon &= 2^{-7} \approx 7.81e-3 \end{aligned} $$浮点数的相对精度≈ $\varepsilon /1$的量级:尾数每少 1 bit,相对精度减半。
5.4 FP16 与 BF16:同一个 16 bit 预算,两种分配 #
| 格式 | 符号 | 指数 | 尾数(含隐含位) | bias | 最大正常值 | 最小正常值 | $\varepsilon$ |
|---|---|---|---|---|---|---|---|
| FP16 | 1 | 5 | 11(10 存储) | 15 | 65,504 | $2^{-14} \approx 6.1e-5$ | $2^{-10} \approx 9.8e-4$ |
| BF16 | 1 | 8 | 8(7 存储) | 127 | ≈ $3.4e38$(同 FP32) | $2^{-126}$(同 FP32) | $2^{-7} \approx 7.8e-3$ |
关键对比:
FP16:指数$5 bit \to$范围小($\sim \pm 65k$),尾数$11 bit \to$精度高 BF16:指数$8 bit \to$范围同 FP32,尾数$8 bit \to$精度低(约 3 位十进制)
这解释了 Inference Engineering Ch5 的一句话:“exponent gives higher dynamic range than integers”——指数位多的格式能表示更大的数量级跨度,这在训练(梯度跨多个数量级)里极其重要;而推理时值域已知且稳定,可以牺牲范围换精度,于是 FP16 做推理默认格式、BF16 做训练主流。
5.5 动态范围 vs 精度:浮点格式的永恒 tradeoff #
位预算固定时: 指数位$↑ \to$动态范围 ↑、精度 ↓ 尾数位$↑ \to$精度 ↑、动态范围 ↓
这一条是 03 章"数值格式"的总纲:FP8 的 E4M3(指数 4、尾数 3)与 E5M2(指数 5、尾数 2)就是同一位预算下的两种分配;FP4(E2M1)是更极端的压缩。看到任何格式的名字(E×M×),第一反应就是算它的动态范围和精度。
6. 舍入(Rounding) #
6.1 为什么需要舍入 #
真实数在二进制下几乎总是无限精度的(比如 0.1),而存储/计算格式只有有限位。把高精度结果塞进有限位,有两个策略:
策略 A:舍入(round)——找最近的可用值$\to$误差 ≤ 半个格距 策略 B:截断(truncate)——直接砍掉低位$\to$误差可达一个格距
量化里的 round(r/s) 就是策略 A;int(r/s)(强制取整)是策略 B。
6.2 六种舍入模式 #
| 模式 | 2.5 | −2.5 | 2.7 | −2.7 |
|---|---|---|---|---|
| round-half-even(银行家舍入) | 2 | −2 | 3 | −3 |
| round-half-away-from-zero | 3 | −3 | 3 | −3 |
| round-half-up(向 +∞) | 3 | −2 | 3 | −2 |
| truncation(向 0 截断) | 2 | −2 | 2 | −2 |
| floor(向下取整) | 2 | −3 | 2 | −3 |
| ceil(向上取整) | 3 | −2 | 3 | −2 |
6.3 为什么 IEEE 754 默认 round-half-even #
round-half-even 的规则:恰好落在两个整数正中间时,取偶数的那个。
$2.5 \to 2$(2 是偶数)$3.5 \to 4$(4 是偶数)
$$ -2.5 \to -2 -3.5 \to -4 $$为什么不用更"直觉"的 half-away-from-zero?
- 无偏性:half-away 对 +2.5 向上、−2.5 向下,在大数据量下误差会系统性偏向一侧(均值不为 0);half-even 正负对称、期望误差为 0。
- 避免累积漂移:金融/科学计算里大量求和时,系统性偏差会线性累积;half-even 让误差在统计上相互抵消。
量化里的意义:模型有上亿次量化/反量化,任何系统性偏差都会被放大,所以默认用无偏舍入。PyTorch 的 torch.round、NumPy 的 np.round 都是 half-even;CUDA 的 __float2int_rn 也是 round-to-nearest-even。部分量化库(如 bitsandbytes)用 round-to-nearest(half-away),实际影响通常很小,但做严格对比实验时要注意复现性。
补充:训练里还有一种随机舍入(stochastic rounding):以概率往上下取整,期望值恰好等于原数。它在 QAT 里用于去掉量化噪声的偏差(09 章会再见到)。
6.4 舍入的误差界 #
当 r 落在量化范围内时:
$$ |\varepsilon_{ ext{round}}| \le \Delta /2 $$且假设误差在$[-\Delta /2, \Delta /2]$均匀分布时:
$$ E[\varepsilon ] = 0, Var[\varepsilon ] = \Delta ^{2}/12 $$这是 02 章 6 dB/bit 推导的出发点。舍入 = 无偏 + 最小噪声,所以量化默认舍入而不是截断。
7. 截断(Truncation)与饱和(Clamp) #
7.1 截断 vs 舍入:噪声功率差 4 倍 #
向 0 截断(truncation toward zero):正数误差落在$[0, \Delta )$,负数误差落在$(-\Delta , 0]$。
对对称分布的信号:
截断:$Var[\varepsilon ] = \Delta ^{2}/3$ 舍入:$Var[\varepsilon ] = \Delta ^{2}/12$ 比值:4 倍= $6 dB$
所以"能舍入就别截断"——截断白白损失 6 dB(约等于 1 bit)。这也是为什么 int(x) 直接砍小数位做量化是坏习惯。
对单侧分布(比如全正的激活),截断还有系统性偏差:
所有正值的$\hat{r} \le r \to E[\varepsilon ] = +\Delta /2$(输出系统性偏小)
这种偏差在深层网络里会累积成可观察的质量问题。
7.2 术语澄清:两种"截断" #
中文/英文里"截断"有两个容易混淆的含义:
| 术语 | 英文 | 含义 | 在量化里的角色 |
|---|---|---|---|
| 位截断 | truncation | 丢弃低位 bit(向 0 取整) | 坏习惯,噪声 4 倍 |
| 值域截断 | clamping / saturation | 超出 [rmin, rmax] 的值压到边界 | 02 章的$\varepsilon_{ ext{clip}}$,outlier 的锅 |
02 章说"量化误差 = 舍入 + 截断",那个"截断"其实是 clamping(值域饱和),不是位截断。 分清这两个词,读论文才不会晕。
7.3 clamp 的误差特征 #
$\varepsilon_{ ext{clip}} = r - r_{\max}$(当 r > rmax)或 r - rmin(当 r < rmin)
关键性质:
- 与位宽无关:bit 再多,边界外的值照样被压到边界。
- 可任意大:outlier 离边界越远,误差越大。
- 有方向性:全部压向边界,均值不为 0。
所以量化器设计的第一课是:范围(rmin/rmax)选择比舍入模式重要得多——舍入只决定$\Delta /2$以内的精细误差,范围决定会不会出现灾难性截断(04 章专门讲校准与范围选择)。
8. 计算机组成视角:为什么 bit 少就快 #
8.1 存储层次与数据搬运 #
现代 GPU/CPU 的存储层次(从快到慢):
寄存器(几 KB)$\to L1$(几十 KB)$\to L2$(几 MB)$\to$共享/显存 HBM(几十 GB) 延迟递增、带宽递减、容量递增
LLM 推理 decode 阶段的本质是:每个 token 都要把权重从 HBM 搬一遍。70B 模型 FP16 权重= $140 GB$,一次 forward 要搬运 140 GB——带宽成了瓶颈,算力反而用不满。
8.2 位宽如何变成性能 #
权重位宽减半($FP16 \to FP8$): 同一次搬运的数据量减半$\to$等效带宽翻倍 HBM 能量消耗近似减半 低精度 Tensor Core 的 FLOPS 翻倍($Hopper FP8 = 2x FP16$)
常被引用的 Horowitz(ISSCC 2014)能量数量级:一次 32-bit DRAM 访问的能量(数百 pJ 量级)比一次 32-bit 整数乘加(几 pJ 量级)高约两个数量级。结论:推理性能瓶颈在"搬数据"而不是"算数",而量化是唯一能直接减少数据搬运量的手段。
8.3 Tensor Core 预告 #
Tensor Core 是 GPU 上的低精度矩阵乘专用单元:一次指令算一块小矩阵(如 16×16×16),支持 FP16/FP8/INT8 等格式。位宽决定它能塞进多少元素(FP16 塞 16 个,FP8 塞 32 个),这就是"FP8 的 FLOPS 是 FP16 的两倍"的硬件原因。03 章讲数值格式时会展开。
9. 预备知识 → 量化概念映射表 #
| 本章概念 | 对应的量化概念 | 后续章节 |
|---|---|---|
| $b bit \to 2^b$个码字 | $FP16=65,536 / FP8=256 / FP4=16$种取值 | 02、03 |
| 熵、率失真 | 均匀量化浪费位、非均匀量化动机、6 dB/bit | 02、06 |
| 补码$q \in [-2^{b-1}, 2^{b-1}-1]$ | qmin/qmax、对称 INT8 的 127 vs 128 | 02 |
| 定点数 = 整数 × scale | 量化公式$q = \operatorname{round}(r/s)$、$\hat{r} = q\cdot s$ | 02、11 |
| IEEE 754:指数换范围、尾数换精度 | FP16 vs BF16、FP8 E4M3 vs E5M2 | 03 |
| machine epsilon | 浮点格式的相对精度(FP8 风险来源) | 03 |
| round-half-even 无偏 | 量化默认舍入、误差≤ $\Delta /2$ | 02 |
| truncation 噪声$\Delta ^{2}/3 vs$舍入$\Delta ^{2}/12$ | 为什么不能 int() 硬截断 | 02 |
| clamp(饱和) | $\varepsilon_{ ext{clip}}$、outlier 截断误差 | 02、04、07 |
| 存储层次、数据搬运 | 位宽 = 带宽 = 性能(30–50% 收益的来源) | 03、11 |
10. 习题与解答 #
题 1(手算):补码 #
写出 4-bit 补码中 −6、−1、0、5 的位模式;验证 −(−6) 用"取反 + 1"能回到 6。
题 1 解答
$6 = 0110 \to$取反$1001 \to +1 \to 1010$(−6)。 $-1 = 0001 \to 1110 \to 1111$。 $0 = 0000$。 $5 = 0101$。 验证:1010(−6)取反$0101 \to +1 \to 0110 = 6 ✓$。
题 2(手算):浮点位模式 #
(a) 把 3.5 写成 FP32 位模式(十六进制)。 (b) 把 −0.75 写成 FP32 位模式。 (c) 把 1.5 写成 FP16 位模式。
题 2 解答
(a) $3.5 = 11.1_{2} = 1.11_{2} \times 2^{1}$。$s=0$,$e=128=10000000_{2}$,$m=11000...0 \to$0 10000000 11000000000000000000000= $0x40600000$。
(b) $0.75 = 0.11_{2} = 1.1_{2} \times 2^{-1}$。$s=1$,$e=127-1=126=01111110_{2}$,$m=1000...0 \to$1 01111110 10000000000000000000000= $0xBF400000$。
(c) $FP16 bias=15$。$1.5 = 1.1_{2} \times 2^{0}$。$s=0$,$e=15=01111_{2}$,$m=10 0000 0000 \to$0 01111 1000000000= $0x3E00$。
题 3(填表):舍入模式 #
对 1.5、−1.5、2.3 分别填出 6 种舍入模式的结果。
题 3 解答
| 模式 | 1.5 | −1.5 | 2.3 |
|---|---|---|---|
| half-even | 2 | −2 | 2 |
| half-away | 2 | −2 | 2 |
| half-up | 2 | −1 | 2 |
| truncation | 1 | −1 | 2 |
| floor | 1 | −2 | 2 |
| ceil | 2 | −1 | 3 |
题 4(计算):熵 #
(a) 分布 {0.5, 0.25, 0.25} 的熵是多少?与 2-bit 均匀分布比较。 (b) 一个 8-bit 均匀量化器,码本 256 个值;如果实际值只有其中 16 个等概率取值,熵是多少?这说明什么?
题 4 解答
(a) $H = -0.5\cdot \log_2(0.5) - 0.25\cdot \log_2(0.25) - 0.25\cdot \log_2(0.25) = 0.5 + 0.5 + 0.5 = 1.5 bit$。2-bit 均匀分布熵= $2 bit$。前者用 1.5 bit 理论上就够,直接 2-bit 编码浪费 0.5 bit/样本。
(b) 16 个等概率取值$\to H = \log_2(16) = 4 bit$。说明 256 个码字里 240 个是浪费的,等效只有 4 bit 的有效信息——量化器设计应该让"码本尽量贴着真实分布"(非均匀/分组动机,04/06 章)。
题 5(推导):截断噪声是舍入的 4 倍 #
设均匀量化步长$\Delta$,信号足够随机且无截断。证明向 0 截断的噪声功率(对称分布输入下)是舍入的 4 倍。
题 5 解答
舍入误差均匀分布在$[-\Delta /2, \Delta /2]$:$Var = \Delta ^{2}/12$。
向 0 截断:正值误差均匀分布在$[0, \Delta )$,负值误差均匀分布在$(-\Delta , 0]$。对称输入下$E[\varepsilon ]=0$,$E[\varepsilon ^{2}] = (1/\Delta )\int _{0}^\Delta x^{2} dx = \Delta ^{2}/3$(正负各半,均值平方相同)。
比值= $(\Delta ^{2}/3)/(\Delta ^{2}/12) = 4 \to 10\cdot \log_{10}(4) \approx 6.02 dB$。截断白白损失约 1 bit 的有效精度。
题 6(挑战):0.1 的 FP32 舍入 #
0.1 的二进制是 $0.000110011001100110011001100..._2$(0011 循环)。推导它的 FP32 尾数舍入为什么得到"第 23 位进位",并说明存储值比 0.1 大还是小。
题 6 解答
规格化后尾数(含隐含位)为 $1.100110011001100110011001100..._2$,截到第 24 位(隐含位 + 23 位)。第 24 位之后是 1,且非零尾随("> half"),所以按 round-to-nearest 进位:尾数最后一位$0 \to 1$。进位后存储值略大于 0.1(0.100000001490116119384765625 > 0.1)。如果恰好是 half(后面全 0),half-even 规则会起作用;这里不是 half。
11. 延伸阅读 #
- MIT 6.5940 Lecture 5 开场部分(Class Central):数据类型总览
- David Goldberg, What Every Computer Scientist Should Know About Floating-Point Arithmetic(浮点必读,网上免费):IEEE 754 的舍入、epsilon、误差分析
- IEEE 754-2019 标准概述(Wikipedia 词条即可):次正规数、NaN、round-half-even
- Mark Horowitz, “Computing’s Energy Problem (and what we can do about it)”, ISSCC 2014:数据搬运能量的数量级证据
- 下一篇: 02 量化问题的形式化与均匀量化理论——用本章的编码与误差工具,正式建立量化的数学框架。