大语言模型时代的强化学习 (一):基础理论与算法解析

1. 前言:从 InstructGPT 到 DeepSeek 的演进

自 2022 年 OpenAI 发布 InstructGPT 以来,监督微调(SFT)结合 人类反馈强化学习 (RLHF) 正式开启了大语言模型的“后训练”时代。随后 ChatGPT 的成功更是证明了这一路线的巨大潜力。

虽然早期的强化学习(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 π

推导过程如下:

  1. 将期望展开为积分形式。
  2. 利用 πθ = πθ∇log πθ 进行替换。
  3. 将积分重新写回期望形式。

公式 (3) 即为经典的 REINFORCE 算法的核心。它告诉我们:只要让模型根据当前的奖励值,沿着对数概率的梯度方向更新,就能最大化目标函数。


3. 统计学挑战:偏差与方差

虽然公式 (3) 给出了梯度的计算方法,但它是基于“期望”的。在实际训练中,我们无法计算无穷的期望,只能通过采样 (Sampling) 来估计。这就引入了统计学中的两个核心概念:

3.1 无偏估计 (Unbiased Estimation)

根据大数定律,只要样本量 N 足够大,采样平均值就会收敛到真实期望值: 这意味着我们的估计方向在理论上是正确的(无偏的)。

3.2 方差困境 (Variance Issue)

然而,现实中 N 是有限的。根据中心极限定理,估计值的波动(方差)与样本数量成反比,但也取决于估计量本身的方差: 如果强化学习中梯度的方差本来就很大(事实上的确如此),那么即使增加采样数量,训练也会非常不稳定。因此,降低方差是 RL 算法设计的核心难点。hex


4. 优势估计:降低方差的关键

为了降低方差,引入了 优势函数 (Advantage Function) 的概念。

我们可以利用全方差公式证明,如果在奖励函数中减去一个仅依赖于输入 x 的基准值(Baseline),不会改变梯度的期望(即保持无偏),但能显著降低方差。

全方差公式(Law of Total Variance),也称为方差分解公式,是一个概率论中的定理。它描述了一个随机变量的总方差如何被分解为两个部分:条件方差的期望和条件期望的方差。

在您提供的文档《大语言模型时代的强化学习 - 1 - 基础理论》中,这个公式被用来解释为什么引入“优势函数”(Advantage Function)可以降低训练的不稳定性(方差)

  1. 数学定义

假设有两个随机变量 XY,全方差公式表达为: 这个公式将 Y 的总波动(方差)拆解成了两来源:

  1. 第一项(组内)X 固定时,Y 自身的波动。
  2. 第二项(组间)X 变化时,Y 的平均水平发生的变化。

  1. 直观理解(通俗例子)

为了理解这个公式,我们可以举一个“学生身高”的例子:

假设我们要统计全校学生的身高方差(总方差 Var(Y)),我们可以把学生按年级X)分组。

  • 第一项 𝔼[Var(Y|X)](组内差异):

    先看每个年级内部,学生身高也是参差不齐的。我们计算每个年级的方差,然后取平均值。这代表了同一年级内的身高波动。

  • 第二项 Var(𝔼[Y|X])(组间差异):

    每个年级的平均身高是不同的(一年级平均 1.2米,六年级平均 1.6米)。这代表了不同年级之间平均身高的波动。

全方差公式告诉我们:全校学生身高的总差异 = (各年级内部的差异)+(年级与年级之间的差异)。


  1. 为什么 RL 需要它?

在文档中,全方差公式被用来分析强化学习训练中的梯度估计方差

  • X (输入):代表题目或提示词 x(从数据集 𝒟 中采样)。
  • Y (输出):代表模型生成的回答 y 及其对应的奖励 R

文中列出了如下推导: 这两个部分的含义:

  1. 第一部分(模型随机性):

    对于同一个问题 x,模型每次生成的回答 y 不同,导致奖励 R 忽高忽低。这是我们想要优化的部分(希望能稳定生成好答案)。

  2. 第二部分(题目随机性):

    不同问题 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},直接用这组回答的平均值作为基准: 注意:理论推导显示,正确的优势仅需要减去均值。GRPO 公式中额外除以标准差(归一化)虽然是工程惯例,但近期研究表明这可能会引入偏差。


