第 13 讲:基准测试与评估

Natural Language Processing with Deep Learning · Lecture 13。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

对应:Stanford CS224N Winter 2026 Lecture 11(Benchmarking and Evaluation)与作业 4;Winter 2025 Lecture 12(Evaluation)。和同目录 CS336 第 12 讲(评估)有重叠:本讲侧重”评估结果在什么情况下会骗人”以及背后的统计学。 配套代码:code/lecture13/(只需要 numpy;01、04 号文件用第 8 讲的玩具影评) 预计阅读时间:3.5–4 小时


0. 本讲导航

0.1 学完本讲,你应该能够

  1. 说出评估要回答的三个问题(测什么、怎么测、结果可信吗),以及”构念效度”和古德哈特定律的含义。
  2. 计算精确率、召回率、宏平均 / 微平均 / 加权 F1,判断类别不平衡时该看哪个;解释校准、ECE 和温度缩放。
  3. 写出 BLEU、ROUGE 的计算方法,说出它们和 BERTScore 等神经指标各自的盲点。
  4. 解释为什么分词方式不同的模型,困惑度不能直接比较,以及每字节 / 每字符比特数的作用。
  5. 梳理基准的演变(GLUE → SuperGLUE → MMLU → HELM → 各种智能体基准),解释基准饱和、标签错误和提示格式敏感性。
  6. 给一个准确率算标准误和置信区间;解释为什么比较两个模型要用配对方法、题目成组时要用聚类标准误;估计需要多少道题。
  7. 设计人类评估;解释”大模型当评委”的位置偏差、长度偏差、自我偏好,以及 Chatbot Arena 的 Bradley–Terry 排名。
  8. 解释数据污染的来源和几种检测方法(n 元组重合、成员推断、金丝雀字符串、造新题),以及它们的局限。

0.2 先修知识

知识点用在哪里最低要求
第 8 讲全讲数据划分、bootstrap、置换检验、随机种子方差、数据泄漏
第 10 讲第 7 节Bradley–Terry 模型;长度偏见;古德哈特定律
第 6 讲第 3 节机器翻译;BLEU 的基本形式
第 5 讲第 4 节困惑度 = exp(平均交叉熵);n 元语言模型
统计第 6 节均值、方差、标准差;正态分布的 95% 区间 ≈ ±1.96 个标准差

0.3 本讲地图

第1节  为什么评估这么难?
第2节  分类指标与校准                     ← 代码 01(演示 1、2)
第3节  生成任务的指标                     ← 代码 01(演示 3、4)
第4节  困惑度                            ← 代码 01(演示 5)
第5节  基准测试:演变、饱和与陷阱           ← 代码 02(演示 5、6)
第6节  统计:误差棒、配对、聚类、排行榜     ← 代码 02(演示 1~4)
第7节  人类评估与大模型评委                ← 代码 03
第8节  数据污染                          ← 代码 04
第9节  一份评估报告的检查清单
第10–14节 小结、与作业的关系、练习、延伸阅读、下一讲预告

关于本讲的实验数字:本讲的四个代码文件都只用 numpy,每个运行一两秒,编写讲义时都完整运行过,讲义引用的是实际输出。很多实验是模拟(模拟的模型、模拟的评委),模拟用的参数(偏差有多大、能力差多少)都是我们假设的,用来说明机制;讲义在相应位置注明了这一点。


1. 为什么评估这么难?

前面每一讲的代码都报告了一个数字:准确率、困惑度、EM、Recall@k、胜率。我们用这些数字决定”哪种方法更好”。这一讲退一步问:这些数字可信吗?

评估要回答三个问题:

  1. 测什么? 我们真正关心的是”模型能不能帮人写好代码""会不会胡说八道""对不同的人公平吗”,这些都没法直接测量。我们能测的是”在这 500 道题上答对了多少”。测出来的东西和真正关心的东西之间的距离,叫构念效度(construct validity)。“在某个阅读理解数据集上超过人类”不等于”阅读能力超过人类”(第 12 讲第 2.2 节的对抗干扰句就是例子)。
  2. 怎么测? 用什么指标、什么提示、什么评委、多少道题。每个选择都会影响结果,而且影响往往比我们比较的两个方法之间的差别还大。
  3. 结果可信吗? 换一批题还成立吗?差距是真实的还是运气?题目是不是早就在训练语料里了?

还有一层更深的困难:古德哈特定律——“当一个指标变成目标,它就不再是一个好指标。“一个基准一旦成为大家竞相刷分的目标,模型(和研究者)就会找到各种提高分数却不提高真实能力的办法:针对基准的格式调参、在测试集上反复挑模型(第 8 讲的测试集复用)、训练数据里混进了测试题(第 8 节)。第 10 讲 RLHF 里奖励模型被”钻空子”,是同一个道理。

评估还决定了整个领域往哪里走:大家优化什么,取决于大家测什么。所以评估不是研究做完之后的”收尾工作”,它本身就是研究中最需要想清楚的部分。


2. 分类指标与校准

2.1 精确率、召回率、F1

第 8 讲已经介绍过二分类的精确率和召回率。多分类时,对每一类 kk 分别计算:

Pk=预测为 k 且真的是 k预测为 k,Rk=预测为 k 且真的是 k真的是 k,F1k=2PkRkPk+RkP_k = \frac{\text{预测为 } k \text{ 且真的是 } k}{\text{预测为 } k},\qquad R_k = \frac{\text{预测为 } k \text{ 且真的是 } k}{\text{真的是 } k},\qquad F1_k = \frac{2P_kR_k}{P_k + R_k}

再把各类合起来,有三种方式:

  • 宏平均(macro):各类的 F1 直接平均,每一类同等重要;
  • 微平均(micro):把所有类的 TP、FP、FN 加起来再算。单标签多分类时,它恒等于准确率;
  • 加权(weighted):按每一类的样本数加权平均,大类更重要。

代码 01 的演示 1:测试集 1000 条,正面 800、负面 150、中性 50。

模型准确率宏平均 F1微平均 F1加权 F1
永远猜”正面”80.0%29.6%80.0%71.1%
一个还不错的分类器86.5%69.6%86.5%87.2%

