土法炼钢兴趣小组的算法知识备份

【强化学习与大模型后训练】02|MDP、回报与贝尔曼方程

文章导航

分类入口
rl-posttraining
标签入口
#rl#mdp#bellman-equation#return#value-function#advantage#language-model#rlhf

目录

后训练里的 PPO、GRPO、RLVR 听起来都很远,但它们共同依赖一组很小的强化学习概念。

这组概念不是「智能体在游戏里移动」的故事,而是状态、动作、奖励、回报、价值和策略之间的数学关系。

如果这些词没有先对齐,后面看策略梯度会把奖励当 loss,看 PPO 会把 KL 当正则项,看 RLHF 会误以为奖励模型直接给 token 贴标签。

本文只讲 LLM 后训练需要的最小集合:马尔可夫决策过程(MDP)、轨迹、回报、策略、价值函数、优势函数和贝尔曼期望方程。

读完之后,你应该能把「模型生成一段回答」翻译成一个序列决策问题,并知道为什么 RLHF 的奖励通常只出现在序列末尾。


一、MDP 是什么

马尔可夫决策过程(Markov Decision Process,MDP)用五元组表示:

\[ \mathcal{M} = (\mathcal{S}, \mathcal{A}, P, R, \gamma) \]

其中 \(\mathcal{S}\) 是状态集合。

状态 \(s_t \in \mathcal{S}\) 表示第 \(t\) 步智能体能看到的全部决策信息。

\(\mathcal{A}\) 是动作集合。

动作 \(a_t \in \mathcal{A}\) 是智能体在状态 \(s_t\) 下可选择的行为。

\(P\) 是转移概率。

它定义执行动作后环境如何进入下一个状态:

\[ P(s_{t+1} \mid s_t, a_t) \]

\(R\) 是奖励函数。

常见写法是:

\[ R(s_t, a_t) = \mathbb{E}[r_t \mid s_t, a_t] \]

也可以写成依赖下一个状态:

\[ R(s_t, a_t, s_{t+1}) = \mathbb{E}[r_t \mid s_t, a_t, s_{t+1}] \]

\(\gamma \in [0,1]\) 是折扣因子。

它控制未来奖励相对当前奖励的权重。

\(\gamma\) 越接近 1,智能体越重视长期结果。

\(\gamma\) 越接近 0,智能体越短视。

MDP 的核心假设叫马尔可夫性。

它要求未来只依赖当前状态和当前动作,而不依赖更早的历史:

\[ P(s_{t+1} \mid s_0,a_0, \ldots,s_t,a_t)=P(s_{t+1} \mid s_t,a_t) \]

这不是说历史不重要。

它说的是:如果历史重要,就必须被编码进当前状态。

语言模型里,「prompt + 已生成 token」就是把历史放进状态的方式。

如果状态只写成最后一个 token,马尔可夫性就不成立。

如果状态写成完整上下文,下一 token 的分布就可以只依赖当前状态。

这就是把自回归生成建模成 MDP 的入口。


二、轨迹、episode 和回报

强化学习不只看单步动作。

它看一整段交互。

一条轨迹(trajectory)通常写成:

\[ au = (s_0, a_0, r_0, s_1, a_1, r_1, \ldots, s_T) \]

如果交互有明确终止点,就叫一个 episode。

在游戏里,episode 可以是一局结束。

在语言模型里,episode 可以是一条回答生成到 EOS token,或者达到最大长度。

\(t\) 步之后的折扣回报(return)定义为:

\[ G_t = \sum_{k=0}^{\infty} \gamma^k r_{t+k} \]

有限 episode 中,求和到终止步即可:

\[ G_t = \sum_{k=0}^{T-t} \gamma^k r_{t+k} \]

回报和单步奖励不同。

奖励 \(r_t\) 是某一步收到的反馈。

回报 \(G_t\) 是从当前开始把未来奖励加总后的结果。

在后训练里,这个区别很关键。

很多 RLHF 设置中,模型生成每个 token 时没有即时奖励。

奖励模型在完整回答生成后给一个标量。

这意味着大部分 \(r_t\) 为 0,只有序列末尾有非零奖励。

设回答长度为 \(T\),只有终止奖励 \(R_{\text{seq}}\),则可以写成:

\[ r_t = 0 \quad (t < T), \qquad r_T = R_{\text{seq}} \]

于是第 \(t\) 步的回报是:

