AutoResearch 技术原理报告
Andrej Karpathy 设计的自主 ML 研究智能体系统——让 AI 在一夜之间独立完成约 100 次机器学习实验,自动发现模型优化策略。
1. 项目概览
AutoResearch 是 Andrej Karpathy(OpenAI 联合创始人、前特斯拉 AI 负责人)于 2026 年 3 月开源的自主机器学习研究框架。其核心理念极其简洁:给 AI 编码智能体一个 Python 训练脚本,让它自主修改代码、运行 5 分钟实验、评估结果,并无限循环。
工作流一句话描述
AI 智能体读取 program.md 中的研究指令 → 对 train.py 做一次针对性修改 → 执行 uv run train.py(精确 5 分钟)→ 从日志中提取 val_bpb 指标 → 若指标改善则保留(git commit),否则回滚(git reset)→ 记录结果 → 无限重复。
2. 整体架构
autoresearch/ ├── prepare.py # 数据准备 + 评估函数(智能体不可修改) ├── train.py # 训练脚本(智能体的完整实验场所,~630 行) ├── program.md # 自然语言研究指令(智能体的"操作手册") ├── results.tsv # 实验日志(Tab 分隔) ├── run.log # 最近一次训练的原始输出 ├── analysis.ipynb # 实验进展可视化 ├── pyproject.toml # uv 包管理配置 └── .python-version # Python 版本锁定
3. prepare.py — 数据准备与评估
prepare.py 是整个系统的不可变基础设施。智能体只能读取它,不能修改它。这确保了跨实验的评估一致性。
特殊 Token 设计
| Token | 用途 |
|---|---|
<|reserved_0|> | BOS(序列开始)token |
<|reserved_1|> | 预留扩展 |
<|reserved_2|> | 预留扩展 |
<|reserved_3|> | 预留扩展 |
关键设计决策:为何使用 \p{N}{1,2} 而非 {1,3}?
GPT-4 原始正则使用 {1,3} 来处理数字序列,AutoResearch 改为 {1,2}。这使得数字的词元粒度更细,有助于模型更好地学习数值模式,同时减少因超长数字序列造成的词汇碎片化。
4. train.py — 训练脚本(智能体实验场所)
train.py 是整个系统的可变核心,智能体可以修改其中的任何部分。它被刻意设计为约 630 行,确保能完整放入 LLM 的上下文窗口中,让智能体一次性理解整个训练逻辑。
基准模型配置
# 模型超参数(智能体可修改)
ASPECT_RATIO = 96 # 决定模型维度的基础比例
model_dim = 8 * 96 # = 768(embedding 维度)
num_layers = 8 # Transformer 层数
vocab_size = 8192 # BPE 词汇量(与 prepare.py 一致)
# 训练时间预算(固定不变)
TRAINING_SECONDS = 300 # 精确 5 分钟(wall-clock 时间)
可修改范围
训练输出格式(run.log)
--- val_bpb: 0.997900 training_seconds: 300.1 total_seconds: 325.9
peak_vram_mb: 45060.2 mfu_percent: 39.80 total_tokens_M: 499.6 num_steps: 95
| 字段 | 含义 | 优化方向 |
|---|---|---|
val_bpb | 验证集每字节比特数(核心指标) | 越低越好 |
training_seconds | 纯训练耗时(约 300s) | 固定约束 |
total_seconds | 含启动/编译的总耗时 | 参考 |
peak_vram_mb | 峰值显存占用 (MB) | 不超 GPU 容量 |
mfu_percent | 模型 FLOPs 利用率 (%) | 越高越好 |
total_tokens_M | 处理的 token 总量(百万) | 参考效率 |
num_steps | 完成的训练步数 | 参考 |
5. program.md — 智能体研究指令
program.md 是整个系统最具创意的组件。它是一个 Markdown 文件,用自然语言定义了智能体的完整研究方法论。没有 YAML 配置、没有 Python 函数调用、没有状态机——只有经过精心设计的文字说明。
program.md 核心指令结构
uv run train.py,从 run.log 中提取 val_bpb 指标关键行为约束
program.md 的隐式规则:
DO:
- 每次只做一个聚焦的代码修改
- 保持 val_bpb 指标单调递减(棘轮机制)
- 记录每个实验的 commit hash、状态、描述
- 无限运行直到人工停止
DON'T:
- 修改 prepare.py 或 evaluate_bpb() 函数
- 暂停询问"应该继续吗?"
- 在一次实验中做多个不相关的修改
- 超出 5 分钟训练时间预算
6. 评估指标:val_bpb(每字节比特数)
val_bpb(Validation Bits Per Byte)是 AutoResearch 的唯一优化目标,也是整个自主研究循环的"北极星"指标。
为什么选择 val_bpb 而非 perplexity?
评估配置
# prepare.py 中的核心常量
EVAL_TOKENS = 20_971_520 # 约 2090 万个验证 token(固定)
def evaluate_bpb(model, device) -> float:
"""计算验证集上的 bits-per-byte,此函数不可被智能体修改"""
total_nats = 0.0
total_bytes = 0
for tokens in eval_dataloader():
logits = model(tokens[:-1]) # 前向传播
nats = cross_entropy(logits, tokens[1:]) # 交叉熵(自然底数)
bytes_ = byte_count_tensor[tokens[1:]].sum() # 对应字节数
total_nats += nats * len(tokens)
total_bytes += bytes_
return total_nats / (math.log(2) * total_bytes)
7. 优化器策略:Muon + AdamW 混合方案
AutoResearch 的默认优化器配置采用针对 Transformer 不同参数组的分层优化策略,这是 AutoResearch 一个重要的技术选择。
| 优化器 | 作用参数 | 核心特性 | 选择理由 |
|---|---|---|---|
| Muon | Transformer 所有隐层权重矩阵(QKV、FFN、投影层) | 基于正交更新的优化算法,由 Keller Jordan 提出 | 对隐层权重收敛更快、更稳定,经验上优于 AdamW |
| AdamW | Embedding 层、分类头、LayerNorm 参数 | 带权重衰减的自适应矩估计,经典优化器 | 非矩阵参数不适合 Muon 的正交约束,AdamW 更稳健 |
学习率调度:余弦退火 + 线性预热
def get_lr(step: int) -> float:
# 阶段 1:线性预热(前 warmup_steps 步)
if step < warmup_steps:
return lr_peak * (step / warmup_steps)
# 阶段 2:余弦退火(预热之后)
progress = (step - warmup_steps) / (total_steps - warmup_steps)
cosine = 0.5 * (1 + math.cos(math.pi * progress))
return lr_min + (lr_peak - lr_min) * cosine
智能体可探索的优化器变体
- 调整 Muon 的动量参数(
momentum) - 修改 AdamW 的
beta1、beta2、weight_decay - 尝试不同的学习率预热长度(5%–15% 总步数)
- 探索梯度裁剪阈值
- 引入新的优化器(SOAP、Lion、schedule-free Adam 等)
8. 实验循环逻辑
决策门控机制
# 伪代码:AutoResearch 实验循环核心逻辑
best_val_bpb = float('inf')
while True:
# Step 1: 智能体提出假设并修改代码
experiment_description = agent.propose_experiment(
results_history=read_tsv('results.tsv'),
current_code=read('train.py')
)
agent.modify('train.py')
# Step 2: 提交代码变更
commit_hash = git_commit(f"experiment: {experiment_description}")
# Step 3: 运行训练(精确 5 分钟)
try:
run("uv run train.py")
val_bpb = parse_val_bpb('run.log')
status = "crash" if val_bpb is None else "keep" if val_bpb < best_val_bpb else "discard"
except Exception:
val_bpb, status = 0.0, "crash"
# Step 4: 棘轮机制
if status == "keep":
best_val_bpb = val_bpb # 更新最佳值
else:
git_reset("HEAD~1") # 回滚代码
# Step 5: 记录实验
append_tsv('results.tsv', {
'commit': commit_hash, 'val_bpb': val_bpb,
'status': status, 'description': experiment_description
})
results.tsv 格式
commit val_bpb memory_gb status description
a1b2c3d 0.997900 44.0 keep baseline
b2c3d4e 0.993200 44.2 keep increase peak LR to 0.04
c3d4e5f 1.005000 44.0 discard switch hidden activation to GeLU
d4e5f6g 0.000000 0.0 crash double model width (OOM error)
e5f6g7h 0.991800 43.9 keep add cosine LR warmup 200 steps
棘轮机制:为何能保证单调改进?
"棘轮(Ratchet)"机制是 AutoResearch 可靠运行的核心保障:
- Git 历史 只包含成功(keep)的实验,main 分支始终指向迄今最优代码
- val_bpb 单调递减:每次保留的实验必须比前一个最优值更低
- 崩溃安全:即使训练出现 OOM 或其他错误,git reset 确保代码干净回滚
- 中断恢复:智能体随时可以从 results.tsv + git log 重建历史上下文
9. Git 版本追踪策略
Git 不仅是代码版本控制工具,在 AutoResearch 中它承担了实验管理系统的核心职责。
10. GPT 模型架构
train.py 中实现了一个完整的因果语言模型(Causal Language Model),基于标准 Transformer 架构,可被智能体自由修改。
默认基准配置
class GPTConfig:
vocab_size : int = 8192 # BPE 词汇量
n_embd : int = 768 # 8 × ASPECT_RATIO(96)
n_layer : int = 8 # Transformer 层数
n_head : int = 12 # 注意力头数(可修改)
n_kv_head : int = 12 # KV 头数(支持 GQA)
ffn_mult : int = 4 # FFN 隐层维度倍数(n_embd × 4)
dropout : float = 0.0 # 基准无 dropout
Transformer Block 结构
输入 x
│
├─→ LayerNorm → Causal Self-Attention (Multi-Head) → + x
│ │
└───────────────────────────── ← ─────────────────────┘
│ 残差
┌─────────────────────────────────────────────────────┘
│
├─→ LayerNorm → FFN (Linear → Activation → Linear) → + x
│ │
└───────────────────────────── ← ─────────────────────┘
│
输出 x(传入下一层)
注意力机制(因果自注意力)
# 掩码因果注意力:防止 token 看到未来信息
def causal_attention(Q, K, V, mask):
scores = (Q @ K.transpose(-2, -1)) / math.sqrt(head_dim)
scores = scores.masked_fill(mask == 0, float('-inf')) # 因果掩码
weights = F.softmax(scores, dim=-1)
return weights @ V
智能体可探索的架构变体
11. 数据流水线
训练数据
| 属性 | 值 |
|---|---|
| 数据来源 | HuggingFace:climbmix-400b-shuffle |
| 总规模 | 4000 亿 tokens(仅使用其中一部分) |
| 存储路径 | ~/.cache/autoresearch/data/(分片存储) |
| 加载方式 | 流式按分片加载,无需全部载入内存 |
| 验证集大小 | EVAL_TOKENS = 20,971,520(约 2090 万 token) |
BPE 分词器配置
# prepare.py 中的分词器训练
tokenizer = train_bpe(
corpus = training_text_sample,
vocab_size = 8192,
pattern = r"(?i:'s|'t|'re|'ve|'m|'ll|'d)|[^\r\n\p{L}\p{N}]?\p{L}+|\p{N}{1,2}|...",
special_tokens = [
"<|reserved_0|>", # BOS
"<|reserved_1|>",
"<|reserved_2|>",
"<|reserved_3|>"
]
)
每次实验的数据通量
12. 设计哲学
AutoResearch 体现了一套独特的 AI 辅助科研哲学,与现有的 AI 研究框架有根本性的不同。
极简主义原则
与传统 ML 研究流程的对比
| 维度 | 传统方式 | AutoResearch |
|---|---|---|
| 实验发起 | 人类提出假设 | AI 智能体提出假设 |
| 代码修改 | 人类手工编写 | AI 智能体自主修改 |
| 实验执行 | 人类触发 | AI 自动循环执行 |
| 结果评估 | 人类分析 | 固定指标自动判断 |
| 版本管理 | 人类维护 | Git 自动追踪 |
| 研究速度 | 1–5 实验 / 天 | ~100 实验 / 隔夜 |
| 人类角色 | 全程参与 | 设计框架 + 监督 |
13. 效率与影响
实验规模统计
典型实验发现
在实际运行中,AutoResearch 智能体通常会发现以下类型的优化(基于社区报告):
- 调整峰值学习率(
lr_peak: 0.02 → 0.04):通常带来 0.3–0.5% val_bpb 改善 - 优化预热步数(过长预热 → 压缩至总步数的 5%):改善约 0.2%
- 引入余弦退火调度器替换固定学习率:改善约 1–2%
- 调整 Muon 优化器动量参数
- 修改 LayerNorm 位置(pre-norm vs post-norm)
- 引入权重绑定(embedding 与输出层共享权重)
硬件要求与适配
| 硬件平台 | 推荐配置 | 社区适配项目 |
|---|---|---|
| NVIDIA GPU(推荐) | H100 80GB,CUDA 12.8,PyTorch 2.9.1 | 原版 autoresearch |
| Apple Silicon Mac | M2/M3 Pro/Max,MLX 框架 | autoresearch-mlx |
| Windows RTX | RTX 3090/4090,CUDA 12.x | autoresearch-win-rtx |
| NVIDIA Jetson | Jetson Orin,JetPack 6.x | 社区移植 |
14. 社区扩展与影响
AutoResearch 发布后迅速在社区引发了大量扩展与衍生项目:
标签分类
报告生成日期:2026-04-26 · 数据来源:GitHub karpathy/autoresearch、 DataCamp、SoftMaxData、SkyPilot Blog 等公开资料