首页 / 资讯中心 / 文章详情

DeepSeek-R1 大模型训练技术分析:GRPO 强化学习与蒸馏落地实践

DeepSeek-R1 大模型训练技术分析:GRPO 强化学习与蒸馏落地实践 ★ FEATURED ARTICLE
1. 从 DeepSeek-R1 训练链路说起GRPO 与蒸馏到底解决什么问题如果你最近在折腾推理模型复现大概率会卡在同一个地方SFT 数据堆了不少模型回答却还是“看起来像推理实际上在绕圈”。DeepSeek-R1 这篇技术报告最有价值的部分不是它刷了多少榜而是它把一条可复现的路线摊开了——先用纯强化学习验证推理能力能否被“激励”出来再用冷启动数据把可读性拉回来最后把大模型的推理轨迹蒸馏进小模型。这条链路里有两个关键词GRPO 和蒸馏。GRPOGroup Relative Policy Optimization是强化学习阶段的优化算法它最大的特点是砍掉了和策略模型同规模的 Critic 模型改用一组采样回答的相对得分来估计基线。翻译成人话以前你要养一个“裁判模型”来打分现在让模型对同一个问题生成一组答案组内互相比谁比平均分高就奖励谁。显存和训练成本直接降一个量级这对想在自己机器上跑 RL 的开发者来说是能不能落地的分水岭。蒸馏则是另一条腿。DeepSeek-R1 用 80 万条精选数据直接 SFT 小模型Qwen-1.5B 在 AIME 上能到 28.9%MATH 到 83.9%这个结果说明推理能力可以通过高质量轨迹“搬运”不一定非要每个小模型都从零做 RL。对预算有限的团队蒸馏是性价比最高的路径。但复现过程中有个现实问题训练脚本能跑验证环节却容易断。你需要一个稳定的 API 通道去对比 base 模型、RL 中间 checkpoint、蒸馏后模型的输出差异。我试过用 TaoToken 统一管理 Key 和模型入口把训练侧的本地推理和线上对比解耦开后面会给出具体配置。这一篇就按“训练目标 → GRPO 配置 → 蒸馏数据构造 → 调用验证 → 报错排查”的顺序把能直接抄的片段都放出来。2. TaoToken 前置准备统一 Key 与 API 通道怎么配在开始写训练配置之前先把验证通道搭好。原因很简单GRPO 训练过程中你会频繁需要“拿同一个 prompt 去问不同 checkpoint”如果每个模型都单独配一套环境变量脚本会变得很难维护。TaoToken 的作用是把模型入口收敛成一个 Base URL 一个 Key切换模型只改 Model ID。先注册并拿到 Key。打开 https://taotoken.net/api 对应的控制台入口在 API Keys 页面创建一个新 Key。建议按用途拆开一个给训练验证脚本一个给日常对话调试方便后面按 Key 排查调用量。创建后立刻复制页面刷新后不再完整显示。拿到 Key 之后配置方式分两种。如果你用 OpenAI 兼容的 SDK直接设环境变量export TAOTOKEN_API_KEYsk-你的Key export TAOTOKEN_BASE_URLhttps://taotoken.net/api如果你用 Claude Code 这类工具配置项名称不一样需要写 Base URL、Key、Model ID 三件套。以 settings 片段为例{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: sk-你的Key, ANTHROPIC_MODEL: deepseek-r1 } }注意这里 Base URL 不要带多余路径Model ID 按控制台里实际列出的写。很多人第一次配错就是把/v1重复拼了导致 404。配好之后先做一次最小验证别等训练跑起来才发现通道不通from openai import OpenAI client OpenAI( api_keysk-你的Key, base_urlhttps://taotoken.net/api ) resp client.chat.completions.create( modeldeepseek-r1, messages[{role: user, content: 11 等于几只输出数字}], temperature0.6 ) print(resp.choices[0].message.content)能打印出结果说明通道没问题。这一步的意义在于后面 GRPO 训练里做 reward 校验、蒸馏数据做拒绝采样都要靠这个通道批量跑推理。把通道先固定下来训练脚本里只引用环境变量不硬编码 Key。另外提醒一句训练验证阶段请求量可能不小建议在控制台里给这个 Key 设一个额度提醒避免半夜跑采样把额度打满。模型对话入口可以用来手动抽查输出质量地址是 https://taotoken.net/api 对应的对话页调试 prompt 模板时比写脚本快。3. 可复制配置GRPO 训练片段与蒸馏数据构造这一节是全文的核心直接给能跑的配置。先看 GRPO 的关键参数。DeepSeek-R1 报告里强调了两点基于规则的奖励系统以及组内相对基线。下面是一个精简后的 GRPO 配置片段用 TOML 写方便你塞进自己的训练框架[grpo] group_size 8 # 每个 prompt 采样 8 条回答组内比较 kl_coef 0.001 # KL 惩罚防止策略跑偏 clip_range 0.2 # PPO 式裁剪 learning_rate 1e-6 rollout_batch_size 64 max_new_tokens 4096 # 推理链较长给足空间 temperature 1.0 top_p 0.95 [reward] accuracy_weight 1.0 # 答案正确性规则校验 format_weight 0.1 # 格式奖励要求推理过程放在指定标签内 language_consistency 0.05 # 语言一致性缓解中英混杂 [reward.rule] math_answer_pattern \\boxed\\{(.*?)\\} # 数学题从 boxed 提取答案 code_use_compiler true # 代码题走编译器测试用例几个参数的解释都是踩过坑的group_size不要设太小4 以下组内方差估计不稳奖励信号噪声大kl_coef设大了模型不敢探索设小了容易输出崩坏0.001 是个保守起点。max_new_tokens给到 4096 是因为 R1-Zero 的推理链会自然变长截断会直接毁掉 reward 计算。奖励函数这块报告里明确说没用神经奖励模型原因是大规模 RL 下容易被“欺骗”。所以你的 accuracy reward 一定要用规则校验数学题提取 boxed 内容做字符串或符号比对代码题丢进沙箱跑测试用例。格式奖励就是检查...标签是否闭合这个用正则就能做。再看蒸馏数据构造。核心思路是用收敛后的 R1 模型对一批 prompt 采样多条回答做拒绝采样只保留答案正确且格式可读的轨迹。下面是一个数据构造的伪代码片段import json from openai import OpenAI client OpenAI(api_keysk-你的Key, base_urlhttps://taotoken.net/api) def sample_and_filter(prompt, n4): resp client.chat.completions.create( modeldeepseek-r1, messages[{role: user, content: prompt}], nn, temperature0.6, top_p0.95 ) kept [] for choice in resp.choices: text choice.message.content if not has_reasoning_tag(text): # 过滤格式不完整 continue if is_mixed_language(text): # 过滤中英混杂 continue if not verify_answer(text, prompt): # 规则校验答案 continue kept.append({prompt: prompt, response: text}) return kept dataset [] for p in prompt_pool: dataset.extend(sample_and_filter(p, n4)) with open(distill_sft.jsonl, w, encodingutf-8) as f: for item in dataset: f.write(json.dumps(item, ensure_asciiFalse) \n)这里n4是采样数报告里提到每个 prompt 采样多个响应并保留正确的总量约 60 万条推理数据加 20 万条通用数据。你自己复现时不用一步到位先跑 1 万条验证流程通不通。过滤条件里“混合语言”和“长段落代码块”这两条很关键报告里专门提到要过滤掉否则蒸馏出的小模型会继承这些坏习惯。数据构造完之后SFT 阶段只做监督微调不加 RL。报告里蒸馏模型就是纯 SFT效果已经能超过同尺寸指令模型。如果你想再进一步可以在蒸馏后加一轮小规模 GRPO但那是另一个话题了。4. 验证请求与成功结果怎么确认训练真的有效训练跑完不等于有效。你需要一套对比验证流程确认 RL 阶段和蒸馏阶段各自带来了什么。最直接的方法是用固定测试集对 base、RL checkpoint、蒸馏模型分别跑 pass1。先写一个批量验证脚本走 TaoToken 通道import json from openai import OpenAI client OpenAI(api_keysk-你的Key, base_urlhttps://taotoken.net/api) def eval_model(model_id, test_file): correct 0 total 0 with open(test_file, encodingutf-8) as f: for line in f: item json.loads(line) resp client.chat.completions.create( modelmodel_id, messages[{role: user, content: item[question]}], temperature0.6, top_p0.95 ) answer extract_boxed(resp.choices[0].message.content) if answer item[gold]: correct 1 total 1 return correct / total print(base:, eval_model(deepseek-v3-base, aime_sample.jsonl)) print(r1:, eval_model(deepseek-r1, aime_sample.jsonl))跑完之后你会看到类似这样的结果base 模型在数学题上 pass1 可能只有 15% 左右RL 收敛后的 checkpoint 能到 60% 以上蒸馏后的小模型在 7B 尺寸能到 50% 上下。这个梯度如果对得上说明你的训练链路是通的。除了准确率还要看两个现象。第一是输出长度RL 训练过程中模型回答会自然变长因为它学会了“多想一会儿”。如果你发现长度没变化大概率是 reward 信号没生效。第二是格式合规率统计...标签闭合的比例这个指标在冷启动 SFT 之后应该接近 100%如果掉下来说明格式奖励权重不够。验证阶段建议把每次实验的模型 ID、测试集、pass1、平均输出长度记成一张表。我自己的习惯是每跑完一轮就往表格里加一行对比起来很直观。模型对话页面可以用来手动抽查几个 case看看推理过程是不是真的在反思和验证而不是套模板。如果验证结果和预期差很多先别急着调参回到第 5 节排查常见错误。很多“训练无效”其实是调用通道或数据格式的问题。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth复现过程中报错集中在几个地方逐个说。401 Unauthorized最常见。先检查 Key 有没有复制完整前后有没有空格。然后确认 Base URL 是不是https://taotoken.net/api不要自己加/v1。如果你用的是 Claude Code 类工具注意它读的是ANTHROPIC_AUTH_TOKEN而不是OPENAI_API_KEY变量名写错也会 401。还有一种情况是 Key 被禁用或额度耗尽去控制台确认状态。local proxy failed这个报错通常出现在你本地配了转发规则但目标地址不可达。排查顺序是先确认环境变量里没有残留的代理设置再确认 Base URL 拼写。如果你在容器里跑训练注意容器内的网络配置和宿主机不一样环境变量要显式传进去。这个错误和训练代码无关纯粹是通道配置问题。reading choices 报错一般是响应结构和你解析的字段对不上。比如你按resp[choices][0][text]解析但实际返回的是message.content。打印一次完整响应体就能定位。另外如果你用了n1采样要遍历resp.choices而不是只取第一个。OAuth 相关报错出现在用 Claude Code 或类似工具时通常是认证方式没选对。这类工具支持 OAuth 和 API Key 两种模式你要在配置里明确走 Key 模式把 Base URL、Key、Model ID 三件套写全。缺任何一个都会走到默认的 OAuth 流程然后失败。配置片段参考第 2 节的 settings 示例。蒸馏数据为空如果sample_and_filter跑完一条都没留下检查三个过滤条件是不是太严。verify_answer的答案提取正则可能没匹配上先单独打印几条原始输出看看格式。语言一致性判断如果用了过于严格的分词中文标点可能被误判。reward 全为 0GRPO 训练里如果 accuracy reward 一直是 0模型学不到东西。先确认你的答案提取逻辑对 base 模型输出也适用有些模型不按\boxed{}格式输出需要放宽提取规则。格式奖励可以先单独开着保证至少有一部分信号。排查完这些基本能覆盖 90% 的复现阻塞。剩下的就是调参和等收敛了。6. 长期编码与 Agent 场景把验证通道固定下来如果你打算长期做推理模型复现或者把蒸馏后的小模型接进 Agent 流程建议把调用通道做成一个独立模块训练脚本、评测脚本、Agent 都引用同一份配置。这样换模型只改一个 Model ID不用满仓库找硬编码。对于需要反复跑 RL 和蒸馏的实验Coding Plan 这类长期方案比按次调用更划算入口在 https://taotoken.net/api 对应的订阅页。接入文档里有各语言 SDK 的完整示例配 Key 和 Base URL 的细节都在里面。模型对话页面适合快速验证 prompt 模板API Keys 页面管理多套 Key 的额度。最后给一个实用技巧在训练脚本里加一个--dry-run模式只跑 10 条数据走完整流程确认通道、数据格式、reward 计算都正常再放开全量。这个习惯帮我省过好几次半夜发现数据格式错的返工。推理模型复现是个长周期活把验证通道和 dry-run 做扎实后面调参才有意义。
阅读完成 · 觉得有帮助?
咨询建站