3

tf.nn.softmax_cross_entropy_with_logits和之间的主要区别是tf.losses.log_loss什么?这两种方法都接受 1-hot 标签和 logits 来计算分类任务的交叉熵损失。

4

2 回答 2

3

这些方法在理论上并没有太大的不同,但是在实现上存在许多差异:

1)tf.nn.softmax_cross_entropy_with_logits专为单类标签设计,同时tf.losses.log_loss可用于多类分类。tf.nn.softmax_cross_entropy_with_logits如果您提供多类标签,则不会引发错误,但是您的梯度将无法正确计算,并且训练很可能会失败。

来自官方文档:

注意:虽然类是互斥的,但它们的概率不一定是互斥的。所需要的只是每一行标签都是一个有效的概率分布。如果不是,则梯度的计算将不正确。

2)tf.nn.softmax_cross_entropy_with_logits首先在您的预测之上计算(从名称中可以看出)soft-max 函数,而 log_loss 不这样做。

3)tf.losses.log_loss在某种意义上具有更广泛的功能,您可以对损失函数的每个元素进行加权,或者您可以指定epsilon在计算中使用的 ,以避免 log(0) 值。

4) 最后,tf.nn.softmax_cross_entropy_with_logits为批次中的每个条目返回损失,同时tf.losses.log_loss返回减少的(默认情况下对所有样本求和)值,可以直接在优化器中使用。

UPD:另一个区别是计算损失的方式,对数损失考虑了负类(向量中有 0 的那些)。很快,交叉熵损失迫使网络为正确的类产生最大的输入,而不关心负类。对数损失同时进行,它迫使正确的类具有较大的值和较小的负值。在数学表达式中,它看起来如下:

交叉熵损失:

在此处输入图像描述

对数损失:

在此处输入图像描述

其中 i 是相应的类。

例如,如果您有 labels=[1,0] 和 predictions_with_softmax = [0.7,0.3],那么:

1) 交叉熵损失:-(1 * log(0.7) + 0 * log(0.3)) = 0.3567

2) 对数损失: - (1*log(0.7) + (1-1) * log(1 - 0.7) +0*log(0.3) + (1-0) log (1- 0.3)) = - (log (0.7) + 对数 (0.7)) = 0.7133

然后,如果您使用默认值,tf.losses.log_loss则需要将log_loss输出除以非零元素的数量(这里是 2)。所以最后:tf.nn.log_loss = 0.7133 / 2 = 0.3566

在这种情况下,我们得到了相等的输出,但情况并非总是如此

于 2017-11-12T06:46:47.893 回答
0

基本上有两个区别,

1) 中使用的标签tf.nn.softmax_cross_entropy_with_logits是 中使用的标签的一个热门版本tf.losses.log_loss

2)在计算交叉熵之前,在内部计算 logitstf.nn.softmax_cross_entropy_with_logitssoftmax 。

请注意,它tf.losses.log_loss也接受 one-hot 编码标签。但是, tf.nn.softmax_cross_entropy_with_logits只接受带有 one-hot 编码的标签。

希望这可以帮助。

于 2017-11-12T08:01:55.257 回答