\[ G_t = \gamma^{T-t}R_{\text{seq}} \]

如果取 \(\gamma=1\),所有 token 位置拿到同一个序列级回报:

\[ G_t = R_{\text{seq}} \]

这解释了为什么语言模型上的策略梯度方差很高。

每个 token 动作都要为最终序列奖励背锅。

但最终奖励可能只告诉你整段回答好不好。

它没有直接告诉你第 37 个 token 是否关键。


三、策略:语言模型就是一个随机策略

策略(policy)定义智能体在状态下选择动作的概率。

随机策略写成:

\[ \pi(a \mid s) \]

带参数的策略写成:

\[ \pi_\theta(a \mid s) \]

在深度强化学习里,\(\theta\) 通常是神经网络参数。

在语言模型后训练里,\(\theta\) 就是语言模型参数。

给定 prompt 和已生成 token,模型输出下一个 token 的概率分布:

\[ \pi_\theta(x_t \mid x_{<t}, q) \]

其中 \(q\) 是 prompt,\(x_{<t}\) 是已经生成的 token 前缀。

把它映射到 MDP 记号:

\[ s_t = (q, x_1, \ldots, x_{t-1}) \]

\[ a_t = x_t \]

\[ \pi_\theta(a_t \mid s_t)=\pi_\theta(x_t \mid q, x_{<t}) \]

自回归生成一整段回答的概率是每一步条件概率的乘积:

\[ \pi_\theta(x_{1:T} \mid q)=\prod_{t=1}^{T}\pi_\theta(x_t \mid q,x_{<t}) \]

取对数后变成求和:

\[ \log \pi_\theta(x_{1:T} \mid q)=\sum_{t=1}^{T}\log \pi_\theta(x_t \mid q,x_{<t}) \]

这条式子会在下一篇策略梯度里反复出现。

它说明提高一条高奖励回答的概率,实际是在提高这条回答中每个 token 的条件对数概率。

语言模型策略和传统控制策略有一个明显差异。

动作空间是词表。

一次动作就是选择一个 token。

词表可能有几万到几十万个 token。

动作序列长度也可能达到几百、几千甚至更长。

这会放大探索和信用分配问题。


四、价值函数和动作价值函数

价值函数回答一个问题:在某个状态下,按照策略继续行动,未来回报的期望是多少。

状态价值函数定义为:

\[ V^\pi(s)=\mathbb{E}_\pi[G_t \mid s_t=s] \]

动作价值函数定义为:

\[ Q^\pi(s,a)=\mathbb{E}_\pi[G_t \mid s_t=s,a_t=a] \]

两者差别在于是否指定当前动作。

\(V^\pi(s)\) 只问「在状态 \(s\) 下继续按策略走,平均会得到多少回报」。

\(Q^\pi(s,a)\) 问「在状态 \(s\) 下先做动作 \(a\),之后再按策略走,平均会得到多少回报」。

在语言模型里,\(V^\pi(s_t)\) 可以理解为:给定 prompt 和当前前缀,继续生成的期望质量。

\(Q^\pi(s_t,a_t)\) 可以理解为:如果下一个 token 选 \(a_t\),后续继续按模型生成,最终回答的期望质量。

这个解释很直观,但实际学习很难。

因为奖励通常在序列末尾出现。

要估计某个前缀的价值,需要知道从这个前缀出发所有可能后续的平均结果。

这就是为什么 PPO 类 RLHF 会训练一个 value head。

value head 试图在每个 token 位置预测未来回报。

它不生成 token。

它给每个状态输出一个标量 \(V_\phi(s_t)\)

后面 Actor-Critic 和 GAE 会详细讲它如何参与优势估计。


五、优势函数:动作比平均策略好多少

优势函数(advantage function)定义为:

\[ A^\pi(s,a)=Q^\pi(s,a)-V^\pi(s) \]

它回答的是相对问题。

不是「这个动作绝对有多好」。

而是「这个动作比当前状态下按策略平均行动好多少」。

如果 \(A^\pi(s,a)>0\),动作 \(a\) 比平均行为更好。

如果 \(A^\pi(s,a)<0\),动作 \(a\) 比平均行为更差。

如果 \(A^\pi(s,a)=0\),动作 \(a\) 和策略平均水平一样。

优势函数对策略优化很重要。

因为策略梯度并不一定要用完整回报 \(G_t\) 作为权重。

它可以用优势估计作为权重。

高优势动作的概率应该上升。

