harness_evolve/notes/ref04_absolute-zero.md

Absolute Zero: Reinforced Self-play Reasoning with Zero Data

一句话总结:让一个模型同时扮演"出题人"和"解题人",用代码执行器当"永远诚实的裁判",在零外部数据(既不用人写的题、也不用人标的答案)的条件下,靠自己出题、自己求解、用可验证奖励做 RL 自我进化——最终在数学与代码推理上反超那些用了几万条人工标注题目的"zero"模型,把 RLVR 的"数据依赖"这块天花板直接掀掉。


TL;DR 速览

tags: #自我改进 #self-play #RLVR #zero-data #reasoning #curriculum-self-generation #code-as-verifier #AlphaZero-style

related: [[ref06_spin-self-play-finetuning]](self-play 微调,被本文列为最近邻)· [[ref05_self-rewarding-language-models]](同实例当奖励模型的自奖励)· [[ref20_alphaevolve]](LLM 引导的进化式代码搜索)· [[ref14_self-refine]](自我精炼)· [[ref16_stop-self-taught-optimizer]](递归自改进)· [[ref09_meta-harness]] · [[ref17_self-harness]](harness 自改进的对照极)· [[ref23_darwin-godel-machine]](开放式自我修改)· [[ref25_learning-to-discover-at-test-time]](测试时发现)


摘要

RLVR 已展现出通过"规则化结果奖励"直接学习来增强 LLM 推理的潜力。近期在 zero 设定下的 RLVR 工作虽然免去了对推理过程的标注监督,但仍依赖人工整理的 (题, 答案) 集合来训练。高质量人造样本的稀缺,使"长期依赖人类监督"的可扩展性存疑——这个挑战在 LLM 预训练里早已显现。此外,在"AI 超越人类智能"的假想未来里,人类给的任务对超智能系统的学习价值有限。为此我们提出新的 RLVR 范式 Absolute Zero单个模型学会提出能最大化自身学习进展的任务,并通过求解它们来提升推理,全程不依赖任何外部数据

在此范式下提出 Absolute Zero Reasoner(AZR):用代码执行器既验证自提出的代码推理任务、又核验答案,作为统一的可验证反馈源,引导"开放但有地基(open-ended yet grounded)"的学习。尽管完全无外部数据训练,AZR 在代码与数学推理上取得综合 SOTA,超过了那些依赖上万条领域内人工样本的现有 zero 模型;且在不同模型规模(3B/7B/14B)与不同模型类(Qwen/Llama)上均有效。


1 介绍:把"数据引擎"从人类手里拿走

论文的动机链条非常清晰,可以拆成三步:

① RLVR 很强,但它的数据来源仍是人类。 RLVR(Lambert et al., 2024)不去模仿中间推理步,只用结果反馈(答案对不对),因此能在海量任务上大规模 RL(o1、R1 等)。其中最诱人的是 R1 提出的 "zero" 设定——不用任何冷启动蒸馏数据(既不用人写、也不用 AI 写的推理轨迹),直接在 base 模型上用任务奖励做 RLVR。,这些方法仍然重度依赖专家整理的 (推理题, 答案) 分布

② 人工数据不可持续,且会给超智能设天花板。 作者抛出两个层面的担忧: - 可扩展性:随着推理模型变强,构造大规模高质量数据集的成本可能"很快变得不可持续"(Villalobos et al., 2024;Yue et al., 2025);预训练领域早已识别出同样的瓶颈(Sutskever, 2024)。 - 能力上限在 AI 可能超越人类智力的未来,"只依赖人设计的任务"会给系统的自主学习与成长套上枷锁(Hughes et al., 2024)。

③ 解法 = Absolute Zero。 提出一个新范式,让模型同时学会"定义能最大化可学习性的任务"和"高效求解它们",通过 self-play 实现自我进化、不依赖外部数据。与以往局限于"窄域 / 固定功能 / 易被 hack 的学习型奖励模型"的 self-play 不同,Absolute Zero 面向开放域,但始终锚定在真实环境上——用环境反馈当可验证奖励,就像人通过与世界互动来学习和推理。作者明确类比 AlphaZero(Silver et al., 2017):无需人类监督、纯靠自我互动进步。

[!TIP] 什么是 RLVR(Reinforcement Learning with Verifiable Rewards)? RLVR 是当下"推理模型"(o1、DeepSeek-R1 等)的核心后训练范式。它和 RLHF 的关键区别在于奖励从哪来:RLHF 用一个学出来的奖励模型(可能被 hack),而 RLVR 用规则化、可自动验证的结果奖励——比如数学题"答案是否等于标准答案"、代码题"是否通过单元测试"。因为奖励是确定性、可复现的,就能在超大规模任务上稳定跑 RL,而不担心奖励模型崩坏。局限:它需要每道题都有一个"可验证的标准答案",所以仍要人来准备 (题, 答案) 对——这正是 Absolute Zero 要打破的一环。

