Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

RL 算法如何在 LLM 上应用

上一节已经把 LLM 放进了 RL 的基本框架里:prompt 和已生成前缀构成状态,下一个 token 是动作,完整回答是一条轨迹,奖励通常在回答结束后给出。本节继续往前走,讨论传统 RL 算法怎样落到 LLM 训练里,尤其是 Policy Gradient、PPO、GRPO、DPO 和 RLHF 之间的关系。

这里有一个关键点:即使是Policy Gradient这类直接优化Policy的算法,也没办法离开State value这个概念.这是因为传统RL框架里,所有的reward最终都会体现在State value里面.也就是说如果没有state value的话,实际上策略是无法学习到后续的reward的.

在 LLM 中,state value 的含义没有传统 RL 那么直观。传统环境里,状态 \(s\) 往往是一个清晰的环境状态;而在 LLM 中,状态是 \((x,y_{<t})\),也就是 prompt 加已经生成的前缀。State的维度过于巨大, RL中的State 定义方法会失去效果. LLM中的 State 和 Reward 不再像是一系列Reward定义的期望,而是直接使用稀疏的Reward Model或者规则奖励对整条轨迹定义Reward.这是和传统RL的一大区别.因此理解 LLM 中的 reward model、value model 和 advantage,是理解 RLHF/PPO 的关键。d

其中一个非常重要的因素是对于大模型来说,State value的定义并不是那么明显.但是如果看刚才PG族算法的推导,会发现即使是直接优化策略,我们也是离不开State value这个事情的.这是因为对于强化学习来说,所有的样本的反馈. Reward最后都体现在State value里面.也就是说如果没有state value的话,实际上策略是无法学习到后续的reward的.所以对于LLM来说,我们需要想办法定义state value.

Q: 简单回顾一下 LLM 中的状态、动作、奖励是什么?

在 LLM 中,一次回答生成可以看成一条 trajectory。给定 prompt \(x\),模型逐 token 生成回答:

对应到 RL 记号:

  • 状态 \(s_t\):prompt 加已生成前缀,\(s_t=(x,y_{<t})\)。
  • 动作 \(a_t\):下一个 token,\(a_t=y_t\)。
  • 策略 \(\pi_\theta(a_t\mid s_t)\):语言模型的 next-token distribution,也就是 \(\pi_\theta(y_t\mid x,y_{<t})\)。
  • 轨迹 \(\tau\):从 prompt 开始到完整回答结束的 token 序列。
  • 奖励 \(R(x,y)\):对完整回答 \(y\) 的评价,可以来自人工偏好、reward model、规则奖励或可验证任务的结果。

因此,LLM 中一条轨迹的概率可以写成:

这和普通 RL 中 trajectory probability 的角色是一样的,只是环境状态被文本前缀替代,动作空间变成了词表。

注意这里,奖励变成了稀疏的,变成了对整条轨迹的奖励.而没有了传统RL中每一步都有reward的设定.这是LLM中的一个重要区别.在LLM中,通常会直接使用reward model或者规则奖励对整条轨迹定义reward,而不是像传统RL那样,把reward定义成每一步的即时reward.这其实对算法产生了非常大的简化

Q: Policy Gradient 如何对应到 LLM?

传统 Policy Gradient 的目标是最大化策略诱导出来的期望回报。写成 trajectory 形式,就是:

其中 \(\tau\) 是策略 \(\pi_\theta\) 采样出来的轨迹,\(G(\tau)\) 是这条轨迹上的 return。Policy Gradient 的核心是:虽然 reward 本身通常不能直接对 \(\theta\) 求导,但 trajectory 的概率依赖 \(\theta\),所以可以通过 log-probability trick 更新策略。

在 LLM 中,prompt \(x\) 可以看成初始条件,完整回答 \(y=(y_1,\ldots,y_T)\) 可以看成 trajectory。语言模型策略是:

整段回答的概率为:

于是 LLM 的优化目标可以写成:

这里 \(R(x,y)\) 是完整回答级别的奖励。它可以来自人工规则、可验证任务的结果,也可以来自 reward model:

其中 \(r_\phi\) 是由偏好数据训练出来的奖励模型。在 RLHF 的 PPO 阶段,\(r_\phi\) 通常会被冻结;它负责给当前模型生成的回答打分,但它本身不是正在更新的 policy。

更常见的 RLHF 目标还会加入 KL penalty,防止当前模型偏离参考模型太远:

这和传统 RL 的一个差异是:在很多传统环境里,reward 是环境交互的一部分;而在 LLM 的 RLHF 中,reward 往往是一个额外训练出来的模型或规则函数,对完整回答进行打分。它和 policy model \(\pi_\theta\) 通常是分开的。

