上一篇把语言生成写成了 MDP:状态是 prompt 加前缀,动作是下一个 token,奖励常常只在完整回答后出现。
现在问题变成:奖励模型、单元测试、人工偏好这些反馈通常不可微,环境转移也不可微,为什么还能用梯度训练语言模型。
策略梯度的答案很直接:不需要对环境求导,只需要对「自己采样这个动作的概率」求导。
REINFORCE 是这条路线的最基本形式。
它把高回报轨迹的 log-prob 往上推,把低回报轨迹的 log-prob 往下压。
读完之后,你应该能看懂后训练代码里
logprob * advantage
这一项从哪里来,也能理解为什么长序列、稀疏末尾奖励会带来高方差。
一、目标函数:最大化期望回报
设策略为 \(\pi_\theta(a|s)\)。
它由参数 \(\theta\) 控制。
一条轨迹记为:
\[ \tau=(s_0,a_0,r_0,s_1,a_1,r_1,\ldots,s_T) \]
轨迹回报可以写为:
\[ R(\tau)=\sum_{t=0}^{T}\gamma^t r_t \]
策略优化的目标是最大化期望回报:
\[ J(\theta)=\mathbb{E}_{\tau\sim\pi_\theta}[R(\tau)] \]
这里的期望来自两类随机性。
第一类是策略随机性。
策略在每个状态下采样动作。
第二类是环境随机性。
环境根据状态和动作给出下一个状态和奖励。
语言模型里,策略随机性就是采样 token。
环境随机性可以来自采样系统、外部工具、判题器或数据分布。
如果只看固定 prompt 下的自回归生成,给定动作后状态转移通常是确定的。
但奖励仍可能来自不可微的函数。
例如人类偏好、规则校验、代码测试。
直接对 \(R(\tau)\) 求导通常做不到。
策略梯度绕开的正是这一点。
它不要求奖励可微。
它只要求我们能计算策略给出采样动作的概率。
对语言模型来说,这就是每个 token 的 log-prob。
二、log-derivative trick
从目标函数展开:
\[ J(\theta)=\int p_\theta(\tau)R(\tau)d\tau \]
其中 \(p_\theta(\tau)\) 是策略 \(\pi_\theta\) 诱导出的轨迹概率。
对参数求梯度:
\[ \nabla_\theta J(\theta)=\nabla_\theta \int p_\theta(\tau)R(\tau)d\tau \]
在常规条件下交换梯度和积分:
\[ \nabla_\theta J(\theta)=\int \nabla_\theta p_\theta(\tau)R(\tau)d\tau \]
使用恒等式:
\[ \nabla_\theta p_\theta(\tau)=p_\theta(\tau)\nabla_\theta \log p_\theta(\tau) \]
这个恒等式来自:
\[ \nabla_\theta \log p_\theta(\tau)=\frac{\nabla_\theta p_\theta(\tau)}{p_\theta(\tau)} \]
代回去:
\[ \nabla_\theta J(\theta)=\int p_\theta(\tau)\nabla_\theta \log p_\theta(\tau)R(\tau)d\tau \]
写成期望形式:
\[ \nabla_\theta J(\theta)=\mathbb{E}_{\tau\sim\pi_\theta}\left[\nabla_\theta \log p_\theta(\tau)R(\tau)\right] \]
这就是 log-derivative trick,也叫 score function estimator。
它的关键是把「概率的梯度」改写成「log 概率的梯度」。
现在只要能采样轨迹,能计算轨迹 log-prob,就能构造无偏梯度估计。
奖励 \(R(\tau)\) 不需要可微。
环境转移 \(P(s'|s,a)\) 也不需要可微。
三、为什么不需要对环境求导
把轨迹概率分解出来:
\[ p_\theta(\tau)=\rho_0(s_0)\prod_{t=0}^{T}\pi_\theta(a_t|s_t)P(s_{t+1}|s_t,a_t) \]
\(\rho_0\) 是初始状态分布。
\(P\) 是环境转移。
通常只有策略依赖 \(\theta\)。
因此:
\[ \log p_\theta(\tau)=\log \rho_0(s_0)+\sum_{t=0}^{T}\log \pi_\theta(a_t|s_t)+\sum_{t=0}^{T}\log P(s_{t+1}|s_t,a_t) \]
对 \(\theta\) 求梯度时,和策略无关的项消失:
\[ \nabla_\theta \log p_\theta(\tau)=\sum_{t=0}^{T}\nabla_\theta\log \pi_\theta(a_t|s_t) \]
所以:
\[ \nabla_\theta J(\theta)=\mathbb{E}_{\tau\sim\pi_\theta}\left[\sum_{t=0}^{T}\nabla_\theta\log\pi_\theta(a_t|s_t)R(\tau)\right] \]
这条式子解释了策略梯度的工程便利性。
你不需要知道奖励模型内部是不是可微。
你不需要对人类偏好求导。
你不需要对单元测试求导。
你也不需要对采样得到的 token 本身求导。
你只需要知道:这条轨迹是当前策略以多大概率采出来的。
语言模型训练正好能给出这一点。
前向时记录每个采样 token 的 log-prob。
反向时用奖励或优势给这些 log-prob 加权。
四、从整条轨迹回报到每步回报
上面的式子用整条轨迹回报 \(R(\tau)\) 给每一步 log-prob 加权。
更常见的写法是用从第 \(t\) 步开始的回报 \(G_t\):
\[ \nabla_\theta J(\theta)=\mathbb{E}_{\tau\sim\pi_\theta}\left[\sum_t \nabla_\theta\log\pi_\theta(a_t|s_t)G_t\right] \]
这就是用户经常看到的策略梯度形式。
为什么可以把 \(R(\tau)\) 换成 \(G_t\)?
因为第 \(t\) 步动作不会影响过去已经发生的奖励。
用过去奖励乘以当前动作的 score 项,在期望下为零。
直观地说,不能因为后来某个 token 概率高,就把已经发生在它之前的奖励归因给它。
形式化写法可以把回报拆成过去和未来:
\[ R(\tau)=\sum_{k<t}\gamma^k r_k + \gamma^t G_t \]
过去奖励项在给定历史后不依赖当前动作。
它对当前策略 score 的期望贡献为零。
因此可以只保留未来回报。
在很多教材中,折扣因子的具体位置会因为 \(G_t\) 定义不同而略有差别。
本系列采用上一篇的定义:
\[ G_t=\sum_{k\ge0}\gamma^k r_{t+k} \]
于是策略梯度写成:
\[ \nabla_\theta J(\theta)=\mathbb{E}_{\tau\sim\pi_\theta}\big[\sum_t \nabla_\theta\log\pi_\theta(a_t|s_t)G_t\big] \]
这就是策略梯度定理在采样估计中的核心形式。
五、REINFORCE 算法
REINFORCE 由 Williams 在 1992 年系统提出。
它是最直接的 Monte-Carlo 策略梯度算法。
基本流程是:用当前策略采样轨迹,计算每一步回报,用回报乘以 log-prob 梯度更新策略。
对于最大化目标,可以写成梯度上升:
\[ \theta \leftarrow \theta + \alpha \sum_t \nabla_\theta\log\pi_\theta(a_t|s_t)G_t \]
深度学习框架通常做梯度下降。
因此会把 loss 写成负号:
\[ \mathcal{L}_{\text{PG}}(\theta)=-\sum_t \log\pi_\theta(a_t|s_t)G_t \]
对这个 loss 做梯度下降,就等价于对期望回报做梯度上升。
语言模型里,若一条回答 \(y=(x_1,\ldots,x_T)\) 的奖励为 \(R(q,y)\),且取 \(\gamma=1\)、没有中间奖励,则示意 loss 是:
\[ \mathcal{L}_{\text{REINFORCE}}(\theta)=-R(q,y)\sum_{t=1}^{T}\log\pi_\theta(x_t|q,x_{<t}) \]
如果奖励高,这条回答的 token log-prob 会被推高。
如果奖励低,训练会降低这条回答的概率,或者在加基线后让它相对下降。
这和 SFT 很像,但权重不同。
SFT 对所有示范答案一视同仁地最大化似然。
REINFORCE 按采样回答的回报给似然加权。
SFT 学的是「数据集中出现过的答案」。
REINFORCE 学的是「当前策略采样后得到高奖励的答案」。
这也是在线 RL 能带来探索的根本原因。
六、伪代码:语言模型上的 REINFORCE 示意
下面的伪代码只展示核心结构。
真实 RLHF 还会加入 KL 约束、参考模型、长度 mask、奖励归一化、梯度裁剪和分布式采样。
# 示意:单 prompt 批次上的 REINFORCE,不是完整训练代码
for prompts in dataloader:
responses, old_logprobs = policy.sample(prompts)
# reward_fn 可以是奖励模型、规则校验器或单元测试;它不需要可微
rewards = reward_fn(prompts, responses)
# 如果只有序列级奖励,简单地把同一个奖励广播到 response 的每个 token
returns = broadcast_to_tokens(rewards, responses.attention_mask)
logprobs = policy.logprobs(prompts, responses)
loss = -(logprobs * returns * responses.attention_mask).sum()
loss = loss / responses.attention_mask.sum()
optimizer.zero_grad()
loss.backward()
optimizer.step()这段代码里,reward_fn 不在反向图中。
它只提供标量权重。
真正参与反向传播的是 policy.logprobs。
这就是「不需要对环境求导」在代码层面的表现。
如果奖励来自单元测试,测试通过是 1,失败是 0,仍然可以训练。
如果奖励来自人类偏好模型,只要输出标量,也可以训练。
如果奖励来自字符串规则或数学答案匹配,同样可以训练。
但这个示意也暴露了问题。
同一个序列奖励被广播到所有 token。
长序列里许多 token 对最终奖励贡献不同。
用同一个权重会带来很高方差。
这就是基线、优势函数和 Actor-Critic 要解决的问题。
七、基线:减方差但不引入偏差
REINFORCE 的梯度估计无偏,但方差很高。
一个经典改进是减去基线(baseline):
\[ \nabla_\theta J(\theta)=\mathbb{E}\left[\sum_t \nabla_\theta\log\pi_\theta(a_t|s_t)(G_t-b(s_t))\right] \]
只要基线 \(b(s_t)\) 不依赖当前动作 \(a_t\),这个估计仍然无偏。
证明很短。
考虑基线项的期望:
\[ \mathbb{E}_{a\sim\pi_\theta(\cdot|s)}[\nabla_\theta\log\pi_\theta(a|s)b(s)] \]
因为 \(b(s)\) 与动作无关,可以提出去:
\[ b(s)\sum_a \pi_\theta(a|s)\nabla_\theta\log\pi_\theta(a|s) \]
代入 \(\pi\nabla\log\pi=\nabla\pi\):
\[ b(s)\sum_a \nabla_\theta\pi_\theta(a|s) \]
求和与梯度交换:
\[ b(s)\nabla_\theta\sum_a\pi_\theta(a|s) \]
策略概率和为 1:
\[ b(s)\nabla_\theta 1 = 0 \]
所以减去基线不会改变期望梯度。
它只改变方差。
最常见的状态基线就是价值函数:
\[ b(s_t)=V^\pi(s_t) \]
于是权重变成优势:
\[ G_t - V^\pi(s_t) \]
如果某个动作得到的回报高于当前状态的平均水平,优势为正。
如果低于平均水平,优势为负。
这比直接用回报更稳定。
八、高方差为什么在 LLM 上尤其严重
REINFORCE 的高方差在语言模型上会被放大。
第一,序列很长。
一条回答可能有几百到几千个 token。
每个 token 都是一次动作。
梯度里会累加大量 score 项。
第二,奖励稀疏。
RLHF 奖励模型通常在完整回答后给分。
RLVR 也常常只根据最终答案或单元测试给分。
中间 token 没有直接反馈。
第三,动作空间大。
词表很大。
在每一步,模型都在高维离散空间中选择。
采样噪声会直接进入梯度。
第四,prompt 难度差异大。
简单 prompt 上,很多回答都能得高分。
困难 prompt 上,即使合理回答也可能得低分。
如果不做 baseline 或归一化,梯度会混入样本难度。
第五,奖励尺度会漂移。
奖励模型分数、规则奖励、KL 惩罚和长度惩罚组合后,尺度可能随训练改变。
这会影响更新步长。
因此,实际后训练很少使用最朴素的 REINFORCE。
PPO 用 value head 和 GAE 做优势估计。
RLOO 用 leave-one-out 基线在同一 prompt 的多条回答之间做相对比较。
GRPO 用组内均值和标准差构造相对优势,并去掉显式 Critic。
这些方法都可以看成围绕同一个核心问题展开:如何保留策略梯度的无偏或近似合理方向,同时降低方差和工程成本。
九、RLOO:回到 REINFORCE 的现代版本
Ahmadian 等人在 2024 年的 Back to Basics 中重新讨论了 REINFORCE 风格优化在 LLM 人类反馈学习中的作用。
其中一个重要思想是 RLOO(REINFORCE Leave-One-Out)。
它不是给每个状态训练一个价值网络。
它对同一个 prompt 采样多条回答。
假设第 \(i\) 条回答奖励为 \(R_i\),同组共有 \(K\) 条回答。
leave-one-out 基线为:
\[ b_i=\frac{1}{K-1}\sum_{j\ne i}R_j \]
优势估计为:
\[ \hat A_i=R_i-b_i \]
如果某条回答比同 prompt 下其它回答更好,它的优势为正。
如果更差,优势为负。
这个方法和 LLM 场景很匹配。
因为 prompt 难度差异很大。
同 prompt 内比较可以抵消很多难度差异。
它也避免训练 value head。
代价是需要每个 prompt 采样多条回答。
RLOO 和后面 12|GRPO 有明显亲缘关系。
两者都强调组内相对信号。
GRPO 更系统地把组内归一化优势放进 PPO 风格目标中,并用于大规模推理模型训练语境。
这条线说明一个趋势:LLM 后训练不一定总要照搬传统 Actor-Critic。
当环境是语言生成、奖励是序列级、同 prompt 可并行采样时,组内相对估计很自然。
十、策略梯度与 SFT 的关系
SFT 的 loss 是负对数似然:
\[ \mathcal{L}_{\text{SFT}}(\theta)=-\sum_t\log\pi_\theta(x_t^{\star}|q,x_{<t}^{\star}) \]
它只使用数据集中给定的参考回答 \(x^\star\)。
REINFORCE 的 loss 可以写成:
\[ \mathcal{L}_{\text{PG}}(\theta)=-\sum_t\hat A_t\log\pi_\theta(x_t|q,x_{<t}) \]
它使用当前策略采样出的回答 \(x\)。
权重是回报或优势 \(\hat A_t\)。
当 \(\hat A_t=1\) 且样本来自人工示范时,形式上就接近 SFT。
当 \(\hat A_t\) 来自奖励函数时,训练目标就变成「提高高奖励采样的概率」。
这解释了 SFT 和 RL 的连续性。
它们都在调 token log-prob。
差别在样本来源和权重来源。
SFT 的样本来自标注数据,权重通常固定。
RL 的样本来自当前策略,权重来自奖励或优势。
这也解释了为什么后训练常先 SFT 再 RL。
SFT 把策略初始化到可用区域。
RL 在这个区域附近探索更高奖励的回答。
如果没有 SFT,初始策略采样质量太差,奖励信号稀疏,RL 很难开始。
如果只有 SFT,模型只能模仿数据,难以利用偏好比较和在线探索。
十一、本篇的最短结论
策略梯度从 \(J(\theta)=\mathbb{E}_{\tau\sim\pi_\theta}[R(\tau)]\) 出发。
通过 log-derivative trick,把不可微奖励的优化变成 log-prob 的加权梯度。
核心公式是:
\[ \nabla_\theta J(\theta)=\mathbb{E}_{\tau\sim\pi_\theta}\big[\sum_t \nabla_\theta\log\pi_\theta(a_t|s_t)G_t\big] \]
REINFORCE 是最直接的 Monte-Carlo 实现。
它不需要对环境、奖励模型、人类偏好或单元测试求导。
基线 \(b(s)\) 只要不依赖当前动作,就能在不引入偏差的情况下降低方差。
LLM 上的长序列、稀疏末尾奖励和大动作空间会放大 REINFORCE 方差。
RLOO、GRPO、Actor-Critic 和 PPO 都是在这个基本框架上改进方差、稳定性和工程成本。
下一篇进入 Actor-Critic、优势函数和 GAE,解释 PPO 之前最重要的方差控制工具。
参考资料
- Williams, R. J. 1992. Simple statistical gradient-following algorithms for connectionist reinforcement learning. Machine Learning.
- Sutton, R. S., Barto, A. G. 2018. Reinforcement Learning: An Introduction. 2nd edition. MIT Press.
- Ahmadian, A., Cremer, C., Gallé, M., et al. 2024. Back to Basics: Revisiting REINFORCE Style Optimization for Learning from Human Feedback in LLMs. arXiv:2402.14740.
- 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.
← 上一篇:02|MDP、回报与贝尔曼方程 | 下一篇:04|Actor-Critic 与优势函数、GAE →
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【强化学习与大模型后训练】02|MDP、回报与贝尔曼方程
用面向语言模型的最小强化学习集合定义 MDP、回报、价值、优势和贝尔曼方程,并解释 token 级与序列级建模的差异。
【强化学习与大模型后训练】01|系列总览:从 RL 到 LLM 后训练的地图
把强化学习到大模型后训练的主线压成一张可阅读地图,区分风格对齐与能力激发,并说明 20 篇文章的依赖关系。
【强化学习与大模型后训练】04|Actor-Critic 与优势函数、GAE
解释 Actor-Critic 架构、优势估计和 GAE 的偏差—方差取舍,并映射到 LLM 后训练中的 value head 与 per-token advantage。
【强化学习与大模型后训练】05|PPO 深度解剖:裁剪目标、KL 约束与实现陷阱
从信任域思想推到 PPO 裁剪目标,解释 KL 约束、完整损失和代码级实现细节,帮助读者判断一次策略更新是否安全。