「ml-llm-math.zip」链接https://pan.quark.cn/s/35fc37047e5e前几节我们复习了集合、逻辑、数列、复数这些是数学语言。但当我们真正写代码跑模型时还需要掌握数值计算的“底层规则”。这一节我们来聊三个非常关键但常被忽视的点浮点数精度溢出数值稳定性它们看似是编程细节其实直接影响到模型训练的效果甚至可能导致“损失函数 NaN”的惨剧。0-4 编程与数值计算基础1. 浮点数精度在计算机里数字并不是连续的而是有限的二进制表示。这就带来一个问题很多小数没法被精确表示。例子print(0.10.2)# 输出结果不是 0.3而是0.30000000000000004为什么因为二进制小数不能精确表示 0.1 和 0.2它们只能存储为近似值。生活类比就像你用“分米”为单位来丈量房间有些长度比如 2.75 米就量不准只能近似到 2.8 米。在机器学习中的影响参数更新当学习率非常小如1 e − 9 1e^{-9}1e−9更新值可能因为精度问题被“吞掉”参数不变。比较大小判断两个浮点数是否相等时要小心推荐用math.isclose()或设置一个容差。2. 溢出Overflow / Underflow溢出overflow数太大超过计算机能表示的范围。例如math.exp(1000)→ 会得到inf无穷大。下溢underflow数太小被当作 0。例如math.exp(-1000)→ 会得到0.0。importmathprint(math.exp(1000))# infprint(math.exp(-1000))# 0.0生活类比溢出像是往一个 500ml 杯子里倒 1000ml 水 → 溢出来了。下溢像是往杯子里倒一滴水 → 看起来就像没水。在机器学习中的影响softmax 函数softmax ( x i ) e x i ∑ j e x j \text{softmax}(x_i) \frac{e^{x_i}}{\sum_j e^{x_j}}softmax(xi)∑jexjexi如果x i x_ixi特别大e x i e^{x_i}exi会溢出成inf导致结果变成NaN。常见解决方案在 softmax 前减去最大值xx-np.max(x)exp_xnp.exp(x)softmaxexp_x/np.sum(exp_x)这样避免指数爆炸。3. 数值稳定性数值稳定性Numerical Stability指的是计算过程中是否会因为精度误差或溢出而导致结果不可靠。典型问题大数相减灾难性消除例如( 10 6 0.001 ) − 10 6 0.001 (10^6 0.001) - 10^6 0.001(1060.001)−1060.001但在计算机里由于10 6 10^6106太大0.001 可能被“忽略”导致结果变成 0。累加误差例如对一个大数组求和先加小数再加大数 vs 先加大数再加小数结果可能不同。这就是浮点数的加法不满足严格结合律( a b ) c ≠ a ( b c ) (ab)c \neq a(bc)(ab)ca(bc)。浮点精度溢出/下溢累积误差输入数据数值计算近似结果inf / 0不稳定结果图示说明数值计算中可能产生多种不稳定情况最终影响结果。在机器学习中的解决方法对数技巧log-trick在计算概率时经常用 log 形式log ( a ⋅ b ) log a log b \log(a \cdot b) \log a \log blog(a⋅b)logalogb避免了直接相乘导致的 underflow。正规化在 softmax、batch normalization 中通过缩放数据避免极端值。高精度计算有些框架支持float64或混合精度训练mixed precision在效率和稳定性之间取平衡。小结浮点数精度计算机只能存近似小数可能导致0.1 0.2 ≠ 0.3 0.10.2 \neq 0.30.10.20.3。溢出/下溢数太大变成无穷大数太小变成 0。数值稳定性累积误差、灾难性消除会让计算结果不可靠。联系 AI 的意义在深度学习中训练失败的常见原因就是“数值不稳定”比如梯度爆炸、loss 变 NaN。掌握这些基础能帮助我们写出更健壮的训练代码。
8-机器学习与大模型开发数学教程-第0章 预备知识-0-8 编程与数值计算基础(浮点数精度、溢出、数值稳定性)
发布时间:2026/5/25 21:56:30
「ml-llm-math.zip」链接https://pan.quark.cn/s/35fc37047e5e前几节我们复习了集合、逻辑、数列、复数这些是数学语言。但当我们真正写代码跑模型时还需要掌握数值计算的“底层规则”。这一节我们来聊三个非常关键但常被忽视的点浮点数精度溢出数值稳定性它们看似是编程细节其实直接影响到模型训练的效果甚至可能导致“损失函数 NaN”的惨剧。0-4 编程与数值计算基础1. 浮点数精度在计算机里数字并不是连续的而是有限的二进制表示。这就带来一个问题很多小数没法被精确表示。例子print(0.10.2)# 输出结果不是 0.3而是0.30000000000000004为什么因为二进制小数不能精确表示 0.1 和 0.2它们只能存储为近似值。生活类比就像你用“分米”为单位来丈量房间有些长度比如 2.75 米就量不准只能近似到 2.8 米。在机器学习中的影响参数更新当学习率非常小如1 e − 9 1e^{-9}1e−9更新值可能因为精度问题被“吞掉”参数不变。比较大小判断两个浮点数是否相等时要小心推荐用math.isclose()或设置一个容差。2. 溢出Overflow / Underflow溢出overflow数太大超过计算机能表示的范围。例如math.exp(1000)→ 会得到inf无穷大。下溢underflow数太小被当作 0。例如math.exp(-1000)→ 会得到0.0。importmathprint(math.exp(1000))# infprint(math.exp(-1000))# 0.0生活类比溢出像是往一个 500ml 杯子里倒 1000ml 水 → 溢出来了。下溢像是往杯子里倒一滴水 → 看起来就像没水。在机器学习中的影响softmax 函数softmax ( x i ) e x i ∑ j e x j \text{softmax}(x_i) \frac{e^{x_i}}{\sum_j e^{x_j}}softmax(xi)∑jexjexi如果x i x_ixi特别大e x i e^{x_i}exi会溢出成inf导致结果变成NaN。常见解决方案在 softmax 前减去最大值xx-np.max(x)exp_xnp.exp(x)softmaxexp_x/np.sum(exp_x)这样避免指数爆炸。3. 数值稳定性数值稳定性Numerical Stability指的是计算过程中是否会因为精度误差或溢出而导致结果不可靠。典型问题大数相减灾难性消除例如( 10 6 0.001 ) − 10 6 0.001 (10^6 0.001) - 10^6 0.001(1060.001)−1060.001但在计算机里由于10 6 10^6106太大0.001 可能被“忽略”导致结果变成 0。累加误差例如对一个大数组求和先加小数再加大数 vs 先加大数再加小数结果可能不同。这就是浮点数的加法不满足严格结合律( a b ) c ≠ a ( b c ) (ab)c \neq a(bc)(ab)ca(bc)。浮点精度溢出/下溢累积误差输入数据数值计算近似结果inf / 0不稳定结果图示说明数值计算中可能产生多种不稳定情况最终影响结果。在机器学习中的解决方法对数技巧log-trick在计算概率时经常用 log 形式log ( a ⋅ b ) log a log b \log(a \cdot b) \log a \log blog(a⋅b)logalogb避免了直接相乘导致的 underflow。正规化在 softmax、batch normalization 中通过缩放数据避免极端值。高精度计算有些框架支持float64或混合精度训练mixed precision在效率和稳定性之间取平衡。小结浮点数精度计算机只能存近似小数可能导致0.1 0.2 ≠ 0.3 0.10.2 \neq 0.30.10.20.3。溢出/下溢数太大变成无穷大数太小变成 0。数值稳定性累积误差、灾难性消除会让计算结果不可靠。联系 AI 的意义在深度学习中训练失败的常见原因就是“数值不稳定”比如梯度爆炸、loss 变 NaN。掌握这些基础能帮助我们写出更健壮的训练代码。