这是大模型的最大的一个特点.强化传统的强化学习中,value function跟策略某种意义上是强耦合的.所以说我们一般用两个网络.或者假设action value跟策略的参数\( \theta \)并不相关.以避免求梯度时候复杂的求导问题.但是两者依然是相当耦合的.即我们还需要专门的用各种各样的算法,策略导出的轨迹中的一系列reward去估计value.这导致两者实际上还是耦合在一起的.

但是大模型中对这个进一步进行了简化.它的Reward一般是针对整个序列的.即之前文章中提到过的稀疏reward.并且这个reward可能是通过规则或者是一个reward model计算出来的.所以它确实与模型参数的,或者说策略本身完全的解耦了.

根据整段回答的 log probability:

接下来说明为什么会得到 Policy Gradient 公式。先把目标的期望展开。为了简化记号,先固定一个 prompt \(x\):

对 \(\theta\) 求梯度:

使用 log-derivative trick:

于是:

也就是:

再把 prompt \(x\sim\mathcal{D}\) 的采样也放回期望里:

最后利用自回归分解:

就得到最朴素的 LLM Policy Gradient:

如果使用 advantage,则写成:

这就是传统 Policy Gradient 到 LLM 的连接点:状态变成 prompt 加已生成前缀,动作变成下一个 token,轨迹变成完整回答,reward 来自 reward model、规则奖励或可验证结果,而 advantage 则需要额外估计。

Q: LLM 中的 advantage 怎么来?需要训练 value model 吗?

在传统 actor-critic 中,advantage 衡量的是“这个动作比当前状态下的平均水平好多少”:

在 LLM 中,状态是 \(s_t=(x,y_{<t})\),动作是 \(a_t=y_t\)。因此 token-level advantage 可以理解为:在当前 prompt 和前缀下,选择 token \(y_t\) 之后,最终回答质量比这个前缀下的平均水平好多少。

如果使用 PPO,通常需要一个 value model,也常叫 value head 或 critic。它输入当前前缀状态,输出这个前缀未来能够得到的期望 return:

这里 \(\psi\) 是 value model 的参数,\(G_t\) 是从第 \(t\) 步开始的 return。在 RLHF 中,reward 往往集中在序列末尾,例如 reward model 对完整回答给出 \(r_\phi(x,y)\)。如果再加上 token-level KL penalty,那么可以把每一步的 reward 写成近似的 shaped reward:

并在最后一步加上 reward model 的分数:

于是从第 \(t\) 步开始的 return 可以写成:

value model 的训练就像一个回归问题:让 \(V_\psi(x,y_{<t})\) 预测采样得到的 return 或 GAE target:

有了 value model 之后,最简单的 advantage 估计可以写成:

PPO 实践中常用 GAE 来估计 advantage。它先定义 TD error:

再把多个未来 TD error 做加权和:

所以答案是:如果使用 PPO 这类 actor-critic 方法,通常需要训练一个 value model 来估计 baseline / advantage。在 LLM 中,这个 value model 不是 reward model;reward model 给完整回答打分,value model 则预测“当前前缀未来大概能得到多少总奖励”。

这也是 GRPO 的一个重要动机:它希望避免单独训练 value model,而是对同一个 prompt 采样多个回答,用组内相对奖励直接构造 advantage。

Q: RLHF 到底是一种算法,还是一套流程?

RLHF 是 Reinforcement Learning from Human Feedback,意思是“从人类反馈中进行强化学习”。严格来说,RLHF 不是一个单独算法,而是一套训练流程。

经典 RLHF 通常包含三个阶段。

第一阶段是 SFT,也就是 Supervised Fine-Tuning。给定人工写好的 prompt-response 数据,继续训练预训练模型,让它学会基本的指令跟随格式。

第二阶段是训练 Reward Model。对于同一个 prompt,标注者比较两个或多个回答,指出哪个更好。然后用这些偏好数据训练一个奖励模型 \(r_\phi(x,y)\),让它能够给回答打分。

第三阶段是 RL Optimization。用当前语言模型生成回答,再用 reward model 打分,然后通过 PPO 等强化学习算法更新语言模型,使它更倾向于生成高奖励回答。

所以,RLHF 的结构可以概括为:

Pretrained LM
    ↓
SFT model
    ↓
Reward model from human preference
    ↓
RL optimization, often PPO
    ↓
Aligned model

在这个流程里,PPO 是第三阶段常用的优化算法;RLHF 是包含数据收集、奖励建模、策略优化在内的整体框架。

因此,问“RLHF 和 PPO 是什么关系”时,一个准确的回答是:

RLHF 是训练范式,PPO 是 RLHF 中常用的 policy optimization 算法。

Q: 为什么 RLHF 通常还要加 KL 惩罚?

