用于多类分类时 binary_crossentropy 损失的重要性?

Posted

技术标签:

【中文标题】用于多类分类时 binary_crossentropy 损失的重要性?【英文标题】:Significance of binary_crossentropy loss when used on for multiclass classification? 【发布时间】:2018-05-26 19:24:10 【问题描述】:

您是否应该始终使用categorical_crossentropy loss 来解决多类分类问题?还是binary_crossentropy 在某些方面也有意义?

需要明确的是,多类意味着输入可以采用多个类之一。问题是单一标签,这意味着输入不能同时包含多个类。

【问题讨论】:

【参考方案1】:

K.binary_crossentropy 对于多类 分类没有意义,它适用于二元多标签 分类。 This post 详细概述了差异。请记住,在后台*

K.binary_crossentropytf.nn.sigmoid_cross_entropy_with_logits K.categorical_crossentropytf.nn.softmax_cross_entropy_with_logits

* 假设您使用的是 tensorflow 后端

【讨论】:

谢谢。这是否意味着 binary_crossentropy 的最后一层应始终使用 sigmoid 激活,而 categorical_crossentropy 应始终使用 softmax 激活?另外 - 由于 binary_crossentropy 是多标签,这是否意味着在最后一层之后输出的概率不必总和为 1? binary_crossentropy 本身执行 sigmoid 激活,这就是为什么 tensorflow 函数被命名为 with logits。额外的 sigmoid 层只会造成伤害。 categorical_crossentropy 也是如此。是的,概率是每个特征的,不必总和为 1。 你确定吗?我见过的几乎所有使用 categorical_crossentropy 损失的例子都有一个 softmax 作为最后一层。 糟糕,我的错。在 Keras 中,默认值为 from_logits=False,在这种情况下,它期望输入作为概率。但要明确一点:通过这种方式计算 sigmoid 输出,然后将其转换回 logits,然后应用 sigmoid_cross_entropy_with_logits,它会再计算一次 sigmoid。查看源代码。我主要是直接在 tensorflow 中完成,所以我自己从不使用 sigmoid/softmax 层。

以上是关于用于多类分类时 binary_crossentropy 损失的重要性?的主要内容,如果未能解决你的问题,请参考以下文章

用于不平衡多类多标签分类的神经网络

用于多类分类的 SVM(one-vs-all)中的置信度估计

使用 Apache Spark 决策树分类器进行多类分类时出错

用于分类/多类分类的梯度提升树的弱学习器

用于多类分类的 sklearn 指标

sklearn.metrics.roc_curve 用于多类分类