强化学习面试速查手册

从策略梯度到 PPO/GRPO/DPO,公式逐项拆解 + 直觉理解

Policy Gradient PPO / GRPO RLHF / DPO 面试高频题

1. 符号系统完全手册

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轨迹终止时刻一局游戏结束

第二层:回报(Return)

符号含义公式直觉
$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$"这一局的总成绩"
$r_t$ 是一帧的分数,$G_t$ 是剩余部分的加权总分,$R(\tau)$ 是一局的总分。关系:$G_0 = r_0 + \gamma r_1 + \gamma^2 r_2 + \cdots$

第三层:价值函数

符号名称公式直觉
$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$ 比该状态的平均水平好多少"
Q(s,a) = V(s) + A(s,a) V(s) 所有动作的平均水平 Q(s,a) 做这个具体动作的预期得分 A(s,a) 这个动作相对平均的增量 A > 0 → 好动作 A < 0 → 坏动作 A = 0 → 平均水平 直觉:V 是"底线",A 衡量"偏离底线多少",Q 是两者之和

第四层:策略相关

符号含义直觉
$\pi$策略(给定状态 → 输出动作的规则)agent 的"大脑"
$\pi_\theta(a|s)$参数 $\theta$ 的策略在状态 $s$ 选动作 $a$ 的概率神经网络的 softmax 输出
$\theta$策略网络的参数(权重)我们要优化的变量
$J(\theta)$目标函数 = 策略的期望总回报$\mathbb{E}[R(\tau)]$,越大越好
$\nabla_\theta$对 $\theta$ 求梯度参数应往哪个方向调

第五层:PPO 专用

符号含义直觉
$\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)"看多远的未来信息"
最易混淆的两个 $r$:
$r_t$(不带 $\theta$)= 时刻 $t$ 的即时奖励
$r_t(\theta)$(带 $\theta$)= PPO 中的概率比
有些论文用 $\rho_t(\theta)$ 表示概率比来避免歧义。

第六层:RLHF / DPO 专用

符号含义直觉
$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 散度两个分布的"距离"

第七层:GRPO 专用

符号含义直觉
$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$ 是神经网络近似

2. 核心概念与公式

MDP 五元组

定义
$$\text{MDP} = (S, A, P, R, \gamma)$$
$S$状态空间——agent 能观察到的所有环境信息的集合
$A$动作空间——agent 能做的所有选择的集合
$P(s'|s,a)$转移概率——做了动作 $a$ 后,环境从 $s$ 变到 $s'$ 的概率
$R(s,a)$奖励函数——执行动作后的即时反馈
$\gamma$折扣因子——未来奖励的衰减系数
MDP 就像一个棋盘游戏的规则书:$S$ 是所有可能的棋盘局面,$A$ 是你能走的棋步,$P$ 是走了之后棋盘怎么变,$R$ 是每步得多少分,$\gamma$ 是你对"以后的分"打多少折扣。

Bellman 方程

递归关系
$$V^\pi(s) = \sum_a \pi(a|s) \left[R(s,a) + \gamma \sum_{s'} P(s'|s,a)\, V^\pi(s')\right]$$
$\pi(a|s)$策略在状态 $s$ 下选动作 $a$ 的概率
$R(s,a)$这一步的即时奖励
$\gamma V^\pi(s')$下一步状态价值的折扣
Bellman 方程说的是:当前价值 = 即时奖励 + 未来价值的折扣期望。这是一个递归定义——一个状态的好坏取决于下一个状态的好坏,像多米诺骨牌一样一环扣一环。

3. 策略梯度(Policy Gradient)到 PPO 演进

演进路线图

REINFORCE
直接用回报加权梯度
问题:方差太大,学习不稳定
+ Baseline → Advantage Actor-Critic
引入价值函数做基准,训练 Critic 网络
问题:梯度步长敏感,策略容易崩溃
TRPO
KL 散度约束,信任域优化
问题:需要二阶优化,实现复杂
PPO
clip 代替 KL,一阶优化,简单高效

每一步都解决上一步的核心缺陷。面试中讲清这条因果链比背公式更有价值。

Step 1: REINFORCE(Williams, 1992 — 蒙特卡洛策略梯度)

目标函数

整个 RL 要优化的东西——策略的期望总回报

目标函数定义
$$J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta}[R(\tau)] = \int P(\tau|\theta) \cdot R(\tau) \, d\tau$$
$J(\theta)$策略 $\pi_\theta$ 的"平均成绩"——按当前策略玩很多局,所有局回报的平均值
$\tau \sim \pi_\theta$按策略 $\pi_\theta$ 采样一条轨迹
$R(\tau)$这条轨迹的总回报
$P(\tau|\theta)$这条轨迹在策略 $\theta$ 下出现的概率
$\int \cdots d\tau$对所有可能的轨迹求积分(离散情况下是求和)
优化方向$J(\theta)$ 越大越好,我们要做梯度上升:$\theta \leftarrow \theta + \alpha \nabla_\theta J$

核心问题

怎么算 $\nabla_\theta J$?直接求导遇到障碍:$R(\tau)$ 来自环境(黑盒),和 $\theta$ 之间没有显式可微关系。我们不能像监督学习那样直接反向传播。

完整推导(5 步)

REINFORCE 推导核心链路 1 写出梯度积分形式 ∇J = ∇∫P(τ|θ)R(τ)dτ = ∫∇P · R dτ ⚠ ∇P 无法直接算 2 Log-Derivative Trick ★ 积分 → 期望 → 可采样 ∇P = P·∇log P ⟹ ∫P·∇logP·R dτ = E[∇logP · R(τ)] 3 展开 log P(τ|θ),环境项消掉 ∇logP = ∇log π + ∇log P(env) → 只剩 Σ∇log π(aₜ|sₜ) 4 得到初始公式 ∇J = E[ Σₜ ∇log π(aₜ|sₜ) · R(τ) ] ⚠ R(τ) 含过去奖励,方差大 5 Reward-to-go ★ R(τ) → Gₜ r₀…rₜ₋₁ 和 aₜ 无关 → E[∇logπ · c] = 0(Score Function Lemma) 过去奖励消掉,只剩未来回报 Gₜ → 方差更小 最终公式 ∇J = E[ Σₜ ∇log π(aₜ|sₜ) · Gₜ ] 采 N 条轨迹 → 每条算 ∇logπ · Gₜ → 取平均 ≈ 真实梯度(Monte Carlo 近似)
1

写出梯度的积分形式

$$\nabla_\theta J = \nabla_\theta \int P(\tau|\theta) \cdot R(\tau) \, d\tau = \int \nabla_\theta P(\tau|\theta) \cdot R(\tau) \, d\tau$$
交换 $\nabla$ 和 $\int$把梯度挪到积分里面(正则条件下可交换)
问题$\nabla_\theta P(\tau|\theta)$ 不好算——我们没法对环境转移概率求导
2

Log-Derivative Trick(最关键的一步)

利用恒等式 $\nabla f = f \cdot \nabla \log f$(来自 $\frac{d}{dx}\log f = \frac{1}{f}\frac{df}{dx}$):

$$\nabla_\theta P(\tau|\theta) = P(\tau|\theta) \cdot \nabla_\theta \log P(\tau|\theta)$$
效果把"对概率求导"变成了"概率 × 对 log 概率求导"
好处代入积分后,$P(\tau|\theta)$ 变成了采样权重——可以用蒙特卡洛近似!

代入 Step 1:

$$\nabla_\theta J = \int P(\tau|\theta) \cdot \nabla_\theta \log P(\tau|\theta) \cdot R(\tau) \, d\tau = \mathbb{E}_{\tau \sim \pi_\theta}\left[\nabla_\theta \log P(\tau|\theta) \cdot R(\tau)\right]$$
$\int P(\tau) \cdot [\cdots] \, d\tau$这就是期望的定义!所以可以写成 $\mathbb{E}_\tau[\cdots]$
实操意义采样 $N$ 条轨迹,算每条的 $\nabla\log P \cdot R$,取平均,就得到梯度近似
3

展开 $\log P(\tau|\theta)$,消除环境项

轨迹的概率为:

$$P(\tau|\theta) = p(s_0) \prod_{t=0}^{T-1} \underbrace{\pi_\theta(a_t|s_t)}_{\text{策略(和 }\theta\text{ 有关)}} \cdot \underbrace{p(s_{t+1}|s_t,a_t)}_{\text{环境动力学(和 }\theta\text{ 无关)}}$$

取 log(乘积变求和):

$$\log P(\tau|\theta) = \underbrace{\log p(s_0)}_{\text{与 }\theta\text{ 无关}} + \sum_t \log \pi_\theta(a_t|s_t) + \underbrace{\sum_t \log p(s_{t+1}|s_t,a_t)}_{\text{与 }\theta\text{ 无关}}$$

对 $\theta$ 求梯度,第一项和第三项为零:

$$\nabla_\theta \log P(\tau|\theta) = \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t|s_t)$$
关键结论环境动力学完全消掉了!梯度只依赖策略本身,不需要知道环境模型
$\nabla_\theta \log \pi_\theta(a_t|s_t)$score function——"让动作 $a_t$ 概率增大"的参数调整方向
4

代入得到初始版本

$$\nabla_\theta J = \mathbb{E}_\tau\left[\left(\sum_{t=0}^{T-1} \nabla_\theta \log\pi_\theta(a_t|s_t)\right) \cdot R(\tau)\right]$$
$R(\tau)$整条轨迹的总回报,作为所有时间步共享的权重
问题时刻 $t$ 的动作不应该为它之前的奖励"负责"——但 $R(\tau)$ 包含了 $t$ 之前的 $r_0, r_1, \ldots$
5

Reward-to-go 优化:$R(\tau) \to G_t$

Step 4 中每个时间步都乘以整条轨迹的 $R(\tau)$,但 $R(\tau)$ 包含了时刻 $t$ 之前的奖励——这些和 $a_t$ 的选择无关。下面证明可以去掉它们:

拆分 $R(\tau)$:

$$R(\tau) = \sum_{k=0}^{T-1}\gamma^k r_k = \underbrace{(\gamma^0 r_0 + \cdots + \gamma^{t-1} r_{t-1})}_{\text{过去奖励(和 }a_t\text{ 无关)}} + \underbrace{(\gamma^t r_t + \cdots + \gamma^{T-1} r_{T-1})}_{= \; \gamma^t \cdot G_t\text{(未来奖励的折扣和)}}$$
$\gamma^k r_k$第 $k$ 步的奖励被折扣因子 $\gamma^k$ 加权——越远的奖励权重越小
$G_t = \sum_{k=0}^{T-t-1}\gamma^k r_{t+k}$从时刻 $t$ 起的折扣回报(注意:$G_t$ 的折扣是从 $\gamma^0$ 重新计数的)

代入时刻 $t$ 的梯度项:

$$\mathbb{E}\left[\nabla_\theta\log\pi_\theta(a_t|s_t) \cdot R(\tau)\right] = \underbrace{\mathbb{E}\left[\nabla_\theta\log\pi_\theta(a_t|s_t) \cdot \sum_{k=0}^{t-1}\gamma^k r_k\right]}_{= \; 0\text{(过去奖励项)}} + \mathbb{E}\left[\nabla_\theta\log\pi_\theta(a_t|s_t) \cdot \gamma^t G_t\right]$$

为什么第一项 = 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$$
$c = \sum_{k=0}^{t-1}\gamma^k r_k$过去的折扣奖励——在 $a_t$ 之前就已经确定,对 $a_t$ 的期望来说是常数(不管选什么 $a_t$,它都不变)
关键一步$\pi \cdot \dfrac{\nabla\pi}{\pi} = \nabla\pi$ ——这就是 $\log$ 消失的原因:期望自带的 $\pi$ 和 log-derivative 的分母 $\pi$ 恰好约掉
$\sum_a \pi(a|s) = 1$所有动作概率之和永远为 1,常数的梯度 = 0
直觉时刻 $t$ 的决策只能影响未来,不能改变过去。$r_0, \ldots, r_{t-1}$ 都是和 $a_t$ 无关的常数,常数乘以 $\nabla\log\pi$ 的期望等于零(log-derivative + 概率归一化),所以过去奖励是"噪声",去掉后方差更小
通用结论(Score Function Lemma):对任何与动作 $a_t$ 无关的量 $c$(可以是常数、只依赖状态的函数等),都有: $$\mathbb{E}_{a_t \sim \pi}\left[\nabla_\theta\log\pi_\theta(a_t|s_t) \cdot c\right] = 0$$ 本质:log-derivative 把 $\nabla\log\pi$ 还原为 $\nabla\pi/\pi$,和期望中的 $\pi$ 约分后剩下 $\nabla\sum\pi = \nabla 1 = 0$。这个结论后续会反复使用——Baseline 能减、Advantage 能替换 $G_t$,都依赖于此。

所以只剩下 $\gamma^t G_t$,得到最终公式:

REINFORCE 梯度公式(理论形式)
$$\nabla_\theta J = \mathbb{E}_{\tau \sim \pi_\theta}\left[\sum_{t=0}^{T-1} \gamma^t \nabla_\theta \log \pi_\theta(a_t|s_t) \cdot G_t\right]$$
$\gamma^t$时间步 $t$ 的"全局折扣"——越晚的时间步对目标函数贡献越小(因为 $J$ 是从时刻 0 开始算的)
$G_t = \sum_{k=0}^{T-t-1} \gamma^k r_{t+k}$从时刻 $t$ 起的"局部"折扣回报(从 $\gamma^0$ 重新计数)
$\gamma^t \cdot G_t$合在一起 $= \sum_{k=t}^{T-1}\gamma^k r_k$,就是 $R(\tau)$ 中时刻 $t$ 之后的那部分(绝对折扣)
$\nabla_\theta \log \pi_\theta(a_t|s_t)$"增大动作 $a_t$ 出现概率"的梯度方向
REINFORCE 梯度公式(实践形式,更常见)
$$\nabla_\theta J \approx \mathbb{E}_{\tau \sim \pi_\theta}\left[\sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t|s_t) \cdot G_t\right]$$
区别去掉了 $\gamma^t$ 前缀
为什么可以省? $\gamma^t$ 只是给不同时间步加了权重(早期时间步权重大、晚期小)。去掉它不改变梯度方向(最优策略不变),只改变各时间步的相对学习速率
实际效果去掉 $\gamma^t$ 后,晚期时间步也能得到充分学习,训练更稳定。大多数实现和教材使用这个版本
飞镖类比:你往墙上扔飞镖(采样动作),如果扔到靶心($G_t$ 高),你就记住这次的出手角度,下次更倾向这么扔(增大概率)。如果扔歪了($G_t$ 低),你就略微避开这个方向。REINFORCE 就是这个过程的数学表达。
致命缺陷:方差巨大。$G_t$ 是单次采样的实际回报,波动很大。如果奖励总是正的(比如 95-105 之间),所有动作的梯度方向都是"增大概率",模型分不清好坏。需要几千条轨迹才能平均出有效信号。

Step 2: 引入 Baseline → Advantage

解决什么问题

REINFORCE 方差太大。

做法

给 $G_t$ 减去一个只依赖状态的基准值 $b(s_t)$:

加 Baseline 后的梯度
$$\nabla_\theta J = \mathbb{E}\left[\sum_t \nabla_\theta \log \pi_\theta(a_t|s_t) \cdot \underbrace{(G_t - b(s_t))}_{\text{有正有负,方差更小}}\right]$$
$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)$ 时方差最小。