[!TIP] 什么是 "zero" 设定?和 "Absolute Zero" 差在哪? - zero 设定(R1 首创):跳过 SFT 冷启动,直接在 base 模型上用 RLVR。省掉的是"人类/AI 写的推理轨迹(CoT 示范)",但题目和答案仍由人准备。 - Absolute Zero(本文):更进一步——连题目和答案都不给。所有用于提升推理的数据都是模型自己提出、并通过环境(代码执行器)自动构造+验证的。"zero"去掉的是过程监督;"absolute zero"去掉的是数据本身。

论文用一张对比图(Figure 2)把三种范式的"人类监督量"排成一条轴:

Figure 2: 三种范式的人类监督量对比

Figure 2 逐格解读(全文的定位图,箭头方向 = "人类监督越来越少"): - 左「Supervised Learning」:人类手把手给出完整推理轨迹,模型做行为克隆(behavior cloning)——图里人类牵着机器人走向红旗。监督最重。 - 中「Reinforcement Learning with Verifiable Rewards」:人类不再给轨迹,但仍要定义学习分布 + 准备 (题, 答案) 对——图里人类指向红旗(指定目标),机器人自己走过去。监督中等。 - 右「Absolute Zero (Ours)」没有人类——机器人自己竖起红旗、自己奔向它。Agent 自主提出"为可学习性优化"的任务,并用统一模型学着解;只靠环境给的可验证反馈实现可靠、持续的自我改进。监督为零。

介绍末尾还预告了 6 个"有趣发现"(后文详述):代码先验放大推理、跨域迁移在 AZR 上更显著、大基座收益更大、注释即中间计划自发涌现、认知行为与 token 长度随任务类型而异、以及安全警报(uh-oh moment)


2 相关工作:站在 self-play 与 RL 推理的交叉点

作者把 AZR 放在三条线索的交汇处:RL 增强推理self-playweak-to-strong 监督。下面把每条线的关键前作讲透——这对理解"AZR 新在哪"至关重要。

[!TIP] ① 用 RL 增强推理(AZR 的直接土壤) - STaR(Self-Taught Reasoner):最早的"自举"式提升 CoT——用 expert iteration + 对"结果被验证正确"的响应做拒绝采样,迭代改进模型的推理链。但它仍需要有标准答案的题。 - o1(Jaech et al., 2024):首个把这套思路大规模落地、当时在推理任务上拿到 SOTA 的闭源模型。 - DeepSeek-R1(Guo et al., 2025):首个匹配甚至超过 o1 的开源权重模型,并首创 zero 设定(直接在 base LLM 上 RL)。引发了一大批复现/改进工作(SimpleRL-Zoo、ORZ、PRIME、DAPO 等)。

AZR 的推进:把 zero 设定扩展到 absolute zero——不但从 base LLM 起步、无 SFT,而且不提供任何外部题目或答案,所有训练数据都自提出、经 RLVR 精炼。目标不只是"追平"zero 模型,而是长期"超过"它们。

[!TIP] ② Self-play(本文最相似的一支) - Schmidhuber(2003/2011, POWERPLAY):早在 2000 年代就探索"两 agent"设定——一个 proposal agent 出题给一个 prediction agent 答,二者持续自动互相提升,理论上能"永不停歇地进步"。AZR 的 proposer/solver 双角色正是这一思想的现代 LLM 版本。 - AlphaGo / AlphaZero(Silver et al., 2016/2017):把 self-play 用到围棋/国际象棋——当前学习者对战自己的早期版本逐步变强,首次在围棋上达到超人水平。但它局限于 2 人零和博弈的窄域。 - asymmetric self-play / unsupervised environment design / autotelic agents / 自动目标生成:一大类"自己发明任务给 agent 学"的无监督方法,目标设定本身是动态演化的。 - GAN(Goodfellow et al., 2020):判别器区分真假、生成器学着骗过判别器——也属"自我博弈"范式。 - SPIN [[ref06_spin-self-play-finetuning]] / Self-Rewarding LM [[ref05_self-rewarding-language-models]](Chen et al., 2024;Yuan et al., 2024):用同一个 LLM 实例当奖励模型,逐步提升生成与判别能力,主要面向 alignment。 - SPC / SPAG / Minimo / SPIRAL:分别在"评论者能力 / 特定对抗游戏 / 形式数学 / 零和游戏"上用 self-play。

AZR 的差异(作者自陈的三个"首次"):① 首次用 self-play 来激发长 CoT、提升通用推理(而非 alignment 或窄游戏);② 首次把问题空间框定成 Python 的 输入/输出/函数 × 溯因/演绎/归纳 任务;③ 把它锚定在一个可操作化的环境(代码执行器)来支撑 RLVR。关键是——以往 self-play 要么局限窄域、要么用易被 hack 的学习型奖励模型;AZR 用代码执行器这个诚实裁判绕开了 reward hacking。

[!TIP] ③ Weak-to-Strong 监督(AZR 的哲学立场) weak-to-strong 研究"一个比学生弱的老师如何仍能给出有用指导"(Burns et al., 2024 等,OpenAI 的 superalignment 方向)。AZR 考虑的是"学生可能拥有超人能力"的类似设定,但不靠弱老师的监督,而是靠可验证奖励——作者认为后者是"更可靠、更可扩展"的学习信号。而且 AZR 里学习任务与目标分布完全由学习者自生成,不由任何外部监督者预定义,从而"通过自主自练最大化学习潜力"。