“永远猜正面”的准确率高达 80%,但它对负面和中性一个都没找出来,宏平均 F1 只有 29.6%。还不错的分类器在小类”中性”上的 F1 也只有 43.5%,这在准确率里完全看不出来。类别不平衡时,准确率会严重高估模型。 报告哪个指标取决于你关心什么:如果漏掉一条中性评论和漏掉一条正面评论一样糟糕,就看宏平均。

2.2 校准

一个模型说”我有 90% 的把握”的那些预测里,真的有 90% 是对的吗?如果是,这个模型就是校准良好的(well-calibrated)。

为什么在乎?很多系统要根据置信度做决定:置信度高就自动处理,低就交给人;RAG 系统要决定”回答”还是”说不知道”(第 12 讲)。如果模型过度自信,这些决定就会出错。

期望校准误差(ECE):把预测按置信度分进若干个箱子,每个箱子里算”平均置信度 − 实际准确率”的绝对值,再按箱子里的样本数加权平均。

代码 01 的演示 2 模拟一个过度自信的模型(它的对数几率是真实值的 2.5 倍),测试集 20000 条,准确率 76.8%。部分可靠性表:

置信度区间样本数平均置信度实际准确率
[0.50, 0.55)62852.4%50.5%
[0.80, 0.85)114382.6%64.6%
[0.90, 0.95)224692.7%73.5%
[0.95, 1.00]1061598.8%88.3%

ECE = 0.121。模型说”98.8% 的把握”时,实际只对了 88.3%。

温度缩放(Guo 等 2017):把所有对数几率除以一个温度 TT,在验证集上找让交叉熵最小的 TT。这里找到 T=2.65T = 2.65(真实值 2.5),缩放之后 ECE 从 0.121 降到 0.011,测试集交叉熵从 0.631 降到 0.483,准确率不变(76.8%):除以一个正数不改变任何一个预测的类别,只让置信度变得”诚实”。

大语言模型的校准:预训练的语言模型在选择题上往往校准得不错(Kadavath 等 2022);GPT-4 的技术报告显示,经过 RLHF 之后校准明显变差(第 10 讲第 6.3 节)。后训练让模型更”果断”,也让它的置信度更不可信。


3. 生成任务的指标

翻译、摘要、对话这类任务的输出是一段文字,正确答案不止一个。怎么自动打分?

3.1 基于重合的指标:BLEU、ROUGE、chrF

BLEU(Papineni 等 2002,机器翻译):