Advantage 函数
$$A_t = G_t - V(s_t)$$
$G_t$这个动作之后实际获得的总回报
$V(s_t)$这个状态下平均能拿的总回报(baseline)
$A_t$差值——这个动作相比平均水平好了多少
不再是"扔到靶子上就加强",而是"比你平时水平好就加强,比平时差就削弱"。一个得分 96 和一个得分 104 的动作,如果平均水平是 100,现在就能清楚区分:-4 vs +4。

为什么减去 $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 → 好动作正向强化,坏动作负向抑制 → 梯度方向清晰

数学本质$\text{Var}(G_t - V) = \text{Var}(G_t)$(减常数不改变方差),但梯度权重从 $[95, 105]$ 变成 $[-5, +5]$,相对差异从 $\frac{10}{100}=10\%$ 放大到 $\frac{10}{5}=200\%$
类比考了 98 分好吗?没有参照就无法判断。班均 60 → 优秀,班均 99 → 偏差。$V(s)$ 就是"班级平均分"
面试要点减去 baseline 不改变梯度的期望(Score Function Lemma 保证),但让权重以零为中心 → 梯度估计的方差更小 → 更少样本即可收敛

实践中 $V(s)$ 从哪里来?——训练一个 Critic 网络

上面的 $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 详细说明。

Advantage 的正式定义:$A(s,a) = Q(s,a) - V(s)$

上面的 $A_t = G_t - V(s_t)$ 其实是下面这个正式定义的采样估计

Advantage 正式定义
$$A^\pi(s,a) = Q^\pi(s,a) - V^\pi(s)$$
$Q^\pi(s,a)$在状态 $s$ 执行动作 $a$,之后按策略 $\pi$ 走的期望总回报:$Q^\pi(s,a) = \mathbb{E}_\pi[G_t \mid s_t=s, a_t=a]$
$V^\pi(s)$在状态 $s$ 按策略 $\pi$ 走的期望总回报(对所有动作取平均):$V^\pi(s) = \mathbb{E}_\pi[G_t \mid s_t=s]$
$A^\pi(s,a)$两者之差——"做了动作 $a$ 之后,比不指定动作(让策略随机选)平均能多拿多少"

$G_t$ 和 $Q(s,a)$ 的关系:

$$G_t \;\text{是}\; Q^\pi(s_t, a_t) \;\text{的一次采样}$$
$Q(s_t, a_t)$期望值(对未来所有可能路径取平均)——需要无数条轨迹才能精确算出
$G_t$单次采样值(这一次实际走出的那条轨迹的回报)——有噪声但无偏
因此$A_t = G_t - V(s_t)$ 就是 $A(s_t, a_t) = Q(s_t,a_t) - V(s_t)$ 的蒙特卡洛估计
后续 TRPO、PPO 公式中出现的 $A^{\pi_{\theta_{old}}}(s,a)$ 和这里的 $A_t$ 是同一个东西,只是写法不同:前者是正式的函数记号(强调"用旧策略估计"),后者是单步采样值。面试时不要把它们当作不同的概念。

Step 3: Actor-Critic(演员-评论家方法)

解决什么问题

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 估计——只需当前奖励和下一状态,无需等轨迹结束:

Actor-Critic 双网络
$$\text{Actor 更新: } \theta \leftarrow \theta + \alpha \cdot \nabla_\theta\log\pi_\theta(a_t|s_t) \cdot \delta_t$$ $$\text{Critic 更新: } \phi \leftarrow \phi - \alpha_c \cdot \nabla_\phi(V_\phi(s_t) - G_t)^2$$
$\delta_t = r_t + \gamma V_\phi(s_{t+1}) - V_\phi(s_t)$TD 残差——"这一步实际收益 $r_t + \gamma V(s_{t+1})$ 比预期 $V(s_t)$ 好了多少"。是 $A(s_t,a_t)$ 的有偏但低方差估计
Actor $\pi_\theta$策略网络——决定做什么动作。$\delta_t > 0$ 时增大该动作概率,$\delta_t < 0$ 时减小
Critic $V_\phi$价值网络——评估状态好坏。训练目标:预测值 $V_\phi(s)$ 逼近真实回报 $G_t$
vs Step 2Step 2 用 $G_t - V(s_t)$(MC 估计,无偏高方差,需跑完轨迹)。Actor-Critic 用 $\delta_t$(TD 估计,有偏低方差,每步即可更新)
实践中基础 Actor-Critic 用 TD 残差,但现代方法(PPO/TRPO/A2C)通常用 GAE($\lambda=0.95$),在 TD 和 MC 之间插值,兼顾低偏差和低方差
核心概念:Bootstrapping$V_\phi(s_{t+1})$ 被当作"未来回报的替代品"直接参与信号计算(自举),而非像 Step 2 老老实实等真实 $G_t$ 出来。代价:若 $V_\phi$ 不准,信号就是错的(偏差来源);收益:不用等轨迹结束即可更新。用了 bootstrapping = Actor-Critic;没用 = REINFORCE + Baseline
为什么 Critic 用 MSE?$V(s)$ 的定义是 $\mathbb{E}[G_t|s]$,最小化 $(V_\phi - G_t)^2$ 的期望,解恰好就是条件期望(下方证明)

为什么最小化 MSE 的解恰好是条件期望?

这是一个基础但重要的数学结论。固定一个状态 $s$,我们要找一个值 $c$(即 $V_\phi(s)$ 应该输出的数),使预测误差最小:

MSE → 条件期望 证明