5. 重要性采样:解决 Off-Policy 问题

在大规模模型训练中,为了效率,我们通常在推理引擎(如 vLLM)中采样数据,在训练引擎(如 Megatron)中更新参数。这导致了两个问题:

  1. 训推差异:两个引擎计算精度不同。
  2. 策略偏移 (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)

  1. 采样 (Rollout):模型针对几万个 Prompt 生成回答。
    • 谁来做? 推理引擎 (vLLM/SGLang)。因为它生成速度快,支持并发高。
  2. 更新 (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 修正后的目标函数

引入重要性采样后,真实的优化目标变成了: 其梯度为: 数值稳定性问题:公式 (9) 中是多个概率比值的连乘。对于长思维链(Chain-of-Thought),序列长度可能上千,这会导致 r(y, x) 数值爆炸或消失。因此,必须寻找数学上的近似替代方案。

推导公式(11)的核心逻辑是:虽然我们使用旧策略 μθold 进行采样,但我们的目标是优化新策略 πθ 的期望奖励。

  1. 定义目标函数 (Objective Function)

首先,根据重要性采样的定义,我们将目标函数写为在旧策略分布 μθold 下的期望: 为了方便求导,我们将期望 (Expectation) 展开为 积分 (Integral) 形式(对于离散文本序列则是求和,推导逻辑一致): 注意:这里的积分项中,μθold 作为分母(来自重要性权重)和作为概率密度(来自期望定义)互相抵消了。这揭示了一个重要的数学事实:Off-Policy 的目标函数在积分形式上等价于 On-Policy 的目标函数𝒥(θ) = 𝔼x ∼ 𝒟[∫A(x,y)πθ(y|x)dy]


  1. 计算梯度 (Gradient Calculation)

现在我们对参数 θ 求梯度 θ

由于 A(x, y) 是基于采样的固定奖励值(或者基准化后的值),它不依赖于当前的 θ;积分区域也不依赖于 θ。因此,梯度符号 θ 可以直接作用于 πθθ𝒥(θ) = 𝔼x ∼ 𝒟[∫A(x,y)∇θπθ(y|x)dy] 到这一步,我们得到了梯度的理论形式。但问题是,这个积分无法直接计算,我们需要把它变回可以通过采样(Sampling)估计的期望形式。


  1. 恢复采样形式 (Importance Sampling Restoration)

我们当前的采样数据 y 是来自于旧策略 μθold 的。为了把上面的积分写成关于 μθold 的期望,我们需要利用数学技巧:同乘同除 μθold 这就是梯度公式的基础形式。


  1. 引入对数导数技巧 (Log Derivative Trick)

为了得到更通用的工程实现形式(如 PPO 中使用的形式),我们通常会利用对数导数技巧: θπθ = πθ ⋅ ∇θlog πθ 将此代入上式中的 θπθ 此时,我们可以分离出重要性权重 r(y, x)


  1. 最终结果

将所有项组合,我们得到了最终的可计算梯度公式。这也是 PPO 等现代算法的核心梯度形式: θ𝒥(θ) = 𝔼x ∼ 𝒟, y ∼ μθold( ⋅ |x)[r(y,x)⋅A(x,y)⋅∇θlogπθ(y|x)]

  1. r(y, x):修正了使用旧数据更新新参数带来的分布偏差。
  2. A(x, y):告诉模型这个回答相对于平均水平是好是坏。
  3. θ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| 核心争议:GRPO 的这个公式是真实目标(公式 10)的最佳近似吗?


7. 理论深究:一阶近似与长度偏差

近期研究指出,GRPO 实质上是真实目标的一种一阶近似

7.1 一阶展开推导

假设新旧策略差异 δt 很小,我们可以对重要性权重进行泰勒展开: 将此代入真实目标函数,得到的理论上正确的一阶近似应该是:

7.2 对比导数 (Dr.GRPO 的诞生)

让我们对比一下 GRPO 和 理论近似值 的梯度: 发现问题:GRPO 多除以了一个序列长度 |y|

这意味着 GRPO 会“歧视”长回答。对于同样正确的回答,GRPO 会给予长回答更小的更新力度,甚至导致模型倾向于生成异常短的错误回答。

Dr.GRPO:为了修正这个问题,只需在 GRPO 中去掉 1/|y| 这一项。

7.3 GSPO (Group Sequence Policy Optimization)

另一种近似思路是使用几何平均数来平滑重要性权重,这被称为 GSPO 同样地,几何平均数 1/|y| 次方也隐式包含了长度归一化问题。理论上正确的修正版 Dr.GSPO 应该乘回长度: 总结对比

  • GRPO: 方差大,但偏差较小(修正后)。
  • GSPO: 几何平均平滑了极值,方差更小(训练更稳定),但引入了更大的近似误差(Bias),可能降低性能上限。

8. 结语与工程现状

目前大模型 RL 领域处于理论与工程快速迭代的时期。

  • 工程实现的混乱:知名的 RL 框架(如 AReaL)中,代码实现往往与论文公式不一致。例如,AReaL 中的 GRPO 可能已经悄悄去掉了长度归一化项(变成了 Dr.GRPO),而 GSPO 可能额外实现了修正。
  • 隐蔽的细节:很多框架只修正了策略偏移(Policy Staleness),却忽略了训推差异(Training-Inference Discrepancy)。

尽管工程实践充满“魔改”,但在统一的数学框架下理解这些算法(如本文尝试构建的框架),能帮助我们看清本质,在稳定性(方差)和性能上限(偏差)之间做出正确的取舍。


附录

以下是关于 修正后的 Dr.GRPODr.GSPO 的误差与方差公式的详细推导过程。

为了方便推导,我们先定义基础符号:

  • 真实重要性权重,其中 N = |y|
  • 假设δt 是每一步的似然比偏差,且数值较小(|δt| ≪ 1)。
  • 一阶和
  • 二阶交叉项和Σ2 = ∑1 ≤ i < j ≤ Nδiδj
  • 独立性假设:假设 δt 之间相互独立,且方差为 Var(δt) = σ2

1. 真实权重的泰勒展开

首先,我们需要知道“标准答案”是什么。对真实权重 r 进行泰勒展开(保留到二阶项): 这就是我们在计算误差时对比的基准目标 (True Target)


2. Dr.GRPO 的推导 (一阶算术近似 g1)

Dr.GRPO 移除了原 GRPO 中的长度归一化项 1/N,其使用的权重近似形式是算术求和。

A. 权重展开

Dr.GRPO 的权重 g1 对应公式 (15) 的一阶展开形式:

B. 误差推导 (Bias)

误差定义为:真实权重 - 近似权重。 这解释了原文中提到的 Dr.GRPO 的误差约为 Σ2

C. 方差推导 (Variance)

利用方差的线性性质(假设 δt 独立): 这解释了原文中 Var(g1) = Nσ2 的来源。


3. Dr.GSPO 的推导 (一阶几何近似 s1)

Dr.GSPO 使用几何平均数,并为了修正一阶近似的量级,乘回了序列长度 N(即 s1 ≈ N ⋅ (r)1/N)。为了与上述 1 + Σ1 的量级进行微扰分析,我们通过 Log-Exp 变换进行展开。

A. 权重展开

Dr.GSPO 的权重 s1 基于几何均值: 取对数进行泰勒展开(利用 ): 再通过指数还原(利用 ex ≈ 1 + x): 两边同乘 N(注:此处为了与 g1 和真实值 r 进行微扰项对比,常数项 N1 在梯度计算中通常被视为基准值对齐,我们重点关注变化项 Σ 的结构差异):

B. 误差推导 (Bias)

这精确对应了文档中给出的公式:误差 。这表明 GSPO 相比 GRPO 引入了额外的误差项(负的二阶项,导致权重偏小)。

C. 方差推导 (Variance)

根据几何平均的性质,我们分析 ln (s1) 的方差结构。原文中给出: 由于 log (1 + δt) 的增长率低于线性 δt(因为 log  函数是凹函数,斜率  < 1 对于 δ > 0),这就起到了平滑极值的作用。

具体来说,利用 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 稳定性更好 (方差小),但引入了二阶负偏差。

大语言模型时代的强化学习 (一):基础理论与算法解析
https://striver98.github.io/2025/12/27/大语言模型时代的强化学习 (一):基础理论与算法解析/
作者
Wang Zhixuan
发布于
20251227
许可协议