Keras 和 TensorFlow 中所有这些交叉熵损失之间有什么区别?
What are the differences between all these cross-entropy losses in Keras and TensorFlow?
所有这些交叉熵损失之间有什么区别?
Keras 正在谈论
- 二元交叉熵
- 分类交叉熵
- 稀疏分类交叉熵
而 TensorFlow 有
- Softmax 交叉熵与 logits
- 带有 logits 的稀疏 softmax 交叉熵
- 带对数的 Sigmoid 交叉熵
它们之间有什么区别和联系?它们的典型应用是什么?有什么数学背景?还有其他应该知道的交叉熵类型吗?有没有没有logits的交叉熵类型?
只有一个交叉(香农)熵定义为:
H(P||Q) = - SUM_i P(X=i) log Q(X=i)
在机器学习使用中,P
是实际(基本事实)分布,Q
是预测分布。您列出的所有函数都只是 辅助函数 它接受不同的方式来表示 P
和 Q
.
基本上有 3 个主要问题需要考虑:
有 2 种可能的结果(二元分类)或更多。如果只有两个结果,那么 Q(X=1) = 1 - Q(X=0)
所以 (0,1) 中的单个浮点数标识整个分布,这就是为什么二进制分类中的神经网络具有单个输出(逻辑回归也是如此)。如果有 K>2 个可能的结果,则必须定义 K 个输出(每个 Q(X=...)
)
要么产生适当的概率(意味着 Q(X=i)>=0
和 SUM_i Q(X=i) =1
,要么只产生 "score" 并且有一些固定的方法将分数转换为概率。比如单个实数取sigmoid可以"transformed to probability",一组实数取它们的softmax可以进行变换等等。
有 j
使得 P(X=j)=1
(有一个 "true class",目标是 "hard",如 "this image represent a cat")或有"soft targets"(比如"we are 60% sure this is a cat, but for 40% it is actually a dog")。
根据这三个方面,应该使用不同的辅助函数:
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
最后可以只使用 "categorical cross entropy",因为这是它在数学上的定义方式,但是由于诸如硬目标或二进制分类之类的东西非常流行 - 现代 ML 库确实提供了这些额外的辅助函数来让事情变得更简单。特别是 "stacking" sigmoid 和交叉熵可能在数值上不稳定,但如果知道这两个操作一起应用 - 有它们组合的数值稳定版本(在 TF 中实现)。
请务必注意,如果您应用了错误的辅助函数,代码通常仍会执行,但结果将是错误的。例如,如果您将 softmax_* 帮助程序应用于具有一个输出的二进制分类,您的网络将被视为始终在输出处产生 "True"。
作为最后的说明——这个答案考虑了分类,当你考虑多标签情况时(当单点可以有多个标签),因为 Ps 总和不等于 1,尽管有多个输出单元,但仍应使用 sigmoid_cross_entropy_with_logits。
对数
为此,“logits”可以看作是模型的非激活输出。
- 虽然 Keras 损失总是采用 "activated" 输出(您必须在损失前应用“sigmoid”或“softmax”)
- Tensorflow 使用“logits”或“未激活”(您不应应用“sigmoid”或“softmax”损失前)
损失“with logits”将在内部应用激活。
某些函数允许您选择 logits=True
或 logits=False
,这将告诉函数是“应用”还是“不应用”激活。
稀疏
- 稀疏函数使用目标数据(ground truth)作为“整数标签”:0,1,2,3,4.....
- 非稀疏函数使用目标数据作为“one-hot labels”:[1,0,0], [0,1,0], [0, 0,1]
二元交叉熵 = Sigmoid 交叉熵
- 问题类型:
- 单人class(false/true);或
- 非排他性多class(很多classes可能是正确的)
- 模型输出形状:
(batch, ..., >=1)
- 激活:
"sigmoid"
分类交叉熵 = Softmax 交叉熵
- 问题类型:独有classes(只有一个class可能是正确的)
- 模型输出形状:
(batch, ..., >=2)
- 激活:
"softmax"
所有这些交叉熵损失之间有什么区别?
Keras 正在谈论
- 二元交叉熵
- 分类交叉熵
- 稀疏分类交叉熵
而 TensorFlow 有
- Softmax 交叉熵与 logits
- 带有 logits 的稀疏 softmax 交叉熵
- 带对数的 Sigmoid 交叉熵
它们之间有什么区别和联系?它们的典型应用是什么?有什么数学背景?还有其他应该知道的交叉熵类型吗?有没有没有logits的交叉熵类型?
只有一个交叉(香农)熵定义为:
H(P||Q) = - SUM_i P(X=i) log Q(X=i)
在机器学习使用中,P
是实际(基本事实)分布,Q
是预测分布。您列出的所有函数都只是 辅助函数 它接受不同的方式来表示 P
和 Q
.
基本上有 3 个主要问题需要考虑:
有 2 种可能的结果(二元分类)或更多。如果只有两个结果,那么
Q(X=1) = 1 - Q(X=0)
所以 (0,1) 中的单个浮点数标识整个分布,这就是为什么二进制分类中的神经网络具有单个输出(逻辑回归也是如此)。如果有 K>2 个可能的结果,则必须定义 K 个输出(每个Q(X=...)
)要么产生适当的概率(意味着
Q(X=i)>=0
和SUM_i Q(X=i) =1
,要么只产生 "score" 并且有一些固定的方法将分数转换为概率。比如单个实数取sigmoid可以"transformed to probability",一组实数取它们的softmax可以进行变换等等。有
j
使得P(X=j)=1
(有一个 "true class",目标是 "hard",如 "this image represent a cat")或有"soft targets"(比如"we are 60% sure this is a cat, but for 40% it is actually a dog")。
根据这三个方面,应该使用不同的辅助函数:
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
最后可以只使用 "categorical cross entropy",因为这是它在数学上的定义方式,但是由于诸如硬目标或二进制分类之类的东西非常流行 - 现代 ML 库确实提供了这些额外的辅助函数来让事情变得更简单。特别是 "stacking" sigmoid 和交叉熵可能在数值上不稳定,但如果知道这两个操作一起应用 - 有它们组合的数值稳定版本(在 TF 中实现)。
请务必注意,如果您应用了错误的辅助函数,代码通常仍会执行,但结果将是错误的。例如,如果您将 softmax_* 帮助程序应用于具有一个输出的二进制分类,您的网络将被视为始终在输出处产生 "True"。
作为最后的说明——这个答案考虑了分类,当你考虑多标签情况时(当单点可以有多个标签),因为 Ps 总和不等于 1,尽管有多个输出单元,但仍应使用 sigmoid_cross_entropy_with_logits。
对数
为此,“logits”可以看作是模型的非激活输出。
- 虽然 Keras 损失总是采用 "activated" 输出(您必须在损失前应用“sigmoid”或“softmax”)
- Tensorflow 使用“logits”或“未激活”(您不应应用“sigmoid”或“softmax”损失前)
损失“with logits”将在内部应用激活。
某些函数允许您选择 logits=True
或 logits=False
,这将告诉函数是“应用”还是“不应用”激活。
稀疏
- 稀疏函数使用目标数据(ground truth)作为“整数标签”:0,1,2,3,4.....
- 非稀疏函数使用目标数据作为“one-hot labels”:[1,0,0], [0,1,0], [0, 0,1]
二元交叉熵 = Sigmoid 交叉熵
- 问题类型:
- 单人class(false/true);或
- 非排他性多class(很多classes可能是正确的)
- 模型输出形状:
(batch, ..., >=1)
- 激活:
"sigmoid"
分类交叉熵 = Softmax 交叉熵
- 问题类型:独有classes(只有一个class可能是正确的)
- 模型输出形状:
(batch, ..., >=2)
- 激活:
"softmax"