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 换成自己的测试集跑完对比推理链长度和反思次数就能判断蒸馏是否真的把推理模式迁移过来了。

相关新闻

题解:洛谷 AT_abc470_d [ABC470D] Inverse and Swap

题解:洛谷 AT_abc470_d [ABC470D] Inverse and Swap

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大家订阅我的专栏:算法…

2026/10/9 4:55:07 阅读更多 →
Windows搭建局域网NTP服务器:注册表配置与交换机同步避坑指南

Windows搭建局域网NTP服务器:注册表配置与交换机同步避坑指南

简介:这份PDF文档面向需要在Windows环境下搭建局域网NTP服务器的网络运维人员与系统管理员,针对网络设备无法同步时间、始终显示unsynchronized等常见问题提供可落地的注册表配置思路。内容围绕启用NTPServer服务、关闭NTP Client、强制主机使用内置CMOS…

2026/10/9 4:55:07 阅读更多 →
Day50图论part2复盘:最短路径、最小生成树与拓扑排序

Day50图论part2复盘:最短路径、最小生成树与拓扑排序

今天是第50天,我的算法训练打卡正式走到了图论part2。说实话,走到这里的人已经不多了——前49天里,数组、链表、哈希、二叉树、回溯、贪心、动态规划全都过了一遍,刷题群里和我同期出发的人大概只剩下三分之一。图论这个专题特别有…

2026/10/9 4:55:07 阅读更多 →

最新新闻

被动TAP与主动TAP核心区别及选型实战指南

被动TAP与主动TAP核心区别及选型实战指南

1. 什么是网络TAP?从“看不见的监听口”说起你有没有遇到过这样的场景:刚上线的新业务系统,用户反馈页面加载慢、接口超时频发,但监控平台显示服务器CPU、内存一切正常,网络带宽使用率也才30%——问题像藏在毛玻璃后面…

2026/10/10 6:58:08 阅读更多 →
服务器硬件核心拆解:CPU、内存、RAID与BMC选型运维全解析

服务器硬件核心拆解:CPU、内存、RAID与BMC选型运维全解析

服务器硬件这事,很多人一开始容易走两个极端:要么觉得不就是台配置更高的电脑吗,要么被双路、ECC、RAID、热插拔这些名词直接劝退。这两种心态我都见过,也都在自己身上出过。早些年帮某实验室搭模拟项目X的计算平台,按…

2026/10/10 6:58:08 阅读更多 →
分布式ID生成方案深度对比:从自增主键到雪花算法与Leaf

分布式ID生成方案深度对比:从自增主键到雪花算法与Leaf

作为后端开发,几乎每个人迟早都会面对一个问题:系统拆分成多个实例或者分库分表之后,原来那张表上的自增主键怎么办?之前单库单表的时候,AUTO_INCREMENT简直是无脑首选:写起来简单,性能也好&…

2026/10/10 6:58:08 阅读更多 →
PCA9422+STM32F373RC:嵌入式电源管理完整方案实战解析

PCA9422+STM32F373RC:嵌入式电源管理完整方案实战解析

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

2026/10/10 6:58:08 阅读更多 →
FISCO BCOS+Spring Boot+Vue区块链电商存证实战

FISCO BCOS+Spring Boot+Vue区块链电商存证实战

简介:这是一份面向 Java 全栈初学者的 FISCO BCOS 区块链电商项目入门文档,将 Spring Boot 与 Vue 前后端分离架构和联盟链应用结合起来,适合想了解区块链环境搭建、智能合约部署及链上业务集成的开发者。资源为 1 个 PDF 文件,大…

2026/10/10 6:58:08 阅读更多 →
macOS微信双开完整指南:复制应用包与多用户方案详解

macOS微信双开完整指南:复制应用包与多用户方案详解

1. 为什么会有“双开”这个需求1.1 一个账号不够用,是真实存在的痛点在macOS上使用微信的人,迟早会遇到一个尴尬的局面:工作一个号、生活一个号,或者主号之外还有一个专门用来对接客户、管理社群的小号。手机端早就可以通过系统自…

2026/10/10 6:57:08 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* 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 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* 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 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* 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 6:17:20 阅读更多 →