误差分析 如何正确地做误差分析

导读 误差剖析 如何准确地做误差剖析雷锋网 AI 科技评论按:尝试剖析机器学习模型在什么时候、以什么方法、由于什么原因失效,我们把这称为「

误差剖析 如何准确地做误差剖析

雷锋网 AI 科技评论按:尝试剖析机器学习模型在什么时候、以什么方法、由于什么原因失效,我们把这称为「误差剖析 error analysis」。对科研人员来说,他们须要通过误差剖析选择后续的改良方向;模型的实际应用者们也须要依据误差剖析来肯定模型安排的许多细节。由于误差剖析对后续的行为方向有明显的影响,如果误差剖析中涌现了偏倚,或者误差剖析不完全,很可能会带来我们不想看到的效果。

但是人们目前都是怎么做误差剖析的呢?如果你翻翻自然语言处置顶级学术会议 ACL 的吸收论文,你根本上会看到这样的叙述:

我们针对 100 个样本问题进行了误差剖析……

我们随机选择了 50 个答复不准确的问题并把它们分为了 6 类……

我们找出了 100 个不准确的预测成果并尝试寻找共同的误差类别……

……

显然,这个范畴内的研讨人员们都不约而同地采取了这种做法:「我们随机选择了 50 到 100 个答复不准确的问题并把它们大致分为了 N 组」。 斯坦福大学 NLP 组负责人 Christopher Manning 的画外音:问答义务的论文里选 100 个样本做毛病剖析的通例恐怕出自我这里 —— 最初我们想做 200 个的,但我一直没有做分给我的那一半

选择一部分毛病样本做剖析,看起来好像还有那么点道理对不对?但其实这种做法有很大问题。比如,50 到 100 的样本数目太小了,一般来说只占到误差总量的 5%。这么小的采样数目很难代表真正的误差散布。如果拿来做误差剖析的采样样本里刚好没有体现出某个症结的模型问题 比如聊天助理机器人会对某些特定的语句给出不当的答复,然后就这么把没有得到修复的模型实际安排了,成果确定会非常恐怖。

这还没完,样本数目小才仅仅是常见做法中涌现的第一个问题而已。在 ACL 2019 论文《Errudite: Scalable, Reproducible, and Testable Error Analysis》中,作者们详细列举了 NLP 误差剖析中的许多个症结挑衅,也提出了三个原则,愿望大家能够把误差剖析做得更精确,也具备更好的可深圳生涯网反复、可拓展、可测试性。作者们还设计了 Errudite,这是一个实践了这些原则的交互式工具,它也可以逐个应对发明的问题。

论文作者们也撰写了一篇介绍博客,依据通过一个具体的毛病剖析流程来解释当前基于一小批样本的手工、主观误差剖析为什么容易得出模棱两可的、有偏倚的剖析,并且可能弄毛病差原因,以及如何借助 Errudite 避免这些毛病。他们的论文中还有更多的例子。雷锋网 AI 科技评论对介绍博客做全文编译。

我们要对机器浏览懂得 Machine Comprehension的一个著名基准模型 BiDAF https://allenai.github.io/bi-att-flow/做毛病剖析。在这项义务中,首先给定一个问题和一段文本,机器浏览懂得模型须要找到能准确答复问题的文本片断。

在这个出自 SQuAD 数据集的例子中,加粗字体的 Murray Gold 创作了《Doctor Who 神秘博士》的 2005 特殊篇。

作为语言懂得的最主要测试义务之一,机器浏览懂得中的误差剖析非常症结但也有不少艰苦:研讨人员们都愿望能够找到先进模型中的弱点并进行改良,但是由于模型的输入 问题、文本段落和输出 答案都是非构造化的文本,能够用来剖析解读数据集的特点就很少。BiDAF 是研讨机器浏览懂得义务的学者们非常熟习的一个模型了,下文中拿来举例的误差剖析就都是出自研讨人员们针对 BiDAF 的真实剖析。

在刚才这个例子中,BiDAF 做了毛病的预测,给出的答案是 John Debney 下划线而不是 Murray Gold。我们愿望能够从这个毛病做一些推广,更全面地懂得模型的表示。

