强化学习基础(面向 LLM)
RLHF、DPO、GRPO、RLVR……大模型对齐和推理训练的术语全部来自强化学习。很多候选人会背"PPO 有四个模型",但被追问"策略梯度怎么推""为什么要 clip"就卡壳。本文从 MDP 讲到 GRPO,目标是让你有能力推导而不只是背诵——这是算法岗和应用岗拉开差距的地方。
一、把 LLM 生成对应到强化学习
强化学习的基本框架是马尔可夫决策过程(MDP),五元组 $(S, A, P, R, \gamma)$:
| RL 概念 | 一般含义 | 在 LLM 中对应 |
|---|---|---|
| 状态 $s_t$ | 环境当前情况 | prompt + 已生成的 token 序列 |
| 动作 $a_t$ | 智能体的选择 | 生成下一个 token(动作空间 = 词表) |
| 策略 $\pi(a|s)$ | 状态到动作的映射 | 语言模型本身(输出的概率分布) |
| 状态转移 $P$ | 环境如何变化 | 确定性:新状态 = 旧序列拼上新 token |
| 奖励 $r_t$ | 环境反馈 | 通常稀疏:整条回答结束后才有一个分数 |
| 回报 $G_t$ | 折扣累积奖励 $\sum \gamma^k r_{t+k}$ | LLM 场景常取 $\gamma=1$ |
两个 LLM 特有的性质,决定了后面所有算法的设计:
- 奖励稀疏且在末尾:奖励模型只对完整回答打分,中间每个 token 没有即时奖励 → 需要价值函数/优势估计把"功劳"分配到每个 token(信用分配问题)。
- 环境转移是确定的:没有随机环境,"探索"完全来自采样的随机性 → 温度、采样策略直接影响 RL 训练效果。
二、两大流派:基于价值 vs 基于策略
| 基于价值(Value-based) | 基于策略(Policy-based) | |
|---|---|---|
| 思路 | 学 $Q(s,a)$,选 Q 最大的动作 | 直接学策略 $\pi_\theta(a|s)$ |
| 代表 | Q-learning、DQN | REINFORCE、PPO |
| 动作空间 | 适合小而离散 | 任意(大离散/连续都行) |
| LLM 适用性 | 差(词表 15 万 + 序列组合爆炸) | 好——LLM 本身就是个策略 |
LLM 的 RL 训练几乎全用策略梯度流派,因为语言模型天然就是一个参数化策略 $\pi_\theta(\text{token} | \text{context})$。
三、策略梯度:从 REINFORCE 到优势函数
策略梯度定理
目标:最大化期望回报 $J(\theta) = \mathbb{E}{\tau \sim \pi\theta}[R(\tau)]$。核心结论(策略梯度定理):
$$\nabla_\theta J(\theta) = \mathbb{E}{\tau \sim \pi\theta}\Big[\sum_t \nabla_\theta \log \pi_\theta(a_t|s_t) \cdot G_t\Big]$$
直观理解:回报高的轨迹,提高其中每个动作的概率;回报低的轨迹,降低概率。$\log \pi$ 的梯度指明"如何调参数能让这个动作更可能",回报 $G_t$ 决定"调多大、往哪个方向"。
这就是 REINFORCE 算法:采样轨迹 → 算回报 → 加权更新对数概率。
问题:方差太大
REINFORCE 的致命缺陷是梯度方差大:回报的绝对值大小会剧烈波动(同一个好动作,在好轨迹里被强化、坏轨迹里被惩罚)。两个标准解法:
1. 减 baseline:给回报减去一个与动作无关的基准 $b(s)$,不改变梯度期望但显著降方差:
$$\nabla_\theta J = \mathbb{E}\big[\nabla_\theta \log \pi_\theta(a|s) \cdot (G_t - b(s_t))\big]$$
最常用的 baseline 是状态价值 $V(s)$,此时权重变成优势函数:
$$A(s_t, a_t) = Q(s_t, a_t) - V(s_t)$$
直观含义:"这个动作比该状态下的平均水平好多少"。比平均好 → 强化;比平均差 → 抑制。绝对回报变相对优势,是理解 PPO/GRPO 的钥匙。
2. Actor-Critic:再训练一个价值网络(Critic)来估计 $V(s)$,与策略网络(Actor)协同更新。实践中用 GAE(广义优势估计)在偏差与方差之间折中地估计优势。
四、PPO:让策略更新不要太猛
动机
策略梯度是**同策略(on-policy)**的:数据必须来自当前策略,更新一步后旧数据就"过期"了,样本效率低。想重复利用一批数据多更新几步,就要用重要性采样修正:
$$r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)}$$
但 $r_t$ 偏离 1 太远时,修正会失真、训练会崩。TRPO 用 KL 约束硬性限制更新幅度(求解复杂),PPO 用 clip 把约束做进目标函数,简单有效:
$$L^{CLIP}(\theta) = \mathbb{E}_t\Big[\min\big(r_t(\theta) A_t,\ \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) A_t\big)\Big]$$
clip 的直观解释:优势为正时,概率比超过 $1+\epsilon$ 就不再有收益(防止过度强化);优势为负时,概率比低于 $1-\epsilon$ 就不再有收益(防止过度打压)。取 min 保证目标是悲观(保守)估计。
PPO 在 RLHF 中的完整形态
$$r_{total} = r_{RM}(x, y) - \beta \cdot KL\big(\pi_\theta | \pi_{ref}\big)$$
四个模型的角色(详细流程见 RLHF / DPO 对齐):
| 模型 | 角色 | 是否更新 |
|---|---|---|
| Actor(策略模型) | 被训练的 LLM | ✅ |
| Critic(价值模型) | 估计每个 token 位置的价值,算优势 | ✅ |
| Reward Model | 对完整回答打分 | ❄️ 冻结 |
| Reference Model | SFT 模型,算 KL 防偏移 | ❄️ 冻结 |
KL 惩罚的作用:防止策略为了刷高奖励而偏离初始模型太远(reward hacking:输出乱码、重复套话骗过 RM)。
五、GRPO:用"组内对比"干掉 Critic
PPO 的最大工程负担是 Critic——又一个和 Actor 同规模的模型要训练、要占显存,且 token 级价值很难估准。DeepSeek 提出的 GRPO(组相对策略优化) 的思路:
同一个 prompt 采样一组(G 个)回答,用组内相对好坏直接当优势,不再需要价值网络。
$$A_i = \frac{r_i - \text{mean}(r_1,...,r_G)}{\text{std}(r_1,...,r_G)}$$
| PPO | GRPO | |
|---|---|---|
| 优势估计 | Critic + GAE(token 级) | 组内奖励标准化(回答级) |
| 显存 | 4 个模型 | 去掉 Critic,约省 1/4~1/3 |
| 适用场景 | 通用 RLHF | 奖励可靠的场景(数学/代码可验证任务)尤其好用 |
GRPO 本质上是"以采样换估计":多采几条回答,用统计量代替学出来的价值函数。这与数学/代码任务的 RLVR(可验证奖励强化学习) 天然契合——答案对错可以程序判定,奖励无噪声,组内对比就足够准(R1 的训练正是 GRPO + 规则奖励,见 DeepSeek 专题)。
六、高频概念辨析
on-policy vs off-policy:数据是否必须来自当前策略。PPO 名义上 on-policy(用 clip 容忍小幅 off-policy);DQN 是 off-policy。LLM 训练里"旧策略采样、新策略多步更新"的程度越深,越需要重要性修正。
为什么 DPO 不算强化学习? DPO 没有"采样—奖励—更新"的在线循环,它把最优策略与奖励函数的解析关系代入偏好模型,直接在离线偏好数据上做监督学习。优点是简单稳定,缺点是受限于离线数据的分布(无法探索新回答)。
探索与利用(exploration vs exploitation):LLM RL 中探索靠采样温度与多样性。GRPO 一组内如果所有回答都错(或都对),组内优势全为 0,没有学习信号——所以训练时要控制题目难度与采样多样性,这是实践中的真实痛点。
奖励黑客(reward hacking):策略找到奖励函数的漏洞而非真正变好。例:RM 偏好长回答 → 模型疯狂变长;格式奖励设计不当 → 只学格式不学推理。对策:KL 约束、奖励模型迭代、过程奖励与结果奖励结合。
高频追问
Q:策略梯度里为什么是 $\nabla \log \pi$ 而不是 $\nabla \pi$? 来自对数导数技巧:$\nabla_\theta \mathbb{E}{\pi}[R] = \mathbb{E}{\pi}[R \nabla_\theta \log \pi]$。期望对 $\theta$ 求导时,分布本身依赖 $\theta$,用 $\nabla p = p \nabla \log p$ 变换后才能写成"在当前策略下采样估计"的形式——这是整个策略梯度可计算的根基。
Q:减 baseline 为什么不改变梯度的期望? $\mathbb{E}{a \sim \pi}[\nabla \log \pi(a|s) \cdot b(s)] = b(s) \nabla \mathbb{E}{a \sim \pi}[1] = b(s) \cdot \nabla 1 = 0$。只要 baseline 不依赖动作,这一项期望恒为零,只影响方差不影响方向。
Q:PPO 的 clip 和 KL 惩罚是不是重复了? 作用对象不同:clip 限制的是相对于上一轮策略 $\pi_{old}$ 的单步更新幅度(优化稳定性);KL 惩罚约束的是相对于参考模型 $\pi_{ref}$(SFT 模型) 的累计偏移(防止 reward hacking、保持语言质量)。一个管"步子别太大",一个管"别走太远"。
Q:GRPO 组内全对或全错怎么办? 优势全为 0,该 prompt 本轮无梯度贡献。实践对策:动态筛选难度合适的题目(通过率在中间区间)、增大组大小 G、提高采样温度增加多样性。这也是为什么 GRPO 训练对数据难度分布很敏感。
Q:为什么 LLM 的 RL 一般把 $\gamma$ 设为 1? 回答长度有限(几百到几千 token),不存在无限期回报发散问题;且奖励在末尾,折扣会让早期 token 的信用被人为衰减,与"开头的思路决定整条推理质量"的直觉矛盾。
Q:Critic 在 PPO 里到底估计什么?为什么说它难训? 估计每个 token 位置的状态价值 $V(s_t)$ ——"从这里继续生成,期望最终能拿多少奖励"。难点:奖励只有末尾一个标量,要回传到几百个位置;回答质量的评估本身高度非线性。Critic 估不准 → 优势失真 → 训练不稳定,这正是 GRPO 用统计替代它的动机。