math.exp() 计算 $ e^x $ 得正数,提供未归一化得分;单变量需 logistic 函数转为 [0,1] 概率,多变量需 softmax 归一化(先减最大值防溢出),最终得合法概率分布。

Math.exp() 是 JavaScript 中计算自然指数 $ e^x $ 的标准方法,常用于将实数映射为正数,再进一步归一化为概率分布(如 softmax 或简单归一化)。关键在于:它本身不直接生成概率,而是提供“未归一化的得分”(logits),需配合归一化步骤才能成为合法概率分布(各项 ≥ 0 且和为 1)。
用 Math.exp() 得到非负得分
对任意实数输入 x,Math.exp(x) 恒返回正数,且严格 > 0。这解决了概率必须为正的基本要求。
- 例如:
Math.exp(-5)≈ 0.0067,Math.exp(0)= 1,Math.exp(2)≈ 7.389 - 多个值分别取 exp 后,得到一组正数,可视为“相对强度”或“未归一化概率”
归一化为概率分布(单变量情形)
若只有一个数值(如某事件的 log-odds),仅用 Math.exp() 不足以构成分布;但可结合 logistic 函数转换为 [0,1] 区间内的概率:
- logistic(x) =
Math.exp(x) / (1 + Math.exp(x)) - 等价于
1 / (1 + Math.exp(-x)),结果在 0~1 之间,可直接作为二分类概率
归一化为概率分布(多变量情形,如 softmax)
当有多个输出(如神经网络的 logits 数组),需对每个元素取 Math.exp(),再除以所有 exp 值之和:
- 设 logits = [2.0, 1.0, 0.1],则:
- exps = [Math.exp(2), Math.exp(1), Math.exp(0.1)] ≈ [7.389, 2.718, 1.105]
- sum = 7.389 + 2.718 + 1.105 ≈ 11.212
- probs = [7.389/11.212, 2.718/11.212, 1.105/11.212] ≈ [0.659, 0.242, 0.099]
- 结果满足:每项 > 0,总和 ≈ 1 → 构成合法概率分布
注意数值稳定性(避免溢出)
大正数输入会导致 Math.exp(x) 溢出为 Infinity。实践中应先减去最大值(softmax 常用技巧):
- 对 logits = [x₁, x₂, ..., xₙ],令
maxLogit = Math.max(...logits) - 计算
exps = logits.map(x => Math.exp(x - maxLogit)) - 再归一化:probs = exps.map(e => e / exps.reduce((a,b) => a+b, 0))
- 该操作不改变最终概率,但防止上溢










