B.9 统计显著性检验
构建系统时,我们经常需要比较两个系统的性能。怎样知道刚构建的新系统是否优于旧系统,或优于文献描述的其他系统?这属于统计假设检验的范畴。本节主要借鉴 Dror et al.(2020)和 Berg-Kirkpatrick et al.(2012)的工作,介绍 NLP 分类器的统计显著性检验。
假设我们要在 、准确率等指标 上比较分类器 A 和 B。也许我们想知道,在特定测试集 上,逻辑回归情感分类器 A(第 4 章)的 是否高于朴素贝叶斯情感分类器 B。令 表示系统 A 在测试集 上的得分, 表示 A 与 B 在 上的性能差:
我们想知道 是否成立,也就是逻辑回归分类器在 上的 是否高于朴素贝叶斯分类器。 称为效应量(effect size); 很大表示 A 看起来远优于 B, 很小则表示 A 似乎只好一点点。
为什么不直接检查 是否为正?假设我们这样做,发现 A 的 比 B 高 .04。能否确定 A 更好?不能,因为 A 可能只是碰巧在这个特定的 上优于 B。我们还需要知道:如果换另一个测试集 或换一组其他条件,A 优于 B 的现象是否仍有可能再次出现。
在统计假设检验范式中,我们把两个假设形式化:
称为零假设,它假定 实际为负或为零,即 A 并不优于 B。我们想知道能否有把握地排除该假设,转而支持“A 更好”的 。
为此,建立一个随机变量 ,它遍历所有测试集。然后问:如果零假设 正确,在大量重复实验所遇到的测试集中,出现我们观察到的 或更大值的可能性有多大?这个可能性形式化为 p 值:假定零假设 为真,观察到当前 或更大值的概率:
因此,在本例中,p 值就是在 A 并不优于 B 的假设下,观察到 的概率。如果 很大(例如 A 的 是相当不错的 .9,而 B 在 上只有糟糕的 .2),我们可能会感到惊讶,因为 若为真,这种情况极不可能发生,所以 p 值会很低。反之,如果 很小,即使 为真、A 实际上并不更好,这一结果也不那么令人意外,所以 p 值会更高。
p 值非常小,意味着零假设下几乎不可能观察到这样的差异,我们可以拒绝零假设。多小才算非常小?常用阈值是 .05 或 .01。阈值 .01 表示:如果 p 值(假定 为真时观察到当前差异的概率)小于 .01,就拒绝零假设,认为 A 的确优于 B。如果我们观察到的 的概率低于阈值,因而拒绝零假设,就说“A 优于 B”这样的结果具有统计显著性。
怎样计算 p 值所需的概率?NLP 通常不使用可能很熟悉的 t 检验、ANOVA 等简单参数检验。参数检验会对检验统计量的分布作出某些假设(例如正态性),而这些假设在我们的情形中通常不成立。因此,NLP 通常使用基于抽样的非参数检验:人为构造许多个实验设置版本。
例如,如果有许多不同测试集 ,可以直接测量所有 上的 ,从而得到一个分布。然后设定阈值(如 .01):如果这个分布中有至少 99% 的差异小于我们观察到的差异,也就是 ——看到至少当前这么大的 的概率——小于 .01,就可以拒绝零假设,认为 是足够出人意料的差异,A 的确是比 B 更好的算法。
NLP 中常用两种非参数检验:近似随机化检验(approximate randomization;Noreen, 1989)和自助法检验(bootstrap test)。下节介绍自助法的配对版本,这也是 NLP 中最常用的版本。配对检验所比较的两组观测是对齐的:一组中的每个观测都可与另一组中的一个观测配对。比较两个系统在同一测试集上的表现时,这种配对自然存在;可把系统 A 在单个观测 上的表现与系统 B 在同一个 上的表现配对。
B.9.1 配对自助法检验¶
自助法检验(Efron and Tibshirani, 1993)适用于任何指标,从精确率、召回率、 到机器翻译使用的 BLEU 都可以。自助抽样(bootstrapping)是从原始集合中反复进行大量有放回抽样,所得样本称为自助样本。自助法检验的直觉是:通过反复从一个观测到的测试集中抽样,可以构造许多虚拟测试集。这种方法只假设样本能够代表总体。
考虑一个微型文本分类例子,测试集 只有 10 篇文档。图 B.8 第一行给出两个分类器 A 和 B 在该测试集上的结果。每篇文档属于四种情况之一:A、B 都正确;都错误;A 对 B 错;A 错 B 对。带删除线的字母表示该分类器回答错误。第一篇文档上 A 和 B 都得到正确类别(AB),第二篇上 A 正确而 B 错误。为简单起见,假设指标为准确率,则 A 的准确率为 .70、B 为 .50,所以 。
现在构造大量(或许 个)虚拟测试集 ,每个大小为 。图 B.8 给出几个例子。构造每个虚拟测试集 时,反复( 次)从 这一行中有放回地选择单元格。例如,为创建第一个虚拟测试集 的第一个单元格,如果随机选中了 行的第二个单元格,就把该值复制到新单元格中;然后继续创建 的第二个单元格,每次都从原始 中随机、有放回地抽样。
| 测试集 | 10 个文档上的 A/B 正误结果 | A 准确率 | B 准确率 | δ |
|---|---|---|---|---|
| x | 原始观测序列 | .70 | .50 | .20 |
| x(1) | 从 x 有放回抽取的 10 个单元格 | .60 | .60 | .00 |
| x(2) | 另一组有放回抽样结果 | .60 | .70 | −.10 |
| … x(b) | 其余自助样本 | … | … | … |
图 B.8 配对自助法检验:从初始真实测试集 构造 个伪测试集 的示例。每个伪测试集通过 次有放回抽样建立;一个样本就是一个单元格,即带金标准标签以及分类器 A、B 正误结果的一篇文档。真实测试集当然不会只有 10 个例子, 也必须足够大。
得到提供抽样分布的 个测试集后,就可统计 A 多频繁地获得偶然优势。计算这种优势有多种方法;这里采用 Berg-Kirkpatrick et al.(2012)的版本。假设 (A 不优于 B)成立,则在许多测试集上估计的 期望应当为零或负;远高于零会令人惊讶,因为 明确假定 A 不更好。为精确衡量观察到的 有多出人意料,在其他情形下,可统计许多测试集中 比期望值零高出 或更多的频率,以计算 p 值:
其中 表示:若 为真则取 1,否则取 0。然而,虽然在 A 不优于 B 的假设下,许多测试集上 的期望通常为 0,但我们构造的自助测试集并非如此。因为这些样本并不是从均值为 0 的分布中抽取的;它们恰好来自原始测试集 ,而 恰好对 A 有 .20 的偏向。因此,为衡量观察到的 有多出人意料,实际上要统计许多测试集中 比 的期望值再高出 或更多的频率:
例如,若有 10,000 个测试集 ,阈值为 .01,而仅在 47 个测试集中发现 A 偶然好到满足 ,所得 p 值 .0047 小于 .01。这表明观察到的差异 确实足够出人意料,不大可能是偶然产生的;我们可以拒绝零假设,并得出 A 优于 B 的结论。
函数 BOOTSTRAP(测试集 x, 样本数 b) 返回 p-value(x)
计算 δ(x) # 算法 A 在 x 上比 B 好多少
s ← 0
对 i = 1 到 b:
对 j = 1 到 n: # 抽取大小为 n 的自助样本 x^(i)
从 x 中随机选择一个成员并加入 x^(i)
计算 δ(x^(i)) # A 在 x^(i) 上比 B 好多少
若 δ(x^(i)) ≥ 2δ(x),则 s ← s+1
p-value(x) ≈ s/b # b 个样本中,A 超出期望的比例
返回 p-value(x) # 若比例很小,观察到的 δ 很可能并非偶然图 B.9 Berg-Kirkpatrick et al.(2012)所述配对自助法算法的一个版本。
完整算法如图 B.9 所示。输入测试集 和样本数 ,它统计 个自助测试集中满足 的百分比。该百分比就作为单侧经验 p 值。