logistic/sigmoid函数实现数值精度

col*_*ang 10 python floating-point precision scipy sigmoid

scipy.special.expit,物流功能实现如下:

if x < 0
    a = exp(x) 
    a / (1 + a) 
else 
    1 / (1 + exp(-x))
Run Code Online (Sandbox Code Playgroud)

但是,我已经看到了其他语言/框架中的实现

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

我想知道scipy版本实际带来了多少好处.

对于非常小的x,结果接近0.它即使exp(-x)溢出也有效Inf.

Ale*_*ley 7

它实际上只是为了稳定性 - 放入幅度非常大的值可能会返回意外的结果.

如果expit实现的话,1 / (1 + exp(-x))那么将-710函数的值放入将返回nan,而-709将按预期给出接近零的值.这是因为exp(710)太大而不能成为双倍.

代码中的分支只意味着避免了这种情况.

另请参阅Stack Overflow上的这个问题和答案.

  • 我想说的是,`1 /(1 + exp(-710))`不返回'NaN`,它在IEEE标准中返回0为1/Inf = 0`.在numpy`1 /(1 + np.exp(-710))== 0`中也是如此 (3认同)