简介DeepSeek-R1技术报告论文面向大语言模型研究者、算法工程师及对强化学习推理方向感兴趣的进阶学习者系统阐述如何通过强化学习激发LLM的推理能力。报告完整呈现DeepSeek-R1-Zero在无监督微调条件下经大规模RL训练涌现出的推理行为以及针对可读性差、语言混杂等问题引入多阶段训练与冷启动数据后的DeepSeek-R1方案并给出与OpenAI-o1-1217在AIME 2024、Codeforces、GPQA Diamond、MATH-500、MMLU、SWE-bench等基准上的对比结果。资源为1个PDF文件压缩包约1.27MB内容涵盖贡献总结、方法论、RL算法与奖励建模、蒸馏策略及失败尝试讨论并开源R1-Zero、R1与六个基于Qwen和Llama的密集模型。已有5205人学习适合作为复现思路、撰写综述或设计推理训练方案的参考底稿。1. 从 AIME 15.6% 到 71.0%纯 RL 为什么能把基座模型逼出推理能力DeepSeek-R1 技术报告里最反直觉的一组数字是 DeepSeek-R1-Zero 在 AIME 2024 上的 pass1 从 15.6% 涨到 71.0%而这条曲线背后没有任何 SFT 数据。也就是说团队没有先喂几万条「标准解题过程」而是直接拿 DeepSeek-V3-Base 上 GRPO让模型自己在think标签里摸索怎么想问题。这件事对做 LLM 后训练的人意义很大过去大家默认「先 SFT 冷启动、再 RL 对齐」是必经流程报告用实验说明纯 RL 也能让模型自发涌现出自我验证、反思、拉长 CoT 这些行为。这份技术报告适合三类人读一是正在搭后训练流水线的算法工程师想知道 GRPO 相比 PPO 省掉了什么二是想复现推理模型但卡在数据标注成本上的团队关心冷启动数据到底要多少三是准备把 R1 蒸馏到 7B/14B/32B 做私有部署的开发者需要看清蒸馏和直接 RL 的差距。下面按算法、奖励、流水线、蒸馏、排错五块拆开讲能抄的参数和模板都给出。2. GRPO 目标函数与规则奖励R1-Zero 的训练信号从哪来2.1 为什么用 GRPO 而不是 PPOPPO 在 LLM 上做 RL 时需要额外维护一个和策略模型同尺寸的 critic 网络来估计 baseline显存和训练成本直接翻倍。GRPO 的做法是对同一个 question 采样一组输出{o1, o2, ..., oG}用这组输出的奖励均值当 baseline省掉 critic。报告里给出的目标函数是J_GRPO(θ) E[ q~P(Q), {oi}~π_old(O|q) ] (1/G) Σ_i [ min( π_θ(oi|q)/π_old(oi|q) * Ai, clip(π_θ(oi|q)/π_old(oi|q), 1-ε, 1ε) * Ai ) - β * D_KL(π_θ || π_ref) ]其中优势Ai用组内奖励标准化得到Ai (ri - mean({r1,...,rG})) / std({r1,...,rG})这个设计的关键在于「组内相对」。同一道题采样 8 条或 16 条回答谁比同组平均好谁就拿到正优势不需要一个绝对的价值函数去判断「这条回答值多少分」。对数学题这种答案可验证的场景组内比较天然合适。2.1.1 参数含义与调参方向参数含义常见取值调大后的影响G每题采样条数8 / 16优势估计更稳显存线性上升εclip 范围0.2更新更保守训练更慢但更稳βKL 惩罚系数0.001~0.04约束偏离参考模型过大导致学不动temperature采样温度1.0 左右过高输出发散过低组内奖励无差异提示G 太小比如 4时组内 std 容易接近 0优势计算会除以极小值训练出现尖峰。报告用的是较大 group复现时建议从 8 起步。2.2 规则奖励准确率奖励 格式奖励R1-Zero 没有用神经奖励模型原因是报告明确提到 neural reward model 在大规模 RL 中会出现 reward hacking而且重训奖励模型要额外资源、把流水线搞复杂。它用的是两类规则奖励准确率奖励数学题要求把最终答案写在指定格式里比如 boxed用规则校验对错LeetCode 类题目用编译器跑预定义测试用例给反馈。格式奖励强制模型把思考过程放进think/think答案放进answer/answer。训练模板大致长这样A conversation between User and Assistant. The user asks a question, and the Assistant solves it. The assistant first thinks about the reasoning process in the mind and then provides the user with the answer. The reasoning process and answer are enclosed within think/think and answer/answer tags, respectively. User: {prompt} Assistant:2.2.1 用 Python 写一个规则奖励校验器复现时最容易被低估的是答案抽取的鲁棒性。下面是一个常见的数学答案校验骨架import re def extract_boxed(text: str): # 抽取最后一个 \boxed{...} 里的内容处理嵌套花括号 idx text.rfind(\\boxed{) if idx -1: return None depth, start 0, idx len(\\boxed{) for i in range(start, len(text)): if text[i] {: depth 1 elif text[i] }: if depth 0: return text[start:i] depth - 1 return None def accuracy_reward(response: str, gold: str) - float: pred extract_boxed(response) if pred is None: return 0.0 # 归一化去空格、统一大小写、去掉千分位逗号 norm lambda s: s.strip().lower().replace(,, ).replace( , ) return 1.0 if norm(pred) norm(gold) else 0.0 def format_reward(response: str) - float: # 必须同时出现 think 和 answer 标签且顺序正确 has_think think in response and /think in response has_answer answer in response and /answer in response if has_think and has_answer: return 1.0 if response.index(think) response.index(answer) else 0.0 return 0.0extract_boxed用深度计数处理嵌套花括号避免\boxed{\frac{1}{2}}被截断accuracy_reward做归一化是因为模型经常输出1,000和1000这种等价形式format_reward只检查结构不检查内容和报告「避免内容偏见」的思路一致。最终奖励一般是accuracy λ * formatλ 取 0.1 量级即可格式奖励只是引导不能盖过正确性。3. 多阶段流水线冷启动数据、拒绝采样与两轮 RL 怎么串3.1 R1-Zero 的两个硬伤纯 RL 出来的 R1-Zero 推理能力够强但报告点出两个问题可读性差、语言混杂中英文夹杂。原因是训练模板只约束了结构没约束语言和表达风格。这两个问题在面向用户的场景里是致命的所以 R1 在 RL 之前加了一小批冷启动数据。3.2 四步流水线拆解报告里 R1 的训练流程可以拆成四步冷启动 SFT收集数千条长 CoT 数据微调 DeepSeek-V3-Base。注意是「数千条」量级不是几十万目的是给模型一个可读的推理格式起点。推理导向 RL在冷启动 checkpoint 上做和 R1-Zero 类似的 RL但这次要处理语言一致性通常做法是在奖励里加语言一致性项。拒绝采样 SFTRL 接近收敛时用当前 checkpoint 做拒绝采样生成新 SFT 数据再混入 DeepSeek-V3 在写作、事实问答、自我认知等领域的监督数据重新训练基座。全场景 RL用上一步的 checkpoint 再做一轮 RL这次 prompt 覆盖所有场景不只是推理题目的是兼顾有用性和无害性。3.2.1 拒绝采样的过滤逻辑拒绝采样不是「采样完直接用」而是按规则筛。常见做法是def rejection_filter(samples, gold, min_format_score1.0): kept [] for s in samples: # 1. 答案必须正确 if accuracy_reward(s, gold) 1.0: continue # 2. 格式必须合规 if format_reward(s) min_format_score: continue # 3. 语言一致性中英文混杂比例过高的丢弃 if mixed_language_ratio(s) 0.1: continue kept.append(s) return keptmixed_language_ratio一般统计非目标语言字符占比超过阈值就丢。这一步决定了第三阶段 SFT 数据的质量过滤太松会把 R1-Zero 的语言混杂问题带进 R1。注意冷启动数据的「数千条」是报告给的量级实际复现时如果基座不同、任务域不同这个数要重新试。太少模型学不会格式太多会限制 RL 阶段的探索空间。3.3 两轮 RL 的分工第一轮 RL 专注推理奖励以准确率为主第二轮 RL 覆盖全场景奖励要兼顾有用性、无害性和推理。两轮之间夹一次 SFT作用是「把 RL 探索到的好模式固化下来」同时把非推理能力补回来。这个「RL → 采样 → SFT → RL」的循环是 R1 和 R1-Zero 最大的结构差异。4. 蒸馏 1.5B 到 70B为什么直接蒸馏比在小模型上跑 RL 更划算4.1 蒸馏 vs 小模型 RL 的对比结论报告里一个明确结论用 Qwen2.5-32B 做基座直接从 DeepSeek-R1 蒸馏效果超过在这个 32B 模型上直接跑 RL。这说明大模型 RL 阶段探索出的推理模式本身是稀缺资源小模型自己 RL 很难摸索出同等质量的模式。对资源有限的团队这意味着「拿 R1 生成数据 SFT 小模型」比「自己搭 RL 训小模型」性价比高得多。4.2 开源蒸馏模型的规格与表现报告开源了基于 Qwen 和 Llama 的六个 dense 模型模型基座AIME 2024MATH-500LiveCodeBenchR1-Distill-Qwen-7BQwen2.5-7B55.5%——R1-Distill-Qwen-32BQwen2.5-32B72.6%94.3%57.2%R1-Distill-Llama-70BLlama3-70B———7B 蒸馏版在 AIME 2024 上 55.5%已经超过 QwQ-32B-Preview32B 版 72.6%接近 o1-mini。这组数字说明蒸馏路线的天花板比很多人预期的高。4.3 蒸馏数据的构造要点蒸馏不是把 R1 的输出原样喂给小模型。常见做法是# 用 R1 的 API 或本地部署批量生成推理数据 # 关键只保留最终答案正确的样本且格式统一 python generate_distill_data.py \ --model deepseek-r1 \ --input math_problems.jsonl \ --output distill_raw.jsonl \ --temperature 0.7 \ --max_tokens 8192 # 过滤答案正确 格式合规 长度在合理区间 python filter_distill.py \ --input distill_raw.jsonl \ --output distill_clean.jsonl \ --min-len 200 \ --max-len 8000temperature取 0.7 左右是为了保留一定多样性太低会让蒸馏数据千篇一律max_tokens要够大因为 R1 的 CoT 经常几千 token过滤阶段限制长度下限是为了丢掉那些「直接给答案没推理过程」的样本。4.3.1 蒸馏时的 loss 掩码SFT 蒸馏时通常只对 assistant 回复部分算 lossprompt 部分 mask 掉def build_labels(input_ids, prompt_len): labels input_ids.clone() labels[:, :prompt_len] -100 # -100 在 CrossEntropyLoss 里被忽略 return labelsprompt_len是用户问题加模板的长度-100是 PyTorch 的 ignore_index。如果忘了 mask模型会去学「怎么复述问题」浪费容量。5. 复现排错奖励尖峰、语言混杂与长度失控怎么定位5.1 训练不稳定的三个典型症状复现 RL 阶段时最常见的三类问题奖励尖峰后崩塌通常是组内 std 接近 0 导致优势爆炸检查 G 是否太小、temperature 是否太低。输出语言混杂R1-Zero 的已知问题如果做 R1 复现要在奖励里加语言一致性项或在冷启动数据里强化单语表达。CoT 长度失控模型为了拿格式奖励疯狂拉长输出检查是否给长度设了软约束或格式奖励权重是否过高。5.2 用 KL 散度监控偏离程度GRPO 目标里的D_KL(π_θ || π_ref)是判断训练是否跑偏的关键指标。常见做法是每个 step 记录 KLdef compute_kl(policy_logprobs, ref_logprobs): # 逐 token 的 KL 估计报告里用的是 k3 估计量 log_ratio ref_logprobs - policy_logprobs return torch.exp(log_ratio) - log_ratio - 1.0这个 k3 估计量恒非负比直接算log(p/q)更稳。KL 持续上升说明策略在快速偏离参考模型如果同时奖励没涨基本可以判定是奖励被 hack 了需要调大 β 或检查奖励函数。5.3 一个可复用的排查顺序遇到训练异常我一般按这个顺序查先看奖励分布是不是所有样本奖励都一样组内无区分度。再看 KL 曲线是不是单调飙升。然后抽样看输出是不是格式崩了或语言乱了。最后才动超参优先调 G 和 temperature再调 β 和 ε。提示报告里提到 neural reward model 会 reward hacking复现时如果非要用务必加 KL 约束和人工抽检否则模型会学会「讨好奖励模型」而不是「答对题」。5.4 验证蒸馏模型是否真的学到了推理蒸馏完不能只看 loss要在留出的推理题上测 pass1并且人工看几条 CoT 是否结构完整。一个快速验证脚本python eval_pass_at_1.py \ --model ./r1-distill-qwen-7b \ --dataset aime2024.jsonl \ --n_samples 1 \ --temperature 0.6n_samples1对应 pass1temperature评测时一般比训练低取 0.6 左右减少随机性。如果 pass1 明显低于报告里同规格模型的数字优先检查蒸馏数据的格式是否和评测模板一致——模板不匹配是蒸馏复现里最常见的坑。本文还有配套的精品资源点击获取