第 3 周 · Day 3:策略梯度与 PPO

Transformers and Large Language Models · Week 3 · Day 3。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

时长 7–8 小时:§1 策略梯度(1.5h)· §2 价值函数与 GAE(1h)· §3 PPO(2h)· §4 工程:四个模型与一轮 PPO(1h)· §A–§C(1.5h)

对应正课 Lecture 5 的中间部分:RL 方法(PPO 及其变体)。学习计划点名要会的:PPO 在 LLM 上的具体形态、四个模型同时在显存里、KL 惩罚、clipping 的作用。

配套代码 w3day3_checks.py(纯 numpy):策略梯度的无偏性与基线的方差缩减、GAE 的偏差-方差权衡、裁剪目标的梯度、三种 KL 估计量、在”回答池”上完整训练 PPO(收敛到闭式最优,去掉 KL 就 reward hacking)、四种训练方式的显存账

§B 参考实现(code/ 目录):w3d3_ppo.py(从零实现 RLHF 的 PPO:mini-GPT 策略、Day 2 训练的奖励模型、参考模型、价值模型;对比有无 KL 惩罚)。

今天的目标:能推出策略梯度,说清基线为什么不改变期望却能降方差;能写出 GAE 并解释 λ;能写出 PPO 的裁剪目标,说清它截断了什么;能画出一轮 RLHF-PPO 的完整流程,说出四个模型各自的作用和显存代价。


§0 今天的主线

Day 2 的最后留下了一个优化问题(Day 2 §3.3):

max⁡θ Ex, y∼πθ[r(x,y)]−β KL(πθ ∥ πref).\max_\theta\ \mathbb E_{x,\ y\sim\pi_\theta}\big[r(x,y)\big]-\beta\,\mathrm{KL}\big(\pi_\theta\,\|\,\pi_{ref}\big).

难点在于期望是对模型自己的采样取的:yy 是从 πθ\pi_\theta 里采出来的离散 token 序列,采样这一步不可导,没法把奖励直接反传回参数。强化学习的策略梯度就是为这种情形准备的工具。

今天的路线:先推出最朴素的策略梯度(REINFORCE)并解决它方差太大的问题(§1);再引入价值函数,得到更精细的”优势”估计(§2);然后是 PPO:让一批昂贵的采样数据可以反复使用、又不至于走得太远(§3);最后看它在 LLM 上的完整形态和工程代价(§4)。

今天要用到的旧结论:softmax 与交叉熵的梯度 p−yp-y(Week 0 Day 1);Adam(Week 0 Day 2 §2.6);KL 散度与最小 KL 的解释(Week 0 Day 5 §1);采样与温度(Week 2 Day 3 §2);Bradley-Terry 奖励模型与归一化(Day 2 §2);过度优化与 KL 约束(Day 2 §3.2–3.3)。


§1 策略梯度

1.1 把生成看成强化学习

强化学习LLM 生成
状态 sts_t提示 + 已生成的前 tt 个 token
动作 ata_t下一个 token
策略 πθ(at∣st)\pi_\theta(a_t\mid s_t)语言模型的下一个 token 分布
一个回合(episode)生成一整个回答,到结束符为止
奖励通常只在最后一个 token 给出(奖励模型的打分)
状态转移确定的:把 ata_t 拼到后面

整个回答的概率是逐 token 概率之积,所以 log⁡πθ(y∣x)=∑tlog⁡πθ(yt∣x,y<t)\log\pi_\theta(y\mid x)=\sum_t\log\pi_\theta(y_t\mid x,y_{<t})。

1.2 得分函数估计:推导

动机:J(θ)=Ey∼πθ[r(y)]=∑yπθ(y)r(y)J(\theta)=\mathbb E_{y\sim\pi_\theta}[r(y)]=\sum_y\pi_\theta(y)r(y)。奖励 rr 不依赖 θ\theta,依赖 θ\theta 的是”采到哪个 yy 的概率”。

