第 12 讲:评估 —— 怎么判断一个模型"好不好"?

Language Modeling from Scratch · Lecture 12。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

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

本篇目录

对应:Stanford CS336 Spring 2026 Lecture 12(Evaluation,Percy Liang 的可执行讲义 lecture_12.py)。Spring 2025 的第 12 讲内容相近,有公开录像。 配套代码:code/lecture12/ 预计阅读时间:2.5–3 小时 硬件说明:普通电脑即可。配套代码用第 10 讲训练好的小模型和程序生成的”基准”演示各种评估方法。


0. 本讲导航

0.1 学完本讲,你应该能够

  1. 说明评估的核心难题:“抽象的概念”(好、聪明、安全)如何落到”具体的指标”上。
  2. 计算困惑度和每字节比特数,说明为什么比较不同分词方式时要按字节归一化,以及条件困惑度的用处。
  3. 用对数似然给多项选择题打分,说出长度归一化、置信区间、配对比较这些细节为什么重要。
  4. 说出主要的基准类型和代表:考试(MMLU、GPQA、HLE)、对话(Chatbot Arena、AlpacaEval、WildBench)、智能体(SWE-Bench、Terminal-Bench)、纯推理(ARC-AGI)、安全(HarmBench、AIR-Bench)。
  5. 解释 Elo / Bradley–Terry 评分、LLM 当评委的偏差(例如偏爱长回答)以及长度控制。
  6. 讨论评估的真实性(生态效度)和有效性(测试集污染、数据集质量),并实现两种污染检测方法。
  7. 回答”评估是为了什么”:评估方法还是评估模型,以及”游戏规则”为什么必须说清楚。

0.2 先修知识

知识点用在哪里最低要求
第 1 讲第 2 节BPE 分词、压缩率
第 2、3 讲第 2 节交叉熵损失、困惑度的定义
第 10 讲第 2 节采样与生成;配套代码中训练好的模型
概率统计第 2.4、4 节置信区间、逻辑回归的直觉

0.3 本讲地图

第1节 什么是"好"?从抽象概念到具体指标
第2节 困惑度(以及"伪装的困惑度"、多项选择评估)
第3节 考试式基准
第4节 对话基准:成对比较、Elo、LLM 当评委
第5节 智能体基准
第6节 纯推理基准
第7节 安全基准
第8节 真实性与有效性:测试集污染、数据集质量
第9节 怎么看待评估

到目前为止,我们已经讲完了训练一个语言模型所需的一切(架构、训练、系统、规模化)。还缺的一块是:用什么数据训练?数据塑造了模型的行为(会写代码吗?懂多种语言吗?甚至懂 DNA?)。但在讨论数据之前,得先说清楚:**我们想要模型有什么样的行为?**这就是评估。


1. 什么是”好”?

评估看起来像是一个机械的过程:

  1. 准备一些提示词;
  2. 把提示词发给模型,拿回回答;
  3. 计算准确率。

但实际上,评估是一个深刻而重要的话题,它塑造着整个 AI 的发展方向——大家都在朝着被衡量的方向优化。

核心难题:抽象的概念 → 具体的指标。什么叫”好”?CS336 课上列出几种不同的答案:

  • 在各种基准上得分高(例如 Artificial Analysis 的综合排行);
  • 在基准上得分高而且运行便宜(性能 - 成本的权衡);
  • 人们更喜欢它的回答(Chatbot Arena 的偏好排行);
  • 人们实际选择使用它、为它付费(OpenRouter 的使用量排行)。

这些答案各有道理,也常常给出不同的排名。没有唯一正确的评估,要看你想衡量什么(第 9 节)。


2. 困惑度

2.1 定义与传统

语言模型是 token 序列上的概率分布 p(x)p(x)。困惑度

困惑度=(1p(D))1/∣D∣=2平均每个 token 的比特数\text{困惑度} = \left(\frac{1}{p(D)}\right)^{1/|D|} = 2^{\text{平均每个 token 的比特数}}

