交叉熵丛林

Sci*_*tas 23 machine-learning

有人可以解释所有这些交叉熵损失之间的差异吗?keras正在谈论

  • 二进制交叉熵
  • 分类交叉熵
  • 稀疏分类交叉熵

而tensorflow有

  • 具有Logits的Softmax交叉熵
  • 具有Logits的稀疏Softmax交叉熵
  • Sigmoid交叉熵与Logits

(还提出了一个问题:是否有没有logits的交叉熵类型?)

他们之间有什么不同和关系?它们的典型应用是什么?数学背景是什么?是否应该知道其他交叉熵类型?

lej*_*lot 24

只有一个交叉(香农)熵定义为:

H(P||Q) = - SUM_i P(X=i) log Q(X=i)
Run Code Online (Sandbox Code Playgroud)

您列出的所有函数都只是辅助函数,它们接受不同的表示方式P和Q.

基本上有三件事要考虑:

  • 有两种可能的结果(二元分类)或更多.如果只有两个结果,则P(0,1)中的单个浮点数识别整个分布,这就是二元分类中的神经网络具有单个输出的原因(逻辑回归也是如此).如果有K> 2个可能的结果,则必须定义K个输出(每个一个Q)

  • 一个或者产生适当的概率(意味着Q(X=1) = 1 - Q(X=0)和/ Q(X=...)或只产生一个"得分")并且有一些固定的方法将得分转换为概率.例如,单个实数可以通过取sigmoid"转换为概率",以及一组实数数字可以通过取softmax等来改变.

  • 有Q(X=i)>=0这样的SUM_i Q(X=i) =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
Run Code Online (Sandbox Code Playgroud)

最后,可以使用"分类交叉熵",因为这是数学定义的方式,但是由于硬目标或二进制分类之类的东西非常流行 - 现代ML库确实提供了这些额外的辅助函数以使事情变得更简单.特别是"堆叠"sigmoid和交叉熵可能在数值上不稳定,但如果知道这两个操作一起应用 - 它们的数值稳定版本组合在一起(在TF中实现).

重要的是要注意,如果您应用错误的帮助函数,代码通常仍会执行,但结果将是错误的.例如,如果将softmax_*helper应用于具有一个输出的二进制分类,则您的网络将被视为始终在输出处生成"True".

作为最后一点 - 这个答案考虑了分类,当你考虑多标签情况时(当一个点可以有多个标签时)略有不同,因为Ps不总和为1,尽管有多个输出单元,但应该使用sigmoid_cross_entropy_with_logits .

  • 我使用了与 keras 和 TF 兼容的命名约定,因此 Keras 的“二进制交叉熵”是我表中的“二进制 CE”等等。 (2认同)

Dan*_*ler 9

登录

为此,“logits”可以被视为模型的非激活输出。

  • 虽然Keras损失总是采用“激活”输出(您必须在损失之前应用“sigmoid”或“softmax”)
  • Tensorflow使用“logits”或“non-activated”(你不应该在损失之前应用“sigmoid”或“softmax”)

“带有 logits”的损失将在内部应用激活。某些函数允许您选择logits=True或logits=False,这将告诉函数是“应用”还是“不应用”激活。


疏

  • 稀疏函数使用目标数据(ground truth)作为“整数标签”:0, 1, 2, 3, 4.....
  • 非稀疏函数使用目标数据作为“one-hot label”:[1,0,0], [0,1,0], [0,0,1]

二元交叉熵 = Sigmoid 交叉熵

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

分类交叉熵 = Softmax 交叉熵

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