STaR 系列推理:让模型自己教会自己推理 本节摘要:最小的自我改进循环,藏在「理由(rationale)」里。STaR(Self-Taught Reasoner,2022)的做法是:模型先生成一条思维链,只保留那些最终答对的,再在这些保留的轨迹上微调,如此反复。V-STaR(2024)给它配一个学习出来的验证器(verifier),让推理期选择更准;Quiet-STaR(2024)把「理由」下沉到每一个 token 位置。三者都有效,但都不是魔法——只要某条捷径碰巧蒙对了答案,这个循环就会把它一并保留并强化。
本节摘要:最小的自我改进循环,藏在「理由(rationale)」里。STaR(Self-Taught Reasoner,2022)的做法是:模型先生成一条思维链,只保留那些最终答对的,再在这些保留的轨迹上微调,如此反复。V-STaR(2024)给它配一个学习出来的验证器(verifier),让推理期选择更准;Quiet-STaR(2024)把「理由」下沉到每一个 token 位置。三者都有效,但都不是魔法——只要某条捷径碰巧蒙对了答案,这个循环就会把它一并保留并强化。本节讲透这三者的机制、各自的设计巧思(STaR 的 rationalization、V-STaR 的 DPO 验证器、Quiet-STaR 的「思考 token」与混合权重),以及它们在 2026 技术栈里的位置:DeepSeek-R1、o1 这类「可验证任务的 RL」本质上就是 STaR 的答案条件梯度信号被放大到前沿规模。
对应原课程:Phase 15 · Lesson 02 ·
star-family-reasoning(原英文phases/15-autonomous-systems/02-star-family-reasoning/docs/en.md)。
阅读完本节,你应当能够:
教模型推理,最直白的办法是收集人写的推理轨迹。这又贵又慢,还被人类愿意写多少高质量 CoT 所限。
STaR 提出反问:要是让模型自己写理由、再用已知答案打分呢?循环三步:
它在 GSM8K、CommonsenseQA 上都涨了,无需新的人类标注。但循环里有个内置偏差:任何碰巧得到正确答案的理由都会被保留,不管推理本身是否站得住脚。V-STaR 用一个学出来的验证器补这个洞;Quiet-STaR 把思想下沉到每个 token。
💡 这三种方法都把最终答案当梯度信号。这是它们最大的力量来源,也是最大的安全软肋。
原课程 code/main.py(纯标准库)在一个玩具算术任务上模拟 STaR 循环,让你直观看到三件事:准确率随自举轮次爬升;捷径如何混进来(模拟器内置一类「懒惰理由」,40% 概率蒙对但泛化很差,看 STaR 会不会留下它们);验证器在推理期能帮多少(无法完全剪掉训练期引入的捷径)。
def star_round(model, problems, labels, sampler, correct_fn, n_samples=4): kept = [] for q, gold in zip(problems, labels): traces = [sampler(model, q) for _ in range(n_samples)] hit = [t for t in traces if correct_fn(t["answer"], gold)] if not hit: # rationalization: 把正确答案喂回去,让模型「倒推」一条理由 hit = [sampler(model, q, hint=gold)] kept.extend((q, t["rationale"], t["answer"]) for t in hit[:1]) model.finetune(kept) # 在「答对的理由」上微调 return model
设计要点:rationalization 是 STaR 能学起来的关键。如果基模型对某题永远答不对,循环在这题上学不到任何东西;把答案当提示喂回去,逼模型产出一条能通到该答案的理由,再纳入训练集——哪怕这条「倒推」的理由不一定自然。
STaR 把答错的理由直接扔了。Hosseini 等(2024)指出这些也是数据:每一对(理由,「对不对」)都能训一个验证器。他们用 DPO(Direct Preference Optimization) 同时在正确与错误解上训出一个排序器,推理时采 N 条理由、挑验证器打分最高那条。
# 推理期:best-of-N cands = [sampler(model, q) for _ in range(N)] best = max(cands, key=lambda t: verifier.score(q, t["rationale"]))
报告增益:在 GSM8K 和 MATH 上,相对先前的自我改进基线 +4 到 +17 个百分点,且大部分增益来自用验证器做推理期选择,而不是继续拿它微调生成器。
Zelikman 等(2024)把问题推到极致:要是模型在每个 token 位置都先生成一段短「内部理由」,而不是只在问题与答案之间想一次呢?Quiet-STaR 训练模型在每个预测 token 前先吐一段隐式 thought,再用一个学出来的权重把「带 thought 的预测」与「基线预测」混合。
结果:Mistral 7B 在零样本下,GSM8K 从 5.9% 涨到 10.9%,CommonsenseQA 从 36.3% 涨到 47.2%,且无需任务特定微调。模型学会了「何时思考」——难 token 配更长的内部理由,简单 token 几乎不思考。
| 方法 | 训练信号 | 推理成本 | 数据浪费 | 已知失败模式 |
|---|---|---|---|---|
| STaR | 答对就保留 (理由, 答案) | 1× | 丢弃所有答错理由 | 捷径理由 |
| STaR + rationalization | 上述 + 用正确答案提示重试 | 1× | 更少 | 倒推理由可能不自然 |
| V-STaR | STaR + 用两类样本 DPO 训验证器 | N×(best-of-N) | 极少 | 验证器可能强化「自信的错误」 |
| Quiet-STaR | 每 token 一段理由 + 混合权重 | 1.5~3× | 极少 | 仍是答案条件梯度 |
三种方法都用最终答案作为梯度信号。一条通过有缺陷推理得到正确答案的理由——走了捷径、瞎蒙、用了不泛化的模式——会被正向强化。在分布内捷径管用;在分布外它静默失效。
V-STaR 的验证器靠「学排序理由」缓解,但验证器是在同一标签集上训的,可能学到「偏好格式漂亮的错误推理」胜过诚实的 uncertainty。更安全的设计是:把 STaR 风格的数据与 (a) 过程监督奖励模型(奖励中间步骤而非仅答案)和 (b) 留出分布外评估(专门打破简单捷径)结合。
STaR 本身已不新,但这个模式在 2025-2026 无处不在:
理解 STaR,后面这些就全都「咔哒」一声扣上了。它是最小可行的自我改进循环。
outputs/skill-star-loop-reviewer.md 是一份审查技能:在你「拿一条自教推理管线去训练」之前,用它审一遍——捷径频率有没有估、有没有留出 OOD 测试、验证器是在同一标签集上训出来的吗、梯度信号是答案条件还是过程条件。它把「上线前的最小检查清单」固化成可重复步骤。
code/main.py 是零依赖模拟器,把捷径频率、采样数、是否启用验证器都做成可调参数,适合在团队评审里演示「同样的训练分布准确率 >90%,分布外却崩盘」的对照。
跑模拟器:把捷径频率先设 0、再设 0.4。两次运行的最终准确率在训练分布上可能都 >90%,分布外却差很多——量化这个差距。
加一个留出 OOD 测试:从另一个分布抽题,评估自举后的模型在分布内与 OOD 上的表现,把差距画出来。
读 Quiet-STaR 论文(arXiv:2403.09629)第 3 节,用各三句话解释 end-of-thought token 与混合权重头。
对比 STaR 的「答对才留」与过程监督替代方案(对每步理由独立打分),指出标注成本差异与可能的质量差异。
设计一条评估能在部署模型里抓到捷径理由。它不必完美,只要能打破 STaR 循环会强化的那些最简单捷径。
下一节,我们把 STaR 的「标签」换成「程序评估器」——AlphaEvolve 用进化算法让代码自己迭代,看自我改进循环在代码生成上能走多远。