低优势动作的概率应该下降。

相比直接用回报,优势可以减少方差。

例如两个 prompt 的奖励尺度不同。

一个 prompt 上所有回答都容易得高分。

另一个 prompt 上所有回答都难。

直接用回报会把 prompt 难度混进梯度。

用优势则先减去状态基线,关注「相对同一状态的平均水平好多少」。

这也是 GRPO 使用组内相对奖励的直觉来源。

同一个 prompt 采样多条回答。

用组内均值作为基线。

每条回答的相对好坏比绝对奖励更稳定。


六、贝尔曼期望方程的推导

贝尔曼方程的核心思想是递归分解回报。

从回报定义开始:

\[ G_t = r_t + \gamma r_{t+1} + \gamma^2 r_{t+2}+\cdots \]

把第一项拆出来:

\[ G_t = r_t + \gamma(r_{t+1}+\gamma r_{t+2}+\cdots) \]

括号里的部分就是下一步回报 \(G_{t+1}\)

\[ G_t = r_t + \gamma G_{t+1} \]

对状态价值函数取条件期望:

\[ V^\pi(s)=\mathbb{E}_\pi[G_t \mid s_t=s] \]

代入递归式:

\[ V^\pi(s)=\mathbb{E}_\pi[r_t+\gamma G_{t+1} \mid s_t=s] \]

下一步动作由策略采样。

下一状态由环境转移采样。

因此可以展开为:

\[ V^\pi(s)=\sum_a \pi(a \mid s)\sum_{s'}P(s' \mid s,a)\left(R(s,a,s')+\gamma V^\pi(s')\right) \]

这就是状态价值的贝尔曼期望方程。

它说:一个状态的价值,等于所有动作和后继状态上「即时奖励 + 折扣后的下一状态价值」的期望。

动作价值函数也可以递归分解。

从定义开始:

\[ Q^\pi(s,a)=\mathbb{E}_\pi[G_t \mid s_t=s,a_t=a] \]

同样代入 \(G_t=r_t+\gamma G_{t+1}\)

\[ Q^\pi(s,a)=\sum_{s'}P(s' \mid s,a)\left(R(s,a,s')+\gamma V^\pi(s')\right) \]

