Open R1:更新#2

社区文章 发布于 2025年2月10日

image/png

Open R1 项目已经进行了两周,该项目旨在重建 DeepSeek R1 的缺失部分——特别是训练管线和合成数据。

在这篇文章中,我们很高兴地分享 OpenR1-Math-220k 的构建:我们首个用于数学推理的大规模数据集!

我们还将探讨社区在为微调策划小型、高质量数据集方面的一些令人兴奋的进展,以及如何从推理模型在训练时和推理时控制思维链长度的见解。

让我们深入了解!

OpenR1-Math-220k 数据集

DeepSeek R1 的主要优势之一是它能够通过蒸馏将高级推理能力转移到较小的模型中。DeepSeek 团队通过生成 600k 个推理轨迹并微调一系列 Qwen 和 Llama 模型,证明了这一点,表明从 R1 直接蒸馏可以在没有强化学习的情况下实现具有竞争力的推理性能。值得注意的是,DeepSeek-R1-Distill-Qwen-7B 在 AIME 2024 上取得了 55.5% 的成绩,超越了 QwQ-32B-Preview 等更大的模型。

然而,用于蒸馏的推理轨迹尚未公开,这促使社区独立重建类似的数据集。到目前为止,社区已经发布了多个开放数据集,包括 OpenThoughts-114kBespoke-Stratos-17kDolphin-R1LIMO

🐳  推出 OpenR1-Math-220k,一个本地在 512 个 H100 上生成的大规模数学推理数据集,每个问题有多个答案。为了创建 OpenR1-Math-220k,我们与 Numina 合作,他们开发了他们流行的 NuminaMath-CoT 数据集的全新版本。

OpenR1 数据集与现有数据集的新增之处

  • 80 万个 R1 推理轨迹:我们使用 DeepSeek R1 为 40 万个问题生成两个答案。过滤后的数据集包含 22 万个具有正确推理轨迹的问题
  • 512 个 H100 本地运行:我们不依赖 API,而是利用 vLLMSGLang 在我们的科学集群上本地运行生成,每天生成 18 万个推理轨迹
  • 基于 NuminaMath 1.5我们专注于数学推理轨迹,并为 NuminaMath 1.5 中的问题生成答案,这是 NuminaMath-CoT 数据集的改进版本。
  • 自动过滤:我们应用 Math Verify 以仅保留至少有一个正确答案的问题。我们还利用 Llama3.3-70B-Instruct 作为判断者来检索更多正确示例(例如,对于答案格式不正确而无法通过基于规则的解析器验证的情况)
  • 通过在我们数据集上微调 Qwen-7B-Math-Instruct,我们匹配了 DeepSeek-Distill-Qwen-7B 的性能

通过展示可扩展、高质量的推理数据生成,我们希望此管线可以扩展到数学之外的领域,例如代码生成。

数据生成

为了构建 OpenR1-220k,我们提示 DeepSeek R1 生成 NuminaMath 1.5 中 40 万个问题的解决方案。我们遵循模型卡推荐的参数,并在用户提示前加上以下指令:

"请逐步推理,并将最终答案放入 \boxed{} 中。"

我们将每次生成限制为 16k 令牌,因为我们的分析显示,只有 75% 的问题可以在 8k 令牌内解决,而其余大多数问题都需要完整的 16k 令牌。最初,我们使用 vLLM 进行推理,每个 H100 每小时可生成 15 次,并在之前的更新和 OpenR1 repo 中分享了我们的生成脚本。最近,我们开始尝试使用 SGLang,并且能够实现每个 H100 每小时生成 25 个解决方案(几乎是 2 倍加速!),这使我们能够在 512 个 H100 上每天生成 30 万个问题解决方案。这使我们在短短几天内生成了 80 万个推理轨迹。

我们为每个问题生成两个解决方案,在某些情况下是四个,以提供过滤和训练的灵活性。这种方法允许拒绝采样,类似于 DeepSeek R1 的方法,也使数据集适用于 DPO 等偏好优化方法。

数据生成脚本可在此处获取:https://github.com/huggingface/open-r1/tree/main/slurm

未经过滤的数据集可在此处获取:https://huggingface.co/datasets/open-r1/OpenR1-Math-Raw

数据过滤

为了只保留高质量、正确的推理轨迹,我们利用了 Math Verify,这是一个强大的数学表达式评估系统,旨在评估 LLM 生成的答案。我们从模型生成中提取最终答案,并将其与数据集中的真实答案进行比较。

