2017-05-28 3 views
2

私は、次のsoftplus機能を実装しようとしています:私は数学/ numpyのデータ型としてのfloat64でそれを試してみたが、いつでもxが大きくなりすぎ避けオーバーフロー

log(1 + exp(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を持っているので、簡単な安定した実装がそう、この実装は1e-10より誤差が小さくなり、オーバーフローすることはありません、実際| log(1+exp(30)) - 30 | < 1e-10

def safe_softplus(x, limit=30): 
    if x>limit: 
    return x 
    else: 
    return np.log(1.0 + np.exp(x)) 

です。特にx = 1000の場合、この近似の誤差はfloat64の分解能よりはるかに小さくなりますので、コンピュータ上で測定することさえ不可能です。

関連する問題