在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_logits
是False
,那么output
的值被剪辑为epsilon
和1-epsilon
。这意味着,如果值在这个范围之外有轻微的变化,结果将不会对它产生反应。
然而,据我所知,当它真正重要的时候,它是相当奇特的情况。