我们发现 55% 的问题至少有一个正确答案。然而,NuminaMath 1.5 中有些真实答案为空或无法验证的格式,这使得自动验证变得困难。虽然我们已经改进了 Math-Verify 以更准确地处理这些更不常见的输出格式(参见下面的 Math-Verify 改进),但我们还探索了另一种从被拒绝样本中恢复有效解决方案的方法:使用 Llama-3.3-70B-Instruct 作为判断者对被拒绝问题的一个子集进行判断。在运行此验证步骤之前,我们过滤掉了不完整或包含空真实答案的样本,确保只考虑格式良好且具有明确框定最终答案的响应。此过程成功检索了 28,000 个先前被拒绝的问题。

我们对 Llama3.3-70B-Instruct 进行如下提示

You are a mathematical answer validator. You will be provided with a mathematical problem and you need to compare the answer in the reference solution, and the final answer in a model's solution to determine if they are equivalent, even if formatted differently.

PROBLEM:

{problem}

REFERENCE SOLUTION:

{answer}

MODEL'S SOLUTION:

{generation}

Focus ONLY on comparing the final mathematical answer provided by the model while ignoring differences in:

- Formatting (e.g., \\boxed{{}} vs plain text)
- Multiple choice formatting (e.g., "A" vs full solution)
- Order of coordinate pairs or solutions
- Equivalent mathematical expressions or notation variations
- If the model's answer is nonsense, return "Verdict: AMBIGUOUS"

Start with a brief explanation of your comparison (2-3 sentences). Then output your final answer in one of the following formats:

- "Verdict: EQUIVALENT"
- "Verdict: DIFFERENT"
- "Verdict: AMBIGUOUS"

通过将基于规则的验证(Math Verify)与基于 LLM 的评估相结合,我们提高了数据集质量,同时保持了规模。最终数据集包含 22 万个具有验证推理轨迹的问题,使其成为训练推理模型的宝贵资源。为每个问题提供多个解决方案,使社区可以灵活地过滤出更好的生成,并根据 NuminaMath 数据源和问题类型应用更有针对性的改进。

image/png

数据集分为两个部分:

  • default(9.4 万个问题),在 SFT 后实现最佳性能。
  • extended(13.1 万个问题),包括额外的 NuminaMath 1.5 源,如 cn_k12,提供更多推理轨迹。然而,我们观察到此子集在 SFT 后的性能低于默认分拆,这可能是由于 cn_k12 包含的问题比其他来源简单。

对于有多个正确答案的行,我们还尝试应用奖励模型(RM)作为最终过滤器来选择最佳响应。对于 R1 生成的包含多个正确答案的每一行,我们通过删除思维令牌(`<think>...</think>`)提取最终答案,然后将问题 + 提取的答案传递给使用 vLLM 服务的 Qwen/Qwen2.5-Math-RM-72B 以获取分数。使用这些分数,我们为包含多个正确响应的每一行构建了一个排名。选择排名前 1 的正确生成并将其包含在训练数据集中,但遗憾的是,训练消融实验表明,这种方法对于选择一个随机的正确生成并没有帮助模型性能。一个可能的改进是在使用 RM 评分时包含推理轨迹,而不仅仅是最终答案。

与 DeepSeek-Distill-Qwen-7B 的性能对比

我们使用 5e-5 的学习率,在数据集的 default 分割上对 Qwen2.5-Math-Instruct 进行了 3 个 epoch 的微调。为了将上下文长度从 4k 扩展到 32k,我们将 RoPE 频率增加到 300k。训练遵循线性学习率调度,并有一个 10% 的热身阶段。下表比较了 OpenR1-Qwen-7BDeepSeek-Distill-Qwen-7BOpenThinker-7B 的性能,使用 lighteval

模型 数学-500 AIME24 AIME25
DeepSeek-Distill-Qwen-7B 91.6 43.3 40
OpenR1-Qwen-7B 90.6 36.7 40
OpenThinker-7B 89.6 30.0 33.3

该数据集是初始版本,为进一步完善提供了基础。社区可以探索额外的过滤策略来提高性能,例如 DeepSeek R1 中用于提高质量的拒绝采样。

Math-Verify 改进

在检查验证结果时,我们发现 Math-Verify 存在一些故障情况。为了解决这些问题,我们实施了重大改进和修复。我们强烈建议更新到最新版本 (0.5.2),以受益于这些增强功能。

pip install math-verify==0.5.2

以下是最重要的改进摘要:

  • 改进了纯文本答案的解析和验证(例如 $\text{E}$ == $E$)
  • 改进了答案列表的解析(例如 $1$ 和 $2$ 和 $3$ == $1,2,3$)
  • 修复了单个 LaTeX 环境中多个框选答案的解析问题(例如 $\boxed{1},\boxed{2}$ == {1,2})
  • 引入有序元组。推断列表是元组还是集合非常困难,因此我们使用金标答案来指导我们。
    • (1,2,3) ≠ {3,2,1}; 1,2,3 == {3,2,1}; {3,2,1} == {1,2,3}
  • 支持金标中的关系(例如小于)和预测中的区间(例如 $1 < x < 2$ == $(1,2)$)

