近期,在相关工作中观察到不少同行基于 ver1 版本魔改 GRPO,进展看似顺利。然而在一次深度交流后,一个核心问题浮出水面:尽管 RLHF 技术如同 2024 年的 SFT 一样普及,但大家对 GRPO 乃至其思想源头 PPO 的理解可能并不完整。
一种普遍的理解是:让大语言模型(LLM)从当前策略中采样多个输出序列,通过奖励模型(Reward Model)进行打分,然后引导模型向高分序列学习,同时施加某种约束(如 KL 散度)以保持与原始 SFT 模型行为的一致性。
这种认知确实抓住了策略优化(Policy Optimization)的直观外壳——推动智能体朝平均回报更高的方向移动。然而,如果仅以 GRPO 这种“组内择优”的视角去理解 RLHF,容易陷入将整个过程简单视为“临摹高分样本、抛弃低分样本”的误区,从而偏离了 RLHF 的核心优化思想。
事实上,GRPO 对 PPO 进行了极致的压缩和简化,某种程度上甚至背离了强化学习(Reinforcement Learning)的工程化设计原则。已有不少后续工作对此进行了优化与改进。
归根结底,许多实践者虽然在用 GRPO,但脑海里运作的其实是一个模糊的、经验主义版本的 PPO。因此,与其撰写另一篇《GRPO 详解》,不如回归源头,系统地重新梳理一遍 PPO:它因何而生、优化目标是什么、以及为何如此设计。
本文旨在避开繁杂的传统 RL 理论推导,从最朴素的动机出发,帮助你重新理解 PPO。
基础概念
在一个标准的强化学习设定中,通常包含三个基本角色:
- 智能体 (Agent):能够根据当前观察到的状态(State)做出决策(动作)的模型。
- 环境 (Environment):定义了智能体的动作如何影响世界状态的一套规则。
- 奖励 (Reward):环境反馈给智能体,用于评价其某个动作好坏的单步信号。
一个典型的交互流程如下:在时刻 t,智能体观察到环境反馈的状态 s_t,依据自身策略 π_θ 选择动作 a_t 并作用于环境。环境状态因此从 s_t 更新为 s_{t+1},并反馈一个单步奖励 r_t。
如此循环往复,便产生了一条轨迹 (Trajectory):
τ = (s_0, a_0, r_0, s_1, a_1, r_1, ...)
而强化学习的核心任务,就是优化智能体的策略,以最大化整条轨迹的累积奖励。
以 RLHF 为例:
- 初始状态
s_0:用户提供的提示(Prompt)。
- 智能体动作:LLM 根据自身策略(即模型参数权重)预测下一个词(Token)的概率分布。
- 状态转移:新生成的 Token 与之前的 Prompt 拼接,形成新的提示(新的状态)。
- 奖励:可以是对截至当前已生成序列的评分,也可以是对可能生成完整序列的预估评分。
- 此过程迭代进行,直到生成终止符
<eos_token>,一条完整的回答轨迹便生成了。
优化目标
符号定义
首先明确 PPO 中用到的基本符号:
π_θ: 参数为 θ 的策略(即我们的 LLM)。
τ: 一条从初始状态采样得到的完整轨迹。
R(τ) = Σ_{t=0}^{T} γ^t r_t: 轨迹 τ 的折扣累积奖励,γ 为折扣因子。
J(θ) = E_{τ∼π_θ}[R(τ)]: 策略 π_θ 的期望回报,即我们的优化目标。
优化目标推导
我们的终极目标是找到一个最优策略参数 θ*,使得期望回报最大:
θ* = argmax_θ J(θ)
通过策略梯度定理(具体推导可参考相关理论资料),我们可以得到目标函数 J(θ) 关于参数 θ 的梯度近似为:
∇_θ J(θ) ≈ E_{τ∼π_θ} [ Σ_{t=0}^{T} ∇_θ log π_θ(a_t | s_t) * R(τ) ]
这个公式揭示了两个关键点:
- 轨迹中的每一个动作
a_t 都会对策略梯度产生影响。
- 整条轨迹的回报
R(τ) 作为权重,回报越高的轨迹对梯度更新的贡献越大,从而引导策略倾向于产生高回报的轨迹。
然而,我们无法获取真实的期望,只能通过有限次采样来估计。因此,策略梯度在实际中常被估计为:
∇_θ J(θ) ≈ (1/N) Σ_{i=1}^{N} Σ_{t=0}^{T} ∇_θ log π_θ(a_t^i | s_t^i) * R(τ^i)
如果事情止步于此,PPO 或许就不会诞生。这里存在一个明显的问题:奖励 R(τ) 是基于整条轨迹计算的,而第一个结论指出每个动作都会影响梯度。这就好比说“我和马斯克的平均财富是2000亿美元,所以公司股东应该同时听取我们两人的建议”。这种机制缺乏一个合理的参考基准(Baseline),无法有效区分某个动作究竟是显著优于平均水平,还是其实拖了后腿。
引入优势函数与基准
为了解决上述问题,我们引入 Baseline 的概念。Baseline 代表了在某个状态下,所能获得的期望回报的平均水平。而一个动作是否值得被鼓励,则取决于它相对于这个 Baseline 的表现,这个相对值被称为优势函数 (Advantage Function)。
首先,定义动作价值函数 (Action-Value Function) Q_π(s_t, a_t),它表示在状态 s_t 下执行动作 a_t,之后一直遵循策略 π 所能获得的期望回报:
Q_π(s_t, a_t) = E_π [ Σ_{k=t}^{T} γ^{k-t} r_k | s_t, a_t ]
接着,定义状态价值函数 (State-Value Function) V_π(s_t),它表示在状态 s_t 下,遵循策略 π 所能获得的期望回报:
V_π(s_t) = E_{a_t∼π(·|s_t)} [ Q_π(s_t, a_t) ]
那么,优势函数 A_π(s_t, a_t) 就可以自然地定义为:
A_π(s_t, a_t) = Q_π(s_t, a_t) - V_π(s_t)
优势函数 A_π(s_t, a_t) 衡量了在状态 s_t 下采取特定动作 a_t 比遵循策略 π 的平均行为要好(或差)多少。若 A > 0,说明该动作优于平均,应被鼓励;若 A < 0,则应被抑制。
然而,同时学习 Q 和 V 两个价值函数并不容易。我们可以利用时序差分(Temporal Difference)的思想,将 Q_π 用 V_π 和即时奖励近似表示:
Q_π(s_t, a_t) ≈ r_t + γ * V_π(s_{t+1})
此时,优势函数可以重写为:
A_π(s_t, a_t) ≈ r_t + γ * V_π(s_{t+1}) - V_π(s_t)
我们将这个优势函数的估计代入到之前的策略梯度公式中,优化目标就演变为:
∇_θ J(θ) ≈ E_{τ∼π_θ} [ Σ_{t=0}^{T} ∇_θ log π_θ(a_t | s_t) * A_π(s_t, a_t) ]
(注:在 RLHF 等设定中,状态转移通常是确定的,且 V_π 本身由神经网络拟合,隐含了期望概念,因此表达上进行了简化。)
Actor-Critic 架构
至此,PPO 的核心框架——Actor-Critic 架构便清晰了。
- Actor (演员):即我们的智能体,在 RLHF 中就是需要被优化的大语言模型 (LLM)。它负责生成动作(预测下一个Token)。
- Critic (评论家):即用于估计状态价值函数
V_π(s) 的模型。它不直接参与动作选择,而是评估当前状态(或部分生成的序列)的好坏。
回顾公式 ∇_θ J(θ) ≈ ... * A_π(s_t, a_t) 可以发现一个关键事实:Actor 的更新严重依赖于 Critic 对优势函数 A_π(核心是 V_π)估计的准确性。
这引出了一个实践中的“鸡生蛋”困境:
- Actor 依赖 Critic:如果 Critic 对状态价值的估计不准、噪声大或不稳定,那么 Actor 接收到的梯度信号就是错误的,难以进行有效优化。
- Critic 滞后于 Actor:当 Actor 的参数更新后,策略分布发生了变化,但 Critic 仍在用基于旧策略数据学习到的价值函数去评估新策略产生的状态,存在滞后性。
虽然从理论上严格证明其收敛性颇具挑战,但实践表明,在精心设计的训练流程下,Actor 和 Critic 能够通过协同更新最终达到一个平衡的收敛点。这种关系形式上有点像生成对抗网络(GAN)中生成器与判别器的相互博弈,但本质上是为同一目标(最大化回报)而进行的协作优化。
前面已经给出了 Actor 的优化目标(策略梯度)。对于 Critic,其优化目标通常是最小化时序差分误差 (TD Error):
L(φ) = (V_φ(s_t) - (r_t + γ * V_φ(s_{t+1})) )^2
其中 φ 是 Critic 价值网络的参数。这个目标驱使 Critic 学习到的价值估计 V_φ(s) 尽可能接近“基于一步实际奖励和下一状态价值估计”得到的更可靠目标值 r_t + γ * V_φ(s_{t+1})。
工程实践与优化
理解了 Actor-Critic 的核心思想,PPO 的骨架就已经建立了。剩下的主要是工程上的优化与完善,以确保训练稳定高效。
-
广义优势估计 (GAE):
在实际中,我们并不使用 A_π(s_t, a_t) ≈ r_t + γ * V_π(s_{t+1}) - V_π(s_t) 这种一步优势估计,因为它方差可能较大。GAE 是一种利用多步时序差分信息来估计优势函数的方法,能有效权衡偏差和方差,其公式如下:
A_t^{GAE(γ, λ)} = Σ_{l=0}^{∞} (γλ)^l δ_{t+l}
其中 δ_t = r_t + γ * V(s_{t+1}) - V(s_t) 是 TD error。通过调整 λ 参数,可以在蒙特卡洛估计(高方差、低偏差)和一步 TD 估计(低方差、高偏差)之间取得平衡。
-
重要性采样 (Importance Sampling):
在 RLHF 中,让 LLM 为每个 Prompt 完整生成多次响应(即采样多条轨迹)的代价非常高昂。重要性采样允许我们复用旧策略 π_θ_old 采样得到的数据,来估计新策略 π_θ 的优化目标。其核心公式为:
J(θ) ≈ E_{τ∼π_θ_old} [ (π_θ(a_t|s_t) / π_θ_old(a_t|s_t)) * A_t ]
这避免了为每次参数更新都重新采样,极大提升了数据效率。
-
策略更新约束:PPO-CLIP 与 PPO-Penalty
重要性采样依赖于新旧策略分布不能相差太远的假设。但在训练中,策略的更新可能导致 π_θ 与 π_θ_old 差异过大,使得重要性权重 (π_θ/π_θ_old) 失效或产生极大方差,导致训练崩溃。
- PPO-CLIP:通过裁剪(Clip)重要性权重的比例,将其限制在
[1-ε, 1+ε] 的区间内,直接防止单次更新中策略发生剧变。
L^{CLIP}(θ) = E_t [ min( r_t(θ) * A_t, clip(r_t(θ), 1-ε, 1+ε) * A_t ) ]
其中 r_t(θ) = π_θ(a_t|s_t) / π_θ_old(a_t|s_t)。
- PPO-Penalty:在目标函数中增加一个基于 KL 散度的惩罚项,主动约束新旧策略之间的差异。
L^{KLPEN}(θ) = E_t [ r_t(θ) * A_t - β * KL[π_θ_old(·|s_t), π_θ(·|s_t)] ]
其中 β 是自适应调整的惩罚系数。
以上便是 PPO 算法从动机到核心思想,再到关键工程实现的完整解析。理解这些基础,对于深入掌握 强化学习 在 人工智能 尤其是大模型对齐领域的应用至关重要。