Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

B.9 统计显著性检验

构建系统时,我们经常需要比较两个系统的性能。怎样知道刚构建的新系统是否优于旧系统,或优于文献描述的其他系统?这属于统计假设检验的范畴。本节主要借鉴 Dror et al.(2020)和 Berg-Kirkpatrick et al.(2012)的工作,介绍 NLP 分类器的统计显著性检验。

假设我们要在 F1F_1、准确率等指标 MM 上比较分类器 A 和 B。也许我们想知道,在特定测试集 xx 上,逻辑回归情感分类器 A(第 4 章)的 F1F_1 是否高于朴素贝叶斯情感分类器 B。令 M(A,x)M(A,x) 表示系统 A 在测试集 xx 上的得分,δ(x)\delta(x) 表示 A 与 B 在 xx 上的性能差:

δ(x)=M(A,x)M(B,x)(B.19)\delta(x)=M(A,x)-M(B,x)\tag{B.19}

我们想知道 δ(x)>0\delta(x)>0 是否成立,也就是逻辑回归分类器在 xx 上的 F1F_1 是否高于朴素贝叶斯分类器。δ(x)\delta(x) 称为效应量(effect size);δ\delta 很大表示 A 看起来远优于 B,δ\delta 很小则表示 A 似乎只好一点点。

为什么不直接检查 δ(x)\delta(x) 是否为正?假设我们这样做,发现 A 的 F1F_1 比 B 高 .04。能否确定 A 更好?不能,因为 A 可能只是碰巧在这个特定的 xx 上优于 B。我们还需要知道:如果换另一个测试集 xx' 或换一组其他条件,A 优于 B 的现象是否仍有可能再次出现。

在统计假设检验范式中,我们把两个假设形式化:

H0:δ(x)0H1:δ(x)>0(B.20)\begin{array}{r} H_0:\delta(x)\leq0\\ H_1:\delta(x)>0 \end{array}\tag{B.20}

H0H_0 称为零假设,它假定 δ(x)\delta(x) 实际为负或为零,即 A 并不优于 B。我们想知道能否有把握地排除该假设,转而支持“A 更好”的 H1H_1

为此,建立一个随机变量 XX,它遍历所有测试集。然后问:如果零假设 H0H_0 正确,在大量重复实验所遇到的测试集中,出现我们观察到的 δ(x)\delta(x) 或更大值的可能性有多大?这个可能性形式化为 p 值:假定零假设 H0H_0 为真,观察到当前 δ(x)\delta(x) 或更大值的概率:

P(δ(X)δ(x)H0 为真)(B.21)P(\delta(X)\geq\delta(x)\mid H_0\text{ 为真})\tag{B.21}

因此,在本例中,p 值就是在 A 并不优于 B 的假设下,观察到 δ(x)\delta(x) 的概率。如果 δ(x)\delta(x) 很大(例如 A 的 F1F_1 是相当不错的 .9,而 B 在 xx 上只有糟糕的 .2),我们可能会感到惊讶,因为 H0H_0 若为真,这种情况极不可能发生,所以 p 值会很低。反之,如果 δ(x)\delta(x) 很小,即使 H0H_0 为真、A 实际上并不更好,这一结果也不那么令人意外,所以 p 值会更高。

p 值非常小,意味着零假设下几乎不可能观察到这样的差异,我们可以拒绝零假设。多小才算非常小?常用阈值是 .05 或 .01。阈值 .01 表示:如果 p 值(假定 H0H_0 为真时观察到当前差异的概率)小于 .01,就拒绝零假设,认为 A 的确优于 B。如果我们观察到的 δ\delta 的概率低于阈值,因而拒绝零假设,就说“A 优于 B”这样的结果具有统计显著性

怎样计算 p 值所需的概率?NLP 通常不使用可能很熟悉的 t 检验、ANOVA 等简单参数检验。参数检验会对检验统计量的分布作出某些假设(例如正态性),而这些假设在我们的情形中通常不成立。因此,NLP 通常使用基于抽样的非参数检验:人为构造许多个实验设置版本。