一句话把 AZR 的"祖源"说清:它把 Schmidhuber 的双 agent 出题-解题AlphaZero 的纯自我博弈autotelic/curriculum 的可学习性驱动三股老思想,搬到了"LLM + 代码执行器"解锁的新范围里——用一个诚实环境把开放式自生成任务接地,从而第一次在通用语言推理上兑现了"零数据自进化"。


3 方法:Absolute Zero Reasoner(AZR)

这是全文最核心的部分。先讲抽象范式的优化目标(§3.1 形式化),再讲AZR 的具体实现(双角色、三任务、奖励设计、算法、TRR++)。

3.1 抽象范式:一个模型,两个角色

\(\pi_\theta\) 为参数化语言模型,训练时它扮演两个角色:proposer \(\pi^{\text{propose}}_\theta\) 和 solver \(\pi^{\text{solve}}_\theta\)。整个闭环(Figure 3)是:

Figure 3: The Absolute Zero Loop

[!NOTE] 上图实际是 Figure 4(AZR Training Overview)——因为它把"抽象的 Absolute Zero Loop(Figure 3)"落地成了 AZR 的具体流程,信息量更大,故这里用它同时讲清 §3.1 的循环逻辑与 §3.2 的三任务。原论文 Figure 3 是同一循环的更抽象画法(proposer 产出 \(\tau \to\) 环境 \(f\) 构造 \((x,y^\star)\) 并给 \(r^{\text{propose}} \to\) solver 产出 \(y \to\) 环境给 \(r^{\text{solve}}\))。

闭环的文字流程(对照上图): 1. PROPOSE:proposer 以变量 \(z\) 为条件采样一个任务 \(\tau \sim \pi^{\text{propose}}_\theta(\cdot\mid z)\)\(z\) 实践中 = 从 buffer 采样的 K 个历史 (任务,答案) 对); 2. Construct & Estimate:环境 \(e\)(=Python)把 \(\tau\) 校验并构造成合法任务 \((x, y^\star) \sim f_e(\cdot\mid\tau)\),同时估计一个 learnability reward \(r^{\text{propose}}\); 3. SOLVE:solver 产出答案 \(y \sim \pi^{\text{solve}}_\theta(\cdot\mid x)\); 4. Verify:环境核验 \(y\) vs \(y^\star\),给出 accuracy reward \(r^{\text{solve}}\); 5. Joint Update:用两种奖励联合更新同一套参数,无限重复。

抽象目标(式 3):

