为什么计算logits的损失在数值上更稳定?



在TensorFlow中,SparseCategoricalCrossentropy的文档指出,使用from_logits=True并因此在最后一层模型中排除softmax操作对于损失计算来说在数值上更稳定。

为什么会这样?

有点晚了,但我认为数值稳定性与浮点数和溢出数的精度有关。

假设你想计算np.exp(2000),它会给你一个溢出错误。而计算np.log(np.exp(2000))可以简化为2000

通过使用logits,您可以在中间步骤中绕过大数,避免溢出和低精度。

首先,我认为一个很好的解释是你是否应该担心数值稳定性。检查这个答案,但一般来说,你不应该关心它。

回答你的问题"为什么会这样?"让我们看一下源代码:

def sparse_categorical_crossentropy(target, output, from_logits=False, axis=-1):
""" ...
"""
...
# Note: tf.nn.sparse_softmax_cross_entropy_with_logits
# expects logits, Keras expects probabilities.
if not from_logits:
_epsilon = _to_tensor(epsilon(), output.dtype.base_dtype)
output = tf.clip_by_value(output, _epsilon, 1 - _epsilon)
output = tf.log(output)
...

你可以看到,如果from_logitsFalse,那么output的值被剪辑为epsilon1-epsilon。这意味着,如果值在这个范围之外有轻微的变化,结果将不会对它产生反应。

然而,据我所知,当它真正重要的时候,它是相当奇特的情况。

相关内容

  • 没有找到相关文章

最新更新