例如,如果有许多不同测试集 xx',可以直接测量所有 xx' 上的 δ(x)\delta(x'),从而得到一个分布。然后设定阈值(如 .01):如果这个分布中有至少 99% 的差异小于我们观察到的差异,也就是 p-value(x)\operatorname{p-value}(x)——看到至少当前这么大的 δ(x)\delta(x) 的概率——小于 .01,就可以拒绝零假设,认为 δ(x)\delta(x) 是足够出人意料的差异,A 的确是比 B 更好的算法。

NLP 中常用两种非参数检验:近似随机化检验(approximate randomization;Noreen, 1989)和自助法检验(bootstrap test)。下节介绍自助法的配对版本,这也是 NLP 中最常用的版本。配对检验所比较的两组观测是对齐的:一组中的每个观测都可与另一组中的一个观测配对。比较两个系统在同一测试集上的表现时,这种配对自然存在;可把系统 A 在单个观测 xix_i 上的表现与系统 B 在同一个 xix_i 上的表现配对。

B.9.1 配对自助法检验

自助法检验(Efron and Tibshirani, 1993)适用于任何指标,从精确率、召回率、F1F_1 到机器翻译使用的 BLEU 都可以。自助抽样(bootstrapping)是从原始集合中反复进行大量有放回抽样,所得样本称为自助样本。自助法检验的直觉是:通过反复从一个观测到的测试集中抽样,可以构造许多虚拟测试集。这种方法只假设样本能够代表总体。

考虑一个微型文本分类例子,测试集 xx 只有 10 篇文档。图 B.8 第一行给出两个分类器 A 和 B 在该测试集上的结果。每篇文档属于四种情况之一:A、B 都正确;都错误;A 对 B 错;A 错 B 对。带删除线的字母表示该分类器回答错误。第一篇文档上 A 和 B 都得到正确类别(AB),第二篇上 A 正确而 B 错误。为简单起见,假设指标为准确率,则 A 的准确率为 .70、B 为 .50,所以 δ(x)=.20\delta(x)=.20

现在构造大量(或许 b=105b=10^5 个)虚拟测试集 x(i)x^{(i)},每个大小为 n=10n=10。图 B.8 给出几个例子。构造每个虚拟测试集 x(i)x^{(i)} 时,反复(n=10n=10 次)从 xx 这一行中有放回地选择单元格。例如,为创建第一个虚拟测试集 x(1)x^{(1)} 的第一个单元格,如果随机选中了 xx 行的第二个单元格,就把该值复制到新单元格中;然后继续创建 x(1)x^{(1)} 的第二个单元格,每次都从原始 xx 中随机、有放回地抽样。

测试集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 配对自助法检验:从初始真实测试集 xx 构造 bb 个伪测试集 x(i)x^{(i)} 的示例。每个伪测试集通过 n=10n=10 次有放回抽样建立;一个样本就是一个单元格,即带金标准标签以及分类器 A、B 正误结果的一篇文档。真实测试集当然不会只有 10 个例子,bb 也必须足够大。

得到提供抽样分布的 bb 个测试集后,就可统计 A 多频繁地获得偶然优势。计算这种优势有多种方法;这里采用 Berg-Kirkpatrick et al.(2012)的版本。假设 H0H_0(A 不优于 B)成立,则在许多测试集上估计的 δ(X)\delta(X) 期望应当为零或负;远高于零会令人惊讶,因为 H0H_0 明确假定 A 不更好。为精确衡量观察到的 δ(x)\delta(x) 有多出人意料,在其他情形下,可统计许多测试集中 δ(x(i))\delta(x^{(i)}) 比期望值零高出 δ(x)\delta(x) 或更多的频率,以计算 p 值:

p-value(x)=1bi=1b1 ⁣(δ(x(i))δ(x)0)\operatorname{p-value}(x)=\frac1b\sum_{i=1}^{b}\mathbb{1}\!\left(\delta(x^{(i)})-\delta(x)\geq0\right)

其中 1(q)\mathbb{1}(q) 表示:若 qq 为真则取 1,否则取 0。然而,虽然在 A 不优于 B 的假设下,许多测试集上 δ(X)\delta(X) 的期望通常为 0,但我们构造的自助测试集并非如此。因为这些样本并不是从均值为 0 的分布中抽取的;它们恰好来自原始测试集 xx,而 xx 恰好对 A 有 .20 的偏向。因此,为衡量观察到的 δ(x)\delta(x) 有多出人意料,实际上要统计许多测试集中 δ(x(i))\delta(x^{(i)})δ(x)\delta(x) 的期望值再高出 δ(x)\delta(x) 或更多的频率:

p-value(x)=1bi=1b1 ⁣(δ(x(i))δ(x)δ(x))=1bi=1b1 ⁣(δ(x(i))2δ(x))(B.22)\begin{aligned} \operatorname{p-value}(x) &=\frac1b\sum_{i=1}^{b}\mathbb{1}\!\left(\delta(x^{(i)})-\delta(x)\geq\delta(x)\right)\\ &=\frac1b\sum_{i=1}^{b}\mathbb{1}\!\left(\delta(x^{(i)})\geq2\delta(x)\right) \end{aligned}\tag{B.22}

例如,若有 10,000 个测试集 x(i)x^{(i)},阈值为 .01,而仅在 47 个测试集中发现 A 偶然好到满足 δ(x(i))2δ(x)\delta(x^{(i)})\geq2\delta(x),所得 p 值 .0047 小于 .01。这表明观察到的差异 δ(x)\delta(x) 确实足够出人意料,不大可能是偶然产生的;我们可以拒绝零假设,并得出 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 所示。输入测试集 xx 和样本数 bb,它统计 bb 个自助测试集中满足 δ(x(i))>2δ(x)\delta(x^{(i)})>2\delta(x) 的百分比。该百分比就作为单侧经验 p 值。