在剖析这个毛病时,我们首先会问的问题就是:模型为什么会涌现这种毛病?一位专家给出了一个干扰词料想:BiDAF 善于把问题匹配到各种命名实体类别上,但是如果同时涌现了同类型的其它实体的话,BiDAF 就很容易被干扰。以上面那个例子来说,我们问的问题是「谁」,BiDAF 就知道我们须要一个人名,也确切答复了一个人名,只不过不是准确的那个人名。

带着这个假说,我们下一个须要问的问题是,「这个模型经常会犯这种毛病吗?」探究料想的普适性须要研讨更多相似的样本。然而,如我们上文说到的,如果想要摸索全部数据集的话,这些非构造化文本中可供应用的特点太少了,所以研讨人员们通常的做法是手工标注一些毛病样本,并把它们分为不同的组。

这种做法的问题在于,不同分组的定义是主观的,不同的人会提出不同的分组方法。比如深圳生涯网在另一个例子中,一个问「when」的问题的尺度答案是「在他读大学期间」,而模型给出的答复是「1996」,是一个毛病的年份。有人会以为这是一个符合干扰词料想的问题,究竟问题问的是时光,和模型给出的答复类型 同样也是时光是匹配的。但是也有人会以为它应当属于别的毛病类别,究竟尺度答案「在他读大学期间」不是一个可以被辨认的命名实体。如果你只是翻看这个毛病例子的名称和文本描写的话,很有可能你都意识不到会有这种差别。

实际上,论文作者们发明即便只是用简略的法则定义不同的毛病分组,这种差别性/人与人之间的不一致性也会涌现:作者们找来此前曾发表过的一份毛病剖析中的一个毛病类型及其描写,然后让现在的专家们反复这个试验,成果他们分到这一组的毛病数目大为不同,差别最小也有 13.8%,最大甚至有 45.2%;这更显著地体现出了人工标注的隐约性。

针对这种状态,论文作者们提出了第一条原则:必需用明白的描写准确定义毛病料想。

为了规避人为主观性、进步精确性,Errudite 应用了一种义务专用语言 Domain-Specific Language来量化描写不同的实例。

简略来说,这种义务专用语言应用了一系列强有力的属性提取器,在额外的帮助操作符的赞助下解析具体的毛病 属性提取器、目的、操作符三部分。比如可以解析一个问题的长度,并请求长度大于 20。这样,研讨人员们就可以依据特定的模式,客观、体系地对大批毛病例子分组,得出某种毛病的精确的涌现频率。比如下图就是用这种语言对「干扰词料想」的精确描写,也就可以把「在他读大学期间」这个例子消除在这个分类之外。

在 BiDAF 的所有毛病中履行了这个过滤器之后,一共找到了 192 个例子是符合「干扰词料想」的,也就是说尺度答案和毛病答案的命名实体类型雷同,然后模型给出了毛病的实体。值得注意的是,在到达了这种精确性的基本上,义务专用语言的应用也可以极大地拓展误差剖析的范围:相比于常见做法里一共剖析 50 到 100 个毛病样本,现在单个毛病类别的样本量都到达了 192。这也就减小了采样误差。

总数目方面,这 192 个毛病样本占到了所有毛病总数的 6%,这个干扰词料想看来是可以被证实的。有具体数据以后,毛病剖析的说服力也变强了很多对吧。

不过,当我们履行了所有步骤中的过滤器、构建出了详尽的分组以后,我们其实会发明全新的图景:对于全体样本,BiDAF 能给在 68% 的样本中给出准确的实体;对于尺度答案就是一个实体的样本,模型的精确率会进步到 80%;当文本中有同一个类型的其它实体的时候,BiDAF 的精确率仍然有 79%;让它预测一个类型准确的实体的时候,它的精确率高达 88%,要比全体样本的准确率高得多。这意味着,对于实体类型匹配、且有干扰词涌现的情形,模型的表示还是比整体表示要好,这种情形并不是模型表示的短板。所以,如果你只是发明了有某种毛病涌现,然后就决议要先解决这种毛病的话,你可能须要重新斟酌一下,因为你很可能疏忽了模型表示非常糟糕的情境。

所以,这个范畴专用语言可以赞助剖析全部数据集,包含检验没有出错的样本。这样的误差剖析更体系、可以支撑更大的范围;相比于只看一小部分样本,你得到的结论也可能完整不同。