再把 \(V^\pi(s')\) 展开成策略下的动作价值期望:

\[ V^\pi(s')=\sum_{a'}\pi(a' \mid s')Q^\pi(s',a') \]

得到动作价值的贝尔曼期望方程:

\[ Q^\pi(s,a)=\sum_{s'}P(s' \mid s,a)\left(R(s,a,s')+\gamma \sum_{a'}\pi(a' \mid s')Q^\pi(s',a')\right) \]

这两条式子不只是理论定义。

它们告诉我们价值学习可以用 bootstrap。

如果知道下一状态价值,就可以估计当前状态价值。

TD 学习、Actor-Critic、GAE 都建立在这个递归结构上。


七、把贝尔曼方程放回语言生成

现在把 MDP 映射回语言模型。

状态是 prompt 加当前前缀:

\[ s_t=(q,x_{<t}) \]

动作是下一个 token:

\[ a_t=x_t \]

转移由动作确定:

\[ s_{t+1}=(q,x_{<t},x_t) \]

如果忽略采样系统外部随机性,这个转移在给定 token 后是确定的。

随机性主要来自策略选择 token。

奖励有两种常见视角。

第一种是 token 级视角。

每一步都可能有奖励:

\[ r_t=R(s_t,a_t) \]

例如某些过程奖励模型可以给中间步骤打分。

第二种是轨迹级视角,也可以叫 bandit 视角。

完整回答生成后才有奖励:

\[ R_{\text{seq}}(q,x_{1:T}) \]

在这个视角下,环境只在末尾反馈一次。

中间 token 没有单独奖励。

RLHF 常用第二种。

奖励模型读入 prompt 和完整回答,输出一个标量。

再加上参考模型 KL 惩罚后,得到训练用的总奖励。

用 MDP 语言写,就是:

\[ r_t = r_t^{\text{KL}} \quad (t<T) \]

\[ r_T = r_T^{\text{KL}} + R_{\text{RM}}(q,x_{1:T}) \]

其中 \(r_t^{\text{KL}}\) 常被实现为每个 token 上的参考模型约束项。

如果暂时不考虑 KL,只有末尾奖励,那么价值函数变成「从当前前缀出发,最终回答得分的期望」。

这很难估计。

因为一个前缀后面可能接出无数回答。

这也是 LLM 强化学习比短 horizon 控制任务更难的原因之一。


八、token 级 MDP 与序列级 bandit

同一条语言生成过程,可以用两种粒度描述。

token 级 MDP 把每个 token 当一步动作。

它的优点是符合自回归模型结构。

策略概率可以分解为每个 token 的概率。

KL 也可以按 token 计算。

价值头可以在每个位置输出 \(V(s_t)\)

PPO、GAE、per-token advantage 都依赖这个视角。

它的缺点是 horizon 很长。

一条 1024 token 的回答就是 1024 步决策。

末尾奖励要沿整条序列传播。

信用分配困难。

序列级 bandit 把整段回答当一个动作。

状态是 prompt。

动作是完整回答 \(y\)

奖励是 \(R(q,y)\)

这个视角更适合 DPO、RLOO 和一些偏好优化推导。

它的优点是简单。

它直接比较完整回答。

它的缺点是看不到 token 内部结构。

如果要做 per-token KL、value head 或 GAE,还得回到 token 级 MDP。

两种视角没有谁绝对正确。

它们是同一个生成过程的不同投影。

当你推导策略梯度时,序列级写法更短。

当你实现 PPO 时,token 级写法更接近代码。

当你分析奖励黑客时,二者都需要。

序列级奖励可能诱导整体行为偏移。

token 级 KL 则限制每一步偏离参考模型的幅度。


九、一个最小例子:只在结尾给奖励

设 prompt 是一道数学题。

模型生成三个 token 后结束。

轨迹为:

\[ (q) \rightarrow x_1 \rightarrow x_2 \rightarrow x_3 \rightarrow \text{EOS} \]

状态分别是:

\[ s_1=(q) \]

\[ s_2=(q,x_1) \]

\[ s_3=(q,x_1,x_2) \]

动作分别是 \(x_1,x_2,x_3\)

如果最终答案正确,奖励为 1。

如果错误,奖励为 0。

不考虑折扣,且没有中间奖励,则:

\[ G_1=G_2=G_3=R_{\text{seq}} \]

策略梯度会把同一个最终奖励乘到三个 token 的 log-prob 上。

如果答案正确,三个 token 的概率都会被推高。

如果答案错误,三个 token 的概率都会被压低或相对降低。

但这不一定精确。

可能前两个 token 是正确推理,第三个 token 写错了最终数字。

也可能第一步就选错方向,后面只是顺着错误继续写。

仅靠末尾奖励无法直接区分。

价值函数和优势估计试图缓解这个问题。

过程奖励模型也试图直接给中间步骤反馈。

但它们都引入新的建模误差。

这就是后面 PRM/ORM 和奖励黑客会反复讨论的主题。


十、本篇的最短结论

MDP 用 \((\mathcal{S},\mathcal{A},P,R,\gamma)\) 描述序列决策。

语言生成可以看成 MDP:状态是 prompt 加已生成 token,动作是下一个 token,策略是语言模型的条件分布。

回报 \(G_t\) 是未来奖励的折扣和。

状态价值 \(V^\pi(s)\) 是从状态出发的期望回报。

动作价值 \(Q^\pi(s,a)\) 是先做动作再继续的期望回报。

优势 \(A^\pi(s,a)=Q^\pi(s,a)-V^\pi(s)\) 衡量动作相对平均策略好多少。

贝尔曼期望方程把价值写成「即时奖励 + 下一状态价值」的递归期望。

RLHF 中奖励常在完整回答末尾出现,因此 LLM 强化学习面临长 horizon、稀疏奖励和信用分配问题。

下一篇从这些定义出发,推导为什么可以用 \(\nabla_\theta \log \pi_\theta(a_t|s_t)\) 来优化不可微的环境奖励。


参考资料

← 上一篇:01|系列总览 | 下一篇:03|策略梯度与 REINFORCE

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-05-29 · rl-posttraining

强化学习与大模型后训练

从 MDP、策略梯度、PPO 等强化学习最小必要集出发,系统讲清现代大模型后训练:SFT、奖励模型、RLHF,到 DPO/IPO/KTO/ORPO/SimPO 免 RL 对齐、GRPO,再到 RLVR 可验证奖励、推理模型(o1/R1 范式)、过程奖励、奖励黑客、RL 训练基础设施与评测。全 20 篇深度博客。


By .