衡量 pp 给数据集 DD 分配的概率有多高。直觉:困惑度 = 模型平均在多少个选项之间犹豫。完全随机地猜 256 个字节,困惑度就是 256。

预训练就是在训练集上最小化困惑度,所以最自然的评估是测试集上的困惑度。传统的语言模型研究就是这样做的,标准数据集有 Penn Treebank(华尔街日报)、WikiText-103(维基百科)、One Billion Word Benchmark(来自机器翻译的新闻句子)。经典范式是分布内评估:在同一个数据集的训练部分上训练,在测试部分上评估。例如 2016 年,纯 CNN + LSTM 模型把 One Billion Word 上的困惑度从 51.3 降到了 30.0。

GPT-2 改变了范式:在 WebText(40 GB,来自 Reddit 链接的网页)上训练,然后零样本地在这些标准数据集上评估——这是分布外评估。它在小数据集(PTB)上效果更好,因为从大量数据中迁移的知识帮了忙;在大数据集(1BW)上则不如专门训练的模型。

2.2 “困惑度就是一切”?

一种(信念多于科学的)论证:

  • 真实分布是 tt,模型是 pp;
  • 最好的困惑度是 H(t)H(t),当且仅当 p=tp = t 时达到;
  • 如果 p=tp = t,那么所有任务都解决了:p(答案∣问题)p(\text{答案} \mid \text{问题});
  • 所以不断压低困惑度,最终就会”达到 AGI”。

另一面,困惑度也许管得太多了:例如 Stanford was founded in 1885,困惑度惩罚所有 token 的预测,其中有些(例如 founded)与我们关心的知识无关。解决办法:只计算条件困惑度 p(回答∣提示词)1/∣回答∣p(\text{回答} \mid \text{提示词})^{1/|\text{回答}|}。

2.3 亲手算:分词、条件困惑度、作弊

01_perplexity_bpb.py 在第 3 讲的合成故事上比较了几种模型(测试文本 18,206 字节):

模型token 数困惑度 / token比特 / 字节
字节级 1-gram18,20622.154.469
字节级 3-gram18,2062.951.559
字节级 5-gram18,2061.810.859
BPE(词表 512)3-gram5,8065.410.776
BPE(词表 1024)3-gram4,9727.240.780
第 10 讲的 Transformer(字节级)18,2051.110.154

第一个坑:分词不同,每 token 的困惑度没法比。BPE 模型的每 token 困惑度比字节级 5-gram 高得多,但它每个 token 包含好几个字节,要猜的东西更多。换算成每字节比特数(总比特数 ÷ 文本的字节数),不同分词方式就可以直接比较了:BPE(512)的 3-gram 反而比字节级 5-gram 好——它的上文(2 个 BPE token,约 6 个字节)更长。总比特数就是”用这个模型压缩这段文本需要多少比特”;分词只是模型的内部细节,文本的字节数才是公共的尺子(第 1 讲”压缩率”的另一面:好的语言模型就是好的压缩器)。

**第二个坑:整体困惑度会掩盖真正重要的部分。**在故事中”重复出现的名字”(需要回头看上文才能预测)上单独计算:

模型所有字节重复名字的字节其他字节
字节级 5-gram0.8592.8770.464
Transformer0.1540.0190.180

(单位:比特 / 字节。)重复名字只占 16% 的字节。整体上两个模型差 5.6 倍,在重复名字上却差 149 倍。

**第三个坑:排行榜作弊。**CS336 课上的警告:如果你运营一个困惑度排行榜,让参赛者提交模型、由你计算 log_prob = LM(测试数据),你必须相信(或检查)这些概率是合法的(和为 1)。一个”对任何字节都说概率是 1”的作弊模型,困惑度是完美的 1.00——但它在一个上下文上给 256 个字节的概率之和是 256。(对于下游任务,是 response = LM(prompt) 再根据回答算准确率,就没有这个问题。)

总结:困惑度依然被大量用于语言模型开发,因为它能得到平滑的规模定律;但我们仍然需要能反映真实场景的基准(为了”不信教的人”)。

