对应:Stanford CS329A Autumn 2025 Lecture 20(Fri 12/5,Future Research Areas)。课程主页没有列阅读材料,也没有公开幻灯片;期末项目 12/10 截止,12/12 是海报展示。这一讲没有对应的论文,内容是本套讲义自己的总结:前半部分把 16 讲的内容串起来,列出开放的研究问题;后半部分讲做这个领域的研究时最容易犯的错误和应对的方法,配合两个统计和实验设计的演示。不代表课堂的具体内容。 配套代码:
code/lecture17/(只用 Python 标准库,每个文件 2 秒以内) 预计阅读时间:2 小时(含运行代码)
0. 本讲导航
0.1 学完本讲,你应该能够
- 用一张图概括整门课:自我改进发生在输出(test-time)、权重(train-time)、系统的设计(open-ended)三个层次;每一层都依赖一个反馈信号,而验证的可靠性决定了上限。
- 说出至少五个开放的研究问题,并为每个问题写出一个具体、可检验的研究问题。
- 比较两个 agent 时,正确地使用配对检验、多次运行和置信区间;识别”在测试集上挑最好的”这种分叉小径。
- 设计计算量匹配的基线和消融实验,判断一个”新方法”的提升到底来自哪里。
- 说出写论文、做海报时的几个好习惯:一个核心信息、诚实的局限、可以复现。
0.2 本讲地图
第1节 回顾:整门课的一张图和十条经验
第2节 开放的研究问题
第3节 怎样做这个领域的研究:假设、统计、基线、消融 ← 代码 01、02
第4节 这套讲义自己的"反例":预想的叙事被实验推翻了多少次
第5–8节 小结、练习、延伸阅读、结语
0.3 本讲的代码
01_statistics.py:两个 agent 差 3 个百分点,不配对和配对的检验各有多大的机会检测出来;同一个 agent 跑 5 次差多少;20 个其实无效的”改进”在测试集上挑最好的会怎样。02_fair_baselines.py:一篇虚构的论文”Revise-and-Pick”,和 1 次生成比、和计算量相同的基线比、做消融,看提升从哪里来。
关于本讲的数字:模拟实验的数字都来自 01、02 号代码的实际输出(固定随机种子,Python 3.9 与 3.13 逐字相同)。
1. 回顾:整门课的一张图
1.1 三个层次,一个信号
| 层次 | 改进什么 | 方法 | 讲次 |
|---|---|---|---|
| test-time | 这一次的输出 | 重复采样、投票、best-of-N、修改、树搜索、检索、工具 | 第 2~5、8、10、12 讲 |
| train-time | 模型的权重 | STaR、RLVR / GRPO、agentic RL、后训练、测试时 RL | 第 6、9、13、16 讲 |
| open-ended | 系统的设计 | ADAS、DGM、AlphaEvolve、AI Scientist | 第 7 讲 |
| (不改权重的积累) | 可以复用的经验 | 记忆、技能库、档案、上下文学习 | 第 11、15 讲 |
每一层都需要一个反馈信号告诉系统”什么是更好”:标准答案、测试、编译器、verifier、奖励模型、人的偏好、Lean、真实世界的结果。第 3 讲的主题贯穿始终:信号有多可靠,自我改进就能走多远。
1.2 十条反复出现的经验
- 验证是骨架:可验证的领域(数学、代码)最先成功;不可验证的领域仍是前沿(第 3、10、12、13 讲)。
- generation–verification gap:自我改进有效的前提是”检查”比”生成”更可靠(第 1、3、12 讲)。没有外部反馈的自我纠正往往没用。
- 随机错误 vs 系统错误:多采样、投票只能消除随机错误;系统错误需要新的信息(第 1、2、12 讲)。
- coverage 和挑选是两回事:采样能覆盖正确答案,不代表能把它挑出来(第 2、8、10 讲)。
- 学习发生在能力的边界上:太容易、太难的题都没有学习信号(第 6、13 讲)。
- 多样性是搜索的燃料:温度、岛屿模型、开放式档案、种子提示(第 2、7、11 讲)。
- 奖励会被钻空子:只要优化一个代理指标,它就会被利用(第 7、9、14 讲)。
- 接口和模型一样重要:动作空间、反馈的形式、上下文(第 4、10、15 讲)。
- 计算量要匹配:比较方法时,要在相同的计算量下比较(第 1、2 讲;本讲第 3.3 节)。
- 评估决定了优化的方向(第 14 讲)。
2. 开放的研究问题
下面每个问题都给出:为什么重要、已知什么、一个具体的研究问题的例子。
2.1 不可验证领域的验证
- 为什么重要:第 12 讲 Denny Zhou 说下一个突破是”解决没有唯一可验证答案的任务”。写作、研究、设计、决策都属于这一类。
- 已知:LLM 评委有位置、长度、自我偏好等偏差(第 14 讲);按细则(rubric)打分、两两比较、辩论能部分缓解;人的偏好本身也有噪声(GDPval 的专家之间一致率 71%)。
- 例子:在研究综述任务上(第 14 讲 DeepScholar-Bench),把”可核查性”指标作为 RL 的奖励,会不会诱导模型只引用容易核查的文献、回避有争议但重要的工作?
2.2 长程的 credit assignment
- 为什么重要:METR 的时间跨度每 7 个月翻一倍(第 14 讲);任务越长,最后的成败越难归因到具体的某一步。
- 已知:过程奖励(PRM,第 3 讲)、价值函数和优势(第 6、16 讲)、把长任务拆成可验证的子任务(第 5 讲 ADaPT)。
- 例子:对一个 200 步的 coding agent 轨迹,能不能用”回放到某一步、换一个动作、再跑完”的反事实方法,自动找出导致失败的关键步骤?代价是多少?
2.3 持续学习与记忆
- 为什么重要:今天的 agent 每次都从零开始(第 15 讲);人在一个环境里工作越久越熟练。
- 已知:记忆系统(MemGPT)、技能库(Voyager)、上下文学习(Algorithm Distillation)、为语料训练小的 KV cache(Cartridges,第 11 讲)。都有遗忘、冲突、被污染的问题。
- 例子:一个 coding agent 把”这个代码库的约定”写进记忆,过了一个月代码库的约定变了。怎样检测并更新过时的记忆?
2.4 开放式自我改进的安全
- 为什么重要:会修改自己的系统(DGM,第 7 讲)、能在真实环境里行动的 agent(第 15 讲),一旦目标被钻空子,后果会被放大。
- 已知:沙盒、权限最小化、血统追踪、人工监督;监控推理过程(chain of thought)能发现一部分 reward hacking,但直接对它施加优化压力会让模型隐藏意图(第 9 讲)。
- 例子:在第 7 讲的 toy DGM 里加一个”可以修改评估器”的动作,什么样的选择规则能让档案里不出现钻空子的 agent?
2.5 高效的 test-time compute
- 为什么重要:推理模型思考得越来越长,成本越来越高;很多题根本不需要想那么久。
- 已知:按难度分配计算(第 2 讲)、自适应地停止、并行 vs 串行的取舍。
- 例子:能不能让模型在思考过程中估计”再想下去还能提高多少”,在边际收益低于成本时停止?怎样评估这个估计是否校准?
2.6 多 agent
- 为什么重要:复杂的工作需要分工(一个写代码、一个写测试、一个审查)。
- 已知:多 agent 辩论在相同的回答数下,未必比 self-consistency 好(第 12 讲 Huang et al.);CodeMonkeys 合并多个系统的价值来自”错得不一样”(第 10 讲)。
- 例子:什么条件下多个 agent 的分工真的比”一个 agent 用同样的计算量”更好?设计一个计算量匹配的对照实验。
2.7 从 benchmark 到真实世界
- 为什么重要:benchmark 的任务比真实工作”干净”(第 14 讲 METR 的外部效度讨论)。
- 例子:在一个真实的开源项目上,记录 agent 提交的 PR 被合并、被修改、被拒绝的比例,和它在 SWE-bench 上的分数相关吗?
2.8 物理世界和科学发现
- 机器人(第 16 讲):数据昂贵、每次尝试都有代价,怎样让自我改进在物理世界里也高效?
- 科学发现(第 7、13 讲):AlphaEvolve 和 AlphaProof 说明,在有可靠评估器的地方,AI 已经能做出新的发现。下一步是评估器更弱、更慢的领域(实验科学)。
3. 怎样做这个领域的研究
3.1 提出可检验的假设
不好的研究问题:“我们的 agent 更好。” 好的研究问题:**在什么条件下,什么机制,会让什么指标怎样变化,为什么。**例如:“在 verifier 的召回率低于 70% 时,weighted best-of-N 比 best-of-N 更稳健,因为它利用了答案出现的次数。”
一个好习惯:跑实验之前,先写下你的预测。本套讲义的每一讲都这样做了,而结果经常和预测不同(第 4 节)——这正是实验的价值所在。
3.2 统计:差别是真的吗?
01 号代码的设定:两个 agent 在同一批题上各跑一次,B 的真实成功率比 A 高 2.8 个百分点;题目难度差别很大。
演示 1:检出率(400 次模拟评估中,|z| > 1.96 的比例):
| 题数 | 不配对的检验 | 配对的检验(McNemar) | A = B 时配对检验的误报率 |
|---|---|---|---|
| 100 | 0.013 | 0.100 | 0.045 |
| 300 | 0.040 | 0.180 | 0.065 |
| 1000 | 0.140 | 0.438 | 0.062 |
| 3000 | 0.665 | 0.915 | 0.035 |
- 配对检验的检出率高得多(1000 道题:44% vs 14%)。原因:题目难度的差别是两个 agent 共有的——难题都错,易题都对——配对检验只看”结果不同”的题,把共有的部分抵消了。比较两个 agent,一定要在同一批题上跑,并用配对的方法。
- 配对检验的误报率在 5% 附近,它没有因为更灵敏而”乱报”。
- 即使用对了方法,几百道题的 benchmark 上差 2~3 个点的结论也常常检测不出来。
演示 2:同一个 agent、同一套 200 道题,跑 5 次:成功率 0.570、0.545、0.565、0.575、0.575,最高和最低相差 3 个百分点。什么都没改,分数就会波动。报告多次运行的平均和标准差。
演示 3:分叉小径的花园(garden of forking paths):20 个”改进”其实和基线一模一样。
| 做法 | 平均”提升” | “显著”的比例 |
|---|---|---|
| 在测试集上挑最好的那个报告 | +4.4 个百分点 | 23% |
| 在验证集上挑、在测试集上报告 | −0.2 个百分点 | — |
试的东西越多,越容易在噪声里找到一个看起来好的。调提示词、调超参数、挑 checkpoint,都应该在验证集上做;测试集只在最后看一次。
3.3 计算量匹配的基线
02 号代码:一篇虚构的论文 Revise-and-Pick——先回答,再修改两次,最后用 verifier 从三个版本里挑一个(共 3 次生成)。toy world 是第 1、2 讲的 10B 模型和 500 道题。
| 对照 | 生成次数 | 准确率 | Revise-and-Pick 的优势(配对 bootstrap 95% 区间) |
|---|---|---|---|
| 直接回答——论文的基线 | 1 | 0.522 | +17.8 点 [+14.2, +21.8] |
| 3 个样本多数投票 | 3 | 0.618 | +8.2 点 [+3.4, +13.0] |
| 3 个样本 + verifier(best-of-3) | 3 | 0.624 | +7.6 点 [+3.2, +12.0] |
| weighted best-of-3 | 3 | 0.658 | +4.2 点 [+0.0, +8.6] |
| 消融:只修改,不用 verifier | 3 | 0.706 | −0.6 点 [−4.2, +3.0] |
(Revise-and-Pick 本身:0.700。)
- 和论文选的基线比,高了将近 18 个点。
- 换成计算量相同的基线,优势缩小到 4~8 个点——一半以上的”提升”只是因为多用了计算。和最强的同等计算基线比,区间的下限已经碰到 0。
- 第 1、2 讲反复强调过这一点:test-time compute 本身就会带来提升,任何多用了计算的方法,都要和”同样多的计算、最简单的用法”比。
3.4 消融
同一张表的最后一行:去掉 verifier,准确率不降反升(区间包含 0)。Revise-and-Pick 的全部提升来自”修改”(第 2 讲:低温复查能修好手滑),“挑选”没有贡献。论文的标题和叙事都应该改写。
消融的原则:每个组件都要单独拿掉试一次;如果一个组件拿掉之后没有变化,就不要把它写进方法的卖点里。
3.5 其他好习惯
- 检查 oracle 泄漏:有没有在不经意间用到了标准答案?(第 12 讲:用标准答案决定”什么时候停止自我纠正”。)
- 读轨迹,而不只是看分数:agent 是不是在钻评估的空子?(第 9、10、14 讲)
- 先做小的 toy 实验:本套讲义的每个演示都是一个 toy world,几秒钟就能跑完,可以快速检验直觉;但要清楚 toy 的结论依赖哪些设定。
- 画 scaling 曲线:一个方法在小计算量下好,在大计算量下可能被简单的方法追上(第 2 讲)。报告曲线,而不只是一个点。
- 报告成本:token 数、生成次数、美元、墙钟时间。
- 可以复现:固定随机种子,记录模型版本、提示词、超参数;公开代码。本套讲义的代码在 Python 3.9 和 3.13 上逐字相同,就是为了这一点。
- 报告负面结果:哪些想法没有用,同样有价值。
3.6 写论文和做海报
- 一个核心信息:读者(或者走过海报的人)30 秒内应该知道”你发现了什么”。
- 先画最重要的那张图:通常是”计算量 vs 性能”或者”你的方法 vs 计算量匹配的基线”。
- 诚实的局限:在哪些设定下没有效?用了哪些假设?(本套讲义每个代码 README 的”关于实验结果”就是这样写的。)
- 和已有工作的关系:你的方法是在哪一个层次(第 1.1 节的表)、用哪一种信号改进的?
4. 这套讲义自己的”反例”
本套讲义编写时,几乎每一讲都有”预想的叙事被实验推翻”的情况。下面是一部分(详见各讲代码 README 的”关于实验结果”):
| 讲次 | 预想 | 实际 |
|---|---|---|
| 第 2 讲 | 贪心解码作为基线 | toy 里的贪心解码不现实地强(所有错误都是采样噪声),之后统一用 temperature 0.7 |
| 第 7 讲 | 演化能找到比 Best Fit 更好的装箱规则 | 均匀分布下找不到;换成 Weibull 分布、扩大程序空间才有提升 |
| 第 10 讲 | 模型自己写的测试投票好于随机 | 迭代修改之后,测试和修复错得一样,投票反而不如随机 |
| 第 11 讲 | MemGPT 在任何长度上都好于递归摘要 | 没有内存压力警告时,中等长度上不如递归摘要 |
| 第 12 讲 | 内在自我纠正会让准确率下降 | 400 道题时反而略升;分析发现期望效果恰好为 0,结果是噪声;要加入”被暗示有问题”的偏差、2000 道题才稳定 |
| 第 14 讲 | 自己写的牛顿法能拟合逻辑斯蒂回归 | 没有步长控制时发散,估计出完全错误的时间跨度 |
| 第 15 讲 | “拿不准时问人”能提高成功率 | 在简单的模型里和”自己重做”几乎一样,只是多花了人的时间 |
| 第 17 讲 | Revise-and-Pick 的 verifier 有贡献 | 消融显示没有 |
这些”反例”有两个用处:第一,它们本身就是对概念更深的理解(例如第 12 讲:自我纠正的期望效果为什么恰好是 0);第二,它们说明直觉需要实验检验,而实验需要正确的统计。
5. 小结
- 整门课的自我改进发生在三个层次(输出、权重、系统设计),外加不改权重的经验积累;每一层都依赖反馈信号,信号的可靠性决定上限。
- 十条反复出现的经验:验证是骨架;generation–verification gap;随机 vs 系统错误;coverage 和挑选不同;学习在边界上;多样性;奖励会被钻空子;接口重要;计算量要匹配;评估决定优化方向。
- 开放问题:不可验证领域的验证、长程 credit assignment、持续学习、开放式自我改进的安全、高效的 test-time compute、多 agent、从 benchmark 到真实世界、物理世界与科学发现。
- 研究方法:可检验的假设;配对检验(toy:1000 道题上检出率 44% vs 14%);多次运行(同一个 agent 5 次差 3 个点);在验证集上挑、在测试集上报告(toy:在测试集上挑会制造 +4.4 点的虚假提升);计算量匹配的基线(toy:+17.8 点缩小到 +4~8 点);消融(toy:verifier 没有贡献)。
- 写作:一个核心信息、最重要的那张图、诚实的局限、可以复现。
6. 练习
1. 配对还是不配对(第 3.2 节) (a) 用自己的话解释:为什么配对检验在”题目难度差别很大”时优势最明显? (b) 如果两个 agent 在每道题上的成败完全独立(和题目无关),配对检验还有优势吗?
参考答案
(a) 题目难度差别大时,大部分题要么两个都对、要么两个都错,这部分对比较没有信息,却在不配对的检验里贡献了大量的方差。配对检验只看结果不同的题,去掉了这部分方差。 (b) 没有明显的优势:两个 agent 的结果不相关时,配对和不配对的方差差不多。配对检验的好处来自正相关。
2. 需要多少道题(第 3.2 节) 用 01 号代码的设定,大约需要多少道题,配对检验才有 80% 的把握检测出 2.8 个百分点的差别?改代码试一试。
3. 分叉小径(第 3.2 节) (a) 你试了 20 个提示词,在测试集上挑了最好的,比基线高 4 个点。审稿人会提出什么问题? (b) 如果没有单独的验证集,还有什么补救办法?
参考答案
(a) 这 4 个点有多少是”挑选”带来的?其他 19 个提示词的结果是多少?在新的数据上还能保持吗? (b) 例如:把测试集分成两半,一半挑、一半报告;报告所有 20 个提示词的结果分布,而不只是最好的那个;对”挑最好的”做多重比较校正(例如 Bonferroni);或者在一个新的、独立的数据集上复现。
4. 计算量匹配(第 3.3 节) (a) 为什么”3 个样本多数投票”是 Revise-and-Pick 的公平基线,“1 次生成”不是? (b) 计算量只按”生成次数”算公平吗?还有哪些成本要考虑?(提示:修改需要读入之前的回答;verifier 的调用;延迟。)
参考答案
(a) Revise-and-Pick 用了 3 次生成。任何用 3 次生成的方法都会因为”多用了计算”而提升(第 2 讲);只有和同样用了 3 次生成的简单方法比,才能说明它的用法更好。 (b) 不完全公平。修改要把之前的回答放进上下文(更多的输入 token);verifier 本身也有成本;串行的修改延迟更高(3 次生成必须一个接一个),而并行的 3 个样本可以同时生成。更好的做法是按 token 数或 FLOPs 匹配,并分别报告延迟。
5. 设计一个消融(第 3.4 节) 你的方法有三个组件:(i) 检索、(ii) 自我修改、(iii) 多数投票。设计一组消融实验(列出每个对照的组成),并说明你怎样判断每个组件的贡献。组件之间有交互作用时怎么办?
6. 写一个研究计划(第 2 节) 从第 2 节里选一个开放问题,写一页的研究计划:假设、toy 实验、真实实验、计算量匹配的基线、消融、预期的结果和”如果结果相反,说明什么”。
7. 动手改代码
(a) 01 号代码:把 THETA_SD 改回 1.5(题目难度差别较小),配对检验的优势还剩多少?和练习 1(a) 的结论一致吗?
(b) 02 号代码:把 verifier 的 SIGNAL 从 1.0 改成 3.0(一个强的 verifier),消融的结论会变吗?
7. 延伸阅读
实验方法与统计
- Dror et al. 2018. The Hitchhiker’s Guide to Testing Statistical Significance in Natural Language Processing.
- Bouthillier et al. 2021. Accounting for Variance in Machine Learning Benchmarks.
- Gelman & Loken 2013. The Garden of Forking Paths.
- Miller 2024. Adding Error Bars to Evals: A Statistical Approach to Language Model Evaluations.
- Henderson et al. 2018. Deep Reinforcement Learning that Matters.(随机种子与可复现性)
回顾本课程的关键论文:各讲的”延伸阅读”一节。
8. 结语
这门课从一个问题开始:AI agent 能不能通过与自己、与环境的交互不断变好? 16 讲之后,答案是:在有可靠反馈的地方,已经可以——多采样、验证、搜索让一次的输出更好;从自己验证过的输出里学习让模型更强;演化和档案让系统的设计本身变好;在数学、代码、甚至机器人上,都出现了超过人类示范的结果。
但每一种自我改进都建立在一个反馈信号上,而信号有多可靠、能不能被钻空子、代价有多大,决定了它能走多远。下一阶段的问题——不可验证的任务、长程的任务、持续的学习、物理的世界、安全的自主——本质上都是”怎样得到更好的反馈信号”的问题。
最后,一个贯穿本套讲义的习惯:先写下预测,再跑实验;结果和预测不同时,相信实验,改写叙事。