目标:最小化 $\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)$$
$c^* = \mathbb{E}[G_t|s]$最优预测恰好是条件期望——也就是价值函数 $V^\pi(s)$ 的定义
直觉同一状态 $s$ 出发,每次走的轨迹不同,$G_t$ 每次不一样。要用一个固定的数"代表"这些不同的 $G_t$,MSE 最小的选择就是取平均值
为什么不用 MAE?如果用绝对值误差 $|V_\phi - G_t|$,最优解是条件中位数而非期望,那就不是 $V^\pi(s)$ 了

Actor-Critic 训练流程

两个网络同时训练、交替更新,共享同一批交互数据:

Actor-Critic 训练流程 Actor πθ(策略网络) 输入 s → 输出动作分布 → 采样 a (学生:决定怎么做) Environment 环境 接收 a → 返回 (s′, r, done) (试卷:给出成绩) 动作 a 采集数据:(sₜ, aₜ, rₜ, sₜ₊₁) × 多步 一条或多条轨迹的交互经验 Critic Vφ(价值网络) 输入 s → 输出 Vφ(s)(状态评分) (老师:评估当前局面好坏) 计算 Advantage δₜ = rₜ + γVφ(sₜ₊₁) − Vφ(sₜ) "这一步比预期好了多少"(TD残差) 提供 Vφ(s) A Actor 更新 θ ← θ + α · ∇log πθ(a|s) · δₜ δₜ > 0:增大该动作概率 δₜ < 0:减小该动作概率 C Critic 更新 φ ← φ − αc · ∇φ(Vφ(s) − Gₜ)² 让预测值 Vφ 逼近真实回报 Gₜ (MSE 最优解 = 条件期望 Vπ ↻ 回到 Actor 采新数据,重复上述流程 两个网络在循环中互相促进:Critic 评分更准 → Actor 策略更好 → 数据质量更高
考试类比:Actor 是学生(决定怎么答题),Critic 是老师(给答题表现打分)。学生根据老师的反馈调整答题策略,老师根据最终成绩修正自己的评分标准。两者互相促进。
新问题:步长灾难。标准梯度下降 $\theta \leftarrow \theta + \alpha\nabla J$ 的步长 $\alpha$ 极难选。参数空间一小步可能让某动作概率从 0.5 变到 0.01 → 策略崩溃 → 采集的数据也坏了 → 恶性循环(performance collapse)。

Step 4: TRPO(Trust Region Policy Optimization,信任域策略优化)

解决什么问题

策略更新步长过大会崩溃。

核心思想

不在参数空间限制步长,而在策略分布空间限制——新旧策略的 KL 散度不能超过 $\delta$。

前置:重要性采样(Importance Sampling)

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]$$
$p(x)$目标分布——我们想算期望的那个分布(这里是新策略 $\pi_\theta$)
$q(x)$采样分布——我们实际用来采数据的分布(这里是旧策略 $\pi_{\theta_{old}}$)
$f(x)$任意函数——我们想计算其期望的那个量
$\frac{p(x)}{q(x)}$重要性权重——用来补偿"我从错误的分布采样"带来的偏差
证明$\mathbb{E}_{q}\left[\frac{p(x)}{q(x)}f(x)\right] = \int q(x)\cdot\frac{p(x)}{q(x)}\cdot f(x)\,dx = \int p(x)\cdot f(x)\,dx = \mathbb{E}_p[f(x)]$ ——$q$ 约分

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 方差),还保证状态分布近似有效。

$\frac{\pi_\theta(a|s)}{\pi_{\theta_{old}}(a|s)}$概率比(importance weight)——数据是旧策略采的,新旧概率比用来"校正"分布差异
$A^{\pi_{\theta_{old}}}(s,a)$在旧策略下计算的 advantage(用旧数据的 GAE 估计出来)
$L(\theta)$代理目标——最大化它就近似于最大化真实目标 $J(\theta)$,但只需要旧数据!
直觉新策略比旧策略更喜欢做好动作($A>0$ 时增大概率比)→ $L$ 增大 → 策略改进
近似条件$\pi_\theta$ 和 $\pi_{\theta_{old}}$ 不能差太远,否则一阶近似不准 + 方差爆炸
重要性采样解决了"数据复用"问题:不用每次更新都重新采轨迹。但引入了新问题——如果新旧策略差距太大,概率比 $\frac{\pi_\theta}{\pi_{old}}$ 会变得非常大或非常小,导致估计不可靠。这正是 TRPO/PPO 要解决的。

TRPO 训练流程

TRPO 单轮训练(每轮只更新一次策略)

① 采数据:用当前策略 $\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}$

⑤ 丢弃旧数据,回到 ①

$L(\theta)$ 的角色不是评估指标,而是优化目标——你最大化 $L(\theta)$ 就是在更新策略。它把"用旧数据改进策略"转化为一个标准最优化问题
vs REINFORCEREINFORCE 算一个梯度 → 走一小步(lr=0.001,人工调参)→ 数据即弃。TRPO 用共轭梯度算自然梯度方向(考虑参数空间曲率)+ 线搜索确定最大安全步长 → 信任域内一步到位,"榨干"这批数据的价值
vs PPOPPO 同样最大化 $L(\theta)$,但用 clip 替代 KL 约束 → 可以对同一批数据跑多轮 mini-batch SGD(3-10 epochs),数据效率更高
面试总结REINFORCE = 小步慢走(方向对但步子小);TRPO = 每批数据一步到位(方向+步长都最优,但只用一次);PPO = 同一批数据反复多轮训练(clip 保证安全)
TRPO 优化目标
$$\max_\theta \; \mathbb{E}_t\left[r_t(\theta) \cdot A_t\right] \quad \text{s.t.} \quad \mathbb{E}_t\left[D_{KL}(\pi_{\theta_{old}} \| \pi_\theta)\right] \leq \delta$$
$\mathbb{E}_t[\cdot]$实践简写,等价于 $\mathbb{E}_{(s,a)\sim\pi_{\theta_{old}}}[\cdot]$——对这批旧策略采来的数据中所有时间步取平均
$r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)}$概率比。$r=1$:没变化。$r=2$:新策略对该动作概率翻倍。$r=0.5$:减半
$r_t(\theta)\cdot A_t$好动作($A>0$)→ 想增大 $r$(提高概率);坏动作($A<0$)→ 想减小 $r$
$D_{KL} \leq \delta$硬约束:新旧策略的分布"距离"不超过 $\delta$(通常 0.01)
TRPO 说的是:"你可以改进策略,但每一步只能在旧策略的信任域(trust region)内移动。" 就像走迷宫时每步只能走一小格,确保不会一步踏入死胡同。

为什么约束 KL 散度而不约束参数步长?

参数空间 vs 策略分布空间

参数空间限制 $\|\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)}$$
核心问题参数到概率的映射是非线性的(softmax)。参数空间的"一小步"可能在某些状态导致概率崩塌
TRPO 的洞察我们真正关心的是"策略的行为变了多少",而不是"参数改了多少"
理论保证Kakade & Langford 2002 证明:如果 $D_{KL} \leq \delta$,则新策略的性能下降有理论上界——不会崩溃
缺陷:求解带 KL 约束的优化需要计算 Fisher 信息矩阵(二阶导)、共轭梯度法、line search。实现复杂度高,大模型上不实用。

Step 5: PPO(Proximal Policy Optimization,近端策略优化)— 用 Clip 替代 KL

PPO-Clip 核心公式
$$L^{PPO} = \mathbb{E}_t\left[\min\bigl(\underbrace{r_t(\theta)\cdot A_t}_{\text{未截断目标}},\;\; \underbrace{\text{clip}(r_t(\theta), 1{-}\epsilon, 1{+}\epsilon)\cdot A_t}_{\text{截断后目标}}\bigr)\right]$$
$r_t(\theta)$概率比——新策略 vs 旧策略对该动作的概率之比
$\text{clip}(\cdot, 1{-}\epsilon, 1{+}\epsilon)$把概率比限制在 $[1-\epsilon,\;1+\epsilon]$ 范围内
$\min(\cdot,\cdot)$取两者中更悲观(更保守)的那个
$\epsilon$允许的最大偏离幅度,通常 0.1-0.2
PPO 的哲学:不需要精确计算"新旧策略差了多远"(KL 散度),直接暴力截断——概率比超过 $1\pm\epsilon$ 就不让你继续动了。粗暴但有效,一阶优化器(Adam)就够用。

min() 为什么能实现信任域效果?(形式化分析)

分情况展开 min 的效果

当 $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}$$
关键:min 的作用当 $A_t > 0$ 时,clip 后的值 ≤ 原值,min 取的是 clip 后的(更小=更保守)。当 $A_t < 0$ 时,min 取的也是更小的那个(绝对值更大的惩罚)
不对称性min 只阻止"过度乐观"的更新,不阻止"回退"。即:如果一个本以为好的动作($A>0$),概率已经被大幅降低($r_t < 1-\epsilon$),PPO 不会阻止继续降低——因为这是在修正之前的错误
vs TRPOTRPO 精确计算 KL 散度再约束;PPO 的 clip 是一个下界近似——只要概率比在 $[1-\epsilon, 1+\epsilon]$ 内,KL 散度也一定很小

4. PPO(Proximal Policy Optimization)完全详解

Clip 机制逐情况分析

情况一:$A_t > 0$(好动作)

模型想做的事:增大这个动作的概率 → $r_t$ 增大

clip 的限制:$r_t$ 最多到 $1+\epsilon$

超过后:梯度为零,停止更新

效果:"可以更喜欢这个动作,但别一步到位"

情况二:$A_t < 0$(坏动作)

模型想做的事:减小这个动作的概率 → $r_t$ 减小

clip 的限制:$r_t$ 最低到 $1-\epsilon$

低于后:梯度为零,停止更新

效果:"可以不喜欢这个动作,但别一次改太多"

图解 clip 效果

Aₜ > 0(好动作,想增大概率) 目标值 rₜ 1+ε 1 ← 超过后梯度=0 正常学习区间 Aₜ < 0(坏动作,想减小概率) 目标值 rₜ 1−ε 1 ← 低于后梯度=0 正常学习区间

min 的作用

$\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$ 已经不会增大目标了 → 梯度为零,停止更新。

GAE:Advantage 的实用计算方法

理论上 $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$ 参数在这两个极端之间平滑权衡:

GAE 公式
$$\hat{A}_t^{GAE(\gamma,\lambda)} = \sum_{l=0}^{T-t-1}(\gamma\lambda)^l \cdot \delta_{t+l}$$
$\delta_t = r_t + \gamma V(s_{t+1}) - V(s_t)$TD 误差——"这一步的实际收获($r_t + \gamma V(s_{t+1})$)比预期($V(s_t)$)好/差多少"
$(\gamma\lambda)^l$衰减权重——越远的 TD 误差影响越小
$\lambda = 0$只看当前一步的 TD 误差 → 偏差高、方差低(相信 Critic 的估计)
$\lambda = 1$看到轨迹结束 → 偏差低、方差高(相信真实回报)
$\lambda = 0.95$常用折中值

