Skip to content

第一讲 — 为什么手动迭代会失败

[ 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

观察输出,思考这些问题:

  1. 手动策略和网格策略,哪个更快找到最优解?差距有多大?
  2. 如果把 BUDGET = 20 改成 BUDGET = 5,结论变了吗?
  3. 你自己的研究项目里,"指标"是什么?能被一行 Python 计算出来吗?
  4. 试着写出你的第一个 research.md — 只需要三行:目标、指标、方向。

下一讲第二讲 — 什么是可测量的研究目标