避免在python中使用softplus函数溢出

Lot*_*zki 10 python machine-learning

我正在尝试实现以下softplus函数:

log(1 + exp(x))
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用math/numpy和float64作为数据类型,但每当x得到太大(例如x = 1000)时,结果就是inf.

你能帮我解决一下如何成功处理这个大数字的功能吗?

Dav*_* S. 12

有一种关系可以使用:

log(1+exp(x)) = log(1+exp(x)) - log(exp(x)) + x = log(1+exp(-x)) + x
Run Code Online (Sandbox Code Playgroud)

因此,从数学上来说,安全的实现是:

log(1+exp(-abs(x))) + max(x,0)
Run Code Online (Sandbox Code Playgroud)

这适用于数学和numpy函数(例如:np.log,np.exp,np.abs,np.maximum)。

  • 为了简单起见,`np.log1p(np.exp(-np.abs(x))) + np.maximum(x, 0)` (3认同)

lej*_*lot 5

因为x>30我们有log(1+exp(x)) ~= log(exp(x)) = x一个简单稳定的实现

def safe_softplus(x, limit=30):
  if x>limit:
    return x
  else:
    return np.log(1.0 + np.exp(x))
Run Code Online (Sandbox Code Playgroud)

实际上| log(1+exp(30)) - 30 | < 1e-10,这样的实现使得错误小于1e-10且永远不会溢出.特别是对于x = 1000,此近似值的误差将远小于float64分辨率,因此甚至无法在计算机上进行测量.

  • 有理由不使用 np.log1p 吗? (2认同)