推导:

∇θJ=∑yr(y) ∇θπθ(y)=∑yr(y) πθ(y) ∇θlog⁡πθ(y)=Ey∼πθ[r(y) ∇θlog⁡πθ(y)].\nabla_\theta J=\sum_y r(y)\,\nabla_\theta\pi_\theta(y)=\sum_y r(y)\,\pi_\theta(y)\,\nabla_\theta\log\pi_\theta(y)=\mathbb E_{y\sim\pi_\theta}\big[r(y)\,\nabla_\theta\log\pi_\theta(y)\big].

中间一步用的是 ∇π=π∇log⁡π\nabla\pi=\pi\nabla\log\pi(log-derivative trick)。于是梯度变成了对采样的期望,可以用样本估计:采 NN 个回答,算 1N∑ir(yi)∇log⁡πθ(yi)\frac1N\sum_ir(y_i)\nabla\log\pi_\theta(y_i)。这就是 REINFORCE(Williams 1992)。

直觉:∇log⁡πθ(y)\nabla\log\pi_\theta(y) 是”让 yy 更可能”的方向,用奖励加权:奖励高的回答被推高,奖励低的被压低。它和 SFT 的梯度形式一模一样,只是每个样本多了一个权重 r(y)r(y),而且样本是模型自己生成的。

softmax 策略的具体形式:logits 为 θ\theta 时 ∇θlog⁡π(a)=onehot(a)−π\nabla_\theta\log\pi(a)=\text{onehot}(a)-\pi(Week 0 Day 1 推过的交叉熵梯度),于是真实梯度是 πk(rk−E[r])\pi_k(r_k-\mathbb E[r])。w3day3_checks.py 第 1 组用这个解析式检验估计量。

1.3 基线:不改变期望,却能降低方差

问题:REINFORCE 的方差很大。设想所有奖励都是正数:每个采到的回答都会被推高,只是推多推少的区别,梯度的方向几乎全靠”碰巧采到了谁”。

做法:减去一个不依赖动作的基线 bb:

∇θJ=E[(r(y)−b) ∇θlog⁡πθ(y)].\nabla_\theta J=\mathbb E\big[(r(y)-b)\,\nabla_\theta\log\pi_\theta(y)\big].

为什么期望不变:Ey∼π[∇log⁡π(y)]=∑y∇π(y)=∇∑yπ(y)=∇1=0\mathbb E_{y\sim\pi}[\nabla\log\pi(y)]=\sum_y\nabla\pi(y)=\nabla\sum_y\pi(y)=\nabla1=0,所以减去的那一项期望为 0。

第 1 组(10 个动作,每个估计用 16 个样本,重复 20000 次):

奖励基线偏差方差
rr无0.00120.0120
rrE[r]\mathbb E[r]0.00120.0109
rr同批其他样本的均值0.00070.0119
r+10r+10无0.02065.3373
r+10r+10E[r]\mathbb E[r]0.00040.0110
r+10r+10同批其他样本的均值0.00080.0120

偏差都只是抽样误差(估计量无偏);奖励整体平移 10,没有基线时方差放大了几百倍,有基线时完全不受影响。

意义:这是后面所有方法的共同骨架,区别只在基线从哪来:

  • PPO:训练一个价值网络 V(s)V(s) 当基线(§2)。
  • RLOO(REINFORCE Leave-One-Out):同一个提示采 kk 个回答,每个回答用”其余 k−1k-1 个的平均奖励”当基线,仍然无偏(上表第三行)。
  • GRPO:同一个提示采一组回答,用组内均值当基线、再除以组内标准差(Day 5)。
  • ReMax:用贪心解码那个回答的奖励当基线。

学习计划里的”PPO 及其变体”,本质上就是在”基线怎么来""一批数据能用几次”这两件事上做不同选择。

1.4 为什么不把奖励模型直接反传