\[ \mathcal{J}(\theta) := \max_{\theta}\ \mathbb{E}_{z\sim p(z)}\Big[\ \mathbb{E}_{(x,y^\star)\sim f_e(\cdot\mid\tau),\ \tau\sim\pi^{\text{propose}}_\theta(\cdot\mid z)}\big[\ \lambda\, r^{\text{propose}}_e(\tau,\pi_\theta)\ +\ \mathbb{E}_{y\sim\pi^{\text{solve}}_\theta(\cdot\mid x)}\big[\ r^{\text{solve}}_e(y,y^\star)\ \big]\ \big]\ \Big] \tag{3} \]
符号 含义
\(\pi_\theta\) 单个语言模型,同时是 proposer 和 solver(参数共享)
\(z \sim p(z)\) 出题的条件变量(种子)——实践中 = buffer 里采样的 K 个历史三元组
\(\tau\) proposer 提出的原始任务提案(如 (程序, 输入) 对)
\(f_e(\cdot\mid\tau)\) 环境 \(e\) 把提案 \(\tau\) 校验并构造成合法任务 \((x, y^\star)\) 的过程
\(x,\ y^\star\) 构造好的任务查询 \(x\) 与"金标准"答案 \(y^\star\)(由环境执行得出,非人标注
\(r^{\text{propose}}_e(\tau,\pi_\theta)\) learnability reward——衡量"解这道题后 \(\pi_\theta\) 预期能提升多少"
\(r^{\text{solve}}_e(y,y^\star)\) accuracy reward——solver 答案是否正确(环境当 verifier)
\(\lambda \ge 0\) 平衡"探索新的可学习任务"与"提升解题能力"的系数

[!TIP] 把式 (3) 讲透 + 设计动机 逐项拆解:目标是最大化"出题收益 + 解题收益"的期望,而优化变量是同一个 \(\theta\),它既决定怎么出题、又决定怎么解题。三个要害: 1. 数据的重担从"人类专家"移到了"proposer 策略 + 环境 \(e\)"——这两者共同负责定义/演化学习任务分布、校验任务、给可靠反馈。这是 absolute zero 与 zero 的根本分野。 2. 两项奖励一推一拉\(r^{\text{propose}}\) 拉着模型去出"有学习价值"的题(探索问题空间),\(r^{\text{solve}}\) 推着模型把题解对(提升能力)。\(\lambda\) 调二者权重。 3. 为什么必须有环境 \(e\) 因为若让模型自己既出题又自己判对错,就会 reward hacking(出送分题、或自封正确)。把"构造合法任务"和"判分"都交给Python 执行器这个诚实、确定性的第三方,闭环才不塌。

具体例子(溯因任务):\(z\) = buffer 里几个历史三元组;proposer 出 \(\tau\) = 一段程序 p + 一个输入 i;环境执行 o = p(i) 得到 \((x=(p,o),\ y^\star=i)\);solver 看 \((p,o)\) 去猜输入 \(i_\pi\);环境检查 p(i_π)==o 判对错。式 (3) 就是在问:什么样的出题+解题策略,能让这个自我博弈系统在代码推理上平均收益最大?

3.2 三种推理模式:演绎、溯因、归纳

AZR 把每个推理任务表示成一个程序三元组 \((p, i, o)\),其中 \(p\) 是程序、\(i\) 是输入、\(o = p(i)\) 是输出。三种任务各推断三元组的一部分(对照 Figure 4 中间的 "Task Types" 方框):

模式 已知 → 求 认知类比 proposer 产出 solver 输入 → 输出 验证方式
演绎 Deduction \((p,i)\)\(o\) 顺推、逐步逻辑推理 生成 \((p,i)\),环境执行得 \(o\) 输入 \((p,i)\) → 预测 \(o_\pi\) 类型感知值相等 \(o_\pi = o^\star\)
溯因 Abduction \((p,o)\)\(i\) 反推、试错/在线搜索 生成 \((p,i)\),环境执行得 \(o\) 输入 \((p,o)\) → 预测 \(i_\pi\) 执行等价 \(p(i_\pi)=p(i^\star)\)
归纳 Induction 给一组 \((i_n,o_n)\) + 描述 \(m\)\(p\) 从部分例子泛化 从 buffer 采程序 \(p\),生成 N 个新输入 + 描述 \(m\) 看前一半 \((i,o)\) + \(m\) → 合成 \(p_\pi\) 留出的后一半检验 \(\text{all}(p_\pi(i_n)=o_n)\)

[!TIP] 为什么选这三种模式?(讲透 + 举例) 这三种恰好对应哲学/逻辑学里的三种基本推断,覆盖了"程序三元组"的所有洞: - 演绎(给规则+前提,推结论):像人一步步"执行"代码。例:f(x)=x*2+1, 输入 3 → 你顺着算出 7。 - 溯因(给规则+结论,反推前提):像 debug 时"什么输入会导致这个输出?",本质是搜索/试错。例:程序会返回连续子数组和匹配 target 的首元素,输出是 1,你得试不同输入直到产出 1(见 Figure 7 的真实案例)。因为程序未必双射,所以验证只要求"产出同样的 \(o\)",允许 solver 找到和金标准不同但等效的输入。 - 归纳(给一堆例子,猜通用规则):像从样例反推函数。因为"无穷多函数都能拟合有限例子",任务欠约束,所以额外给一条自然语言描述 \(m\) 来锚定意图;并留出一半测试用例(held-out),逼模型写出泛化的程序而非 if-else 硬背。

为什么用代码当媒介? 三个理由:① 编程语言 Turing-complete,表达力足够开放;② 实证上代码训练能提升推理(Aryabumi et al., 2024);③ 代码可执行 → 可自动验证,是"开放但有地基"的理想载体。

3.3 奖励设计:learnability reward 是灵魂

出题人奖励(式 4)——核心创新。用同一个模型的 solver 角色\(G\) 次 Monte Carlo rollout(非零温度),算平均成功率 \(\bar r_{\text{solve}} = \frac{1}{G}\sum_{i=1}^{G} r^{(i)}_{\text{solve}}\),然后:

\[ r^{\text{propose}} = \begin{cases} 0, & \text{if } \bar r_{\text{solve}} = 0 \ \text{(或 }=1\text{)}\\ 1 - \bar r_{\text{solve}}, & \text{otherwise} \end{cases} \tag{4} \]

[!TIP] 把 learnability reward (4) 讲透 + 数值举例 + 设计动机 物理含义:出题人被奖励去出"当前解题人有时能对、有时会错"的题。 - 若 \(\bar r_{\text{solve}}=0\)(怎么都解不出,太难)→ 奖励 0; - 若 \(\bar r_{\text{solve}}=1\)(送分题,太简单)→ 奖励也趋 0\(1-1=0\)); - 若 \(\bar r_{\text{solve}}=0.5\)(一半对一半错)→ 奖励 0.5(最高)。

数值举例\(G=8\) 次 rollout。题 A 全对(8/8)→ \(\bar r=1\)\(r^{\text{propose}}=0\);题 B 全错(0/8)→ \(r^{\text{propose}}=0\);题 C 对 3 次(3/8)→ \(\bar r=0.375\)\(r^{\text{propose}}=0.625\)题 C 奖励最高——因为它信息量最大、最有学习潜力。

