DeepSeek-R1学习笔记:从GRPO到蒸馏的推理模型实战拆解

发布时间:2026/10/9 4:54:45

DeepSeek-R1学习笔记:从GRPO到蒸馏的推理模型实战拆解 1. 从 GRPO 到蒸馏DeepSeek-R1 推理模型实战拆解DeepSeek-R1 是 DeepSeek 推出的第一代推理模型它最核心的价值在于验证了一件事大模型的推理能力可以通过纯强化学习自发涌现而不必依赖大量人工标注的监督数据。围绕这条主线R1 系列分出了两条技术脉络——一条是 GRPO 强化学习训练从 R1-Zero 的纯 RL 自进化到 R1 的多阶段冷启流水线另一条是蒸馏落地把 R1 的推理模式迁移到 Qwen、Llama 等小稠密模型上。这篇笔记面向想复现推理模型训练流程的开发者重点给出可复制的 GRPO 配置片段、蒸馏验证脚本以及如何通过 TaoToken 统一 Key/API 通道调用模型做对照实验最终验证蒸馏前后推理链质量的差异。我试过把 R1-Zero 和 R1 的训练阶段拆开对照发现 GRPO 的组内归一化奖励设计是理解整个训练稳定性的关键。R1-Zero 直接用 DeepSeek-V3-Base 做 RL不做任何 SFT在 AIME 2024 上 pass1 从 15.6% 涨到 71.0%多数投票后到 86.7%。但它可读性差、语言混杂。R1 则先收集几千条冷启数据微调 V3-Base再走推理导向 RL、拒绝采样 SFT、全场景 RL 四阶段。蒸馏部分更直接用 R1 产出的 800k 样本 SFT 小模型14B 蒸馏版就能打败 QwQ-32B-Preview。下面按可跟做的顺序展开。1.1 GRPO 与 PPO 的核心差异GRPO 全称 Group Relative Policy Optimization组相对策略优化。它和 PPO 最大的区别是去掉了和策略模型同规模的 Critic 模型改用组内分数评估基线。具体做法是对同一个 prompt 采样一组回复用组内奖励的均值和标准差做归一化替代 PPO 里的 GAE 优势估计。这样显存占用大幅下降训练开销更可控。策略模型的优化目标可以简化为对每个样本用其奖励减去组内奖励均值再除以组内标准差得到相对优势然后代入带裁剪的 PPO 式目标函数。这个设计让 GRPO 在数学、代码这类有确定性答案的任务上特别合适因为奖励可以直接用规则验证。1.2 奖励模型规则奖励而非神经奖励R1-Zero 用的是基于规则的奖励系统包含两类。准确性奖励数学题要求模型把最终答案放在指定格式里用规则方法验证对错LeetCode 类编程题用测试样例和编译器反馈。格式奖励强制模型把思考过程放在think和/think标签之间。开发 R1-Zero 时没有用结果或过程的神经奖励模型原因是神经奖励模型在大规模 RL 中容易遭遇奖励黑客而且再训一个奖励模型要额外资源、让流程变复杂。这个取舍对复现很关键如果你要做推理任务 RL优先考虑规则可验证的奖励。1.3 训练模板与自进化现象R1-Zero 的训练模板很直接要求 base 模型先产生推理过程再给最终回答。约束只停留在结构化格式层面不强制反思性推理或特定解题策略目的是准确观察模型在 RL 中的自然进展。训练中出现了两个值得注意的现象。一是思考时间持续增加从几百到几千个推理 token这是模型内部驱动的演变不是外部调整。二是顿悟时刻模型在中间版本学会重新评估最初方法、分配更多思考时间。这印证了 RL 的激励设计能让模型自发发展出高级问题解决策略。2. TaoToken 前置统一 Key/API 通道做对照实验复现推理模型训练流程时一个现实问题是你要反复调用不同模型做对照——R1-Zero 中间 checkpoint、R1 正式版、蒸馏后的小模型如果每个模型都单独配一套 Key 和 Base URL实验管理会很乱。TaoToken 在这里的作用是提供统一的 Key/API 通道让你用同一套接入方式调用多个模型把精力放在推理链质量对比上而不是环境配置上。TaoToken 官网是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 。它的定位是统一模型调用通道适合做蒸馏前后对照、GRPO 训练中间产物评估这类需要频繁切换模型的场景。你可以在模型对话页直接试推理效果在 console 管理 Key在 api-keys 页面生成密钥接入文档在 doc 页面。需要说清楚的是TaoToken 不是替代你的训练框架它解决的是推理侧调用和对照实验的通道问题。训练本身还是在你的 GPU 集群上跑 GRPO蒸馏 SFT 也是本地或云上训练。TaoToken 负责的是训练出 checkpoint 后怎么快速、统一地调用它做推理链质量评估。2.1 为什么对照实验需要统一通道蒸馏验证的核心是对比。你要看同一个数学题R1 原版、蒸馏 14B、蒸馏 7B 分别给出的推理链长度、反思次数、最终答案正确率。如果每个模型用不同 SDK、不同鉴权方式脚本里会充斥分支逻辑。统一通道后你只需要改 model 字段其余请求结构不变。2.2 接入前的准备清单在开始配置前确认三件事。第一在 api-keys 页面生成一个 Key记下来。第二确认你要调用的模型 ID比如 deepseek-r1 系列的具体标识。第三准备好你的评估脚本能解析think标签内容做推理链分析。这三样齐了后面的配置片段可以直接复制。3. 可复制配置GRPO 片段与统一调用 settings这一节给两段可复制内容。一段是 GRPO 训练配置的 JSON 片段参考 R1 论文里的奖励设计一段是统一调用通道的 settings 配置用于蒸馏验证脚本。3.1 GRPO 训练配置片段下面是一个简化的 GRPO 配置路径和字段按常见训练框架组织。核心是奖励函数部分准确性奖励加格式奖励直接求和。{ algorithm: grpo, base_model: deepseek-v3-base, group_size: 16, kl_coef: 0.001, clip_range: 0.2, learning_rate: 1e-6, reward_fn: { accuracy: { type: rule_based, answer_pattern: \\\\boxed\\{(.*?)\\}, weight: 1.0 }, format: { type: tag_check, required_tags: [think, /think], weight: 0.1 } }, prompt_template: 请先给出推理过程再给出最终答案。推理过程放在 think 和 /think 之间。, max_gen_len: 32768, temperature: 0.6, top_p: 0.95 }group_size 设为 16 是组内归一化的采样数太小方差大太大显存吃紧。kl_coef 控制偏离参考模型的程度R1 训练里这个值偏小允许模型充分探索。temperature 和 top_p 用 0.6 和 0.95这是 R1 评估时的采样设置训练时可按需调整。3.2 统一调用 settings 配置蒸馏验证脚本要调用多个模型用统一通道的 settings 如下。Base URL、Key、Model ID 三件套齐全。{ base_url: https://taotoken.net/api, api_key: sk-your-taotoken-key, default_model: deepseek-r1, models: { r1_full: deepseek-r1, distill_14b: deepseek-r1-distill-qwen-14b, distill_7b: deepseek-r1-distill-qwen-7b }, request: { temperature: 0.6, top_p: 0.95, max_tokens: 32768 } }把 api_key 换成你在 api-keys 页面生成的值。models 字段里列出你要对照的模型 ID脚本里通过 key 切换。request 部分保持和训练评估一致的采样参数避免因采样差异导致推理链质量对比失真。3.3 蒸馏验证脚本下面这段 Python 脚本读取上面的 settings对同一批数学题分别调用 R1 原版和蒸馏模型提取推理链长度和最终答案。import json import re import requests with open(settings.json, r) as f: cfg json.load(f) def call_model(model_id, question): headers { Authorization: fBearer {cfg[api_key]}, Content-Type: application/json } payload { model: model_id, messages: [{role: user, content: question}], temperature: cfg[request][temperature], top_p: cfg[request][top_p], max_tokens: cfg[request][max_tokens] } resp requests.post( f{cfg[base_url]}/v1/chat/completions, headersheaders, jsonpayload, timeout300 ) resp.raise_for_status() return resp.json()[choices][0][message][content] def extract_reasoning(text): match re.search(rthink(.*?)/think, text, re.DOTALL) if match: return match.group(1).strip() return def extract_answer(text): match re.search(r\\boxed\{(.*?)\}, text) if match: return match.group(1).strip() return questions [ 求所有正整数 n使得 n^2 1 能被 n 1 整除。, 计算 2024 的 2024 次方除以 7 的余数。 ] for q in questions: print(f问题: {q}) for name, model_id in cfg[models].items(): try: out call_model(model_id, q) reasoning extract_reasoning(out) answer extract_answer(out) print(f [{name}] 推理链长度: {len(reasoning)} 字符, 答案: {answer}) except Exception as e: print(f [{name}] 调用失败: {e}) print()脚本里 call_model 用统一的 base_url 和 api_key只改 model 字段。extract_reasoning 抓think标签内容extract_answer 抓\boxed{}里的答案。跑完你就能看到不同模型的推理链长度和答案对比。4. 验证请求与成功结果蒸馏前后推理链质量差异配置好之后跑一次验证请求看返回结构是否符合预期。下面是一个成功响应的结构示例以及蒸馏前后推理链质量的对比方法。4.1 成功响应结构调用统一通道后正常返回的 JSON 里 choices[0].message.content 包含完整输出推理过程在think标签内最终答案在\boxed{}里。如果返回里没有think标签说明模型没按格式输出需要检查 prompt 或模型是否支持推理链。{ choices: [ { message: { role: assistant, content: think首先分析题目条件.../think最终答案是 \\boxed{3}。 }, finish_reason: stop } ], usage: { prompt_tokens: 45, completion_tokens: 1200, total_tokens: 1245 } }4.2 蒸馏前后对比维度验证蒸馏效果不能只看最终答案对错要看推理链质量。我一般看四个维度。推理链长度蒸馏模型是否保留了长思维链还是被压缩了。反思次数推理链里出现「重新检查」「换一种方法」这类反思行为的频率。语言一致性是否混用中英文。答案正确率最终答案对不对。R1 论文里蒸馏 14B 打败 QwQ-32B-Preview靠的就是推理模式的迁移。你跑上面的脚本如果蒸馏 14B 的推理链长度接近 R1 原版反思行为也保留说明蒸馏有效。如果蒸馏 7B 推理链明显变短但答案还对说明它走了捷径泛化可能差。4.3 用模型对话页快速抽查在正式跑脚本前可以先去模型对话页手动试几个题直观感受不同模型的推理链风格。这一步能帮你快速判断配置是否生效避免脚本跑半天才发现 Key 或模型 ID 写错。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth复现过程中容易踩的坑集中在调用侧。下面按真实报错对照排查。5.1 401 Unauthorized报错信息通常是{error: {message: Invalid API key, type: invalid_request_error}}。原因Key 写错、Key 过期、或者 Authorization 头格式不对。排查确认 api_key 是 api-keys 页面生成的完整值Authorization 头是Bearer sk-xxx格式中间有空格。如果 Key 没问题还报 401检查是不是把 Base URL 写成了带路径的地址Base URL 应该是 https://taotoken.net/api 请求路径再拼/v1/chat/completions。5.2 local proxy failed报错信息类似Connection error: local proxy failed to connect。原因本地网络环境或代理配置干扰了请求。排查检查你的 requests 是否走了系统代理如果是在请求里显式设置proxies{http: None, https: None}绕过。另外确认 base_url 没有多余斜杠https://taotoken.net/api后面直接拼/v1/...。5.3 reading choices 报错报错信息类似KeyError: choices或list index out of range。原因返回结构和你预期的不一样可能是模型返回了错误信息而不是正常 completion。排查在脚本里先打印resp.json()看完整结构确认没有 error 字段。如果返回里有 error按 error message 处理。另外确认 max_tokens 没超过模型上限超了可能返回空 choices。5.4 OAuth 相关报错报错信息类似OAuth token expired或authentication failed。原因如果你用的是需要 OAuth 的客户端比如某些 coding agenttoken 过期了。排查重新走一遍授权流程或者在 console 里重新生成 Key。如果你在 Claude Code 这类工具里接入确认 Base URL、Key、Model ID 三件套都填对Base URL 用 https://taotoken.net/api Model ID 用你要调的模型标识。5.5 蒸馏脚本调用超时报错信息requests.exceptions.Timeout。原因推理模型输出长max_tokens 设太大或者网络慢。排查把 timeout 从 300 调到 600或者先减小 max_tokens 测试连通性。另外确认没有并发太多请求把通道打满。6. 语义一致 CTA继续你的推理模型实验如果你要复现 GRPO 训练重点在奖励函数设计和组内归一化训练本身在本地集群跑。训练出 checkpoint 后用统一通道做对照实验是最省事的路径。生成 Key 去 API Keys 页面https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 接入细节看文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 。想先手动试推理链效果去模型对话https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 。如果你要长期跑编码类 Agent 做蒸馏数据生成看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 。管理多个 Key 和用量在 consolehttps://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 。最后说一个实操细节蒸馏验证时同一批题至少跑 4 次取平均因为推理模型采样有波动单次结果可能误导。R1 论文评估时用 passk 和非零温度就是这个原因。你把脚本里的 questions 换成自己的测试集跑完对比推理链长度和反思次数就能判断蒸馏是否真的把推理模式迁移过来了。
延伸阅读

更多相关文章

2026/10/9 4:49:45

用伪代码描述模式切换:状态转换、边界梳理与实战写法

1. 模式切换需求的“第一公敌”:自然语言说不清状态我先说个真实体验。在接手过的不少项目和方案里,“模式切换”这四个字出现频率极高——无线设备的胖瘦模式切换、驱动软件的语言界面切换、照明系统的情景模式切换、设备的运行/配置模式切换。每次需求…

2026/10/9 5:54:48

运算符重载实战:从底层原理到Python/C++核心实现与避坑指南

1. 从“为什么需要”说起:运算逻辑不该是函数的一堆剪不断理还乱的调用我第一次意识到运算符重载的价值,是在写一个三维向量库的时候。那会儿刚工作不久,心气高,觉得自己能把所有东西都用函数搞定。结果就写出来addVectors(scaleV…

2026/10/9 5:54:48

《嵌入式操作系统》_驱动开发_misc类设备与蜂鸣器_20261008

misc 类设备(杂项设备 / Miscellaneous Device)Linux 把所有无法归入标准大类、功能简单、零散小众的硬件统一收纳到 misc 框架下,共用固定主设备号 10(MISC_MAJOR),靠不同次设备号区分每个独立设备。适用场…

2026/10/9 5:49:48

WDM鼠标驱动开发实战:从源码解析到IRP数据过滤与签名安装

简介:这份资源是面向Windows底层驱动开发学习者的WDM鼠标驱动源代码包,适合已具备C/C基础、希望理解设备驱动模型与HID设备交互机制的开发者参考。压缩包共13个文件,约12KB,以4个h头文件、2个cpp实现文件为主,另有rc资…

2026/10/8 10:03:18

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/8 10:03:20

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 0:04:27

毕业论文初稿完成后首次进行AIGC疑似度自查的摸底与分流策略

毕业论文初稿完成后首次进行AIGC疑似度自查的摸底与分流策略当数万字的学位论文初稿经历开题、实验、问卷与多轮文献梳理最终成形时,绝大多数研究生都会面临一道全新的形式审查关卡:AIGC 疑似度排查。在高校毕业审核流程中,盲审前的文本检测通…

2026/10/9 0:04:27

食堂节能改造源头工厂,商用厨房设备焕新方案广受好评

商用厨房作为餐饮经营、单位供餐的核心后勤阵地,其设备配置、动线规划与运维体系直接决定后厨作业效率、运营成本与合规性。从基础的灶具、制冷存储设备,到油烟净化、水处理等配套系统,每一个环节的合理性都与食品安全、能耗管控、消防安全挂…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