如果只最大化 reward model 的分数,模型可能会找到 reward model 的漏洞,生成一些奖励模型喜欢但人类并不真正喜欢的回答。这种现象通常被称为 reward hacking。

此外,SFT 模型已经包含了大量语言能力和基本对齐能力。如果 RL 更新太激进,模型可能偏离原来的语言分布,导致回答质量下降。

因此,RLHF 通常不会只优化:

而是加入一个相对于参考模型 \(\pi_{\text{ref}}\) 的 KL 惩罚:

其中:

  • \(\pi_\theta\) 是当前训练的策略模型。
  • \(\pi_{\text{ref}}\) 是参考模型,通常是 SFT 模型的冻结副本。
  • \(\beta>0\) 控制 KL 惩罚强度。
  • KL 项约束当前模型不要偏离参考模型太远。

在实现中,KL 惩罚经常被写成 token-level 近似:

它的直观含义是:如果当前模型对某些 token 的概率比参考模型高很多,就要付出额外代价。这样可以让模型在追求高奖励的同时,尽量保持语言分布稳定。

Q: LLM 中 PPO 是什么?

PPO 是 Proximal Policy Optimization。它是 RLHF 中最经典的策略优化算法之一。

Policy Gradient 的朴素更新可能会让策略一步变化太大。对于 LLM 来说,这尤其危险:模型参数巨大,输出分布复杂,一次过大的更新可能导致训练不稳定。

PPO 的核心目标是:

允许策略朝着更高奖励的方向更新,但限制新策略不要离旧策略太远。

设:

  • \(\pi_{\theta_{\text{old}}}\) 是采样数据时使用的旧策略。
  • \(\pi_\theta\) 是当前要更新的新策略。
  • \(a_t\) 是旧策略在状态 \(s_t\) 下采样到的动作。

PPO 定义概率比值:

在 LLM 中,这个式子对应:

其中:

  • 如果 \(r_t(\theta)>1\),说明新策略提高了这个 token 的概率。
  • 如果 \(r_t(\theta)<1\),说明新策略降低了这个 token 的概率。

朴素 policy gradient 的 surrogate objective 可以写成:

其中 \(\hat{A}_t\) 是 advantage 估计。如果 \(\hat{A}_t>0\),我们希望提高该动作概率;如果 \(\hat{A}_t<0\),我们希望降低该动作概率。

PPO 的 clipped objective 是:

其中:

  • \(\epsilon\) 是裁剪范围,常见值如 0.1 或 0.2。
  • \(\operatorname{clip}(r_t,1-\epsilon,1+\epsilon)\) 会把 ratio 限制在 \([1-\epsilon,1+\epsilon]\) 中。
  • \(\min\) 的作用是让策略更新在“过度乐观”时被截断。

直观地说,PPO 不希望模型因为某个 batch 的 advantage 就把 token 概率改得太猛。它给 policy update 加了一个局部信任域,使训练更加稳定。

在 RLHF 中,一个典型 PPO 训练循环是:

1. 从 prompt dataset 中采样一批 prompts。
2. 用当前策略模型生成回答。
3. 用 reward model 给回答打分。
4. 加入 KL penalty,得到最终 reward。
5. 用 value model 估计 advantage,例如 GAE。
6. 用 PPO clipped objective 更新 policy model。
7. 更新 value model。

这里可以看到,PPO 本身不是奖励模型,也不是人类反馈数据。它只是拿到 reward 和 advantage 之后,负责稳定地更新策略。

Q: LLM 中 GRPO 是什么?

GRPO 是 Group Relative Policy Optimization。它可以看成一种面向大模型训练场景的 policy optimization 方法。相对于 PPO,它的一个重要特点是:不再依赖单独的 value model 来估计每个样本的 baseline,而是用同一个 prompt 下多个回答的组内相对分数来构造 advantage。

设对同一个 prompt \(x\),当前模型采样出 \(G\) 个回答:

每个回答都有一个奖励:

GRPO 的核心想法是:不要单独训练一个 value model 来预测 \(v(s)\),而是在这一组回答内部做相对比较。比如可以定义组内均值:

以及组内标准差:

然后把第 \(i\) 个回答的 advantage 估计为:

其中:

  • \(r^{(i)}\) 是第 \(i\) 个回答的奖励。
  • \(\bar{r}\) 是同组回答的平均奖励。
  • \(\sigma_r\) 是同组奖励的标准差。
  • \(\hat{A}^{(i)}\) 表示第 \(i\) 个回答相对于同组其他回答的好坏。

这样做的直觉很简单:

对同一个问题,如果某个回答比同组其他回答更好,就提高它的概率;如果它比同组平均水平更差,就降低它的概率。

