资讯 文档
技术能力
语音技术
文字识别
人脸与人体
图像技术
语言与知识
视频技术

噪声样本挖掘

数据降噪原理

置信学习方法介绍

数据标注的标准不统一或者存在一些歧义会导致数据标注的质量可能不过关,存在一些错误等。在模型快速迭代的过程中,如何清洗这类噪声数据,以及在大规模数据集上如果处理,为数据清洗工作带来了挑战。本文尝试使用置信学习的方法自动找出潜在的标注错误的样本。

置信学习的定义

置信学习的概念来自于ICML2020的一篇由MIT和Google联合提出的paper:《Confident Learning: Estimating Uncertainty in Dataset Labels[1]》。论文提出的置信学习(confident learning,CL)是一种新兴的、具有原则性的框架,以识别标签错误、表征标签噪声并应用于带噪学习(noisy label learning)。这种置信学习框架的优势

  • 最大的优势:可以用于发现标注错误的样本!
  • 无需迭代,开源了相应的python包,方便快速使用!在ImageNet中查找训练集的标签错误仅仅需要3分钟!
  • 可直接估计噪声标签与真实标签的联合分布,具有理论合理性
  • 不需要超参数,只需使用交叉验证来获得样本外的预测概率。
  • 不需要做随机均匀的标签噪声的假设(这种假设在实践中通常不现实)。
  • 与模型无关,可以使用任意模型,不像众多带噪学习与模型和训练过程强耦合。

置信学习的过程

步骤一 Count:Label Noise Characterization

定义噪声标签为 y~,即经过初始标注(也许是人工标注)、但可能存在错误的样本;定义真实标签为 y*,但事实上我们并不会获得真实标签,所以通常是采取交叉验证对真实标签进行估计。此外,定义样本总数为 n,类别总数为 m 。

为了估计联合分布,共需要4步(具体公式可参考论文):

  • step 1 : 交叉验证

    • 首先需要对数据集进行交叉验证,并计算第 i 个样本在第 j 个类别下的概率P[i] [j];
    • 然后计算每个人工标定类别 j 下的平均概率 t[j] 作为置信度阈值;
    • 最后对于样本 i,其真实标签 y* 为 j 个类别中的最大概率 argmaxj P[i] [j],并且P[i] [j] > t[j]
  • step 2 : 计算计数矩阵 Cy~,y*(类似于混淆矩阵),例如Cy~=dog, y*=fox = 40 意味着:人工标记为dog但实际为fox的样本为40个。
  • step 3 : 标定计数矩阵:目的就是为了让计数总和与人工标记的样本总数相同。
  • step 4:估计噪声标签和真实标签的联合分布。

步骤二 Rank and Prune: Data Cleaning

在得到噪声标签和真实标签的联合分布 Qy~,y*,论文共提出了5种方法过滤错误样本。

  • Method 1: Cconfusion,选取 P[i] [j] 最大概率对应的下标 j 与人工标签不一致的样本进行过滤。
  • Method 2: Cy~,y*,选取构造计数矩阵 Cy~,y* 过程中、进入非对角单元的样本进行过滤。
  • Method 3: Prune by Class (PBC) ,即对于人工标记的每一个类别 i(属于) 1,2,3,…,m 选取 n·Σj(属于)1..m:j≠i (Cy~=i, y*=j [i]) 个样本过滤,并按照最低概率 p(y~, x, θ) 排序。
  • Method 4: Prune by Noise Rate (PBNR) ,对于计数矩阵 Cy~,y *的非对角单元,选取 n·Qy~,y* 个样本进行过滤,并按照最大间隔 py~=j - py~=i 排序。
  • Method 5: C+NR,同时采用Method 3和Method 4.

数据降噪工具使用

首先先进入文本分类任务目录

cd wenxin/tasks/text_classification

代码结构说明

以下是本项目主要代码结构及说明:

.
├── __init__.py                                                                                 
├── env.sh                                                    ## 环境变量配置脚本
├── run_with_json_by_denoise.py																## 非快速降噪工具的入口脚本
├── run_with_json_by_denoise_fast.py													## 快速降噪工具的入口脚本
│
├── examples                                                
│   └── cls_ernie_2.1_base_cnn_by_denoise_ch.json       			## 非快速降噪工具的json配置文件
│
└── data
     ├── train_data
     │   └── train.txt                                        ## 含噪声数据文件
     │                                     
     └── data_with_noise                                     
          ├── data.txt                                        ## 含噪声数据文件
          └── label_probability.txt                           ## 含噪声数据标签及其标签分布文件

模式一:快速降噪

