欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > 【漫话机器学习系列】111.指数之和的对数(Log-Sum-Exp)

【漫话机器学习系列】111.指数之和的对数(Log-Sum-Exp)

2025/4/17 10:35:37 来源:https://blog.csdn.net/IT_ORACLE/article/details/145943169  浏览:    关键词:【漫话机器学习系列】111.指数之和的对数(Log-Sum-Exp)

在计算机科学和机器学习中,经常会遇到计算指数和的对数的情况,例如:

c = \log \sum_{i=1}^{n} e^{x_i}

然而,由于指数函数 e^x 的值增长极快,直接计算可能会导致数值上溢(overflow)或下溢(underflow),影响计算的准确性。为了避免这些问题,我们可以使用 Log-Sum-Exp (LSE) 技巧,本篇文章将详细介绍该技巧的原理、推导过程以及实际应用。


1. Log-Sum-Exp (LSE) 的问题背景

1.1 直接计算的数值问题

考虑上式:

S = \sum_{i=1}^{n} e^{x_i}

然后取对数:

c = \log S = \log \sum_{i=1}^{n} e^{x_i}

如果 x_i 中的某些值非常大,比如 x_i = 1000,那么 e^{x_i}​ 将会是一个极大的数,可能超出计算机浮点数的表示范围,导致溢出
另一方面,如果所有 x_i​ 都是非常小的负数,比如 x_i = -1000,那么 e^{x_i} 会趋近于 0,可能在计算机上被认为是 0,导致下溢

这些情况都会导致计算结果的不稳定或者不准确,因此需要使用 Log-Sum-Exp 技巧 来优化计算。


2. Log-Sum-Exp (LSE) 变换

为了避免上溢和下溢,我们可以做如下变换:

\log \sum_{i=1}^{n} e^{x_i}

由于指数函数的特性,我们可以从求和的项中提取一个最大值,使得剩余的项不会导致溢出或下溢。

2.1 变换公式

\log \sum_{i=1}^{n} e^{x_i} = a + \log \sum_{i=1}^{n} e^{x_i - a}

其中:

a = \max(x)

2.2 变换的直观理解

  • 原理:将所有的指数项归一化,以最大值 a 为中心,使得所有的指数计算不会超出数值范围。
  • 作用:这样做可以保证 x_i - a 的最大值始终为 0(因为 a 是最大值),从而避免指数计算时的数值问题。
  • 计算简化:由于 e^{x_i - a} 的最大值始终为 1(当 x_i = a 时),这样可以防止上溢,同时较小的指数值(负指数)也不会被计算机当作 0 处理,避免下溢。

3. 公式推导

假设:

a = \max(x_1, x_2, ..., x_n)

我们将公式改写:

S = \sum_{i=1}^{n} e^{x_i}

因 a 是最大值,我们可以提取 e^a 作为因子:

S = e^a \sum_{i=1}^{n} e^{x_i - a}

然后取对数:

\log S = \log \left(e^a \sum_{i=1}^{n} e^{x_i - a}\right)

利用对数的性质:

\log(ab) = \log a + \log b

可以得到:

\log S = \log e^a + \log \sum_{i=1}^{n} e^{x_i - a}

又因为:

\log e^a = a

最终得到:

\log \sum_{i=1}^{n} e^{x_i} = a + \log \sum_{i=1}^{n} e^{x_i - a}


4. 实际应用

4.1 在数值计算中的应用

Log-Sum-Exp 技巧主要用于避免计算机的数值溢出问题,在以下场景中非常常见:

  • 计算 softmax 函数:Softmax 用于将一组数值转换为概率分布:

    P(y_i) = \frac{e^{x_i}}{\sum_{j=1}^{n} e^{x_j}}​​
    其中的分母部分就是 Log-Sum-Exp 形式,使用 LSE 技巧可以防止计算错误。
  • 计算对数概率:在许多统计和机器学习模型中,比如 HMM(隐马尔可夫模型)、GMM(高斯混合模型),需要计算对数概率,而 Log-Sum-Exp 变换可以避免概率值过小导致的数值问题。

4.2 代码实现

在 Python 中,我们可以使用 numpy 提供的 logsumexp 方法来实现:

import numpy as np
from scipy.special import logsumexpx = np.array([1000, 1001, 1002])
c = logsumexp(x)
print(c)  # 正确计算结果,避免溢出

输出结果 

1002.4076059644444

如果不使用 logsumexp,直接计算 np.log(np.sum(np.exp(x))),可能会导致 inf(上溢出)。


5. 结论

5.1 Log-Sum-Exp 的核心作用

  • 避免指数计算时的上溢出(overflow)和下溢出(underflow)
  • 提高计算的数值稳定性,特别是在计算 softmax 和对数概率时。

5.2 LSE 的计算流程

  1. 找到最大值 a = \max(x)
  2. 归一化指数项 e^{x_i - a},防止数值过大或过小。
  3. 重新计算对数,得到稳定的 Log-Sum-Exp 结果。

这种方法在机器学习和深度学习中非常常见,可以提高模型的数值计算稳定性,避免不必要的错误。


6. 总结

  • 直接计算 Log-Sum-Exp 时可能会导致数值溢出问题
  • 使用最大值 aaa 进行变换,可以避免溢出,同时保证计算的稳定性
  • 在深度学习、统计建模、概率计算等领域,Log-Sum-Exp 技巧被广泛应用
  • Python 提供了 scipy.special.logsumexp 直接计算该公式,推荐使用

希望本文能帮助大家理解 Log-Sum-Exp(LSE) 这个重要的数学技巧,并能够在实际应用中灵活使用!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词