GRPO 仍然可以使用类似 PPO 的 ratio 和 clipping,只是 advantage 的来源变成了 group-relative reward,而不是 value model。

用非常粗略的方式对比:

方法baseline / advantage 来源是否需要 value model
PPOvalue model / GAE通常需要
GRPO同一 prompt 下多回答的组内相对奖励通常不需要

这就是 GRPO 在大模型训练中有吸引力的原因:对于超大模型,额外训练和维护 value model 的成本很高;而组内相对奖励可以用采样换掉一部分 critic 的复杂度。

Q: DPO 是什么?

DPO 是 Direct Preference Optimization。它和 PPO、GRPO 的风格明显不同。

PPO / GRPO 仍然是比较典型的 policy optimization:模型生成回答,奖励函数或奖励模型打分,然后根据 reward / advantage 更新策略。

DPO 则试图绕开显式 reward model 和在线 RL 过程,直接用偏好数据优化语言模型。

偏好数据通常长这样:

其中:

  • \(x\) 是 prompt。
  • \(y_w\) 是 preferred response,也就是人类更喜欢的回答。
  • \(y_l\) 是 rejected response,也就是人类不喜欢的回答。

DPO 的目标是让模型更倾向于 \(y_w\),而不是 \(y_l\)。同时,它也会相对于参考模型 \(\pi_{\text{ref}}\) 做约束,避免模型偏离太远。

常见的 DPO loss 可以写成:

其中:

  • \(\sigma(\cdot)\) 是 sigmoid 函数。
  • \(\beta\) 控制偏好优化强度。
  • \(\pi_\theta\) 是当前训练模型。
  • \(\pi_{\text{ref}}\) 是参考模型,通常是 SFT 模型。
  • \(y_w\) 是 chosen / preferred response。
  • \(y_l\) 是 rejected response。

这个目标的直觉是:

相对于参考模型,如果当前模型更提高 chosen response 的概率,并更降低 rejected response 的概率,那么 loss 就会变小。

DPO 和 RLHF 的关系可以这样理解:DPO 可以从带 KL 约束的 RLHF 目标推导出来,但它把“训练 reward model + 用 PPO 做 RL 优化”这两步合并成了一个直接的偏好分类式目标。

所以 DPO 的优势是训练流程更简单、更像监督学习;但它通常依赖已有的 preference pair 数据,而不是在线探索新回答。

Q: PPO、GRPO、DPO、RLHF 之间是什么关系?

可以把这几个概念放在同一张逻辑图里:

Human preference data
        │
        ├── RLHF route
        │       ├── train reward model
        │       └── optimize policy with PPO / GRPO
        │
        └── Direct preference route
                └── optimize policy with DPO

更具体地说:

方法 / 概念它是什么核心目标
RLHF一套训练流程用人类反馈构造奖励信号,再优化模型
PPOpolicy optimization 算法在限制策略变化幅度的前提下提高奖励
GRPOpolicy optimization 算法用组内相对奖励构造 advantage,减少对 value model 的依赖
DPOpreference optimization 算法直接让模型更偏向 chosen response,而不显式跑 PPO 式 RL

它们之间不是同一层级的概念。RLHF 是流程,PPO / GRPO 是这个流程中可以使用的策略优化算法,DPO 则是另一条从偏好数据直接优化模型的路线。

如果用“目标是什么”来概括:

  • PPO:我有 reward 和 advantage,如何稳定地更新 policy?
  • GRPO:我能不能不用 value model,而用同组回答的相对好坏来更新 policy?
  • DPO:我能不能不用显式 reward model 和在线 RL,直接从偏好对中优化 policy?
  • RLHF:我如何把人类反馈转化成可以训练语言模型的信号?

Q: 这一节应该记住什么?

第一,LLM 天然就是一个 policy。它在每一步根据当前上下文输出下一个 token 的概率分布:

第二,LLM 的一次回答生成可以看成一个 episode。状态是 prompt 加已生成前缀,动作是下一个 token,轨迹是完整回答,奖励通常来自完整回答级别的偏好评价。

第三,LLM 场景更自然地走 policy-based 路线,而不是 value-based 路线。原因是状态和动作空间巨大,奖励又常常是 sequence-level 的;而预训练模型本身已经提供了一个强大的参数化策略。

第四,Policy Gradient 是理解 PPO、GRPO、RLHF 的入口。它的核心公式是:

第五,advantage 是为了判断“这个动作是否比当前状态下的平均选择更好”。GAE 是 advantage 的一种常见估计方法,通常服务于 PPO 这类 actor-critic 方法。

第六,RLHF、PPO、GRPO、DPO 不是同一层级的概念。RLHF 是训练流程,PPO 和 GRPO 是策略优化方法,DPO 是直接偏好优化方法。