奖励模型本身是可导的,但采样那一步不可导:yy 是离散的 token,从 logits 到 token 的 argmax 或随机采样没有梯度。Gumbel-softmax 之类的松弛在长序列上又不稳定。得分函数估计完全绕开了这个问题:它只需要 log⁡πθ(y)\log\pi_\theta(y) 可导,不需要奖励可导。这也意味着奖励可以是任何东西:一个人、一个规则、一个编译器、一个数学答案的比对(Day 5 的可验证奖励)。


§2 价值函数与优势

2.1 优势:比”平均”好多少

  • 状态价值 Vπ(st)V^\pi(s_t):从状态 sts_t 出发、按策略 π\pi 继续生成,能拿到的期望总奖励。
  • 动作价值 Qπ(st,at)Q^\pi(s_t,a_t):在 sts_t 先选 ata_t,之后按 π\pi 继续,期望总奖励。
  • 优势 Aπ(st,at)=Qπ(st,at)−Vπ(st)A^\pi(s_t,a_t)=Q^\pi(s_t,a_t)-V^\pi(s_t):选这个 token 比”平均水平”好多少。

用 V(st)V(s_t) 当基线,每个 token 的权重就是它的优势。好处是逐 token 的信用分配:一个回答整体得分高,并不意味着每个 token 都好;优势试图估计每个 token 的贡献。

2.2 时序差分

QQ 和 VV 都不知道,只能估计。训练一个价值网络 V^\hat V,然后用时序差分残差

δt=rt+γV^(st+1)−V^(st)\delta_t=r_t+\gamma\hat V(s_{t+1})-\hat V(s_t)

作为优势的一步估计。如果 V^\hat V 是准确的,E[δt]=A(st,at)\mathbb E[\delta_t]=A(s_t,a_t)。LLM 的 RLHF 里通常取 γ=1\gamma=1(回答长度有限)。

2.3 GAE:在偏差与方差之间插值

问题:δt\delta_t 只看一步,完全依赖 V^\hat V 的准确性(偏差大);用整条轨迹的实际回报 ∑k≥trk−V^(st)\sum_{k\ge t}r_k-\hat V(s_t) 不依赖 V^\hat V,但混进了之后所有步骤的随机性(方差大)。

GAE(Schulman et al. 2016)取所有 nn 步估计的指数加权平均,化简后是

A^tGAE(γ,λ)=∑l≥0(γλ)l δt+l.\hat A_t^{GAE(\gamma,\lambda)}=\sum_{l\ge0}(\gamma\lambda)^l\,\delta_{t+l}.

λ=0\lambda=0 就是 δt\delta_t,λ=1\lambda=1 就是蒙特卡洛回报减 V^(st)\hat V(s_t)(参考代码自检的前两项)。

第 2 组:100 步的轨迹,奖励噪声的标准差 0.3,价值网络在每个状态上有标准差 3 的固定误差。误差分成两部分:来自价值网络误差的偏差,来自奖励噪声的方差。理论值是 σe21−λ1+λ+σr21−λ2T1−λ2\sigma_e^2\frac{1-\lambda}{1+\lambda}+\sigma_r^2\frac{1-\lambda^{2T}}{1-\lambda^2}:

λ\lambda偏差²方差均方误差
08.9770.0899.066
0.52.9930.1203.112
0.81.0010.2471.247
0.90.4760.4730.949
0.950.2310.9071.137
0.990.0393.9283.967
10.0008.8858.885

意义:λ\lambda 是一个旋钮,价值网络越不准,最优 λ\lambda 越靠近 1。PPO 常用 λ=0.95\lambda=0.95。

LLM 上的特殊困难:奖励只在最后一个 token 出现,价值网络要从一个半截的回答预测最终得分,这很难学准。这是 Day 5 的 GRPO 干脆去掉价值网络的主要动机之一。


§3 PPO

3.1 动机:采样很贵,想多用几次

