第一讲 — 为什么手动迭代会失败
[ L01 ] L02 > L03 > L04 > L05 > L06 | L07 > L08 > L09 > L10 > L11 > L12
"你在睡觉,实验也在跑。" — 手动迭代的瓶颈是你本人,不是模型。
本讲核心:理解为什么循环比研究员更快,以及让它成为可能的三个原则。
代码示例:code/
配套项目:项目一 — 你的第一个研究循环
问题
手动研究的瓶颈是人的注意力。你睡觉时实验停了,你开会时实验停了,你需要手动回滚时你往往不回滚。每天顶多 3–5 次实验,通常只有 1–2 次。
三个致命缺陷:
注意力是瓶颈。 你不在,循环就停。研究速度被你的日历所限制。
手动回滚太慢。 实验变差时,研究员往往不回滚——坏状态在代码库里积累。
主观判断污染结果。 "这看起来有希望"不是指标。没有机械评估,感觉良好的实验会被保留,即使它根本没有改进目标。
解决方案
+----------+ +------------+ +----------+
| 改一处 | ---> | 运行评估 | ---> | 比分数 |
| 代码 | | python | | 更好? |
+----------+ | evaluate.py| +----+-----+
+------------+ |
^ 是 → git commit (保留)
| 否 → git revert (丢弃)
+-------------+
(循环直到达到目标或预算耗尽)一个数字、一个方向、自动回滚。这就是 Karpathy 的 autoresearch 脚本的全部秘密。
工作原理
2025 年,Andrej Karpathy 发布了一个 630 行的脚本,能在一夜之间无人值守地运行 100 次 ML 实验。它体现了三个原则:
1. 一个指标,一个方向。
Metric: val_bpb # 验证集每字节比特数
Direction: minimize # 越低越好不是"模型质量",不是"训练稳定性"——就一个数字。每个决策都归结为:这个改变让 val_bpb 降低了吗?
2. 受约束的范围。
Scope: train.py only # 只能修改这一个文件agent 不能碰数据准备、分词器或评估代码。每次失败都是可隔离的:出了问题,一定在 train.py 里。
3. 机械验证 + 自动回滚。
bash
# 每次迭代
python evaluate.py # 运行恰好 5 分钟
git commit # 先提交
# 如果分数变差:
git revert HEAD # 自动撤销,没有手动清理结果是一个每晚都在复利的系统。失败被自动遗忘,成功被永久记录在 git 历史里。
关键概念
| 概念 | 含义 |
|---|---|
| 自主研究循环 | 修改→验证→保留/丢弃→重复,无需人工介入 |
| 机械指标 | 可自动计算的数字,有明确方向(高/低更好) |
| 保留策略 | 决定保留还是丢弃改变的规则,最常用:score_improvement |
| 自动回滚 | 分数变差时 git revert 自动恢复,失败实验保存在历史里但不影响代码 |
| 有界 vs 无界 | 有界:跑恰好 N 次;无界:跑到达到目标指标或用户中断 |
试一试
运行代码示例,亲眼看到手动策略 vs 系统性策略的差距:
sh
cd docs/zh/lectures/lecture-01-why-manual-iteration-fails/code
python manual_vs_systematic.py观察输出,思考这些问题:
- 手动策略和网格策略,哪个更快找到最优解?差距有多大?
- 如果把
BUDGET = 20改成BUDGET = 5,结论变了吗? - 你自己的研究项目里,"指标"是什么?能被一行 Python 计算出来吗?
- 试着写出你的第一个
research.md— 只需要三行:目标、指标、方向。