2.4 “伪装的困惑度”:多项选择评估

有些基准其实就是伪装的困惑度:

  • LAMBADA(完形填空):预测一段话的最后一个词,只有读懂了上文才能猜对;
  • HellaSwag(多项选择的句子补全):比较几个候选结尾的条件概率。

对基座模型评估多项选择题的常用方法:把”题目 + 每个选项”分别送进模型,算出每个选项的对数似然,选最大的。02_multiple_choice.py 用合成故事造了两个小基准(各 300 道题,随机猜 25%):

  • 任务 A(名字完形填空):...said, "Can I play with you, ____,四个选项:正确的名字、故事里的另一个角色、两个没出现过的名字;
  • 任务 B(续写选择):四个候选结尾——正确的、两个名字对调的、另一个故事的、一个很短的通用结尾(例如 “They went home.”)。
模型A:总和A:按字节平均B:总和B:按字节平均
Transformer(看 256 字节)100%100%100%100%
窗口 MLP(看 8 字节)28%27%19%63%
字节级 5-gram26%29%10%26%

几个值得记住的细节:

  1. 打分方式很关键。任务 B 按对数似然的总和打分时,两个小模型大量选中那个很短的错误结尾(窗口 MLP 选了 214 次、5-gram 选了 175 次):对数似然是负数,项越少总和越高。按字节平均(长度归一化)消除了这个偏差。不同的评估框架用的归一化方式不同(按 token、按字节、按字符,或者不归一化),同一个模型的分数可能差很多——报告分数时必须说明打分方式。
  2. 看”选错了什么”:窗口 MLP 能分清”正确”和”名字对调”(结尾的第一个词就是上文刚出现的名字,在它的 8 字节窗口里),但常常选中其他故事的结尾;5-gram 连”正确”和”名字对调”都分不清。
  3. 随机水平不是”地板”:按总和打分时,两个小模型的准确率都比随机猜还低——有系统性偏好的”考生”可以比随机更差。
  4. 置信区间:300 道题时,准确率本身就有约 ±5% 的统计误差(代码用 Wilson 区间计算)。比较两个模型时,用配对自助法(按题目有放回地重采样)更灵敏:Transformer 在任务 A 上比 5-gram 高 70.3%,95% 区间 [+65.3%, +75.3%],差别显著;窗口 MLP 与 5-gram 在任务 A 上差 −2.7%,区间 [−9.0%, +3.7%] 包含 0,不能断定谁更好。

3. 考试式基准

考试是测试语言模型(和人一样)的好方法:可以控制科目和难度;题目设计成有明确的正确答案,容易评分。

MMLU(Massive Multitask Language Understanding,Hendrycks et al. 2021):

  • 57 个科目(数学、美国历史、法律、道德……),多项选择;
  • “由研究生和本科生从网上免费资源中收集”;
  • 尽管名字叫”语言理解”,它其实主要在测知识;
  • 最初用少样本提示在 GPT-3 上评估。

MMLU-Pro(2024):去掉了 MMLU 中有噪声或太简单的题目;选项从 4 个扩展到 10 个;用思维链(chain of thought)评估,给模型更多机会。模型的准确率下降了 16%~33%,不再那么”饱和”。

GPQA(Graduate-Level Google-Proof Q&A,2023):由 61 位在 Upwork 上招募的博士撰写。博士专家的准确率 65%;非专家即使花 30 分钟、可以用 Google,也只有 34%(“防 Google”);GPT-4 是 39%。

Humanity’s Last Exam(HLE,2025):2500 道题,多模态、覆盖很多学科,多项选择 + 简答。为出题人提供了 50 万美元的奖金池和论文署名;题目先经过前沿大模型的过滤(它们答不对的才保留),再经过多轮人工审核。

总结:

  • 趋势是题目越来越难:模型进步,旧基准”饱和”,就需要更难的新基准;
  • 多项选择的形式可以做得任意难;
  • 但它不能反映真实的使用:真实的请求是开放式的,未必有标准答案。

