2025-02-23 00:01 浙江
自己也可以复现R1了~
作者:绝密伏击,奇虎360算法资深专家
原文:https://zhuanlan.zhihu.com/p/24906803874
自 DeepSeek-R1 发布以来,迅速风靡全球,如今已晋升为国民级产品。此后,全球范围内掀起了一股复现 DeepSeek-R1 的热潮,其中不乏一些亮点纷呈的优秀项目。本文将对这些开源项目中的亮点复现工作进行汇总。
一、DeepSeek-R1 复现汇总
下面是最新的 DeepSeek-R1 复现汇总:
接下来我们介绍下复现细节。
二、Open R1: HuggingFace 复现 DeepSeek-R1 全流程
Open R1 项目由 HuggingFace 发起,联合创始人兼 CEO Clem Delangue 是这么说的:
这个项目的目的是构建 R1 pipeline 中缺失的部分,以便所有人都能在此之上复制和构建 R1。
HuggingFace 表示,将以 DeepSeek-R1 的技术报告为指导,分 3 个步骤完成这个项目:
• step 1:从 DeepSeek-R1 中蒸馏高质量数据,复现 R1-Distill 模型。
• step 2:复现通过纯强化学习训练 R1-Zero 的过程,包括如何生成推理数据集
• step 3:复现训练 R1 的完整 pipeline,包括两阶段 SFT、两阶段 RL。
2.1 step1:复现 DeepSeek-R1-Distill
利用 DeepSeek-R1 的蒸馏数据创建了 Bespoke-Stratos-17k[1]。
Bespoke-Stratos-17k 的数据构成为:
• APPs 和 TACO:5k
• NuminaMATH 数据集中的 AIME、MATH 以及 Olympiads 子集:10k
• STILL-2 的科学和谜题数据:1k
数据的构建方法为:
• 借助 Bespoke Curator (用于生成合成数据的项目) 创建了 Bespoke-Stratos-17k,利用 DeepSeek-R1 生成推理数据集,仅用了 1.5 小时和 800 美元的成本。
• 拒绝采样过程中,过滤掉了具有错误解决方案的推理轨迹。这对于代码验证来说是一大挑战,使用了 Ray 集群来加速验证过程。目前,HuggingFace 正致力于将代码执行验证器直接集成到 Curator。
• 数据过滤:使用 GPT-4o-mini 过滤错误的数学解决方案,将保留的正确解决方案的比例从 25% 提高到了 73%。
基于 Bespoke-Stratos-17k 数据训练出了 Bespoke-Stratos-32B[2] 和 Bespoke-Stratos-7B[3] 模型。
其中,Bespoke-Stratos-32B 的效果已经和 DeepSeek-R1-Distill-Qwen-32B 非常接近,如下图所示。
全新数据集:OpenR1-Math-220k
2 月 11 日,Open R1 发布了 OpenR1-Math-220k,这是一个大规模的数学推理数据集。该数据集在本地利用 512 个 H100 生成,每个问题均对应多个答案。为打造这一数据集,HuggingFace 与 Numina 合作,共同开发了备受欢迎的 NuminaMath-CoT 数据集的全新升级版。
相较于现有数据集,OpenR1-Math-220k 独具以下新特性:包含 80万 条 R1 推理轨迹,利用 DeepSeek R1 为 40万 道问题生成了两个答案,并经过筛选,最终保留了 22万 道带有正确推理轨迹的问题。
• 本地生成:未依赖API,而是借助 vLLM 和 SGLang 在科学集群上本地运行,每日生成 18万 条推理过程。
• 基于 NuminaMath 1.5:为 NuminaMath 1.5 中的问题提供答案,NuminaMath 1.5 是 NuminaMath-CoT 数据集的改进版。
• 自动过滤机制:运用 Math Verify 仅保留至少含有一个正确答案的问题,并利用 Llama3.3-70B-Instruct 作为判断器,以检索更多正确示例(如答案格式错误、无法使用基于规则的解析器验证的情况)。
• 在 OpenR1-Math-220k 上微调 Qwen-7B-Math-Instruct,其性能与 DeepSeek-Distill-Qwen-7B 相媲美。
通过结合基于规则的验证工具(Math Verify)与大语言模型(LLM)的评估方法,在保持数据集规模的同时,显著提升了其质量。最终,数据集 OpenR1-Math-220k 涵盖了 22万 个带有经过验证的推理过程的问题,每个问题可能有多个解决方案,下面是具体的分布:
其中,仅有一个回答的样本有 36759 条,而有两个回答的样本则有 184467 条,超过两个回答的样本数量极少。
该数据集分为两个划分:
• default(包含9.4万个问题),在 SFT 后取得了最佳性能。
• extended(包含13.1万个问题),额外融入了 NuminaMath 1.5 的来源,如 cn_k12,提供了更丰富的推理过程。然而,在此子集上进行 SFT 后的性能低于 default,这可能是由于 cn_k12 包含的问题相对其他来源更为简单。
多选一没有效果:对于具有多个正确答案的数据,使用奖励模型 (RM) 作为最终过滤器来挑选最佳响应。对于 R1 生成的每个具有多个正确答案的推理路径,去掉 和 之前的内容,只保留最终结果,使用 Qwen/Qwen2.5-Math-RM-72B 进行评分,选择得分最高的回答。但是消融实验显示,这种方法相较于随机选择一个正确生成结果,并未能显著提升模型性能。一个潜在的改进方向是在使用 RM 进行评分时,考虑使用全部长思维链过程,而不仅仅是只使用最终答案。
与 DeepSeek-Distill-Qwen-7B 的性能比较
设置学习率为 5e-5,使用 default 部分,在 Qwen2.5-Math-Instruct 上训练 3 个 epoch。为了将上下文长度从 4k 扩展到 32k,将 RoPE 频率提高到了 300k。下图展示了使用 lighteval 评估的结果。
在 AIME25 上,效果和 DeepSeek-Distill-Qwen-7B 持平。
2.2 step2:复现 DeepSeek-R1-Zero
下图展示了直接在 Qwen2.5-0.5B 上进行 GRPO 强化,在 GSM8k 基准测试中取得了约 51% 的准确率,相比 Qwen2.5-0.5B-Instruct 模型提高了 10 个百分点。
目前 Open R1 刚开始复现 DeepSeek-R1-Zero,还没有一个好的版本出来。
三、Open-Thoughts: UC 伯克利复现 DeepSeek-Distill-Qwen-32B
近日,斯坦福、UC伯克利等多机构联手发布了开源模型:OpenThinker-32B,性能直逼 DeepSeek-Distill-Qwen-32B。
仅使用了 114k(OpenThoughts-114k) 数据(DeepSeek-Distill-Qwen-32B 的1/8),就与同尺寸 DeepSeek-Distill-Qwen-32B 打成平手。
团队发现,通过采用经 DeepSeek-R1 验证过的大规模优质数据集,就能够成功训练出达到 SOTA 水平的推理模型。具体实现方法包括扩大数据量、严格验证推理过程以及扩大模型规模。由此研发的 OpenThinker-32B 模型,在数学、代码和科学等多个基准测试中,性能表现卓越,逼近 DeepSeek-Distill-Qwen-32B 水平,而且只用了 DeepSeek-Distill-Qwen-32B 的 1/8 数据量。
下面介绍下数据构建的具体流程。
数据生成:OpenThoughts-114k
OpenThoughts-114k 包含 114k 高质量数据,涵盖数学、科学、代码和谜题。
除了开源数据集,还开源了模型、数据生成代码、模型评估代码。如下图所示:
数据由以下几个部分构成:
Code
• BAAI/TACO[4]
• codeparrot/apps[5]
• deepmind/code_contests[6]
• MatrixStudio/Codeforces-Python-Submissions[7]
Math
• AI-MO/NuminaMath-CoT[8]
Science
• camel-ai/chemistry[9]
• camel-ai/biology[10]
• camel-ai/physics[11]
Puzzle
• INK-USC/riddle_sense[12]
使用上述数据集,从 DeepSeek-R1 生成推理轨迹并验证正确性以构建最终数据集。
四、LIMO:少即是多
在之前很长的时间里,大家的共识是“海量数据”才能训练出强大的模型。尤其在数学领域,业界普遍坚信,唯有依托海量数据与复杂的强化学习,才能取得突破性进展。
然而,上交大的最新研究成果却给出了一个另外答案:仅需 817 条精心策划的样本,便能让模型在数学竞赛级别的难题上超越众多现有的顶尖模型。这一发现不仅颠覆了传统认知,更揭示了一个我们可能一直忽视的事实:大模型的数学潜能或许始终存在,关键在于如何有效激发它。
LIMO(Less Is More for Reasoning)仅用 817 条精心设计的训练样本,通过简单的 SFT,就全面超越了那些使用几十万数据训练的主流模型,如 o1-preview 和 QwQ。
在 AIME24 评测中,LIMO 的准确率从传统方法(以 Numina-Math 为例)的 6.5% 飙升至 57.1%。而在 10 个不同的基准测试上,它实现了 40.5% 的绝对性能提升,超越了那些使用 100 倍数据训练的模型。这一突破证明了高质量、小规模的数据集,远比低效的海量数据训练更能激发大模型的推理潜能。
4.1 LIMO vs. RL Scaling
强化学习扩展(RL Scaling):以 OpenAI 的 o1 系列和 DeepSeek-R1 为代表,RL Scaling 方法通常通过大规模的强化学习训练来增强模型的推理能力。这种方法依赖于海量数据和复杂算法,虽然在特定任务上取得了显著成果,但其局限性也在于:它将推理能力的提升视为一个需要巨额计算资源的“探索”过程。
LIMO 的新视角:相比之下,LIMO(Less Is More for Reasoning)提出了一种截然不同的理论框架。它认为,推理能力其实潜藏于预训练模型之中,关键在于如何通过精准的唤醒这些潜在能力。这一转变将研究的重心从“训练新技能”转向了“激活潜在能力”,凸显了方法方向的重要性。
LIMO 的核心假设是,在知识基础已经相当完善的前提下,仅需少量高质量的示例,就能激活模型的潜在推理能力。这一理论不仅重新界定了 RL Scaling 的角色,将其视为寻找最优推理路径的一种途径,更为整个研究领域提供了新的思考维度和框架。
4.2 LIMO 数据集构建
将“少即是多”(LIMO)假设形式化表述为:在预训练基座模型中,通过最小却精确协调的认知过程展示,可以激发出复杂的推理能力。这一假设建立在两个基本前提之上:
• 模型参数空间中蕴含着潜在的先决知识;
• 将复杂问题精确拆解为详尽、逻辑清晰的推理链,能够使认知过程变得明确且可追溯。
为了验证这一假设,LIMO 提出了一种系统化的方法来构建高质量、最小化的数据集,以有效唤醒模型的内在推理潜能。
问题选择
高质量的问题应该能自然地引发扩展的推理过程。选择标准包括以下几点:
• 难度等级 优先考虑具有复杂推理链、多样化的思维过程和知识整合的问题,这些问题能够使大语言模型有效利用预训练知识进行高质量的推理。
• 泛化性 那些偏离模型训练分布的问题可以更好地挑战其固定的思维模式,鼓励探索新的推理方法,从而扩展其推断搜索空间。
• 知识多样性 选择的问题应涵盖各种数学领域和概念,要求模型在解决问题时整合和连接遥远的知识。
为了有效实施这些标准,LIMO 首先汇总了一个全面的候选问题池:NuminaMath-CoT。这个问题池从多个已建立的数据集中精选而出,涵盖了从高中到竞赛级别的精心标注数学问题,包括 AIME,MATH 以及其他几个数学问题来源。
然后对问题集进行筛选:
• 弱模型初筛:首先利用 Qwen2.5-Math-7B-Instruct 过滤掉 N 次回答全对的问题。
• 强模型再筛:接着,使用更强大的模型,如 DeeSeek-R1、DeepSeek-R1-Distill-Qwen32B,仅保留多次采样成功率低于指定阀值的问题。
• 多样性选择:最后,为确保题库的多样性,采用策略性采样技术,在数学领域和问题复杂性之间寻求平衡,同时避免概念重复。
经过这一精细的筛选过程,最终从数以千万计的候选问题中精选出了 817 道精心设计的问题。这些问题不仅符合严格质量标准,还涵盖了丰富多样的数学推理挑战。
回答构建(思维链构建)
首先,收集现有问题的官方解决方案,并补充了来自人类专家和 AI 专家的解决方案。
此外,利用 DeepSeek-R1、DeepSeek-R1-Distill-Qwen-32B 和 Qwen2.5-32b-Instruct 在内的推理模型,来生成多种解决方案。
建立区分高质量思维链的评判标准:
• 最优结构组织,即解决方案具有清晰、有序的结构,步骤分解具有自适应粒度,在关键推理环节分配更多 token 和详细说明,同时保持直接步骤的简洁;
• 有效认知,即高质量的解决方案通过逐步构建理解,提供渐进的概念介绍、清晰阐述关键见解以及整合概念差距;
• 严格验证,即在推理过程中穿插频繁的验证步骤,包括验证中间结果、交叉检查假设以及确认每一步推论的逻辑一致性。
4.3 LIMO 回答对比
图 9 对 Qwen2.5-32B-Instruct、DeepSeek-R1 和 LIMO 生成的回答进行了比较。尽管 LIMO 使用的数据最少(仅 817 个训练样本),但其功能却与 DeepSeek-R1 相当。
值得一提的是,LIMO 展现出了出色的自我反思和长链思维生成能力。它能够验证自己的陈述(如“等等,24分钟是0.4小时吗?不对,60分钟是1小时,所以24分钟是24/60,即0.4小时”)并核对计算过程(如“但让我再检查一次,也许我在计算中出错了”)。此外,LIMO 还学会了在解决复杂方程时分配额外的 token(进行计算),如“现在让我们计算左侧,……,两边乘以2”,以防止出现错误。相比之下,模型 Qwen2.5-32B-Instruct 在推理过程中存在局限性,无法纠正不准确的陈述,且在解决方案中未能对方程进行交叉验证。这些结果有力地支持了 LIMO 假说:即通过少量但高质量的后训练示例,可以赋予模型强大的推理能力。
五、DeepScaleR:完美复现 DeepSeek-R1 强化学习效果
近期,UC 伯克利团队宣布,他们仅以4500美元的成本,通过简单的强化学习(RL),就成功复现并训练出了 DeepScaleR-1.5B-Preview 模型,直接超越了 o1-preview。
UC伯克利的研究团队以 Deepseek-R1-Distilled-Qwen-1.5B 为基础,通过强化学习(RL),在 40,000 个高质量数学问题上进行训练,使用了 3800 A100 小时(4500美元),训练出了 DeepScaleR-1.5B-Preview 模型。在多个竞赛级数学基准测试中优于 OpenAI 的 o1-preview。
5.1 秘诀:先短后长(8K->16K->24K)
RL 扩展最大的挑战之一是高昂的计算成本。如果要直接复制 DeepSeek-R1 的实验(32K输出,8000 steps),至少需要 70,000 A100 GPU 小时——即使是 1.5B 的小模型。
为了解决这个问题,团队采用了线短后长的训练策略。先在 8K 上训练,然后再逐渐扩展到 16K 和 32K。最总将训练成本降低到了 3800 A100 小时(4500美元)。
接下来,我们介绍下具体细节。
5.2 数据集构建
在训练数据集方面,研究人员精心收集了 1984 至 2023 年的美国国际数学邀请赛(AIME)题目、2023年之前的美国数学竞赛(AMC)题目,以及来自 Omni-MATH 和 Still 数据集的各国及国际数学竞赛题目。数据构成如下:
数据处理流程涵盖了三个核心步骤:
• 答案提取:对于 AMC 和 AIME 等数据集,研究人员利用 gemini-1.5-pro-002 模型从 AoPS 官方解答中准确提取答案
• 问题去重:基于 RAG 技术,并结合 sentence-transformers/all-MiniLM-L6-v2 的 embedding,消除重复问题
• 不可评分题目过滤:由于数据集(如 Omni-MATH)中存在部分问题无法通过 sympy 数学符号计算库进行自动评估(需依赖LLM判断),这些问题会降低训练速度并引入不稳定的奖励信号,因此研究人员增加了额外的过滤步骤,剔除了这些无法自动评分的问题。
经过这一系列的去重和过滤处理,最终得到了约4万个问题-答案对,作为训练数据集。
5.3 奖励函数设计
正如 Deepseek-R1 所倡导的,团队采用结果奖励模型(ORM),而非过程奖励模型(PRM)。奖励函数返回值如下:
• 返回 1:如果 LLM 的答案,既能通过 LaTeX 语法检查,又能通过 Sympy 数学验证,就给它奖励。
• 返回 0:要是 LLM 的答案是错的,或者格式不对,比如少了
5.4 迭代增加训练长度:先短后长
在强化学习中,一个核心挑战在于如何选择最优的上下文窗口大小进行训练。推理类任务的强化学习对计算资源的需求极高,因为它们产生的输出远长于标准任务,这导致轨迹采样和策略梯度更新的速度大幅减慢。事实上,上下文窗口大小每翻倍一次,训练的计算量至少会增加 2倍。
这就引发了一个基本的权衡:较长的上下文为模型提供了更广阔的“思考”空间,但会大幅度降低训练速度;而较短的上下文虽然能加快训练进程,却可能限制模型解决那些需要较长上下文才能理解的复杂问题的能力。因此,在训练效率和模型准确性之间找到恰当的平衡点显得尤为重要。
为此,团队的训练方法采用了 Deepseek 的 GRPO 算法,并分为两个阶段:
• 首先,使用 8K 的最大上下文长度进行 RL 训练,以在推理效果和训练效率之间取得初步平衡;
• 随后,将训练扩展到 16K 和 24K 的上下文长度,使模型能够应对更多具有挑战性、以往难以解决的问题。
5.5 使用 8K 上下文构建高效思维链推理
在训练之前,团队在 AIME2024 上评估了 Deepseek-R1-Distilled-Qwen-1.5B 模型,并分析了推理轨迹数据。结果发现,错误回答包含的 token 量是正确回答的三倍(20,346 vs. 6,395)。这表明,较长的回答往往导致错误的结果。
因此,直接使用较长的上下文窗口进行训练可能效率低下,因为大部分 token 实际上都被浪费了。此外,在评估日志中观察到,长篇回答呈现出重复的模式,这表明它们对有效的思维链推理并没有做出有意义的贡献。
基于这些发现,团队决定先从 8K 的上下文开始训练,并在 AIME2024 上取得了 22.9% 的初始准确率,仅比原始模型低 6%。
事实证明这一策略是有效的:在训练过程中,平均训练奖励从 46% 提高到了 58%,而平均回答长度则从 5,500 降低到 3,500。如下图所示:
5.6 扩展至 16K,关键转折点出现
在大约 1000 步之后,8K 运行中发生了一个有趣的变化:响应长度开始再次增加。然而,这导致了收益递减,准确率趋于平稳并最终下降。
与此同时,响应裁剪比例从 4.2% 上升到 6.5%,这表明更多的响应在上下文长度的限制下被截断。
这些结果表明,模型试图通过“思考更长时间”(即生成更长的响应)来提高训练奖励。然而,随着响应长度的增加,它越来越频繁地触碰到 8K 上下文窗口的限制,从而阻碍了进一步的性能提升。
研究人员意识到这一点后,决定“打破束缚,让模型自由飞翔”。于是,在训练步骤 1,040 处设置了一个检查点,这是响应长度开始呈现上升趋势的地方,并随后使用一个 16K 的上下文窗口重新启动了训练。这种分两阶段进行的方法比一开始就使用 16K 上下文窗口进行训练要有效得多:8K上下文的初始阶段使得平均响应长度保持在 3,000 token 左右,而不是 9,000 token,这使得该阶段的训练速度至少提高了 2 倍。
在切换到 16K 上下文窗口后,观察到训练奖励、响应长度以及 AIME2024 的 Pass@1 准确率都在稳步提升。经过 500 个额外的训练步骤,平均响应长度从 3,500 token 增加到了 5,500 token,而 AIME2024 的 Pass@1 准确度也达到了 38%。
5.7 24K 魔法,超越 o1-preview
在 16K 上下文中额外训练了 500 步之后,团队发现性能开始趋于稳定:平均训练奖励收敛至 62.5%,AIME pass@1 在 38% 左右徘徊,而响应长度则再次呈现出下降趋势。与此同时,超长截断比例上升至 2%。
为了最终实现 o1 级别的性能突破,团队决定施展“24K 魔法”——将上下文窗口扩展至 24K。于是,在训练步骤 480 处保存 16K 运行的 checkpoint,并重新启动了一个上下文窗口为24K 的训练任务。
得益于上下文窗口的扩展,模型终于突破了原有的束缚。大约 50 步后,模型成功超越了 40% 的 AIME 准确率大关,并在第 200 步时达到了 43% 的佳绩。
总体而言,团队的训练过程包括了约 1,750 个训练步骤。初始的 8K 阶段在 8 个 A100 GPU 上进行,而 16K 和 24K 阶段则将训练规模扩展至 32 个 A100 GPU。整个训练过程耗时约 3,800 A100 GPU 小时,相当于在 32 个 A100 GPU 上大约需要 5 天时间,计算成本约为4,500美元。
5.8 模型评估
下面是 pass@1 的评测结果,取 16 次的均值:
相比 DeepSeek-R1-Distill-Qwen-1.5B,各项指标全面提升,其中 AIME24 从 28.8% 提升至 43.1%。
5.9 关键发现
强化学习(RL)同样适用于小型模型
Deepseek-R1 表明,直接在小模型上应用 RL 的效果不如蒸馏法。他们的消融实验显示,在 Qwen-32B 上应用 RL 在 AIME 上的得分为 47%,而仅使用蒸馏法则能达到 72.6%。
一个普遍的误解是,强化学习只对大模型有益。然而,通过从更大模型中蒸馏出高质量的监督 SFT 数据,小型模型也能学会更有效地利用 RL 进行推理。团队结果证实了这一点:强化学习将 AIME 的准确率从 28.9% 提高到了 43.1%!这些发现表明,单独使用 SFT 或 RL 都不足以充分发挥作用。相反,通过将高质量的 SFT 蒸馏与 RL 相结合,才能真正释放大模型的推理潜力。
迭代式长度扩展使长度扩展更加有效
先前的研究表明,直接在 16K 上下文中训练 R L相比 8K 并没有显著提升,这可能是因为模型的计算能力不足以充分利用扩展的上下文。而最近的一项研究则提出,更长的响应长度包含冗余的自我反思,这会导致错误结果。DeepScaleR 的实验与这些发现一致。通过首先在较短的上下文(8K)中进行训练,可以在后续的 16 K和 24K 运行中实现更快、更有效的训练。这种迭代方法使模型在扩展到更长上下文之前,先奠定有效的思维模式基础,从而使基于 RL 的长度扩展更加高效。
引用链接
[1]
Bespoke-Stratos-17k:https://huggingface.co/datasets/bespokelabs/Bespoke-Stratos-17k[2]
Bespoke-Stratos-32B:https://huggingface.co/bespokelabs/Bespoke-Stratos-32B[3]
Bespoke-Stratos-7B:https://huggingface.co/bespokelabs/Bespoke-Stratos-7B[4]
BAAI/TACO:https://huggingface.co/datasets/BAAI/TACO[5]
codeparrot/apps:https://huggingface.co/datasets/codeparrot/apps[6]
deepmind/code_contests:https://huggingface.co/datasets/deepmind/code_contests[7]
MatrixStudio/Codeforces-Python-Submissions:https://huggingface.co/datasets/MatrixStudio/Codeforces-Python-Submissions[8]
AI-MO/NuminaMath-CoT:https://huggingface.co/datasets/AI-MO/NuminaMath-CoT[9]
camel-ai/chemistry:https://huggingface.co/datasets/camel-ai/chemistry[10]
camel-ai/biology:https://huggingface.co/datasets/camel-ai/biology[11]
camel-ai/physics:https://huggingface.co/datasets/camel-ai/physics[12]
INK-USC/riddle_sense:https://huggingface.co/datasets/INK-USC/riddle_sense