随机变量的变换的Log-Sum-Exp技巧
字数 2930 2025-12-14 08:44:31

随机变量的变换的Log-Sum-Exp技巧

  1. 背景与动机
    在概率计算、统计建模和机器学习中,我们经常遇到需要计算多个数值的对数之和,特别是当这些数值是指数形式时。例如,在计算离散随机变量的概率质量函数(尤其多项逻辑回归的Softmax函数)、评估混合模型的似然函数、或在图模型中进行消息传递时,经常会遇到形如 \(\log\left( \sum_{i=1}^{n} e^{x_i} \right)\) 的表达式。直接计算会遇到数值不稳定的问题:如果某些 \(x_i\) 非常大,\(e^{x_i}\) 可能超过计算机浮点数的表示范围(上溢);如果所有 \(x_i\) 都非常小(绝对值很大的负数),\(e^{x_i}\) 可能下溢为0,导致对数和为0,其对数无定义。

  2. 核心技巧的推导
    Log-Sum-Exp (LSE) 技巧的核心是一个简单的代数恒等式,它通过引入一个缩放因子来避免数值问题。设 \(x_1, x_2, ..., x_n\) 为一组实数。
    基本形式

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

这个等式对任何实数 \(a\) 都成立,因为:

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

两边取对数即得。
  1. 关键参数 \(a\) 的选择与数值稳定性
    等式的成立性不依赖于 \(a\) 的选择,但数值稳定性极度依赖。最优的、普遍的选择是令 \(a = \max(x_1, x_2, ..., x_n)\),即所有 \(x_i\) 中的最大值。将这个 \(a\) 代入公式,我们得到数值稳定的标准计算形式

\[ \text{LSE}(x_1, ..., x_n) := \log\left( \sum_{i=1}^{n} e^{x_i} \right) = \max_i x_i + \log\left( \sum_{i=1}^{n} e^{x_i - \max_i x_i} \right) \]

为什么这样是稳定的? 通过减去最大值 \(a = \max_i x_i\),我们确保了新的指数项 \(e^{x_i - a}\) 满足:

  • 最大值项:对于使得 \(x_i = a\)\(i\),指数项 \(e^{a-a} = e^0 = 1\)
  • 其他项:对于所有 \(i\),有 \(x_i - a \le 0\),因此 \(e^{x_i - a} \in (0, 1]\)
    这完美地解决了上溢问题:最大的指数项被归一化为1,其他项都小于等于1,因此求和结果最大为 \(n\),不可能上溢。同时,它也缓解了下溢问题:虽然很小的 \(x_i - a\) 可能使得 \(e^{x_i-a}\) 下溢为0,但这只对求和影响极小的项发生,而主导项(最大值对应的项)被精确地保留为1,其对数(0)与 \(a\) 相加,确保了结果的精度。
  1. 在Softmax函数中的应用
    Softmax函数是将一个实数向量 \(\mathbf{z} = (z_1, ..., z_K)\) 映射为一个概率分布(和为1)的标准方法:

\[ \sigma(\mathbf{z})_j = \frac{e^{z_j}}{\sum_{k=1}^{K} e^{z_k}}, \quad j=1,...,K \]

直接计算会遇到前述的数值问题。应用Log-Sum-Exp技巧,我们计算如下:
  1. \(m = \max(z_1, ..., z_K)\)
    2. 计算稳定化的Softmax:

\[ \sigma(\mathbf{z})_j = \frac{e^{z_j - m}}{\sum_{k=1}^{K} e^{z_k - m}} \]

分子分母使用相同的偏移量 \(m\),比值保持不变,但所有指数参数 \(z_i - m \le 0\),计算安全。

  1. 计算对数概率(Log-Softmax)
    在机器学习中,我们常需要计算Softmax输出的对数,即 \(\log \sigma(\mathbf{z})_j\),用于交叉熵损失函数。直接计算 \(\log(e^{z_j} / \sum e^{z_k})\) 仍不稳定。结合LSE技巧:

\[ \log \sigma(\mathbf{z})_j = \log\left( \frac{e^{z_j}}{\sum_{k} e^{z_k}} \right) = z_j - \log\left( \sum_{k} e^{z_k} \right) = z_j - \text{LSE}(z_1, ..., z_K) \]

