Keras 中的非分类损失

数据挖掘 喀拉斯 损失函数
2022-03-14 13:03:46

我正在训练一个神经网络(任意架构),并且我有一个标签空间,它不是一次性编码的,而是连续的。原因是对于给定的问题,不可能只分配一个类,它更多的是概率映射。所以最后,我的目标总和再次为 1,但它们不是 1-hot。

我想知道我是否误解了 Keras 文档,但就我所读到的而言,没有针对此的 Crossentropy 实现。有 categorical 和 sparse_categorical (它们似乎完全相同,但只期望不同的标签格式)。我的想法是将每个目标索引包装成二进制交叉熵,但这感觉不对,我认为有更好的解决方案。您能帮我找到适合我的任务的 CE 损失吗?

2个回答

听起来您希望您的模型输出与“基本事实”概率分布匹配的概率分布。keras.losses.kullback_leibler_divergence您应该尝试 Kullback-Leiber 散度 ( ) ,而不是交叉熵损失。

KL 散度测量两个概率分布之间的差异。最小化 KL 散度应该会导致您的预测分布与实际分布相匹配。

顺便说一句,KL-divergence 不仅仅是 Keras 交叉熵限制的解决方法。它实际上是这个任务更好的损失函数。关于 KL-divergence 的维基百科页面(我添加的重点):

DKL(PQ)=H(P,Q)H(P)
其中是 P 和 Q 的交叉熵,是 P 的熵(其中与 P 与自身的交叉熵相同)。H(P,Q)H(P)

KL 散度可以被认为是对分布 Q 与分布 P 的距离的度量。交叉熵本身就是这样的度量,但它的缺点是不为零,所以我们减去使更接近我们的距离概念。DKL(PQ)H(P,Q)H(P,P)=H(P)H(P)DKL(PQ)

在查看Keras 的分类交叉熵实现的来源时,我发现它可以应用标签平滑。因此,它还应该能够处理不是 1-hot 编码的输入。用 TF 2.1.0 测试这个对我有用。