REINFORCE 给了一个干净答案:用回报或优势给 log-prob 加权,就能优化不可微奖励。
但朴素 REINFORCE 在语言模型上方差太高:序列长,奖励晚,动作空间大,同一个最终奖励要分摊到大量 token。
Actor-Critic 的出发点是把「负责行动的策略」和「负责评估状态的价值函数」分开训练。
策略叫 Actor,价值函数叫 Critic。
GAE 则是在 Monte-Carlo 回报和 TD bootstrap 之间插入一个可调旋钮,用 \(\lambda\) 控制偏差—方差取舍。
读完之后,你应该能看懂 PPO 代码里的 value head、TD
residual、advantage normalization 和 gae_lambda
为什么存在。
一、Actor-Critic 的基本结构
Actor-Critic 是一类方法,而不是单个算法。
Actor 是策略网络:
\[ \pi_\theta(a|s) \]
它决定在状态 \(s\) 下采取动作 \(a\) 的概率。
Critic 是价值函数:
\[ V_\phi(s) \]
它估计从状态 \(s\) 出发,按当前策略继续行动的期望回报。
策略参数 \(\theta\) 和价值参数 \(\phi\) 可以完全分开。
也可以共享底座,只在顶部接不同 head。
在语言模型后训练里,常见做法是在 policy 模型顶部增加一个 value head。
语言模型原本输出每个 token 的 logits。
value head 则对每个 token 位置输出一个标量。
这个标量估计当前前缀的未来回报。
写成符号:
\[ h_t = \text{Transformer}_\theta(q,x_{<t}) \]
\[ \pi_\theta(x_t|q,x_{<t})=\text{softmax}(W_{\text{lm}}h_t) \]
\[ V_\phi(s_t)=w_v^\top h_t \]
这里 \(s_t=(q,x_{<t})\)。
\(W_{\text{lm}}\) 产生 token 分布。
\(w_v\) 产生价值估计。
Actor 负责产生回答。
Critic 负责告诉 Actor:这个状态下,某个采样结果比平均水平好还是差。
策略梯度使用优势:
\[ \nabla_\theta J(\theta)\approx \sum_t \nabla_\theta\log\pi_\theta(a_t|s_t)\hat A_t \]
价值网络的任务就是帮助构造 \(\hat A_t\)。
如果 \(\hat A_t\) 估计准确,策略更新方差会低得多。
如果 \(\hat A_t\) 偏差很大,策略会被错误方向推动。
因此 Critic 不是附属模块。
它直接影响 PPO 和 RLHF 的稳定性。
二、Monte-Carlo 回报与 TD bootstrap
估计优势最直接的方法是 Monte-Carlo 回报。
一条轨迹采完后,从每个位置向后累计奖励:
\[ \hat A_t^{\text{MC}}=G_t - V_\phi(s_t) \]
它的优点是目标清楚。
\(G_t\) 使用真实采样到的未来奖励。
如果采样足够多,估计可以无偏。
它的缺点是方差大。
语言模型的末尾奖励会让许多 token 共享同一个 noisy signal。
另一端是时序差分(Temporal Difference,TD)。
TD 使用一步奖励加下一状态价值来估计当前价值:
\[ r_t+\gamma V_\phi(s_{t+1}) \]
TD residual 定义为:
\[ \delta_t=r_t+\gamma V_\phi(s_{t+1})-V_\phi(s_t) \]
如果 \(\delta_t>0\),说明实际一步结果比当前价值估计更好。
如果 \(\delta_t<0\),说明比预期更差。
一步 TD 的优势估计可以直接用:
\[ \hat A_t^{\text{TD(0)}}=\delta_t \]
它的优点是方差低。
它只看一步真实奖励和下一状态价值。
它的缺点是有偏。
因为 \(V_\phi(s_{t+1})\) 本身是估计值。
如果 Critic 错了,bootstrap 会把错误传回来。
这就是偏差—方差取舍。
Monte-Carlo:少偏差,高方差。
TD bootstrap:低方差,多偏差。
GAE 的作用是在这两端之间连续插值。
三、从多步 TD 到 GAE
先定义一步 TD residual:
\[ \delta_t=r_t+\gamma V(s_{t+1})-V(s_t) \]
这里暂时省略 \(\phi\),把 \(V\) 当作当前价值估计。
如果把多个 TD residual 累加,可以得到不同长度的优势估计。
一步估计是:
\[ \hat A_t^{(1)}=\delta_t \]
两步估计是:
\[ \hat A_t^{(2)}=\delta_t+\gamma\delta_{t+1} \]
三步估计是:
\[ \hat A_t^{(3)}=\delta_t+\gamma\delta_{t+1}+\gamma^2\delta_{t+2} \]
推广到 \(k\) 步:
\[ \hat A_t^{(k)}=\sum_{l=0}^{k-1}\gamma^l\delta_{t+l} \]
如果一直加到 episode 结束,并且终止状态价值为 0,这个和会接近 Monte-Carlo 回报减价值:
\[ \sum_{l=0}^{T-t}\gamma^l\delta_{t+l}=G_t-V(s_t) \]
可以直接验证望远镜消去。
展开右侧:
\[ \delta_t+\gamma\delta_{t+1}+\cdots \]
等于:
\[ r_t+\gamma V(s_{t+1})-V(s_t)+\gamma r_{t+1}+\gamma^2V(s_{t+2})-\gamma V(s_{t+1})+\cdots \]
中间的 \(V(s_{t+1})\)、\(V(s_{t+2})\) 项互相抵消。
最后留下:
\[ r_t+\gamma r_{t+1}+\cdots - V(s_t) \]
也就是:
\[ G_t-V(s_t) \]
GAE(Generalized Advantage Estimation)把这些多步 residual 用指数权重加权。
Schulman 等人在 2015 年给出的常用形式是:
\[ \hat A_t^{\text{GAE}(\gamma,\lambda)}=\sum_{l\ge0}(\gamma\lambda)^l\delta_{t+l} \]
其中:
\[ \delta_t=r_t+\gamma V(s_{t+1})-V(s_t) \]
\(\lambda \in [0,1]\) 控制使用多长的未来 residual。
当 \(\lambda=0\):
\[ \hat A_t^{\text{GAE}}=\delta_t \]
这退化为一步 TD,方差低但偏差高。
当 \(\lambda=1\) 且 episode 有限时:
\[ \hat A_t^{\text{GAE}}=G_t-V(s_t) \]
这接近 Monte-Carlo 优势,偏差低但方差高。
实际训练常取中间值。
这样既利用 bootstrap 降低方差,又保留多步回报的信息。
四、\(\gamma\) 和 \(\lambda\) 分别控制什么
\(\gamma\) 是折扣因子。
它属于任务定义的一部分。
它决定未来奖励在目标函数里的权重。
\(\gamma\) 越小,远期奖励越不重要。
\(\gamma\) 越接近 1,远期奖励越重要。
在语言模型后训练中,很多设置会使用接近 1 的 \(\gamma\)。
原因是回答质量通常由完整序列决定。
太小的 \(\gamma\) 会让早期 token 几乎看不到末尾奖励。
但 \(\gamma=1\) 也会让长序列上的方差和长度效应更明显。
\(\lambda\) 是估计器参数。
它不改变原始任务奖励。
它改变优势估计时依赖多远的未来 TD residual。
\(\lambda\) 越小,越信任 value bootstrap。
\(\lambda\) 越大,越接近真实采样回报。
所以 \(\gamma\) 和 \(\lambda\) 不应混为一谈。
\(\gamma\) 问的是「任务是否重视远期奖励」。
\(\lambda\) 问的是「估计优势时愿意承担多少方差来减少偏差」。
在 PPO 实现里,这两个参数通常都出现。
调参时如果只看 reward 曲线,很容易误判。
\(\lambda\) 太低时,优势可能过度依赖不准的 Critic。
\(\lambda\) 太高时,优势方差上升,更新会更抖。
\(\gamma\) 太低时,末尾奖励对早期 token 的影响会被削弱。
\(\gamma\) 太高时,长序列的回报尺度和长度偏置需要额外处理。
五、价值函数如何训练
Critic 需要自己的监督信号。
常见做法是让 \(V_\phi(s_t)\) 拟合某种回报目标。
例如使用 GAE 后,可以构造 value target:
\[ \hat V_t = \hat A_t + V_\phi(s_t) \]
训练 value head 的 loss 是均方误差:
\[ \mathcal{L}_V(\phi)=\frac{1}{2}\sum_t\left(V_\phi(s_t)-\hat V_t\right)^2 \]
在 PPO 中,策略 loss、value loss 和熵奖励常被组合:
\[ \mathcal{L}=\mathcal{L}_{\text{policy}}+c_v\mathcal{L}_V-c_e\mathcal{H} \]
这里 \(c_v\) 是 value loss 系数。
\(c_e\) 是熵系数。
\(\mathcal{H}\) 鼓励策略保持一定随机性。
这不是本文重点,但要先知道三者会互相影响。
如果 value loss 权重太低,Critic 学不好,优势估计噪声大。
如果 value loss 权重太高,共享底座时可能干扰语言建模能力。
如果价值目标尺度不稳定,value head 可能出现大误差。
实际 RLHF 系统还常使用 value clipping。
它限制新旧 value 预测差异,避免 Critic 更新过猛。
这些细节会在 PPO 篇展开。
本篇只强调一点:Critic 不是奖励模型。
奖励模型给完整回答打分。
Critic 估计当前策略下某个状态的未来回报。
奖励模型通常在策略优化前训练好或由规则提供。
Critic 在策略优化过程中随策略一起更新。
六、优势归一化为什么常用
得到一批优势 \(\hat A_t\) 后,很多实现会做归一化:
\[ \tilde A_t=\frac{\hat A_t-\mu_A}{\sigma_A+\epsilon} \]
其中 \(\mu_A\) 和 \(\sigma_A\) 是当前 batch 内优势的均值和标准差。
这样做有几个目的。
第一,稳定梯度尺度。
策略 loss 的梯度大小和优势尺度成正比。
如果奖励尺度突然变大,更新会变猛。
归一化可以把 batch 内尺度拉回相近范围。
第二,减少 prompt 难度差异。
一个 batch 里可能混有简单 prompt 和困难 prompt。
简单 prompt 的绝对回报更高,不代表它对策略改进更重要。
中心化优势可以让训练更关注相对好坏。
第三,配合 PPO clipping。
PPO 的裁剪目标对优势符号敏感。
优势尺度过大时,少数样本会主导更新。
归一化能缓解这种不平衡。
但优势归一化不是无条件正确。
它改变了样本间的相对权重尺度。
在分布式训练中,如果每个 worker 单独归一化,可能引入不一致。
如果 batch 很小,均值和标准差估计也会噪声很大。
因此它是工程上常用的稳定技巧,而不是贝尔曼方程推出的必然步骤。
七、LLM 中的 per-token advantage
把 GAE 放回语言模型,状态是前缀:
\[ s_t=(q,x_{<t}) \]
每个 token 位置都有一个 value:
\[ V(s_t) \]
每个 token 位置也可以有一个 reward:
\[ r_t \]
在 RLHF-PPO 中,\(r_t\) 通常包含两部分。
第一部分是 per-token KL 惩罚。
它限制当前策略偏离参考模型。
第二部分是序列末尾奖励。
它来自奖励模型或规则评分。
简化写法是:
\[ r_t = -\beta\left(\log\pi_\theta(x_t|s_t)-\log\pi_{\text{ref}}(x_t|s_t)\right) \]
对于最后一个 token,再加上序列奖励:
\[ r_T \leftarrow r_T + R_{\text{seq}}(q,x_{1:T}) \]
然后沿 token 序列反向计算 GAE:
\[ \delta_t=r_t+\gamma V(s_{t+1})-V(s_t) \]
\[ \hat A_t=\delta_t+\gamma\lambda\hat A_{t+1} \]
这个递推式是 GAE 的实现形式。
从序列末尾往前扫即可。
如果遇到 EOS 或 padding,要用 mask 截断。
否则 padding token 会污染优势。
per-token advantage 最终进入策略 loss:
\[ \mathcal{L}_{\text{PG}}=-\sum_t \log\pi_\theta(x_t|s_t)\hat A_t \]
在 PPO 中,\(\log\pi\) 会换成新旧策略概率比,并加裁剪。
但优势的来源仍然是这里。
所以理解 GAE 是理解 PPO 后训练的前置条件。
八、Actor-Critic 的代价
Actor-Critic 降低方差,但不是免费午餐。
第一,它需要训练 Critic。
value head 增加参数、显存和 loss 项。
如果策略模型很大,哪怕一个小 value head,也会牵动共享底座的训练。
第二,它引入 value 误差。
REINFORCE 的 Monte-Carlo 回报估计虽然方差高,但概念上不依赖价值模型。
Actor-Critic 用 \(V_\phi\) 做 bootstrap。
如果 \(V_\phi\) 系统性错误,优势估计会带偏策略。
第三,它增加实现复杂度。
需要处理 value target、GAE、mask、截断、归一化、value clipping、loss 权重。
每个细节都可能导致训练不稳定。
第四,语言模型的状态空间极大。
每个前缀都是一个状态。
Critic 要在高维文本前缀上预测未来奖励。
这比很多低维控制任务更难。
第五,奖励分布会随策略变化。
策略更新后,采样回答分布变了。
Critic 过去学到的价值估计可能迅速过时。
这些代价解释了为什么后来的 RLOO、GRPO 等方法会尝试去掉 Critic。
但在经典 RLHF-PPO 中,Actor-Critic 仍然是核心结构。
理解它,才能理解 GRPO 省掉了什么,也付出了什么。
九、从 A3C 到 PPO 的位置
Mnih 等人在 2016 年提出的 A3C(Asynchronous Advantage Actor-Critic)是深度 RL 里 Actor-Critic 路线的重要代表。
A3C 使用多个异步 actor 与环境交互,更新共享模型。
它的名字里已经包含三个关键词:异步、优势、Actor-Critic。
PPO 不是 A3C,但继承了优势 Actor-Critic 的基本分工。
PPO 的策略目标会使用优势估计。
PPO 的训练循环通常同时优化 policy loss 和 value loss。
PPO 的稳定性还来自概率比裁剪或 KL 约束。
所以可以把依赖关系理解成:
graph LR
PG[策略梯度] --> AC[Actor-Critic]
AC --> GAE[GAE 优势估计]
GAE --> PPO[PPO 裁剪目标]
PPO --> RLHF[RLHF-PPO]
这张图不是历史完整谱系。
它只表达本系列需要的概念依赖。
先有策略梯度,才有 log-prob 加权。
引入 Critic,才有状态价值基线。
引入 GAE,才有可控的多步优势估计。
引入 PPO,才有受约束的多轮策略更新。
LLM 后训练把这套结构放到 token 序列上。
十、本篇的最短结论
Actor 是策略 \(\pi_\theta(a|s)\)。
Critic 是价值函数 \(V_\phi(s)\)。
Actor-Critic 用 Critic 提供基线或优势估计,从而降低策略梯度方差。
Monte-Carlo 回报偏差低但方差高。
TD bootstrap 方差低但依赖价值估计,可能引入偏差。
GAE 用公式:
\[ \hat A_t^{\text{GAE}(\gamma,\lambda)}=\sum_{l\ge0}(\gamma\lambda)^l\delta_{t+l} \]
其中:
\[ \delta_t=r_t+\gamma V(s_{t+1})-V(s_t) \]
\(\gamma\) 控制任务中的未来奖励折扣。
\(\lambda\) 控制优势估计的偏差—方差取舍。
LLM 后训练中,value head 在每个 token 前缀上预测未来回报,GAE 沿生成序列计算 per-token advantage。
这些优势会进入 PPO 的策略目标。
下一篇进入 PPO 本身:为什么要裁剪概率比,KL 约束如何工作,RLHF 实现里有哪些容易训崩的细节。
参考资料
- Schulman, J., Moritz, P., Levine, S., Jordan, M., Abbeel, P. 2015. High-Dimensional Continuous Control Using Generalized Advantage Estimation. arXiv:1506.02438.
- Sutton, R. S., Barto, A. G. 2018. Reinforcement Learning: An Introduction. 2nd edition. MIT Press.
- Mnih, V., Badia, A. P., Mirza, M., et al. 2016. Asynchronous Methods for Deep Reinforcement Learning. ICML 2016.
- Schulman, J., Wolski, F., Dhariwal, P., Radford, A., Klimov, O. 2017. Proximal Policy Optimization Algorithms. arXiv:1707.06347.
- Ouyang, L., Wu, J., Jiang, X., et al. 2022. Training language models to follow instructions with human feedback. NeurIPS 2022.
← 上一篇:03|策略梯度与 REINFORCE | 下一篇:05|PPO 深度解剖 →
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【强化学习与大模型后训练】02|MDP、回报与贝尔曼方程
用面向语言模型的最小强化学习集合定义 MDP、回报、价值、优势和贝尔曼方程,并解释 token 级与序列级建模的差异。
【强化学习与大模型后训练】05|PPO 深度解剖:裁剪目标、KL 约束与实现陷阱
从信任域思想推到 PPO 裁剪目标,解释 KL 约束、完整损失和代码级实现细节,帮助读者判断一次策略更新是否安全。
【强化学习与大模型后训练】09|RLHF 全链路:用 PPO 对齐语言模型
从 SFT 初始化、奖励模型、参考策略 KL 到 PPO 更新,串起 RLHF 的四模型训练闭环,并解释稳定性与工程成本。
强化学习与大模型后训练
从 MDP、策略梯度、PPO 等强化学习最小必要集出发,系统讲清现代大模型后训练:SFT、奖励模型、RLHF,到 DPO/IPO/KTO/ORPO/SimPO 免 RL 对齐、GRPO,再到 RLVR 可验证奖励、推理模型(o1/R1 范式)、过程奖励、奖励黑客、RL 训练基础设施与评测。全 20 篇深度博客。