随机变量的变换的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)\)。
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\),计算安全。
- 计算对数概率(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的工业标准,也是任何涉及对数-求和-指数运算的统计与机器学习算法中确保数值鲁棒性的基石。