You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matlab中计算指数相关表达式时如何避免NaN与Inf数值问题?

数值稳定的Softplus及其变体计算方案

针对向量S计算ln(1+exp(S))(Softplus函数)和ln(1+exp(-S))时的数值溢出问题,我们可以通过统一的数学变形实现无循环、数值稳定的向量化计算。

核心数学推导

对于任意实数z,ln(1+exp(z))的数值稳定形式可推导为:

ln(1+exp(z)) = max(z, 0) + ln(1 + exp(-abs(z)))

推导逻辑:

  • 当z ≥ 0时:ln(1+exp(z)) = z + ln(1+exp(-z)),此时exp(-z)不会溢出(因-z ≤ 0,exp(-z)取值范围为(0,1])
  • 当z < 0时:ln(1+exp(z)) = ln(1+exp(z)),此时exp(z)不会溢出(因z < 0,exp(z)取值范围为(0,1]),而max(z,0)=0,exp(-abs(z))=exp(z),代入公式后与原式等价

同理,ln(1+exp(-S))本质是对-S计算Softplus,直接复用上述公式即可。

MATLAB无循环实现代码

S = [1000, -1000];

% 计算 ln(1+exp(S))
softplus_S = max(S, 0) + log(1 + exp(-abs(S)));

% 计算 ln(1+exp(-S))
softplus_neg_S = max(-S, 0) + log(1 + exp(-abs(S)));

% 验证结果
disp('ln(1+exp(S)) 的稳定计算结果:');
disp(softplus_S);
disp('ln(1+exp(-S)) 的稳定计算结果:');
disp(softplus_neg_S);

结果说明

  • 对于S=1000,ln(1+exp(1000))直接计算会得到Inf,而稳定计算结果为1000(符合数学近似:当z极大时,ln(1+exp(z)) ≈ z)
  • 对于S=-1000,ln(1+exp(-1000))直接计算会得到0(因exp(-1000)趋近于0),稳定计算结果一致
  • 对于ln(1+exp(-S)),当S=-1000时,结果为1000;当S=1000时,结果趋近于0,均无数值溢出问题

内容的提问来源于stack exchange,提问作者Kilkik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 15:25:16