数据准备

  • 这里我们提供一份适配快速降噪的示例数据集。包括待识别噪声的数据集和模型输出的标签分布,此处的待识别噪声的数据集与非快速降噪工具中使用的数据集内容相同。
  • 待识别噪声的数据集和模型输出的标签分布存放在./data目录下的data_with_noise/文件夹下

    注:数据集(包含词表)均为utf-8格式。

待识别噪声的数据集

  • 如下所示。每个样本占一行,数据分为两列,列与列之间用\t进行分隔。第一列为文本,第二列为标签。

    15.4寸笔记本的键盘确实爽,基本跟台式机差不多了,蛮喜欢数字小键盘,输数字特方便,样子也很美观,做工也相当不错	1
    房间太小。其他的都一般。。。。。。。。。	0

模型输出的标签分布

  • 如下所示。每个样本占一行,数据分为两列,列与列之间用\t进行分隔。第一列为标签,是人工标注的标签(含噪声的、可能存在错误的);第二列为模型输出的标签分布(因为获取不到真实的无噪声的,就用性能良好的分类模型的输出分布来代替),第二列以空格分隔。

    1	0.4314256 0.5685744
    0	0.9729412 0.027058747

使用我的第一个数据降噪工具

开始使用
  • 使用快速降噪模式进行噪声识别的方式为使用./run_with_json_by_denoise.py入口脚本,通过—data_file参数来传入./data/data_with_noise目录下的data.txt文件,通过—prob_file参数来传入./data/data_with_noise目录下的label_probability.txt文件,通过—store_noise_file参数来配置用来存储噪声识别结果的文件。
  • 使用分为以下几个步骤:

    1. 确保已安装python包cleanlab,可通过pip list命令查看已安装python包中是否含有cleanlab。如未安装,请使用如下安装命令;

      # 需要提前安装python包cleanlab
      wget -q http://bj.bcebos.com/textone-pro-model/cleanlab-0.1.1-py2.py3-none-any.whl
      pip install cleanlab-0.1.1-py2.py3-none-any.whl
    2. 基于示例的数据集,可以运行以下命令利用label_probability.txt中的标签分布,快速识别data.txt中的噪声数据,并将噪声数据存储至find_noise_data_result_fastly.txt中;

      # 数据降噪工具-快速降噪模式
      # 参数store_noise_file为可选参数,如未配置,噪声识别结果将默认保存在./find_noise_data_result_fastly.txt
      python run_with_json_by_denoise_fast.py --data_file data/data_with_noise/data.txt --prob_file data/data_with_noise/label_probability.txt --store_noise_file ./find_noise_data_result_fastly.txt
查看噪声识别结果

运行结束后,可查看find_noise_data_result_fastly.txt中识别出的可能的噪声数据,文件中的噪声数据按被判定为噪声的可能性排序。

## 示例:第一列为text_a文本,第二列为人工标注的标签label
入住的时候礼宾在哪里?房间里的花盆特别象90年代初期的田园花盆,极为难看.更可怕的是入住的时候门口不管客人,照常做大范围清洁. 1
因为屏幕是16:9,所以玩游戏或是浏览网页时,字体都超小,看得费劲   1
通过携程预定该酒店保留到晚上6点的。但是下午3点多接到携程电话,居然说我给酒店打电话取消我的房间,问我有没有这回事。简直很气人! 后来到酒店办理入住时,问了前台有没有这回事。他们居然回答的很干脆,有这个事情。酒店也太不负责了,为了自己的入住率就随意取消客人的预定。一点都不配万丽的作风和职业道德。 另外,该酒店不能用民生银行信用卡做预授权,只能用中国银行和交通银行。这点很不方便的,请大家以后入住的时候请注意了。  1
看到很多评价都很高,结果期待也高了些,没有想象的好看,外观一般,缺乏质感,毕竟这个价位嘛。   1
服务:整体勉强有4星级水平 问题:硬件水平偏低,房间隔音效果差,门薄墙薄,结账时间偏长,早餐质量偏低,不过在该地段,也没有比这家更好地宾馆供选择.   1

模式二:非快速降噪

  • 这里我们提供一份已标注的待识别噪声的示例数据集。此处的待识别噪声的示例数据集与快速降噪工具中使用的示例数据集相同。
  • 该示例数据集存放在./data目录下的train_data文件夹下。在本任务中,无需准备dev数据集和test数据集。
  • 该任务预置网络基于ERNIE的模型进行训练,数据集不需要分词且无需准备词表。

    注:数据集(包含词表)均为utf-8格式。

待识别噪声的数据集

  • 如下所示。每个样本占一行,数据分为两列,列与列之间用\t进行分隔。第一列为文本,第二列为标签。

    非常 不错 , 服务 很好 , 位于 市中心 区 , 交通 方便 , 不过 价格 也 高 !	1
    房间 太 小 。 其他 的 都 一般 。 。 。 。 。 。 。 。 。	0