BLEU=BP×exp⁡ ⁣(14∑n=14log⁡pn),BP={1c>re1−r/cc≤r\text{BLEU} = \text{BP} \times \exp\!\left(\frac{1}{4}\sum_{n=1}^{4} \log p_n\right),\qquad \text{BP} = \begin{cases} 1 & c > r \\ e^{1 - r/c} & c \le r \end{cases}

pnp_n 是修正的 n 元组精确率:候选译文里的每个 n 元组,最多按它在参考译文里出现的次数计为命中(防止 “the the the the” 骗分)。BLEU 只看精确率,所以要用简短惩罚 BP(cc 是候选长度、rr 是参考长度)防止”只输出一个最有把握的词”。几点注意:句子级 BLEU 很不稳定(任何一个 pnp_n 为 0 整体就是 0),论文里报告的应该是语料级 BLEU;不同的分词、平滑方式会让同一份译文的 BLEU 差好几分,所以应该用 sacreBLEU 这样的标准实现。

ROUGE(Lin 2004,自动摘要):ROUGE-N 是 n 元组的重合(最初只报告召回率:摘要应该覆盖参考摘要的内容);ROUGE-L 用最长公共子序列衡量”按顺序重合了多少”。

chrF(Popović 2015):在字符 n 元组上算 F 分数(召回率权重更大)。“film” 和 “films” 能得到部分分数,对形态丰富的语言比按词比较更合理。

3.2 基于嵌入的指标:BERTScore

BERTScore(Zhang 等 2020):用 BERT 给候选和参考里的每个词算一个上下文相关的向量,每个候选词找参考里最相似的词(贪心匹配),相似度的平均是精确率,反过来是召回率,再求 F1。它能认出 “film ≈ movie”。更进一步的 BLEURT(Sellam 等 2020)、COMET(Rei 等 2020)直接在人类评分上训练一个模型来打分。

3.3 它们的盲点

代码 01 的演示 3。参考:“the movie was really great and the acting was wonderful .”(BERTScore 用的是我们手工造的近义词向量,数字本身没有意义,只看规律。)

候选BLEUROUGE-1ROUGE-2ROUGE-LchrFBERTScore
完全相同1.001.001.001.001.001.00
同义改写(意思不变)0.170.450.100.450.330.92
加了否定(意思相反)0.570.920.730.920.910.95
打乱词序0.211.000.100.450.721.00
只说了一半0.170.620.290.620.340.86
毫不相关0.080.120.000.120.100.32

演示 4 更系统地对 300 条影评各做一种修改,看每个指标的平均分(不修改时都是 1.00):

修改BLEUROUGE-1ROUGE-LchrFBERTScore人会怎么看
换近义词0.730.900.900.820.98意思不变,几乎不扣分
加一个否定0.890.980.980.980.99意思反了,扣很多分
删掉后半0.350.660.660.520.88信息不完整,扣分
打乱词序0.141.000.400.731.00读不通,扣很多分

理想的指标应该在换近义词时几乎不扣分,在加否定、打乱词序时扣很多分。没有一个指标同时做到。 BLEU 对换近义词扣分最狠、对加否定却很宽容,几乎和人的判断反着来;ROUGE-1 和 BERTScore 不看词序;所有指标都看不出否定。

更根本的问题:所有基于参考的指标都假设”和参考越像越好”。 对开放式生成(写故事、回答”怎样准备面试”),好的回答可能和参考完全不同,这时这些指标就基本失效了。这也是为什么今天评估对话模型主要靠人类评估和大模型评委(第 7 节)。

真实研究中的结论:WMT 机器翻译的指标评测发现,神经网络指标(COMET、BLEURT 等)和人类判断的相关性明显高于 BLEU,2022 年的评测报告标题就是”停止使用 BLEU”(Freitag 等 2022)。但重要的结论仍然需要人类评估。


4. 困惑度

困惑度(第 5 讲)是语言模型最基本的指标:PPL=exp⁡(每个预测单位的平均交叉熵)\text{PPL} = \exp(\text{每个预测单位的平均交叉熵})。它便宜、不需要参考答案、和下游能力有一定关系(第 9 讲的规模定律就是用损失画的)。但有一个常见的陷阱:“每个预测单位”取决于分词。

代码 01 的演示 5 在 5000 条影评上训练几个 n 元语言模型,在 500 条上测试:

模型预测单位单位数困惑度每字符比特数
词级 2 元模型词13,4583.930.429
词级 3 元模型词13,4583.410.384
字符级 3 元模型字符61,9922.691.428
字符级 6 元模型字符61,9921.330.407

字符级 6 元模型的困惑度只有 1.33,远低于词级模型的 3~4。但这不说明它更好:预测一个字符本来就比预测一个词容易得多。公平的比较是把总的信息量(比特数)除以一个和分词无关的长度,比如每字符比特数或每字节比特数(bits per byte)。这样一比,字符级 6 元模型(0.407)其实和词级模型差不多,还略差于词级 3 元模型(0.384)。

同样的道理:两个分词器不同(比如词表大小不同)的大模型,困惑度不能直接比较(第 16 讲)。困惑度的另一个局限是:它衡量的是”预测网上文本”的能力,和”遵循指令""回答正确”的能力不完全一致,后训练之后的模型困惑度往往反而变差。


5. 基准测试:演变、饱和与陷阱

5.1 基准的演变

时间基准内容命运
2016SQuAD阅读理解2018 年底被超过人类基准(第 12 讲)
2018GLUE9 个句子级理解任务的综合分一年多就被超过人类基准
2019SuperGLUE8 个更难的任务两年内被超过人类基准
2020MMLU57 个学科的四选一题目(约 1.4 万道测试题),从小学到专业水平GPT-3 当时约 44%;几年后最强模型接近 90%,趋于饱和
2022BIG-bench200 多个由社区贡献的任务难的子集 BIG-Bench Hard 也很快被攻克
2022HELM不只看准确率:还看校准、鲁棒性、公平性、偏见、毒性、效率“全面评估”的框架
2023GPQA448 道研究生水平的科学题,连会上网搜索的非专家也只能答对约三分之一两年内被大幅攻克
2023–SWE-bench、WebArena、τ-bench 等智能体完成真实任务(修代码、操作网页、客服对话)仍在快速变化
2025Humanity’s Last Exam各领域专家出的约 2500 道极难题目……
2023–Chatbot Arena真实用户的两两投票(第 7.3 节)持续更新的排行榜

一个明显的趋势:基准的寿命越来越短(Kiela 等 2021)。从发布到被”刷穿”,早年要好几年,现在可能只要一两年。另一个趋势:评估从”给一个分数”走向”多维度、多场景”(HELM),从”静态题库”走向”动态、交互”(Chatbot Arena、智能体基准)。

5.2 基准饱和

代码 02 的演示 5(b) 用项目反应理论模拟:模型能力每年提高 0.5(对数几率),一个容易的基准和一个困难的基准:

能力容易的基准困难的基准
第 0 年−1.049.3%4.4%
第 3 年0.577.3%15.4%
第 6 年2.092.9%39.6%
第 9 年3.598.2%69.5%

同样的能力提升,容易的基准上从每年 +10 个百分点降到 +1.1 个百分点:它饱和了,失去区分度;困难的基准此时才进入快速上升的阶段。基准太难也不行:大家都接近 0 分时同样分不出高下。好的基准要让当前的模型落在”中等难度”的区间里。

5.3 标签错误:天花板

基准的标准答案也会错。Northcutt 等(2021)检查了 10 个常用的测试集,平均至少 3.3% 的标签是错的;对 MMLU 的重新审查(MMLU-Redux,Gema 等 2024)估计约 6.5% 的题目有问题(答案错、题目有歧义等)。

代码 02 的演示 5(a):四选一的基准,6% 的标准答案是错的(假设模型在这些题上答错时,在 3 个错误选项里随机选):

真实准确率50%70%90%95%100%
测出的准确率48.0%66.4%84.8%89.4%94.0%

一个完美的模型最多只能得到 94%。接近天花板时,测出的分数越来越不能反映真实能力的差别;两个都”94%“的模型可能一个完美、一个只是在错题上和标注者错得一样。

5.4 提示格式的敏感性

第 11 讲讲过,提示的细节(例子、顺序、格式)能显著改变结果。对评估来说,这意味着分数是”模型 + 提示”的分数,而不只是模型的。选择题还有一个特别的问题:让模型输出选项字母(“A”),还是比较四个选项全文的概率?两种方式得到的分数和排名可能都不同。

代码 02 的演示 6 模拟 10 个模型(真实准确率 60% 到 69%,相邻差 1 个点),每个模型在不同提示格式上的表现有 ±3 个点的随机差异(这个大小是假设的):

  • 只用一种格式时,排名和真实排名的 Spearman 相关在 0.50 到 0.90 之间;
  • 8 种格式平均之后达到 0.95;
  • 8 种格式下分别排第一的模型是 [9, 5, 6, 9, 7, 5, 7, 9],真正最好的 9 号只在 3 种格式下排第一。

所以:要么固定一种公开的标准格式(让结果可比),要么报告多种格式的平均(让结果稳健)。HELM 等框架会报告多种提示下的结果。


6. 统计:误差棒、配对、聚类、排行榜

一个基准只是从”所有可能的题目”里抽出来的一个样本。换一批同样难度的题,分数就会变。每个分数都应该带着误差棒。

6.1 一个准确率有多大的误差?

每道题答对与否是一个 0/1 变量,准确率是它们的平均。由中心极限定理:

SE=p(1−p)n,95% 置信区间≈p±1.96 SE\text{SE} = \sqrt{\frac{p(1 - p)}{n}},\qquad \text{95\% 置信区间} \approx p \pm 1.96\,\text{SE}

代码 02 的演示 1(真实准确率 70%):

题目数 nn标准误95% 区间半宽
1004.58%8.98%
5002.05%4.02%
1,0001.45%2.84%
14,042(MMLU 测试集)0.39%0.76%

(一次 500 题的模拟中,公式算的标准误 2.12%,bootstrap 估计的 2.13%,两者一致。)100 道题的基准,误差棒是 ±9 个百分点,两个模型差 5 个点完全可能只是运气。很多论文的测试集只有几百道题,却在比较小数点后一位的差别。

6.2 比较两个模型:要配对

两个模型在同一批题上测试时,它们的对错是相关的:难题大家都错,简单题大家都对。把两个准确率当作独立的来算差值的误差,会高估误差。正确的做法是看每道题上的差 di=Bi−Aid_i = B_i - A_i:

SE配对=sd(di)n\text{SE}_{\text{配对}} = \frac{\text{sd}(d_i)}{\sqrt{n}}

代码 02 的演示 2:1000 道难度差别很大的题,A、B 的期望准确率差 1.7 个百分点,两者在每道题上的对错的相关系数是 0.47。

标准误
不配对(当作两个独立的准确率)2.13%
配对(看每道题上的差)1.55%

统计功效(B 真的比 A 好 1.7 个点,单侧检验,显著性水平 5%,能检测出来的概率):

题目数不配对的检验配对的检验
5002%12%
2,00010%32%
8,00062%91%

两点结论:比较两个模型要用配对的方法(配对 t 检验、McNemar 检验、第 8 讲的配对 bootstrap 和置换检验);即使配对,要可靠地分出一两个百分点的差距也需要几千道题。Card 等(2020)发现 NLP 领域很多实验的统计功效严重不足:即使方法真的更好,用那么小的测试集也大概率测不出来;而测出来”显著”的结果,又往往夸大了真实的差距。

6.3 题目成组:聚类标准误

阅读理解里一篇文章出好几道题,模板生成的题目一批一批地相似,智能体基准里一个代码仓库出多个任务。同一组的题目难度相关,它们提供的信息少于同样数量的独立题目。聚类标准误把每组的平均分当作独立样本来算误差(Miller 2024)。

代码 02 的演示 3:200 篇文章、每篇 5 道题(共 1000 道),同一篇文章的题目难度相近。

标准误
朴素(当作 1000 道独立的题)1.56%
聚类(按文章分组)2.23%
真实的波动(重新出 1000 次题,准确率的标准差)2.30%

朴素的误差棒低估了真实波动的三成左右,聚类标准误和真实值接近。

6.4 排行榜的噪声

代码 02 的演示 4:20 个实力完全相同的模型,各自在同一批 500 道题上测试,重复 1000 次。排行榜第一名平均比所有模型的平均分高 3.3 个百分点,比第十名高 3.4 个百分点——纯属运气。

从排行榜上挑出第一名,本身就是一种选择偏差(第 8 讲的”赢家诅咒”):被挑出来的那个,往往是”真实实力 + 运气”都好的那个,换一批题它就会退步。所以排行榜应该给出置信区间(第 7.3 节),差距在误差范围内的模型应视为并列。

6.5 小结:怎么报告一个分数

  • 报告置信区间(或标准误),说明是怎么算的(题目数、是否聚类);
  • 比较两个模型时用配对的检验,报告差值的置信区间;
  • 训练有随机性时,报告多个随机种子的均值和标准差(第 8 讲);
  • 事先估计需要多少道题才能检测出你关心的差距(功效分析);
  • 比较多个模型、多个设置时,警惕多重比较。

7. 人类评估与大模型评委

7.1 人类评估

对开放式生成,人类评估仍然是”金标准”,但它本身也需要精心设计:

  • 绝对打分 vs 两两比较:给每个回答打 1~5 分,不同的人尺度不一样(有人从不给 5 分);两两比较(“A 和 B 哪个更好”)更容易、更一致,这也是第 10 讲偏好数据用比较的原因。
  • 评什么:有用性、正确性、流畅性、无害性……分开评比笼统地评”好不好”更可靠。
  • 谁来评:众包工人、领域专家、真实用户,评出来的结果可能很不一样。专业问题(医学、法律、代码)需要专家;而专家很贵。
  • 一致性:同一批样本让多个人评,计算标注者之间的一致率。Cohen’s kappa 扣除了”碰巧一致”的部分:1 表示完全一致,0 表示和随机一样。一致率低说明任务本身定义得不清楚,或者问题确实主观。

7.2 大模型当评委

人类评估又慢又贵。越来越常见的做法是让一个强大的大模型当评委(LLM-as-a-judge):给它两个回答,问哪个更好;或者给一个回答打分。Zheng 等(2023)的 MT-Bench 研究发现,GPT-4 评委和人类专家的一致率超过 80%,和人类专家之间的一致率相当。它便宜、快、可重复,迅速成为评估对话模型的主流工具。

但评委有系统性的偏差。代码 03 用一个模拟的评委把它们拆开看。人类评委只看质量;模型评委的对数几率 = β·(质量差) + 位置偏差 + 长度偏差 + 自我偏好(这些偏差的大小是我们假设的)。

位置偏差(演示 1):两个系统 A、B 的回答质量分布完全相同,人类眼里 A 的胜率是 49.5%。但评委看到 A 在前时,A 的胜率是 59.5%;B 在前时,A 的胜率是 40.9%。交换顺序评两次,只有 72.0% 的情况结论一致。Zheng 等发现,当时最强的评委在交换顺序后也只在大约三分之二的情况下保持原来的结论。修正:每一对评两次(交换顺序),结论不一致的记为平局。这里去偏后 A 的胜率是 50.2%。

长度偏差(演示 2):每个系统和同一个基线比较 4000 次(顺序随机):

系统人类眼里的胜率评委胜率长度控制的评委胜率
A(和基线一样好)50.6%49.3%49.4%
A 加长版(内容相同,长 60%)50.7%57.4%50.1%
B(更好,但更简洁)58.1%50.3%55.9%

内容完全相同、只是写得更长,评委的胜率就从 49% 升到 57%;真正更好但更简洁的 B,评委只给了 50%。长度控制的胜率(AlpacaEval 2 的做法,Dubois 等 2024)把评委的结论对”长度差”做逻辑回归,报告”长度相同时”的胜率,这里基本还原了人类眼里的排序。但它假设”长度本身不代表质量”,有些问题确实需要更长的回答,全部扣掉会冤枉它们。

一致率高不代表没有偏差(演示 3):在长度只有自然差别的 4000 对回答上,两个人类评委的一致率是 75.6%(kappa 0.51),模型评委和人类评委的一致率是 74.0%(kappa 0.48),几乎一样。但同一个评委在演示 2 里,长度被刻意拉开时就系统性地偏向长回答。一致率衡量的是平均而言准不准,偏差在被优化的方向上才暴露出来。 一旦大家都用这个评委来优化模型,模型就会学会”写长一点”,这就是第 10 讲 RLHF 里的长度偏见。

自我偏好(演示 5):四个模型真实质量甲 > 乙 > 丙 > 丁,每个评委对自家模型有 +0.5 的偏好:

评委模型甲模型乙模型丙模型丁
丁家的评委52.7%49.9%45.2%52.2%
丙家的评委52.8%48.8%54.3%44.1%
四家评委平均54.2%52.7%48.4%44.5%
没有偏好的评委54.7%52.3%47.2%45.8%

丁家的评委把最差的丁抬到了和最好的甲差不多的位置;用不同家族的评委组成评审团,各家的偏好互相抵消了大半。Panickssery 等(2024)发现模型确实能认出并偏爱自己的输出。看到”用模型 X 当评委,模型 Y 达到了某某水平的 99%“这样的结论时(第 11 讲 QLoRA 的 Guanaco 就是这样评的),要想一想评委和被评模型的关系。

使用大模型评委的建议:交换顺序评两次;控制或报告长度;用和被评模型无关的评委,或者多个评委;在一小批样本上和人类评估对比,并做针对性的偏差测试;评委的提示和评分细则要公开。

7.3 Chatbot Arena:众包的两两比较

Chatbot Arena(Chiang 等 2024)让真实用户在网页上同时和两个匿名模型对话,投票选更好的那个。积累了大量投票后,用 Bradley–Terry 模型(第 10 讲第 3.2 节;这里比较的是模型,而不是回答)估计每个模型的实力:

P(i 胜 j)=σ(θi−θj)P(i \text{ 胜 } j) = \sigma(\theta_i - \theta_j)

再换算成 Elo 分数(400 分的差距约等于胜率 10:1)。

代码 03 的演示 4 模拟 8 个模型的对战,用最大似然估计 θ\theta(Hunter 2004 的 MM 算法),用 bootstrap 给 95% 置信区间:

  • 500 场对战:区间很宽(宽度一百多分),A、B 的顺序估计反了,D、E 也反了,和真实排名的 Spearman 相关是 0.95;
  • 20,000 场对战:区间宽度缩到二十分左右,相关系数 0.98;但真实只差 8 分的 D 和 E(1031 对 1023)区间仍然重叠,排名仍然颠倒。

传统的在线 Elo(每打一场更新一次)依赖比赛的顺序:同样 20,000 场比赛换个顺序,各模型的分数最多相差 32 分。Chatbot Arena 因此改用 Bradley–Terry 的最大似然估计。

Arena 的优点是问题来自真实用户、很难针对性地刷题;缺点是用户群体和问题分布不代表所有用途(比如很少有长篇的专业任务),用户也会偏爱更长、格式更花哨的回答,而且模型开发者可能针对 Arena 的风格做优化。


8. 数据污染

8.1 问题是什么

大模型的预训练语料从网上大规模爬取,而基准的题目也常常发布在网上:论文附录、GitHub 仓库、论坛讨论、“解题教程”。如果测试题混进了训练语料,模型可能是”背过答案”而不是”会做”,分数就会虚高,这叫数据污染(contamination)。它是第 8 讲”数据泄漏”在大模型时代的放大版:训练数据大到没人能逐条检查,往往也不公开。

代码 04 搭了一个小实验:一个”基准”(400 条影评,平均 29 个词)和一个”预训练语料”(2 万条别的影评),故意把 240 道测试题以不同方式混进语料:原样泄漏 1 次、原样泄漏 5 次、改写后泄漏(换了形容词)、只泄漏前半段,各 60 道;其余 160 道没有泄漏。

8.2 n 元组重合检测

最直接的办法:测试题里只要有一段连续 nn 个词在语料里出现过,就判为污染。GPT-3 的论文用 13 元组。代码 04 的演示 1(“没有泄漏”那一列就是误报率):

nn原样 ×1原样 ×5改写后只有前半段没有泄漏能检查的题目
8100%100%100%100%99%100%
13100%100%77%90%64%100%
2083%85%22%18%9%85%
2567%72%5%2%0%69%
3047%52%0%0%0%46%
  • nn 小,误报多。我们的影评由模板生成、用词很少,连 13 个词的片段都经常在别的评论里原样出现,13 元组的误报率高达 64%。真实的网页文本多样得多,13 元组通常够用。教训:nn 不能照搬别人的数字,要先在确定干净的数据上测误报率,再决定 nn。
  • nn 大,漏报多:比 nn 短的题目根本没法检查(n=30n = 30 时只有 46% 的题目够长),原样泄漏的也开始漏掉;改写过的、只泄漏了一半的很快就一道也查不出来。
  • 根本局限:n 元组只能发现字面的重复。翻译成另一种语言、换个说法、打乱选项顺序,都能躲过它。

GPT-4 的技术报告用的是”随机抽 3 段 50 个字符的子串”做匹配,原理相同,局限也相同。

8.3 成员推断:背过的文本概率更高

如果拿不到训练语料(大多数商业模型都不公开),只能从模型本身找线索:模型背过的文本,它给的概率应该更高。Min-K% Prob(Shi 等 2023)只看一段文本里概率最低的 K% 的词的平均对数概率:没见过的文本里总有几个让模型”意外”的词,背过的文本里连最难的词模型也有把握。还可以和一个没见过这些数据的参考模型比较,扣除文本本身的难易。

代码 04 的演示 2 在被污染的语料上训练一个词级 3 元语言模型,AUC 表示能把泄漏的题目和没泄漏的题目区分开的程度(0.5 = 瞎猜):

分数原样 ×1原样 ×5改写后只有前半段
平均对数概率0.510.610.580.47
Min-20% Prob0.530.620.610.50
Min-20%,减去参考模型0.580.760.530.45

信号很弱:大多数 AUC 只有 0.5~0.6。减去参考模型对原样泄漏最有效(泄漏 5 次的 AUC 升到 0.76),对改写过的和只泄漏一半的反而接近瞎猜,因为模型见过的是另一段文字。真实大模型的情况类似:Duan 等(2024)发现很多成员推断方法在严格的设置下只比瞎猜好一点点;重复次数越多、模型越大,记忆效应越强,才越容易检测。“查不出污染”不等于”没有污染”。

8.4 污染让分数虚高多少?

代码 04 的演示 3 假设模型的真实能力是 70%,但对泄漏过的题目因为”记得”而答得更好(原样 ×1 → 90%、原样 ×5 → 99%、改写后 → 80%、只有前半段 → 75%,都是假设的数字):

准确率
全部 400 题80.8%
真正干净的题目(模拟里我们知道)68.1%
20 元组检测认为干净的题目75.1%(混着 115 道其实泄漏过的题)
20 元组检测认为被污染的题目91.4%

总分比真实能力高了十几个百分点。GPT-3 论文的做法是把题目分成”干净”和”可能被污染”两部分分别报告,如果两部分差不多,说明污染影响不大。但”干净子集”依赖检测方法:检测不出的泄漏仍然混在里面,所谓干净的子集分数仍然偏高。

更可靠的办法是造新题:Zhang 等(2024)仿照小学数学基准 GSM8K 重新出了 1000 道同样难度的题(GSM1k),发现一些模型在新题上的准确率明显下降(最多十几个百分点),而最强的几个模型几乎不变。动态更新的基准(定期出新题、只用模型发布之后的新数据,如 LiveBench)也是同样的思路。

8.5 金丝雀字符串

BIG-bench 在所有基准文件里放了一个独一无二的字符串(“金丝雀”,canary GUID)。语料里一搜就知道有没有包含这个基准(代码 04 演示 4);如果一个模型能把这个字符串背出来,就说明它见过这个基准。但它只能防君子:题目被复制、翻译、改写到别处时,金丝雀往往就丢了。


9. 一份评估报告的检查清单

读别人的评估结果、写自己的评估时,可以对照这份清单:

  1. 构念:这个基准测的是我关心的能力吗?它的题目从哪里来,代表什么样的使用场景?
  2. 指标:类别不平衡吗(看宏平均 F1)?生成任务用了什么指标,它的盲点会不会正好影响结论?困惑度的分词一致吗?
  3. 提示与设置:提示格式、少样本例子、解码参数(温度)、答案提取方式都写清楚了吗?换一种格式结论还成立吗?
  4. 统计:有置信区间吗?比较时配对了吗?题目成组时用了聚类标准误吗?多个随机种子?测试集够大吗?
  5. 评委:如果用大模型评委,交换顺序了吗?控制长度了吗?评委和被评模型有关系吗?和人类评估对比过吗?
  6. 污染:模型的训练数据截止日期和基准的发布日期是什么关系?做过污染检测吗?有没有在新题上验证?
  7. 基线与上限:随机猜的分数、简单基线的分数、人类的分数、标签错误带来的天花板各是多少?
  8. 可复现:代码、提示、模型版本、评估脚本公开了吗?

10. 本讲小结

  1. 评估的三个问题:测什么(构念效度)、怎么测、结果可信吗。指标一旦成为目标,就会被钻空子(古德哈特定律)。
  2. 分类与校准:类别不平衡时准确率会骗人,看宏平均 F1;单标签时微平均 F1 = 准确率。校准衡量置信度是否诚实,ECE 量化它,温度缩放修正它而不改变预测;RLHF 往往让校准变差。
  3. 生成指标:BLEU(修正的 n 元组精确率 + 简短惩罚)、ROUGE(重合 / 最长公共子序列)、chrF(字符级)只看字面;BERTScore 等神经指标认得近义词;没有一个指标能看出否定、同时惩罚词序混乱;开放式生成上基于参考的指标基本失效。
  4. 困惑度依赖分词,跨分词比较要用每字节 / 每字符比特数。
  5. 基准:GLUE → SuperGLUE → MMLU → HELM → 智能体基准,寿命越来越短;容易的基准会饱和;标签错误决定天花板;分数是”模型 + 提示”的分数。
  6. 统计:SE=p(1−p)/n\text{SE} = \sqrt{p(1-p)/n},100 道题的误差棒约 ±9 个点;比较模型要配对;题目成组要用聚类标准误;分出一两个点的差距要几千道题;排行榜第一名有运气成分。
  7. 评委:人类评估要设计好任务、评什么、谁来评,并测一致性。大模型评委便宜、和人一致率高,但有位置、长度、自我偏好等系统偏差;Chatbot Arena 用 Bradley–Terry + bootstrap 给出带置信区间的排名。
  8. 污染:n 元组检测只能抓字面重复,nn 要在干净数据上校准;成员推断信号很弱;“干净子集”依赖检测;造新题和动态基准最可靠;金丝雀字符串防君子。

11. 与作业的关系

  • Winter 2026 的作业 4 的主题正是大语言模型的基准测试与评估。本讲第 5、6 节的问题(题目数、置信区间、配对比较、提示格式)和第 7 节的问题(模型评委的偏差)会直接出现在你的分析里。建议:给每个分数都算置信区间;比较模型时用配对 bootstrap;至少试两种提示格式看结论是否稳定。
  • 期末项目:报告里的实验结果是评分的核心。第 9 节的检查清单可以直接用来检查你的实验设计。第 8 讲讲了实验方法,本讲讲的是怎样让结论经得起推敲。
  • CS336 的第 12 讲(评估)和作业里也有相关内容,侧重大规模评估的工程实现。

作业的具体题目以当年官方发布的版本为准。


12. 练习

练习 1(F1)★:一个二分类器在 1000 个样本上(正例 100 个)预测了 150 个正例,其中 80 个是真的正例。(a) 精确率、召回率、F1、准确率各是多少?(b) 一个永远预测负例的模型,准确率和正例的 F1 是多少?

参考答案

(a) 精确率 80/150 ≈ 53.3%,召回率 80/100 = 80%,F1 = 2 × 0.533 × 0.8 / 1.333 ≈ 64.0%。TP = 80,FP = 70,FN = 20,TN = 830,准确率 (80 + 830)/1000 = 91.0%。 (b) 准确率 90%,正例的 F1 = 0(精确率无定义,记为 0;召回率 0)。准确率差不多的两个模型,一个有用、一个完全没用。

练习 2(校准)★:(a) 温度缩放为什么不改变准确率?(b) 一个模型在验证集上找到的最佳温度 T=0.7T = 0.7,说明它原来是过度自信还是不够自信?(c) 一个”永远输出置信度 = 训练集上的整体准确率”的模型,ECE 是多少?它有用吗?

参考答案

(a) 所有对数几率除以同一个正数 TT,各类之间的大小顺序不变,argmax 不变,所以每个预测的类别都不变。 (b) T<1T < 1 意味着要把对数几率放大才能让交叉熵最小,说明原来的置信度偏低,不够自信。 (c) 如果测试集的准确率和训练集一样,这样的模型 ECE ≈ 0(所有样本都在同一个箱子里,平均置信度 = 准确率)。但它完全没有区分能力:它不知道哪些预测更可靠。所以校准只是好的置信度的一个方面,还需要区分度(比如用 AUC 衡量置信度能否区分对错)。

练习 3(BLEU)★★:参考译文 “the cat is on the mat”。候选 “the the the the the the”。(a) 未修正的 1 元组精确率是多少?修正后呢?(b) 候选 “the cat”:1 元组、2 元组的修正精确率各是多少?简短惩罚是多少?

参考答案

(a) 未修正:6 个 “the” 都在参考里出现,精确率 6/6 = 1。修正:参考里 “the” 最多出现 2 次,所以最多算 2 次命中,精确率 2/6 ≈ 0.33。 (b) 1 元组 2/2 = 1,2 元组 1/1 = 1,精确率都是完美的。但 c=2c = 2,r=6r = 6,BP =e1−6/2=e−2≈0.135= e^{1 - 6/2} = e^{-2} \approx 0.135。简短惩罚让”只说最有把握的两个词”的候选得不到高分。

练习 4(困惑度)★★:模型 A 用词表大小 32000 的分词器,在一段 1000 字节的文本上切成 250 个词元,困惑度 20;模型 B 的分词器把同一段文本切成 400 个词元,困惑度 8。(a) 哪个模型更好?(b) 分别算出两者的每字节比特数。

参考答案

(a) 不能直接比困惑度,要换算。(b) 总比特数 = 词元数 × log₂(困惑度)。A:250 × log₂20 ≈ 250 × 4.32 = 1080 比特,每字节 1.08 比特。B:400 × log₂8 = 400 × 3 = 1200 比特,每字节 1.20 比特。A 更好,尽管它的困惑度大得多。

练习 5(置信区间与样本量)★★:(a) 一个模型在 400 道题上答对 300 道,95% 置信区间是多少?(b) 想把区间半宽缩小到 ±1 个百分点,大约需要多少道题?(c) 两个模型在同一批 400 道题上,A 对 B 错的有 30 道,A 错 B 对的有 15 道,其余两者一致。用配对的方法估计 A − B 的差和它的标准误。

参考答案

(a) p=0.75p = 0.75,SE =0.75×0.25/400≈0.0217= \sqrt{0.75 \times 0.25 / 400} \approx 0.0217,区间约 75% ± 4.2%,即 [70.8%, 79.2%]。 (b) 1.960.75×0.25/n=0.011.96\sqrt{0.75 \times 0.25/n} = 0.01,n≈7203n \approx 7203 道。 (c) did_i 有 30 个 +1、15 个 −1、355 个 0。均值 =15/400=0.0375= 15/400 = 0.0375。di2d_i^2 的均值 =45/400=0.1125= 45/400 = 0.1125,方差 ≈0.1125−0.03752≈0.111\approx 0.1125 - 0.0375^2 \approx 0.111,标准差 ≈0.333\approx 0.333,SE ≈0.333/400≈0.0167\approx 0.333/\sqrt{400} \approx 0.0167。差 3.75 个点,约 2.2 个标准误,在 5% 的水平上显著。只有两者不一致的 45 道题提供了信息,这就是 McNemar 检验的思路。

练习 6(位置偏差)★:一个评委对两个质量相同的系统,A 在前时 A 赢 70%,B 在前时 A 赢 30%。(a) 如果你只按”A 在前”评一次,会得出什么结论?(b) 交换顺序评两次、取平均,A 的胜率是多少?(c) 为什么”随机决定顺序”也能消除偏差,但比”每对评两次”差一些?

参考答案

(a) A 比 B 好得多(70% 胜率),这完全是位置偏差造成的。 (b) (70% + 30%)/2 = 50%。 (c) 随机顺序在平均意义下抵消偏差,但每一对只评一次,位置偏差变成了额外的噪声,需要更多样本才能达到同样的精度。每对评两次还能顺便测出评委的一致率,结论不一致的那些对本身就说明”难分高下”。

练习 7(Bradley–Terry)★★:模型 X 的 Elo 比模型 Y 高 100 分。(a) X 战胜 Y 的概率是多少?(b) 高 400 分呢?(c) 为什么排行榜上相差 10 分的两个模型,实际上可以认为差不多?

参考答案

Elo 的约定:P(X 胜)=1/(1+10−Δ/400)P(X \text{ 胜}) = 1/(1 + 10^{-\Delta/400})。(a) 1/(1+10−0.25)≈0.641/(1 + 10^{-0.25}) \approx 0.64。(b) 1/(1+10−1)≈0.911/(1 + 10^{-1}) \approx 0.91(10:1)。(c) 10 分对应胜率约 51.4%,几乎就是五五开;而且估计本身有误差(代码 03:两万场对战后区间宽度还有约 20 分),区间重叠时排名不可靠。

练习 8(污染)★★:一个模型在某基准上得了 85%。你怀疑有污染,但拿不到训练数据。(a) 列出三种你能做的检查。(b) 如果在你新写的 200 道同类题上得了 78%,能说明什么?要注意什么?

参考答案

(a) ① 看基准的发布时间是否早于模型训练数据的截止时间,题目是否在网上公开;② 用成员推断(Min-K% Prob 等)比较基准题目和新写的同类题目的概率;③ 让模型续写题目的前半段,看能不能逐字续出后半段或答案;④ 检查模型能否背出基准的金丝雀字符串;⑤ 在新写的同类题上测试。 (b) 下降 7 个点提示可能有污染(或过拟合基准的风格),但要注意:新题的难度是否真的相同(最好请人校准难度,或者让几个已知没有污染的模型也做新题,看它们是否也下降);200 道题的误差棒约 ±6 个点,差距可能部分来自噪声。

练习 9(思考:构念效度):有人宣称”我们的模型在 MMLU 上超过了人类专家的平均水平,所以它具有专家级的知识”。指出这个推理中至少三个可能的问题。

参考答案

① 构念:四选一的题目测的是”在给定选项中认出正确答案”,不是”在真实场景中运用专业知识”;② 污染:MMLU 发布多年,题目广泛流传,模型可能见过;③ 标签错误:MMLU 约 6.5% 的题目有问题,接近天花板时分数的差别不可靠;④ 人类基线:所谓”专家水平”是怎么估计的、用了多少人;⑤ 提示敏感性:换一种提示格式分数可能不同;⑥ 统计:差距是否在误差范围内。

练习 10(动手):

(a) 在代码 01 的演示 2 里把模型改成不够自信的(对数几率乘以 0.5),可靠性表和温度缩放的结果是什么样的? (b) 在代码 02 的演示 2 里把题目难度的标准差从 3.0 改成 0.5,配对和不配对的标准误还差那么多吗?为什么? (c) 在代码 03 的演示 2 里把评委的长度偏差系数改成 0,再改成 3,“A 加长版”的评委胜率怎样变化?长度控制的胜率还能还原吗? (d) 在代码 04 的演示 1 里,把改写的方式从”换形容词”改成”只换第一个形容词”,13 元组和 20 元组的检测率怎样变化? (e) 在代码 02 的演示 4 里,把题目数从 500 增加到 5000,“第一名领先的幅度”怎样变化?大约和题目数是什么关系?


13. 延伸阅读

  • Raji et al.,AI and the Everything in the Whole Wide World Benchmark(2021):基准与构念效度。
  • Wang et al.,GLUE(2018)、SuperGLUE(2019);Hendrycks et al.,Measuring Massive Multitask Language Understanding(2020);Liang et al.,Holistic Evaluation of Language Models(2022,HELM)。
  • Kiela et al.,Dynabench: Rethinking Benchmarking in NLP(2021)。
  • Northcutt et al.,Pervasive Label Errors in Test Sets Destabilize Machine Learning Benchmarks(2021);Gema et al.,Are We Done with MMLU?(2024)。
  • Guo et al.,On Calibration of Modern Neural Networks(2017);Kadavath et al.,Language Models (Mostly) Know What They Know(2022)。
  • Papineni et al.,BLEU(2002);Lin,ROUGE(2004);Popović,chrF(2015);Zhang et al.,BERTScore(2020);Rei et al.,COMET(2020);Freitag et al.,Results of WMT22 Metrics Shared Task: Stop Using BLEU(2022)。
  • Dror et al.,The Hitchhiker’s Guide to Testing Statistical Significance in NLP(2018);Card et al.,With Little Power Comes Great Responsibility(2020);Miller,Adding Error Bars to Evals(2024)。
  • Zheng et al.,Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena(2023);Dubois et al.,Length-Controlled AlpacaEval(2024);Panickssery et al.,LLM Evaluators Recognize and Favor Their Own Generations(2024)。
  • Chiang et al.,Chatbot Arena: An Open Platform for Evaluating LLMs by Human Preference(2024)。
  • Brown et al.,Language Models are Few-Shot Learners(2020)的数据污染分析附录;Shi et al.,Detecting Pretraining Data from Large Language Models(2023,Min-K% Prob);Duan et al.,Do Membership Inference Attacks Work on Large Language Models?(2024);Zhang et al.,A Careful Examination of Large Language Model Performance on Grade School Arithmetic(2024,GSM1k)。
  • CS336 第 12 讲(同目录):评估的工程实践。

14. 下一讲预告

第 12 讲的智能体一步步拆解问题、调用工具。很多评估结果也显示,大模型在需要多步推理的数学题、逻辑题上进步惊人。但它们真的会”推理”吗?还是只是记住了大量相似题目的解法(第 8 节的污染问题在这里尤其尖锐)?

下一讲(推理 I:思维链与提示)讨论:

  • 什么是推理;关于语言模型能否推理的争论;
  • 思维链(chain-of-thought):为什么让模型”一步一步写出来”能大幅提高准确率?从计算复杂度的角度看,它给了 Transformer 什么原本没有的能力;
  • 自洽性:采样多条推理路径再投票,什么时候有用、什么时候没用;
  • 从提示到训练:STaR 等让模型从自己的推理中学习的方法,以及今天的”推理模型”;
  • 思维链说的是模型”真正的想法”吗?忠实性问题。
← 返回课程目录