GAE 公式的推导来源

定义 $n$-步 advantage 估计:

$$\hat{A}_t^{(n)} = \sum_{l=0}^{n-1}\gamma^l r_{t+l} + \gamma^n V(s_{t+n}) - V(s_t) = \sum_{l=0}^{n-1}\gamma^l\delta_{t+l}$$

$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}$。

原理和 TD($\lambda$) 一样:$\lambda$ 控制"短视 vs 远视"的权衡
$\lambda$ 小主要使用 1-step 估计,依赖 $V$ 的准确性(高偏差、低方差)
$\lambda$ 大更多使用 Monte Carlo 信号(低偏差、高方差)
TD 误差 $\delta_t$ 的直觉:你预期自己能考 80 分($V(s_t)$),但实际这次拿了 85 分的感觉($r_t + \gamma V(s_{t+1})$),所以 $\delta_t = +5$——一个"惊喜"。GAE 就是把多步的"惊喜"或"失望"加权求和。

PPO 完整训练循环

PPO 完整训练循环 1 用当前策略 πθ_old 采集一批轨迹 与环境交互得到 (sₜ, aₜ, rₜ, sₜ₊₁) × 多步 2 对每步计算 GAE advantage Âₜ δₜ = rₜ + γV(sₜ₊₁) − V(sₜ),然后 Âₜ = Σ(γλ)ˡδₜ₊ₗ 3 对这批数据做 K 个 epoch 的 mini-batch 梯度更新 K = 3~10,同一批数据反复用 ← PPO 的效率优势(对比 REINFORCE 用一次就扔) 4 扔掉旧数据,θold ← θ,回到步骤 1 新策略的数据分布已变化,旧数据不再有效 → 必须重新采集 循环

PPO 总目标函数

三项加权
$$L^{total} = \underbrace{L^{CLIP}}_{\text{策略更新}} - c_1 \cdot \underbrace{L^{VF}}_{\text{Critic 训练}} + c_2 \cdot \underbrace{S[\pi_\theta]}_{\text{熵奖励}}$$
$L^{CLIP}$PPO 的核心——截断后的策略目标(最大化)
$L^{VF} = (V_\phi(s_t) - G_t)^2$Critic 的均方误差损失——训练价值网络
$S[\pi_\theta] = -\sum_a \pi(a|s)\log\pi(a|s)$策略的熵——鼓励探索,避免过早收敛到单一动作
$c_1, c_2$平衡系数。$c_1 \approx 0.5$,$c_2 \approx 0.01$
命名说明论文称 $L^{total}$ 为"目标函数"(要最大化),但代码中通常写成 loss = -L^{total} 做最小化(优化框架默认行为)。标题写"总损失函数"是代码习惯的叫法

PPO 在 RLHF 中的应用

PPO 是 RLHF 第三步(策略优化阶段)使用的核心算法。RLHF 使用 ORM(Outcome Reward Model,结果奖励模型)——只在整条回复生成完毕后打分,中间步骤只有 KL 惩罚。详见 第 6 节 RLHF 完整流程。关于 ORM vs PRM(过程奖励模型)的区别也在那里。

5. GRPO(Group Relative Policy Optimization,组相对策略优化)详解

动机:PPO 在 LLM 中的痛点

PPO 需要 Critic 网络估计 $V(s)$。在 LLM 场景中,Critic 和 Actor 一样大(几十亿参数),显存直接翻倍。GRPO 的贡献:用一个极简的方法替代 Critic。

GRPO 核心做法

1

采样一组回答

对同一个 prompt $x$,用当前策略 $\pi_{\theta_{old}}$ 一次采样 $G$ 条回答 $\{y_1, y_2, \ldots, y_G\}$($G$ 通常 = 64)

2

各自打分

每条回答获得 reward $r_i$(来自 RM 或规则判定,如数学答案对错)

3

组内标准化得到 Advantage

GRPO Advantage(替代 Critic)
$$\hat{A}_i = \frac{r_i - \text{mean}(\{r_1, \ldots, r_G\})}{\text{std}(\{r_1, \ldots, r_G\})}$$
$r_i$第 $i$ 条回答的 reward 得分
$\text{mean}(\cdot)$组内平均分——充当 baseline(替代 $V(s)$)
$\text{std}(\cdot)$组内标准差——归一化,让 advantage 量级稳定
$\hat{A}_i > 0$这条回答比组内平均好
$\hat{A}_i < 0$这条回答比组内平均差
4

PPO 风格的 Clip 优化

GRPO 优化目标
$$L^{GRPO} = \frac{1}{G}\sum_{i=1}^{G} \frac{1}{|y_i|}\sum_{t=1}^{|y_i|}\left[\min\left(r_{i,t}(\theta) \cdot \hat{A}_i,\; \text{clip}(r_{i,t}(\theta), 1{-}\epsilon, 1{+}\epsilon) \cdot \hat{A}_i\right) - \beta D_{KL}^{(t)}\right]$$
$\frac{1}{G}\sum_{i=1}^{G}$对组内 $G$ 条回答取平均
$\frac{1}{|y_i|}\sum_{t=1}^{|y_i|}$对第 $i$ 条回答的每个 token 取平均
$r_{i,t}(\theta)=\frac{\pi_\theta(a_{i,t}|s_{i,t})}{\pi_{\theta_{old}}(a_{i,t}|s_{i,t})}$第 $i$ 条回答第 $t$ 个 token 的概率比
$\hat{A}_i$整条回答共享同一个 advantage(序列级别)
$\text{clip}(\cdot)$和 PPO 一样的截断机制
$-\beta D_{KL}^{(t)}$显式 KL 惩罚——约束不偏离参考模型太远

Clip 和 KL 惩罚的区别与配合

GRPO 同时使用了 clip 和 KL 惩罚——两者解决的是不同的问题

Clip 截断KL 惩罚
约束对象$\pi_\theta$ vs $\pi_{\theta_{old}}$(相邻迭代)$\pi_\theta$ vs $\pi_{ref}$(当前策略 vs SFT 参考模型)
作用防止"这一次更新比上一次走太远"(局部稳定)防止模型完全忘记 SFT 学到的基本能力(全局锚定)
比喻步子别迈太大别忘了回家的路
为什么两者缺一不可?
只有 clip 没有 KL → 每次只走一小步(clip 满足),但累积几十步后已经完全偏离 SFT 风格,reward hacking。
只有 KL 没有 clip → 单步更新过猛,重要性采样权重爆炸,训练崩溃。
面试常见误区:"PPO 用 clip,GRPO 用 KL"——这是错的。RLHF 语境下的 PPO 和 GRPO 都同时使用 clip + KL。区别只在 PPO 有 Critic 算 advantage,GRPO 用组内均值替代 Critic。标准 PPO(用于游戏/机器人)不需要 KL 因为没有参考模型;但 LLM 对齐场景中,两者都需要 KL 来锚定 SFT 模型。
考试类比:同一道题让模型答 64 遍,有的答对有的答错。答对的属于"好回答"($\hat{A}>0$),答错的属于"差回答"($\hat{A}<0$)。然后用 PPO 的方式加强好回答、削弱差回答。全程不需要另一个模型来评估"这道题有多难"——组内平均分本身就是 baseline。

为什么 Group Mean 能替代 Critic?(理论连接)

GRPO Baseline 的合理性

回顾 Step 2 证明:减去任何与动作无关的常数 $b$,都不改变梯度期望。

$$\text{PPO: } A_t = G_t - V(s_t) \quad \longrightarrow \quad \text{GRPO: } \hat{A}_i = r_i - \overline{r}$$
PPO 的 $V(s_t)$用 Critic 网络估计"平均能得多少分"——需要训练一整个大网络
GRPO 的 $\overline{r}$用同一 prompt 的多次采样取平均——Monte Carlo 估计同样是 $\mathbb{E}[r|x]$ 的无偏估计
核心假设LLM 的"状态"就是 prompt $x$(单步 MDP),所以 $V(s) = \mathbb{E}[r|x] \approx \frac{1}{G}\sum r_i$
标准化(除以 std)让不同 prompt 之间的 advantage 量级一致,稳定训练

KL 惩罚项 $D_{KL}^{(t)}$ 的展开

$$D_{KL}^{(t)} = \frac{\pi_\theta(a_{i,t}|s_{i,t})}{\pi_{ref}(a_{i,t}|s_{i,t})} - \log\frac{\pi_\theta(a_{i,t}|s_{i,t})}{\pi_{ref}(a_{i,t}|s_{i,t})} - 1$$
注意这里的参考模型是 $\pi_{ref}$(SFT 模型),不是 $\pi_{\theta_{old}}$(上一步的策略)
与 PPO 的区别PPO 通过 clip 隐式约束 $\pi_\theta$ 不偏离 $\pi_{\theta_{old}}$;GRPO 额外加了显式 KL 惩罚约束不偏离 $\pi_{ref}$
为什么要这一项?防止 reward hacking——模型可能找到得高分但语义退化的"捷径",KL 约束保持语言质量

两种 KL 形式的区别

当前文档中出现了两种 KL 惩罚公式,它们来自不同的论文,用在不同的场景:

$-\beta\log(\pi_\theta/\pi_{ref})$$\text{ratio} - \log(\text{ratio}) - 1$
来源InstructGPT / 标准 RLHFGRPO / DeepSeek-R1
数学含义KL 散度的一阶近似(只取 log 项)KL 散度的二阶近似,更准确
当 π_θ ≈ π_reflog(ratio) 是 KL 的一阶 Taylor 展开主导项ratio - log(ratio) - 1 始终 ≥ 0,ratio=1 时 = 0
类比用一阶导数近似函数变化(简单够用)用二阶 Taylor 展开近似(更精确)
使用位置PPO 的 reward 中(通过梯度传播实现 KL 约束)GRPO 的损失函数中(显式 KL 项)
本质联系:两种形式都是对 $D_{KL}(\pi_\theta\|\pi_{ref})$ 的近似。当策略变化不大时(π_θ ≈ π_ref),两者效果相近。GRPO 用二阶近似是因为它没有 Critic 网络做精细的优势估计,需要更严格的 KL 约束来防止策略走偏。

GRPO vs PPO 对比

维度PPOGRPO
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)

