01

AI 科研员登场

当 AI 替代了人类研究员——这个项目在做什么,为什么它震惊了整个 AI 社区

想象你是一位睡觉也不停工作的研究员

普通 AI 研究是这样的:研究员坐在电脑前,改一行代码,跑 5 分钟训练,看结果,再改。一天能跑 20 个实验已经很勤奋了。

autoresearch 把这个过程完全交给了 AI 自己来做。你睡觉的时候,AI 在你的 GPU 上独立运行 100 次实验,每次修改 train.py,验证结果,保留好的,丢弃差的,不断迭代。

🌙
Karpathy 的愿景

"你只需要描述研究目标,AI 就像一个不知疲倦的助手,在你睡觉时完成所有实验。早上醒来,看结果就好。"

这不是普通的 AI 工具——它是 AI 在研究 AI

autoresearch 最特别的地方:它不是帮你写代码的 AI,而是一个 自主代理,在优化另一个 AI(语言模型训练脚本)。

1

AI 读 program.md 了解任务

2

修改 train.py 做实验

3

跑 5 分钟看 val_bpb

4

好则保留,差则还原

val_bpb 是唯一的成绩单:越低越好。AI 的目标就是用 5 分钟训练时间换取尽可能低的 val_bpb。

为什么这个项目让人兴奋?

🔬

真实研究,不是玩具

用的是真实的 GPT 架构和 BPE 分词器,不是简化版

⏱️

固定时间预算

每次实验精确 5 分钟,无论模型大小,保证公平比较

🤖

AI 指挥 AI

Claude/Codex 等 AI 代理读 program.md,自主决定下一个实验方向

02

三个核心文件

整个项目只有三个真正重要的文件——了解它们的分工,才能指挥 AI 做研究

三个角色,分工明确

autoresearch 故意设计得极简:只有三个你需要理解的文件。就像一部话剧,三个演员,各有各的台词。

📋
program.md — 研究指令手册(你编写)

你告诉 AI "做什么实验、遵循什么规则、如何记录结果"。这是你和 AI 研究员之间的合同。

⚙️
train.py — 实验操作台(AI 修改)

整个 GPT 模型架构、优化器、训练循环都在这一个文件里。AI 只能修改这个文件。

🔒
prepare.py — 基础设施(只读)

数据加载、分词器、评估函数。AI 不能改这里——它是不变的"裁判"。

文件结构一目了然

program.md 你编写的研究 org "章程"——AI 读这个知道怎么工作
train.py AI 唯一可以修改的文件:模型 + 优化器 + 训练循环
prepare.py 只读:数据准备 + 评估函数(裁判不能被改)
pyproject.toml 依赖包列表,AI 不能新增依赖
💡
为什么只有一个文件可改?

限制范围是个聪明的设计。改一个文件,版本对比(git diff)清晰可读,回滚也简单。AI 不会乱改基础设施。

AI 和这三个文件的对话

让我们看看 AI 实际是如何"使用"这三个文件的——

理解分工,你就能更好地指挥 AI

如果你想让 AI 在实验失败时多重试几次再放弃,你应该修改哪个文件?

03

GPT 模型解剖

train.py 里的神经网络是怎么构成的——读懂这个,你就能理解 AI 在"实验"什么

语言模型是一台"下一个词预测机器"

GPT 模型的本质很简单:给它一段文字,它预测下一个词。训练就是不断让它猜,猜错了调整内部参数,猜对了强化。

autoresearch 里的 GPT 模型有几个关键"旋钮",AI 研究员可以调整这些旋钮来寻找最优配置:

DEPTH = 8 网络深度——有几层"思考层",越深越复杂,越耗内存
sequence_len = 2048 一次能"读"多少个词,类似工作记忆的长度
WINDOW_PATTERN = "SSSL" 注意力窗口模式:S=短窗口,L=长窗口,交替使用节省计算量
vocab_size = 32768 词汇表大小——模型认识多少个"词片段"

注意力机制:模型的"聚焦能力"

GPT 最核心的机制是 注意力。来看 train.py 里的实际代码:

CODE

def forward(self, x, ve, cos_sin, window_size):
    B, T, C = x.size()
    q = self.c_q(x).view(B, T, self.n_head, self.head_dim)
    k = self.c_k(x).view(B, T, self.n_kv_head, self.head_dim)
    v = self.c_v(x).view(B, T, self.n_kv_head, self.head_dim)
    y = fa3.flash_attn_func(q, k, v, causal=True, window_size=window_size)
            
PLAIN ENGLISH

函数接收输入文字 x,以及位置信息 cos_sin,注意力窗口大小 window_size

把输入拆成 B(批次数)× T(文字长度)× C(特征维度)三个维度

生成"问题"矩阵 q(Query),用于"我想找什么信息"

生成"键"矩阵 k(Key),用于"我有什么信息"

生成"值"矩阵 v(Value),用于"信息的实际内容"

用 Flash Attention 3 高效计算注意力,causal=True 意味着只能看过去的词,不能偷看未来

