Tensorflow 中的 log(1+exp(X))(避免欠流和过流)

pri*_*ack 2 integer-overflow nan exp tensorflow

我正在调试我的程序,我意识到我的损失输出了 NaN。这些 NaN 值来自我正在计算的事实tf.log(1 + tf.exp(X))

其中 X 是一个二维张量。实际上,当 X 的值足够大时, tf.exp() 返回 +Inf ,因此tf.log(1 + exp(X))将返回+Inf。我想知道在这种情况下是否存在避免下溢和溢出的巧妙技巧。

我试过了:

def log1exp(x):
    maxi = tf.reduce_max(x)
    return maxi + tf.log(tf.exp(x - maxi) + tf.exp(-maxi))
Run Code Online (Sandbox Code Playgroud)

但在这种情况下它不处理下溢......

我也看了一眼,tf.reduce_logsumexp但它必然会减少沿轴的张量......而我想保持相同的形状!

最后我知道这tf.log(1 + exp(X))几乎等于XX 的大值,但我认为设计一个将输出XwhenX > threshold和 log(1+exp(X)) 否则不是很整洁的函数。

谢谢

P-G*_*-Gn 5

此函数已在 tensorflow 中以 名称实现tf.math.softplus,并处理上溢和下溢。