DCAI: Data-Centric AI 以数据为中心的 AI
1. 什么是DCAI1.1. 当下的研究背景想象当中的数据集通常是干净且精选的例如猫或狗的图片。猫就是猫狗就是狗实际现实生活中的数据集非常混乱 https://labelerrors.com/ 比如这个网站里提供了一些人们常用的开源数据集中的错误标签部分两个大佬的meme乐呵一下经验丰富的数据科学家投资探索和修复数据比修补模型更值得。即避免“垃圾进垃圾出”因此我们要意识到我们所用到的数据并不是完美无缺的相反里面有非常多的陷阱。而业界也花了很多时间和精力在处理数据而非模型上。1.2. 现在就来简易区分以模型为中心的AI和以数据为中心的AI以模型为中心的AI重心在于调整模型调参侠掉包侠fancy modeler以数据为中心的AI重心在于调整feed的数据本身适配你所选的模型当然两者最终目标都是优化模型训练结果。其中以数据为中心的AI需要自动化完成对数据质量的提升例如Coreset selection 自动挑出来数据集中真正能够 boosting performance 的部分这主要是在降能增效Dataset Augmentation 避免overfit/underfit的常用方法常用的techniqueOutlier Detection and Removal (handling abnormal examples in dataset) 异常值检测Error Detection and Correction (handling incorrect values/labels in dataset) 错误识别Data Augmentation (adding examples to data to encode prior knowledge) 数据增强Feature Engineering and Selection (manipulating how data are represented) 特征工程及筛选Establishing Consensus Labels (determining true label from crowdsourced annotations) 一致标签Active Learning (selecting the most informative data to label next) 主动学习Curriculum Learning (ordering the examples in dataset from easiest to hardest) 课程学习总的来说就是提升喂进模型的数据质量进一步提升模型表现。好处是不仅纠正了错误而且还事半功倍DCAI更能够提升模型表现2. 从label error开始探寻DCAIDCAI一开始主攻的点就在label error上。诚如前所说实际现实生活中的数据集非常混乱label部分也是混乱的。2.1. label error有哪些产生这些错误的标签的原因也是多种多样比如你摁错了大众点评上给餐馆打星不小心标错了测量度搞错了单位你不认识真实的label所以标错了用了其他的ML模型的错误输出比如你做生成模型时硬件层级的数据传输或者保存时出的错……2.2. label error的识别置信学习 (CL)核心思想还是根据历史训练结果 (confidence)辅助判断该label是否有问题。具体我就不展示啦逻辑还是比较清晰的通过CL估计发现这些著名的数据集中居然有这么多label error2.3. label error对benchmark的影响首先我们来看CIFAR-10上的例子。横坐标是在未修改的validationcorrectable意味着能被修正的错误标签上的top1 acc纵坐标是在修正了label的validation上的acc。可以看出随着层数的加深参数量的进一步扩大Acc能够占优但修正label之后反而变差了。因为他overfit了这些noise。当然横坐标之所以低于纵坐标也是因为这里用来测试的validation dataset本身是噪音本不该学到其中的信息。然后我们在ImageNet上观察。随着test data或者validation中correctable noise错误标签占比增加ResNet50和ResNet18的acc均有下降。但是神奇的是当我们在修正了label error的test data上测试时ResNet18的acc显示出非常强的robustness超越了ResNet50.这在一定程度上说明了label error对benchmark的表现有很大影响因此在此之前的 paper 所依据的benchmark很有可能并不准确。3. DCAI对数据集的构建和维护应该注意的地方这个章节主要有三个小问题选择偏差数据集容量估计以及一致标签。3.1. Selection Bias选择偏差我们的训练数据和实际的应用场景有很大差异——这也叫做分布迁移 (distribution shift)。这种偏差在建模的时候很难发觉。统计学直观展示举例Time/location bias 过去现在和未来不同国家地理位置比如对金融时序数据过去和现在未来的市场环境在随时变换不同的市场特征也显著不同Demographics bias少数群体的underrepresentResponse bias主要是对调查问卷中答案设置本身自带biasAvailability bias – using data that happens to be convenient rather than most representative (可以用幸存者偏差来概括Long tail bias – in applications with many different possible rare scenarios, collection mechanisms may prevent some from appearing in the dataset (e.g. autonomous vehicle gets bumped into wrong side of road).极端情况比如自动驾驶驶入了错误行道训练集很少但实际一定会碰到比较好的解决办法让validation数据集更贴近实际应用场景If data are collected over time in a changing environment, one might hold out the most recent data as the validation set. TS数据用最近的数据来做validationIf data are collected from multiple locations and new locations will be encountered during deployment, one might reserve all data from some locations for validation. 把所有location的数据inclusive地放进validationIf data contain important but rare events, one might over-sample these when randomly selecting validation data. oversample偶发事件这个topic会在后面有更详尽的说明。3.2. 我们到底需要多少数据根据实证得到的error和训练样本集n大概符合以下关系你只需要不断增大n通过在相同测试集上的error便可以拟合得到ab参数值然后根据你想要的精度计算出合适大小的训练集。这篇文章来自于ICLR2020Rosenfeld, J., Rosenfeld, A., and Belinkov, Y. A constructive prediction of the generalization error across scales.International Conference on Learning Representations, 2020.3.3. Curating a dataset labeled by multiple annotators 多个标注者共同标注数据集这里的问题主要来自crowdsourcing外包。外包可能产生两个问题外包标注不一定准确外包人员有可能互相抄抄图省事儿就拿其他人的标注交作业一般来说应对这种问题的解决办法是掺杂一些quality control即已知真实label的数据进去这样就能发现一些端倪。但是事实上很多时候我们没有这样的样本。于是我们想解决这样的问题我们需要三类数据一致标注 (single best label)标注的质量 (confidence)标注者的质量在这里我们有以下方法获得以上的数据。Majority Vote Inter-Annotator Agreement这很简单就是取标注者们的 Majority Vote并把它当作真是label进一步可以得到标注者的质量用正确率衡量。这样问题在于可能出现tie并且好坏标注者对标注的贡献是等同的。Majority Vote如果有tie的话我们可以先根据 Majority Vote 训练一个分类器然后用它生成的label辅助判断因为它用到了其他图片的信息。这对只有一个label的样本也很有用。当然这个分类器也是有噪音的后期可以根据chapter2提到的 CL (confidence learning) 进行修正。CROWDLAB把标注者们的标注前部分和分类器后部分的标注集合起来。其中可以看见有不同的权重这就是可以调整的地方你可以下调一个bad annotator的权重也可以上调分类器的权重。值得注意的是这其实是一个迭代的过程回到a步骤计算标注者的质量权重能依据标注者质量进行优化最后能converge到一个比较理想的状态。CROWDLAB来自NeurIPS 2022CROWDLAB: Supervised learning to infer consensus labels and quality scores for data with multiple annotators 具体推证及实施细节可以参考原论文。4. Data-Centric的模型评估方式这一章节主要解决这一问题Investigate shortcomings of the model and the dataset. 即怎么检查模型和数据的短板。主要分为evaluation和inspection.4.1. 模型评估 (a prerequisite for improving)首先我们不能依据一个metric就判断我们的模型好坏虽然大家都这么做哈就好像直接用所有样本的loss平均数。最好是能够细化到每一类的accuracy或者直接输出混淆矩阵。总之要认识到对模型评估方式非常重要。比如你的模型效果超好但只是在某一prevailing的子类上表现超好~因此我们要关注一下在评估 (evaluation) 时的陷阱主要针对validation dataset来说Failing to use truly held-out data (data leakage)Reporting only average loss can under-represent severe failure cases for rare examples/subpopulations (misspecified metric)Validation data not representative of deployment setting (selection bias)Some labels incorrect (annotation error)这些包含在前面章节提到的数据泄露选择偏差和标注错误等那么解决措施在前面也有提到。4.2. 关注并处理切片数据的欠拟合情况中心思想就是Model predictions should not depend on which slice a datapoint belongs to.data slice a subset of the dataset that shares a common characteristic如种族、性别、社会经济学、年龄或位置。切片也称为群组、子群体或数据的子组。通常我们不希望模型预测取决于数据点属于哪个切片。我们能不能从特征中删掉这些切片显然不能因为这些切片特征和其他变量也息息相关比如种族和pay这两者事实上有很大关联。学线性回归的时候老师强调说相关效应存在时不应该去除主效应有以下几种方法减弱这种效应Try a more flexible ML model that has higher fitting capacity. 比如用复杂度更高的模型Over-sample or up-weight the examples from a minority subgroup that is currently receiving poor predictions橙色和蓝色子组具有重叠的特征值。如果这两个子组的标签往往不同那么任何模型都必须在对一个子组和另一个子组产生更差的预测之间进行权衡。如果您为橙色数据点分配更高的权重那么生成的模型应该以对蓝色子组的潜在更差预测为代价为它们产生更好的预测。还有一些其他的不在这里列举。4.3. 发现部分表现欠佳的样本这里表现欠佳的不一定是某一个切片就是一些零散的数据样本点。首先找到它们Sort examples in the validation data by their loss value, and look at the examples with high loss for which your model is making the worst predictions (Error Analysis) 挑loss最高的样本出来看看Apply clustering to these examples with high loss to uncover clusters that share common themes amongst these examples依据loss把样本分类看看有无明显聚类特征它们产生的原因也很多。在前面讲我们应该注意的对数据集处理的情况也有重合。Given label is incorrect 错误标签Example does not belong to any of the K classes 样本根本不在目标分类里Outlier 异常值遇到这种一般用data augmentation或者把它调整到和其他样本相似的程度就是让它看上去不那么out更具体的在第五章有介绍。你用的模型就不适用。这时候转去model-centric ai吧。4.4. 量化单个样本对模型效果的影响Leave-one-out (LOO)impact98.5%-98.3%0.2%Data Shapely从包含这个点的任意子集中计算LOO然后平均。计算量太大可以用蒙特卡罗模拟。对于特殊的模型族我们可以有效地计算出准确的影响函数。在我们使用线性回归模型和均方误差损失训练模型的拟合参数是数据集的封闭形式函数。因此对于线性回归LOO也被叫做库克距离学过线性回归的同学都很熟悉。在分类中对embedding进行KNN聚类可以以 O(Nlog(N)) 的时间复杂度下完成LOO的计算。以上的这些方法所指向的数据都叫做influencial data sample他们并不一定是异常值只是对模型有较大影响的独立样本其实翻译过来是高杠杆点。学过线性回归的同学也知道这两者的定义和检验方式不同。5. 类别不均衡异常值和分布迁移5.1. 类别不均衡在以下阶段都需要额外关注。在划分训练测试集的时候If youre splitting a dataset into train/test splits, make sure to use stratified data splitting to ensure that the train distribution matches the test distribution (otherwise, you’re creating a distribution shift) problem.在评估模型的时候There is no one-size-fits-all solution for choosing an evaluation metric: the choice should depend on the problem. For example, an evaluation metric for credit card fraud detection might be a weighted average of the precision and recall scores (the F-beta score), with the weights determined by weighing the relative costs of failing to block a fraudulent transaction and incorrectly blocking a genuine transaction在实际训练的时候可以采用下面一些方式。样本权重实践中通常效果不佳。对于使用 mini batch 训练的分类器使用样本权重会导致不同 mini batch 之间学习率发生变化这会使学习变得不稳定。过采样简单地复制少数类中的数据点以使数据集更加平衡。通常比样本权重表现更好。该解决方案通常不稳定并且可能导致过度拟合。欠采样在多数类中删除数据点。这种方法在实践中的效果出奇地好。在某些情况下当数据集高度不平衡时它可能会导致丢弃大量数据从而导致性能不佳。SMOTE可以使用数据集扩充通过组合或扰乱少数样本来创建少数类的新样本而不是通过复制数据点进行过度采样。SMOTE 算法中特征空间的插值是有意义的但对某些其他数据类型没有意义将一张狗的图片与另一张狗的图片的像素值平均不太可能产生一只狗的照片。根据应用程序的不同其他数据增强方法可能效果更好。平衡的小批量训练 (Balanced Mini-Batch Training)对于使用 mini batch 训练的模型如神经网络让每个mini batch更高概率地抽取少数类的数据点。这些技术可以结合使用。例如SMOTE 作者指出SMOTE 和欠采样的组合比普通欠采样表现更好。5.2. 异常值异常值异常值是与其他数据点明显不同的数据点。原因包括测量错误例如损坏的空气质量传感器、错误的数据收集例如表格数据集中缺少字段、恶意输入例如对抗性示例和罕见事件统计异常值例如白化动物在图像分类数据集中。异常值检测又被细分为以下两类Outlier detection在无标签的数据集中监测异常点——清洗数据集预处理中Anomaly detection.在无标签的数据集基础上判断新数据样本是否和原训练集为相同分布——在查看inference dataset和training dataset是否一致的时候。检测异常值的方法很多孤立森林该技术与决策树相关。直观地说该方法创建一个“随机决策树”并根据隔离数据点所需的节点数量对数据点进行评分。该算法通过随机选择一个特征和一个分割值来递归地划分数据集的子集直到该子集只有一个实例。这个想法是离群数据点需要更少的分割才能变得孤立。KNN距离分布内的数据可能更接近其邻居。您可以使用到数据点的 k 个最近邻居的平均距离选择适当的距离度量例如余弦距离作为分数。对于图像等高维数据您可以使用经过训练的模型的嵌入并在嵌入空间中执行 KNN。基于重建的方法自动编码器是生成模型经过训练将高维数据压缩为低维表示然后重建原始数据。如果自动编码器学习数据分布那么它应该能够将分布内数据点编码然后解码回接近原始输入数据的数据点。然而对于分布外的数据重建会更差因此可以使用重建损失作为检测异常值的分数。许多离群值检测涉及计算每个数据点的分数然后根据阈值判断是不是异常值。这里可以用ROC或者AUC.5.3. 分布迁移在这里的分布迁移专指的是在train 和 test之间的差异。在这里又可以分为三类Covariate shift / data shift 协变量迁移/数据自身迁移p(y|x)没变p(x)变了。这个最好理解了就是训练集和测试集的自变量数据差别太大。概念迁移Concept shiftp(x)没变p(y|x)变了即输入分布未改变但输入和输出之间的关系变了。比如粉色还是粉色蓝色还是蓝色但是随着时间变化喜欢这些颜色的人群却不一样了好像中世纪男性更崇尚粉色因为是血液稀释的颜色女性更偏爱蓝色是圣母玛利亚的颜色我自己补充的例子哈哈。Prior probability shift / label shift 先验概率迁移/标签迁移p(x|y)没变p(y)变了这里需要注意有一条潜在的因果链y导致x。例如训练分类器预测给定症状的诊断y是疾病x是症状因为疾病的相对流行率p(y)会随着时间而变化。但是疾病对症状的显式体现的概率没有发生变化。5.4. 检测和解决分布迁移检测分布迁移监控模型的性能。监控准确度、精确度、统计量度或其他评估指标。如果这些随着时间的推移发生变化则可能是由于分布迁移。监控数据。可以通过比较训练数据和部署中看到的数据的统计属性来检测分布迁移中的协变量迁移。怎么解决呢在高层次上可以通过修复数据和重新训练模型来解决分布迁移问题。在某些情况下最好的解决方案是收集更好的训练集。如果训练时未标记的test data可用那么解决协变量迁移的一种方法是将单个样本权重分配给train data以权衡它们的特征分布使得加权分布类似于test data的特征分布。即使test data的标签未知标签的迁移也可以通过对具有相同类别标签的所有train data使用共享样本权重来类似地解决以使train data中的加权特征分布类似于test data中的特征分布。但是这无法解决概念迁移因为无法从未标记的test data中对其进行量化。参考文献DCAI:Data-Centric AI 以数据为中心的AI ——来自MIT的公开网课上 - 知乎