其中 \(\text{LSE}(z_1, ..., z_K)\) 使用上述的稳定化公式 \(m + \log(\sum e^{z_k - m})\) 来计算。这样,我们得到了一个数值稳定的、一步到位的“Log-Softmax”实现。

  1. 在概率分布计算中的推广
    LSE技巧可以推广到更一般的场景。例如,计算一个未归一化的概率分布 \(\tilde{p}_i = e^{s_i}\) 的归一化常数 \(Z = \sum_i e^{s_i}\) 及其对数 \(\log Z\)。这正是LSE的直接应用。更进一步,在计算两个分布的交叉熵或KL散度时,如果涉及对数求和,也常常需要此技巧。

  2. 与指数族的联系
    指数族分布的概率密度/质量函数形式为 \(p(x|\boldsymbol{\eta}) = h(x) \exp\left( \boldsymbol{\eta}^T T(x) - A(\boldsymbol{\eta}) \right)\),其中 \(A(\boldsymbol{\eta})\) 是对数配分函数:\(A(\boldsymbol{\eta}) = \log \int h(x) \exp(\boldsymbol{\eta}^T T(x)) dx\)(连续)或对离散情况求和。计算 \(A(\boldsymbol{\eta})\) 本质上就是一个Log-Sum-Exp(或Log-Integral-Exp)问题。在复杂模型中,近似计算 \(A(\boldsymbol{\eta})\) 或其梯度时,LSE技巧是维持数值稳定的基础。

总结来说,Log-Sum-Exp技巧是一个通过简单的代数操作(减去最大值)来解决指数求和运算中数值上溢/下溢问题的关键技术。它不仅是实现Softmax和Log-Softmax的工业标准,也是任何涉及对数-求和-指数运算的统计与机器学习算法中确保数值鲁棒性的基石。

