个人曾在负责一个多标签文本分类项目时对于多标签分类(multi-label classification)的loss选择、forward尾层处理感到迷惑,当时查找了一下资料确定了一种方案:

1、以类别数作为最后隐层输出节点数,以sigmoid激活。这样其实就相当于将每个类别视为1个二分类任务,最后隐层的输出每个位置对应一个类别。也正因为如此,用sigmoid而不能用softmax(softmax没有把每个节点视为相互独立的,相反,会导致相互影响)。

2、采用Binary Cross Entropy loss进行训练。如果视最后一个隐层的每个节点对应一个类别的1/0分类,那BCE loss确实是再自然不过的选择了。但这样真的好吗?我给出的答案是不尽然,并且标签越稀疏越差。

关键问题引出

不妨对比一下BCE和用于多分类任务的CrossEntropy在示例样本的表现:(为了直观,这里不贴各自的公式了,满地都是,在这里无助于理解本关键点,还是直接以计算示例突出关键)

多分类任务-CE

label:[0,1,0,0]

pred:[0.3, 0.67, 0.4, 0.25]

CE loss = 0 x log(0.3) + 1 x log(0.67) + 0 x log(0.4) + 0 x log(0.25)

关键区别特征:以CE作为loss时,对于模型学习有效的部分仅为label=1对应位置的pred值。反过来讲,0对应位置的pred值无论是大是小,对于loss的计算没有影响。记住这一点,再来看BCE。

多标签分类任务-BCE

label:[0,1,0,1]

pred:[0.3, 0.67, 0.4, 0.25]

BCE loss = 0 x log(0.3) + (1-0) x log(0.7)

+ 1 x log(0.67) + (1-1) x log(0.33)

+ 0 x log(0.4) + (1-0) x log(0.6)

+ 1 x log(0.25) + (1-1) x log(0.75)

关键区别特征:以BCE作为loss时,无论是label=0的位置还是label=1的位置都对模型学习有影响。这就意味着训练会产生一种效果:label的某一位置为0会引导模型在该位置输出值向0“靠拢”。

这似乎是一件好事,没错,仅对于这一位置对应类别的分类来说确实是一件好事,所以二分类任务就采用BCE绝对没毛病。但是,现在做的是多标签分类任务,必须考虑该loss造成的相关的全局影响。来看一个例子:

label:[0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

众多位置中仅有2个位置为1,也就是说在全部标签数量较多的情况下,该条数据所符合的标签仅有2个。这将导致主导模型学习的是大量的0而不是1,而该条数据文本中包含的特征信息仅与1有关联性判断某条信息是否属于某一类别,是由它具备什么类别特征决定,而不是由它都不包含其它类别的特征决定于是造成从一个本来很有信息量(突出特征)的文本中反而没学到什么有助于分类的知识。如果还是不理解的话,可以这样想一下:教小孩去识物,但每次只告诉它不是a,b,c...造成它对每一件物品的识别都只能用排除法,显然效果会差很多。

总结

问题的关键正是无关信息主导模型学习非1预测。如果在该任务下,大部分数据的真实标签数量偏大,那么这不是问题,但在大部分多标签文本分类任务实际场景下,某条数据的真实标签数量相对整体标签数量基本微不足道,该问题对训练效果造成的影响也就很大。所以BCE对于多标签分类并非一个“可放心使用”的方法。

Binary Cross Entropy真的适合多标签分类吗?相关推荐

  1. 快速理解binary cross entropy 二元交叉熵

    Binary cross entropy 二元交叉熵是二分类问题中常用的一个Loss损失函数,在常见的机器学习模块中都有实现.本文就二元交叉熵这个损失函数的原理,简单地进行解释. 首先是二元交叉熵的公 ...

  2. Binary Cross Entropy

    参考Understanding binary cross-entropy / log loss 一.Introduction 训练一个二元分类器( binary classifier)的时候,往往会用 ...

  3. smooth l1(huber)+binary cross entropy详解(tensorflow+pytorch)

    前言 上篇讲到yolo v2 loss中使用了两个loss分别时wh使用的smoothl1 loss以及其他的BCEloss,这里做个扩展介绍,并对比pytorch以及tensorflow的api接口 ...

  4. 多标签分类、BCELoss和BCEWithLogitsLoss用法

    他们都用于多类别多分类 BCELoss 在图片多标签分类时,如果3张图片分3类,会输出一个3*3的矩阵. 先用Sigmoid给这些值都搞到0~1之间: 假设Target是: 下面用BCELoss来验证 ...

  5. AAAI 2019 Oral | 把Cross Entropy梯度分布拉‘平’,就能轻松超越Focal Loss

    单阶段物体检测(One-stage Object Detection)方法在模型训练过程中始终面临着样本分布严重不均衡的问题,来自香港中文大学的研究者们在论文 Gradient Harmonized ...

  6. 使用Keras进行单模型多标签分类

    原文:https://www.pyimagesearch.com/2018/05/07/multi-label-classification-with-keras/ 作者:Adrian Rosebro ...

  7. 为什么要返回softmax_为什么softmax搭配cross entropy是解决分类问题的通用方案?

    众所周知,softmax+cross entropy是在线性模型.神经网络等模型中解决分类问题的通用方案,但是为什么选择这种方案呢?它相对于其他方案有什么优势?笔者一直也困惑不解,最近浏览了一些资料, ...

  8. 目标检测分类损失函数——Cross entropy、Focal loss

    一.Cross Entropy Loss 交叉熵是用来判定实际的输出与期望的输出的接近程度,刻画的是实际输出与期望输出的距离,也就是交叉熵的值越小,两个概率分布就越接近. 1. CE Loss的定义 ...

  9. TensorFlow学习笔记(二十三)四种Cross Entropy交叉熵算法实现和应用

    交叉熵(Cross-Entropy) 交叉熵是一个在ML领域经常会被提到的名词.在这篇文章里将对这个概念进行详细的分析. 1.什么是信息量? 假设是一个离散型随机变量,其取值集合为,概率分布函数为 p ...

最新文章

  1. 赖江山:生态学研究都在用哪些R包?
  2. leetcode算法第四题
  3. 2016秋季阅读笔记一
  4. Android入门(十二)SQLite事务、升级数据库
  5. Java面向对象知识总结
  6. A10 平板开发一硬件平台搭建
  7. 别整那些花里胡哨的,女孩子喜欢简单直接的男生
  8. 收集一些关于视频文件格式以及编码计算的一些知识
  9. oa导入表格html,oa系统表单模板导入操作过程
  10. 解决word或wps删除空白页后页面布局变乱
  11. vmbackup和vmrestore是何方神圣?
  12. 分析C语言的声明——《C专家编程》
  13. 【华为OD机试真题 python】九宫格【2023 Q1 | 200分】
  14. 摘自-万能的林萧说:我来告诉你,一个草根程序员如何进入BAT。
  15. STM32开发(1)----stm32f103c6t6开发板介绍和环境搭建
  16. 看完阮一峰老师的博客后,感觉 OAuth2.0认证就这?
  17. 网络***实用战术手册(UNIX)
  18. 全球及中国汽车租赁行业投资规模及未来发展布局研究报告2021-2027年
  19. 2022/7/1 学习日志
  20. 深度学习读书笔记之RBM

热门文章

  1. fastadmin 快捷搜索 修改默认字段 多个字段 //菜单搜索框,默认搜索是id,想改成默认订单号
  2. linux中chown是什么命令,Linux中chown命令起什么作用呢?
  3. QMAP导致崩溃问题分析
  4. 3.条件概率与独立性
  5. 北京博奥智源科技有限公司分析关于系统开发渗透测试
  6. ffmpeg 代码阅读笔记1/2
  7. 完数判断python
  8. IntelliJ IDEA 构建maven多模块工程项目
  9. python3 绝对值_Python3 abs() 函数详解 获取数字的绝对值
  10. 摩根币的发行释放了哪些积极信号?