跳到主要内容 强化学习与 DeepSeek-R1 训练原理详解 | 极客日志
编程语言 AI 算法
强化学习与 DeepSeek-R1 训练原理详解 强化学习通过环境反馈优化策略,核心在于利用 Reward 信号指导模型行为。本文系统讲解了强化学习基础概念、Policy Gradient 及其变体、PPO 算法原理、Actor-Critic 架构及 GAE 优势估计方法。重点分析了 DeepSeek-R1 的训练机制,指出其摒弃了复杂的 PRM 和 MCTS,仅依靠规则奖励与 GRPO 算法实现高性能推理。文章详细对比了 R1-Zero 与 R1 的训练差异,涵盖冷启动、语言一致性奖励及拒绝采样微调等关键步骤,揭示了大模型推理能力提升的技术路径。
松间照月 发布于 2025/2/6 更新于 2026/4/20 1 浏览DeepSeek-R1 是一个强大的模型,其性能与 OpenAI o1 相当。R1 的训练方法简单到让人难以置信,没有 PRM(过程奖励模型)也没有 MCTS(蒙特卡洛树搜索),仅使用最基本的 rule-based reward(基于规则的奖励)直接进行训练!不管这是大道至简还是简单粗暴,反正效果拔群。
本期我们将从最基本的强化学习开始介绍到 DeepSeek-R1 的训练方式,深入解析其背后的技术逻辑。
1. 什么是强化学习 一言以蔽之,强化学习就是让将当前 Environment(环境)的 state(状态)输入到 actor(模型)中,让 actor 预测 action(动作)并输入到 Environment 中,让 Environment 产生 Reward(回馈)。如果 Reward 好,我们就鼓励模型这样做,否则就阻止模型这样做。
以具体例子来说,比如 FC 游戏'Space Invaders':
Environment 就是游戏本身,state 就是当前的游戏画面,actor 就是我们的 model,action 就是能做的操作(左移、右移、开火),而 Reward 就是得分。
2. 强化学习怎么做 简单说就是让 model 玩游戏,玩完以后会有一个得分,将得分作为 loss 再去 optimization(优化)就好。
更具体一些说,我们希望 model 能拿高分,而游戏最终的得分取决于模型在看到某个画面时所作的动作,所以我们可以把 RL 玩游戏的问题转化为看到某个画面做某个动作的分类问题。
需要注意的是,这里与 Supervised Learning(监督学习)的区别在于,Supervised Learning 是给定一个 ground truth(真实标签)然后让模型看见某个输入就输出 ground truth。而 RL 其实并没有真正意义上的 ground truth,他只是通过 Reward 来批判某个 action 的好坏,并鼓励模型做好的动作,不做坏的动作!
3. Policy Gradient Policy Gradient 是一个直观的方法,首先让 model 玩游戏,并获取 Trajectory(轨迹)。下图中的 s 代表游戏画面,a 代表 model 做出的 action,也就是看到 s1 做出动作 a1,画面变为 s2 做出 a2…
Policy Gradient 要做的是给每个 action 打个分,然后鼓励模型做高分动作。一种简单的做法是,当前动作的得分与之后的所有得分加起来作为该动作的评分。(注:之所以不能以单个动作产生的 reward 作为当前动作的打分是因为一个动作的好坏需要整体评估,以 FC 游戏 Space Invaders 为例,该游戏只有开火才能得分,学出来的 model 只会无脑开火!!!)
请注意这里的 L 与一般 Supervised Learning 中 Loss 的区别。一般 Supervised Learning 中的 Loss 是一个'标准答案',是模型预测与人类标注出来的 ground-truth 的差距,最小化 loss 的意思是,你就是得全部照着做!
而这里的 L 是一个'批判',是评价之前 model 玩游戏的 Trajectory 中每个动作的好坏,最小化 L 其实是一个'反思、改进'的过程。好的就要照做,坏的就要避免!
其实 Policy Gradient 折腾的就是这个打分 A,我们可以简略看下其他版本:
引入 baseline (这里的 BaseLine 可以看作一个'平均的分数',也就是模型要做的比平均好才值得鼓励!所谓的 critic 就是用来算这个 baseline,但也并不是 baseline 都要通过 critic 来算,R1 的 GRPO 就没有那个 critic):
总结一下 Policy Gradient 的一般步骤如下,需要特别注意的是,收集资料时的 action 不是 model 预测什么就做什么,而是从 model 预测的结果中 sample(采样)一个,原因在于必须要尝试各种动作才能知道每个动作的好坏,model 说啥就是啥会错过 model 没说但是效果不错的 action!
这里需要特别注意的是,我们每次收集数据都是基于参数为θ的 model 进行!当我们参数更新后就必须重新收集资料!!
4. Policy Gradient 的推导 首先使用参数θ的 model 玩游戏获取 Trajectory τ的概率为:
现在计算得分的期望,我们的目标就是最大化下面的期望:
期望意味着采样,这里需要注意的是,第一,这里其实收集了 N 次玩游戏的资料(N 个τ),上标表示的是第几个τ,下表表示的某个τ中的某一个步骤。第二,我们求导求的是 model 参数θ的导,R(τ) 与θ无关!P_θ(τ) 中与θ相关的也只有一项。第三,蓝色框中的公式其实就是带一下链式法则:
现在这个问题就和分类问题差不了(想想 cross entropy 长啥样子):
请注意,这里的所有推导是基于参数为θ的 model 进行,一旦θ变了,P_θ(τ) 的概率也就变了,所以更新参数后必须重新收集资料,不然就存在'版本不匹配'的问题。
5. PPO 一般而言 LLM 训练的第三个阶段是 RLHF,其中的算法就是 PPO。
PPO 要解决的问题是每次更新网络都需要重新收集一次资料,它允许用一个θ收集资料后训练多次,其核心也很直觉就是收集资料的 model 和被训练的 model 不能差太远,所以会在 Loss 中加一个 KL divergence(KL 散度)。
首先我们引入 Importance Sampling(重要性采样)的概念,Importance Sampling 允许我们从一个分布采样然后计算另一个分布的期望,具体做法也不难,就是乘一个分布再把他除掉:
一个显而易见的例子如下图,我们用绿色的分布去算蓝色分布再红线上的期望,显然蓝线期望是负的!但是如果从绿线采样,大概率采出来的数据都是正的,期望也是正的,只有采的足够多,好不容易采到个负数,才能把期望拉回负的(因为 p 很小所以 p/q 很大所以可以把正的期望拉回去)。
虽然可以拉回去!但是这意味着采样需要足够多!如果做不了那么多采样咋办?那就只能让 p、q 不要差太远!
在 RL 中,每次更新参数都重新收集数据的方式叫 On-policy,不需要每次都重新收集数据叫 Off-policy,从 On-policy 到 Off-policy 的过程为:
其中的 clip 意思为 clip(f(x), min, max),如果 f(x) 大于 max 就返回 max,如果 f(x) 小于 min 就返回 min,如果 f(x) 在 min 和 max 之间就返回 f(x)。
clip 版的 PPO 会给新旧 P_θ一个界限,当新旧 P_θ的界限超过一定程度后,梯度就会变为 0。以 A>0 来看,A>0 时整个项为正数,于是 clip 就是左边的红线,优化 P_θ希望 P_θ(a|s) 越大越好,但是大到超过界限,前面的 min 就会返回 clip 项,求导梯度为 0。
6. Actor-Critic 所谓的 Critic 其实也是一个模型,他的作用是评价一个 Actor 能拿到多少分,请注意 Critic 是 Actor 相关的!以玩游戏为例,Critic 评价的是某个 Actor 玩下去能得多少分,比如这个模型是个垃圾模型,那么 Critic 给的评价应该是 0 分。
训练 Critic 常见的方法有 2 种,第一种是 Monte-Carlo (MC) based approach,操作其实很简单,就是把游戏玩完计算得分,再用这个得分训练网络。
第二种是 Temporal-difference (TD) approach,TD 不需要把游戏玩到底,取而代之通过 V(s_t) 与 V(s_t+1) 的关系来估计两个训练 V。
Critic 预测的其实是看到当前状态 s,Actor 得分的期望。
有了 Critic 我们就可以给出 Policy Gradient 的另外两个版本,首先是用 G 减去 V,也就是把 V 作为 baseline,这也的好处在于,G-V 可以衡量一个动作究竟是好于平均还是差于平均。
Version 3.5 的问题在于,G 是一个 sample 出来的结果(收集资料时玩出来的结果),但是 V(s) 算的是一个平均值,G-V 用 sample 减平均似乎有些违和。所以我们引出 Version 4。采取 action a_t 获得 s_t+1,现在总的分数为 r_t + V(s_t+1) 减去不采取 a_t 的总分 V(s),这个差的结果就可以衡量 a_t 的好坏。
7. Generalized Advantage Estimation Policy Gradient 本质是告诉模型哪个 action 好哪个 action 坏,version 3.5 和 version 4 本质上都在对比一个 Action 是否比平均更好还是更差,对比下 3.5 和 4。
3.5 直接用 G-V,虽然 G 是个真的玩出来的结果,但是 G 存在很大的不确定性(高方差)。4 直接用了 V(s_t) 和 V(s_t+1),这也做虽然不会有不确定性,但是和真实的结果却可能有很大差距(高偏差),折中的办法就是 GAE。
首先引入 TD-k,这玩意的意思很明确,按照真实的情况走 k 步后再用 V 去估计,加起来就是最后得分,很明显这玩意就是 3.5 和 4 的折中:
现在使用 TD-k 去做 advantage estimate(优势估计),顾名思义一个 action 产生的优势的估计。
现在对上面的 advantage estimate 做一个指数加权平均:
在λ=0 时其实 GAE 就是 Version 4,λ=1 时就是 version 3.5:
现在我们可以用 GAE 定义 Policy Gradient 的优化目标:
8. RLHF 的 PPO RLHF 的目的是让模型输出符合人类喜好的答案,具体做法如下,首先训练一个 reward model 给模型的输出打分,然后用 reward model 的打分去做 RL,鼓励模型输出高分答案!
《Training language models to follow instructions》给出的 objective 其实有一定误导性,事实上在写这篇文章之前我都没注意到其中的细节。
我们先说 reward model 的训练,首先把 LLM 的 unembedding layer 去掉,对同一个问题生成 K 个答案,然后让人类答案排序,Reward model 的 loss 如下:
假设 w 的排序高于 l 的排序则 r(w) - r(l) 大于 0,sigmoid(r(w) - r(l)) 就接近 1,log( sigmoid(r(w) - r(l)) ) 就接近 0,所以整个 loss 做的事就是让排序高的回答得高分!
仔细看一下这个 PPO 会发现有点不对劲,既然是 PPO 那最起码的 p/q 呢?其实我们可以从《Secrets of RLHF in Large Language Models Part I: PPO》看一下 PPO 的实现,事实上 RLHF 需要跑 4 个模型,policy(被训练的模型)、Value model、reference model(SFT 后的模型)和 reward model,前两个参数固定:
整个步骤其实很清晰,就是标准的 actor-critic:
另一个问题是,Reward model 是对整个答案给一个评分,怎么计算每一个 action(这里就是生成一个 token)的 reward。
答案是引入 KL 项,Reward model 给的 Reward 是针对整个答案的,也就是只有最后一个 token 有 reward 其他地方都是 0。其他 token 通过 KL 项计算 reward,也就是说不要和 SFT model 差太远!!!!直观说毕竟 SFT 是好不容易训练出来的,如果差太远,除非是最后的结果能拿高分,否则答案肯定离谱。
顺便还可以看看论文《DeepSeekMath: Pushing the Limits of Mathematical》的说法:
8.5 插曲 回顾一下 Policy Gradient 其优化目标为:
从 version 3.5 到 Generalized Advantage Estimation,不管中间怎么折腾,其本质只在做一件事'评估做一个特定的动作比平均好多少',也就是所谓的 advantage function(优势函数):
顺带一提其实 A 还可以写为下面的式子,其中的 Q 是做了特定动作后的最终得分期望,摆弄这个 Q 的强化学习就是 Q-learning:
9. Group Relative Policy Optimization 回到 GRPO!Policy Gradient 要的是比平均好多少,GRPO 的思路很直接,干掉 Critic model,你不是要平均么?我就直接生成多个{o1,o2,…,oG}给你算一个平均!至于每个 token 的好坏全部设为一样的 A,反正结果好那就是好的!
对于直接跳到这部分的朋友,我们也可以直观看一下,那个 clip 就是做截断用的,就看第一项,首先我们要管的 model 只有π_θ,π_θold 完全可以当常数处理。A 是当前答案的打分做一个标准化,如果 A 是正的就代表 action 不错,为了让目标函数最大 π_θ(o|q) 自然越大越好(鼓励模型这么做),反之 A 是负的π_θ(o|q) 就必须减少才能使目标函数变大(阻止模型这样做)。
另外 GRPO 的 reward 是直接怼上去,而不是 PPO 中加载 token reward 的形式。再放一遍 GRPO 的图片:
10. DeepSeek R1-Zero 终于说到正题了,R1-Zero 基于一个没有进行过任何 SFT 的 base model 进行 RL,其做法也很简单,首先用 prompt 规定其输出格式:
然后给的评分的规则,就 2 条,1 答案对,2 格式对!
然后 GRPO 开搞,请注意上面的 GRPO 来自于 DeepSeek Math 的论文,这里是 R1 的论文,请注意他们细微的区别!
结束了,没有 PRM 没有 MCTS,就是靠答案是否正确一竿子捅到底!效果很好!另外还有一个有意思的现象就是所谓的 Aha Moment。
关于为啥用简单的 rule-based + GRPO 能成功困惑了很久,最终得出一个至少能短期说服自己的结论。
首先错误的推导能做出正确答案的概率还是稍低一些的,关键是错误的推理并不是总能得出正确的答案,只有真正推理正确答案正确才是总是对的。虽然错误的推导可以一次两次算出正确的东西,但是多算几次就会出问题,而真正正确的推导出现错误的概率就要低得多。虽然某次一个错误的推导给了正确的答案模型获得奖励,但是再用类似的推导去解决同一个或其他问题答案出错就会被罚,训练多了那么自然是正确的东西占主导,或许 Aha Moment 也就是那么来的,用了之前被鼓励的错误方式,意识到了所以 Aha 一下。我管以上这一段叫做瞎猜!
报告中提到 R1 的失败尝试,包括 PRM 和 MCTS。PRM 不行的原因有:1 很难明确定义步骤的粒度,2 怎么标注步骤的正确性,人工标注哪怕你舍得花钱扩展性也有限,3 容易遭到 reward hacking。
MCTS 不行的原因有:1 搜索空间实在太大不得不为每个 node 引入限制,但这可能使模型陷入局部最优解,2 Value model 不行。
个人认为 MCTS 并不一定不可行,RStar-Math 就是一个例子。另外我个人最大的疑惑在于,对于需要严格证明的问题,rule-based reward 的 RL 能否获得那么好的泛化性与准确性?我目前的看法是不乐观!那么 AI 的推理到底能做到哪一步,怎么做?Coq、Lean 等能否有所帮助?
11. DeepSeek R1 R1-Zero 存在语言混乱可读性差等问题,所以 DeepSeek 又搞了 R1。R1 的训练过程如下:
冷启动 :使用少量的长 CoT 微调模型作为 RL 的起点。
RL 训练 :使用和 R1-Zero 一样的方式进行 RL,但是引入额外的语言一致性奖励(注,语言一致性奖励会造成一些性能下降)。
Rejection Sampling and Supervised Fine-Tuning :
这里包含 2 部分数据:非推理数据包括写作、问答、self-cognition(自我认知)、翻译等。
通过对 RL checkpoint 进行拒绝采样并过滤获取推理数据(也会并入其他数据 800k 条),请注意这个阶段生成的数据是用来对 DeepSeek-V3-Base 进行微调。
通用的 RL :
这个阶段会对使用上个阶段生成的数据微调后的 DeepSeek-V3-Base 进行 RL,对于推理任务采用 R1-Zero 中的方法。当然还会有人类喜好对齐、无害性等其他工作。
顺便一提使用第三阶段收集的 800k 条数据微调小模型,可以增加其推理能力。最后放一张大佬总结的 R1 图片:
相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online