在 LLM 上,一次采样意味着生成几百个 token,比一次反向传播贵得多。策略梯度要求样本来自当前策略(on-policy),参数一更新,旧样本就”过期”了。能不能在同一批样本上多更新几步?

重要性采样:用旧策略 πold\pi_{old} 采的样本,也能估计新策略的目标:

Ea∼πθ[A(a)]=Ea∼πold[πθ(a)πold(a)A(a)],ρ=πθ(a)πold(a).\mathbb E_{a\sim\pi_\theta}\big[A(a)\big]=\mathbb E_{a\sim\pi_{old}}\Big[\frac{\pi_\theta(a)}{\pi_{old}(a)}A(a)\Big],\qquad\rho=\frac{\pi_\theta(a)}{\pi_{old}(a)}.

但 πθ\pi_\theta 离 πold\pi_{old} 太远时,比值 ρ\rho 的方差爆炸,优势 AA 也不再准确(它是在旧策略下估的)。需要一个”信任域”:每次只在旧策略附近更新。TRPO(Schulman et al. 2015)用 KL 约束和二阶优化做到这一点,实现复杂。PPO 用一个简单的裁剪做到近似的效果。

3.2 裁剪目标

LCLIP(θ)=Et[min⁡(ρtA^t, clip(ρt,1−ε,1+ε) A^t)],ε≈0.2.L^{CLIP}(\theta)=\mathbb E_t\Big[\min\big(\rho_t\hat A_t,\ \mathrm{clip}(\rho_t,1-\varepsilon,1+\varepsilon)\,\hat A_t\big)\Big],\qquad\varepsilon\approx0.2.

第 3 组列出了它对 ρ\rho 的导数:

ρ\rho0.50.81.01.21.5
A=+1A=+1:目标 / 梯度0.50 / 10.80 / 11.00 / 11.20 / 0.5(边界)1.20 / 0
A=−1A=-1:目标 / 梯度−0.80 / 0−0.80 / −0.5(边界)−1.00 / −1−1.20 / −1−1.50 / −1

读这张表:

  • 好动作(A>0A>0):概率已经提高到 1.21.2 倍以上,就不再给梯度,防止在这一批数据上过度追逐。
  • 坏动作(A<0A<0):概率已经降到 0.80.8 倍以下,就不再继续压。
  • “对自己不利”的一侧从不截断:好动作的概率被错误地降低了(ρ<0.8\rho<0.8),梯度仍在,会被拉回来;坏动作被错误地提高了(ρ>1.2\rho>1.2),同样。取 min⁡\min 使 LCLIPL^{CLIP} 是未裁剪目标的一个悲观下界。

完整的损失还有两项:价值网络的回归损失(让 V^\hat V 拟合 GAE 算出的回报,参考代码里也做了裁剪),以及可选的熵奖励(鼓励探索;LLM 上常常不用)。

3.3 LLM 上的 PPO:KL 进入奖励

InstructGPT 式的实现把 KL 惩罚摊到每个 token 的奖励里:

rt=−β(log⁡πold(yt∣st)−log⁡πref(yt∣st))+1[t=T]⋅rϕ(x,y).r_t=-\beta\big(\log\pi_{old}(y_t\mid s_t)-\log\pi_{ref}(y_t\mid s_t)\big)+\mathbb 1[t=T]\cdot r_\phi(x,y).

  • 每个 token 都有一个小的负奖励,大小是它在策略和参考模型下的 log 概率之差(KL 的单样本估计,§3.4)。
  • 奖励模型的分数只加在最后一个 token 上。
  • 然后照常算 GAE、做裁剪更新。

对整条回答求和,∑trt=rϕ(x,y)−βlog⁡πold(y∣x)πref(y∣x)\sum_tr_t=r_\phi(x,y)-\beta\log\frac{\pi_{old}(y\mid x)}{\pi_{ref}(y\mid x)},期望正是 Day 2 §3.3 的目标 E[r]−β KL\mathbb E[r]-\beta\,\mathrm{KL}。KL 项变成了密集的奖励信号,这也部分缓解了”奖励只在最后一步”的稀疏问题。

