找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2117

积分

1

好友

287

主题
发表于 2025-12-25 06:02:24 | 查看: 32| 回复: 0

近期,在相关工作中观察到不少同行基于 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(τ) ]

这个公式揭示了两个关键点:

  1. 轨迹中的每一个动作 a_t 都会对策略梯度产生影响。
  2. 整条轨迹的回报 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,则应被抑制。

然而,同时学习 QV 两个价值函数并不容易。我们可以利用时序差分(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_π)估计的准确性

这引出了一个实践中的“鸡生蛋”困境:

  1. Actor 依赖 Critic:如果 Critic 对状态价值的估计不准、噪声大或不稳定,那么 Actor 接收到的梯度信号就是错误的,难以进行有效优化。
  2. 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 的骨架就已经建立了。剩下的主要是工程上的优化与完善,以确保训练稳定高效。

  1. 广义优势估计 (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 估计(低方差、高偏差)之间取得平衡。

  2. 重要性采样 (Importance Sampling)
    在 RLHF 中,让 LLM 为每个 Prompt 完整生成多次响应(即采样多条轨迹)的代价非常高昂。重要性采样允许我们复用旧策略 π_θ_old 采样得到的数据,来估计新策略 π_θ 的优化目标。其核心公式为:
    J(θ) ≈ E_{τ∼π_θ_old} [ (π_θ(a_t|s_t) / π_θ_old(a_t|s_t)) * A_t ]
    这避免了为每次参数更新都重新采样,极大提升了数据效率。

  3. 策略更新约束: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 算法从动机到核心思想,再到关键工程实现的完整解析。理解这些基础,对于深入掌握 强化学习人工智能 尤其是大模型对齐领域的应用至关重要。




上一篇:PHP 8.5.1安全更新详解:核心漏洞修复与版本升级指南
下一篇:Spring Data Redis set方法误用:字符串前出现\x00空字节的排查与解决
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-10 18:36 , Processed in 0.407748 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表