DeepSeek-R1 中的实践

设计选择做法原因
组大小$G = 64$越大 advantage 估计越稳定
Reward规则判定(对/错)数学/代码答案可验证,无需 RM
起点直接从 base model 开始发现不经 SFT 也能涌现 CoT 推理

6. RLHF(Reinforcement Learning from Human Feedback,人类反馈强化学习)完整流程

1

SFT(Supervised Fine-Tuning)

用人工标注的高质量 (prompt, response) 对做监督微调 → 得到 $\pi_{SFT}$

直觉:让模型先学会"说人话",有基本的指令跟随能力。

2

训练 Reward Model

同一 prompt 生成多个回复 → 人类排序 → 训练打分器

数据收集

对每个 prompt $x$,用 SFT 模型生成 $K$ 个回复 $\{y_1, \dots, y_K\}$,人类标注者从中选出最好的 $y_w$(winner)和最差的 $y_l$(loser),形成偏好对 $(x, y_w, y_l)$。收集数千到数万对这样的数据。

Bradley-Terry 模型推导

人类偏好可以用概率模型刻画——给定两个回复 $y_w$ 和 $y_l$,人认为 $y_w$ 更好的概率:

Bradley-Terry 偏好概率
$$P(y_w \succ y_l \mid x) = \frac{e^{r(x, y_w)}}{e^{r(x, y_w)} + e^{r(x, y_l)}} = \sigma\bigl(r(x, y_w) - r(x, y_l)\bigr)$$
$r(x, y)$Reward 函数——给 prompt $x$ 和回复 $y$ 打一个标量分数,越高表示质量越好。这里 $r(\cdot)$ 就是正在训练的 Reward Model 的输出
$r(x, y_w)$Reward Model 给 winner 回复的打分
$r(x, y_l)$Reward Model 给 loser 回复的打分
$\sigma(z) = \frac{1}{1+e^{-z}}$sigmoid 函数——把任意实数映射到 (0, 1)
$r(x, y_w) - r(x, y_l) > 0$分数差为正 → $P > 0.5$,人更可能选 $y_w$
$r(x, y_w) - r(x, y_l) \gg 0$差越大 → $P \to 1$,人几乎一定选 $y_w$
$r(x, y_w) - r(x, y_l) \approx 0$差接近零 → $P \to 0.5$,两个回答差不多好
从偏好概率到训练损失

给定一个偏好对 $(x, y_w, y_l)$,我们希望 RM 预测的偏好概率尽可能接近 1(即人选 $y_w$ 这件事应该被 RM 高概率预测)。用负对数似然作为损失:

RM 损失函数
$$L_{RM} = -\mathbb{E}_{(x, y_w, y_l)}\left[\log P(y_w \succ y_l \mid x)\right] = -\mathbb{E}\left[\log \sigma\bigl(r(x, y_w) - r(x, y_l)\bigr)\right]$$
$r(x, y)$Reward 函数——Reward Model 给 prompt+回复 打的标量分数
直觉最大化 $\log\sigma(\text{分数差})$ → 让好回答分数远高于差回答
当 $r(y_w)-r(y_l) \to +\infty$$\sigma \to 1$,$\log\sigma \to 0$,损失最小
当 $r(y_w)-r(y_l) \to -\infty$$\sigma \to 0$,$\log\sigma \to -\infty$,损失极大
RM 的参数化$r(x,y)$ 通常就是 SFT 模型加一个线性头(scalar output),从预训练好的语言模型初始化

直觉:训练一个"裁判",通过看大量人类偏好对学会了什么是"好回答"。

3

PPO / GRPO 优化策略

用 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。

PPO 阶段的 Reward 设计

LLM 生成是序列决策问题——每一步选一个 token,生成 $T$ 步后得到完整回复。Reward 分为两部分:

每步 Reward(含 KL 惩罚)
$$R_t = \begin{cases} -\beta \log\dfrac{\pi_\theta(a_t|s_t)}{\pi_{ref}(a_t|s_t)} & t < T \text{(中间步:仅 KL 惩罚)}\\[10pt] r_{RM}(x, y) - \beta \log\dfrac{\pi_\theta(a_T|s_T)}{\pi_{ref}(a_T|s_T)} & t = T \text{(最后一步:RM 打分 + KL 惩罚)}\end{cases}$$
$\pi_\theta$正在训练的 Actor 策略
$\pi_{ref}$参考模型 = SFT 模型,冻结不动,用作 KL 约束的锚
$\log\frac{\pi_\theta}{\pi_{ref}}$概率比值取 log——衡量 $\pi_\theta$ 偏离 $\pi_{ref}$ 的程度
当 $\pi_\theta > \pi_{ref}$比值 > 1,log > 0,$-\beta \log(\cdot)$ 是负奖励(惩罚),防止模型对某些 token"过度自信"
当 $\pi_\theta < \pi_{ref}$比值 < 1,log < 0,$-\beta \log(\cdot)$ 是正奖励,鼓励模型降低对某些 token 的偏好
本质不是"让输出不要太确定",而是分布对齐——强迫 $\pi_\theta$ 的 token 概率分布形状接近 $\pi_{ref}$,防止"走偏"成参考模型完全不会的奇怪输出
$r_{RM}(x, y)$Reward Model 给整条回复的打分,只在最后一步 $t=T$ 时给出
$\beta$KL 强度系数。典型值 0.01~0.05,越大约束越紧
直觉整个过程像"走钢丝"——每步 KL 拉着你别偏离 SFT 风格太远,走到终点时 RM 给一个总评。优化的目标:在 KL 预算内,让 RM 打分尽可能高
Reward Hacking如果没有 KL 约束,模型会学会讨好 RM 的极端行为(如反复说"您说得对"),KL 强迫模型保持输出风格
为什么叫"KL 惩罚"?真正的 KL 散度公式是 $D_{KL}(\pi_\theta\|\pi_{ref}) = \sum_a \pi_\theta(a|s)\log\frac{\pi_\theta(a|s)}{\pi_{ref}(a|s)}$,需要对所有 token 求和。而这里的 $-\log\frac{\pi_\theta}{\pi_{ref}}$ 只算了当前 token——但它对 $\pi_\theta$ 的期望值恰好等于 $-D_{KL}$,是 KL 散度的无偏估计。实际训练每次只采样一个 token,用这一项做 reward,期望意义下和完整 KL 等价
ORM vs PRM:两种 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 惩罚
最后步 RewardORM 打分 + KL 惩罚ORM/PRM 打分 + KL 惩罚
适用场景通用对话、创意写作数学推理、代码生成、多步任务
训练数据整条回复的人类偏好排序每步中间过程的人类标注(如推理步骤正确与否)
典型用法标准 RLHF + PPORLVR(DeepSeek-R1 的 GRPO)

核心区别:ORM 看"结果好不好",PRM 看"每一步推得对不对"。数学题中,ORM 只能判断最终答案对错,PRM 能在中间步骤就识别出"这一步推导错了",给及时的负反馈。

面试注意:RLHF 默认用 ORM;DeepSeek-R1 的 RLVR 本质是规则版 PRM——用程序验证每一步推理是否正确,不需要训练 RM。

"RLHF 把人类偏好转化为优化信号来对齐 LLM。三步走:SFT 得基础策略,人类偏好排序训练 Reward Model,PPO 用 RM 打分做策略优化并加 KL 约束防止 reward hacking。近期趋势是用 DPO 简化流程或 GRPO 减少计算开销。"

7. RLVR(Reinforcement Learning with Verifiable Rewards,可验证奖励强化学习)范式详解

什么是 RLVR?

RLVR = Reinforcement Learning with Verifiable Rewards,即"用可验证的奖励信号做强化学习"。它不是一个具体算法,而是一个训练范式——描述的是 reward 从哪来,而不是怎么优化。

概念层次区分
RLVR范式——reward 怎么来(可验证规则判定,如对/错)
GRPO / PPO算法——拿到 reward 后怎么更新策略
DeepSeek-R1= RLVR 范式 + GRPO 算法

RLVR 在整体知识体系中的位置

LLM 训练范式 RLHF reward 从人类偏好学习(需 RM) PPO DPO (跳过 RM) RLVR reward 来自可验证规则(不需 RM) 当前主流 GRPO PPO REINFORCE (DeepSeek-R1) RLAIF reward 从 AI 反馈学习 PPO / DPO RLHF 适用场景 主观任务:对话、写作、创意 RLVR 适用场景 可验证任务:数学、代码、逻辑 RLAIF 适用场景 标注成本高、AI 可替代人类判断 核心区分:三者的差异在于 reward 来源,而非优化算法 同一个优化算法(如 PPO)可以服务于任何一种范式

为什么 RLVR 突然火了?

传统 RLHF 依赖训练出来的 Reward Model,有三个致命问题:

问题表现RLVR 如何解决
Reward Hacking模型学会讨好 RM 而非真正变好规则判定不可被 hack(对就是对)
RM 泛化误差RM 在分布外样本上打分不准规则判定在任何样本上都精确
训练成本高RM 需要大量人类标注 + 训练无需 RM,零额外训练成本

RLVR 的标志性发现(DeepSeek-R1)

从 base model 出发,仅用 RLVR(数学题对错作为 reward),不经过 SFT,模型能自发涌现:Chain-of-Thought 推理、自我纠错、反思回溯、分步验证。这打破了"需要先 SFT 教会推理格式"的传统假设。

RLVR 的 Reward 设计

RLVR 中 reward 的典型形式:

可验证 Reward 的常见设计
$$r(x, y) = \begin{cases} +1 & \text{答案正确(通过验证)} \\ -1 \text{ 或 } 0 & \text{答案错误} \end{cases}$$
$x$问题/任务(如一道数学题)
$y$模型生成的完整回答(含推理过程)
验证方式数学:提取最终答案对比标准答案;代码:运行测试用例
注意reward 只看最终答案对错(outcome-level),不管推理过程

更精细的 reward 设计也可加入格式奖励:

$$r(x, y) = r_{accuracy}(x, y) + \alpha \cdot r_{format}(y)$$
$r_{accuracy}$答案正确性(+1 / 0)
$r_{format}$格式奖励——是否使用了指定的思考标签(如 <think>...</think>)
$\alpha$格式奖励权重(通常很小,如 0.1)

RLVR 的适用边界

可以用 RLVR不能用 RLVR
数学题(答案可验证)开放式对话(无标准答案)
代码生成(可跑测试)创意写作
逻辑推理(可形式化验证)情感共鸣、风格偏好
事实问答(有确定答案)复杂多维度对齐(有用+无害+诚实)
工具调用(执行成功/失败)主观质量评估
RLVR 不是万能的。对于"好坏没有客观标准"的任务(对话、写作、情感),仍需 RLHF/DPO。当前最强的模型通常是 RLVR(提升推理)+ RLHF(提升对齐) 的组合。