那么,第二条原则可以正式地表述为:毛病涌现频率的剖析应当在全部数据集上进行,其中须要包含正例 true positive。

现在我们已经树立起关于干扰词的分组了。但是,涌现毛病的时候同时有一个干扰词并不必定代表干扰词是这个毛病涌现的基本原因。回到前面的例子,我们可以简略地以为出错的基本原因是因为有干扰词,但也可能是因为我们须要做多句推理,须要把「神秘博士」和「系列」接洽起来,又或者还有别的原因。

这就引出了我们当前面对的现状中的另一个问题:我们很难有效地分别某个毛病的基本原因。想要弄清的话,我们须要第三个原则

原则 3:毛病料想要经过显式的测实验证

借助 Errudite,论文作者们想要答复这个问题:这 192 个毛病都是因为有干扰词才出错的吗?验证办法是提出并验证一个相干的设想问题:「如果没有这个干扰词,模型能不能给出准确的答案?」作者们应用重写规矩,用反事实剖析 counterfactual analysis寻找答案。

依据这个范畴专用语言,Errudite 可以按必定的规矩重写分组内的所有实例。比如在这里,为了验证干扰词是否是基本原因,依据重写规矩把文本中的干扰词都调换成无意义的占位符「#」,这样就不会再被检测为实体。

在重写完成以后让模型重新进行预测。在前面那个神秘博士的例子里,即便已经用「#」调换了毛病答案 John Debney,模型仍然给出了另一个毛病答案 Ron Grainer。看来另一个干扰词仍然困惑了模型。

对于分组中的其它样本,有 29% 的情形模型会给出另一个不准确的同类型实体 另一个干扰词;在 48% 的情形中,模型给出了准确的预测,这部分样本里确切是干扰词带来了毛病预测;在剩下的 23% 中,模型给出了和之前雷同的预测 —— 只不过由于现在那些字符已经被「#」调换,所以模型的预测成果就会包括这个没有任何实际含义的「#」字符!可以猜测这可能是因为问题和预测答案高度重合,所以模型实际做的更接近于直白的字符匹配而不是寻找实体。从这种反事实剖析中得到的结论就不是仅仅做一下分组就能得到的了。

在上面这个误差剖析进程中,我们须要用精确的查询语句构建属性、分组,以及履行重写规矩。对 BiDAF 进行剖析过后,我们发明有干扰词的时候它的表示并不怎么差,而且一些以前我们认为是干扰词引起的问题其实有其它的基本原因。

此外,精确的查询语句有一个非常大的利益,就是可以轻松地分享给他人、重现试验成果,以及其它的模型乃至其它的义务中运用。

最后,论文作者们还表现这个 Errudite 工具有一个明了、易用、多功效的图形化用户界面,而且带有语句示范、属性散布图等适用功效。

常见 但有偏倚的误差剖析来自于

主观的毛病分组 + 小样本 + 只关注毛病情形 + 没有针对基本原因的测试

Errudite 改良的误差剖析

精确、可反复的分组 + 剖析全部数据集 + 包括了正例和负例 + 通过反事实剖析测实验证

目前的 Errudite 实现 尤其是其中的范畴专用语言部分只是针对 NLP 义务的。然而,机器学习体系也经常须要处置非文本数据。论文作者们信任,即便目前他们的实现难以拓展到其它的范畴,但他们的三条原则,完整可以、也完整有必要在其他的范畴中得到运用,赞助大家安排准确的模型、向准确的研讨方向深刻发掘。

想要创立一个新的基于这三条原则的工具并不难,只须要它可以支撑对应的这三个要点:

应用范畴专用语言,通过可编纂修正的基本部件,完成精确的样本分组;

拓展误差剖析范围,通过主动的过滤语句剖析包含正例和负例在内的所有样本,并供给可视化的统计数据;

能够通过规矩重写样本,以便通过反事实剖析验证毛病料想。

作者们表现,Errudite 的软件架构可以支撑拓展到其它的 NLP 义务中,他们欢迎更多 NLP 范畴内的研讨和开发人员参加 Errudite 的开发和拓展中来。而且,如果其它范畴也能涌现相似的工具那就更棒了。