另一种做法(GRPO 用的,Day 5)是不放进奖励,而是作为损失里单独的一项:L=−LCLIP+β KL^\mathcal L=-L^{CLIP}+\beta\,\widehat{\mathrm{KL}}。

3.4 KL 怎么估计

每个 token 的 KL 只能用样本估计。设 x∼qx\sim q(当前策略),r=p(x)/q(x)r=p(x)/q(x)(pp 是参考模型),常见的三种单样本估计(Schulman 的博客《Approximating KL Divergence》):

估计公式无偏非负
k1k_1−log⁡r-\log r是否
k2k_212(log⁡r)2\frac12(\log r)^2否是
k3k_3(r−1)−log⁡r(r-1)-\log r是是

第 4 组(q=N(0,1)q=\mathcal N(0,1)、p=N(μ,1)p=\mathcal N(\mu,1),100 万个样本,偏差 / 标准差都除以真值):

真实 KLk1k_1k2k_2k3k_3
0.005−0.001 / 19.98+0.001 / 1.41−0.002 / 1.41
0.5+0.001 / 2.00+0.250 / 1.74−0.000 / 1.70

意义:RLHF 里每个 token 的 KL 通常很小。这时 k1k_1 的相对标准差是 20,而且经常为负(单个 token 上”奖励”它偏离参考模型);k3k_3 同样无偏,方差小得多,而且永远非负。k2k_2 在 KL 小时偏差很小,但 KL 大时明显高估。GRPO 在损失里用的就是 k3k_3(Day 5 会看到它作为损失时的一个微妙之处)。

3.5 在一个玩具上跑完整的 PPO

第 5 组把 Day 2 的”回答池”搬过来:一个提示、200 个候选回答,πref\pi_{ref} 是它们上的一个分布,代理奖励和真实质量与 Day 2 第 4、5 组相同。每轮从 πold\pi_{old} 采 64 个回答,奖励减去 βlog⁡(πold/πref)\beta\log(\pi_{old}/\pi_{ref}),优势用批内均值和标准差归一化,在这批数据上做 4 个 epoch 的裁剪更新,共 300 轮:

β\betaE[代理]E[真实]KL(π‖π_ref)KL(π‖π*_β)最大的单个概率
03.890.665.45—1.000
0.33.641.094.190.0110.663
0.62.771.052.200.0110.289
1.01.860.611.000.0140.141

(参考:πref\pi_{ref} 下 E[代理] = −0.12、E[真实] = −0.35;代理奖励最高的那个回答,真实质量只有 0.66。)

读这张表:

  • β>0\beta>0 时,PPO 收敛到闭式最优 πβ∗∝πrefexp⁡(r/β)\pi^*_\beta\propto\pi_{ref}\exp(r/\beta) 附近(倒数第二列的 KL 只有 0.01 左右)。PPO 只是在用采样去逼近一个本来就有解析形式的分布,Day 4 的 DPO 正是从这里出发的。
  • β=0\beta=0 时,策略坍缩到代理奖励最高的那一个回答上(最大概率 1.000):代理奖励最高,真实质量却不如 β=0.3\beta=0.3 时。这就是 reward hacking,外加多样性的彻底丧失。
  • β\beta 越大越保守,学到的越少。

§4 工程:一轮 RLHF-PPO

4.1 一轮的流程

1. 采样(推理)   从提示集取一批 x;用 π_θ 生成回答 y(温度 1,不加 top-p,见 §A.3)
2. 打分(前向)   r_φ(x, y):奖励模型的分数,归一化
                 log π_old(y_t):生成时的策略 log 概率
                 log π_ref(y_t):参考模型的 log 概率
                 V(s_t):价值模型对每个位置的估计