使用我的第一个数据降噪工具

开始使用
  • 使用基于Ernie的预置网络进行数据降噪的方式为使用./run_with_json_by_denoise.py入口脚本,通过--param_path参数来传入./examples/目录下的json配置文件。
  • 训练分为以下几个步骤:

    1. 确保已安装python包cleanlab,可通过pip list命令查看已安装python包中是否含有cleanlab。如未安装,请使用如下安装命令;

      # 需要提前安装python包cleanlab
      wget -q http://bj.bcebos.com/textone-pro-model/cleanlab-0.1.1-py2.py3-none-any.whl
      pip install cleanlab-0.1.1-py2.py3-none-any.whl
    2. 请使用以下命令在../model_files/中通过对应脚本download_ernie_2.0_base_ch.sh下载模型参数文件;

      # download_ernie_2.0_base_ch.sh 模型下载
      # 进入model_files目录
      cd ../model_files/
      # 运行下载脚本
      sh download_ernie_2.0_base_ch.sh
    3. 基于示例的数据集,可以运行以下命令在待识别噪声的数据集(train.txt)上进行训练并识别噪声;

      # 进入text_classification目录
      cd ../text_classification
      # 基于json实现预置网络训练。其调用了配置文件./examples/cls_ernie_2.0_base_cnn_by_denoise_ch.json
      python run_with_json_by_denoise.py --param_path ./examples/cls_ernie_2.0_base_cnn_by_denoise_ch.json
    4. 训练运行的日志会自动保存在./log/trainer_{id}.log文件中;
    5. 训练结束后挑选出的噪声数据会默认保存在./output/目录下的find_noise_data_result.txt,文件中的噪声数据按被判定为噪声的可能性排序。

      ## 示例:第一列为text_a文本,第二列为人工标注的标签label
      入住的时候礼宾在哪里?房间里的花盆特别象90年代初期的田园花盆,极为难看.更可怕的是入住的时候门口不管客人,照常做大范围清洁. 1
      因为屏幕是16:9,所以玩游戏或是浏览网页时,字体都超小,看得费劲   1
      通过携程预定该酒店保留到晚上6点的。但是下午3点多接到携程电话,居然说我给酒店打电话取消我的房间,问我有没有这回事。简直很气人! 后来到酒店办理入住时,问了前台有没有这回事。他们居然回答的很干脆,有这个事情。酒店也太不负责了,为了自己的入住率就随意取消客人的预定。一点都不配万丽的作风和职业道德。 另外,该酒店不能用民生银行信用卡做预授权,只能用中国银行和交通银行。这点很不方便的,请大家以后入住的时候请注意了。  1
      看到很多评价都很高,结果期待也高了些,没有想象的好看,外观一般,缺乏质感,毕竟这个价位嘛。   1
      服务:整体勉强有4星级水平 问题:硬件水平偏低,房间隔音效果差,门薄墙薄,结账时间偏长,早餐质量偏低,不过在该地段,也没有比这家更好地宾馆供选择.   1

进阶使用

非快速降噪的json配置说明

参数说明

  • dataset_reader“中的”prune“相关参数为非快速降噪的配置; 其中,num_fold表示需要将训练集拆成K折(num_fold的取值需要>=2,数据量较小时k值应可能大,但考虑到k越大则耗时越长,k设为5较为合适)、data_path表示带识别噪声的数据集路径,必须是目录、data_path_split表示使用K折交叉验证拆分完成之后的数据存放路径,必须是个目录,默认为”./data_tmp” (非快速降噪使用了k-fold方法)。store_noise_path表示存储噪声识别结果的路径,必须是个目录,默认为”./output”。
  • dataset_reader“中的”train_reader“和”dev_reader“相关参数必须配置,否则会报错。

配置说明

  • 数据降噪工具-非快速降噪模式使用了k-fold思想,用(k-1)/k数据训练子分类模型,再用该子模型获取剩余1/k数据的P(y|x)。最终,拼接所有的P(y|x)。
  • 拼接后的P(y|x)作为输入,用于数据降噪过程。
  • 为了配合k-fold,请配置好dev_reader,dev_reader的config部分的data_path随意填写(不被使用,程序运行时会自动修改)。
  • 示例配置如下:

    {
    "dataset_reader": {
      "prune": {
        "num_fold": 5,
        "data_path": "./data/train_data",
        "data_path_split": "./data_tmp",
        "store_noise_path": "./output"
      },
       "train_reader": {
          ...
      },
      "dev_reader": {
          ...
      },
      ...
    },
    ...
    }
上一篇
任务详解
下一篇
数据增强