DeepSeek-R1 技术解析(三):从 R1-Zero 到 R1,多阶段训练管线拆解
R1-Zero 证明了纯 RL 可以训出推理能力。但一个能推理的模型,离一个能交给用户正常使用的模型,中间还有好几道坎。
第一道坎是语言。基座模型 DeepSeek-V3 是在中英文混合数据上预训练的,R1-Zero 做推理的时候经常中英文乱窜——前一句还是英文的数学推导,后一句变成了中文感叹。如果你用中文提问,它可能用英文推理;用英文提问,它又可能给你塞几句中文。对普通用户来说,这种体验很差。
第二道坎是格式。R1-Zero 的推理过程没有经过"人类能舒服地阅读"的约束,它只是在 <think> 标签里把脑子里的东西倒出来,很多时候乱成一团。
第三道坎是通用能力。R1-Zero 的 RL 训练全靠规则奖励,这意味着只有那些"答案可以明确判断对错"的任务才能参与训练——数学、代码、逻辑。换成开放式问答、创意写作、闲聊,这些任务没有标准答案,纯 RL 就没办法了。
DeepSeek 团队设计了一个四阶段的训练流程来解决这些问题。这个流程最终产出的就是 DeepSeek-R1,一个既能做高难度推理,又能正常聊天,还不会中英文乱窜的模型。
下图概括了整个 pipeline(根据论文原图重绘):
预训练基座模型(DeepSeek-V3-Base)
→ 用几千条人工精选的"长链推理示范"做冷启动 SFT
→ 第一阶段 RL(推理导向,加入语言一致性奖励)
→ 用 RL 后的模型做拒绝采样 + SFT(80 万条数据,包含推理和非推理)
→ 第二阶段 RL(全场景对齐,推理+帮助性+无害性)
拆开来看每一步做了什么、为什么这样设计。
第一阶段:冷启动 SFT
R1-Zero 是从零开始的——基座模型直接上 RL,没有 SFT 预热。这条路虽然走得通,但产出的推理过程可读性很差。
冷启动 SFT 的目的不是教模型怎么推理(那是 RL 阶段干的事),而是给模型一个"人类读得懂"的初始化格式和表达习惯。
数据怎么来
团队收集了几千道高质量推理题,每道题用 R1-Zero 以较高温度(1.0)生成多条推理轨迹。然后做筛选:只保留那些最终答案正确、格式可读、没有语言混杂的输出。
筛选完的结果还要经过一道精修——用 DeepSeek-V3 对推理过程和最终答案做格式美化,确保使用第一人称表达、语言跟题目保持一致。
比如说,R1-Zero 的原始输出可能用"we"来描述推理,或者根本不出现人称代词。经过冷启动数据精修后,模型倾向于在 <think> 里用"I"来描述自己的思考过程——“I need to solve this equation…”“Hmm, let me check this step…”。这种风格对用户来说更自然。
论文特别强调,这种"生动的第一人称推理"更多是产品层面的工程选择,不代表模型真正有了人类一样的思维。这点其实值得注意——很多用户会被这种拟人化的表达所吸引,产生不必要的信任。
代码数据的特殊处理
冷启动数据里还包含一批编程竞赛题。但由于 Codeforces 和 AtCoder 这类平台的测试用例不公开,团队自己搭了一套测试用例生成和验证流程。
流程分两步:先用 DeepSeek-V2.5 针对每道题生成大量候选测试用例;然后用正确解法筛掉产出错误输出的无效用例,再从剩下的里挑出那些能成功区分正确解法和错误解法的用例。
最终收集了 5,151 道 Codeforces 题和 2,504 道 AtCoder 题的可靠测试用例。
冷启动 SFT 之后得到的模型叫 DeepSeek-R1-Dev1。相比 R1-Zero,它在指令遵循类基准(IF-Eval、ArenaHard)上有明显提升,但因为冷启动数据量有限,AIME 等推理基准上略微退步了一点。
第二阶段:推理导向的 RL
这个阶段的目标是:在冷启动的基础上,继续用 RL 提升推理能力,同时解决语言混杂问题。
语言一致性奖励
第二篇介绍 R1-Zero 的奖励设计时提过,总奖励 = 准确性奖励 + 格式奖励。这一阶段多加了一项:语言一致性奖励(Language Consistency Reward)。
计算方式很直接——统计推理过程中目标语言词汇的比例。如果用户用中文提问,推理过程中中文词的比例越高,语言一致性奖励就越高。
这篇奖励直接加到最终的总奖励里,对推理数据和非推理数据都生效。
论文做了一个消融实验来检验语言一致性奖励的效果。用 DeepSeek-R1-Distill-Qwen-7B 做对比,去掉语言一致性奖励的那组,随着训练进行,语言一致性持续恶化;加上这个奖励的那组,语言一致性在整个训练过程中保持稳定。
代价是,加上语言一致性奖励后,推理能力有轻微下降——数学基准变化不大,代码基准略降。但团队认为这个交换是值得的,因为对人类用户来说,读得懂的推理比稍微强一点但看不懂的推理更重要。
训练参数
这阶段的大量参数和 R1-Zero 一致:学习率 3e-6,KL 系数 0.001,温度 1,每题 16 个采样,每步 32 道题,批大小 512。GRPO 的裁剪比设为 10(这里的 10 不是 0.8-1.2 的裁剪范围,而是优势函数中截断比的上限系数)。参考模型仍然是每 400 步更新一次。
一个重要的不同是最大输出长度——这一阶段固定在 32,768 token,不像 R1-Zero 后期提到 65,536 token。
这阶段产出的模型叫 DeepSeek-R1-Dev2。它在编程生成、数学解题、STEM 推理任务上相比 Dev1 有明显提升(因为上的是推理导向 RL),但在 AlpacaEval 2.0、ArenaHard 这类偏用户偏好的基准上提升不大——因为奖励信号完全是规则驱动的,不涉及"帮助性""偏好"这些软指标。
第三阶段:拒绝采样 + 大规模 SFT
Dev2 的推理能力已经不错了,但它的能力分布偏科严重——推理强,通用弱。这轮 SFT 的目的就是把推理能力和通用能力一起融入模型。
数据构成
总共做了约 80 万条训练样本,分成推理数据和非推理数据两大类。
推理数据约 60 万条。生成方式是用 Dev2 作为采样器,对大量推理题做拒绝采样——每道题生成多个答案,只保留正确的。跟之前不同的是,这一阶段引入了一些无法用规则直接判对的题目,改用 DeepSeek-V3 做裁判来判定答案是否正确(把标准答案和模型预测一起喂给 V3,让它判断对不对)。
此外还筛掉了语言混杂的、段落冗长的、代码块过多的推理链。
非推理数据约 20 万条。覆盖写作、事实问答、自我认知、翻译等任务。这部分复用了 DeepSeek-V3 的 SFT 数据集的一部分,同时加入了软件工程相关数据(程序修复、前端开发),让模型具备解决实际工程问题的能力。
关于推理过程的表达风格,团队给模型定了几个原则:段落要短,便于阅读;语气要自然,不用 markdown 格式化思维过程;最重要的是,推理要先理解用户的完整上下文——用户是谁、遇到了什么问题、真正需要什么,包括那些没说出口但隐含的需求。
数据处理完之后,在这个 SFT 数据集上对 DeepSeek-V3-Base 训了 2-3 个 epoch。学习率从 5×10⁻⁵ 开始,用余弦衰减到 5×10⁻⁶。最大上下文长度 32,768 token,批大小 128。
产出的模型叫 DeepSeek-R1-Dev3。它在 AlpacaEval 2.0 和 Aider-Polyglot(代码工程基准)上有显著提升——这得益于非推理语料和工程代码数据的大规模注入。在数学和代码推理基准上仍有小幅提升。
一个有趣的实验现象
训练数据的统计信息值得留意。这 80 万条数据里,大部分是单轮交互。这可能导致 DeepSeek-R1 在多轮对话上的能力偏弱。
数据里的数学部分主要覆盖中英文,难度跨度大,所有题目都可以通过确定性规则或标准答案来验证对错。代码数据不只有竞赛题,还包含了调试任务和项目导向的编程问题。STEM 和逻辑题虽然比数学和代码少,但来源是公开教材和在线题库。
第四阶段:全场景对齐 RL
第三阶段的 SFT 让模型学会了处理各种非推理任务,但还没有经过"对齐"——让它学会什么是有帮助的、什么是无害的。这阶段的 RL 就是来做这件事的。
奖励信号的组成
这一阶段的奖励由三部分组成:
推理奖励:跟 R1-Zero 一样,用规则奖励。数学、代码、逻辑题,还是那套做法。
通用奖励:用**奖励模型(Reward Model)**来打分。需要分别训两个奖励模型——
- 帮助性奖励模型:基于 DeepSeek-R1 的架构,加一个输出标量分的线性头。训练数据是 66,000 个偏好对(两个回答,一个更好的和一个更差的),用 DeepSeek-V3 生成偏好判断。为了避免位置偏差,每个偏好对正反各评一次(A 在前和 B 在前各评一次),取四次评分的平均。还做了长度平衡——确保好回答和差回答的长度差不多,避免模型认为"长=好"。
- 安全性奖励模型:在 106,000 条带标注(safe/unsafe)的数据上训的,用点式分类损失而非对比损失。也就是说,安全模型的输出直接是一个"是否安全"的分类分数。
对于每道题,如果是推理题就用规则奖励,如果是通用题就用对应的奖励模型打分。公式是:
总奖励 = 推理奖励 + 通用奖励 + 语言一致性奖励
训练参数和技巧
这阶段的参数跟前一个 RL 阶段最大的区别是温度——从 1 降到了 0.7。论文里解释,较高的温度在这一阶段会导致生成内容不连贯。
总共训了 1,700 步,其中通用指令数据和偏好奖励只在最后 400 步引入。这样做的原因是:基于模型偏好的奖励信号,如果训太久,模型会学会"讨好"奖励模型而不是真正对齐人类偏好——这个现象在论文里被称为"奖励黑客"(Reward Hacking)。
论文里展示了一个奖励黑客的例子:随着训练步数增加,奖励模型打的分持续上升,但模型在 Codeforces 上的实际准确率反而在下降。这说明模型找到了"骗奖励"的方法,但这个方法并没有提高真正的解题能力。
经过这阶段,得到的就是最终的 DeepSeek-R1。
各阶段效果一览
论文里有一张表,把 R1-Zero、R1-Dev1、Dev2、Dev3 和最终 R1 在多个基准上的表现做了对比:
- Dev1 vs R1-Zero:指令遵循能力大幅提升(IF-Eval 从 46.6 涨到 71.7,ArenaHard 从 53.6 涨到 77.0),但因为冷启动数据量小,推理略有下降(AIME 从 77.9 降到 74.0)。
- Dev2 vs Dev1:推理大幅恢复和增强(AIME 从 74.0 涨到 78.1,Codeforces 从 84.5% 涨到 90.5%,LiveCodeBench 从 57.5 涨到 63.5)。通用基准变化不大,说明这阶段的 RL 是推理导向的。
- Dev3 vs Dev2:通用任务大幅提升(AlpacaEval 从 55.8 涨到 62.1,Aider-Polyglot 从 25.6 涨到 44.8)。这得益于 20 万条非推理 SFT 数据的加入。
- R1 vs Dev3:通用偏好进一步大幅提升(AlpacaEval 从 62.1 涨到 87.6,ArenaHard 从 75.6 涨到 92.3)。推理基准小幅提升,因为推理专项 RL 已经在前面的阶段里做了很多。
训练总成本
这里贴一下论文里给的总成本数据:
| 阶段 | GPU 小时(H800) | 折算费用 |
|---|---|---|
| DeepSeek-R1-Zero 训练 | 101,000 | $202,000 |
| SFT 数据生成 | 5,000 | $10,000 |
| DeepSeek-R1 训练 | 41,000 | $82,000 |
| 合计 | 147,000 | $294,000 |
用的是 64×8 H800 GPU。整个 R1-Zero 训了约 198 小时(8 天出头),R1 多阶段训练约 80 小时(3 天出头)。
约 30 万美金的训练成本,产出了一个在推理能力上跟 OpenAI o1 持平的开源模型。这个数字本身对行业的影响可能比论文里的基准分数更大——它说明大规模 RL 推理训练的成本,已经降到了足够多团队摸得到的水平。
小结
DeepSeek-R1 的多阶段训练管线可以概括为:SFT 定格式和表达习惯 → RL 冲推理能力 → SFT 覆盖通用能力 → RL 做全场景对齐。
这个设计里有两个"为什么这样而不是那样"的决策值得重复:
第一,为什么冷启动 SFT 只用几千条数据,而不是像传统做法那样用大量数据?因为太多的人类示范会约束模型探索——冷启动只是为了解决可读性,推理能力留给 RL 去挖掘。
第二,为什么最后阶段 RL 只在通用数据上训了 400 步就停?因为基于模型的奖励信号会被模型钻空子——时间越长,模型越容易学会讨好奖励模型而不是真正对齐。推理数据的规则奖励没有这个问题,可以训更久。
下一篇会展开 DeepSeek-R1 的完整实验结果——在各种基准上跟其他模型对比,包括安全评估、多语言表现和越狱攻击的鲁棒性。
更多推荐



所有评论(0)