AI 科研员登场
当 AI 替代了人类研究员——这个项目在做什么,为什么它震惊了整个 AI 社区
想象你是一位睡觉也不停工作的研究员
普通 AI 研究是这样的:研究员坐在电脑前,改一行代码,跑 5 分钟训练,看结果,再改。一天能跑 20 个实验已经很勤奋了。
autoresearch 把这个过程完全交给了 AI 自己来做。你睡觉的时候,AI 在你的 GPU 上独立运行 100 次实验,每次修改 train.py,验证结果,保留好的,丢弃差的,不断迭代。
"你只需要描述研究目标,AI 就像一个不知疲倦的助手,在你睡觉时完成所有实验。早上醒来,看结果就好。"
这不是普通的 AI 工具——它是 AI 在研究 AI
autoresearch 最特别的地方:它不是帮你写代码的 AI,而是一个 自主代理,在优化另一个 AI(语言模型训练脚本)。
AI 读 program.md 了解任务
修改 train.py 做实验
跑 5 分钟看 val_bpb
好则保留,差则还原
val_bpb 是唯一的成绩单:越低越好。AI 的目标就是用 5 分钟训练时间换取尽可能低的 val_bpb。
为什么这个项目让人兴奋?
真实研究,不是玩具
用的是真实的 GPT 架构和 BPE 分词器,不是简化版
固定时间预算
每次实验精确 5 分钟,无论模型大小,保证公平比较
AI 指挥 AI
Claude/Codex 等 AI 代理读 program.md,自主决定下一个实验方向
三个核心文件
整个项目只有三个真正重要的文件——了解它们的分工,才能指挥 AI 做研究
三个角色,分工明确
autoresearch 故意设计得极简:只有三个你需要理解的文件。就像一部话剧,三个演员,各有各的台词。
你告诉 AI "做什么实验、遵循什么规则、如何记录结果"。这是你和 AI 研究员之间的合同。
整个 GPT 模型架构、优化器、训练循环都在这一个文件里。AI 只能修改这个文件。
数据加载、分词器、评估函数。AI 不能改这里——它是不变的"裁判"。
文件结构一目了然
限制范围是个聪明的设计。改一个文件,版本对比(git diff)清晰可读,回滚也简单。AI 不会乱改基础设施。
AI 和这三个文件的对话
让我们看看 AI 实际是如何"使用"这三个文件的——
理解分工,你就能更好地指挥 AI
如果你想让 AI 在实验失败时多重试几次再放弃,你应该修改哪个文件?
GPT 模型解剖
train.py 里的神经网络是怎么构成的——读懂这个,你就能理解 AI 在"实验"什么
语言模型是一台"下一个词预测机器"
GPT 模型的本质很简单:给它一段文字,它预测下一个词。训练就是不断让它猜,猜错了调整内部参数,猜对了强化。
autoresearch 里的 GPT 模型有几个关键"旋钮",AI 研究员可以调整这些旋钮来寻找最优配置:
DEPTH = 8
网络深度——有几层"思考层",越深越复杂,越耗内存
sequence_len = 2048
一次能"读"多少个词,类似工作记忆的长度
WINDOW_PATTERN = "SSSL"
注意力窗口模式:S=短窗口,L=长窗口,交替使用节省计算量
vocab_size = 32768
词汇表大小——模型认识多少个"词片段"
注意力机制:模型的"聚焦能力"
GPT 最核心的机制是 注意力。来看 train.py 里的实际代码:
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)
函数接收输入文字 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 残差,每隔一层加入原始词嵌入信息:
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
如果这一层配置了词嵌入残差(每两层有一个)
重新整理词嵌入的形状,使其与注意力值矩阵对齐
计算一个"混合开关"gate:sigmoid 把任意数压缩到 0~1,乘 2 让范围变成 0~2,控制混入多少原始信息
把原始词嵌入(经过开关调节)加到值矩阵里——相当于每隔一层"提醒"模型这个词原本是什么
AI 可以尝试改变 gate 的计算方式、决定哪些层有 ve、或者完全去掉这个机制——然后看 val_bpb 是否下降。这就是"实验"。
模型架构知识测试
你想实验"网络更深是否能预测更准确",应该调整 train.py 里的哪个超参数?
优化器的智慧
MuonAdamW——两种优化算法合二为一,这是 autoresearch 最精妙的工程设计之一
优化器是"调参教练"
想象模型在一座山上,山谷是"完美"(最低的 val_bpb)。优化器就是告诉模型每一步该往哪里走。
autoresearch 用了一个混合优化器 MuonAdamW——它对不同类型的参数用不同的策略:
Muon(适用矩阵参数)
用正交化处理梯度,让模型权重的更新更"规范"——就像练字时纠正笔画方向
AdamW(适用嵌入和标量)
经典的自适应学习率算法,对词嵌入、层归一化等小型参数更合适
矩阵参数(权重层)和嵌入参数(词表)的数学性质不同,一刀切用同一算法会浪费潜力。这就是 MuonAdamW 的聪明之处。
学习率调度:从冲刺到收敛
训练过程中的学习率不是固定的——它有一个节奏,就像马拉松跑者的配速策略:
AI 研究员最常调的旋钮
当 AI 代理想要改进优化过程时,它会在 train.py 的超参数区域做实验:
# 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
每次"优化步"消耗约 52 万个词的数据
词嵌入参数的学习速度:0.6(相对较大,因为词表变化要快)
矩阵层参数的学习速度:0.04(Muon 优化的参数用这个速率)
训练最后 50% 的时间逐步降低学习率,帮助模型"落稳"
AI 研究员将 MATRIX_LR 从 0.04 调到 0.06,训练完成后如何判断这个改动是"成功"的?
自主实验循环
AI 如何在无人监督的情况下运行 100 次实验——以及当你使用 autoresearch 时真正发生了什么
程序员的视角:启动到收获
从你的角度看,整个过程非常简单:
运行 uv run prepare.py,下载训练数据,创建分词器(约 2 分钟)
在此目录打开 Claude/Codex,告诉它:"读 program.md,开始实验"
每次实验约 5 分钟,8 小时内 AI 可以跑约 96 次实验
读 results.tsv,看哪些改动提升了 val_bpb,以及哪些方向值得继续深挖
AI 视角:无限循环的研究员
从 AI 代理的视角,实验循环永不停止(直到你手动中断):
这对你意味着什么?
autoresearch 不只是一个有趣的实验——它代表了 AI 辅助研究的一种全新范式。作为使用 AI 工具的人,你需要理解:
指挥比执行更重要
你不需要写每一行代码,但你需要写清楚 program.md——定义目标、边界和评判标准。
评估标准决定结果
val_bpb 是唯一指标——AI 会在这个方向上疯狂优化。选错指标,AI 会给你错误的"最优解"。
约束保护你
只允许改 train.py、禁止装新包——这些限制保证了实验的可控性和可复现性。
"这个 repo 是如何开始的故事。AI 代理们说这已经是代码库的第 10205 代了——但已经没有人能验证这一点,因为代码变成了自修改的二进制,超出了人类理解的范围。"