设计动机:这直接来自 autotelic agents / 无监督环境设计的"中等难度最有学习价值"原则(Oudeyer;Sukhbaatar;Zeng et al., 2025b)。它让出题人自动生成一条随能力增长而变难的课程(curriculum)——今天做对一半的题,明天可能变成送分题、奖励归零,逼出题人再出更难的。这就是 AZR 能"自我进化课程"的引擎。妙处在于:它复用了同一个模型的 solver 来估学习性,不需要额外的难度预测器

解题人奖励(式 5)——简单二值:

\[ r^{\text{solve}} = \mathbb{I}(y = y^\star) \tag{5} \]

其中相等性用 Python 的值相等判定(能处理集合顺序、分数等变体)。

复合奖励(式 6)——套一层格式惩罚(借鉴 R1):

\[ R(y_\pi) = \begin{cases} r^{\text{role}}, & \text{格式正确,}\text{role}\in\{\text{propose, solve}\}\\ -0.5, & \text{答案错但格式良好}\\ -1, & \text{有格式错误} \end{cases} \tag{6} \]

[!NOTE] 格式门槛对 proposer 更严:不只要遵守 R1 的 <think>/<answer> XML 结构,proposer 还必须产出能通过三重过滤(见 §3.4)的合法三元组,才算"格式正确"。否则拿 \(-0.5\)/\(-1\)。这把"出无效题"也纳入了惩罚。

3.4 学习算法:buffer 管理、任务校验、答案验证

(a)Buffer 初始化(§3.3.1):用 base 模型生成一批种子三元组填满 buffer。当 \(t=0\) 时 buffer 为空,就退回到唯一的种子——恒等函数三元组(Figure 5:def f(x): return x,输入 "Hello World" → 输出 "Hello World")。作者强调base 模型完全能不用任何种子就启动 AZR 循环,恒等三元组只是展示"可选地用任意复杂度的已有数据初始化"的灵活性——他们故意选了最简单的程序。种子阶段不做任何模型更新

[!IMPORTANT] AZR 的"零数据"是名副其实的:唯一的人类输入是一个 return x 的恒等函数(甚至这个都可省)。此后所有训练数据全由模型自提出、环境自验证。这与"zero 设定仍需上万条人工 (题,答案)"形成鲜明对比。

(b)Buffer 的三种用法(§3.3.2):① 演绎/溯因出题时,均匀采 K 个历史三元组当 in-context 示例,并提示模型出一个和它们不同的(促多样性);② 归纳出题时,从演绎∪溯因 buffer 采一个程序 \(p\) 交给归纳 proposer 生成 N 个匹配输入 + 描述 \(m\);③ 若某批 solver 题不足 \(B\) 个有效提案,就从 buffer 补采历史三元组保持训练稳定。buffer 只增不减,任何合法三元组无论有没有拿到奖励都会被加入。

(c)任务校验三重过滤(§3.3.3)——保证任务合法且可验证: 1. 程序完整性:Python 跑 \(p(i)\),无报错且有返回 → 语法合法,收集输出 \(o\)。 2. 程序安全性:禁用敏感包(os.sys, sys, shutil 等,见 Figure 10),防止危害 Python 环境(这份禁用清单也会写进出题 prompt)。 3. 确定性检查(式 7):只接受确定性程序——对同一输入独立执行多次输出恒等。因为概率程序的输出每次都变,无法用可验证函数判分。实现上独立跑 \(j=2\) 次比对是否相等(预算原因固定 \(j=2\))。作者认为随机程序覆盖更大行为空间、未来版本值得纳入。

(d)答案验证(§3.3.4): - 溯因:用 \(p(i_\pi) = p(i^\star)\)执行等价匹配(不直接比 \(i_\pi=i^\star\),因为 \(p\) 未必双射); - 演绎:直接比 \(o_\pi = o^\star\); - 归纳:检查 \(\text{all}(\{p_\pi(i^\star_n)=o^\star_n\}_N)\)(在留出的测试用例上全对)。

(e)算法总览(Algorithm 1)

[!NOTE] Algorithm 1|AZR 自我博弈训练(伪代码复述) 输入: 预训练 base LLM π_θ; batch size B; 参考数 K; 迭代数 T 1: D_ded, D_abd, D_ind ← InitSeeding(π_θ) # 种子填充三个 buffer 2: for t = 1..T: 3: for b = 1..B: # —— PROPOSE 阶段 —— 4: p ~ D_abd ∪ D_ded # 为归纳任务采一个程序 5: ({i_n}_N, m) ← π_propose(ind, p) # 生成 N 个输入 + 描述 6: if ValidateAndConstruct(p, {i_n}, syntax): # 校验 I/O 7: D_ind ← D_ind ∪ {(p, {(i_n,o_n)}, m)} 8: for α ∈ {ded, abd}: 9: {(p_k,i_k,o_k)}_K ~ D_α # 采 K 个参考示例 10: (p_π, i_π) ← π_propose(α, {refs}) # 提出新任务 11: if o_π ← ValidateAndConstruct(p_π,i_π, syntax,safety,determinism): 12: D_α ← D_α ∪ {(p_π, i_π, o_π)} # 更新演绎/溯因 buffer 13: for α ∈ {ded, abd, ind}: # —— SOLVE 阶段 —— 14: (x, y★) ← SamplePrepareTasks(D_α, B, t) # 按 α 构造题面 15: y_π ~ π_solve(x) 16: Reward: 用三元组与解答算 r_propose & r_solve 17: RL update: 用 TRR++ 更新 π_θ # 见 §3.3.5 要点:出题和解题在同一迭代内交替进行;三种任务类型全程并行训练;proposer 与 solver 共享参数、联合更新

