2017-05-28 92 views
2

我想实现以下功能softplus:避免溢出

log(1 + exp(x)) 

我的数学/ numpy的和float64数据类型尝试过,但每当x变得太大(例如, x = 1000)结果是inf

你能帮助我如何成功地处理大数量的这个功能吗?

回答

0

你可以尝试mpmath,这是任意精度浮点运算记:

>>> import mpmath 
>>> mpmath.exp(5000) 
>>> mpf('2.9676283840236669e+2171') 

但是,我不知道如何使用机器学习时,这将扩大在性能方面,或是否它甚至可以与你的机器学习框架一起工作,因为如所示的例子那样,它将结果包装在它自己的数字类型中。如果您正在使用机器学习框架,那么可能会附带适当的内置softplus功能。例如,Tensorflow有一个在这里:https://www.tensorflow.org/api_docs/python/tf/nn/softplus

2

由于为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分辨率小得多,所以甚至不可能在计算机上进行测量。