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

【漫话机器学习系列】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}

如果 xix_ixi​ 中的某些值非常大,比如 x_i = 1000,那么 e^{x_i}​ 将会是一个极大的数,可能超出计算机浮点数的表示范围,导致溢出
另一方面,如果所有 xix_ixi​ 都是非常小的负数,比如 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 是最大值),从而避免指数计算时的数值问题。
  • 计算简化:由于 exi−ae^{x_i - a}exi​−a 的最大值始终为 1(当 xi=ax_i = axi​=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 logsumexp

x = np.array([1000, 1001, 1002])
c = logsumexp(x)
print(c)  # 正确计算结果,避免溢出

如果不使用 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.kler.cn/a/567876.html

相关文章:

  • Flink同步数据mysql到doris问题合集
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_init_cycle 函数 - 详解(5)
  • vue3-print-nb的使用,点击回调
  • 《深度揭秘:生成对抗网络如何重塑遥感图像分析精度》
  • PHP的学习
  • include 与 require 的区别及最佳使用场景
  • 如何正确理解mAP、精度、召回率等概念
  • AQS源码级别解析
  • Redis大key如何处理的?
  • 【Java进阶】java设计模式之单例模式
  • c++_sort函数
  • Java设计模式 —— 【行为型模式】中介者模式(Mediator Pattern)详解
  • 实验环境搭建集锦(docker linux ros2+强化学习环境+linux上单片机串口调试)
  • OpenAI 正式发布 GPT-4.5 模型
  • FastAdmin 与其他后台框架的对比分析
  • 使用AI后为什么思考会变得困难?
  • INT202 Complexity of Algroithms 算法的复杂度
  • 第49天:Web开发-JavaEE应用SpringBoot栈模版注入ThymeleafFreemarkerVelocity
  • JVM垃圾回收机制垃圾回收相关算法垃圾收集器
  • 域名解析ip后如何查询该ip地址