2017-05-28 116 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分辨率小得多,所以甚至不可能在計算機上進行測量。