4. 对话基准:成对比较、Elo、LLM 当评委

4.1 开放式回答怎么评?

大多数人不会向 AI 助手问多项选择的考试题。例如:“我想做一道山羊奶酪甜菜沙拉,哪些香草搭配得好、哪些不好?“——怎么评估一个开放式的回答?

4.2 Chatbot Arena

数据收集(Chiang et al. 2024):互联网上的随机用户输入一个提示词,得到两个随机的匿名模型的回答,选出更好的那个。

排名:根据两两比较计算 Elo 评分。模型:

P(A 胜 B)=11+10(EloB−EloA)/400P(A \text{ 胜 } B) = \frac{1}{1 + 10^{(\text{Elo}_B - \text{Elo}_A)/400}}

拟合这个模型,使观察到的比较结果的概率最大(这就是 Bradley–Terry 模型的最大似然估计)。

特点:

  • 真实世界的提示词(用户免费使用,有动力真正去用它);
  • 但投票的是谁?有什么偏见?有没有刷票的?
  • 二选一的偏好把风格和正确性混在一起;
  • 人怎么判断回答是否正确?会不会偏爱讨好自己的回答(谄媚)?
  • 好处:不需要把同样的提示词发给所有模型(人来评分时这一点很重要);
  • 动态:可以不断加入新的提示词和新的模型。

03_arena_elo.py 用模拟数据演示:

  • 5000 场对战时,最大似然拟合很好地恢复了真实 Elo(95% 置信区间宽约 30 分)。国际象棋式的”逐场更新”结果随比赛顺序变化,而且整体被”压缩”了(它适合实力随时间变化的棋手,而不是固定不变的模型;Chatbot Arena 早期用它,后来改成了最大似然);
  • 只有 300 场对战时,置信区间宽 100 多分:Elo 相差 20 分的两个模型(1200 vs 1180),置信区间大量重叠。排行榜上相邻的名次常常在统计上无法区分。

4.3 LLM 当评委:AlpacaEval、WildBench

AlpacaEval(2023):805 条指令;指标是相对于基线模型(GPT-4 预览版)的胜率,由 GPT-4 预览版当评委(可能有偏见?)。问题:LLM 评委偏爱更长的回答,导致排行榜被”刷”。AlpacaEval 2.0 用回归去掉了这个偏差(“长度控制胜率”)。怎么评估这个指标本身?看它与 Chatbot Arena(人类)的相关性——很高。

WildBench(2024):从 100 万条人与聊天机器人的真实对话中挑出 1024 个例子;用 GPT-4 Turbo 当评委,并给评委一份检查清单(像是评委的”思维链”)。它与 Chatbot Arena 相关性很好——与 Arena 的相关性似乎成了事实上的”合理性检查”。

03_arena_elo.py 演示 3 模拟了评委的长度偏好:模型 E 的真实质量排第 5(Elo 1100),但回答平均长 3 倍。直接拟合时它被抬到了第 1(1331);在 Bradley–Terry 模型中加入”两个回答的长度差”这一项后,长度的影响被单独剥离出来(拟合出的长度系数 0.41,真实值 0.40),排名恢复正确。这就是长度控制 / 风格控制的思路。但它只能剥离你想到并测量了的风格因素。

总结:开放式回答的评估很难;对相似的回答做成对比较,信号更强;提防偏见(人类评委和 LLM 评委都有);检查清单 / 评分细则能提高可靠性(无论评委是人还是 LLM)。


5. 智能体基准

之前评估的是语言模型说什么(对话),现在评估它做什么(智能体)。

智能体 = 语言模型 + 智能体框架(scaffold:决定如何使用语言模型的逻辑)。任务需要使用工具(例如运行代码)、并在一段时间内反复迭代。

  • SWE-Bench(2023):来自 12 个 Python 仓库的 2294 个任务。给定代码库和一个 issue 描述,提交一个 PR;用单元测试评估;
  • Terminal-Bench:计算机终端环境,简单而通用。从 93 位贡献者那里众包了 229 个任务,其中 89 个组成了 Terminal-Bench 2.0;
  • CyBench(2024):40 个 CTF(夺旗赛)网络安全任务,用人类队伍的”首次解出时间”衡量难度;
  • MLE-Bench(2024):75 个 Kaggle 竞赛,需要训练模型、处理数据等。

