Keras和TensorFlow中所有这些交叉熵损失的区别是什么?

41
这些交叉熵损失的区别是什么?
Keras提到了:
- 二元交叉熵 - 分类交叉熵 - 稀疏分类交叉熵
而TensorFlow则有:
- 带logits的softmax交叉熵 - 带logits的稀疏softmax交叉熵 - 带logits的sigmoid交叉熵
它们之间有什么不同和关系?它们的典型应用是什么?数学背景是什么?还有其他需要了解的交叉熵类型吗?是否存在不带logits的交叉熵类型?

请查看 https://dev59.com/BlYN5IYBdhLWcg3wsaDx#66639136 上的三个简单规则,您就能够快速了解任何框架中的损失函数。 - Allohvk
2个回答

34

只有一个交叉熵(Shannon)可以定义为:

H(P||Q) = - SUM_i P(X=i) log Q(X=i)

在机器学习中,P是实际(基本真实)分布,而Q是预测分布。您列出的所有函数都只是接受不同表示PQ的方式的辅助函数

基本上有三件事需要考虑:

  • 存在两种可能结果(二进制分类)或更多。如果只有两个结果,则Q(X=1) = 1 - Q(X=0),因此单个介于0和1之间的浮点数标识整个分布,这就是为什么二元分类的神经网络具有单个输出(逻辑回归也是如此)。如果有K>2个可能的结果,则必须定义K个输出(每个Q(X=...)一个)

  • 要么产生恰当的概率(意味着Q(X=i)>=0并且SUM_i Q(X=i) =1),要么只是产生“分数”,并且具有一些固定的将分数转换为概率的方法。例如,通过取Sigmoid可以将单个实数“转换为概率”,通过取它们的softmax可以将一组实数转换为概率等。

  • 存在j使得P(X=j)=1(存在一个“真实类”,目标是“硬的”,如“这个图像代表一只猫”)或存在“软目标”(如“我们60%确定这是一只猫,但对于40%,它实际上是一只狗”)。

根据这三个方面,应使用不同的辅助函数:

                                  outcomes     what is in Q    targets in P   
-------------------------------------------------------------------------------
binary CE                                2      probability         any
categorical CE                          >2      probability         soft
sparse categorical CE                   >2      probability         hard
sigmoid CE with logits                   2      score               any
softmax CE with logits                  >2      score               soft
sparse softmax CE with logits           >2      score               hard
最终,可以仅使用“分类交叉熵”,因为这是数学上的定义方式,但由于像硬目标或二元分类之类的东西非常流行 - 现代ML库提供了这些额外的辅助函数以使事情变得更简单。特别是“堆叠”sigmoid和交叉熵可能在数值上不稳定,但如果知道这两个操作是一起应用的,则有一个数值稳定版本的它们的组合(在TF中实现)。
注意,如果应用错误的辅助函数,代码通常仍会执行,但结果将是错误的。例如,如果您对具有一个输出的二元分类应用softmax_ *帮助程序,则认为您的网络始终产生“True”输出。
最后需要注意的是,本答案考虑到了分类问题,当您考虑多标签情况(单个点可能具有多个标签)时,情况略有不同,因为P不总和为1,因此应该使用sigmoid_cross_entropy_with_logits而不是具有多个输出单元。

太棒了!如果我们知道Keras损失函数代表哪些内容就好了。 - Daniel Möller
3
我使用了与Keras和TF兼容的命名规则,因此从我的表格中可以看出,Keras中的“binary cross entropy”被称为“Binary CE”,以此类推。 - lejlot

11

Logits

在这种情况下,“logits”可以被视为模型的未激活的输出。

  • Keras的损失函数总是采用“激活”输出(您必须在损失函数之前应用“sigmoid”或“softmax”)
  • Tensorflow则使用“logits”或“未激活”(您不应该在损失函数之前应用“sigmoid”或“softmax”)

在“with logits”的损失函数中,将在内部应用激活功能。一些函数允许您选择logits=Truelogits=False,这将告诉函数是否要“应用”或“不应用”激活功能。


Sparse

  • Sparse函数使用目标数据(真实值)作为“整数标签”:0、1、2、3、4...
  • Non-sparse函数使用目标数据作为“one-hot标签”:[1,0,0]、[0,1,0]、[0,0,1]

Binary crossentropy = Sigmoid crossentropy

  • 问题类型:
    • 单类别(假/真);或
    • 非排他性多类别(许多类别可能是正确的)
  • 模型输出形状:(batch, ..., >=1)
  • 激活函数:"sigmoid"

Categorical crossentropy = Softmax crossentropy

  • 问题类型:独占类别(只有一个类别是正确的)
  • 模型输出形状:(批量,...,>=2)
  • 激活函数:"softmax"

感谢您的回复。但是,为什么Keras将其命名为“CategoricalCrossEntropy”,而TensorFlow将其命名为“Softmax Cross Entropy”?对于相同的损失,它们不应该遵循相同的命名约定吗? - thinkdeep
1
TensorFlow 会为您应用 softmax,而 Keras 则不会。 - Daniel Möller
根据文档,Keras的CategoricalCrossEntropy在配置from_logits=True时也会应用softmax。链接为https://keras.io/api/losses/probabilistic_losses/#categoricalcrossentropy-class - thinkdeep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接