当前位置: 首页 > 科技观察

如何正确地做错误分析,NLP研究者需要学习

时间:2023-03-15 09:07:12 科技观察

作者注:尝试分析机器学习模型失败的时间、方式和原因。我们称之为“错误分析(erroranalysis)”。对于科研人员来说,需要通过误差分析来选择后续的改进方向;模型的实际用户还需要根据错误分析来确定模型部署的许多细节。由于错误分析对后续的行动方向有重大影响,如果错误分析出现偏差,或者错误分析不完整,很可能会带来我们不想看到的后果。NLP任务的错误分析现状但是目前人们是如何进行错误分析的呢?如果你翻看自然语言处理顶级学术会议ACL的录用论文,基本上会看到这样的叙述:错误分析……我们随机抽取了50个答错的问题,分为6类……我们找到了100个不正确的预测,并试图找到常见的错误类别…………显然,该领域的研究人员都采用了这种方法:“我们随机选择了50到100个回答错误的问题,并将它们粗略地分为N组”。(斯坦福大学NLP组组长ChristopherManning画外音:问答任务论文中选取100个样本进行错误分析的做法恐怕就出自这里——我们原本想做200个,但我从来没有做过一半)选择一些错误的样本进行分析似乎是有道理的,对吧?但实际上,这种做法有很大的问题。例如,50到100的样本量太小,一般只占总误差的5%。如此小的样本量很难代表真实的误差分布。如果用于错误分析的抽样样本没有反映出某个关键模型的问题(例如,聊天助手机器人会对某些句子给出不恰当的回答),那么实际部署未修复的模型是的,结果是肯定的很可怕。这还不是全部,样本量小只是常见做法的第一个问题。在ACL2019论文《Errudite: Scalable, Reproducible, and Testable Error Analysis》中,作者详细列举了NLP错误分析中的诸多关键挑战,同时也提出了三个原则,希望大家能够让错误分析更加准确,并且具有更好的可重复性、可扩展性和可测试性。作者还设计了Errudite,这是一种实践这些原则的交互式工具,它还逐一解决了发现的问题。论文作者还写了一篇介绍博客,基于一个具体的误差分析过程来解释为什么目前基于小批量样本的人工和主观误差分析容易出现模棱两可、有偏见的分析,并且可能会出错的原因,以及如何用Errudite避免这些错误。他们的论文中还有更多示例。雷锋网AI科技评论整理了介绍博客全文。我们将从一个实际例子出发,对著名的机器理解基准模型BiDAF(https://allenai.github.io/bi-att-flow/)进行错误分析。在这个任务中,首先给定一个问题和一段文本,机器阅读理解模型需要找到能够正确回答问题的文本片段。在这个来自SQuAD数据集的示例中,MurrayGold以粗体显示了《Doctor Who(神秘博士)》2005年特别节目的作者。作为语言理解最重要的测试任务之一,机器阅读理解中的错误分析至关重要但困难重重:研究者希望找到先进模型的弱点并加以改进,但由于模型的输入(问题,文本段落)和输出(答案)都是非结构化文本,可以用来分析和解释数据集的特征很少。BiDAF是研究机器阅读理解任务的学者非常熟悉的模型。下面的误差分析实例均来自研究人员对BiDAF的真实分析。在这个例子中,BiDAF做出了错误的预测并给出了答案JohnDebney(带下划线)而不是MurrayGold。我们希望能够从这个错误中做出一些概括,以更全面地理解模型的行为。在分析这个错误的时候,我们首先会问的问题是:为什么模型会出现这个错误?一位专家给出了一个噪声词的猜想:BiDAF擅长将问题匹配到各种命名实体类别,但如果同时屏蔽掉其他同类型的实体,BiDAF就很容易受到干扰。以上面的例子为例,当我们问“谁”这个问题时,BiDAF知道我们需要一个名字,也确实回答了一个名字,但并不是正确的名字。考虑到这个假设,我们需要问的下一个问题是,“这个模型经常犯这个错误吗?”探索猜想的普遍性需要研究更多相似的样本。但是,正如我们上面提到的,如果要探索整个数据集,这些非结构化文本中可用的特征太少了,因此研究人员通常的做法是手动标记一些错误样本,并把它们分成不同的组。这种方法的问题是不同分组的定义是主观的,不同的人会想出不同的分组方式。例如,在另一个例子中,“什么时候”的问题的标准答案是“大学期间”,而模型给出的答案是“1996”,这是一个错误的年份。可能有人会认为这是一道符合噪声词猜想的题。毕竟,问题是关于时间的,这与模型给出的答案类型(也是时间)相匹配。但有些人会认为它应该属于另一个错误类别。毕竟,“大学期间”的标准答案并不是一个可以识别的命名实体。如果您只是阅读这个错误示例的名称和文本描述,您很可能不会意识到这种差异。事实上,作者发现即使使用简单的规则来定义不同的错误组,也可以出现人与人之间的这种可变性/不一致性:作者在先前发表的错误分析中发现了一种错误及其描述,然后让当前的专家重复这个实验,结果是他们分配给这个组的错误数量相差很大,最小相差13.8%,最大相差45.2%;人工标注的模糊性。针对这种情况,论文作者提出了第一个原则:假猜想必须准确定义,描述清楚。原则1:准确为了避免人为主观性,提高准确率,Errudite使用特定任务语言(Domain-SpecificLanguage)对不同实例进行定量描述。简单来说,这种特定于任务的语言使用一系列强大的属性提取器,借助额外的辅助运算符(三个部分:属性提取器、目标和运算符)来解决特定的错误。比如你可以解析一道题的长度,要求长度大于20。这样,研究者就可以客观系统地将大量的错误示例按照特定的模式进行分组,得到精确的出现频率某些错误。比如下图就是对这种语言的“干扰词猜想”的准确描述,而“whilehewasincollege”这个例子就可以排除在这一类之外。原则2:覆盖所有数据对BiDAF中的所有错误执行此过滤器后,共找到192个符合“噪声词猜想”的例子,即标准答案和错误答案的命名实体类型为相同,然后模型给出了错误的实体。值得注意的是,在达到这个精度的基础上,使用特定任务语言还可以极大地扩展错误分析的规模:与通常总共分析50到100个错误样本的做法相比,现在单个错误category的样本量达到了192。这也减少了抽样误差。从总数上看,这192个错误样本占所有错误的6%,这个噪声词猜想似乎得到了证实。有了具体数据之后,错误分析的说服力也变强了很多吧?然而,当我们在所有步骤中实施过滤器并构建详尽的分组时,我们实际上发现了一幅全新的图景:对于所有样本,BiDAF可以在68%的样本中给出正确的实体;对于标准答案是一个实体的样本,模型的准确率会提高到80%;当文本中有其他同类型的实体时,BiDAF的准确率仍然是79%;当它预测正确类型的实体时,其准确率高达88%,远高于所有样本的正确率。这意味着对于实体类型匹配且存在噪声词的情况,模型的性能仍然优于整体性能。这种情况并不是模型性能的缺点。所以,如果你只是发现有某种错误并决定先修复它,你可能需要重新考虑,因为你很可能会忽略模型表现很差的情况。因此,这种特定于领域的语言可以帮助分析整个数据集,包括检查样本是否没有错误。这种错误分析更系统,可以支持更大的规模;与只看小样本相比,你得到的结论可能完全不同。那么,第二个原则可以形式化地表达为:错误频率的分析应该在整个数据集上进行,需要包括正例(truepositive)。原则3:检验错误猜想,验证因果关系现在我们已经建立了基于噪声词的分组。然而,错误发生时噪声词的存在并不一定意味着噪声词是错误的根本原因。回到前面的例子,我们可以简单的认为错误的根本原因是因为有噪声词,但也有可能是因为我们需要做多重推理,需要将“神秘博士”与“系列”关联起来,或者还有其他原因。这导致了我们当前状况的另一个问题:很难有效地隔离bug的根本原因。为了找出答案,我们需要第三个原理Principle34Errudite,论文作者想回答这个问题:这192个错误是否都是由于噪声词的存在?验证方式是提出并检验一个相关的假设问题:“没有这个噪声词,模型能否给出正确答案?”作者使用重写规则并使用反事实分析来寻找答案。根据这种领域特定的语言,Errudite可以根据一定的规则重写组中的所有实例。比如这里为了验证噪声词是否是rootcause,根据重写规则将文本中的噪声词替换为无意义的占位符“#”,这样就不会再被检测为实体。改写完成后让模型重新预测。在之前的神秘博士示例中,即使将错误答案JohnDebney替换为“#”,模型仍然给出了另一个错误答案RonGrainer。似乎另一个干扰词仍然混淆了模型。对于组中的其他样本,模型有29%的时间给出了另一个相同类型的错误实体(另一个噪声词);在48%的情况下,模型给出了正确的预测,而在这部分样本中,确实是噪声词导致了错误的预测;在剩下的23%中,模型给出了与之前相同的预测——只是现在那些字符已经被“#”代替了,因此模型的预测结果将包含这个“#”字符,没有任何实际意义!可以猜测,这可能是因为问题和预测的答案高度重叠,所以模型实际上是在做更接近直接的字符匹配,而不是寻找实体。从这种反事实分析中得出的结论不能仅通过分组得出。Accurate+Reproducible+Repeatableapplication在上面的错误分析过程中,我们需要使用准确的查询语句来构造属性、分组、执行重写规则。在分析BiDAF之后,我们发现它在噪声词存在的情况下表现并不算太差,而且一些我们认为是由噪声词引起的问题实际上还有其他根本原因。此外,准确的查询语句还有一个很大的优势,那就是可以方便地与他人共享,重现实验结果,并用于其他模型甚至其他任务。最后,论文作者还表示,这款Errudite工具具有清晰、易用、多功能的图形用户界面,并具有语句演示、属性分布图等实用功能。要点总结常见(但有偏见)的错误分析来自主观错误分组+样本量小+仅关注错误案例+不对根本原因进行测试negativeexamples+通过反事实分析测试验证NLP领域之外的错误分析的含义当前的Errudite实现(尤其是其中的领域特定语言部分)仅适用于NLP任务。然而,机器学习系统通常还需要处理非文本数据。论文作者认为,即使他们目前的实施很难扩展到其他领域,但他们的三个原则可以而且必须应用于其他领域,帮助大家部署正确的模型,朝着正确的研究方向前进。基于这三个原则创建一个新的工具并不难,只要它能够支持相应的三点:使用领域特定语言,通过可编辑和可修改的基础组件完成准确的样本分组;扩大错误分析规模,通过自动过滤语句分析包括正例和负例在内的所有样本,并提供可视化统计;能够通过规则改写样本,通过反事实分析来验证错误的猜想。作者表示,Errudite的软件架构可以支持扩展到其他NLP任务,欢迎更多NLP领域的研究人员和开发者加入Errudite的开发和扩展。此外,如果类似的工具出现在其他领域,那就太好了。