所有这些交叉熵损失函数之间有什么区别?
Keras中提到的有:
- 二元交叉熵
- 分类交叉熵
- 稀疏分类交叉熵
而TensorFlow中则有:
- 带logits的Softmax交叉熵
- 带logits的稀疏Softmax交叉熵
- 带logits的Sigmoid交叉熵
它们之间有什么区别和联系?它们各自的典型应用是什么?它们的数学背景是什么?还有其他需要了解的交叉熵类型吗?有没有不带logits的交叉熵类型?
回答:
只有一种交叉(香农)熵,定义如下:
H(P||Q) = - SUM_i P(X=i) log Q(X=i)
在机器学习的使用中,P
是实际(真实)的分布,Q
是预测的分布。你列出的所有函数只是辅助函数,它们接受不同的方式来表示P
和Q
。
基本上需要考虑三件主要事情:
-
可能的结果要么是两个(二元分类),要么是更多。如果只有两个结果,那么
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%可能是狗”)。
根据这三个方面,应该使用不同的辅助函数:
结果数 Q中的内容 P中的目标 -------------------------------------------------------------------------------二元交叉熵 2 概率 任意分类交叉熵 >2 概率 软目标稀疏分类交叉熵 >2 概率 硬目标带logits的Sigmoid交叉熵 2 分数 任意带logits的Softmax交叉熵 >2 分数 软目标带logits的稀疏Softmax交叉熵 >2 分数 硬目标
最终,人们可以只使用“分类交叉熵”,因为这是它的数学定义,然而,由于硬目标或二元分类非常流行——现代机器学习库提供了这些额外的辅助函数以简化操作。特别是将sigmoid和交叉熵“堆叠”可能会数值不稳定,但如果知道这两个操作是一起应用的——就会有一个数值稳定的版本(在TensorFlow中实现)。
重要的是要注意,如果你应用了错误的辅助函数,代码通常仍然会执行,但结果会是错误的。例如,如果你对只有一个输出的二元分类应用softmax_*辅助函数,你的网络将被认为总是输出“True”。
最后要注意的是——这个答案考虑的是分类,当你考虑多标签情况时(当一个点可以有多个标签),情况略有不同,因为Ps不总和为1,应该使用sigmoid_cross_entropy_with_logits,尽管有多个输出单元。