智能体框架的常见要素:显式规划(维护一个待办清单,逐项勾掉);分层委派(智能体调用子智能体,保持上下文干净);持久记忆(读写文件);精细的上下文工程(更多关于流程的明确指令)。

总结:智能体大大扩展了语言模型的能力范围;框架非常重要;评估智能体 = 评估框架 + 语言模型(报告分数时要说清楚用的是什么框架)。


6. 纯推理基准

到目前为止的任务都需要语言知识和世界知识。能不能把推理从知识中分离出来?可以说,推理体现了更”纯粹”的智能(不只是记住事实)。

ARC-AGI:人类 100% 能解,但对 AI 很难;每个任务都是独特的,死记硬背没用。

  • ARC-AGI-1(2019):第一版,网格上的图案变换;
  • ARC-AGI-2(2025 年 3 月):更多多步推理;
  • 预训练语言模型在上面几乎没有进展;推理模型(o1、o3)出现后才开始起飞;
  • ARC-AGI-3(2026 年 3 月):交互式环境。

总结:目标是把推理与知识分开(很难做到);局限于人类水平的推理(不是超人的推理);清楚地暴露了当前模型的差距。


7. 安全基准

AI 的”安全”是什么意思?

  • HarmBench(2024):基于 510 种违反法律或社会规范的有害行为;
  • AIR-Bench(2024):基于监管框架和公司政策,分为 314 个风险类别、5694 个提示词;
  • 越狱:语言模型被训练成拒绝有害指令;但 GCG(Greedy Coordinate Gradient)能自动优化提示词绕过安全机制,而且从开放权重的模型(Llama)上找到的攻击能迁移到闭源模型(GPT-4)。

安全到底是什么?

  • 很多方面强烈依赖于情境(政治、法律、社会规范,因国家而异);
  • 风险多种多样:幻觉、谄媚、协助犯罪、加剧不平等、让人失去批判性思考……
  • 两用性:强大的网络安全智能体既可以用来入侵系统,也可以用来做渗透测试。

8. 真实性与有效性

8.1 生态效度:评估离真实使用有多远?

生态效度(ecological validity):一个评估在多大程度上反映了真实世界的使用?考试式基准(例如 GPQA)离真实使用很远;Chatbot Arena 的提示词来自真人,但分布不受控制。

  • GDPVal(OpenAI,2025):来自美国 GDP 排名前 9 的行业中的 44 种职业,任务由平均约 14 年经验的专业人士提供;
  • MedHELM(2025):以前的医学基准大多基于标准化考试;MedHELM 包含 121 个临床任务,来自 29 位临床医生,混合了私有和公开数据;
  • Clio(Anthropic,2024):用语言模型分析真实的用户数据,公开”人们在问什么”的总体模式。

遗憾的是,真实性和隐私有时是矛盾的。

8.2 测试集污染

怎么知道评估是有效的?首先是训练 - 测试重叠。机器学习第一课:不要在测试集上训练。基础模型之前(ImageNet、SQuAD)有明确的训练 / 测试划分;今天,模型在互联网上训练,而且开发者不告诉别人用了什么数据。CS336 课件列出四条路:

  1. 从模型推断:利用数据点的可交换性(Oren et al. 2023);
  2. 鼓励报告规范:例如报告置信区间;模型提供方应该报告训练 - 测试重叠;
  3. 用新鲜的评估:LiveCodeBench、UncheatableEval 等抓取新发布的网页(但时间戳也不总是可靠,旧内容可能被转载);
  4. 用私有评估:公司内部没有放到网上的代码库;你自己写的文字。在私有文本上测困惑度是最容易的。