3. 算优势         r_t = −β·(log π_old − log π_ref),最后一个 token 加上 r_φ;GAE 得到 Â_t 和回报
4. 更新(训练)   在这批数据上做若干个 epoch:策略用裁剪目标,价值模型用回归损失
5. 回到 1

4.2 几个关键的实现细节

  • 价值模型从奖励模型初始化:两者都要”读懂回答并给出一个标量”,奖励模型是一个比随机初始化好得多的起点。
  • 奖励归一化、优势白化:奖励减均值除标准差(Day 2 §2.2),优势在批内再归一化一次(§1.3 的基线思想)。
  • 关掉 dropout:训练模式下两次前向的 log 概率不同,ρ\rho 在没有更新时就不等于 1。
  • 监控:代理奖励、KL、裁剪比例(长期高于 0.2–0.3 说明步子太大)、回答长度、熵、价值损失。KL 和长度一起快速上涨,几乎总是 reward hacking 的信号。
  • 采样和训练用同一套 log 概率:生成时用了 top-p、重复惩罚之类的改动,实际的采样分布就不是 πθ\pi_\theta 了,重要性比值会有偏(§A.3)。

4.3 四个模型与显存

学习计划的原话:“policy / reference / reward / value 四个模型同时在显存里(这是它工程上难搞的根本原因)。”

模型作用训练吗7B 时每参数字节
策略 πθ\pi_\theta生成、被优化是16
价值模型 VV估计每个位置的价值,给 GAE 用是16
参考模型 πref\pi_{ref}算 KL否2
奖励模型 rϕr_\phi打分否2

第 6 组(7B,不含激活和 KV Cache):

方法字节/参数显存
SFT16100.4 GiB
PPO36226.0 GiB
GRPO20125.5 GiB
DPO18113.0 GiB

还有一笔没算进去的开销:每一轮都要用当前策略生成回答,这是推理,常常占了训练时间的大头。大规模实现(OpenRLHF、veRL 等)会把生成交给 vLLM 这样的推理引擎,训练和生成之间来回同步权重。

常见的省法:策略和价值模型都用 LoRA;参考模型就是”关掉 LoRA 适配器的策略”,不用单独存一份(peft 的 disable_adapter());奖励模型和参考模型卸载到 CPU,用的时候再搬回来。

4.4 PPO 的优点与代价(为 Day 4 做铺垫)

  • 优点:在线采样,策略在自己的分布上学习,能发现示范和偏好数据里没有的好回答;奖励可以是任何东西;业界最成熟的 RLHF 方法(InstructGPT、早期的 ChatGPT、Llama 2)。
  • 代价:四个模型、在线生成、十几个相互影响的超参数(β\beta、ε\varepsilon、λ\lambda、学习率、epoch 数、批大小……),训练不稳定、难复现。

Day 4 的 DPO 问的是:既然最优解有闭式形式(§3.5),能不能不做 RL,直接用偏好数据拟合它?


§A PPO:API 用法与边界

A.1 现成的实现

  • trl:提供 PPOTrainer,但它的接口在几个大版本里重写过不止一次(参数名、需要传入的模型、数据格式都变过),以你安装版本的文档和示例为准。学习阶段建议先读懂参考代码的手写版本。
  • OpenRLHF、veRL:面向大规模训练,用 Ray 调度、vLLM 生成,支持 PPO、GRPO、RLOO 等多种算法。

A.2 LoRA 下的参考模型

with policy.disable_adapter():                  # peft:临时关掉适配器,得到的就是原始模型 = π_ref
    logp_ref = token_logprobs(policy, seq, prompt_len)

省掉一整份参考模型的显存。前提是参考模型确实就是 LoRA 的底座(通常是 SFT 模型)。

