置信学习:让样本中的“脏数据“原形毕露
在实际工作中,你是否遇到过这样一个问题或痛点:无论是通过哪种方式获取的标注数据,数据标注质量可能不过关,存在一些错误?亦或者是数据标注的标准不统一、存在一些歧义?特别是badcase反馈回来,发现训练集标注的居然和badcase一样?如下图所示,QuickDraw、MNIST和Amazon Reviews数据集中就存在错误标注。
为了快速迭代,大家是不是常常直接人工去清洗这些“脏数据”?(笔者也经常这么干~)。但数据规模上来了咋整?有没有一种方法能够自动找出哪些错误标注的样本呢?基于此,本文尝试提供一种可能的解决方案——置信学习。
本文的组织架构是:
01
置信学习的定义
那什么是置信学习呢?这个概念来自一篇由MIT和Google联合提出的paper:《Confident Learning: Estimating Uncertainty in Dataset Labels[1] 》。论文提出的置信学习(confident learning,CL)是一种新兴的、具有原则性的框架,以识别标签错误、表征标签噪声并应用于带噪学习(noisy label learning)。
笔者注:笔者乍一听置信学习挺陌生的,但回过头来想想,好像干过类似的事情,比如:在某些场景下,对训练集通过交叉验证来找出一些可能存在错误标注的样本,然后交给人工去纠正。此外,神经网络的成功通常建立在大量、干净的数据上,标注错误过多必然会影响性能表现,带噪学习可是一个大的topic,有兴趣可参考这些文献:github.com/subeeshvasu/。
废话不说,首先给出这种置信学习框架的优势:
最大的优势:可以用于发现标注错误的样本!
无需迭代,开源了相应的python包,方便快速使用!在ImageNet中查找训练集的标签错误仅仅需要3分钟!
可直接估计噪声标签与真实标签的联合分布,具有理论合理性。
不需要超参数,只需使用交叉验证来获得样本外的预测概率。
不需要做随机均匀的标签噪声的假设(这种假设在实践中通常不现实)。
与模型无关,可以使用任意模型,不像众多带噪学习与模型和训练过程强耦合。
笔者注:置信学习找出的「标注错误的样本」,不一定是真实错误的样本,这是一种基于不确定估计的选择方法。
02
置信学习开源工具:cleanlab
论文最令人惊喜的一点就是作者这个置信学习框架进行了开源,并命名为cleanlab,我们可以pip install cleanlab
使用,具体文档说明在这里cleanlab文档说明。
from cleanlab.pruning import get_noise_indices
# 输入
# s:噪声标签
# psx: n x m 的预测概率概率,通过交叉验证获得
ordered_label_errors = get_noise_indices(s=numpy_array_of_noisy_labels,psx=numpy_array_of_predicted_probabilities,sorted_index_method='normalized_margin', # Orders label errors)
我们来看看cleanlab在MINIST数据集中找出的错误样本吧,是不是感觉很牛~
如果你不只是想找到错误标注的样本,还想把这些标注噪音clean掉之后重新继续学习,那3行codes也可以搞定,这时候连交叉验证都省了~:
from cleanlab.classification import LearningWithNoisyLabels
from sklearn.linear_model import LogisticRegression# 其实可以封装任意一个你自定义的模型.
lnl = LearningWithNoisyLabels(clf=LogisticRegression())
lnl.fit(X=X_train_data, s=train_noisy_labels)
# 对真实世界进行验证.
predicted_test_labels = lnl.predict(X_test)
笔者注:上面虽然只给出了CV领域的例子,但置信学习也适用于NLP啊~此外,
cleanlab
可以封装任意一个你自定义的模型,以下机器学习框架都适用:scikit-learn, PyTorch, TensorFlow, FastText。
03
置信学习的3个步骤
置信学习开源工具cleanlab
操作起来比较容易,但置信学习背后也是有着充分的理论支持的。事实上,一个完整的置信学习框架,需要完成以下三个步骤 ( 如图1所示 ):
Count:估计噪声标签和真实标签的联合分布;
Clean:找出并过滤掉错误样本;
Re-Training:过滤错误样本后,重新调整样本类别权重,重新训练;
图1 置信学习框架
下面对上述3个步骤进行详细阐述:
1. Count:估计噪声标签和真实标签的联合分布
我们定义噪声标签为 ,即经过初始标注(也许是人工标注)、但可能存在错误的样本;定义真实标签为 ,但事实上我们并不会获得真实标签,通常可通过交叉验证对真实标签进行估计。此外,定义样本总数为 ,类别总数为 。
为了估计联合分布,共需要4步:
step 1 : 交叉验证
首先需要通过对数据集集进行交叉验证计算第 样本在第 个类别下的概率 ;
然后计算每个人工标定类别 下的平均概率 作为置信度阈值;
最后对于样本 ,其真实标签 为 个类别中的最大概率 ,并且 ;
step 2:
计算计数矩阵 (类似于混淆矩阵),如图1中的 意味着,人工标记为dog但实际为fox的样本为40个。具体的操作流程如图2所示:
图2 计数矩阵C计算流程
step 3 : 标定计数矩阵
目的就是为了让计数总和与人工标记的样本总数相同。计算公式如下面所示,其中 为人工标记标签 的样本总个数:
①
step 4 :
估计噪声标签 和真实标签的联合分布,可通过下式求得:
②
看到这里,也许你会问为什么要估计这个联合分布呢?其实这主要是为了下一步方便我们去clean噪声数据。此外,这个联合分布其实能充分反映真实世界中噪声 ( 错误 ) 标签和真实标签的分布,随着数据规模的扩大,这种估计方法与真实分布越接近 ( 原论文中有着严谨的证明,由于公式推导繁杂这里不再赘述,有兴趣的同学可以详细阅读原文~,后文的图7也有相关实验进行证明 )。
看到这里,也许你还感觉公式好麻烦,那下面我们通过一个具体的例子来展示上述计算过程:
step 1 : 通过交叉验证获取第 样本在第 个类别下的概率 ;为说明问题,这里假设共10个样本、2个类别,每个类别有5个样本。经过计算每个人工标签类别 下的平均概率 分别为: .
图3 P[i][j]和t[j]计算
step2:根据图2的计算流程,我们得到计数矩阵 为:
图4 计数矩阵C计算
step3:标定后的计数矩阵 为 ( 计数总和与人工标记的样本总数相同 ),将原来的样本总数进行加权即可,以 为例,根据公式①,其计算为 ):
step4:联合分布 为:( 根据公式②直接进行概率归一化即可 )
图5 联合分布Q计算
2. Clean:找出并过滤掉错误样本
在得到噪声标签和真实标签的联合分布 ,论文共提出了5种方法过滤错误样本。
Method 1:,选取 的样本进行过滤,即选取 最大概率对应的下标 与人工标签不一致的样本。
Method 2:,选取构造计数矩阵 过程中、进入非对角单元的样本进行过滤。
Method 3:Prune by Class ( PBC ),即对于人工标记的每一个类别 ,选取 个样本过滤,并按照最低概率 排序。
Method 4:Prune by Noise Rate ( PBNR ),对于计数矩阵 的非对角单元,选取 个样本进行过滤,并按照最大间隔 排序。
Method 5:C+NR,同时采用Method 3和Method 4。
我们仍然以图3给出的示例进行说明:
Method 1:过滤掉i=2,3,4,8,9共5个样本;
Method 2:进入到计数矩阵非对角单元的样本分别为i=3,4,9,将这3个样本过滤;
Method 3:对于类别0,选取 个样本过滤,按照最低概率排序,选取i=2,3,4;对于类别1,选取 个样本过滤,按照最低概率排序选取i=9;综上,共过滤i=2,3,4,9共4个样本;
Method 4:对于非对角单元 选取i=2,3,4过滤,对 选取i=9过滤。
上述这些过滤样本的方法在cleanlab
也有提供,我们只要提供2个输入、1行code即可clean错误样本:
import cleanlab
# 输入
# s:噪声标签
# psx: n x m 的预测概率概率,通过交叉验证获得
# Method 3:Prune by Class (PBC)
baseline_cl_pbc = cleanlab.pruning.get_noise_indices(s, psx, prune_method='prune_by_class',n_jobs=1)
# Method 4:Prune by Noise Rate (PBNR)
baseline_cl_pbnr = cleanlab.pruning.get_noise_indices(s, psx, prune_method='prune_by_noise_rate',n_jobs=1)
# Method 5:C+NR
baseline_cl_both = cleanlab.pruning.get_noise_indices(s, psx, prune_method='both',n_jobs=1)
3. Re-Training:过滤错误样本后,重新训练
在过滤掉错误样本后,根据联合分布 将每个类别i下的损失权重修正为: ,其中 .然后采取Co-Teaching[2]框架进行。
图6 Co-teaching
如图6所示,Co-teaching的基本假设是认为noisy label的loss要比clean label的要大,于是它并行地训练了两个神经网络A和B,在每一个Mini-batch训练的过程中,每一个神经网络把它认为loss比较小的样本,送给它其另外一个网络,这样不断进行迭代训练。
04
实验结果
上面我们介绍完成置信学习的3个步骤,本小节我们来看看这种置信学习框架在实践中效果如何?在正式介绍之前,我们首先对稀疏率进行定义:稀疏率为联合分布矩阵、非对角单元中0所占的比率,这意味着真实世界中,总有一些样本不会被轻易错标为某些类别,如老虎图片不会被轻易错标为汽车。
图7 真实联合分布和估计联合分布
图7给出了CIFAR-10中,噪声率为40%和稀疏率为60%情况下,真实联合分布和估计联合分布之间的比较,可以看出二者之间很接近,可见论文提出的置信学习框架用来估计联合分布的有效性。
图8 不同置信学习方法的比较
上图给出了CIFAR-10中不同噪声情况和稀疏性情况下,置信学习与其他SOTA方法的比较。例如在40%的噪声率下,置信学习比之前SOTA方法Mentornet的准确率平均提高34%。
图9 置信学习发现的 ImageNet标签问题
论文还将提出置信学习框架应用于真实世界的ImageNet数据集,利用CL:PBNR找出的TOP32标签问题如图9所示,置信学习除了可以找出标注错误的样本 ( 红色部分 ),也可以发现多标签问题 ( 蓝色部分,图像可以有多个标签 ),以及本体论问题:绿色部分,包括"是" ( 比如:将浴缸标记为桶 ) 或"有" ( 比如:示波器标记为CRT屏幕 ) 两种关系。
图10 不同置信学习方法和随机去除的对比
图10给出了分别去除20%,40%…,100%估计错误标注的样本后训练的准确性,最多移除200K个样本。可以看出,当移除小于100K个训练样本时,置信学习框架使得准确率明显提升,并优于随机去除。
05
总结
本文介绍了一种用来刻画noisy label、找出错误标注样本的方法——置信学习,是弱监督学习和带噪学习的一个分支。
置信学习直接估计噪声标签和真实标签的联合分布,而不是修复噪声标签或者修改损失权重。
置信学习开源包cleanlab
可以很快速的帮你找出那些错误样本!可在分钟级别之内找出错误标注的样本。
置信学习:让样本中的“脏数据“原形毕露相关推荐
- React学习(六)-React中组件的数据-state
虽互不曾谋面,但希望能和你成为笔尖下的朋友 以读书,技术,生活为主,偶尔撒点鸡汤 不作,不敷衍,意在真诚吐露,用心分享 点击左上方,可关注本刊 撰文 | 川川 ID:suibichuanji 点击下方 ...
- 关于 Hibernate 中的“脏数据”、“脏对象”
今天在阅读<精通 Hibernate>的时候读到了这样两个词"脏对象"."脏检查",想来想去,从字面和上下文来看都无法猜出其确切意义,于是去问百度了 ...
- React学习(6)-React中组件的数据-state
前言 组件中的state具体是什么?怎么更改state的数据? setState函数分别接收对象以及函数有什么区别? 如何划分组件的状态数据,进行自我的灵魂拷问,以及props与state的灵魂对比 ...
- 小样本学习记录————文本中特征空间的数据增强MEDA: Meta-Learning with Data Augmentation for Few-Shot Text Classification
MEDA: Meta-Learning with Data Augmentation for Few-Shot Text Classification 出发点 数据增强 球合成器 合成模块Synthe ...
- Pandas的学习(5.pandas中处理丢失数据和空值数据以及填充空值数据)
处理丢失数据 有两种丢失的数据: -- None -- np.nan(NaN) 1.None None是Python自带的,其类型为python object.因此,N ...
- 深度学习——从文件中载入训练数据
参考书籍:<深度学习--基于Python语言和TensorFlow平台> 非数字列与数字列的转换: # -*-coding:gbk-*- import numpy as np import ...
- React学习(九)-React中发送Ajax请求以及Mock数据
虽互不曾谋面,但希望能和你成为笔尖下的朋友 以读书,技术,生活为主,偶尔撒点鸡汤 不作,不敷衍,意在真诚吐露,用心分享 点击左上方,可关注本刊 撰文 | 川川 VX-ID:suibichuanji 点 ...
- 什么是脏数据?怎样用箱形图分析异常值?终于有人讲明白了
导读:数据质量分析是数据挖掘中数据准备过程的重要一环,是数据预处理的前提,也是数据挖掘分析结论有效性和准确性的基础.没有可信的数据,数据挖掘构建的模型将是空中楼阁. 数据质量分析的主要任务是检查原始数 ...
- 箱式图 添加异常值平均值_什么是脏数据?怎样用箱形图分析异常值?终于有人讲明白了...
导读:数据质量分析是数据挖掘中数据准备过程的重要一环,是数据预处理的前提,也是数据挖掘分析结论有效性和准确性的基础.没有可信的数据,数据挖掘构建的模型将是空中楼阁. 数据质量分析的主要任务是检查原始数 ...
最新文章
- 项目案例:Java多线程批量拆分List导入数据库
- 精简版开发工具使用手记2(图解)
- 删除静态 IP 路由
- Matlab C++混合编程 在VisualStudio下的编程 使用了Opencv库
- 直播丨Oracle 12.2系列安装
- android内存卡测试,安卓sd卡真假检测工具_内存卡检测扩容卡软件_sd insight
- javascript总复习
- Excel实现数据项校验的功能---VBA的编写以及数据有效性的设置
- Nature | 基于细菌构建具有类真核细胞结构和功能的人工细胞
- 可视化绘图技巧100篇分析篇(一)-数据降维NMDS分析(补充篇)
- 12306排队是什么意思_12306的排队机制是什么样的?
- MATLAB STK构建卫星轨道姿态控制仿真演示系统
- MATLAB颜色的使用(转)
- web漏洞扫描器原理_【技术分享】漏洞扫描技巧篇Web 漏洞扫描器
- 增大 MAT 堆内存
- 前端_快速入门Vue.js框架
- 2020-03-05
- EduSoho开源网络课堂网校系统 v8.3.36官方最新版
- 基于STM32的DAC音频输出
- 了解扎克伯格是如何从一个被女友嫌弃太nerd的loser转变成下一个比尔盖茨--《社交网络》影片评论
热门文章
- linux 命令 cd -p,Linux_实例讲解Linux中cd命令切换目录的使用技巧,cd命令大家再熟悉不过了,bash sh - phpStudy...
- 关于星空的java小程序_[Java教程]小程序使用Canvas画饼图_星空网
- ab压力测试(了解ab工具,实验对网页进行测试)
- 操作篇 DHCP协议学习与应用
- OpenStack的部署T版(八)——Dashboard
- php中的rtrim_php中ltrim()、rtrim()与trim()删除字符空格实例
- 详解DNS正向解析实验(有图有实验)
- 全连接条件随机场_CRF条件随机场
- STM32 ADC采样使用内部参考电压
- 安卓编程用什么软件_震惊!安卓IOS都可以用的牛逼软件