Logsoftmax稳定性

时间:2017-05-20 01:27:27

标签: numerical softmax underflow numerical-stability

我知道如何通过添加元素-max _i x_i来使softmax稳定。这可以避免溢出和下溢。 现在,记录这个可能会导致下溢。 log softmax(x)可以评估为零,导致-infinity。

我不确定如何修复它。我知道这是一个常见的问题。我读了几个答案,我不明白。但我仍然对如何解决这个问题感到困惑。

PS:如果你提供一个简单的例子,那就太棒了。

4 个答案:

答案 0 :(得分:2)

为了稳定Logsoftmax函数,大多数实现,例如Tensorflow,对于Thenao,您可以签出Ian Goodfellow打开的this线程,使用与Nemo相同的技巧。该想法与您提到的Softmax完全相同,可以将其形式化如下:
formula
从分母和分母中消除exp(b)并知道log(exp(x))=x之后,该等式变为:
formula
如果设置formula,则此新方程式同时具有上溢和下溢稳定性条件。
您也可以检查this链接以获取更多说明。

答案 1 :(得分:1)

logsoftmax = logits - log(reduce_sum(exp(logits), dim))

参考:https://www.tensorflow.org/api_docs/python/tf/nn/log_softmax

答案 2 :(得分:0)

数学技巧无法帮助您创建log 0 -inf以外的东西。 如果您认为它是低谷,那么唯一的方法就是对数据进行规范化,以免到此为止。

答案 3 :(得分:0)

用它来照顾Nan

tf.nn.softmax_cross_entropy_with_logits(
    labels, logits, axis=-1, name=None
)
logits = tf.constant([[4, 5, 1000]], dtype = tf.float32)
labels = tf.constant([[1,0,1]], dtype = tf.float32)

# Case-1 
output = tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits)
print(output) 
>>> tf.Tensor([996.], shape=(1,), dtype=float32)

#Case-2
a = tf.nn.softmax(logits)
output = tf.reduce_sum(-(labels * tf.math.log(a)))
print(output) 
>>> tf.Tensor(nan, shape=(), dtype=float32)


# this happens because value of softmax truncates to zero

print(a) 
>>> <tf.Tensor: shape=(1, 3), dtype=float32, numpy=array([[0., 0., 1.]], dtype=float32)>