第 17 讲:未来的研究方向与研究方法

Self-Improving AI Agents · Lecture 17。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

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

本篇目录

对应: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 学完本讲,你应该能够

  1. 用一张图概括整门课:自我改进发生在输出(test-time)、权重(train-time)、系统的设计(open-ended)三个层次;每一层都依赖一个反馈信号,而验证的可靠性决定了上限。
  2. 说出至少五个开放的研究问题,并为每个问题写出一个具体、可检验的研究问题。
  3. 比较两个 agent 时,正确地使用配对检验、多次运行和置信区间;识别”在测试集上挑最好的”这种分叉小径。
  4. 设计计算量匹配的基线和消融实验,判断一个”新方法”的提升到底来自哪里。
  5. 说出写论文、做海报时的几个好习惯:一个核心信息、诚实的局限、可以复现。

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 十条反复出现的经验

  1. 验证是骨架:可验证的领域(数学、代码)最先成功;不可验证的领域仍是前沿(第 3、10、12、13 讲)。
  2. generation–verification gap:自我改进有效的前提是”检查”比”生成”更可靠(第 1、3、12 讲)。没有外部反馈的自我纠正往往没用。
  3. 随机错误 vs 系统错误:多采样、投票只能消除随机错误;系统错误需要新的信息(第 1、2、12 讲)。
  4. coverage 和挑选是两回事:采样能覆盖正确答案,不代表能把它挑出来(第 2、8、10 讲)。
  5. 学习发生在能力的边界上:太容易、太难的题都没有学习信号(第 6、13 讲)。
  6. 多样性是搜索的燃料:温度、岛屿模型、开放式档案、种子提示(第 2、7、11 讲)。
  7. 奖励会被钻空子:只要优化一个代理指标,它就会被利用(第 7、9、14 讲)。
  8. 接口和模型一样重要:动作空间、反馈的形式、上下文(第 4、10、15 讲)。
  9. 计算量要匹配:比较方法时,要在相同的计算量下比较(第 1、2 讲;本讲第 3.3 节)。
  10. 评估决定了优化的方向(第 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 时配对检验的误报率
1000.0130.1000.045
3000.0400.1800.065
10000.1400.4380.062
30000.6650.9150.035
  1. 配对检验的检出率高得多(1000 道题:44% vs 14%)。原因:题目难度的差别是两个 agent 共有的——难题都错,易题都对——配对检验只看”结果不同”的题,把共有的部分抵消了。比较两个 agent,一定要在同一批题上跑,并用配对的方法。
  2. 配对检验的误报率在 5% 附近,它没有因为更灵敏而”乱报”。
  3. 即使用对了方法,几百道题的 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% 区间)
直接回答——论文的基线10.522+17.8 点 [+14.2, +21.8]
3 个样本多数投票30.618+8.2 点 [+3.4, +13.0]
3 个样本 + verifier(best-of-3)30.624+7.6 点 [+3.2, +12.0]
weighted best-of-330.658+4.2 点 [+0.0, +8.6]
消融:只修改,不用 verifier30.706−0.6 点 [−4.2, +3.0]

(Revise-and-Pick 本身:0.700。)

  1. 和论文选的基线比,高了将近 18 个点。
  2. 换成计算量相同的基线,优势缩小到 4~8 个点——一半以上的”提升”只是因为多用了计算。和最强的同等计算基线比,区间的下限已经碰到 0。
  3. 第 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. 小结

  1. 整门课的自我改进发生在三个层次(输出、权重、系统设计),外加不改权重的经验积累;每一层都依赖反馈信号,信号的可靠性决定上限。
  2. 十条反复出现的经验:验证是骨架;generation–verification gap;随机 vs 系统错误;coverage 和挑选不同;学习在边界上;多样性;奖励会被钻空子;接口重要;计算量要匹配;评估决定优化方向。
  3. 开放问题:不可验证领域的验证、长程 credit assignment、持续学习、开放式自我改进的安全、高效的 test-time compute、多 agent、从 benchmark 到真实世界、物理世界与科学发现。
  4. 研究方法:可检验的假设;配对检验(toy:1000 道题上检出率 44% vs 14%);多次运行(同一个 agent 5 次差 3 个点);在验证集上挑、在测试集上报告(toy:在测试集上挑会制造 +4.4 点的虚假提升);计算量匹配的基线(toy:+17.8 点缩小到 +4~8 点);消融(toy:verifier 没有贡献)。
  5. 写作:一个核心信息、最重要的那张图、诚实的局限、可以复现。

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 讲之后,答案是:在有可靠反馈的地方,已经可以——多采样、验证、搜索让一次的输出更好;从自己验证过的输出里学习让模型更强;演化和档案让系统的设计本身变好;在数学、代码、甚至机器人上,都出现了超过人类示范的结果。

但每一种自我改进都建立在一个反馈信号上,而信号有多可靠、能不能被钻空子、代价有多大,决定了它能走多远。下一阶段的问题——不可验证的任务、长程的任务、持续的学习、物理的世界、安全的自主——本质上都是”怎样得到更好的反馈信号”的问题。

最后,一个贯穿本套讲义的习惯:先写下预测,再跑实验;结果和预测不同时,相信实验,改写叙事。

← 返回课程目录