从策略梯度到 PPO/GRPO/DPO,公式逐项拆解 + 直觉理解
RL 论文中符号混乱且不统一,这里做一份权威参照表。后续所有公式均基于此处定义。
| 符号 | 读法 | 含义 | 举例 |
|---|---|---|---|
| $s$ 或 $s_t$ | state | 时刻 $t$ 的状态 | 棋盘局面 / 已生成的 token 序列 |
| $a$ 或 $a_t$ | action | 时刻 $t$ 的动作 | 落子位置 / 生成下一个 token |
| $r_t$ | reward | 时刻 $t$ 的即时奖励(标量) | 这一步得 +1 分 |
| $\gamma$ | gamma | 折扣因子 $\in[0,1)$ | 0.99 = 很看重未来 |
| $\tau$ | trajectory | 一条完整轨迹 | $(s_0,a_0,r_0,s_1,a_1,r_1,\ldots)$ |
| $T$ | terminal | 轨迹终止时刻 | 一局游戏结束 |
| 符号 | 含义 | 公式 | 直觉 |
|---|---|---|---|
| $G_t$ | 从 $t$ 开始的累积折扣回报 | $G_t = \sum_{k=0}^{T-t-1}\gamma^k r_{t+k}$ | "从现在起,未来总共能拿多少分" |
| $R(\tau)$ | 整条轨迹的总回报 | $\sum_{t=0}^{T-1}r_t$ 或 $G_0$ | "这一局的总成绩" |
| 符号 | 名称 | 公式 | 直觉 |
|---|---|---|---|
| $V^\pi(s)$ | 状态价值函数 | $\mathbb{E}_\pi[G_t|s_t=s]$ | "在状态 $s$,按策略 $\pi$ 走,平均能拿多少总分" |
| $Q^\pi(s,a)$ | 动作价值函数 | $\mathbb{E}_\pi[G_t|s_t=s,a_t=a]$ | "在 $s$ 做了 $a$,之后按 $\pi$ 走,平均总分" |
| $A^\pi(s,a)$ | 优势函数 (Advantage) | $Q(s,a) - V(s)$ | "动作 $a$ 比该状态的平均水平好多少" |
| 符号 | 含义 | 直觉 |
|---|---|---|
| $\pi$ | 策略(给定状态 → 输出动作的规则) | agent 的"大脑" |
| $\pi_\theta(a|s)$ | 参数 $\theta$ 的策略在状态 $s$ 选动作 $a$ 的概率 | 神经网络的 softmax 输出 |
| $\theta$ | 策略网络的参数(权重) | 我们要优化的变量 |
| $J(\theta)$ | 目标函数 = 策略的期望总回报 | $\mathbb{E}[R(\tau)]$,越大越好 |
| $\nabla_\theta$ | 对 $\theta$ 求梯度 | 参数应往哪个方向调 |
| 符号 | 含义 | 直觉 |
|---|---|---|
| $\pi_{\theta_{old}}$ | 旧策略(采数据时的版本) | "上一版模型" |
| $r_t(\theta)$ | 概率比 $= \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)}$ | "新策略对这个动作的喜好变化倍数" |
| $\epsilon$ | clip 范围(0.1~0.2) | "允许新旧策略最多差多远" |
| $\delta_t$ | TD 误差 $= r_t + \gamma V(s_{t+1}) - V(s_t)$ | "实际比预期好/差多少" |
| $\lambda$ | GAE 衰减系数(0.95) | "看多远的未来信息" |
| 符号 | 含义 | 直觉 |
|---|---|---|
| $x$ | prompt(用户输入) | 问题/指令 |
| $y$ | response(模型输出) | 生成的回答 |
| $y_w$ | winning response | 人类偏好的好回答 |
| $y_l$ | losing response | 人类不偏好的差回答 |
| $\pi_{ref}$ | 参考策略(冻结的 SFT 模型) | "锚点"——不能偏太远 |
| $r(x,y)$ | Reward Model 的打分 | 回答质量的数值评估 |
| $\beta$ | KL 约束强度 | 越大越保守,越小越激进 |
| $\sigma(\cdot)$ | sigmoid 函数 | $\frac{1}{1+e^{-z}}$,映射到 (0,1) |
| $D_{KL}$ | KL 散度 | 两个分布的"距离" |
| 符号 | 含义 | 直觉 |
|---|---|---|
| $G$ | group size(组大小,通常 64) | 同一 prompt 采样几条回答 |
| $\{y_1,\ldots,y_G\}$ | 一组回答 | 对同一题的多次作答 |
| $r_i$ | 第 $i$ 个回答的 reward 得分 | RM 或规则给的分数 |
| $\hat{A}_i$ | 第 $i$ 个回答的 advantage | 组内标准化后的相对好坏 |
| 容易混淆 | 如何区分 |
|---|---|
| $r_t$(奖励)vs $r_t(\theta)$(概率比) | 带 $(\theta)$ 是概率比 |
| $R(\tau)$(总回报)vs $r(x,y)$(RM 打分) | 大写 $R$ 是轨迹总和 |
| $G_t$(累积回报)vs $G$(组大小) | $G_t$ 有下标 $t$ |
| $\gamma$(折扣因子)vs $\lambda$(GAE 衰减) | $\gamma$ 属于 MDP,$\lambda$ 属于 GAE |
| $\epsilon$(clip)vs $\epsilon$(探索率) | 看上下文:PPO 是 clip,DQN 是探索 |
| $V(s)$(真值)vs $V_\phi(s)$(Critic 网络) | 带 $\phi$ 是神经网络近似 |
每一步都解决上一步的核心缺陷。面试中讲清这条因果链比背公式更有价值。
整个 RL 要优化的东西——策略的期望总回报:
怎么算 $\nabla_\theta J$?直接求导遇到障碍:$R(\tau)$ 来自环境(黑盒),和 $\theta$ 之间没有显式可微关系。我们不能像监督学习那样直接反向传播。
利用恒等式 $\nabla f = f \cdot \nabla \log f$(来自 $\frac{d}{dx}\log f = \frac{1}{f}\frac{df}{dx}$):
代入 Step 1:
轨迹的概率为:
取 log(乘积变求和):
对 $\theta$ 求梯度,第一项和第三项为零:
Step 4 中每个时间步都乘以整条轨迹的 $R(\tau)$,但 $R(\tau)$ 包含了时刻 $t$ 之前的奖励——这些和 $a_t$ 的选择无关。下面证明可以去掉它们:
拆分 $R(\tau)$:
代入时刻 $t$ 的梯度项:
为什么第一项 = 0?(逐步推导)
先把期望写成显式求和(期望的定义):
$$\mathbb{E}_{a_t \sim \pi}\left[\nabla_\theta\log\pi_\theta(a_t|s_t) \cdot c\right] = \sum_a \pi_\theta(a|s_t) \cdot \nabla_\theta\log\pi_\theta(a|s_t) \cdot c$$用 log-derivative 恒等式 $\nabla_\theta\log\pi = \frac{\nabla_\theta\pi}{\pi}$ 代入,$\pi$ 和分母的 $\pi$ 约分:
$$= \sum_a \pi_\theta \cdot \frac{\nabla_\theta\pi_\theta}{\pi_\theta} \cdot c = \sum_a \nabla_\theta\pi_\theta(a|s_t) \cdot c$$$c$ 是常数,提到求和外面;梯度和求和可交换顺序:
$$= c \cdot \nabla_\theta \underbrace{\sum_a \pi_\theta(a|s_t)}_{= 1 \text{(概率归一化)}} = c \cdot \nabla_\theta\, 1 = c \cdot 0 = 0$$所以只剩下 $\gamma^t G_t$,得到最终公式:
REINFORCE 方差太大。
给 $G_t$ 减去一个只依赖状态的基准值 $b(s_t)$:
直接应用 Step 5 的通用结论:$b(s_t)$ 只依赖状态、不依赖动作 $a_t$,所以 $\mathbb{E}_{a \sim \pi}[\nabla\log\pi \cdot b(s)] = 0$。减去它不改变梯度期望,但让信号有正有负,方差更小。
最佳 Baseline:状态价值函数 $V(s_t)$——理论可证明,$b(s) = V(s)$ 时方差最小。
核心原因:信噪比提升。$\mathbb{E}[A_t | s_t] = \mathbb{E}[G_t | s_t] - V(s_t) = 0$,即 Advantage 的条件期望为零。
假设某状态下,做任何动作回报都在 95~105 之间:
不减 $V$(用 $G_t$):所有动作都获得正向信号 → 所有概率都在增大 → 梯度方向混乱,模型无法区分好坏
减去 $V(s)\approx100$:信号变为 -5 ~ +5 → 好动作正向强化,坏动作负向抑制 → 梯度方向清晰
上面的 $A_t = G_t - V(s_t)$ 叫MC 估计(REINFORCE + Baseline)——$G_t$ 来自真实轨迹,$V(s_t)$ 由一个价值网络 $V_\phi(s)$(Critic)估计。训练方式:$\min_\phi \mathbb{E}[(V_\phi(s_t) - G_t)^2]$(即最小化 MSE,最优解恰好是条件期望)。
所以从"有没有 Critic 网络"这个角度看,Step 2 和 Step 3(Actor-Critic)都有 Critic,核心区别不在于此——而在于 Actor 更新时用什么信号。这会在 Step 3 详细说明。
上面的 $A_t = G_t - V(s_t)$ 其实是下面这个正式定义的采样估计:
$G_t$ 和 $Q(s,a)$ 的关系:
Step 2(REINFORCE + Baseline)需要等整条轨迹跑完才能算 $G_t$,无法在线逐步更新。能不能每走一步就更新?
训练一个神经网络 $V_\phi(s)$(Critic)来近似真实的 $V(s)$。用 TD 残差 $\delta_t = r_t + \gamma V_\phi(s_{t+1}) - V_\phi(s_t)$ 替代 $G_t - V(s_t)$ 作为 Advantage 估计——只需当前奖励和下一状态,无需等轨迹结束:
这是一个基础但重要的数学结论。固定一个状态 $s$,我们要找一个值 $c$(即 $V_\phi(s)$ 应该输出的数),使预测误差最小:
目标:最小化 $\mathbb{E}[(G_t - c)^2 \mid s_t = s]$,求最优的 $c$。
Step 1:展开平方
$$\mathbb{E}[(G_t - c)^2] = \mathbb{E}[G_t^2] - 2c\,\mathbb{E}[G_t] + c^2$$Step 2:这是关于 $c$ 的二次函数($c^2$ 系数为正 → 开口朝上),对 $c$ 求导令其为零:
$$\frac{d}{dc}\mathbb{E}[(G_t - c)^2] = -2\mathbb{E}[G_t] + 2c = 0$$Step 3:解出最优值
$$c^* = \mathbb{E}[G_t \mid s_t = s] = V^\pi(s)$$两个网络同时训练、交替更新,共享同一批交互数据:
策略更新步长过大会崩溃。
不在参数空间限制步长,而在策略分布空间限制——新旧策略的 KL 散度不能超过 $\delta$。
REINFORCE 每次更新后必须扔掉数据重新采样(on-policy),非常浪费。能不能用旧策略采的数据来计算新策略的梯度,从而优化新策略?
Step 1:回顾策略梯度
我们已知策略梯度可以写成(用 Advantage 替代 $G_t$,因为减去 baseline 不改变期望):
$$\nabla_\theta J = \mathbb{E}_{a \sim \pi_\theta}\left[\nabla_\theta\log\pi_\theta(a|s) \cdot A^\pi(s,a)\right]$$注:这里从 REINFORCE 的轨迹形式 $\mathbb{E}_\tau[\sum_t \nabla\log\pi \cdot G_t]$ 换成了单步形式 $\mathbb{E}_{s\sim d^\pi,\, a\sim\pi(\cdot|s)}[\cdot]$。两者等价——"对轨迹求期望再对时间步求和" = "直接对状态访问分布 $d^\pi(s)$ 下所有 $(s,a)$ 对求期望"。IS 用单步形式是因为只需校正单个动作的概率比 $\frac{\pi_\theta(a|s)}{\pi_{old}(a|s)}$,避免整条轨迹 $T$ 个比值连乘导致方差指数级爆炸。
$d^\pi(s)$ 是什么?状态访问分布——按策略 $\pi$ 运行时,跨所有时间步,处于状态 $s$ 的平均概率:$d^\pi(s) = \frac{1}{T}\sum_{t=0}^{T-1}P(s_t=s|\pi)$。直觉:跑很多条轨迹后统计"在状态 $s$ 总共待了多少比例的时间"。它由初始分布 $\rho_0$、环境转移 $P(s'|s,a)$、策略 $\pi$ 三者共同决定。
Step 2:重要性采样的通用公式
数学定理:如果想用分布 $q$ 的样本来估计分布 $p$ 下的期望,可以通过"概率比"修正:
$$\mathbb{E}_{x \sim p}[f(x)] = \mathbb{E}_{x \sim q}\left[\frac{p(x)}{q(x)} \cdot f(x)\right]$$Step 3:代入我们的场景
令 $p = \pi_\theta$(新策略),$q = \pi_{\theta_{old}}$(旧策略),$f(a) = \nabla_\theta\log\pi_\theta(a|s) \cdot A^\pi(s,a)$:
$$\mathbb{E}_{a \sim \pi_\theta}[\underbrace{\nabla_\theta\log\pi_\theta \cdot A}_{f(a)}] = \mathbb{E}_{a \sim \pi_{\theta_{old}}}\left[\frac{\pi_\theta(a|s)}{\pi_{\theta_{old}}(a|s)} \cdot \nabla_\theta\log\pi_\theta(a|s) \cdot A(s,a)\right]$$Step 4:化简 — 从梯度到目标函数
利用 $\nabla_\theta\log\pi_\theta = \frac{\nabla_\theta\pi_\theta}{\pi_\theta}$,概率比 $\frac{\pi_\theta}{\pi_{\theta_{old}}}$ 乘以 $\frac{\nabla_\theta\pi_\theta}{\pi_\theta}$ → $\pi_\theta$ 约分 → 剩下 $\frac{\nabla_\theta\pi_\theta}{\pi_{\theta_{old}}}$。
注意到 $\pi_{\theta_{old}}$ 是常数(不依赖 $\theta$),所以 $\frac{\nabla_\theta\pi_\theta}{\pi_{\theta_{old}}} = \nabla_\theta\left[\frac{\pi_\theta}{\pi_{\theta_{old}}}\right]$——这恰好是"概率比"对 $\theta$ 的导数!由此反推:什么函数的梯度长这样?答案就是代理目标函数:
$$L(\theta) = \mathbb{E}_{(s,a) \sim \pi_{\theta_{old}}}\left[\frac{\pi_\theta(a|s)}{\pi_{\theta_{old}}(a|s)} \cdot A^{\pi_{\theta_{old}}}(s,a)\right]$$那么 $L(\theta)$ 在 $\theta = \theta_{old}$ 处的梯度恰好等于真实策略梯度 $\nabla_\theta J$。并且:
$$J(\theta) - J(\theta_{old}) \approx L(\theta)$$(当 $\pi_\theta$ 接近 $\pi_{\theta_{old}}$ 时,$L(\theta)$ 是策略改进量 $J(\theta)-J(\theta_{old})$ 的一阶近似。)
为什么这个近似有用?我们的目标是最大化策略改进量 $J(\theta)-J(\theta_{old})$,但 $J(\theta)$ 需要新策略的状态分布 $d^{\pi_\theta}$(还没部署,算不了)。而 $L(\theta)$ 只用旧数据就能算 → 最大化 $L(\theta)$ 就等价于最大化策略改进量(在近似有效范围内)。
一阶近似怎么来的?对 $L(\theta)$ 在 $\theta=\theta_{old}$ 处 Taylor 展开:$L(\theta_{old})=0$(因为概率比=1,而 $\mathbb{E}[A]=0$),且 $\nabla_\theta L\big|_{\theta_{old}} = \nabla_\theta J\big|_{\theta_{old}}$(前面 Step 4 证明的)。所以在 $\theta_{old}$ 附近:$J(\theta)-J(\theta_{old}) \approx \nabla_\theta J\big|_{\theta_{old}}^T(\theta-\theta_{old}) = \nabla_\theta L\big|_{\theta_{old}}^T(\theta-\theta_{old}) \approx L(\theta)$。即两者共享同一个起点(=0)和同一个梯度方向 → 局部行为一致。
$J(\theta)$ 的单步形式:$J(\theta) = \mathbb{E}_{s\sim d^{\pi_\theta},\,a\sim\pi_\theta(\cdot|s)}[r(s,a)]$。注意 $J$ 里的状态分布是 $d^{\pi_\theta}$(新策略的),而 $L$ 里用的是 $d^{\pi_{old}}$(旧策略的)。近似 $L \approx J-J_{old}$ 成立的前提:$\pi_\theta \approx \pi_{old}$ 时 $d^{\pi_\theta} \approx d^{\pi_{old}}$。这也是 KL 约束的深层原因——不仅控制动作分布差异(IS 方差),还保证状态分布近似有效。
① 采数据:用当前策略 $\pi_{\theta_{old}}$ 跑一批轨迹,收集 $(s_t, a_t, r_t)$
② 算 Advantage:用 GAE 计算每个 $(s_t,a_t)$ 的 $\hat{A}_t$(GAE 是 TD 估计与 MC 回报 $G_t$ 的加权插值,$\lambda$ 控制偏差-方差权衡,实践中 $\lambda=0.95$)。其中 $V(s_t)$ 由 Critic 网络 $V_\phi(s)$ 估计——实践中几乎都用神经网络拟合,训练目标为 $\min_\phi\mathbb{E}[(V_\phi(s_t)-G_t)^2]$
③ 最大化代理目标 $L(\theta)$:在 KL 约束内,用共轭梯度 + 线搜索找到最优 $\theta_{new}$
④ 更新策略:$\theta_{old} \leftarrow \theta_{new}$
⑤ 丢弃旧数据,回到 ①
参数空间限制 $\|\theta - \theta_{old}\| \leq \epsilon$ 的问题:
$$\text{同样的} \Delta\theta \longrightarrow \begin{cases} \text{softmax 饱和区:概率几乎不变} \\ \text{softmax 线性区:概率剧烈变化} \end{cases}$$KL 散度直接衡量"策略行为变了多少":
$$D_{KL}(\pi_{old}\|\pi_\theta) = \sum_a \pi_{old}(a|s)\log\frac{\pi_{old}(a|s)}{\pi_\theta(a|s)}$$当 $A_t > 0$(好动作):
$$L = \min(r_t \cdot A_t, \;\text{clip}(r_t, 1{-}\epsilon, 1{+}\epsilon)\cdot A_t)$$ $$= \begin{cases} r_t \cdot A_t & \text{if } r_t \leq 1+\epsilon \quad (\text{正常学习:梯度} = A_t \cdot \nabla r_t) \\ (1+\epsilon) \cdot A_t & \text{if } r_t > 1+\epsilon \quad (\text{梯度为 0,停止增大}) \end{cases}$$当 $A_t < 0$(坏动作):
$$L = \begin{cases} r_t \cdot A_t & \text{if } r_t \geq 1-\epsilon \quad (\text{正常学习:梯度} = A_t \cdot \nabla r_t) \\ (1-\epsilon) \cdot A_t & \text{if } r_t < 1-\epsilon \quad (\text{梯度为 0,停止减小}) \end{cases}$$模型想做的事:增大这个动作的概率 → $r_t$ 增大
clip 的限制:$r_t$ 最多到 $1+\epsilon$
超过后:梯度为零,停止更新
效果:"可以更喜欢这个动作,但别一步到位"
模型想做的事:减小这个动作的概率 → $r_t$ 减小
clip 的限制:$r_t$ 最低到 $1-\epsilon$
低于后:梯度为零,停止更新
效果:"可以不喜欢这个动作,但别一次改太多"
$\min$ 在两个候选值中取更悲观的:如果 unclipped 目标因为 $r_t$ 偏离太远而给出过于乐观的梯度方向,clip 版本会截断它。这保证每次更新都是保守的。
例:$\epsilon=0.2$,某好动作 $A_t = +3$,更新后 $r_t(\theta)=1.5$(概率比偏离过大)
Unclipped 目标:$1.5 \times 3 = 4.5$
Clipped 目标:$\text{clip}(1.5, 0.8, 1.2) \times 3 = 1.2 \times 3 = 3.6$
$\min(4.5, 3.6) = 3.6$ ← 取更保守的值。此时继续增大 $r_t$ 已经不会增大目标了 → 梯度为零,停止更新。
理论上 $A^\pi(s,a) = Q(s,a) - V(s)$ 是精确值,实践中只能用采样数据来估计 $\hat{A}_t$。下面对比四种方式——其中 **"MC + Baseline" 就是 Step 2 中使用的估计方式**,"纯 MC" 是 REINFORCE 原版(无 baseline,已不实用),TD 和 GAE 则是 Actor-Critic / PPO / GRPO 等现代方法的核心:
| 估计方式 | 公式 | 偏差 | 方差 | 直觉 |
|---|---|---|---|---|
| 纯 MC(REINFORCE 原版) | $\hat{A}_t = G_t$ 其中 $G_t = r_t + \gamma r_{t+1} + \gamma^2 r_{t+2} + \cdots$(从 t 到终点的完整真实回报) | 无偏 | 极高 | 不需要 Critic,直接用原始回报,但整条轨迹差异巨大 |
| MC + Baseline | $\hat{A}_t = G_t - V(s_t)$ | 无偏 | 高 | 用实际完整回报减去 baseline 降噪,需要 Critic(或移动平均)估计 $V(s_t)$ |
| TD 估计(1步) | $\hat{A}_t = r_t + \gamma V(s_{t+1}) - V(s_t)$ | 有偏 | 低 | 只看一步真实奖励,剩余靠 Critic 估计(Critic 不准→偏差) |
| GAE($\lambda$ 插值) | $\hat{A}_t = \sum_l (\gamma\lambda)^l \delta_{t+l}$ | 可调 | 可调 | $\lambda=0$ → 纯 TD;$\lambda=1$ → 纯 MC;$\lambda=0.95$ → 实践最优折中 |
GAE 通过 $\lambda$ 参数在这两个极端之间平滑权衡:
定义 $n$-步 advantage 估计:
$n=1$ 时只看一步(低方差、高偏差);$n=T$ 时看完整轨迹(低偏差、高方差)。
GAE 是所有 $n$-步估计的指数加权平均:
$$\hat{A}_t^{GAE} = (1-\lambda)\left[\hat{A}_t^{(1)} + \lambda\hat{A}_t^{(2)} + \lambda^2\hat{A}_t^{(3)} + \cdots\right]$$展开化简后得到 $\sum_{l=0}^{\infty}(\gamma\lambda)^l\delta_{t+l}$。
loss = -L^{total} 做最小化(优化框架默认行为)。标题写"总损失函数"是代码习惯的叫法PPO 是 RLHF 第三步(策略优化阶段)使用的核心算法。RLHF 使用 ORM(Outcome Reward Model,结果奖励模型)——只在整条回复生成完毕后打分,中间步骤只有 KL 惩罚。详见 第 6 节 RLHF 完整流程。关于 ORM vs PRM(过程奖励模型)的区别也在那里。
PPO 需要 Critic 网络估计 $V(s)$。在 LLM 场景中,Critic 和 Actor 一样大(几十亿参数),显存直接翻倍。GRPO 的贡献:用一个极简的方法替代 Critic。
对同一个 prompt $x$,用当前策略 $\pi_{\theta_{old}}$ 一次采样 $G$ 条回答 $\{y_1, y_2, \ldots, y_G\}$($G$ 通常 = 64)
每条回答获得 reward $r_i$(来自 RM 或规则判定,如数学答案对错)
GRPO 同时使用了 clip 和 KL 惩罚——两者解决的是不同的问题:
| Clip 截断 | KL 惩罚 | |
|---|---|---|
| 约束对象 | $\pi_\theta$ vs $\pi_{\theta_{old}}$(相邻迭代) | $\pi_\theta$ vs $\pi_{ref}$(当前策略 vs SFT 参考模型) |
| 作用 | 防止"这一次更新比上一次走太远"(局部稳定) | 防止模型完全忘记 SFT 学到的基本能力(全局锚定) |
| 比喻 | 步子别迈太大 | 别忘了回家的路 |
回顾 Step 2 证明:减去任何与动作无关的常数 $b$,都不改变梯度期望。
$$\text{PPO: } A_t = G_t - V(s_t) \quad \longrightarrow \quad \text{GRPO: } \hat{A}_i = r_i - \overline{r}$$当前文档中出现了两种 KL 惩罚公式,它们来自不同的论文,用在不同的场景:
| $-\beta\log(\pi_\theta/\pi_{ref})$ | $\text{ratio} - \log(\text{ratio}) - 1$ | |
|---|---|---|
| 来源 | InstructGPT / 标准 RLHF | GRPO / DeepSeek-R1 |
| 数学含义 | KL 散度的一阶近似(只取 log 项) | KL 散度的二阶近似,更准确 |
| 当 π_θ ≈ π_ref | log(ratio) 是 KL 的一阶 Taylor 展开主导项 | ratio - log(ratio) - 1 始终 ≥ 0,ratio=1 时 = 0 |
| 类比 | 用一阶导数近似函数变化(简单够用) | 用二阶 Taylor 展开近似(更精确) |
| 使用位置 | PPO 的 reward 中(通过梯度传播实现 KL 约束) | GRPO 的损失函数中(显式 KL 项) |
| 维度 | PPO | GRPO |
|---|---|---|
| Advantage 来源 | Critic 网络估计 $V(s)$(token 级别) | 组内 reward 标准化(序列级别) |
| 是否需要 Critic | 是(显存翻倍) | 否(省一半显存) |
| KL 约束方式 | reward 中隐式 KL 惩罚 | 损失函数中显式 KL 项 |
| 采样 | 每个 prompt 采 1 条 | 每个 prompt 采 $G$ 条(如 64) |
| Advantage 粒度 | 每个 token 有不同的 $A_t$ | 整条回答共享 $\hat{A}_i$ |
| 计算代价 | Critic 前向/反向 + PPO 更新 | $G$ 次推理 + PPO 更新(无 Critic) |
| 设计选择 | 做法 | 原因 |
|---|---|---|
| 组大小 | $G = 64$ | 越大 advantage 估计越稳定 |
| Reward | 规则判定(对/错) | 数学/代码答案可验证,无需 RM |
| 起点 | 直接从 base model 开始 | 发现不经 SFT 也能涌现 CoT 推理 |
用人工标注的高质量 (prompt, response) 对做监督微调 → 得到 $\pi_{SFT}$
直觉:让模型先学会"说人话",有基本的指令跟随能力。
同一 prompt 生成多个回复 → 人类排序 → 训练打分器
对每个 prompt $x$,用 SFT 模型生成 $K$ 个回复 $\{y_1, \dots, y_K\}$,人类标注者从中选出最好的 $y_w$(winner)和最差的 $y_l$(loser),形成偏好对 $(x, y_w, y_l)$。收集数千到数万对这样的数据。
人类偏好可以用概率模型刻画——给定两个回复 $y_w$ 和 $y_l$,人认为 $y_w$ 更好的概率:
给定一个偏好对 $(x, y_w, y_l)$,我们希望 RM 预测的偏好概率尽可能接近 1(即人选 $y_w$ 这件事应该被 RM 高概率预测)。用负对数似然作为损失:
直觉:训练一个"裁判",通过看大量人类偏好对学会了什么是"好回答"。
用 RM 的打分作为奖励,用策略梯度算法优化 LLM 生成策略。加 KL 惩罚防止 reward hacking。
PPO(InstructGPT / ChatGPT 的标准做法):需要 Actor + Critic + Reference Model + Reward Model 四个模型。稳定成熟,是 RLHF 的经典方案。
GRPO(DeepSeek-R1 的做法):去掉 Critic,用组内平均 reward 作为 baseline。省显存、实现简单,是当前主流趋势。
需要同时维护 4 个模型:Actor + Critic + Reference Model + Reward Model。
LLM 生成是序列决策问题——每一步选一个 token,生成 $T$ 步后得到完整回复。Reward 分为两部分:
上面描述的 Reward 结构是 ORM(Outcome Reward Model,结果奖励模型)——RM 只在整条回复生成完毕后($t=T$)打分,中间步骤只有 KL 惩罚。这是标准 RLHF 的做法。
还有一种方案叫 PRM(Process Reward Model,过程奖励模型)——中间步骤也给奖励,而不仅限于最后一步。
| ORM(结果奖励) | PRM(过程奖励) | |
|---|---|---|
| 打分时机 | 最后一步 $t=T$ | 每一步 $t=1\dots T$ |
| 中间步 Reward | 仅 KL 惩罚 | PRM 打分 + KL 惩罚 |
| 最后步 Reward | ORM 打分 + KL 惩罚 | ORM/PRM 打分 + KL 惩罚 |
| 适用场景 | 通用对话、创意写作 | 数学推理、代码生成、多步任务 |
| 训练数据 | 整条回复的人类偏好排序 | 每步中间过程的人类标注(如推理步骤正确与否) |
| 典型用法 | 标准 RLHF + PPO | RLVR(DeepSeek-R1 的 GRPO) |
核心区别:ORM 看"结果好不好",PRM 看"每一步推得对不对"。数学题中,ORM 只能判断最终答案对错,PRM 能在中间步骤就识别出"这一步推导错了",给及时的负反馈。
面试注意:RLHF 默认用 ORM;DeepSeek-R1 的 RLVR 本质是规则版 PRM——用程序验证每一步推理是否正确,不需要训练 RM。
RLVR = Reinforcement Learning with Verifiable Rewards,即"用可验证的奖励信号做强化学习"。它不是一个具体算法,而是一个训练范式——描述的是 reward 从哪来,而不是怎么优化。
传统 RLHF 依赖训练出来的 Reward Model,有三个致命问题:
| 问题 | 表现 | RLVR 如何解决 |
|---|---|---|
| Reward Hacking | 模型学会讨好 RM 而非真正变好 | 规则判定不可被 hack(对就是对) |
| RM 泛化误差 | RM 在分布外样本上打分不准 | 规则判定在任何样本上都精确 |
| 训练成本高 | RM 需要大量人类标注 + 训练 | 无需 RM,零额外训练成本 |
RLVR 中 reward 的典型形式:
更精细的 reward 设计也可加入格式奖励:
| 可以用 RLVR | 不能用 RLVR |
|---|---|
| 数学题(答案可验证) | 开放式对话(无标准答案) |
| 代码生成(可跑测试) | 创意写作 |
| 逻辑推理(可形式化验证) | 情感共鸣、风格偏好 |
| 事实问答(有确定答案) | 复杂多维度对齐(有用+无害+诚实) |
| 工具调用(执行成功/失败) | 主观质量评估 |
| 维度 | RLHF | RLVR |
|---|---|---|
| Reward 来源 | 训练出来的 Reward Model | 可验证的规则/程序 |
| Reward 准确性 | 有误差(RM 泛化有限) | 100% 准确(规则不出错) |
| 是否可被 Hack | 是(模型学会讨好 RM) | 否(对就是对,无捷径) |
| 数据需求 | 大量人类偏好标注 | 只需问题+标准答案 |
| 适用任务 | 开放式、主观性任务 | 答案可验证的客观任务 |
| 训练成本 | 高(4个模型 + 标注成本) | 低(无 RM,规则验证近乎免费) |
| 涌现能力 | 有限 | 可涌现 CoT、自我纠错(DeepSeek-R1) |
| 代表工作 | InstructGPT、ChatGPT | DeepSeek-R1、Qwen-2.5-Math |
标准 RLVR 只看最终答案对错(Outcome-level),但也可以做更细粒度的过程监督:
| Outcome Reward (ORM) | Process Reward (PRM) | |
|---|---|---|
| 打分粒度 | 整条回答给一个分 | 推理链每一步各给一个分 |
| 信号密度 | 稀疏(只有结尾一个信号) | 密集(每步都有反馈) |
| 标注成本 | 低(只需验证最终答案) | 高(需要逐步标注正误) |
| 效果 | 对简单任务够用 | 多步推理中显著更强(OpenAI 实证) |
| 是否仍是 RLVR? | 是 | 如果每步可自动验证则是;需要人类标注则退化为 RLHF |
DPO 证明了:不需要单独训练 Reward Model,偏好数据可以直接优化策略。
当前 HTML 直接给出了最优解,下面展开完整的 4 步推导:
KL 散度的定义:
利用 $\frac{d}{dx}(x\log x) = 1+\log x$:
整理:
$$\log\frac{\pi(y|x)}{\pi_{ref}(y|x)} = \frac{1}{\beta}r(x,y) - 1 - \frac{\lambda}{\beta}$$取指数:
$$\frac{\pi(y|x)}{\pi_{ref}(y|x)} = e^{\frac{1}{\beta}r(x,y) - 1 - \frac{\lambda}{\beta}}$$对最优解两边取 log:
移项,解出 $r(x,y)$:
Bradley-Terry 偏好模型:$P(y_w \succ y_l) = \sigma(r(x,y_w) - r(x,y_l))$
把 Step 2 的 reward 代入,做差:
用可训练的 $\pi_\theta$ 替代理论上的 $\pi^*$,取负对数似然作为损失函数:
| 类型 | 做法 | 适用场景 | 代表 |
|---|---|---|---|
| 手工设计 | 人为定义奖励规则 | 目标可量化(游戏、机器人) | CartPole、围棋 |
| 从人类偏好学习 | 训练 Reward Model | 目标模糊主观(文本质量) | RLHF |
| 逆强化学习 (IRL) | 从专家轨迹反推 reward | 有演示但 reward 未知 | 自动驾驶、GAIL |
| 内在奖励 | 好奇心/新颖性驱动 | 外部奖励稀疏 | ICM、RND |
| 基于规则 | 答案对错的确定性判定 | 数学/代码推理 | DeepSeek-R1 |
| 过程奖励 (PRM) | 对推理链每步打分 | 多步推理 | OpenAI "Let's Verify" |
| 自我奖励 | LLM 自评自改 | 自我改进循环 | Meta Self-Rewarding |
风险:shaping 不当 → reward hacking。例如给"靠近目标"加分,agent 在目标旁反复晃动刷分而不完成任务。
| 算法 | 核心思想 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|---|
| REINFORCE | 回报加权梯度 | 简单、理论优美 | 方差大、效率差 | 教学 |
| A2C/A3C | Actor-Critic + 并行 | 方差低、可并行 | 步长敏感 | Atari |
| TRPO | KL 约束信任域 | 理论保证单调改进 | 二阶优化慢 | 需要稳定性保证 |
| PPO | clip 近似信任域 | 简单、稳定、通用 | 需要 Critic、超参敏感 | 通用(游戏/机器人/LLM) |
| SAC | 最大熵 off-policy | 数据效率高、探索好 | 仅限连续动作 | 机器人控制 |
| GRPO | 组内相对排名 | 省显存、无 Critic | 需多次采样、序列级 A | LLM 推理对齐 |
| 算法 | 需要 RM? | 数据需求 | 复杂度 | 效果上限 |
|---|---|---|---|---|
| RLHF (PPO) | 是(显式) | pairwise 偏好 | 高(4 个模型) | 最强(在线采样) |
| DPO | 否(隐式) | pairwise 偏好 | 低(1 阶段) | 接近 RLHF |
| GRPO | 可选 | 可验证 reward | 中(无 Critic) | 推理任务强 |
| KTO | 否 | 二元标签 | 低 | 数据少时优势 |
| Online DPO | 否 | 在线偏好 | 中 | 强于离线 DPO |
| RLVR + GRPO | 否(规则验证) | 问题+标准答案 | 中 | 推理任务最强 |
| 算法 | 年份 | 核心思路 | 每批轨迹数 | 每批更新 | 代表应用 |
|---|---|---|---|---|---|
| REINFORCE | 1992 | 回报加权梯度:一条轨迹算 $G_t$ → 对整批轨迹的 $\nabla\log\pi \cdot G_t$ 平均 → 走一步梯度 | ~64-256 条 | 1 次 | 教学 |
| TRPO | 2015 | 信任域优化:拆为独立样本构建 $L(\theta)$ → 共轭梯度一步到位找最优 → 同批只优化一次 | ~64-256 条 | 1 次 | 已淘汰 |
| PPO | 2017 | clip 信任域:同 TRPO 拆样本 → 对同批数据打乱分 mini-batch 跑 3-10 轮 SGD | ~64-256 条 | 3-10 epochs | 通用主力 |
| GRPO | 2024 | 组内相对排名:同一 prompt 生成 N 个输出 → 组内排序得 $\hat{A}_i$ → 类 PPO clip 优化 | 每 prompt N=4-16 个输出 | 多轮 | LLM 推理 |
| DPO | 2023 | 直接偏好优化:偏好对 $(y_w,y_l)$ 做分类式训练(交叉熵),无 RL 采样循环 | 离线数据集(数千-数万对) | 多轮 SGD | 轻量对齐 |
| RLHF(PPO) | 2022 | 在线 RLHF:模型在线生成 → RM 打分 → PPO 优化 → 再生成,循环迭代 | ~64-256 条 | 多轮 | 对话对齐 |
前面章节聚焦 Policy Gradient 系列(适合 LLM 对齐),这里补齐 Value-based 和 Off-policy Actor-Critic 算法族,面试中经常作为"RL 基本功"考察。
用神经网络近似动作价值函数 $Q(s,a;\theta)$,选动作时取 $a^* = \arg\max_a Q(s,a)$。本质是把 Q-learning 的 Q-table 换成深度网络。
(1) Experience Replay:把 $(s, a, r, s')$ 存入 buffer,训练时随机采样 mini-batch。两个好处:打破样本间时间相关性(i.i.d. 化)+ 数据复用(off-policy 优势)。
(2) Target Network:冻结的旧网络 $Q_{\theta^-}$ 计算 TD target,每隔 C 步从主网络硬同步 $\theta^- \leftarrow \theta$。防止"追自己的尾巴"(目标和预测同步变化 → 震荡不收敛)。
(3) ε-greedy 探索:以 ε 概率随机选动作,1-ε 概率选 $\arg\max Q$。ε 从 1.0 线性衰减到 0.01 → 从纯探索渐变为纯利用。
| 变体 | 解决的问题 | 核心改动 |
|---|---|---|
| Double DQN | Q 值过高估计 | 选动作用主网络,评估用 target 网络:$y = r + \gamma Q_{\theta^-}(s', \arg\max_{a'} Q_\theta(s', a'))$ |
| Dueling DQN | 区分状态好坏 vs 动作好坏 | 把 Q 拆成 $Q = V(s) + A(s,a)$,分流网络结构 |
| Prioritized Replay | 重要样本被忽略 | 按 TD error 大小优先采样,加权修正偏差 |
| Rainbow | 单个 trick 不够强 | 6 种改进全部叠加(Double + Dueling + PER + Noisy + C51 + n-step) |
把 DQN 扩展到连续动作空间。用确定性策略 $\mu_\theta(s)$ 直接输出动作值(而非概率分布),结合 off-policy Actor-Critic 框架。
Replay Buffer:和 DQN 一样存储 $(s,a,r,s')$,off-policy 复用历史数据。
Soft Target Update:$\theta^- \leftarrow \tau\theta + (1-\tau)\theta^-$,每步缓慢更新(而非 DQN 的周期硬拷贝),更平滑。
探索噪声:动作 $a = \mu_\theta(s) + \mathcal{N}$,通常用 Ornstein-Uhlenbeck 过程或简单高斯噪声。确定性策略本身无探索能力,必须加噪声。
针对 DDPG 的 Q 值高估和训练不稳定,提出三个精巧修复。
(1) Twin Q-networks(双 Q 网络):训练两个独立的 Critic $Q_{\phi_1}$、$Q_{\phi_2}$,TD target 取 min:
(2) Delayed Policy Update(延迟策略更新):Critic 每步都更新,但 Actor 每隔 $d$ 步才更新一次(通常 $d=2$)。让 Critic 先收敛到合理的 Q 估计,Actor 再跟进 → 避免"Critic 不准时 Actor 乱走"。
(3) Target Policy Smoothing:$$\tilde{a}' = \mu_{\theta^-}(s') + \text{clip}(\epsilon, -c, c), \quad \epsilon \sim \mathcal{N}(0, \sigma)$$给 target action 加 clipped 噪声 → 防止 Critic 对某些动作给出 sharp peak → 相当于正则化 Q 函数。
最大熵强化学习——不仅最大化累积奖励,还最大化策略的熵(随机性),鼓励探索。
随机策略:Actor 输出高斯分布 $\pi_\theta(a|s) = \mathcal{N}(\mu_\theta(s), \sigma_\theta(s))$,采样动作 $a = \tanh(\mu + \sigma \cdot \epsilon)$。vs DDPG 的确定性策略 → SAC 天然带探索噪声。
Twin Q(同 TD3):训练两个 Critic,取 min 防高估。
自动温度调节(SAC v2):将 α 也作为可学习参数,约束 $\mathbb{E}[-\log\pi] \geq \mathcal{H}_{target}$。不需要手动调 α → 自适应平衡探索与利用。
Off-policy + Replay Buffer:和 DDPG/TD3 一样,数据效率远高于 on-policy 方法。
| 算法 | 年份 | 动作空间 | Policy | On/Off | 核心创新 | 适用场景 |
|---|---|---|---|---|---|---|
| DQN | 2015 | 离散 | 隐式 (argmax Q) | Off | Replay + Target Net | Atari 游戏 |
| DDPG | 2016 | 连续 | 确定性 | Off | DPG 定理 + Soft Update | 机器人控制 |
| TD3 | 2018 | 连续 | 确定性 | Off | Twin Q + Delayed Update | 连续控制 |
| SAC | 2018 | 连续 | 随机 | Off | 最大熵 + 自动 α | 机器人/自动驾驶 |
唯一例外:ILQL / Offline RL for LLM 等工作尝试用 off-policy 方法做 LLM 对齐,但效果普遍不如 PPO/DPO/GRPO。
RL 训练不同于 SFT:需要 rollout(在线推理生成)→ reward 计算 → policy update 三者协调。Agentic RL 更需要环境交互、sandbox 调度、多轮 trajectory 管理。一个好的 Harness 解决三件事:(1) rollout 吞吐量 (2) 训练与推理的资源编排 (3) 环境/sandbox 管理。
for step in 1..N: 1. Rollout: π_θ 生成 G 条 response(vLLM 加速) 2. Reward: RM(response) 或 verifier(response) 打分 3. Advantage: 计算 Â(GRPO: group 归一化 / PPO: GAE) 4. Update: PPO/GRPO clip 目标 → 多轮 mini-batch SGD 5. Sync: 更新后的权重 → rollout worker
Agentic RL 额外步骤:在 Step 1 中插入环境交互循环 — 模型 action → sandbox 执行 → observation 回传 → 模型继续生成 → 直到任务完成或达到 max_turns。
| 技术 | 原理 | 加速比 |
|---|---|---|
| vLLM Continuous Batching | 动态合并不等长请求 → 避免 padding 浪费 → PagedAttention 管理 KV Cache | 5-10× |
| Prefix Caching | 同一 prompt 的 G 条采样共享 KV Cache 前缀(RadixAttention) | G 条共享 → 近 G× prompt 部分 |
| Tensor Parallel Rollout | 大模型跨卡分片推理 → 单条 latency 降低 | 线性于 TP 数 |
| Speculative Decoding | 小模型 draft + 大模型 verify → 降低 latency | 2-3× latency |
| 同步 (Sync) | 异步 (Async) | |
|---|---|---|
| 流程 | rollout 完 → train → 再 rollout | rollout 持续跑,train 从队列取数据 |
| GPU 利用率 | ~50%(交替空闲) | ~90%+ |
| 数据新鲜度 | 100% on-policy | 略 off-policy(延迟 1-2 步) |
| 收敛性 | 稳定 | 需容忍轻微 off-policy 或 IS 修正 |
| 适用 | 小规模/研究验证 | 大规模生产训练 |
VERL 方案:同一组 GPU 在 rollout 阶段切换为 vLLM 引擎(推理模式),在 train 阶段切换为 FSDP(训练模式)→ 不需要额外 GPU,但要处理引擎切换开销。
OpenRLHF 方案:Ray Actor 分离部署 — rollout worker (vLLM) 和 train worker (DeepSpeed) 各占独立 GPU 组 → 通过 Ray Object Store 传数据。
| 框架 | 后端 | Rollout | 特色 | 适用 |
|---|---|---|---|---|
| OpenRLHF | Ray + DeepSpeed | vLLM (Ray Actor) | 算法全面,70B+ 可用 | 大规模生产 |
| VERL | FSDP / Megatron | vLLM (同卡切换) | 资源弹性,原生 multi-turn | Agentic RL |
| TRL | HuggingFace | 原生 generate | 上手快,生态好 | 研究/小模型 |
| NeMo-Aligner | Megatron | 内置 | 原生 TP/PP | NVIDIA 生态 |
为什么需要 Sandbox:Agent RL 中模型生成的 action 需要在真实环境中执行(运行代码/调 API/浏览网页),但要:安全隔离 + 可重置 + 高并行。
| 方案 | 实现 | 特点 |
|---|---|---|
| Docker 容器池 | 预启动 N 个容器,按需分配给 rollout | 隔离好、标准化、SWE-bench 方案 |
| gVisor / Firecracker | 轻量虚拟化,微秒级启动 | 更安全、更快、适合大规模并行 |
| E2B / Modal | 云端 sandbox 服务 | 无需自建,按需付费 |
| 模拟环境 | 工具调用用 mock 或 LLM 模拟 | 快但不真实,适合预训练阶段 |
关键工程挑战:
核心矛盾:Rollout 需要最新权重做推理(on-policy 保证),但 train 阶段权重在持续更新 → 如何高效同步?
VERL 的 FSDP ↔ vLLM 切换:
Q: RL 训练的 rollout 和 train 为什么不能简单并行?有什么数据一致性问题?
A: On-policy RL 要求 rollout 用的策略 = train 更新的策略。如果 async 做,rollout 数据是用旧策略 $\pi_{old}$ 生成的,但 train 时策略已更新为 $\pi_{new}$ → 数据 off-policy。解决:(1) 用 importance sampling ratio $\frac{\pi_{new}}{\pi_{old}}$ 修正(PPO clip 天然做了这件事);(2) 控制 staleness(rollout 最多落后 1-2 个 train step)。
Q: 为什么 Agentic RL 比标准 RLHF 对 Harness 要求更高?
A: 三个维度:(1) Trajectory 长度不定 — 标准 RLHF 输出 fixed max_len,Agent 可能 3 轮完成也可能 30 轮 → 需要动态 padding/packing;(2) 环境交互阻塞 — 每轮 action 后要等环境返回 → rollout latency 不可控(API timeout / 代码执行慢);(3) 状态管理 — 多轮需要 sandbox 持久状态 → 普通 stateless rollout 不够。
Q: VERL 的"同卡切换"和 OpenRLHF 的"分卡分离"各自优劣?
A: VERL 同卡切换:优势 = 不需要额外 GPU(一组卡既做 train 又做 rollout);劣势 = 串行(不能同时 train+rollout)+ 切换有开销(all-gather + vLLM reload)。OpenRLHF 分卡:优势 = train 和 rollout 真正并行 → 利用率高;劣势 = 需要 2× GPU 资源,且跨节点传权重带宽高。
Q: Prefix Caching 在 GRPO 中为什么特别有效?
A: GRPO 对每个 prompt 采样 G=8-64 条 response → 这 G 条共享同一个 prompt 的 KV Cache 前缀。用 RadixAttention 缓存后,prompt 部分只需计算一次 → 总 compute ≈ 1 次 prompt + G 次 decode(而非 G 次 prompt + G 次 decode),节省 ~(G-1)/G 的 prefill 计算。
Q: 如何设计 Agent RL 的训练 harness 来处理不等长 trajectory?
A: (1) Dynamic batching:不按固定 batch 分,而是按 token 总数分 micro-batch → 避免短 trajectory 浪费 padding;(2) Packing:多条短 trajectory 拼接成一条长序列(加 attention mask 隔离);(3) Async completion:先完成的 trajectory 先进入 reward 计算,不等最慢的 → 管道式处理减少等待。
On-policy:用当前策略 π_θ 采的数据更新 π_θ,数据用完即丢。下一轮必须重新采样。代表:PPO、A2C、REINFORCE、GRPO。
Off-policy:可以用历史数据(旧策略采的)更新当前策略,数据存 Replay Buffer 反复用。代表:DQN、SAC、DDPG。
PPO 的特殊性:严格 on-policy,但一批数据做多 epoch 更新(3-10 次),是折中方案。
核心:用神经网络近似 Q 函数 $Q(s,a)$,通过学习"每个状态下每个动作值多少分"来间接学策略。选动作时取 $a^* = \arg\max_a Q(s,a)$。
三大技巧:
(1) Experience Replay(经验回放):把 (s,a,r,s') 存进 buffer,随机采样打破时间相关性;(2) Target Network(目标网络):用冻结的旧网络算目标值,避免"追自己的尾巴"导致震荡;(3) ε-greedy:以 ε 概率随机选动作保证探索,ε 随训练递减。
适用场景:离散动作空间(Atari 游戏)。LLM 不用 DQN 因为词表太大(几万 token),argmax Q 不现实。
核心:Off-policy Actor-Critic + 最大熵优化。不仅最大化奖励,还最大化策略的熵(随机性),鼓励探索。
优化目标:$\max_\pi \mathbb{E}[\sum_t r_t + \alpha\mathcal{H}(\pi(\cdot|s_t))]$,其中 $\mathcal{H}$ 是策略熵,α 是温度系数。
特点:数据效率高(off-policy + replay buffer)、策略鲁棒(熵正则防止过拟合单一动作)、适合连续动作空间。
适用场景:机器人控制、自动驾驶等连续动作任务。LLM 不用 SAC 因为 token 是离散的,且熵最大化在语言生成中意义不明确。
(1) 分布偏移问题:LLM 词表巨大(32K-100K+),重要性采样在超高维离散空间上方差爆炸;(2) 语义敏感性:旧策略生成的文本对新策略可能完全不适用(风格/分布变了);(3) 在线采样成本低:LLM 推理快,重新采样比存海量历史数据更划算。所以 PPO/DPO/GRPO 都是 on-policy 或接近 on-policy。
TRPO 需要 Fisher 矩阵 + 共轭梯度 + line search(二阶)。PPO 只用 Adam(一阶),实现简单 10 倍,效果相当。
Model-free:不学环境动力学,通用但数据效率低。Model-based:先学环境模型再 planning,数据效率高但受模型误差积累限制。
Reward Shaping(加中间奖励)、Curiosity(内在奖励)、HER(事后改目标)、Curriculum Learning(先易后难)。
KL 约束(限制偏离)、多维 Reward(多目标平衡)、Process RM(过程监督)、规则 Reward(不可 hack)。
DPO:资源有限、偏好数据和模型分布接近。RLHF:需要在线采样、追求最佳效果。GRPO:reward 可验证(数学/代码)、想省显存。
通常 0.1-0.2。太小约束紧学得慢,太大相当于没约束会崩。部分实现做线性退火。
Bradley-Terry 只看 reward 差值,$Z(x)$ 与 $y$ 无关所以消掉。限制:隐式 reward 绝对值不可解释,不能用于拒绝采样。
通常 32-64。越大 advantage 估计越稳定但推理成本线性增长。太小(如 4)会导致标准化后的 advantage 噪声大。
RLVR = Reinforcement Learning with Verifiable Rewards,是一种训练范式而非具体算法。它用可验证的规则(如答案对错)作为 reward,无需训练 RM。和 RLHF 的区别在于 reward 来源不同:RLHF 从人类偏好学习 reward,RLVR 用确定性规则验证。RLVR 适用于可验证任务(数学/代码),RLHF 适用于主观任务(对话/写作)。
复杂题目直接猜答案几乎不可能得分,而"先思考、分步骤、验证中间结果"是唯一能稳定提升正确率的策略。RL 的探索机制自然会发现并强化这种模式。模型不是被教会推理的,而是在 reward 信号引导下自己发现"推理=高 reward"。
DPO 是 off-policy。它用固定偏好数据集(离线数据)训练,不需要在线采样。这和 RLHF/PPO/GRPO 的 on-policy 范式完全不同——DPO 的训练范式本质是监督学习,优化目标直接来自离线偏好对 $(x, y_w, y_l)$。优点是数据可复用、无需在线采样;劣势是分布偏移后效果可能下降。
Reference Model 是 SFT 模型的冻结副本,在 PPO 训练中用 KL 惩罚约束 Actor 不偏离太远。两个核心作用:(1) 防止 Reward Hacking——没有 KL 约束时模型会学会讨好 RM 的极端行为(如反复说"您说得对");(2) 防止遗忘——约束模型不要完全丢失 SFT 阶段学到的基本能力。RLHF 需要同时维护 4 个模型,Reference Model 是其中开销最小的(只需推理不需要梯度)。
(1) 隐式 Reward 不可解释——DPO 消掉了 $Z(x)$,无法得到 reward 的绝对值,不能用于拒绝采样;(2) 静态数据集限制——DPO 用离线数据训练,分布偏移后效果下降,不能像 RLHF 那样在线采样新数据;(3) 奖励信号压缩——DPO 把连续 reward 压缩成二值偏好(好/差),丢失了 fine-grained 信息。这就是 GRPO 重新流行的原因之一——GRPO 保留了连续 reward 信号,同时省掉了 RM 和 Critic。
GRPO 训练不稳定的常见原因:(1) 组内 reward 方差过大——如果组内有的回答极好、有的极差,标准化后的 advantage 噪声大,梯度方向不稳定;(2) KL 系数 $\beta$ 太小——约束不够时策略容易走偏;(3) 组大小 $G$ 太小——标准化分母接近零时 advantage 爆炸;(4) reward 稀疏——大部分回答都是 0 分,梯度信号弱。工程实践:用更大的 $G$(64+)、适当增大 $\beta$、reward smoothing、梯度裁剪。
实际任务中常需同时优化多个目标(如有用+无害+诚实),这些目标可能冲突。常见方案:(1) 加权求和——$r = w_1 r_1 + w_2 r_2 + \dots$,简单但权重难调;(2) Pareto 优化——不追求单一最优,找 Pareto 前沿上的解;(3) 分层 Reward——先满足安全底线(无害),再优化质量(有用);(4) GDPO(Generalized DPO)——多偏好维度下直接优化策略。实践中加权求和最常用,但权重需要仔细调参。
(1) Critic 估计不准——value loss 权重太小或 learning rate 太大导致 Critic 不收敛,Advantage 计算错误;(2) Clip $\epsilon$ 太大——约束失效,策略更新过猛;(3) Batch size 太小——Advantage 估计方差大;(4) Learning rate 太大——策略更新后偏离 $\pi_{old}$ 太远,importance sampling 权重爆炸;(5) GAE $\lambda$ 不合适——$\lambda$ 太大引入高方差,太小引入高偏差。工程实践:先用小 learning rate + 大 batch + 适中 $\epsilon$(0.1-0.2),稳定后再调参。