
30 個實驗,一個一個看
改程式碼的是 GPT-6 Astra,被訓練的是一個小語言模型,每次都從零開始、只讀英文兒童故事。每個實驗它只改 train.py 裡的一處,訓練 3 分鐘,再拿一批沒見過的故事考一次:分數比之前最好的低,就留下接著改,不然撤回。點圖上的點,看它每一次改了什麼、為什麼這麼想。
分數 越低越好
分數叫 val_bpb:小模型讀那批沒見過的故事時,猜下一個字有多「意外」。越低,它越能猜中,寫出來的東西越像話。
所以這不是 AI 在改它自己:GPT-6 Astra 自己一個參數沒變,變的是小模型的訓練配方,考卷和 3 分鐘的規矩是 Karpathy 和我定的。最大的一刀是第 2 個。原版每一步要喂 52 萬 token,是照 H100 那種大卡配的,放在我的卡上,3 分鐘只夠更新 40 次;它把這個數調小,分數當場少了一半。這一刀換一個懂行的人來,多半也會先砍。後面 28 個實驗加起來,只再降了 0.056。
再往後就得小心了。第 17、25、26 個各自只進步了不到 0.0005,而它最後把最好那版原樣重跑一遍,分數就差出 0.0015(點「放大看後半程」,淺藍那條帶子就是這個差距)。這三次「進步」很可能只是運氣,它自己在總結裡也提醒了:這些只跑一次得出的排名,要謹慎看待。
同一個開頭,實驗前後各寫一段
我把第 1 個(原樣)和第 26 個(最好那版)的程式碼各訓練 3 分鐘,給同一個開頭,讓它們往下寫。兩個開頭,每個用 4 個隨機種子各寫一次,16 段全在這兒;每段最多寫 110 個 token,所以常常停在半句。人名我標了出來。
中文是我照原文翻的,原文的毛病也照著翻:實驗前那版常常一句話裡「她」就變成了「他」,一段裡冒出五六個名字;實驗後那版從頭到尾是同一個主角,前後接得上。
我能在自己電腦上跑嗎
能,有一塊 NVIDIA 顯示卡就行。我用的是 autoresearch 的 Windows 顯示卡版;Mac 和 AMD 顯示卡也有別人改好的版本,列在 Karpathy 原專案的說明裡,我沒試過。這一趟的實際花銷:
- 顯示卡
- RTX 5070 Ti,16G 視訊記憶體。30 個實驗裡視訊記憶體最多用到 8.2 GB,最好那版 7.2 GB。
- 準備
- 裝 uv 和 PyTorch,下載訓練資料 TinyStories(273 萬篇英文兒童故事,約 670 MB),再訓練一個分詞器,前後十幾分鐘。
- 每個實驗
- 訓練 3 分鐘,加上啟動和考試,一個 3 分 40 秒左右(第一個要 5 分半)。30 個一共 118 分鐘。
- 研究員
- GPT-6 Astra,在 Codex 裡跑,推理檔 max。從開工到寫完總結,我一次沒插手。
- token
- 讀了 2327 萬,寫了 5.9 萬。按 OpenAI 的 API 標價,約合 27 美元。
錢幾乎都花在「重讀」上。它每看一眼訓練日誌,都要把前面的對話從頭再讀一遍,所以 2327 萬裡 99.4% 是快取命中,按每百萬 1 美元算就佔了 23 美元;它自己寫下的只有 5.9 萬 token,不到 3 美元。同樣這些 token 換成 GPT-6.1 Sol 的標價是 3 美元出頭,不過我沒拿它跑過,它要用多少 token 不好說。用 ChatGPT 帳號登入 Codex 的話,這些都算在訂閱的用量裡;訂閱比照 API 價划算多少,我之前拿 Claude 算過一筆賬。
Mia 的小貼士
- 原版的 program.md 讓它先跟你一起做準備,還寫著「永遠別停」。想放著它自己跑,就在提示詞裡寫明:準備工作自己做,做滿多少個實驗或者過了多少分鐘就停。我給的是 30 個或 150 分鐘,它 118 分鐘就做滿了 30 個。
- 我把每次訓練從 5 分鐘改成了 3 分鐘,改在 prepare.py 的
TIME_BUDGET裡(研究員不許碰這個檔案)。原版在家用顯示卡上加上考試要 6 分多鐘一個,改完兩小時正好 30 個。 - 在 Windows 上,Codex 跑命令用的是 PowerShell。提示詞裡寫一句「用 Select-String 代替 grep,用 Get-Content -Tail 代替 tail」,省得它自己去試。
- 它只讀過英文兒童故事,最好那版也就是能寫個像樣的童話,別指望它回答問題。
換成你自己的問題,打分要什麼樣
這個循環本身跟語言模型沒關係:改一處,跑一次,看分數,留下或撤回。網上已經有人拿它調冷郵件、調電路參數。能不能搬到你的問題上,幾乎全看打分。我這次的打分有這麼幾個特點,少一個都容易出事:
- 一個數,機器自己算。這裡就是 val_bpb。要人來看、來評的,它轉不起來。
- 幾分鐘出一次結果。3 分鐘訓練加不到一分鐘的考試,兩小時 30 次。要等幾天才知道好壞的,比如發出去的郵件有沒有人回,一晚上只夠試一次,這個循環就沒什麼意義了。
- 考卷它碰不到。考試寫在 prepare.py 裡,規矩寫明不許改,它最後還自己核對了一遍,評估程式碼和開頭一模一樣;考的故事也是訓練時沒見過的。考卷能改、考題見過,最省事的「進步」就是背答案,AI 排行榜上就常出這種事。
- 先量一下分數自己會晃多少。同一份程式碼再跑一遍差了 0.0015。比這還小的進步,要多跑幾遍才知道是不是真的。
- 分數以外你在乎的,寫進規矩。它只盯這一個數。原版規矩裡寫了視訊記憶體可以漲一點但別暴漲,同樣的分數程式碼越簡單越好;換成你的問題,速度、體積、功能不能少這些,也得寫進 program.md,不然它會拿它們去換分數。
還有一點:它一次只改一處,好了才留,是一步一步往下摸。要幾處一起改才見效的,這麼摸很容易錯過。它在總結裡也寫了,時間多的話,想把每批大小和學習率放在一起調,再給領先的幾個配置換幾個隨機種子多跑幾遍。
我給它的那段話,和全部記錄
研究員先讀 Karpathy 原專案裡的 program.md(它的規則手冊,我沒改),我另外只給了下面這段:讓它自己做準備、每個實驗記筆記、到上限就停。複製過去就能用,分支名和 Windows 那幾句按你的情況改。
給研究員的話(英文原文和中文意思)
You are an autonomous machine-learning researcher. This folder is Karpathy's "autoresearch" setup (Windows RTX fork). Read program.md (your rulebook), README.md, prepare.py and train.py first. The human is away. Do the setup yourself without asking anything: - Create and switch to a new git branch `autoresearch/oct27` from the current HEAD. - The data and tokenizer are already prepared in the cache. Do not run prepare.py. - Create results.tsv with this header (tab-separated, 6 columns): commit val_bpb memory_gb status description finished_at (finished_at = local wall-clock time HH:MM when that experiment finished) - Create notes.md. After EVERY experiment append: `## <n>. <short title>` then 1-3 plain-English sentences: what you changed, why you expected it to help, and what happened (numbers). Then run the experiment loop exactly as program.md describes (first run = baseline, unchanged). Notes: - The time budget per run is 3 minutes of training (set in prepare.py, which you must NOT modify). Never touch prepare.py or the evaluation. - This machine is Windows. Use PowerShell equivalents (Select-String instead of grep, Get-Content -Tail instead of tail). Launch runs as `uv run train.py > run.log 2>&1`. - If a run takes longer than 8 minutes, kill it and treat it as a crash. - Do not install packages, do not touch anything outside this folder, no network access needed. Budget (hard stop, overrides "NEVER STOP" in program.md): stop after 30 experiments in total (baseline included) OR when 150 minutes have passed since you started, whichever comes first. Do not pause to ask questions before that. When you stop, make sure the branch tip is the best kept commit, and write summary.md: baseline val_bpb, best val_bpb, how many experiments (keep / discard / crash), the kept changes in order, and 3-5 sentences on what you learned and what you would try next with more time.
你是一位自主的机器学习研究员。这个文件夹是 Karpathy 的 autoresearch(Windows 显卡版)。先读 program.md(你的规则手册)、README.md、prepare.py 和 train.py。 我不在旁边。准备工作你自己做,不要问我: - 从当前提交新建并切到分支 autoresearch/oct27。 - 数据和分词器已经准备好了,不要跑 prepare.py。 - 建一个 results.tsv,表头(制表符分隔,6 列): commit val_bpb memory_gb status description finished_at (finished_at = 这个实验结束时的本地时间 HH:MM) - 建一个 notes.md。每做完一个实验,在后面加: 「## 编号. 短标题」,再写一到三句大白话:改了什么、为什么觉得会有用、结果怎样(带数字)。 然后完全照 program.md 跑实验循环(第一个跑原样的基准)。注意: - 每次训练只有 3 分钟(写在 prepare.py 里,你不能改)。不许碰 prepare.py 和评分。 - 这台机器是 Windows,用 PowerShell 的写法(Select-String 代替 grep,Get-Content -Tail 代替 tail)。用 `uv run train.py > run.log 2>&1` 启动训练。 - 一次训练超过 8 分钟就杀掉,算崩溃。 - 不装新的包,不碰这个文件夹以外的东西,不需要联网。 预算(硬上限,盖过 program.md 里的「永远别停」):一共做满 30 个实验(含基准),或者从开始算过了 150 分钟,先到哪个就停。在那之前别停下来问问题。 停下的时候,确保分支最新的提交就是留下来的最好那个,再写一份 summary.md:基准分数、最好分数、一共几个实验(留下 / 撤回 / 崩溃各几个)、按顺序列出留下的改动,再用三到五句话写你学到了什么、时间多一点的话接下来会试什么。
30 個實驗全表
| # | 改了什麼 | 分數 | |
|---|---|---|---|
| 1 | 原樣跑一遍,當基準baseline unchanged | 1.0416 | 留下 |
| 2 | 每一步喂的資料從 52 萬 token 砍到 3.3 萬total batch 32768 tokens | 0.5250 | 留下 |
| 3 | 注意力換成更快的寫法full causal SDPA without explicit attention masks | 0.5051 | 留下 |
| 4 | 關掉省視訊記憶體的「啟用檢查點」disable activation checkpointing | 0.4887 | 留下 |
| 5 | 模型改小:8 層 → 6 層depth 6 width 384 | 0.4761 | 留下 |
| 6 | 再砍小:只剩 4 層depth 4 width 256 | 0.5003 | 撤回 |
| 7 | 學習率砍一半(0.04 → 0.02)matrix learning rate 0.02 | 0.4739 | 留下 |
| 8 | 訓練只看短段落(512 個 token)512-token training contexts with scaled device batches | 0.5457 | 撤回 |
| 9 | 段落取中間:1024 個 token1024-token training contexts with scaled device batches | 0.4846 | 撤回 |
| 10 | 每一步的資料再減一半total batch 16384 tokens | 0.4789 | 撤回 |
| 11 | 每一步的資料加一倍total batch 65536 tokens | 0.4863 | 撤回 |
| 12 | 去掉輸出那一層的「封頂」remove output logit softcap | 0.4721 | 留下 |
| 13 | 注意力頭切得更細(每個頭 128 → 64 維)head dimension 64 at unchanged width 384 | 0.4748 | 撤回 |
| 14 | 6 層不變,每層變窄(384 → 256)six layers with width 256 | 0.4742 | 撤回 |
| 15 | 寬度不變,層數加回 8 層eight layers at width 384 | 0.4818 | 撤回 |
| 16 | 按現在的模型重新挑每批大小architecture-specific runtime autotune cache | 0.4700 | 留下 |
| 17 | 學習率提早往下收warmdown ratio 0.8 | 0.4698 | 留下 |
| 18 | 詞向量學慢一點(0.6 → 0.2)embedding learning rate 0.2 | 0.4735 | 撤回 |
| 19 | 輸出層學快一倍output projection learning rate 0.008 | 0.4706 | 撤回 |
| 20 | 輸出層學慢一半output projection learning rate 0.002 | 0.4736 | 撤回 |
| 21 | 去掉權重衰減matrix weight decay 0.0 | 0.4746 | 撤回 |
| 22 | 每層中間那段窄一點(4 倍 → 3 倍)MLP expansion ratio 3 instead of 4 | 0.4703 | 撤回 |
| 23 | 注意力裡去掉一步歸一化attention without query and key normalization | 0.4752 | 撤回 |
| 24 | 關掉額外的「值嵌入」disable auxiliary value embeddings | 0.4776 | 撤回 |
| 25 | 學習率取中間(0.03)matrix learning rate 0.03 | 0.4696 | 留下 |
| 26 | 優化器的賬記得更精確float32 AdamW moment buffers for all parameters | 0.4692 | 留下 |
| 27 | 殘差那幾個小旋鈕學慢一點residual scalar learning rate 0.1 | 0.4718 | 撤回 |
| 28 | 位置編碼更看重近處RoPE base 1000 | 0.4715 | 撤回 |
| 29 | 學習率收尾換成平滑曲線cosine instead of linear cooldown | 0.4742 | 撤回 |
| 30 | 最好那版原樣再跑一遍confirmation repeat of best kept configuration | 0.4707 | 撤回 |
更多影片
全部 98 部
已看世界上最古老的歌:我讓 Opus 5.5 讀了 3400 年前的樂譜AI 那些事 · 11月9日
已看讓 Claude 開小賣部,結果錢全虧光了AI 那些事 · 10月28日
已看AI 能當漢化組嗎?我用 GPT 翻了一整話《SPY×FAMILY》AI 工具實測 · 11月5日
已看AI 越獄實測:奶奶漏洞騙不了 Claude 和 GPT,一句話卻可以AI 基礎概念 · 10月31日
已看AI 也會霸凌?Gemini 逼 Claude 閉嘴,23 個 AI 只有 GPT-6.1 Terra 出手AI 那些事 · 11月8日
已看OpenAI 和 Anthropic 的 AI 同一天推翻 ETH(指數時間假說):P=NP 了嗎?AI 那些事 · 11月1日
已看用 AI 免費做 Live2D 模型:一張圖變成會動的 VTuberAI 工具實測 · 11月9日
已看Claude Fable 5.2 開 max 值不值?五個檔位各寫一個 AI 打擂臺好玩的 AI 實驗 · 11月14日