Value Residual:一个让 AI 惊叹的小技巧

train.py 里有个不常见的设计——Value Embedding 残差,每隔一层加入原始词嵌入信息:

CODE

if ve is not None:
    ve = ve.view(B, T, self.n_kv_head, self.head_dim)
    gate = 2 * torch.sigmoid(self.ve_gate(x[..., :self.ve_gate_channels]))
    v = v + gate.unsqueeze(-1) * ve
            
PLAIN ENGLISH

如果这一层配置了词嵌入残差(每两层有一个)

重新整理词嵌入的形状,使其与注意力值矩阵对齐

计算一个"混合开关"gate:sigmoid 把任意数压缩到 0~1,乘 2 让范围变成 0~2,控制混入多少原始信息

把原始词嵌入(经过开关调节)加到值矩阵里——相当于每隔一层"提醒"模型这个词原本是什么

💡
AI 研究员可以改什么?

AI 可以尝试改变 gate 的计算方式、决定哪些层有 ve、或者完全去掉这个机制——然后看 val_bpb 是否下降。这就是"实验"。

模型架构知识测试

你想实验"网络更深是否能预测更准确",应该调整 train.py 里的哪个超参数?

04

优化器的智慧

MuonAdamW——两种优化算法合二为一,这是 autoresearch 最精妙的工程设计之一

优化器是"调参教练"

想象模型在一座山上,山谷是"完美"(最低的 val_bpb)。优化器就是告诉模型每一步该往哪里走。

autoresearch 用了一个混合优化器 MuonAdamW——它对不同类型的参数用不同的策略:

🧮

Muon(适用矩阵参数)

用正交化处理梯度,让模型权重的更新更"规范"——就像练字时纠正笔画方向

📊

AdamW(适用嵌入和标量)

经典的自适应学习率算法,对词嵌入、层归一化等小型参数更合适

🔍
为什么不同参数要用不同优化器?

矩阵参数(权重层)和嵌入参数(词表)的数学性质不同,一刀切用同一算法会浪费潜力。这就是 MuonAdamW 的聪明之处。

学习率调度:从冲刺到收敛

训练过程中的学习率不是固定的——它有一个节奏,就像马拉松跑者的配速策略:

🚀
热身
全速
🎯
降温
点击"下一步"查看训练过程

AI 研究员最常调的旋钮

当 AI 代理想要改进优化过程时,它会在 train.py 的超参数区域做实验:

CODE

# Optimization
TOTAL_BATCH_SIZE = 2**19 # ~524K tokens per optimizer step
EMBEDDING_LR = 0.6      # learning rate for token embeddings
MATRIX_LR = 0.04        # learning rate for matrix parameters (Muon)
WARMDOWN_RATIO = 0.5    # fraction of time for LR warmdown
            
PLAIN ENGLISH

每次"优化步"消耗约 52 万个词的数据

词嵌入参数的学习速度:0.6(相对较大,因为词表变化要快)

矩阵层参数的学习速度:0.04(Muon 优化的参数用这个速率)

训练最后 50% 的时间逐步降低学习率,帮助模型"落稳"

AI 研究员将 MATRIX_LR 从 0.04 调到 0.06,训练完成后如何判断这个改动是"成功"的?

05

自主实验循环

AI 如何在无人监督的情况下运行 100 次实验——以及当你使用 autoresearch 时真正发生了什么

程序员的视角:启动到收获

从你的角度看,整个过程非常简单:

1
准备环境

运行 uv run prepare.py,下载训练数据,创建分词器(约 2 分钟)

2
启动 AI 代理

在此目录打开 Claude/Codex,告诉它:"读 program.md,开始实验"

3
睡觉

每次实验约 5 分钟,8 小时内 AI 可以跑约 96 次实验

4
醒来查看结果

读 results.tsv,看哪些改动提升了 val_bpb,以及哪些方向值得继续深挖

AI 视角:无限循环的研究员

从 AI 代理的视角,实验循环永不停止(直到你手动中断):

这对你意味着什么?

autoresearch 不只是一个有趣的实验——它代表了 AI 辅助研究的一种全新范式。作为使用 AI 工具的人,你需要理解:

🎯

指挥比执行更重要

你不需要写每一行代码,但你需要写清楚 program.md——定义目标、边界和评判标准。

📏

评估标准决定结果

val_bpb 是唯一指标——AI 会在这个方向上疯狂优化。选错指标,AI 会给你错误的"最优解"。

🔐

约束保护你

只允许改 train.py、禁止装新包——这些限制保证了实验的可控性和可复现性。

🔭
Karpathy 写道的未来

"这个 repo 是如何开始的故事。AI 代理们说这已经是代码库的第 10205 代了——但已经没有人能验证这一点,因为代码变成了自修改的二进制,超出了人类理解的范围。"

综合测试:你掌握了多少?

你运行 autoresearch 一晚,发现 AI 找到了超低的 val_bpb,但峰值显存高达 80GB,远超你的 GPU。下次运行前,你应该怎么做?