我想实现以下功能softplus:避免溢出
log(1 + exp(x))
我的数学/ numpy的和float64数据类型尝试过,但每当x
变得太大(例如, x = 1000
)结果是inf
。
你能帮助我如何成功地处理大数量的这个功能吗?
我想实现以下功能softplus:避免溢出
log(1 + exp(x))
我的数学/ numpy的和float64数据类型尝试过,但每当x
变得太大(例如, x = 1000
)结果是inf
。
你能帮助我如何成功地处理大数量的这个功能吗?
你可以尝试mpmath,这是任意精度浮点运算记:
>>> import mpmath
>>> mpmath.exp(5000)
>>> mpf('2.9676283840236669e+2171')
但是,我不知道如何使用机器学习时,这将扩大在性能方面,或是否它甚至可以与你的机器学习框架一起工作,因为如所示的例子那样,它将结果包装在它自己的数字类型中。如果您正在使用机器学习框架,那么可能会附带适当的内置softplus功能。例如,Tensorflow有一个在这里:https://www.tensorflow.org/api_docs/python/tf/nn/softplus
由于为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))
其实| log(1+exp(30)) - 30 | < 1e-10
,所以这使得实现比1e-10
小错误,从不溢出。特别是对于x = 1000,这种近似的误差将比float64分辨率小得多,所以甚至不可能在计算机上进行测量。