一句话定义:LogSumExp(LSE)技巧,就是在计算 log(∑exp(x_i)) 时,先把所有 x_i 减去其中的最大值,再取指数、求和、取对数,最后把最大值加回来,从而避免指数爆炸。
先看问题。exp(x) 是个放大镜:x 稍大,结果就冲上 inf;x 稍小,结果又缩到 0。计算机浮点数范围有限,直接算 exp(1000) 会溢出(overflow),算 exp(-1000) 会下溢(underflow),求和时小项直接消失。LogSumExp 的做法是找一个参照物:令 m = max(x_i),然后计算:
LSE(x) = m + log(∑exp(x_i - m))
因为每个 x_i - m ≤ 0,所以 exp(x_i - m) ≤ 1,不会上溢;同时最大那一项是 exp(0)=1,也不会全变成 0。数学上它和原式完全相等,只是换了个更安全的算法。
生活化比方:几个人收入差距很大,直接比“资产绝对值”可能数字爆炸;先把最有钱的人设为 0,其他人记成负数,相对差距没变,但算起来清爽多了。
这一招在三个地方反复出现:
| 场景 | 直接算的风险 | LSE 怎么介入 |
|---|---|---|
| AI 词典:Softmax">Softmax | 大 logits 取指数溢出 | 分子分母同减最大值,结果不变 |
| 交叉熵(cross-entropy) | log(0) 或 inf 导致 NaN | log_softmax(z) = z_y - LSE(z) |
| 贝叶斯求和(Bayesian summation) | 多个小概率连乘后下溢 | 在对数域相加,再用 LSE 回到概率域并归一化 |
Softmax 是把一组分数变成概率分布,它的分母正是 LogSumExp。交叉熵是分类训练常用的损失函数,内部常写成 log_softmax,也依赖 LSE。贝叶斯求和则是在有隐变量时做边缘化:把多个路径的概率加起来,但在对数域里加,必须用 LSE 才能安全地变回普通概率。
区别在于:LogSumExp 不是模型,也不是损失函数,它是一个数值计算技巧;Softmax 是归一化指数函数;交叉熵是衡量预测与标签差距的指标;贝叶斯求和是概率推断里的操作。它们共用 LSE,是因为都要在“对数域求和”和“普通域指数”之间来回切换。
对从业者来说,写代码时应优先使用框架提供的 logsumexp、log_softmax、cross_entropy 等稳定实现,不要手写 log(sum(exp(x))),否则训练中很容易遇到 NaN、loss 爆炸或梯度异常。对普通人来说,这也是一种通用思路:遇到极大或极小的数连乘、求和,先拿最大值做参照,统一缩放后再计算,结果等价但更稳。具体 API 行为以所用框架的官方页面为准。