RLVR vs RLHF 完整对比

维度RLHFRLVR
Reward 来源训练出来的 Reward Model可验证的规则/程序
Reward 准确性有误差(RM 泛化有限)100% 准确(规则不出错)
是否可被 Hack是(模型学会讨好 RM)否(对就是对,无捷径)
数据需求大量人类偏好标注只需问题+标准答案
适用任务开放式、主观性任务答案可验证的客观任务
训练成本高(4个模型 + 标注成本)低(无 RM,规则验证近乎免费)
涌现能力有限可涌现 CoT、自我纠错(DeepSeek-R1)
代表工作InstructGPT、ChatGPTDeepSeek-R1、Qwen-2.5-Math

RLVR 的进阶话题

Outcome Reward vs Process Reward

标准 RLVR 只看最终答案对错(Outcome-level),但也可以做更细粒度的过程监督:

Outcome Reward (ORM)Process Reward (PRM)
打分粒度整条回答给一个分推理链每一步各给一个分
信号密度稀疏(只有结尾一个信号)密集(每步都有反馈)
标注成本低(只需验证最终答案)高(需要逐步标注正误)
效果对简单任务够用多步推理中显著更强(OpenAI 实证)
是否仍是 RLVR?如果每步可自动验证则是;需要人类标注则退化为 RLHF

RLVR 能涌现推理的原因(直觉解释)

为什么只奖励"答案对"就能让模型自发学会"想过程"?因为复杂题目直接猜答案几乎不可能得分,而"先思考、分步骤、验证中间结果"是唯一能稳定提升正确率的策略。RL 的探索机制自然会发现并强化这种策略。模型不是被教会推理的,而是在 reward 信号的引导下自己发现推理是"得分最高的行为模式"。

面试中怎么讲 RLVR

"RLVR 是用可验证的奖励信号做强化学习的范式,区别于 RLHF 依赖训练出来的 Reward Model。优势是 reward 完全准确、不可被 hack,代价是只能用在答案可验证的任务上。DeepSeek-R1 证明了 RLVR + GRPO 能从 base model 涌现推理能力,是当前提升 LLM 推理能力的主流范式。"
追问:RLVR 的局限?
"核心局限是 reward 必须可验证。开放式生成、风格偏好、复杂对齐仍需 RLHF/DPO。另外只用 outcome reward 信号稀疏,复杂推理可能需要 process reward 辅助,但后者的自动验证成本高。当前最强模型通常是 RLVR + RLHF 的组合。"

8. DPO(Direct Preference Optimization,直接偏好优化)公式推导

核心洞察

DPO 证明了:不需要单独训练 Reward Model,偏好数据可以直接优化策略。

推导过程

Step 1: RLHF 目标的解析解

RLHF 优化目标
$$\max_\pi \; \mathbb{E}_{y \sim \pi}[r(x,y)] - \beta\, D_{KL}[\pi(y|x) \| \pi_{ref}(y|x)]$$
$\mathbb{E}[r(x,y)]$最大化 RM 给的奖励
$-\beta D_{KL}$但不要偏离参考模型太远
本质在"追求高奖励"和"不要跑偏"之间做平衡

闭合形式最优解的推导

当前 HTML 直接给出了最优解,下面展开完整的 4 步推导:

1

展开 KL 散度

KL 散度的定义:

$$D_{KL}[\pi(y|x)\|\pi_{ref}(y|x)] = \sum_y \pi(y|x) \log\frac{\pi(y|x)}{\pi_{ref}(y|x)}$$
展开目标$\max_\pi \sum_y \pi(y|x)r(x,y) - \beta\sum_y \pi(y|x)\log\frac{\pi(y|x)}{\pi_{ref}(y|x)}$
2

Lagrange 乘子法(加约束 $\sum_y\pi(y|x)=1$)

$$\mathcal{L} = \sum_y \pi(y|x)r(x,y) - \beta\sum_y \pi(y|x)\log\frac{\pi(y|x)}{\pi_{ref}(y|x)} + \lambda\left(1 - \sum_y \pi(y|x)\right)$$
第一项期望奖励
第二项KL 惩罚
第三项概率归一化约束($\lambda$ 为 Lagrange 乘子)
3

对 $\pi(y|x)$ 求导,令导数 = 0

利用 $\frac{d}{dx}(x\log x) = 1+\log x$:

$$\frac{\partial\mathcal{L}}{\partial\pi(y|x)} = r(x,y) - \beta\left(1 + \log\frac{\pi(y|x)}{\pi_{ref}(y|x)}\right) - \lambda = 0$$

整理:

$$\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}}$$
$-1-\frac{\lambda}{\beta}$是与 $y$ 无关的常数,后面会被归一化吸收
4

代入归一化约束,得到最优解

$$\pi^*(y|x) = \pi_{ref}(y|x) \cdot e^{\frac{1}{\beta}r(x,y)} \cdot \underbrace{e^{-1-\frac{\lambda}{\beta}}}_{1/Z(x)}$$ $$\pi^*(y|x) = \frac{1}{Z(x)} \pi_{ref}(y|x) \cdot e^{\frac{1}{\beta}r(x,y)}$$
$Z(x)$归一化常数,由 $\sum_y\pi^*(y|x)=1$ 确定:$Z(x)=\sum_y\pi_{ref}(y|x)\,e^{\frac{1}{\beta}r(x,y)}$
直觉参考模型概率 × reward 指数加权——reward 越高,概率放大越多

Step 2: 反解出 Reward

对最优解两边取 log:

$$\log\pi^*(y|x) = \log\pi_{ref}(y|x) + \frac{1}{\beta}r(x,y) - \log Z(x)$$

移项,解出 $r(x,y)$:

$$r(x,y) = \beta\log\frac{\pi^*(y|x)}{\pi_{ref}(y|x)} + \beta\log Z(x)$$
$\beta\log\frac{\pi^*}{\pi_{ref}}$最优策略相对参考模型的对数概率比——"最优策略有多偏好这个回答"
$\beta\log Z(x)$只依赖 $x$ 的常数项——下一步会消掉
关键洞察reward 可以用"策略的对数概率比"来表示!不需要单独训练 RM

Step 3: 代入偏好模型,$Z(x)$ 消掉

Bradley-Terry 偏好模型:$P(y_w \succ y_l) = \sigma(r(x,y_w) - r(x,y_l))$

把 Step 2 的 reward 代入,做差:

$$r(x,y_w) - r(x,y_l) = \beta\log\frac{\pi^*(y_w|x)}{\pi_{ref}(y_w|x)} + \cancel{\beta\log Z(x)} - \beta\log\frac{\pi^*(y_l|x)}{\pi_{ref}(y_l|x)} - \cancel{\beta\log Z(x)}$$
$\cancel{\beta\log Z(x)}$两个 reward 共享同一个 prompt $x$,所以 $Z(x)$ 项相减为零——消掉了!
结果偏好概率只取决于概率比的差,不需要知道归一化常数

用可训练的 $\pi_\theta$ 替代理论上的 $\pi^*$,取负对数似然作为损失函数:

DPO 最终损失函数
$$L_{DPO} = -\mathbb{E}_{(x, y_w, y_l)}\left[\log\sigma\left(\beta \log\frac{\pi_\theta(y_w|x)}{\pi_{ref}(y_w|x)} - \beta \log\frac{\pi_\theta(y_l|x)}{\pi_{ref}(y_l|x)}\right)\right]$$
$\beta\log\frac{\pi_\theta(y_w|x)}{\pi_{ref}(y_w|x)}$好回答的隐式奖励——当前模型相比参考模型更偏好好回答的程度
$\beta\log\frac{\pi_\theta(y_l|x)}{\pi_{ref}(y_l|x)}$坏回答的隐式奖励——当前模型相比参考模型更偏好坏回答的程度
两者之差好回答的隐式奖励应该高于坏回答——和训练 RM 的逻辑一模一样
$\sigma(\cdot)$把差值映射到 (0,1),表示"模型认为 $y_w$ 比 $y_l$ 好"的概率
$-\log$极大似然——让这个概率尽量接近 1
$\beta$放大/缩小隐式奖励的差异。$\beta$ 大 → 保守;$\beta$ 小 → 激进

为什么一个损失同时完成"打分+优化"?

核心洞察:π* 和 r(x,y) 有解析关系。Step 1-2 证明了最优策略 π* 和最优 reward 之间存在确定公式:$r(x,y) = \beta\log\frac{\pi^*(y|x)}{\pi_{ref}(y|x)} + \text{常数}$。反过来,如果 π_θ 逼近 π*,那用 π_θ 代进去算出的"隐式 reward"就逼近最优 reward。所以 DPO 的逻辑链是:最小化损失 → π_θ → π* → 隐式 reward → 最优 reward。跳过了"先训练 RM 再训练策略"两步,一步到位。

梯度的直觉

DPO 梯度
$$\nabla_\theta L \propto -\beta\;\underbrace{\sigma(\hat{r}_l - \hat{r}_w)}_{\text{自适应权重}}\;\left[\underbrace{\nabla_\theta\log\pi_\theta(y_w|x)}_{\text{增大好回答概率}} - \underbrace{\nabla_\theta\log\pi_\theta(y_l|x)}_{\text{减小坏回答概率}}\right]$$
$\propto$省略了期望 $\mathbb{E}_{(x,y_w,y_l)}$ 和常数因子——梯度下降只关心方向,不关心全局缩放
$\sigma(\hat{r}_l - \hat{r}_w)$当模型还搞错排序(给坏回答更高隐式奖励)时 → 接近 1 → 梯度大,用力纠正
当模型学对了时$\hat{r}_w > \hat{r}_l$ → $\sigma$ 接近 0 → 梯度小,几乎不更新
作用自适应加权——该学的地方用力学,已学会的不浪费
DPO 的优美之处:一个损失函数同时完成了"学会打分"和"优化策略"两件事,数学上等价于先训练 RM 再做 PPO,但实操上只需一阶段训练。

9. Reward 设计方法论

Reward 来源的完整谱系

类型做法适用场景代表
手工设计人为定义奖励规则目标可量化(游戏、机器人)CartPole、围棋
从人类偏好学习训练 Reward Model目标模糊主观(文本质量)RLHF
逆强化学习 (IRL)从专家轨迹反推 reward有演示但 reward 未知自动驾驶、GAIL
内在奖励好奇心/新颖性驱动外部奖励稀疏ICM、RND
基于规则答案对错的确定性判定数学/代码推理DeepSeek-R1
过程奖励 (PRM)对推理链每步打分多步推理OpenAI "Let's Verify"
自我奖励LLM 自评自改自我改进循环Meta Self-Rewarding

