元数据卡
- 前置知识:第8章 概率论基础,第11章 微积分基础
- 预计时间:50 分钟
- 核心难度:进阶
- 完成标志:理解信息熵的概念,了解浮点数误差的来源
你的进度
应用塔的顶层——也是整座数学塔的塔尖。这里没有符号,没有图形,只有一行缓缓旋转的数字。"信息可以度量。误差可以控制。这座塔的最后一课,是让你明白——数学计算在真实计算机上并不完美。"馆长说。
你的任务
一条消息包含多少"信息"?为什么无损压缩的极限就是那一个理论值?你的程序 0.1 + 0.2 != 0.3——这个 bug 的数学根源是什么?这一章是两个主题的收尾:信息论告诉你信息是"不确定性的减少"——一个可度量的量;数值分析告诉你在有限精度下,数学公式需要重新审视。
本章分层
- 必读:信息熵,浮点数原理与误差
- 选读:交叉熵与 KL 散度,数值稳定性
破局 · 溯源
你的深度学习模型训练总是不收敛。损失函数下降最后变成了 NaN。你翻遍了代码:梯度爆炸了。为什么?——因为数值计算有上限。数学里能让损失函数趋近于 0,但在浮点数世界里,下溢会变成 0,上溢会变成 infinity。
信息熵 H(X) 是信息论的核心量——它度量随机变量 X 的"不确定性":
H(X) = -Σ P(xᵢ) × log₂ P(xᵢ)
单位是比特。熵的最高值出现在所有结果等概率时——此时不确定性最大。"最随机的硬币"是均匀的(50/50),熵 = 1 bit。"偏倚的硬币"(90/10)熵更小,因为结果更容易预测。
这个公式的含义超出直觉。如果天气预报说"明天 90% 的概率下雨",这条消息包含的信息量小于"明天 50% 的概率下雨"——因为前者更有确定性。
交叉熵 H(P, Q) = -Σ P(x) × log₂ Q(x) 在 ML 中是分类问题的标准损失函数。你把真实分布 P(one-hot 编码)和预测分布 Q 作比较。交叉熵越小,预测越准。
浮点数在计算机中如何工作:IEEE 754 标准用 1 位符号、8 位指数、23 位尾数表示单精度浮点数。
值 = (-1)^符号 × (1 + 尾数) × 2^(指数 - 127)这个表示法的主要问题是:数字在数轴上不是均匀分布的。零附近非常密集,远离零越来越稀疏。
0.1 + 0.2 ≠ 0.3 的真相:0.1 在二进制中是无限循环小数(就像 1/3 在十进制中是 0.333...)。计算机必须截断。两个截断后的近似值相加,误差累积,导致结果在比较时和你预期的不同。
// Python
>>> 0.1 + 0.2
0.30000000000000004
>>> 0.1 + 0.2 == 0.3
False这不是 bug——这是物理事实。计算机的"实数"其实是有限精度的有理数。
数值稳定性教你如何避免在计算过程中放大误差:
- 避免大数减小数:a - b 当 a ≈ b 时,相对误差被极度放大(灾难性抵消)。
- 避免除零或除以极小量。
- softmax 的实现通常先减去最大值 (x_i - max) 再计算 e^x,防止指数上溢。
常见陷阱
- 直接比较浮点数相等。应该用
abs(a - b) < epsilon代替a == b。 - 把信息论中的"熵"等同于热力学熵。它们是同源但不同的概念。信息熵是克劳德·香农在 1948 年发表的通信数学理论中定义的——不涉及物理温度。
- 认为"双精度就够了"。对于迭代算法(如数值积分、ODE 求解),舍入误差可以累积到不可接受的水平。Kahan 求和等补偿算法可以缓解,但不能消除。
通关挑战
- 计算一个均匀分布的 4 面骰子的信息熵。
- 在 Python 中验证
0.1 + 0.2的浮点数误差,并用Decimal模块实现精确的十进制计算。 - 实现一个数值稳定的 softmax 函数:输入向量 x,输出每个分量的 e^x_i / Σ e^x_j。注意减去 max(x) 防止溢出。
旅人笔记
信息熵定义了你"能压缩多少"的理论极限。浮点数是你每次做运算时都在支付的误差税。数值分析教你如何让误差不毁掉整个结果——这是理论指向实践的最后一课。
→ 数学塔到此为止。你从逻辑和集合出发,经过证明、递归、关系与函数,再到组合计数、图论、概率和数论,最后攀登到线性代数、微积分、信息论和数值计算。馆长站在塔顶,望着远方:"数学不会在第十二卷终结——每一座新的高塔都会需要它。你准备好了,就继续向前。"