社区亮点

本周社区从多个角度探索了 GRPO,同时多个研究实验室表明,仅约 1000 个高质量训练样本可能足以在现有开放模型中引出推理能力。

GRPO 的实际应用

  • nrehiew 展示了 将 GRPO 直接应用于 Qwen2.5-0.5B 基础模型,在 GSM8k 基准测试中取得了约 51% 的准确率,比 Qwen2.5-0.5B-Instruct 模型提高了 10 个百分点。这些令人印象深刻的结果引发了许多关于指令数据在预训练中作用的讨论,因为人们尚未(也可能无法)在其他基础模型(如 Llama 3)上应用 GRPO 获得类似收益。特别是,Sea AI Lab (SAIL) 的研究人员指出,基础模型可以很容易地被提示生成自我反思,DeepSeek-R1 论文中的“顿悟”时刻可能更多是基础模型的特点,而非强化学习优化过程的结果。
  • Unsloth 已应用其优化魔法,使高达 15B 参数的模型只需 15GB 显存即可进行 GRPO 训练 🤯。这意味着您现在可以在 Google Colab 中免费使用 GRPO!
  • 来自 Axolotl 的 Wing Lian 展示了 DoRA 的收敛速度比 LoRA 和完全微调都要快。
  • Alexander Doria 找到了一种方法,可以为诗歌设计奖励函数。这令人兴奋,因为它提供了 GRPO 应用于非传统意义上“可验证”领域的首批公开示例之一。

评估

本周发布了 AIME 2025 的第一部分,其中包括 15 个难度较高的数学问题,用于训练高中生参加国际数学奥林匹克竞赛。在过去一年中,AIME 2024 一直是衡量 LLM 数学能力的主要基准,社区很高兴看到模型在新的一组未见过的问题上的表现如何。

LLM 需要用自然语言进行推理吗?

image/png

一项有趣的新研究论文表明,通过使用循环语言模型,可以通过在潜在空间中隐式推理来扩展测试时计算。这类似于 Meta 的 Coconut 工作,即在潜在空间中训练语言模型,但现在适用于推理任务。这些方法的优点是它们的计算效率更高:通过探索潜在空间,无需生成大量的“思考”令牌即可获得高性能。

转向更小、高质量的推理数据?

虽然 DeepSeek R1 利用了 60 万个推理轨迹进行蒸馏,但最近的工作表明,语言模型中的复杂推理并非通过大规模训练,而是通过少量精心策划的样本而产生的。

这种方法的一个例子是 s1K 数据集。它包含 1,000 个精心挑选的数学问题,以及从 Gemini Flash 蒸馏的推理轨迹。选择方法侧重于难度、多样性和质量。作者在 s1K 上微调 Qwen2.5-32B-Instruct,并设法在竞赛数学基准上超越 OpenAI 的 o1-preview 达 27%。

另一个数据集 LIMO 将这一想法进一步推进,仅使用 817 个训练样本就在 AIME 和 MATH 基准上取得了出色的性能。作者推测,当模型在预训练期间已经获得广泛的领域知识时,可能只需要少量结构良好的示例即可解锁高级推理能力。

CoT 长度:预算强制与奖励塑造

使 s1K 中微调后的 Qwen2.5-32B-Instruct 模型达到如此强劲性能的一个重要因素是预算强制,这是一种测试时计算技术,通过向模型的生成追加“Wait”或思维结束标记来分别延长或截断推理。该工具允许作者改变思维时间,并得出结论:他们的模型表现出测试时扩展:随着思维时间的增加,不同数学基准上的准确性也会提高。

image/png

同样,Demystifying Long Chain-of-Thought Reasoning in LLMs(Yeo 等人)也研究了思维链 (CoT) 长度对模型性能的影响。他们引入了余弦奖励——一种新颖的奖励函数,用于鼓励正确生成时使用更短的 CoT,而错误生成时使用更长的 CoT——这稳定了强化学习训练,特别是当模型具有相对有限的最大上下文大小时,平均响应长度可能会爆炸式增长。当模型开始在难题上出现奖励作弊迹象时,也会采用重复惩罚,通过重复而不是尝试解决问题来人为地增加 CoT 长度。

image/png

接下来呢?

