源文件:chapter7/Intuitor/README.md Intuitor: 无需外部奖励的推理学习 基于论文:Learning to Reason without External Rewards 论文链接 | Hugging Face 📖 项目简介 Intuitor 是一种创新的强化学习方法,它使用自我确定性(self-certainty)——即模型自身的内部置信度——作为唯一的奖励信号来微调大语言模型(LLM)。这一方法建立在一个全新的训练范式之上:内部反馈强化学习(Reinforcement Learning from Internal Feedback, RLIF)。
源文件:chapter7/Intuitor/README.md
基于论文:Learning to Reason without External Rewards
Intuitor 是一种创新的强化学习方法,它使用自我确定性(self-certainty)——即模型自身的内部置信度——作为唯一的奖励信号来微调大语言模型(LLM)。这一方法建立在一个全新的训练范式之上:内部反馈强化学习(Reinforcement Learning from Internal Feedback, RLIF)。
Intuitor 代表了大语言模型能力提升的第三条曲线:
RLIF(Reinforcement Learning from Internal Feedback) 是本文提出的一种无监督强化学习方法,属于第三曲线的一种实现方式。
RLIF 的核心思想是:语言模型通过优化内在信号(如自我置信度、内部一致性)来自我提升,无需任何外部奖励、标准答案或验证器。
第三曲线:无监督强化学习(Unsupervised RL) ├─ 内部反馈(Internal Feedback) │ └─ RLIF(本文方法):使用 self-certainty 作为奖励 ├─ 一致性(Consistency) │ ├─ TTRL:使用 plurality voting │ └─ Self-consistency:多次采样的一致性 ├─ 规则奖励(Rubrics-based) │ └─ 基于预定义评分标准 ├─ 新颖性(Novelty-based) │ └─ 鼓励探索未知区域 └─ 多智能体(Multi-agent) └─ 通过辩论或协作产生奖励
第三曲线使得 LLM 能够在人类反馈或可验证监督昂贵或不可用的场景下,实现可扩展且领域无关的微调。这对于未来 AI 系统在开放式、创造性、主观性任务上的发展至关重要。
Intuitor 通过使用**自我确定性(Self-Certainty)**作为内在奖励,在 GRPO(Group Relative Policy Optimization)策略优化算法中实现了 RLIF。
核心观察:大语言模型在面对困难问题时通常表现出较低的置信度,而在熟悉任务上则展现更高的确定性。通过优化模型自身的置信度,可以引导模型学习更有效的推理路径,从而提升推理能力。
Intuitor 不仅仅是"又一个推理模型",它代表了 LLM 能力提升的范式转变:
第一曲线(Pretrain) → 学习"是什么"(知识) 第二曲线(RLVR) → 学习"对不对"(数学、代码的正确性) 第三曲线(Unsupervised RL) → 学习"好不好"(通用质量提升) └─ Intuitor 使用内部反馈(self-certainty)实现
第二曲线的天花板:
Intuitor 的解决方案:
| 指标 | 结果 | 意义 |
|---|---|---|
| 数学(MATH500) | 61.2% vs GRPO 63.6% | 无监督下性能相当 |
| 代码(LiveCodeBench) | +65% vs GRPO -8% | 跨领域泛化碾压 |
| 指令遵循(AlpacaEval) | 7.10 vs Base 3.72 | 通用能力显著提升 |
关键发现:在 MATH 上训练的 Intuitor 模型,自动学会了代码生成能力,且优于在 MATH 上训练的 GRPO!这证明了其学到的是通用的推理能力,而非特定任务的模式。
当 AI 能力超越人类(科学发现、战略决策)时:
根据论文实验结果(基于 Qwen2.5-3B,在 MATH 数据集上训练):
完全无监督学习
域内性能相当
域外泛化显著更强(这是关键优势)
涌现能力
快速学习
我们已经发布了四个在 MATH 数据集上训练一个 epoch 的模型检查点:
| 模型名称 | 大小 | 方法 | Hugging Face 链接 |
|---|---|---|---|
| sunblaze-ucb/Qwen2.5-1.5B-Intuitor-MATH-1EPOCH | 1.5B | Intuitor | 查看模型 |
| sunblaze-ucb/Qwen2.5-3B-Intuitor-MATH-1EPOCH | 3B | Intuitor | 查看模型 |
| sunblaze-ucb/OLMo-2-7B-SFT-Intuitor-MATH-1EPOCH | 7B | Intuitor | 查看模型 |
| sunblaze-ucb/Qwen3-14B-Intuitor-MATH-1EPOCH | 14B | Intuitor | 查看模型 |
本教程使用 verl-intuitor 实现,这是基于 VERL 的高性能 RL 训练库,专为大语言模型设计。
原始仓库:https://github.com/sunblaze-ucb/Intuitor
git clone https://github.com/sunblaze-ucb/Intuitor.git cd Intuitor/verl-intuitor
首先安装 VERL 和相关依赖:
# 创建 Python 虚拟环境(推荐) conda create -n intuitor python=3.10 conda activate intuitor # 安装 PyTorch(根据你的 CUDA 版本调整) pip install torch==2.1.0 torchvision==0.16.0 torchaudio==2.1.0 --index-url https://download.pytorch.org/whl/cu118 # 安装 VERL pip install -e . # 安装其他依赖 pip install wandb transformers datasets accelerate
运行以下 Python 脚本下载并预处理 MATH 数据集:
python examples/data_preprocess/math_dataset_ours.py --model Qwen2.5-3B
在运行训练之前,需要修改 math_intuitor.sh 脚本,添加你的 WANDB API Key:
# 编辑 math_intuitor.sh vim math_intuitor.sh # 在脚本开头添加以下行: export WANDB_API_KEY=YOUR_WANDB_API_KEY
将 YOUR_WANDB_API_KEY 替换为你的实际 WANDB API Key(可在 wandb.ai/authorize 获取)。
配置完成后,运行训练脚本:
bash math_intuitor.sh
重要提示:Intuitor 中唯一的启发式设计是用于查询模型的提示词(prompt)。因此,性能有时可能对提示词设计敏感。如果模型学习效果不佳,建议尝试替代的提示词,或使用我们设置中提供的原始提示词。
如果需要使用 Ray 进行多节点训练,请查看 ./scripts_ray 文件夹中的详细说明和脚本。
训练完成后,按照论文方法使用 lighteval 进行标准化评测。
为什么使用 lighteval?
- ✅ 论文使用的官方评测工具
- ✅ Hugging Face Leaderboard 的标准评测框架
- ✅ 支持 7,000+ 评测任务,覆盖数学、代码、多语言等
- ✅ 统一的评测标准,结果可对比
pip install lighteval
首先将训练检查点转换为 Hugging Face 格式:
python -m verl.model_merger merge \ --backend fsdp \ --local_dir /root/Intuitor/verl-intuitor/checkpoints/verl/math_intuitor/global_step_57 \ --target_dir math_intuitor_model
参数说明:
--backend fsdp:使用 FSDP(Fully Sharded Data Parallel)后端--local_dir:训练检查点的路径(根据实际路径调整)--target_dir:输出的 Hugging Face 格式模型目录在评测前必须修改 lighteval 源码,否则会遇到两个问题:
\boxed{} 格式的答案找到 lighteval 安装路径中的任务配置文件:
# 找到 lighteval 安装位置 python3 -c "import lighteval; print(lighteval.__file__)" # 输出示例:/path/to/site-packages/lighteval/__init__.py # 编辑任务配置文件 vim $(python3 -c "import lighteval.tasks.default_tasks as t; print(t.__file__)")
在 default_tasks.py 中找到 GSM8K Leaderboard 的配置(搜索 "gsm8k_leaderboard"),将 generation_size 从 256 修改为 2048:
# 修改前: LightevalTaskConfig( name="gsm8k", ... generation_size=256, # ← 原始值太小 ... ) # 修改后: LightevalTaskConfig( name="gsm8k", ... generation_size=2048, # ← 改为 2048,为推理链提供足够的 token budget ... )
找到并编辑 normalizer 文件:
# 编辑 normalizations.py vim $(python3 -c "import lighteval.metrics.normalizations as n; print(n.__file__)")
找到 gsm8k_normalizer 函数(约第 379 行),将其替换为以下代码:
def gsm8k_normalizer(text: str) -> str: """From https://github.com/openai/grade-school-math/blob/3101c7d5072418e28b9008a6636bde82a006892c/grade_school_math/dataset.py#L28 Extended to support \\boxed{} format commonly used by reasoning models. Args: text (str): input text Returns: str: Output text, either the number found in the text or "[invalid]" if no number was found """ INVALID_ANS = "[invalid]" # Try to extract from \\boxed{} format first (for reasoning models like Intuitor) # This pattern matches both \boxed{number} and \(\boxed{number}\) boxed_match = re.search(r'\\boxed\{([^}]+)\}', text) if boxed_match: match_str = boxed_match.group(1).strip() match_str = match_str.replace(",", "") # Extract only the number part (remove any non-numeric trailing text) number_match = re.search(r'-?[0-9\.\,]+', match_str) if number_match: return number_match.group(0).replace(",", "") # Original #### format (for standard GSM8K format) ans_re = re.compile(r"#### (\-?[0-9\.\,]+)") match = ans_re.search(text) if match: match_str = match.group(1).strip() match_str = match_str.replace(",", "") return match_str # If no pattern matched, return invalid return INVALID_ANS
修改说明:
#### 格式支持\boxed{}:可识别 \boxed{52} 和 \(\boxed{5}\) 等 LaTeX boxed 格式\boxed{52 WPM})也能提取数字为什么需要这两处修改?
\boxed{} 格式,与 GSM8K 标准的 #### 格式不同lighteval accelerate \ "model_name=math_intuitor_model/" \ "leaderboard|gsm8k|0"
lighteval 会自动生成详细的评测报告:
# 结果保存在指定的输出目录 ls ./eval_results/ # 查看详细结果(JSON 格式) cat ./eval_results/results.json
如果 lighteval 显示 0% 准确率(因为模型输出 \boxed{} 格式而非 #### 格式),可以使用提供的脚本从缓存的 parquet 文件重新计算准确率:
# 找到缓存的 parquet 文件 # 路径格式:~/.cache/huggingface/lighteval/{model_name}/{hash}/leaderboard|gsm8k|0/{hash}/GENERATIVE.parquet ls ~/.cache/huggingface/lighteval/math_intuitor_model/*/leaderboard\|gsm8k\|0/*/GENERATIVE.parquet # 使用脚本重新计算准确率(支持 \boxed{} 格式) python3 evaluate_from_cache.py \ ~/.cache/huggingface/lighteval/math_intuitor_model/*/leaderboard\|gsm8k\|0/*/GENERATIVE.parquet # 显示详细信息和错误样本 python3 evaluate_from_cache.py \ ~/.cache/huggingface/lighteval/math_intuitor_model/*/leaderboard\|gsm8k\|0/*/GENERATIVE.parquet \ -v # 保存结果到 JSON 文件 python3 evaluate_from_cache.py \ ~/.cache/huggingface/lighteval/math_intuitor_model/*/leaderboard\|gsm8k\|0/*/GENERATIVE.parquet \ -o results.json
脚本功能:
\boxed{} 格式答案提取(包括 \(\boxed{}\) 等变体)示例输出:
📂 读取预测结果: /root/.cache/huggingface/lighteval/.../GENERATIVE.parquet 📊 总样本数: 1319 📥 加载 GSM8K 金标答案... ================================================================================ 📈 评测结果 ================================================================================ 总样本数: 1319 正确数量: 623 错误数量: 696 准确率: 47.23% ================================================================================
根据论文,以下是主要的评测基准:
| 基准 | lighteval 任务名 | 类型 | 用途 |
|---|---|---|---|
| GSM8K | `leaderboard | gsm8k | 0` |
| MATH500 | `leaderboard | math500 | 0` |
| LiveCodeBench | `leaderboard | lcb | 0` |
| CRUXEval-O | `leaderboard | cruxeval | 0` |
| MMLU-Pro | `leaderboard | mmlu_pro | 0` |
| AlpacaEval | 需单独工具 | 指令遵循 | 对话能力 |
注意:AlpacaEval 需要使用其官方工具进行评测,因为它需要 GPT-4 作为评判器。
根据论文,在 Qwen2.5-3B base 模型上的实验结果:
对于 Qwen2.5-1.5B base 模型(原始模型在 LiveCodeBench 上得分 0%):
使用修改后的 lighteval(支持 \boxed{} 格式 + 2048 tokens generation size)进行评测:
lighteval accelerate "model_name=math_intuitor_model" "leaderboard|gsm8k|0"
| 模型 | 准确率 | 正确数 | 总数 | 备注 |
|---|---|---|---|---|
| Qwen2.5-3B + Intuitor | 78.09% | 1,030 | 1,319 | 使用 MATH 数据集训练 |
结果分析:
\boxed{number} 格式)| 模型 | 准确率 | 正确数 | 总数 | 备注 |
|---|---|---|---|---|
| Qwen2.5-1.5B Base | 0.38% | 5 | 1,319 | 原始基座模型,无训练 |
| Qwen2.5-1.5B + Intuitor | 70.13% | 925 | 1,319 | 使用 MATH 数据集训练 |
结果分析:
Base 模型(0.38%):
\boxed{answer} 格式训练后模型(70.13%):
\boxed{number} 格式)1.5B vs 3B 对比:
很多人容易混淆 Intuitor 和 DeepSeek R1-Zero,因为两者都不使用人工标注的推理过程。但它们有本质区别:
训练流程:
问题 → 模型生成推理链 + 答案 → 验证答案是否正确 → GRPO 更新 ↑ 需要金标答案!
特点:
r = 1 if 答案正确 else 0(二元奖励)论文描述(DeepSeek R1 Technical Report):
"We first explore RL without supervised fine-tuning (SFT) data, termed RL from scratch (dubbed R1-Zero). Starting from Qwen base model with only a few prompt engineering trials, R1-Zero successfully developed strong reasoning capabilities comparable to R1 with SFT."
关键点:R1-Zero 的"Zero"指的是零 SFT 数据(无需标注推理过程),但仍然依赖于可验证的奖励函数(答案正确性)。
训练流程:
问题 → 模型生成推理链 + 答案 → 计算 self-certainty → GRPO 更新 ↑ 完全无需外部验证!
特点:
u = Self-Certainty(输出)(连续、token 级别)| 维度 | DeepSeek R1-Zero | Intuitor |
|---|---|---|
| 所属曲线 | 第二曲线(RLVR) | 第三曲线(无监督 RL) |
| 具体方法 | 可验证奖励 | 内部反馈(RLIF) |
| 是否需要金标答案 | ✅ 必须 | ❌ 不需要 |
| 是否需要标注推理 | ❌ 不需要 | ❌ 不需要 |
| 奖励来源 | 外部验证器 | 内在置信度 |
| 奖励类型 | 二元(对/错) | 连续(置信度分数) |
| 奖励粒度 | 答案级别 | Token 级别 |
| 训练数据要求 | 需要有答案的题目 | 只需问题描述 |
| 适用场景 | 数学、代码等可验证任务 | 任意任务 |
| 域内性能 | 优秀(84.4% GSM8K) | 相当(79.2% GSM8K) |
| 域外泛化 | 未报告 | 强(+65% LCB) |
应用场景差异
数据需求差异
研究意义差异
未来潜力
第三曲线(无监督 RL)包含多种实现方式,它们的共同点是:不需要金标答案或人工偏好标注。
| 方法类型 | 代表工作 | 奖励信号来源 | 特点 |
|---|---|---|---|
| 内部反馈 | Intuitor | Self-certainty(内部置信度) | ✅ 完全无监督,强泛化 |
| 内部反馈 | Absolute Zero | 内部信号 | ✅ 零数据学习 |
| 一致性 | TTRL | Plurality voting(多数投票) | ⚠️ 仍需题目(无需答案) |
| 一致性 | Genius | Self-consistency | ⚠️ 仍需题目(无需答案) |
| 规则奖励 | Rubrics-based | 预定义评分规则 | ⚠️ 需人工设计规则 |
| 新颖性 | Novelty-based | 探索未知区域 | ✅ 适合开放式任务 |
| 多智能体 | Multi-agent Debate | 智能体间达成共识 | ✅ 通过讨论提升质量 |
Intuitor 论文的观点:
"Concurrent works like Genius, TTRL, and Absolute Zero leverage queries without labels for reinforcement learning but remain constrained to specific task distributions, primarily in mathematical reasoning. INTUITOR aligns with this direction but introduces a lightweight, general-purpose alternative: using self-certainty as a confidence-based intrinsic reward."
关键区别:
第三曲线的各种方法都在探索"如何在无明确奖励函数的情况下提升模型能力",这是通向通用 AI 的关键路径。
**RLHF(人类反馈强化学习)**优化目标:
max E[r_φ(q, o) - β·KL(π_θ || π_ref)]
r_φ(q, o):由人类偏好数据训练的奖励模型**RLVR(可验证奖励强化学习)**优化目标:
max E[v(q, o) - β·KL(π_θ || π_ref)]
v(q, o):可验证的奖励函数(如答案正确性:正确=α,错误=0)通用优化目标:
max E[u(q, o) - β·KL(π_θ || π_ref)]
核心特点:奖励信号 u(q, o) 不需要金标答案或人工标注
其中:
q:输入查询(问题)o:模型生成的输出(答案)π_θ:策略模型(待优化)π_ref:参考模型(初始模型)β:KL 散度惩罚系数不同方法的 u(q, o) 实现:
u = Self-Certainty(o|q) — 内部置信度u = IsPlurality(o) — 是否为多数答案u = RubricsScore(o) — 基于预定义规则u = Novelty(o) — 探索度u = ConsensusScore(o) — 智能体间共识度在无监督 RL 的众多可能奖励信号中,**Intuitor 选择了 Self-Certainty(自我确定性)**作为其奖励函数 u(q, o)。
这是一种**内部反馈(RLIF)**方法,完全基于模型自身的输出分布,无需任何外部信息。
自我确定性是模型输出分布与均匀分布之间的 KL 散度的平均值:
Self-Certainty(o|q) = 1/|o| · Σ(i=1 to |o|) KL(U || p_π(·|q, o<i)) = -1/(|o|·|V|) · Σ(i=1 to |o|) Σ(j=1 to |V|) log(|V| · p_π(j|q, o<i))
其中:
|o|:生成序列的长度(token 数)|V|:词汇表大小U:均匀分布(每个 token 概率为 1/|V|)p_π(j|q, o<i):模型在位置 i 预测 token j 的概率o<i:位置 i 之前已生成的 tokenMode-Seeking(模式寻找)
KL(U || p_model),这是 mode-seeking 的度量对长度偏差不敏感
Token 级别的置信度
Intuitor 使用 Group Relative Policy Optimization (GRPO) 作为策略优化算法:
J_GRPO(θ) = E[1/G · Σ(i=1 to G) 1/|o_i| · Σ(t=1 to |o_i|) min(c_i,t(θ)·Â_i,t, clip(c_i,t(θ), 1-ε, 1+ε)·Â_i,t) - β·D_KL(π_θ || π_ref)]
其中:
G:每个问题采样的候选答案数量(默认 7 个)c_i,t(θ) = π_θ(o_i,t | q, o_i,<t) / π_θ_old(o_i,t | q, o_i,<t):重要性采样比率Â_i,t:优势函数(advantage)clip(c, 1-ε, 1+ε):截断函数,防止策略更新过大将外部奖励替换为自我确定性:
# 1. 对每个问题 q,采样 G 个候选答案 outputs = [o_1, o_2, ..., o_G] # 2. 计算每个答案的自我确定性分数 u_i = Self-Certainty(o_i | q) # 内在奖励,无需外部验证! # 3. 计算组内相对优势(归一化) Â_i,t = (u_i - mean([u_1, ..., u_G])) / std([u_1, ..., u_G]) # 4. 使用 GRPO 更新策略 # 策略会倾向于生成高 self-certainty 的输出
| 特性 | GRPO | Intuitor |
|---|---|---|
| 奖励来源 | 外部验证器(金标答案) | 内在信号(self-certainty) |
| 需要监督 | ✅ 需要标准答案 | ❌ 完全无监督 |
| 奖励粒度 | 结果级别(答案对错) | Token 级别(生成轨迹) |
| 域内性能 | 优秀 | 相当(略低 2-3%) |
| 域外泛化 | 较弱(甚至负迁移) | 强(+65% on LCB) |
| 适用场景 | 有标准答案的任务 | 任意任务(仅需 prompt) |
GRPO:v(q, o) = 1 if 答案正确 else 0
Intuitor:u(q, o) = avg(Self-Certainty per token)
论文观察到,Intuitor 训练的模型会自发地:
为什么? 因为详细的推理步骤让模型自己更有信心(更高的 self-certainty),从而获得更高奖励。
离线评分器(固定模型):容易被利用(见论文 Figure 7)
在线评分器(Intuitor):评分标准随策略模型共同进化
| 参数 | 1.5B/3B 模型 | 7B/14B 模型 | 作用 |
|---|---|---|---|
| β (KL penalty) | 0.0005 | 0.01 | 防止偏离初始模型过远 |
| Group Size (G) | 7 | 14 | 每个问题的候选答案数 |
| Learning Rate | 3×10⁻⁶ | 1×10⁻⁶ | 策略更新步长 |
| Batch Size | 128 | 64 | 每次更新的问题数 |
重要发现(论文 Table 3):
这是 Intuitor 最令人惊讶的发现:仅通过优化模型对自己输出的置信度,就能显著提升推理能力。
置信度 ≈ 内部一致性
长链推理涌现
自我解释循环
模型不确定 → 生成详细推理 → 自己更理解 → 置信度提升 → 获得奖励
这形成了一个正反馈循环,促使模型学会"向自己解释"
从特定到通用
论文通过多个实验验证了这一机制:
响应长度演变(Figure 3)
代码生成的推理涌现(Figure 6)
Mann-Whitney U 测试(Figure 8)
Intuitor 揭示了一个深刻的洞察:
智能系统无需外部奖励,可以通过优化内部一致性(置信度)来自我提升。
这与人类学习类似:
关键观察:
未来展望:
随着模型能力超越人类(如科学研究、战略决策),我们将越来越难以提供可靠的外部奖励。此时,**无监督 RL(第三曲线)**可能是唯一可行的提升路径。
对 Prompt 敏感
需要在线更新
与外部奖励结合
如果你在研究中使用了 Intuitor,请引用以下论文:
@article{zhao2025intuitor, title={Learning to Reason without External Rewards}, author={Zhao, Xuandong and Kang, Zhewei and Feng, Aosong and Levine, Sergey and Song, Dawn}, journal={arXiv preprint arXiv:2505.19590}, year={2025} }
本项目基于 Apache 2.0 许可证开源。
如有问题或建议,请通过以下方式联系:
注意:本 README 专注于 verl-intuitor 实现。如需了解 open-r1-intuitor 实现,请参考原始仓库。