我想實現以下功能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分辨率小得多,所以甚至不可能在計算機上進行測量。