私は、次のsoftplus機能を実装しようとしています:私は数学/ numpyのデータ型としてのfloat64でそれを試してみたが、いつでもx
が大きくなりすぎ避けオーバーフロー
log(1 + exp(x))
(例えばx = 1000
)、結果はinf
です。
この機能を大量に処理する方法を教えてください。
私は、次のsoftplus機能を実装しようとしています:私は数学/ numpyのデータ型としてのfloat64でそれを試してみたが、いつでもx
が大きくなりすぎ避けオーバーフロー
log(1 + exp(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
を持っているので、簡単な安定した実装がそう、この実装は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の分解能よりはるかに小さくなりますので、コンピュータ上で測定することさえ不可能です。