现在 GRPO 已经在 TRL 中正常运行,我们正在进行大量的实验,以了解哪些超参数和奖励函数对训练影响最大。您可以在社区选项卡中跟踪我们的进展,我们将在下次更新中撰写我们的发现!

如果您想贡献,请查看 GitHub 上的 open-r1 仓库 或关注 Hugging Face open-r1 组织

社区

感谢分享您的结果并描述上周 GRPO 研究的背景。您是否计划测试经典蒸馏,而不仅仅是在推理轨迹上进行微调?

·

是的,我们也可能会尝试这个!

太棒了!很棒的工作!

有些模糊的地方

  • 使用 Math Verify,过滤后的数据集大小为 220k (400k 的 55%)
  • 使用基于 LLM 的评估,从拒绝采样中检索的数据大小为 28k

但是,本文声称如下:

通过结合基于规则的验证(Math Verify)和基于 LLM 的评估,我们提高了数据集质量,同时保持了规模。最终数据集包含 22 万个具有验证推理轨迹的问题,使其成为训练推理模型的宝贵资源。

我认为大小应该是 24.8 万?否则,看起来基于 LLM 的评估并未包含在最终数据集中。

·
文章作者

我们只将 Llama 验证应用于 default 子集,那些被 Math Verify 从 extended 子集中拒绝的子集没有经过第二次验证。如果社区希望进行不同的过滤,我们可以发布包含 40 万个问题的未过滤数据。

有点好奇以下说法

每个 H100 每小时可生成 15 次

由于 DeepSeek-R1 无法适应单个 H100(根据更新 #2,该模型适用于 8xH100),您如何衡量 H100 的吞吐量?也许 15*8 = 120 (8xH100)?

·

该模型实际上适用于两个 8xH100 https://huggingface.co/blog/open-r1/update-1#synthetic-data-generation
而每个 H100 每小时 15 次生成是四个节点吞吐量除以 32 个 GPU(4 个是为了避免缓存溢出)

关于预训练中 SFT 的讨论。如果我理解正确,其核心思想是,预训练数据中包含某些指令数据的模型倾向于学习推理,而没有这些指令数据的模型则无法学会推理。

大家好,我们是 lmsys.org 的 SGLang 团队。我是陈阳,项目经理。我们与一群优秀的人一起致力于将 SGLang 集成到 OpenR1 中。我们已经在 OpenR1 上工作了一周多。我们已经完成了标签蒸馏、GRPO 和 lighteval 的工作。

我们计划向您提交 PR,但看到您在这篇文章中也使用了 SGLang

https://huggingface.co/blog/open-r1/update-2

我们正在寻求合作,以免我们双方在同一个事情上浪费时间。谢谢!

如果您感兴趣,可以通过 chenyang.zhao@sglang.ai 联系我

最好也包含 Qwen2.5-Math-Instruct 和 Qwen2.5-7B-Instruct 的性能,以量化使用推理轨迹 SFT 蒸馏的改进。

Qwen/Qwen2.5-Math-RM-72B 模型具体是如何使用的?它仅仅用于对多个答案进行排名吗?它是否也可以作为验证答案是否正确的工具?

干得好!我对性能比较表中的数值有些疑问。根据 DeepSeek 的论文,DeepSeek-Distill-Qwen-7B 在 MATH-500 和 AIME24 中的性能分别为 92.8 和 55.5,这与表中的数值(尤其是 AIME24)似乎有很大差异。我不知道是否存在任何差距。期待您的回复,谢谢!

📻 🎙️ 嘿,我为这篇博客文章制作了一个播客,快来听听吧!

该播客由 ngxson/kokoro-podcast-generator 生成,使用了 DeepSeek-R1 和 Kokoro-TTS

您好,感谢您在 Open R1 上的出色工作!我想知道数据过滤代码是否可以公开?我正在使用 Math-Verify 来复核您的一些标签,但无法重现某些标签——似乎某些解决方案无法通过默认的 math_verify.parse 函数正确解析。谢谢!cc. @loubnabnl @lewtun @eliebak

感谢您的出色工作。请问 OpenR1-Qwen-7B 是通过 LORA 还是完全微调进行训练的?

非常感谢您提供此信息!请注意 https://matharena.ai 是 ETH 和 INSAIT(不仅是 ETH)的联合项目。最好在文本中更新此信息。

您好,感谢您在 Open R1 上的出色工作!

我有一个关于 SFT 数据处理的问题。据我了解,训练使用了默认数据集。由于此数据集每个问题包含多个响应,我很好奇最终的 SFT 训练数据是如何构建的。

训练期间是否使用了所有响应,还是存在一个过滤步骤来仅选择正确或高质量的答案?如果能对此进行任何澄清,将不胜感激。

注册登录以发表评论