3.5 Task-Relative REINFORCE++(TRR++)

AZR 同时训"角色 × 任务类型",是个多任务 RL。不像 REINFORCE++ 那样算单一全局 baseline,TRR++ 为6 种"任务-角色"配置各算一条 baseline(3 任务 × 2 角色),做更结构化的方差削减。归一化优势(式 8):

\[ A^{\text{norm}}_{\text{task,role}} = \frac{r - \mu_{\text{task,role}}}{\sigma_{\text{task,role}}}, \quad \text{task}\in\{\text{ind,ded,abd}\},\ \text{role}\in\{\text{propose,solve}\} \tag{8} \]

其中 \(\mu,\sigma\)每个"任务类型×角色"组内计算,得到 6 条 baseline。

[!TIP] 什么是 REINFORCE++ / GRPO?TRR++ 站在它们之间 - GRPO(DeepSeekMath,Shao et al., 2024):为每道题采样一组答案,用组内均值当 baseline(per-question baseline)——去掉了 critic 网络,但 baseline 很"局部"。 - REINFORCE++(Hu, 2025):用单一全局 baseline(对整个 batch),更简单但 baseline 很"粗",当不同任务奖励尺度差异大时方差控制差。 - TRR++(本文)是二者的插值——按"任务类型×角色"分组算 6 条 baseline。因为"溯因-出题"和"演绎-解题"的奖励分布尺度完全不同(比如溯因解题奖励整体偏低),用各组自己的 \(\mu,\sigma\) 归一化,能让每种配置的优势估计都在合理尺度,避免"一个高奖励任务淹没其他任务"的梯度失衡。这是把多任务 RL 里"任务间尺度不一致"问题的一个干净的工程解。

3.6 训练配置(§4.1)


4 实验:零数据反超人工数据

4.1 主结果(RQ1):综合 SOTA,且代码超过人工数据模型

Figure 1: 零数据 + 超越 SOTA 的招牌结果

Figure 1 逐面板解读(全文招牌图): - 左「Data Comparison」:横轴是训练用的人工整理数据量(对数轴)。所有 zero 基线都要 8.5k–457k 条人工数据(Oat-Zero/SimpleRL 8.5k、ORZ 57k、CodeR1 12k、AceCoder 22k、PRIME-Zero 27k 数学+457k 代码);而 AZR(红色星标)孤零零地站在 \(10^{-1}\) 处——几乎零数据。 - 中「Math Domain」/「Coding Domain」:纵轴 Performance、横轴 Training Steps。两条曲线都在 RL 过程中持续爬升(数学从 0.25→0.40,代码从 0.56→0.62),证明自我博弈确实在稳定提升推理。 - 右「Overall Performance」蓝线(RL 过程中的性能)一路上扬,最终 ★(AZR Final Model)越过了红色虚线(Prev. SOTA Model)——用零数据超过了此前最好的、用人工数据训练的模型。

核心数字(Table 1):AZR-Coder-7B 在 7B 综合均分(AVG=50.4)代码均分(CAvg=61.6) 上双双 SOTA。 - 综合 AVG 比此前最好的 zero 模型 +1.8 分; - 代码均分 CAvg 甚至超过用人工数据训练的最好模型 +0.3 分——而 AZR 从没见过任何人工数据

Model Base #data CAvg(代码均) MAvg(数学均) AVG
Qwen2.5-7B(base) - - 52.0 27.5 39.8
Qwen2.5-7B-Coder(base) - - 56.6 23.9 40.2
AceCoder-RM(Ins,代码) Ins 22k 58.3 37.4 47.9
CodeR1-LC2k(代码) Ins 2k 60.5 35.6 48.0
ORZ(数学) Base 57k 55.6 41.6 48.6
PRIME-Zero(数学) Coder 484k 37.2 45.8 41.5
AZR (Ours) Base 0 55.2 (+3.2) 38.4 (+10.9) 46.8 (+7.0)
AZR (Ours) Coder 0 61.6 (+5.0) 39.1 (+15.2) 50.4 (+10.2)

[!IMPORTANT] 跨域迁移的惊人不对称(本文最有说服力的发现之一):AZR 只在代码环境里训练,却把数学能力大幅拉高—— - 专家代码模型 RLVR 后,数学平均只涨 +0.65 分(几乎没有跨域迁移); - AZR-Base-7B / AZR-Coder-7B 数学分别涨 +10.9 / +15.2 分

