Keras 和 TensorFlow 中所有这些交叉熵损失之间有啥区别?

Posted

技术标签:

【中文标题】Keras 和 TensorFlow 中所有这些交叉熵损失之间有啥区别?【英文标题】:What are the differences between all these cross-entropy losses in Keras and TensorFlow?Keras 和 TensorFlow 中所有这些交叉熵损失之间有什么区别? 【发布时间】:2017-11-24 06:48:48 【问题描述】:

所有这些交叉熵损失之间有什么区别?

Keras 在谈论

二元交叉熵 分类交叉熵 稀疏分类交叉熵

虽然 TensorFlow 有

使用 logits 的 Softmax 交叉熵 带 logits 的稀疏 softmax 交叉熵 带 logits 的 Sigmoid 交叉熵

它们之间有什么区别和关系?它们的典型应用是什么?有什么数学背景?还有其他应该知道的交叉熵类型吗?有没有没有logits的交叉熵类型?

【问题讨论】:

看3个简单的拇指规则@***.com/questions/47034888/…你应该能够快速导航任何框架的损失函数 【参考方案1】:

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

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

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

基本上有3个主要的考虑因素:

有两种可能的结果(二元分类)或更多。如果只有两个结果,那么Q(X=1) = 1 - Q(X=0) 所以 (0,1) 中的单个浮点数可以识别整个分布,这就是为什么二元分类中的神经网络只有一个输出(逻辑回归也是如此)。如果有 K>2 个可能的结果,则必须定义 K 个输出(每个 Q(X=...) 一个)

一个要么产生适当的概率(意味着Q(X=i)>=0SUM_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_* 辅助函数应用于具有一个输出的二进制分类,您的网络将被视为始终在输出处产生“真”。

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

【讨论】:

酷!如果我们知道 keras 损失函数代表哪些,那就太好了。 我使用了与 keras 和 TF 兼容的命名约定,因此 Keras 的“二进制交叉熵”是我表中的“二进制 CE”等等。【参考方案2】:

逻辑

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

虽然 Keras 损失始终采用 “激活” 输出(您必须在损失之前应用“sigmoid”或“softmax”) Tensorflow 使用“logits”或“未激活”(您不应在丢失前应用“sigmoid”或“softmax”)

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


稀疏

稀疏函数使用目标数据(ground truth)作为“整数标签”:0、1、2、3、4..... 非稀疏函数使用目标数据作为“单热标签”:[1,0,0]、[0,1,0]、[0,0,1]

二元交叉熵 = Sigmoid 交叉熵

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

分类交叉熵 = Softmax 交叉熵

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

【讨论】:

感谢您的好评。但是,为什么keras将其命名为CategoricalCrossEntropy,而tensorflow却将其命名为Softmax Cross Entropy?他们不应该为相同的损失遵循相同的命名约定吗? Tensorflow 为您应用 softmax,Keras 没有。 根据文档,Keras CategoricalCrossEntropy 在配置from_logits=True 时也应用了softmax。链接是keras.io/api/losses/probabilistic_losses/…

以上是关于Keras 和 TensorFlow 中所有这些交叉熵损失之间有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Keras和TensorFlow之争何时休?

一文看懂Keras和TensorFlow到底哪家强

model.compile() 是不是初始化 Keras(tensorflow 后端)中的所有权重和偏差?

Anaconda快速安装TensorFlow和Keras

如何在 Keras 模型中使用 TensorFlow 的采样 softmax 损失函数?

如何将训练有素的 Tensorflow 模型转换为 Keras?