随机变量的变换的Log-Sum-Exp技巧 背景与动机 在概率计算、统计建模和机器学习中,我们经常遇到需要计算多个数值的对数之和,特别是当这些数值是指数形式时。例如,在计算离散随机变量的概率质量函数(尤其多项逻辑回归的Softmax函数)、评估混合模型的似然函数、或在图模型中进行消息传递时,经常会遇到形如 \( \log\left( \sum_ {i=1}^{n} e^{x_ i} \right) \) 的表达式。直接计算会遇到数值不稳定的问题:如果某些 \( x_ i \) 非常大,\( e^{x_ i} \) 可能超过计算机浮点数的表示范围(上溢);如果所有 \( x_ i \) 都非常小(绝对值很大的负数),\( e^{x_ i} \) 可能下溢为0,导致对数和为0,其对数无定义。 核心技巧的推导 Log-Sum-Exp (LSE) 技巧的核心是一个简单的代数恒等式,它通过引入一个缩放因子来避免数值问题。设 \( x_ 1, x_ 2, ..., x_ n \) 为一组实数。 基本形式 : \[ \log\left( \sum_ {i=1}^{n} e^{x_ i} \right) = a + \log\left( \sum_ {i=1}^{n} e^{x_ i - a} \right) \] 这个等式对任何实数 \( a \) 都成立,因为: \[ \sum_ {i=1}^{n} e^{x_ i} = e^a \sum_ {i=1}^{n} e^{x_ i - a} \] 两边取对数即得。 关键参数 \(a\) 的选择与数值稳定性 等式的成立性不依赖于 \(a\) 的选择,但 数值稳定性 极度依赖。最优的、普遍的选择是令 \( a = \max(x_ 1, x_ 2, ..., x_ n) \),即所有 \( x_ i \) 中的最大值。将这个 \(a\) 代入公式,我们得到 数值稳定的标准计算形式 : \[ \text{LSE}(x_ 1, ..., x_ n) := \log\left( \sum_ {i=1}^{n} e^{x_ i} \right) = \max_ i x_ i + \log\left( \sum_ {i=1}^{n} e^{x_ i - \max_ i x_ i} \right) \] 为什么这样是稳定的? 通过减去最大值 \(a = \max_ i x_ i\),我们确保了新的指数项 \( e^{x_ i - a} \) 满足: 最大值项 :对于使得 \( x_ i = a \) 的 \(i\),指数项 \( e^{a-a} = e^0 = 1 \)。 其他项 :对于所有 \(i\),有 \( x_ i - a \le 0 \),因此 \( e^{x_ i - a} \in (0, 1 ] \)。 这完美地解决了上溢问题:最大的指数项被归一化为1,其他项都小于等于1,因此求和结果最大为 \(n\),不可能上溢。同时,它也缓解了下溢问题:虽然很小的 \( x_ i - a \) 可能使得 \( e^{x_ i-a} \) 下溢为0,但这只对求和影响极小的项发生,而主导项(最大值对应的项)被精确地保留为1,其对数(0)与 \(a\) 相加,确保了结果的精度。 在Softmax函数中的应用 Softmax函数是将一个实数向量 \( \mathbf{z} = (z_ 1, ..., z_ K) \) 映射为一个概率分布(和为1)的标准方法: \[ \sigma(\mathbf{z}) j = \frac{e^{z_ j}}{\sum {k=1}^{K} e^{z_ k}}, \quad j=1,...,K \] 直接计算会遇到前述的数值问题。应用Log-Sum-Exp技巧,我们计算如下: 令 \( m = \max(z_ 1, ..., z_ K) \)。 计算稳定化的Softmax: \[ \sigma(\mathbf{z}) j = \frac{e^{z_ j - m}}{\sum {k=1}^{K} e^{z_ k - m}} \] 分子分母使用相同的偏移量 \(m\),比值保持不变,但所有指数参数 \( z_ i - m \le 0 \),计算安全。 计算对数概率(Log-Softmax) 在机器学习中,我们常需要计算Softmax输出的对数,即 \( \log \sigma(\mathbf{z}) j \),用于交叉熵损失函数。直接计算 \( \log(e^{z_ j} / \sum e^{z_ k}) \) 仍不稳定。结合LSE技巧: \[ \log \sigma(\mathbf{z}) j = \log\left( \frac{e^{z_ j}}{\sum {k} e^{z_ k}} \right) = z_ j - \log\left( \sum {k} e^{z_ k} \right) = z_ j - \text{LSE}(z_ 1, ..., z_ K) \] 其中 \( \text{LSE}(z_ 1, ..., z_ K) \) 使用上述的稳定化公式 \( m + \log(\sum e^{z_ k - m}) \) 来计算。这样,我们得到了一个数值稳定的、一步到位的“Log-Softmax”实现。 在概率分布计算中的推广 LSE技巧可以推广到更一般的场景。例如,计算一个未归一化的概率分布 \( \tilde{p}_ i = e^{s_ i} \) 的归一化常数 \( Z = \sum_ i e^{s_ i} \) 及其对数 \( \log Z \)。这正是LSE的直接应用。更进一步,在计算两个分布的交叉熵或KL散度时,如果涉及对数求和,也常常需要此技巧。 与指数族的联系 指数族分布的概率密度/质量函数形式为 \( p(x|\boldsymbol{\eta}) = h(x) \exp\left( \boldsymbol{\eta}^T T(x) - A(\boldsymbol{\eta}) \right) \),其中 \( A(\boldsymbol{\eta}) \) 是对数配分函数:\( A(\boldsymbol{\eta}) = \log \int h(x) \exp(\boldsymbol{\eta}^T T(x)) dx \)(连续)或对离散情况求和。计算 \( A(\boldsymbol{\eta}) \) 本质上就是一个Log-Sum-Exp(或Log-Integral-Exp)问题。在复杂模型中,近似计算 \( A(\boldsymbol{\eta}) \) 或其梯度时,LSE技巧是维持数值稳定的基础。 总结来说,Log-Sum-Exp技巧是一个通过简单的代数操作(减去最大值)来解决指数求和运算中数值上溢/下溢问题的关键技术。它不仅是实现Softmax和Log-Softmax的工业标准,也是任何涉及对数-求和-指数运算的统计与机器学习算法中确保数值鲁棒性的基石。