Reward Shaping 的风险与理论

风险:shaping 不当 → reward hacking。例如给"靠近目标"加分,agent 在目标旁反复晃动刷分而不完成任务。

安全的 Reward Shaping(Ng 1999)
$$F(s, s') = \gamma\Phi(s') - \Phi(s)$$
$\Phi(s)$势函数——只依赖状态的标量函数
保证基于势函数的 shaping 不改变最优策略,只加速学习
"Reward 来源取决于任务特性。目标可量化就手工定义;目标模糊就从人类偏好学习(RLHF);有专家演示就用 IRL;外部信号稀疏就加内在奖励。LLM 领域近期趋势是规则 reward(可验证任务)和 PRM(过程监督)。"

10. 算法对比总结

策略优化算法对比

算法核心思想优势劣势适用场景
REINFORCE回报加权梯度简单、理论优美方差大、效率差教学
A2C/A3CActor-Critic + 并行方差低、可并行步长敏感Atari
TRPOKL 约束信任域理论保证单调改进二阶优化慢需要稳定性保证
PPOclip 近似信任域简单、稳定、通用需要 Critic、超参敏感通用(游戏/机器人/LLM)
SAC最大熵 off-policy数据效率高、探索好仅限连续动作机器人控制
GRPO组内相对排名省显存、无 Critic需多次采样、序列级 ALLM 推理对齐

对齐算法对比

算法需要 RM?数据需求复杂度效果上限
RLHF (PPO)是(显式)pairwise 偏好高(4 个模型)最强(在线采样)
DPO否(隐式)pairwise 偏好低(1 阶段)接近 RLHF
GRPO可选可验证 reward中(无 Critic)推理任务强
KTO二元标签数据少时优势
Online DPO在线偏好强于离线 DPO
RLVR + GRPO否(规则验证)问题+标准答案推理任务最强

如何选择?

通用游戏/机器人 → PPO(最稳)
LLM 通用对齐,资源有限 → DPO(最简)
LLM 推理(数学/代码) → RLVR + GRPO(DeepSeek-R1 路线)
偏好数据少 → KTO(只需好/坏标签)
追求最佳效果 → Online RLHF 或 Iterative DPO

算法数据使用方式对比

算法年份核心思路每批轨迹数每批更新代表应用
REINFORCE1992回报加权梯度:一条轨迹算 $G_t$ → 对整批轨迹的 $\nabla\log\pi \cdot G_t$ 平均 → 走一步梯度~64-256 条1 次教学
TRPO2015信任域优化:拆为独立样本构建 $L(\theta)$ → 共轭梯度一步到位找最优 → 同批只优化一次~64-256 条1 次已淘汰
PPO2017clip 信任域:同 TRPO 拆样本 → 对同批数据打乱分 mini-batch 跑 3-10 轮 SGD~64-256 条3-10 epochs通用主力
GRPO2024组内相对排名:同一 prompt 生成 N 个输出 → 组内排序得 $\hat{A}_i$ → 类 PPO clip 优化每 prompt N=4-16 个输出多轮LLM 推理
DPO2023直接偏好优化:偏好对 $(y_w,y_l)$ 做分类式训练(交叉熵),无 RL 采样循环离线数据集(数千-数万对)多轮 SGD轻量对齐
RLHF(PPO)2022在线 RLHF:模型在线生成 → RM 打分 → PPO 优化 → 再生成,循环迭代~64-256 条多轮对话对齐

演进哲学

RL 算法演进遵循奥卡姆剃刀——不是"越简单越好",而是"不引入不必要的复杂度"。每次简化都有隐含条件,条件打破时就要退回更通用的方法。TRPO→PPO:clip 在实践中够用。PPO→GRPO:LLM 场景下 Critic 不划算。RLHF→DPO:数据分布接近时无需显式 RM。

11. 经典 RL 算法详解(DQN / DDPG / TD3 / SAC)

前面章节聚焦 Policy Gradient 系列(适合 LLM 对齐),这里补齐 Value-basedOff-policy Actor-Critic 算法族,面试中经常作为"RL 基本功"考察。

算法族谱:Value-based(DQN)→ 确定性策略(DDPG)→ 修正高估(TD3)→ 最大熵(SAC)。演进主线是:从离散动作 → 连续动作 → 更稳定 → 更好探索

DQN — Deep Q-Network (Mnih et al., 2015)

核心思想

用神经网络近似动作价值函数 $Q(s,a;\theta)$,选动作时取 $a^* = \arg\max_a Q(s,a)$。本质是把 Q-learning 的 Q-table 换成深度网络。