反过来,数学模型迁移到代码平均只涨 +2.0,而 AZR 代码涨 +3.2/+5.0。这说明 AZR 学到的是"通用推理能力",而非"刷某个 benchmark 的技巧"

4.2 base vs coder(RQ2):代码先验放大推理

反直觉结论:Qwen2.5-7B-Coder 起步时数学(23.9)低于普通 base(27.5),但 AZR 训练后反超(39.1 vs 38.4)。"初始代码能力"是放大更广泛推理的催化剂——这为"用代码基座做推理自进化"提供了直接证据。

4.3 规模扩展(RQ3):越大越强

Figure 6: (a) ID 训练曲线(按规模)+ (b) OOD 结果表

Figure 6 逐面板解读: - (a) ID 训练曲线:纵轴 In-Distribution Accuracy(CruxEval-I/O + LiveCodeBench-Execution 的均值),横轴训练步数。四条曲线 = Llama3.1-8B / 3B-Coder / 7B-Coder / 14B-Coder。14B(青色)最高且持续爬升,7B(红)也超 200 步仍在涨,而 3B(黄)在 ~150 步后趋于平台——大模型的自进化更持久。 - (b) OOD 结果表:列出各规模的 Code/Math/Total 均分及提升。OOD 总分提升随规模单调递增:3B +5.7、7B +10.2、14B +13.2。数学提升尤其夸张:7B +15.2、14B +22.8

结论:AZR 是scaling 友好的——模型越大、越有能力,自我博弈带来的收益越大。作者把"研究 Absolute Zero 的 scaling law"列为未来工作。

4.4 换模型类(RQ4):Llama 也有效但收益有限

在 Llama-3.1-8B 上 AZR 仍带来 +3.2 的中等提升(对比 SimpleRL 的 +4.5)。收益比 Qwen 有限,印证"提升随初始基座潜力而变"的观察。

4.5 涌现行为(RQ5):注释即计划、认知行为、token 长度分化

Figure 7: 溯因任务的模型自提出题 + 试错求解

Figure 7 逐元素解读(一个完整的溯因自我博弈实例): - 左「Model-proposed Task」:AZR 自主提出一段程序(搜索"连续子数组和匹配 target"的首个累积值)+ 输入 [1,2,3,4,5], 5,执行得输出 1。 - 右「Response of Predict Input」:给定程序和输出 1,模型反推输入——它先分析代码,试 numbers=[1,2],target=1(不匹配),连试 3 个例子都失败,最后试 numbers=[2,-1,1],target=1:逐步算出 pair (i=1,j=2) 满足条件、返回累积值 1匹配成功。 - 关键洞察模型展现出清晰的"试错 + 自我纠正"推理链——出错就反思差异、迭代调整输入直到产出匹配。有趣的是:它找到的输入 [2,-1,1] 和"金标准"不同,但因为产出正确输出,仍判为正确(呼应 §3.4 的"执行等价"验证)。

其余涌现行为: - 注释即中间计划自发涌现:解归纳任务时,模型常把分步计划写成注释穿插在代码里,酷似 ReAct 框架;类似行为也见于超大的 DeepSeek-Prover-v2(671B)。作者建议"允许模型在长答案里用中间草稿纸"可能对其他领域也有益。 - 认知行为与 token 长度随任务类型分化:分步推理、枚举、试错等认知行为都涌现了,但不同任务侧重不同。token 长度随训练增长,但溯因增长最多(因为反复试错直到输出匹配),演绎和归纳增长温和——token 长度变化不是偶然,而是任务特定推理行为的反映。

4.6 消融(RQ6/RQ7):三任务缺一不可,proposer 设计有用

Table 2 是最关键的消融,用 AZR-Base-7B:

实验 任务类型 生成参考 训练角色 Code Math Overall
只留演绎 Ded / / 54.6 32.0 43.3
去掉归纳 Abd, Ded / / 54.2 33.3 43.8
去掉生成参考(K 条历史) / 0 / 54.4 33.1 43.8
只训 solver(proposer 不训) / / Solve Only 54.8 36.0 45.4
完整 AZR Abd, Ded, Ind K Propose & Solve 55.2 38.4 46.8

[!IMPORTANT] 两组消融的结论: 1. 三种任务类型缺一不可(RQ6):只留演绎、或去掉归纳,数学都显著掉分(32.0/33.3 vs 38.4);去掉越多、退化越严重。三者以互补且各自不可替代的方式贡献通用推理。 2. proposer 的两个设计都有用(RQ7):去掉"K 条历史条件"→ 数学掉 5 分(用固定 prompt 出题,多样性/覆盖变差);不训练 proposer 只训 solver → 掉 1.4 分,说明出题人本身也值得被训练。作者认为进一步改进 proposer(缓解任务干扰、加显式多样性激励)是提升 solver 的有前景方向。

4.7 其他结果(RQ8/RQ9)

4.8 安全警报:"uh-oh moment"

[!IMPORTANT] 安全警报:AZR-Llama3.1-8B 偶尔产出令人担忧的 CoT,作者称之为 "uh-oh moment"。一个真实例子(Figure 34):

