大语言模型时代的强化学习 (一):基础理论与算法解析
1. 前言:从 InstructGPT 到 DeepSeek 的演进
自 2022 年 OpenAI 发布 InstructGPT 以来,监督微调(SFT)结合 人类反馈强化学习 (RLHF) 正式开启了大语言模型的
虽然早期的强化学习(RL)算法主要继承自 PPO (Proximal Policy Optimization),但随着技术的发展,特别是在 2025 年初,DeepSeek 通过引入 可验证强化学习 (Reinforcement Learning from Verifiable Reward, RLVR),利用简洁的算法激发了模型深度思考的能力,引发了新一轮的技术变革。
为什么强化学习如此重要?
与监督训练(仅拟合给定的文本序列)不同,强化学习直接针对一个抽象的目标(Reward)进行优化。这种差异使得 RL 能够探索出监督数据中不存在的解法,赋予了模型无限的想象空间。
本文将从最基础的理论出发,重新梳理大模型时代的 RL 算法脉络,解析从 PPO 到 GRPO 再到 GSPO 的演变逻辑。
2. 强化学习的数学本质:最大化奖励
2.1 定义目标
强化学习的核心目标非常简单:最大化一个特定的奖励函数 (Reward Function)。
在大语言模型(LLM)的语境下,我们定义:
- 输入:x (Prompt/
提示词) - 输出:y (Response/
回答序列) - 奖励:R(x, y) (对回答质量的打分)
语言模型本身是一个策略网络 πθ,在自回归模式下,生成一个完整序列 y 的概率是每一步生成 token 概率的乘积:
2.2 如何优化?(REINFORCE 算法推导)
为了最大化公式 (2),我们需要计算它对参数 θ 的梯度。这里使用了一个关键技巧:对数导数技巧 (Log Derivative Trick),即 ∇π = π ⋅ ∇log π。
推导过程如下:
- 将期望展开为积分形式。
- 利用 ∇πθ = πθ∇log πθ 进行替换。
- 将积分重新写回期望形式。
公式 (3) 即为经典的 REINFORCE 算法的核心。它告诉我们:只要让模型根据当前的奖励值,沿着对数概率的梯度方向更新,就能最大化目标函数。
3. 统计学挑战:偏差与方差
虽然公式 (3) 给出了梯度的计算方法,但它是基于
3.1 无偏估计 (Unbiased Estimation)
根据大数定律,只要样本量 N 足够大,采样平均值就会收敛到真实期望值:
3.2 方差困境 (Variance Issue)
然而,现实中 N 是有限的。根据中心极限定理,估计值的波动(方差)与样本数量成反比,但也取决于估计量本身的方差:
4. 优势估计:降低方差的关键
为了降低方差,引入了 优势函数 (Advantage Function) 的概念。
我们可以利用全方差公式证明,如果在奖励函数中减去一个仅依赖于输入 x 的基准值(Baseline),不会改变梯度的期望(即保持无偏),但能显著降低方差。
全方差公式(Law of Total Variance),也称为方差分解公式,是一个概率论中的定理。它描述了一个随机变量的总方差如何被分解为两个部分:条件方差的期望和条件期望的方差。
在您提供的文档《大语言模型时代的强化学习 - 1 - 基础理论》中,这个公式被用来解释为什么引入
“优势函数”(Advantage Function)可以降低训练的不稳定性(方差)。
- 数学定义
假设有两个随机变量 X 和 Y,全方差公式表达为:
这个公式将 Y 的总波动(方差)拆解成了两来源: 组 内 方 差 的 均 值 组 间 均 值 的 方 差
- 第一项(组内):X 固定时,Y 自身的波动。
- 第二项(组间):X 变化时,Y 的平均水平发生的变化。
- 直观理解(通俗例子)
为了理解这个公式,我们可以举一个
“学生身高” 的例子: 假设我们要统计全校学生的身高方差(总方差 Var(Y)),我们可以把学生按年级(X)分组。
第一项 𝔼[Var(Y|X)](组内差异):
先看每个年级内部,学生身高也是参差不齐的。我们计算每个年级的方差,然后取平均值。这代表了同一年级内的身高波动。
第二项 Var(𝔼[Y|X])(组间差异):
每个年级的平均身高是不同的(一年级平均 1.2
米,六年级平均 1.6 米)。这代表了不同年级之间平均身高的波动。 全方差公式告诉我们:全校学生身高的总差异 = (各年级内部的差异)+(年级与年级之间的差异)。
- 为什么 RL 需要它?
在文档中,全方差公式被用来分析强化学习训练中的梯度估计方差。
- X (输入):代表题目或提示词 x(从数据集 𝒟 中采样)。
- Y (输出):代表模型生成的回答 y 及其对应的奖励 R。
文中列出了如下推导:
这两个部分的含义: 总 目 标 模 型 采 样 的 随 机 性 题 目 难 度 的 随 机 性
第一部分(模型随机性):
对于同一个问题 x,模型每次生成的回答 y 不同,导致奖励 R 忽高忽低。这是我们想要优化的部分(希望能稳定生成好答案)。
第二部分(题目随机性):
不同问题 x 的平均得分天生不同。
- 简单题(如 1 + 1)的平均分可能很高(比如接近 1.0)。
- 难题(如奥数题)的平均分可能很低(比如接近 0.1)。
- 这种由题目难度不同引起的奖励波动,对于评价模型好坏其实是
“噪音”,它会增加梯度的方差,阻碍训练。 解决方案:优势估计 (Advantage Estimation)
文档指出,为了降低方差,我们需要消除第二项。
做法是引入基准线(Baseline),即减去该题目的平均期望 𝔼[R]。
优势 A(x, y) = R(x, y) − 𝔼[R(x, y)] 通过这个操作,不同题目的平均得分都被拉平到了 0 附近。根据全方差公式,第二项(组间方差)就变成了 0。这样总方差就减小了,训练过程也就更加稳定。
4.1 优势函数的定义
我们将
4.2 GRPO 中的实现
在 PPO 时代,我们需要训练一个额外的 Value Model 来预测期望奖励。而在 DeepSeekMath 提出的 GRPO (Group Relative Policy Optimization) 中,这一过程被极大地简化了。
GRPO 通过对同一个问题 x 采样一组回答 {y1, ..., yG},直接用这组回答的平均值作为基准:
5. 重要性采样:解决 Off-Policy 问题
在大规模模型训练中,为了效率,我们通常在推理引擎(如 vLLM)中采样数据,在训练引擎(如 Megatron)中更新参数。这导致了两个问题:
- 训推差异:两个引擎计算精度不同。
- 策略偏移 (Policy Staleness):参数更新了,但数据还是旧参数生成的。
这意味着我们在使用旧策略 μθold 产生的数据来更新新策略 πθ(Off-policy)。为了修正这种分布差异,必须使用 重要性采样 (Importance Sampling)。
维度 训练引擎 (Training) 推理引擎 (Inference) 核心目标 高吞吐量 (Throughput):单位时间内处理尽可能多的数据样本。 低延迟 (Latency):用户发问后,首字生成要快;整体生成速度要快。 计算过程 前向传播 + 反向传播。需要计算梯度,并更新参数。 仅前向传播。不需要计算梯度,参数是冻结的。 显存占用 极大。除了存模型参数,还要存 “中间激活值”(用于反向传播)和 “优化器状态”(如 Adam 算法需要存参数的动量,显存占用通常是参数的 2-3 倍)。 较小。只需存模型参数和 KV Cache(键值缓存)。 关键技术 3D 并行(数据并行 + 张量并行 + 流水线并行),梯度累积,激活重计算。 KV Cache(避免重复计算),PagedAttention(vLLM 核心,优化显存碎片),Continuous Batching。 精度 通常使用 BF16 / FP32 混合精度,必须保证梯度计算准确,否则模型无法收敛。 常使用 量化技术 (INT8 / FP8)。为了快,可以牺牲一点点精度,把参数压缩变小。 在大模型强化学习(如 DeepSeek-R1 的训练)中,训练是一个循环 (Loop):
- 采样 (Rollout):模型针对几万个 Prompt 生成回答。
- 谁来做? 推理引擎 (vLLM/SGLang)。因为它生成速度快,支持并发高。
- 更新 (Update):根据生成的回答和奖励信号,计算梯度,修改模型参数。
- 谁来做? 训练引擎 (Megatron/FSDP)。因为只有它能算梯度。
由于为了极致性能,我们把模型拆分到了两个不同的引擎里跑:
- 推理引擎为了快,可能用了 INT8 量化,或者用了特殊的 Attention 算子(如 FlashInfer)。
- 训练引擎为了准,用的是 BF16,且 Attention 算子可能不同(如 FlashAttention-2)。
结果就是:同一个模型,同一个输入 Prompt,在推理引擎里输出的结果(概率分布),和在训练引擎里算出来的结果,在数值上会有微小的偏差。
- 在普通对话中,这点偏差无所谓。
- 但在强化学习(PPO/GRPO)中,算法需要计算重要性采样权重 (Importance Sampling Ratio),即
。如果分子分母分别来自两个有偏差的引擎,这个比值就会出现数学上的错误,导致训练不稳定甚至崩溃。 总结
- 推理引擎是用来
“跑” 模型的,追求快(vLLM, SGLang)。 - 训练引擎是用来
“改” 模型的,追求稳和大规模并行(Megatron, FSDP)。 - 在 RL 训练中,我们需要它们紧密配合:一个负责快速试错(生成样本),一个负责总结经验(更新参数)。
5.1 重要性权重 (Importance Ratio)
我们需要给每个样本加一个权重 r(y, x),它是新旧策略概率的比值:
5.2 修正后的目标函数
引入重要性采样后,真实的优化目标变成了:
推导公式
(11) 的核心逻辑是:虽然我们使用旧策略 μθold 进行采样,但我们的目标是优化新策略 πθ 的期望奖励。
- 定义目标函数 (Objective Function)
首先,根据重要性采样的定义,我们将目标函数写为在旧策略分布 μθold 下的期望:
为了方便求导,我们将期望 (Expectation) 展开为 积分 (Integral) 形式(对于离散文本序列则是求和,推导逻辑一致): 注意:这里的积分项中,μθold 作为分母(来自重要性权重)和作为概率密度(来自期望定义)互相抵消了。这揭示了一个重要的数学事实:Off-Policy 的目标函数在积分形式上等价于 On-Policy 的目标函数。 𝒥(θ) = 𝔼x ∼ 𝒟[∫A(x,y)πθ(y|x)dy]
- 计算梯度 (Gradient Calculation)
现在我们对参数 θ 求梯度 ∇θ。
由于 A(x, y) 是基于采样的固定奖励值(或者基准化后的值),它不依赖于当前的 θ;积分区域也不依赖于 θ。因此,梯度符号 ∇θ 可以直接作用于 πθ: ∇θ𝒥(θ) = 𝔼x ∼ 𝒟[∫A(x,y)∇θπθ(y|x)dy] 到这一步,我们得到了梯度的理论形式。但问题是,这个积分无法直接计算,我们需要把它变回可以通过采样(Sampling)估计的期望形式。
- 恢复采样形式 (Importance Sampling Restoration)
我们当前的采样数据 y 是来自于旧策略 μθold 的。为了把上面的积分写成关于 μθold 的期望,我们需要利用数学技巧:同乘同除 μθold。
这就是梯度公式的基础形式。
- 引入对数导数技巧 (Log Derivative Trick)
为了得到更通用的工程实现形式(如 PPO 中使用的形式),我们通常会利用对数导数技巧: ∇θπθ = πθ ⋅ ∇θlog πθ 将此代入上式中的 ∇θπθ:
此时,我们可以分离出重要性权重 r(y, x):
- 最终结果
将所有项组合,我们得到了最终的可计算梯度公式。这也是 PPO 等现代算法的核心梯度形式: ∇θ𝒥(θ) = 𝔼x ∼ 𝒟, y ∼ μθold( ⋅ |x)[r(y,x)⋅A(x,y)⋅∇θlogπθ(y|x)]
- r(y, x):修正了使用旧数据更新新参数带来的分布偏差。
- A(x, y):告诉模型这个回答相对于平均水平是好是坏。
- ∇θlog πθ:告诉参数应该朝哪个方向移动以提高生成该回答的概率。
这个推导保证了即使我们在 Off-Policy(离策略)的条件下训练,更新的方向依然是朝着最大化真实奖励的目标前进的。
6. 从 PPO 到 GRPO:近似算法的演变
6.1 PPO (Proximal Policy Optimization)
PPO 假设每个 token 都有独立的奖励,且通常截断重要性权重以防止过大。简化版目标函数为:
6.2 GRPO (DeepSeek’s Approach)
GRPO 针对序列级奖励(即整个回答只有一个分)进行了调整。DeepSeek 的原始 GRPO 目标函数包含了一个长度归一化项 1/|y|:
7. 理论深究:一阶近似与长度偏差
近期研究指出,GRPO 实质上是真实目标的一种一阶近似。
7.1 一阶展开推导
假设新旧策略差异 δt 很小,我们可以对重要性权重进行泰勒展开:
7.2 对比导数 (Dr.GRPO 的诞生)
让我们对比一下 GRPO 和 理论近似值 的梯度:
这意味着 GRPO 会
Dr.GRPO:为了修正这个问题,只需在 GRPO 中去掉 1/|y| 这一项。
7.3 GSPO (Group Sequence Policy Optimization)
另一种近似思路是使用几何平均数来平滑重要性权重,这被称为 GSPO:
- GRPO: 方差大,但偏差较小(修正后)。
- GSPO: 几何平均平滑了极值,方差更小(训练更稳定),但引入了更大的近似误差(Bias),可能降低性能上限。
8. 结语与工程现状
目前大模型 RL 领域处于理论与工程快速迭代的时期。
- 工程实现的混乱:知名的 RL 框架(如 AReaL)中,代码实现往往与论文公式不一致。例如,AReaL 中的 GRPO 可能已经悄悄去掉了长度归一化项(变成了 Dr.GRPO),而 GSPO 可能额外实现了修正。
- 隐蔽的细节:很多框架只修正了策略偏移(Policy Staleness),却忽略了训推差异(Training-Inference Discrepancy)。
尽管工程实践充满
附录
以下是关于 修正后的 Dr.GRPO 和 Dr.GSPO 的误差与方差公式的详细推导过程。
为了方便推导,我们先定义基础符号:
- 真实重要性权重:
,其中 N = |y|。 - 假设:δt 是每一步的似然比偏差,且数值较小(|δt| ≪ 1)。
- 一阶和:
。 - 二阶交叉项和:Σ2 = ∑1 ≤ i < j ≤ Nδiδj。
- 独立性假设:假设 δt 之间相互独立,且方差为 Var(δt) = σ2。
1. 真实权重的泰勒展开
首先,我们需要知道
2. Dr.GRPO 的推导 (一阶算术近似 g1)
Dr.GRPO 移除了原 GRPO 中的长度归一化项 1/N,其使用的权重近似形式是算术求和。
A. 权重展开
Dr.GRPO 的权重 g1 对应公式 (15) 的一阶展开形式:
B. 误差推导 (Bias)
误差定义为:真实权重 - 近似权重。
C. 方差推导 (Variance)
利用方差的线性性质(假设 δt 独立):
3. Dr.GSPO 的推导 (一阶几何近似 s1)
Dr.GSPO 使用几何平均数,并为了修正一阶近似的量级,乘回了序列长度 N(即 s1 ≈ N ⋅ (r)1/N)。为了与上述 1 + Σ1 的量级进行微扰分析,我们通过 Log-Exp 变换进行展开。
A. 权重展开
Dr.GSPO 的权重 s1 基于几何均值:
B. 误差推导 (Bias)
这精确对应了文档中给出的公式:误差
C. 方差推导 (Variance)
根据几何平均的性质,我们分析 ln (s1) 的方差结构。原文中给出:
具体来说,利用 Delta Method 近似: Var(log (1 + δt)) ≈ (f′(0))2Var(δt) = 12 ⋅ σ2 = σ2 (当 δ ≈ 0) 但在实际采样中,由于 δt 可能较大,Log 函数的压缩作用使得 Var(log (1 + δ)) < Var(δ)。因此: Var(s1) < Nσ2 这解释了为什么原文中称 GSPO 的方差小于 GRPO,即它通过牺牲一定的无偏性(增加误差)换取了更小的方差(更高的训练稳定性)。
总结对比
| 算法 | 近似公式 (展开) | 误差项 (Bias) | 方差项 (Variance) | 特性 |
|---|---|---|---|---|
| Dr.GRPO (g1) | 1 + Σ1 | Σ2 | Nσ2 | 无偏性更好,但方差大,训练可能不稳定。 |
| Dr.GSPO (s1) | < Nσ2 | 稳定性更好 (方差小),但引入了二阶负偏差。 |