当前位置: 首页 > news >正文

【漫话机器学习系列】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) 这个重要的数学技巧,并能够在实际应用中灵活使用!


http://www.mrgr.cn/news/92883.html

相关文章:

  • 动态规划多阶段报童模型,c++ 实现, java 实现
  • yolov8,yolo11,yolo12 服务器训练到部署全流程 笔记
  • Verilog:I2C控制器
  • 【RAG】Embeding 和 Rerank学习笔记
  • Excel基础(详细篇):总结易忽视的知识点,有用的细节操作
  • 基因枷锁下的太空梦 —— 千钧一发电影观后感
  • (原创)用python语言基于paddleocr构建批量识别实现纸质和电子的增值税专用发票程序
  • 【漫话机器学习系列】112.逻辑回归(Logistic Regression)
  • Linux tar命令
  • 【漫话机器学习系列】114.逻辑 Sigmoid 函数
  • LE AUDIO广播规范之BASE
  • 【数据结构】堆与二叉树
  • 【漫话机器学习系列】113.逻辑回归(Logistic Regression) VS 线性回归(Linear Regression)
  • 使用Python自动生成图文并茂的网页分析报告
  • React生态、Vue生态与跨框架前端解决方案
  • 【每日学点HarmnoyOS Next知识】web加载pdf、Toggle禁用、Grid多次渲染问题、Web判断是否存在title、 List侧滑栏关闭
  • vite+react+ts如何集成redux状态管理工具,实现持久化缓存
  • 利用opencv_python(pdf2image、poppler)将pdf每页转为图片
  • vcpkg 与 CMake 集成的步骤
  • Hadoop之02:MR-图解