多标签分类损失函数

Posted

技术标签:

【中文标题】多标签分类损失函数【英文标题】:Multi-label classification loss function 【发布时间】:2018-10-27 22:36:15 【问题描述】:

我在很多地方看到,对于使用神经网络的多标签分类,一个有用的损失函数是每个输出节点的二进制交叉熵。

在 TensorFlow 中是这样的:

cost = tf.nn.sigmoid_cross_entropy_with_logits()

这给出了一个数组,其值与我们拥有的输出节点一样多。

我的问题是,这个成本函数是否应该在输出节点的数量上取平均值?在 Tensorflow 中看起来像:

cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits())

或者每个损失都是独立处理的?

谢谢

【问题讨论】:

【参考方案1】:

对于多标签分类中的N 标签,是否对每个类的损失求和,或者是否使用tf.reduce_mean 计算平均损失并不重要:梯度将指向同一方向。

但是,如果将总和除以 N(这就是平均的本质),这将影响一天结束时的学习率。如果您不确定多标签分类任务中会有多少标签,使用tf.reduce_mean 可能会更容易,因为与其他损失组件相比,您不必重新调整此损失组件的权重,并且您不必在标签更改次数N 中调整学习率。

【讨论】:

好的,谢谢。我知道课程的数量,但无论如何我都会使用 tf.reduce_mean。顺便说一句,您知道在多标签分类中使用哪个指标来衡量准确度吗? @sdiabr 我知道 keras 推荐二元交叉熵 @sdiabr 也许this here 有帮助? @sdiabr 特别推荐 keras 在输出层使用二元交叉熵损失的 sigmoid 单元 @GrantWilliams 如果我没记错的话,应该有一个单元将 sigmoid 和二元交叉熵组合成一个函数,可以以更稳健的数值方式进行评估。 tf 又叫什么名字(他们都叫something_very_long_blah_blah_blah_with_logits,不查就记不起哪个做了什么)。

以上是关于多标签分类损失函数的主要内容,如果未能解决你的问题,请参考以下文章

在多标签图像分类任务中,哪个损失函数会收敛得很好?

具有高度不平衡的多标签分类中的损失曲线

哪些损失函数和指标用于具有非常高的负数与正数比率的多标签分类?

多分类SVM损失函数: Multiclass SVM loss

BERT-多标签文本分类实战之七——训练-评估-测试与运行主程序

BERT-多标签文本分类实战之七——训练-评估-测试与运行主程序