A.3 采样设置与重要性比值

  • rollout 时只用温度采样,不要加 top-k、top-p、重复惩罚:它们会改变实际的采样分布,而计算 log⁡πold\log\pi_{old} 时用的是原始分布,两者不一致,比值 ρ\rho 在更新前就不等于 1。
  • 温度不等于 1 时,计算 log 概率也要除以同样的温度。
  • 大规模系统里生成用 vLLM、训练用 PyTorch,两者的数值(内核、精度)略有差异,同一个 token 的 log 概率会差一点。这也是为什么有些实现用训练框架重新计算 log⁡πold\log\pi_{old},而不是直接用推理引擎返回的值。

A.4 结束符与 padding

回答长度不一。结束符之后的位置要从损失和 KL 里掩掉;奖励模型的分数加在结束符那个位置(或最后一个真实 token)上,不是加在 padding 上。忘了处理结束符的实现,常见症状是模型学会了”永远不停”或”立刻停”。


§B 实操

  1. 跑通 w3day3_checks.py,6 组结论都看懂。第 5 组改变 β\beta、学习率、epoch 数,观察收敛与坍缩。
  2. 推导(1h):(a) 策略梯度与基线不改变期望;(b) GAE 在 λ=0\lambda=0、λ=1\lambda=1 时的两个特例;(c) 裁剪目标对 ρ\rho 的导数(四种情况);(d) 把每个 token 的 KL 奖励加起来,得到 Day 2 §3.3 的目标。
  3. 从零实现 PPO(2h):python code/w3d3_ppo.py --selftest,然后在 Day 2 的奖励模型上跑 --train(β=0.05\beta=0.05)和 --train --beta 0,对比两次的 gold 曲线和样本。
  4. 读论文:PPO(Schulman et al. 2017)的第 3 节;InstructGPT 的附录 C(RLHF 的训练细节);The N+ Implementation Details of RLHF with PPO(Huang et al. 2024)挑读。

参考实现:code/w3d3_ppo.py。


§C 自测

动机与直觉层

  1. 为什么不能把奖励模型的梯度直接反传给策略?策略梯度是怎么绕开这个问题的?
  2. 基线为什么不改变梯度的期望?为什么能降低方差?奖励整体加一个常数,没有基线会怎样?
  3. PPO 为什么要重要性采样?为什么要裁剪?裁剪截断了哪些情况、保留了哪些?
  4. LLM 的 RLHF 里 KL 惩罚是怎么进入训练的?有哪两种放法?
  5. 为什么 k1k_1 在 KL 很小时几乎没用?

推导与计算层

  1. 推出 ∇θEy∼πθ[r(y)]=E[r(y)∇log⁡πθ(y)]\nabla_\theta\mathbb E_{y\sim\pi_\theta}[r(y)]=\mathbb E[r(y)\nabla\log\pi_\theta(y)]。
  2. 写出 GAE 的公式,说明 λ=0\lambda=0 和 λ=1\lambda=1 各是什么,以及为什么价值网络越不准,最优 λ\lambda 越大。
  3. 写出 PPO 的裁剪目标,分四种情况写出它对 ρ\rho 的导数。
  4. 7B 模型做 PPO,四个模型的参数状态一共多少显存?GRPO、DPO 各省了什么?

工程层

  1. 画出一轮 RLHF-PPO 的流程,标出每一步哪些模型参与、哪些在训练。
  2. 为什么 rollout 时不应该用 top-p?为什么要关 dropout?
  3. 训练日志里 KL 和回答长度同时快速上涨,你怎么判断、怎么处理?

出关标准

  • 能推出策略梯度,说清基线的作用,并知道 RLOO、ReMax、GRPO 在基线上的不同选择
  • 能写出 GAE,解释 λ\lambda 的偏差-方差权衡
  • 能写出 PPO 的裁剪目标,分四种情况说清梯度
  • 能说清 KL 惩罚在 LLM 的 PPO 里的两种放法,以及 k1k_1、k3k_3 的区别
  • 能说出四个模型各自的作用和显存代价
  • 跑通 w3d3_ppo.py 的两次训练,看到(或解释了为什么没看到)β=0\beta=0 时的 reward hacking

疑问清单

← 返回课程目录