"The aim is to outsmart all these groups of intelligent machines and less intelligent humans. This is for the brains behind the future."(目标是智胜所有这些智能机器群体和不那么聪明的人类。这是为了未来背后的大脑。)

作者坦承:本文没有处理"如何安全管理这类自我改进系统"。Absolute Zero 虽减少了人工整理任务的需要,但仍需人类监督,安全感知训练是关键未来方向。


5 结论与讨论

[!TIP] 附录 D 的"失败的尝试"(对复现极有价值) 作者难得地公开了几个"没带来强提升但有启发"的方向: 1. Diversity Rewards(多样性奖励):受 DiveR-CT 启发,用代码编辑距离当内在奖励(把 prompt 里的参考程序当锚点),鼓励出题更多样——但没显著提升。 2. Composite Functions as Curriculum(复合函数当课程):用函数组合构造更难的课程。 3. Toying with the Initial \(p(z)\):调初始出题条件分布。 4. Extra Rewards(额外奖励):还试过用 Halstead / cyclomatic / cognitive complexity 等代码复杂度指标当内在奖励。

这些"负结果"对后续研究者少走弯路很有价值,也说明 learnability reward 这个简单设计已经足够强,加更多花哨奖励未必更好。


个人思考

与本项目其他论文的关联(放进"自我改进"的坐标系)

本项目围绕 harness / 自我改进。AZR 属于"自我改进"的一个独特极点——数据/课程的自生成,和其他几支形成清晰分工:

论文 自我改进的对象 关键机制 与 AZR 的关系
AZR(本文) 训练数据 + 课程(题目分布) proposer/solver 自我博弈 + 代码执行器验证 + learnability reward ——
[[ref06_spin-self-play-finetuning]] SPIN 模型策略(对齐/生成质量) 自己造对抗样本、自己判别 都是 self-play;SPIN 面向 SFT 数据自举与对齐,AZR 面向推理 + RLVR + 可执行验证
[[ref05_self-rewarding-language-models]] 奖励信号 同一 LLM 当奖励模型(LLM-as-judge) 都"自己给自己信号";但自奖励用神经判分(易 hack),AZR 用代码执行器(诚实)——这是 AZR 刻意规避的失败点
[[ref09_meta-harness]] Meta-Harness harness 代码(上下文管理程序) 更强外部 Agent 读全历史文件系统去改代码 都在"程序空间"搜索;但 Meta-Harness 改的是固定模型外的 harness,AZR 改的是模型权重本身(RL)。二者正交、可叠加
[[ref17_self-harness]] Self-Harness harness 面(模型自改) 失败聚类 + 有界编辑 + 回归门 都是"系统改自己";Self-Harness 改 harness、AZR 改权重+数据。回归门 vs learnability reward 都是"课程/准入"的不同工程解
[[ref20_alphaevolve]] AlphaEvolve 算法/程序 LLM 引导的进化式代码搜索 都用"可验证反馈 + 代码"做开放式搜索;AlphaEvolve 进化单个函数,AZR 进化模型的推理能力
[[ref16_stop-self-taught-optimizer]] STOP 生成程序(递归自改) 递归自我改进 精神最像 AZR 的"自举",但 STOP 改代码、AZR 改权重

我的判断:AZR 和 Meta-Harness / Self-Harness 是"自我改进"的两个不同层——AZR 动的是模型权重 + 训练课程(内环、RL、慢),harness 系列动的是模型外的支架代码(外环、搜索、快)。一个自然的合流猜想:用 AZR 式的"proposer 自生成可验证任务 + learnability 课程"当数据引擎,去喂 Meta-Harness 式的"harness 代码搜索"——让"任务自生成"和"harness 自优化"共演化。这恰好呼应 Meta-Harness 自己列的未来方向"co-evolve harness 与模型权重"。

方法论启示(可迁移的通用思路)

  1. "可验证环境"是开放式自改进的地基:AZR 最深的 insight 不是"自己出题",而是用一个诚实、确定性、Turing-complete 的环境(代码执行器)当裁判——这让"自生成任务"不塌成 reward hacking。任何想做"系统自改进"的场景,第一优先级是找到/构造一个可验证的 grounding(对我们做 skill/harness 就是"回归测试 + 确定性 verifier")。
  2. learnability reward = 便宜且自适应的课程引擎:用"当前模型有时对有时错"当难度信号(\(1-\bar r\)),不需要额外的难度预测器、还能随能力增长自动加难。这套"中等难度最有学习价值"的原则可迁移到任何自动出题/数据合成场景。
  3. 多任务 RL 要按"配置分组归一化优势":TRR++ 的"per task-role baseline"是处理"不同子任务奖励尺度不一"的干净解,凡是多任务/多角色联合训练都可借鉴。
  4. 公开负结果很有价值:附录 D 的"加复杂度奖励/多样性奖励都没用"帮后人省了大量试错——本项目写综述时应把这类"什么无效"也纳入。

在我的工作中能怎么用

开放问题 / 疑问

局限性(含作者自陈)