模型效果上限预估、分类模型Bad Case分析方法
给定训练和测试数据集,训练某个二分类模型(如,GBDT算法),我们通过交叉验证的方法得到了一组最优超参数以及对应的最优模型,但在测试集上这个模型仍有一定的误差率,也就说模型的预测结果存在一定数量的bad case。那么,目前的模型逼近了效果的上限了吗? 这些bad case有可能被解决吗?如果可以,该如何解决呢?
回答这些问题的前提条件是样本和特征已经固定下来,本文不讨论那些数据集本身还在迭代变化的情况。
一、两类Bad Case
- 标签正确的困难样本。模型没有拟合好这类样本,也就是模型还有进步的空间,尚未逼近效果的上界。
- 标签错误的噪声样本(outlier)。模型没有必要去拟合这类样本,过拟合会导致模型在真实使用环境的效果下降。
需要注意的是,这里说的噪声样本不一定是我们收集、加工数据的过程中出现了错误,有可能是样本对应的真实世界中的行为就是一个小概率的行为,这些小概率的异常行为虽然本身有可能真实存在,但是过度关注这些行为,会导致模型拟合正常行为的能力下降,而且并不会在模型的真实使用时带来增益。
由此可见,我们只要识别出噪声样本的数量,就能大致估算出模型的效果上界是多少。另外一方面,识别出标签正确的困难样本,也有助于我们寻找到模型改进的方法。
二、噪声样本识别方法
目前基于带噪标签数据的学习方法主要有两大类,一类是直接训练对噪声鲁棒的模型(noise-robust models),另一类方法首先识别出噪声数据,然后基于清洗后的数据训练模型。
尽管第一类方法已经足够好,但是面对老板如下的“灵魂拷问”,我们还是要关注一下第二类方法。
- 模型的效果上限是多少?
- 这个case为什么预测错误?
本文主要关注第二类方法。
1. 基于K近邻算法识别噪声样本
假设我们有一个样本相似度模型能够度量两个样本的相似度,那么可以针对bad case使用K近邻算法对其分类,根据分类结果识别其是否是噪声样本。这种方法的原理是假设相似的样本具有相同的分类标签。
一个二分类模型的bad case有以下两种情况:
- False Negative: 正样本被错误地预测为负样本
- False Positive: 负样本被错误地预测为正样本
FN) 正样本被错误地预测为负样本
- 根据样本特征的相似度度量,在训练集上检索出与目标正样本最相似的K个邻居样本;
- 统计K个邻居样本中正负样本的比例分布,假设K个邻居样本中N个正样本,则分类为正样本的概率
- 如果 大于某个设定的阈值(如,0.6),则判断该bad case样本为“标签正确的困难样本”,后续的模型迭代要更加关注这类样本。
- 如果 小于某个设定的阈值(如,0.6),则判断该bad case样本为“标签错误的噪声样本”。该样本后续建议从训练集和测试集中移除。
FP) 负样本被错误地预测为正样本
- 根据样本特征的相似度度量,在训练集上检索出与目标负样本最相似的K个邻居样本;
- 统计K个邻居样本中正负样本的比例分布,假设K个邻居样本中N个负样本,则分类为负样本的概率
- 如果 大于某个设定的阈值(如,0.6),则判断该bad case样本为“标签正确的困难样本”,后续的模型迭代要更加关注这类样本。
- 如果 小于某个设定的阈值(如,0.6),则判断该bad case样本为“标签错误的噪声样本”。该样本后续建议从训练集和测试集中移除。
如何度量样本特征的相似度
- 建立模型,比如采用“度量学习”的方法;优点是相似度度量更加精准。
- 使用特征向量的余弦相似度;优点是使用门槛低。
- 使用特征向量的加权余弦相似度;优点是相比于简单的余弦相似度,精度更高。
余弦相似度计算公式:
加权余弦相似度:
并不是每个特征在分类决策中做出的贡献都是相同的,所以,在有特征重要度权重的条件下,使用“加权余弦相似度”会比基础的“余弦相似度”度量方法有更好的结果。
使用GBDT算法,如阿里云平台上的 PS_SMART,训练的模型通常都可以输出每个特征的重要度分数,这些特征重要度分数的量级差异通常都比较大,在代入到“加权余弦相似度”计算公式时,需要先做softmax归一化,具体公式如下:
如何快速从海量的样本库中检索Top K个最相似的邻居样本
使用向量检索引擎,比如 faiss, mivus,有一定的使用门槛。
推荐使用阿里云开源的推荐算法训练框架EasyRec中集成的向量检索算法,可以直接运行在MaxCompute上,使用命令如下:
pai -name easy_rec_ext -project algo_public_dev
-Dcmd=vector_retrieve
-Dquery_table=odps://pai_online_project/tables/query_vector_table
-Ddoc_table=odps://pai_online_project/tables/doc_vector_table
-Doutput_table=odps://pai_online_project/tables/result_vector_table
-Dcluster='{"worker" : {"count":3, "cpu":600, "gpu":100, "memory":10000}}'
-Dknn_distance=inner_product
-Dknn_num_neighbours=100
-Dknn_feature_dims=128
-Dknn_index_type=gpu_ivfflat
-Dknn_feature_delimiter=','
-Dbuckets='oss://${oss_bucket}/'
-Darn='acs:ram::${xxxxxxxxxxxxx}:role/AliyunODPSPAIDefaultRole'
-DossHost='oss-cn-hangzhou-internal.aliyuncs.com'
模型参数说明请查看文档:https://easyrec.readthedocs.io/en/latest/vector_retrieve.html
2. 基于Confident Learning方法的噪音样本识别方法
置信学习(Confident Learning)是MIT和Google的研究人员提出一种可以快速地找出错误标签样本的迭代模型,并且有开源的工具库Cleanlab可以使用。
术语定义:
- 人工标签 :样本中的标签(可能存在错误,不一定指人手工打上的标签,也可能是业务回流数据生成的标签)
- 真实标签 :样本对应的真实标签,是未知的。
条件独立假设:每个样本被误标注都是条件独立的。
第一步:计算置信度联合分布矩阵
置信度联合计数矩阵 (有点类似混淆矩阵)的行表示预测标签样本个数,列表示真实标签样本个数。每个单元格 表示真实标签为 ,人工标签为 的样本个数。
对于一个样本,它的人工标签是已知的,即样本中的标签。
但是该样本的真实标签却是未知的,可以通过如下两个条件判断真实标签:
- 该标签的预测概率在所有标签概率中最大
- 该标签的预测概率大于计算得到的阈值,阈值的计算方法如下:
对于二分类问题,真实标签为正样本的阈值为 所有预测为正样本的预测概率的平均值;负样本阈值为 所有预测为负样本的预测概率的平均值。
上述两个条件中的第一个很好满足,但是第二个条件不一定满足,所以并不是所有的样本都可以找到其真实标签,这也会在后续的步骤中有所体现。
100 | 40 | |
50 | 80 |
上表例子中的总样本数为:
置信度联合计数矩阵 的计算公式如下:
第二步:计算置信度联合概率分布矩阵
在前一步构造置信度联合计数矩阵时,受到概率阈值限制,部分样本没有计算出真实标签。置信度联合计数矩阵中的样本数<=真实样本数。所以需要对置信度联合计数矩阵中的样本数量进行重新校准,校准公式如下:
即针对矩阵中的每一行计算属于各个真实标签的概率值(上述公式右项乘号前面的子项),再乘以人工标签为 的样本总数(上述公式右项乘号后面的子项)。
根据校准之后的置信度联合计数矩阵,我们可以通过如下公式计算置信度联合概率分布矩阵:
举例如下:
0.37 (=100/270) | 0.15 (=40/270) | |
0.185 (=50/270) | 0.296 (=80/270) |
备注:这里省略了计数校准的标准。
第三步:寻找错误标签样本
原始论文中提供了四种方法,这里介绍其中两种。
假设样本总数为,对于置信度联合概率分布矩阵的每个非对角线元素,计算 作为对 的预估。比如,假设共有100个样本,根据上表中的数据,判定有15个标注为正样本的数据实际上属于负样本。
- Prune by Class
对于每个类 ,选择 个置信度最低(模型预测概率最低)样本作为“噪声”样本。
根据上表中的数据,预测结果为正样本的样本集合中,15个预测概率最低的样本被判定为“噪声”样本;预测结果为负样本的样本集合中,18个预测概率最低(predict label=1的概率最高)的样本被判定为“噪声”样本。
- Prune by Noise Rate
对于置信度联合概率分布矩阵的每个非对角线元素,计算 个样本()作为“噪声”样本,选择条件是预测概率差值()最大的那个子集。
根据上表中的数据,预测结果为正样本的样本集合中,15个 “预测为负样本的概率-预测为正样本的概率” 最大的样本被标记为“噪声”样本;预测结果为负样本的样本集合中,18个 “预测为正样本的概率-预测为负样本的概率” 最大的样本被标记为“噪声”样本;
3. 深度学习模型的噪音样本识别方法
a. 基于Forgetting Events识别错误标签
在模型训练过程中,某个样本已经被模型正确分类,随着模型参数的更新,该样本又被错误分类,这一过程被称之为该样本的一次遗忘事件(forgetting event)。根据论文《AN EMPIRICAL STUDY OF EXAMPLE FORGETTING DURING DEEP NEURAL NETWORK LEARNING》的研究,在模型训练过程中噪声样本往往会比正常样本经历更多的遗忘事件。基于这一启发式规则,我们可以记录下每个样本经历的遗忘事件总次数,进一步辨别出可能的噪声标签数据。
b. 基于训练过程的样本loss值识别错误标签
基于训练过程中样本的loss值的相对大小来识别错误标签,这一方法是淘系技术部的同学在ICCV2019的论文《O2U-Net: A Simple Noisy Label Detection Approach for Deep Neural Networks》中提出的。
大致思路基于以下逻辑:在一次训练中,随着迭代轮次增加,网络逐渐从欠拟合逐渐过渡到过拟合状态,在训练的初期,模型精度的提升是非常明显的,因为网络很快学会了那部分“简单的”样本,因此这类样本的loss比较小,与之相反,那些“困难的”样本通常在训练的后期才逐渐被学会。观察训练过程发现,噪声样本通常是在训练的后期才被学会,因而在训练的早期,噪声样本的平均loss是远大于干净样本的,而在训练的后期,因为网络逐渐学会了所有样本,两类样本的loss区别不大。纵观整个训练过程,从欠拟合到过拟合,噪声样本loss的均值和方差都比干净样本要大。通过循环学习率策略,使网络在欠拟合和过拟合之间多次切换,并追踪不同阶段不同参数的模型对样本的loss,通过在时间维度上捕获多样性足够丰富的模型(类似集成学习,对满足多样性和准确性的多个模型进行ensemble),统计各个样本loss的均值和方差,均值和方差越大,样本属于噪声样本的概率也就越大。
三、如何估算模型效果上界
假设测试集样本数为 ,其中模型预测错误的样本数为 ,这些预测错误的样本中有 条被上述方法识别为噪声样本,那么:
- 目前模型的分类正确率为:
- 估计的模型正确率上界为:
对于二分类问题,召回率、准确率的上界计算方法类似,这里不再赘述。
四、如何改进模型,使模型逼近效果上界
借鉴AdaBoost算法原理,通过改变训练数据的样本权重,迫使模型更加关注分类错误的困难样本,从而得到更加鲁棒的模型。
- 使用初始模型,得到训练集、测试集上错误预测bad case集合;
- 使用上述噪声样本识别算法,识别出bad case的类型;
- 从数据集中移除所有被识别为“噪声”的bad case样本;
- 把识别为“困难”的bad case样本添加到训练集中,并设置一个较高的样本权重;减小其余初始模型预测正确的样本的权重(假设所有样本的默认初始权重都为1);
- 使用新的带权重的数据集重新训练模型;
- 重复上述1~6步,直到模型逼近效果上界为止。
参考文章:
本文由mdnice多平台发布