04_contamination.py 造了一个小世界:200 道模板生成的算术应用题作为”基准”,2000 篇合成故事作为”训练数据”,其中偷偷混入了 90 道考题(原样 30 道、改格式 30 道、改写 30 道)。

方法一:n-gram 重叠(需要能访问训练数据)。把题目归一化(小写、去标点)后切成 nn 个词的片段,看训练数据里有没有出现过(GPT-3 用 13-gram):

nn原样泄露改格式泄露改写后泄露干净(误报)
5100%100%100%100%
8100%100%60%59%
13100%100%17%13%

nn 小时,同一个模板生成的题目共享很多短语,只要同模板的某道题泄露了,其他题都会被误报;nn 大时误报少了,但改写过的泄露几乎都漏掉了(nn = 13 时改写题的”检出率”17% 与干净题的误报率 13% 差不多,被”抓到”的只是碰巧与同模板的其他泄露题重合)。n-gram 检测抓不到语义上的泄露。

方法二:可交换性检验(只有模型、没有训练数据时)。基准中的题目本来是”可交换的”:换个顺序,还是同一个数据集。如果模型在训练时见过按原顺序排列的基准文件,就会记住”第 ii 题后面接着第 i+1i+1 题”,原顺序的似然会显著高于随机顺序。这是一个置换检验:p 值 = 随机顺序中似然不低于原顺序的比例。用字节级 6-gram 模型模拟”见过 / 没见过基准文件”的模型(99 种随机顺序):

训练数据p 值
干净0.61
含有按原顺序排列的基准文件0.01(可能的最小值)
含有基准,但顺序被打乱过0.23

一个实现上的小技巧:字节级 n-gram 模型中,只有每道题开头的几个字节的上文会跨过题目之间的边界,所以只需计算这些边界处的概率,一种顺序几毫秒就能算完。局限也很明显:泄露的版本顺序被打乱过,或者题目分散在不同的网页里,这个检验就无能为力。

8.3 数据集质量

基准本身也会有错:

  • OpenAI 修订 SWE-Bench,得到了经过人工验证的 SWE-Bench Verified;
  • 为基准创建”白金版”(Platinum):清理掉标注错误、有歧义的题目。在很多”饱和”的基准上,剩下的错误大多是题目本身的问题;
  • 智能体基准的问题:测试用例不充分;一个什么都不做的”平凡”智能体也能完成部分任务;
  • Docent:用大模型检查智能体的执行轨迹,发现基准中的问题。

9. 怎么看待评估

9.1 评估是为了什么?

没有唯一正确的评估,要看你想回答什么问题:

  1. 用户或公司要做购买决策(模型 A 还是模型 B),用于自己的场景(例如客服聊天机器人);
  2. 研究者想衡量模型的原始能力(例如”智能”);
  3. 我们想理解模型的收益和危害(出于商业和政策考虑);
  4. 模型开发者需要反馈来改进模型。

9.2 评估的是什么?

  • 基础模型之前,我们评估的是方法(标准化的训练 / 测试划分,大家用同样的数据比算法);
  • 今天,我们(大多)评估的是模型 / 系统(怎么做都行:数据、规模、框架都不限)。

也有例外,例如 nanoGPT speedrun:数据固定,比拼”达到某个验证损失需要多少时间”。评估方法能鼓励研究者做算法创新;评估模型 / 系统对下游用户有用。无论哪种,都必须说清楚游戏规则。


10. 本讲小结

  1. 没有唯一正确的评估;根据你想衡量什么来选择评估。
  2. 困惑度平滑、便宜,是模型开发的主力指标;比较不同分词方式时要用每字节比特数;条件困惑度聚焦于回答;排行榜要检查概率是否归一化。
  3. 多项选择评估:对数似然打分,注意长度归一化、置信区间、配对比较;看错误的类型。
  4. 考试(MMLU、GPQA、HLE)越来越难,但离真实使用远;对话评估用成对比较和 Elo,提防评委的偏见(长度、风格),用评分细则和长度控制;智能体评估的是”框架 + 模型”;纯推理(ARC-AGI)试图分离推理与知识;安全强烈依赖于情境。
  5. 真实性与有效性:生态效度;测试集污染(n-gram 重叠、可交换性检验、报告规范、新鲜评估、私有评估);基准本身的质量。
  6. 说清楚游戏规则:评估的是方法、模型还是智能体?考虑难度、真实性、有效性。