DQN TD Target
$$y_t = r_t + \gamma \max_{a'} Q_{\theta^-}(s_{t+1}, a')$$
$Q_{\theta^-}$Target Network(冻结的旧网络),定期从主网络 $\theta$ 同步
$\max_{a'}$取所有动作的最大 Q 值——这正是 DQN 只适合离散动作空间的原因
DQN Loss
$$\mathcal{L}(\theta) = \mathbb{E}_{(s,a,r,s') \sim \mathcal{D}}\left[(y_t - Q_\theta(s,a))^2\right]$$
$\mathcal{D}$Experience Replay Buffer — 存储历史 transition,随机采样打破时间相关性

三大关键技巧

(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 → 从纯探索渐变为纯利用。

DQN 变体演进

变体解决的问题核心改动
Double DQNQ 值过高估计选动作用主网络,评估用 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)
面试高频追问:"为什么 LLM 不用 DQN?" 答:DQN 需要 $\arg\max_a Q(s,a)$ 遍历所有动作。LLM 的动作空间 = 词表大小(32K-100K+ tokens),无法逐个算 Q 值再取 max。而 Policy Gradient 直接输出动作概率分布,天然适合超大离散空间。

DDPG — Deep Deterministic Policy Gradient (Lillicrap et al., 2016)

核心思想

把 DQN 扩展到连续动作空间。用确定性策略 $\mu_\theta(s)$ 直接输出动作值(而非概率分布),结合 off-policy Actor-Critic 框架。

确定性策略梯度(DPG 定理)
$$\nabla_\theta J = \mathbb{E}_{s \sim \mathcal{D}}\left[\nabla_a Q_\phi(s, a)\big|_{a=\mu_\theta(s)} \cdot \nabla_\theta \mu_\theta(s)\right]$$
$\mu_\theta(s)$Actor 网络——输入状态,输出确定性动作(一个实数向量)
$Q_\phi(s,a)$Critic 网络——评估 (s, a) 对的 Q 值
链式法则Actor 的梯度通过 Critic 的 $\nabla_a Q$ 传播 → Actor 朝"让 Q 更大的方向"更新
Critic Loss(同 DQN)
$$\mathcal{L}(\phi) = \mathbb{E}\left[(r + \gamma Q_{\phi^-}(s', \mu_{\theta^-}(s')) - Q_\phi(s, a))^2\right]$$
$\phi^-$, $\theta^-$Target networks,用 soft update:$\theta^- \leftarrow \tau\theta + (1-\tau)\theta^-$,$\tau$ 通常 0.005

关键设计

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 函数容易高估(overestimation)→ 策略学到"骗 Critic"的动作 → 训练崩溃。对超参(lr、噪声、网络结构)极度敏感。这正是 TD3 和 SAC 要解决的问题。

TD3 — Twin Delayed DDPG (Fujimoto et al., 2018)

核心思想

针对 DDPG 的 Q 值高估和训练不稳定,提出三个精巧修复。

三大改进

(1) Twin Q-networks(双 Q 网络):训练两个独立的 Critic $Q_{\phi_1}$、$Q_{\phi_2}$,TD target 取 min:

TD3 Target(Clipped Double-Q)
$$y = r + \gamma \min(Q_{\phi_1^-}(s', \tilde{a}'), \; Q_{\phi_2^-}(s', \tilde{a}'))$$
$\min$取两个 Critic 的较小值 → 系统性地压低高估
$\tilde{a}'$target policy 加 clipped 噪声(Target Policy Smoothing)

(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 函数。

TD3 vs DDPG 总结:TD3 = DDPG + 三个防高估 trick。代码改动很小但效果提升显著。TD3 在连续控制任务上几乎全面优于 DDPG。

SAC — Soft Actor-Critic (Haarnoja et al., 2018)

核心思想

最大熵强化学习——不仅最大化累积奖励,还最大化策略的熵(随机性),鼓励探索。

SAC 目标函数(最大熵 RL)
$$J(\pi) = \sum_t \mathbb{E}\left[r(s_t, a_t) + \alpha \mathcal{H}(\pi(\cdot|s_t))\right]$$
$\mathcal{H}(\pi) = -\mathbb{E}[\log\pi(a|s)]$策略的熵——越大表示策略越"随机"
$\alpha$温度系数——控制 reward 和 entropy 的权衡。SAC v2 自动调节 α
直觉让策略"在能拿到差不多 reward 的所有动作中尽量随机" → 保持探索
Soft Bellman 方程
$$Q(s,a) = r + \gamma \mathbb{E}_{s'}\left[V(s')\right], \quad V(s) = \mathbb{E}_{a \sim \pi}\left[Q(s,a) - \alpha\log\pi(a|s)\right]$$
Soft VV 函数包含了熵项 → "好状态"不仅 reward 高,还保持了行动自由度

关键设计

随机策略: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 方法。

SAC 为什么是 Off-policy 标杆

  • 探索强:最大熵目标天然鼓励探索,无需手工设计噪声
  • 鲁棒:对超参不敏感(自动调 α),比 DDPG/TD3 更难崩
  • 数据效率高:off-policy + replay buffer → 样本可复用
  • 理论优美:最大熵框架统一了探索和利用

四算法对比总结

算法年份动作空间PolicyOn/Off核心创新适用场景
DQN2015离散隐式 (argmax Q)OffReplay + Target NetAtari 游戏
DDPG2016连续确定性OffDPG 定理 + Soft Update机器人控制
TD32018连续确定性OffTwin Q + Delayed Update连续控制
SAC2018连续随机Off最大熵 + 自动 α机器人/自动驾驶

为什么 LLM 对齐用 PPO/GRPO 而不是这些?

  • 动作空间不匹配:DQN 需 argmax 遍历动作(词表太大不可行);DDPG/TD3/SAC 面向连续动作空间(token 是离散的)
  • 分布偏移严重:Off-policy 在 LLM 超高维离散空间中 importance sampling 方差爆炸
  • On-policy 采样成本可接受:LLM 推理快(vLLM 加速),重新 rollout 比维护巨大 replay buffer 更实际
  • KL 约束是核心需求:LLM 对齐需要锚定 reference model,PPO/GRPO 天然支持 KL penalty,off-policy 方法不自然

唯一例外:ILQL / Offline RL for LLM 等工作尝试用 off-policy 方法做 LLM 对齐,但效果普遍不如 PPO/DPO/GRPO。

12. RL Training Harness(训练基础设施)

为什么需要专门的 RL Harness?

RL 训练不同于 SFT:需要 rollout(在线推理生成)→ reward 计算 → policy update 三者协调。Agentic RL 更需要环境交互、sandbox 调度、多轮 trajectory 管理。一个好的 Harness 解决三件事:(1) rollout 吞吐量 (2) 训练与推理的资源编排 (3) 环境/sandbox 管理。

12.1 RL 训练全流程 Pipeline

标准 On-policy RL 训练循环:
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。

12.2 Rollout 加速

技术原理加速比
vLLM Continuous Batching动态合并不等长请求 → 避免 padding 浪费 → PagedAttention 管理 KV Cache5-10×
Prefix Caching同一 prompt 的 G 条采样共享 KV Cache 前缀(RadixAttention)G 条共享 → 近 G× prompt 部分
Tensor Parallel Rollout大模型跨卡分片推理 → 单条 latency 降低线性于 TP 数
Speculative Decoding小模型 draft + 大模型 verify → 降低 latency2-3× latency

12.3 Sync vs Async 架构

同步 (Sync)异步 (Async)
流程rollout 完 → train → 再 rolloutrollout 持续跑,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 传数据。

12.4 框架对比

框架后端Rollout特色适用
OpenRLHFRay + DeepSpeedvLLM (Ray Actor)算法全面,70B+ 可用大规模生产
VERLFSDP / MegatronvLLM (同卡切换)资源弹性,原生 multi-turnAgentic RL
TRLHuggingFace原生 generate上手快,生态好研究/小模型
NeMo-AlignerMegatron内置原生 TP/PPNVIDIA 生态

12.5 Sandbox 与环境管理(Agentic RL 核心)

为什么需要 Sandbox:Agent RL 中模型生成的 action 需要在真实环境中执行(运行代码/调 API/浏览网页),但要:安全隔离 + 可重置 + 高并行。

方案实现特点
Docker 容器池预启动 N 个容器,按需分配给 rollout隔离好、标准化、SWE-bench 方案
gVisor / Firecracker轻量虚拟化,微秒级启动更安全、更快、适合大规模并行
E2B / Modal云端 sandbox 服务无需自建,按需付费
模拟环境工具调用用 mock 或 LLM 模拟快但不真实,适合预训练阶段

关键工程挑战:

  • 并行度:G=16 × batch_size=64 = 1024 个 sandbox 同时运行
  • 状态管理:多轮任务需要 sandbox 持久化状态(文件系统/数据库)
  • 超时处理:工具执行可能 hang → 需要超时 kill + fallback
  • Cost:sandbox 计算开销可能超过 rollout 本身 → 需要智能调度和 early termination

12.6 权重同步与资源编排

核心矛盾:Rollout 需要最新权重做推理(on-policy 保证),但 train 阶段权重在持续更新 → 如何高效同步?

  • 全量广播:train 完毕 → 把完整权重发给所有 rollout worker。简单但带宽大(70B 模型 = ~140GB)
  • 增量同步:只传 LoRA delta / 更新过的层 → 减少传输量
  • 同卡切换(VERL):同一 GPU 在 train/rollout 间切换 → 无需传输,但要处理显存腾挪(offload/reload)

VERL 的 FSDP ↔ vLLM 切换:

  1. Train 阶段:FSDP 分片存储权重 → 每卡只存 1/N 参数
  2. 切换到 Rollout:all-gather 合并完整权重 → 加载到 vLLM 引擎
  3. Rollout 完成:释放 vLLM 引擎显存 → 恢复 FSDP 分片

Harness 高频面试问答

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 计算,不等最慢的 → 管道式处理减少等待。

13. 高频面试问答

Q: On-policy vs Off-policy?

On-policy:用当前策略 π_θ 采的数据更新 π_θ,数据用完即丢。下一轮必须重新采样。代表:PPO、A2C、REINFORCE、GRPO。

Off-policy:可以用历史数据(旧策略采的)更新当前策略,数据存 Replay Buffer 反复用。代表:DQN、SAC、DDPG。

PPO 的特殊性:严格 on-policy,但一批数据做多 epoch 更新(3-10 次),是折中方案。

Q: DQN(Deep Q-Network)是什么?

核心:用神经网络近似 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 不现实。

Q: SAC(Soft Actor-Critic)是什么?

核心: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 是离散的,且熵最大化在语言生成中意义不明确。

Q: 为什么 LLM 对齐用 on-policy 不用 off-policy?

(1) 分布偏移问题:LLM 词表巨大(32K-100K+),重要性采样在超高维离散空间上方差爆炸;(2) 语义敏感性:旧策略生成的文本对新策略可能完全不适用(风格/分布变了);(3) 在线采样成本低:LLM 推理快,重新采样比存海量历史数据更划算。所以 PPO/DPO/GRPO 都是 on-policy 或接近 on-policy。

Q: 为什么 PPO 比 TRPO 好用?

TRPO 需要 Fisher 矩阵 + 共轭梯度 + line search(二阶)。PPO 只用 Adam(一阶),实现简单 10 倍,效果相当。

Q: Model-free vs Model-based?

Model-free:不学环境动力学,通用但数据效率低。Model-based:先学环境模型再 planning,数据效率高但受模型误差积累限制。

Q: 如何处理 sparse reward?

Reward Shaping(加中间奖励)、Curiosity(内在奖励)、HER(事后改目标)、Curriculum Learning(先易后难)。

Q: Reward Hacking 怎么防?

KL 约束(限制偏离)、多维 Reward(多目标平衡)、Process RM(过程监督)、规则 Reward(不可 hack)。

Q: RLHF vs DPO vs GRPO 怎么选?

DPO:资源有限、偏好数据和模型分布接近。RLHF:需要在线采样、追求最佳效果。GRPO:reward 可验证(数学/代码)、想省显存。

Q: PPO 的 $\epsilon$ 怎么选?

通常 0.1-0.2。太小约束紧学得慢,太大相当于没约束会崩。部分实现做线性退火。

Q: DPO 中 $Z(x)$ 为什么消掉?有什么限制?

Bradley-Terry 只看 reward 差值,$Z(x)$ 与 $y$ 无关所以消掉。限制:隐式 reward 绝对值不可解释,不能用于拒绝采样。

Q: GRPO 的组大小 $G$ 怎么选?

通常 32-64。越大 advantage 估计越稳定但推理成本线性增长。太小(如 4)会导致标准化后的 advantage 噪声大。

Q: RLVR 是什么?和 RLHF 什么关系?

RLVR = Reinforcement Learning with Verifiable Rewards,是一种训练范式而非具体算法。它用可验证的规则(如答案对错)作为 reward,无需训练 RM。和 RLHF 的区别在于 reward 来源不同:RLHF 从人类偏好学习 reward,RLVR 用确定性规则验证。RLVR 适用于可验证任务(数学/代码),RLHF 适用于主观任务(对话/写作)。

Q: 为什么 RLVR 能让模型涌现推理能力?

复杂题目直接猜答案几乎不可能得分,而"先思考、分步骤、验证中间结果"是唯一能稳定提升正确率的策略。RL 的探索机制自然会发现并强化这种模式。模型不是被教会推理的,而是在 reward 信号引导下自己发现"推理=高 reward"。

Q: DPO 是 on-policy 还是 off-policy?

DPO 是 off-policy。它用固定偏好数据集(离线数据)训练,不需要在线采样。这和 RLHF/PPO/GRPO 的 on-policy 范式完全不同——DPO 的训练范式本质是监督学习,优化目标直接来自离线偏好对 $(x, y_w, y_l)$。优点是数据可复用、无需在线采样;劣势是分布偏移后效果可能下降。

Q: Reference Model(参考模型)的作用是什么?

Reference Model 是 SFT 模型的冻结副本,在 PPO 训练中用 KL 惩罚约束 Actor 不偏离太远。两个核心作用:(1) 防止 Reward Hacking——没有 KL 约束时模型会学会讨好 RM 的极端行为(如反复说"您说得对");(2) 防止遗忘——约束模型不要完全丢失 SFT 阶段学到的基本能力。RLHF 需要同时维护 4 个模型,Reference Model 是其中开销最小的(只需推理不需要梯度)。

Q: DPO 的局限性是什么?

(1) 隐式 Reward 不可解释——DPO 消掉了 $Z(x)$,无法得到 reward 的绝对值,不能用于拒绝采样;(2) 静态数据集限制——DPO 用离线数据训练,分布偏移后效果下降,不能像 RLHF 那样在线采样新数据;(3) 奖励信号压缩——DPO 把连续 reward 压缩成二值偏好(好/差),丢失了 fine-grained 信息。这就是 GRPO 重新流行的原因之一——GRPO 保留了连续 reward 信号,同时省掉了 RM 和 Critic。

Q: 为什么 GRPO 容易训飞(reward 突然掉下来)?

GRPO 训练不稳定的常见原因:(1) 组内 reward 方差过大——如果组内有的回答极好、有的极差,标准化后的 advantage 噪声大,梯度方向不稳定;(2) KL 系数 $\beta$ 太小——约束不够时策略容易走偏;(3) 组大小 $G$ 太小——标准化分母接近零时 advantage 爆炸;(4) reward 稀疏——大部分回答都是 0 分,梯度信号弱。工程实践:用更大的 $G$(64+)、适当增大 $\beta$、reward smoothing、梯度裁剪。

Q: 多目标 Reward 冲突怎么处理?

实际任务中常需同时优化多个目标(如有用+无害+诚实),这些目标可能冲突。常见方案:(1) 加权求和——$r = w_1 r_1 + w_2 r_2 + \dots$,简单但权重难调;(2) Pareto 优化——不追求单一最优,找 Pareto 前沿上的解;(3) 分层 Reward——先满足安全底线(无害),再优化质量(有用);(4) GDPO(Generalized DPO)——多偏好维度下直接优化策略。实践中加权求和最常用,但权重需要仔细调参。

Q: PPO 训练不稳定的常见原因?

(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),稳定后再调参。