11. 与作业的关系

  • 作业 4(数据)的排行榜通常以验证集上的损失 / 困惑度为指标:你改进数据,模型的困惑度应该下降。本讲关于”按字节归一化”和”验证数据是否被污染”的讨论直接相关(第 14 讲还会讲数据去重与污染的关系);
  • **作业 5(对齐)**会评估模型在数学题(如 MATH、GSM8K)上的准确率,用程序检查最终答案;也可能涉及 MMLU、AlpacaEval 等基准。本讲的打分方式、置信区间、LLM 当评委的偏差都用得上;
  • 平时做实验时:给准确率加上置信区间,用配对比较判断两个改动的差别是不是噪声。

12. 练习

练习 1(困惑度与比特):一个模型在某段文本上的平均交叉熵是 2.1 nats / token(自然对数),这段文本有 1000 个 token、4200 个字节。(a) 困惑度是多少?(b) 每字节比特数是多少?

参考答案

(a) e2.1≈8.17e^{2.1} \approx 8.17。(b) 总比特数 = 1000×2.1/ln⁡2≈30301000 \times 2.1 / \ln 2 \approx 3030,除以 4200 字节 ≈ 0.72 比特 / 字节。

练习 2(为什么按字节):两个模型 A、B 用不同的分词器,A 在测试集上 3.0 比特 / token(平均每 token 4.5 字节),B 是 2.4 比特 / token(平均每 token 3.2 字节)。哪个模型更好?

参考答案

A:3.0 / 4.5 ≈ 0.667 比特 / 字节;B:2.4 / 3.2 = 0.75 比特 / 字节。A 更好——尽管它每 token 的比特数(困惑度)更高。

练习 3(长度归一化):一道多项选择题,正确选项有 20 个 token,平均每 token 对数概率 −0.5;错误选项有 4 个 token,平均每 token −1.5。按总和打分、按平均打分,各选哪个?

参考答案

总和:正确 −10,错误 −6 → 选错误的(短的)。平均:正确 −0.5,错误 −1.5 → 选正确的。这就是 02 号文件中”很短的结尾”被大量选中的原因。

练习 4(置信区间):一个模型在 200 道题上答对 150 道。用正态近似,95% 置信区间是多少?如果另一个模型在同样的题上答对 160 道,能说它更好吗?

参考答案

p=0.75p = 0.75,标准误 0.75×0.25/200≈0.031\sqrt{0.75 \times 0.25 / 200} \approx 0.031,区间约 [0.69, 0.81]。另一个模型 0.80,区间约 [0.74, 0.86],两个区间重叠。但重叠不等于不显著:更好的做法是配对比较——看两个模型在同一批题目上的差异(例如 02 号文件的配对自助法),因为题目难度对两者是共同的,配对能消除这部分噪声。

练习 5(Elo):两个模型的 Elo 分别是 1250 和 1150。(a) 前者的胜率是多少?(b) 要让胜率达到 90%,需要相差多少分?

参考答案

(a) 1/(1+10−100/400)≈0.641/(1 + 10^{-100/400}) \approx 0.64。(b) 10−Δ/400=1/910^{-\Delta/400} = 1/9,Δ=400log⁡109≈382\Delta = 400\log_{10}9 \approx 382 分。

练习 6(评委偏见):除了长度,LLM 评委还可能有哪些偏见?每一种偏见,你会怎么检测和缓解?

参考答案

例如:位置偏见(偏爱第一个或第二个回答)——交换顺序评两次取平均;自我偏好(偏爱与自己相似的模型)——用多个不同的评委;格式偏好(列表、markdown、粗体)——在回归中加入格式特征做”风格控制”;自信语气、谄媚——用评分细则要求先核对事实;检查评委与人类判断的相关性。

练习 7(污染检测):在 04 号文件的 n-gram 检测中,为什么 nn = 5 时干净的题目 100% 被误报?如果基准不是模板生成的(例如人工撰写的阅读理解),情况会有什么不同?

参考答案

模板生成的题目共享大量固定短语(例如 “how many pencils are left”),任何一道同模板的题泄露,这些短语就出现在训练数据中,所有同模板的题都会被匹配上。人工撰写的题目措辞多样,短 n-gram 与训练数据的偶然重合主要来自常见搭配,误报会少很多,但仍然需要足够大的 nn(并且最好要求重叠比例超过某个阈值,而不是”只要有一个 n-gram 重叠”)。

练习 8(评估方法 vs 评估模型)★:nanoGPT speedrun 规定了数据、比拼训练时间;Chatbot Arena 不限制任何东西。各举一个例子,说明哪种研究问题适合哪种评估。

参考答案

“新的优化器 / 架构是否更高效”适合 speedrun 式的”评估方法”:固定数据和目标,差异才能归因于方法。“我应该在客服产品里用哪个模型”适合”评估模型 / 系统”:用户关心的是最终效果,而不在乎它是靠数据、规模还是框架得来的。

练习 9(动手): (a) 在 02_multiple_choice.py 里加入”只用 50 道题”的评估,看置信区间和配对比较的结论怎么变。 (b) 在 03_arena_elo.py 里加入”位置偏见”(评委偏爱第一个回答),并在拟合中加入一个常数项来估计它。 (c) 在 04_contamination.py 里把检测规则改成”重叠的 n-gram 至少占题目 n-gram 的 50%“,重新计算检出率和误报率。


13. 延伸阅读

  • CS336 Spring 2026 Lecture 12(stanford-cs336/lectures 中的 lecture_12.py)。
  • Liang et al.,Holistic Evaluation of Language Models (HELM)(2022);HELM 网站上可以查看各种基准的逐题预测。
  • Hendrycks et al.,Measuring Massive Multitask Language Understanding (MMLU)(2021);Rein et al.,GPQA(2023);Phan et al.,Humanity’s Last Exam(2025)。
  • Chiang et al.,Chatbot Arena(2024);Dubois et al.,Length-Controlled AlpacaEval(2024);Lin et al.,WildBench(2024)。
  • Jimenez et al.,SWE-bench(2023);Chan et al.,MLE-bench(2024);Zhang et al.,Cybench(2024)。
  • Chollet,On the Measure of Intelligence(2019,ARC 的出发点)。
  • Mazeika et al.,HarmBench(2024);Zou et al.,Universal and Transferable Adversarial Attacks on Aligned Language Models(2023,GCG)。
  • Oren et al.,Proving Test Set Contamination in Black Box Language Models(2023);Zhang et al.,Language Model Developers Should Report Train-Test Overlap(2024)。

14. 下一讲预告

评估告诉我们”想要什么”。接下来两讲回答:“该用什么数据训练?”

CS336 的第一句话:**数据是训练语言模型时最需要做对的事。**可是各家公司公开了架构、甚至训练流程,却几乎不透露数据。下一讲(数据 I:来源与数据集)会讨论:

  • 常说”语言模型是在整个互联网上训练的”——这句话哪里不准确?爬虫怎么工作?为什么有那么多内容拿不到?
  • 版权与合理使用:哪些数据可以合法地用于训练?近几年的诉讼说明了什么?
  • Common Crawl、维基百科、GitHub、arXiv……从 BooksCorpus、WebText、C4、The Pile 到 RefinedWeb、FineWeb、DCLM、Nemotron-CC,数据集是怎么一步步演进的?
  • 我们会搭一个”迷你互联网”,亲手写爬虫、从 HTML 中抽取正文、识别语言。

下一讲之前,建议你:跑通 code/lecture12/ 下的 4 个脚本,完成练习 1、2、3、5。

← 返回课程目录