Skip to content

V(s) 与贝尔曼方程——价值评估的基础

本节导读

核心内容

  • 掌握状态价值函数 Vπ(s)V^\pi(s) 如何评估一个局面的长期好坏。
  • 理解 DP、MC、TD 三种方法如何从理论公式或实际数据中估计 V(s)V(s)
  • 学会用 TD Target 和 TD Error 判断价值估计应该上调还是下调。

核心公式

Vπ(s)=Eπ[Gtst=s](状态价值函数定义:衡量局面的长期回报)V^\pi(s) = \mathbb{E}_\pi\left[G_t\mid s_t=s\right] \quad \text{(状态价值函数定义:衡量局面的长期回报)}

V(s)aπ(as)[R(s,a)+γsP(ss,a)V(s)](DP 价值更新:用模型加权求价值)V(s) \leftarrow \sum_a \pi(a\mid s)\left[R(s,a)+\gamma\sum_{s'}P(s'\mid s,a)V(s')\right] \quad \text{(DP 价值更新:用模型加权求价值)}

V(s)V(s)+α[GtV(s)](MC 价值更新:用完整回报修正预测)V(s) \leftarrow V(s)+\alpha\left[G_t-V(s)\right] \quad \text{(MC 价值更新:用完整回报修正预测)}

V(s)V(s)+α[r+γV(s)V(s)](TD 价值更新:边走边修正价值)V(s) \leftarrow V(s)+\alpha\left[r+\gamma V(s')-V(s)\right] \quad \text{(TD 价值更新:边走边修正价值)}

为什么需要这些公式

这一页继续追问一个很实际的问题:既然 V(s)V(s) 表示"这个局面值多少分",那程序里这个数到底怎么学出来?如果规则全知道,可以用 DP 一格一格算;如果规则不知道,可以用 MC 跑完整局后用真实结果修正;如果连等到结束都太慢,就用 TD 走一步修一步。这里的恍然大悟点是:价值函数不是一开始就准确的评分器,它更像一个不断被训练的预报员。每来一条新经验,它就把原来的预测往真实结果挪一点。后面训练 Critic 时,用的正是这类思想。

上一节我们定义了 MDP 五元组、折扣累积回报 GtG_t 和策略 π\pi。现在要回答一个核心问题:当前的局面对智能体来说到底值多少分?

这就是状态价值函数 V(s)V(s) 的任务。本节将聚焦于一个更实际的问题:贝尔曼方程给了我们计算 VV 的理论公式,但在实际中,怎么从数据里把 VV 估计出来?我们将看到三种经典方法——DP、MC、TD——每一代都解决了前一代的核心局限。

V(s):这个局面值多少分

Vπ(s)V^\pi(s) 的定义是:站在状态 ss,遵循策略 π\pi 行动,平均能拿多少分:

Vπ(s)=Eπ[Gtst=s]=Eπ[k=0γkrt+k  |  st=s]V^\pi(s) = \mathbb{E}_\pi \left[ G_t \mid s_t = s \right] = \mathbb{E}_\pi \left[ \sum_{k=0}^{\infty} \gamma^k \, r_{t+k} \;\middle|\; s_t = s \right]

用一个类比来说,V(s)V(s) 就像一个棋局评估器——给你一个棋盘局面,它告诉你从这步开始最终能赢的概率有多大。好的局面 VV 值高,差的局面 VV 值低。

注意 VV 的上标是 π\pi——这意味着同一个状态,用不同的策略会得到不同的价值。好策略的 VV 高,差策略的 VV 低。RL 的终极目标,就是找到让 VV 最高的那个策略 π\pi^*

Vπ(s)V^\pi(s) 的定义存在一个计算上的困难:它要求将当前时刻到终止的所有奖励累加起来——即需要知道未来每一步会发生什么。对于只有 1 个状态的老虎机,尚可硬算。但 CartPole 有无限多个状态,大模型有天文数字的 token 序列——穷举未来是不可能的。

上一节已经展示了贝尔曼方程如何将这个"无穷"问题转化为一个递归结构,以及如何用老虎机验证了 V=0.2/(10.9)=2.0V = 0.2 / (1 - 0.9) = 2.0。现在的问题是:知道了理论公式,怎么从实际数据中算出 VV

三种算 V 的方法:DP、MC、TD

贝尔曼方程给出了计算 VV 的理论公式。但在实际中,怎么从数据里估计 VV?有三代方法,每一代都解决了前一代的局限。

第一代:动态规划(DP)—— 知道一切时的最优解

如果你完全知道环境的转移概率 PP 和奖励函数 RR——比如你自己写的 GridWorld——你可以直接用贝尔曼方程迭代:

V(s)aπ(as)[R(s,a)+γsP(ss,a)V(s)]V(s) \leftarrow \sum_a \pi(a|s) \left[ R(s,a) + \gamma \sum_{s'} P(s'|s,a) V(s') \right]

反复对所有状态执行这个更新,VV 最终会收敛到精确值。完美、精确、优雅——理论上。

局限: 现实中你几乎不可能知道完整的 PPRR。围棋有 1017010^{170} 个状态,LLM 有天文数字的 token 序列组合。DP 还有一个致命问题——"维数灾难"(Curse of Dimensionality):状态空间每增加一个维度,需要存储的 VV 值数量就指数级增长。一个 10×1010 \times 10 的网格只有 100 个状态,但一个 84×84×484 \times 84 \times 4 的 Atari 屏幕有天文数字的像素组合。DP 就像一把只能在理想世界使用的完美钥匙——漂亮,但打不开现实中的锁。

第二代:蒙特卡洛(MC)—— 跑完一整趟再回头看

不知道环境模型?那就跑起来看看。MC 方法采样完整的轨迹(从起点到终点),用实际回报 GtG_t 来估计 V(s)V(s)

V(s)V(s)+α[GtV(s)]V(s) \leftarrow V(s) + \alpha \left[ G_t - V(s) \right]

这里 α\alpha 是学习率。GtV(s)G_t - V(s) 就是"实际拿到的分数减去你之前的预测"——差多少就补多少。

举个具体例子。假设你估计某状态的 V(s)=3V(s) = 3,然后跑了一局游戏,从那个状态到结束实际拿到了 Gt=5G_t = 5。说明你低估了这个局面的价值。更新后:V(s)3+0.1×(53)=3.2V(s) \leftarrow 3 + 0.1 \times (5 - 3) = 3.2。再跑几局,V(s)V(s) 会逐渐趋近真实值。

局限: 必须等到 episode 结束才能更新,不能边走边学。想象你在学开车——MC 方法相当于"每次开完一整趟才能反思哪里做得好",而不是"每过一个路口就能微调"。而且同一个状态,不同 episode 的 GtG_t 波动很大——方差巨大。一个局面可能在某局最终赢了(Gt=10G_t = 10),另一局最终输了(Gt=5G_t = -5),仅仅是因为后续决策的运气不同。

第三代:时序差分(TD)—— 走一步就微调预判

TD 是 DP 和 MC 的折中——既不需要环境模型(像 MC),又能边走边学(不像 MC 要等结束):

V(s)V(s)+α[r+γV(s)V(s)]TD Error δV(s) \leftarrow V(s) + \alpha \underbrace{\left[ r + \gamma V(s') - V(s) \right]}_{\text{TD Error } \delta}

方括号里就是 TD Error(下一小节详细介绍)。每走一步,用 TD Error 来微调价值估计——偏高就往下调,偏低就往上调。不需要等 episode 结束,也不需要知道环境模型。

TD 的直觉可以用"天气预报"来类比。MC 方法相当于"等一个月后回头看,验证今天的预报准不准"。TD 方法相当于"明天看实际天气,如果和今天的预报不一致,立刻修正今天的预报模型"。后者显然效率更高——你不需要等一个月,一天就能得到反馈。

三代方法的演进与选择

用一个表格总结:

DPMCTD
需要环境模型?需要不需要不需要
需要完整轨迹?不需要需要不需要
自举(用估计更新估计)?
偏差有(初始估计不准会传播)
方差
一句话知道一切,离线算跑完一整趟再反思走一步就微调

演进逻辑:DP 需要知道一切但不现实 → MC 不需要知道但要等很久 → TD 不需要知道也不需要等。每一代都解决了前一代的核心局限。

什么时候用哪种方法? 这不是一个抽象的理论问题——在实践中,选择往往由任务特征决定:

  • 环境模型已知 + 状态空间小(如 GridWorld、简单棋盘游戏)→ DP。这是唯一能保证精确收敛的方法。Sutton & Barto 的教材中大量使用了 DP 来建立直觉。
  • 环境模型未知 + episode 短 + 必须无偏(如棋盘游戏的自我对弈)→ MC。AlphaGo 的早期版本就使用了类似 MC 的策略评估。
  • 环境模型未知 + episode 长 + 需要在线学习(如机器人控制、游戏 AI)→ TD。这是现代 RL 的默认选择——PPO 中的 Critic 网络本质上就是一个 TD 学习器。

值得注意的是,这条 MC→TD 的演进线不仅出现在价值估计中。在第 5 章,我们将看到 REINFORCE(策略版的 MC,用完整轨迹 GtG_t)和 Actor-Critic(策略版的 TD,用 r+γV(s)r + \gamma V(s'))呈现完全相同的演进关系。理解了价值估计中的三代演进,就等于提前理解了策略优化中的三代演进。

TD Error:预测与现实的落差

贝尔曼方程告诉我们价值应该是多少。但在实际训练中,我们对价值的估计往往不准确。TD Error 衡量的是预测与现实的落差:

δ=(r+γV(s))TD Target——"应该是什么"V(s)当前估计——"现在是什么"\delta = \underbrace{(r + \gamma V(s'))}_{\text{TD Target——"应该是什么"}} - \underbrace{V(s)}_{\text{当前估计——"现在是什么"}}

  • δ>0\delta > 0:实际比预期好,价值被低估,应该上调 V(s)V(s)
  • δ<0\delta < 0:实际比预期差,价值被高估,应该下调 V(s)V(s)
  • δ=0\delta = 0:预测完美,学习完成

TD Error 在训练中到底长什么样?

想象你正在评估 CartPole 中某个特定状态——比如"杆子微微向右倾斜"。一开始你对所有状态的 VV 估计都是 0(初始化)。现在你从这个状态出发,走了一步,拿到了 r=+1r = +1(杆子没倒),新状态的估计值是 V(s)=0.5V(s') = 0.5。代入 TD Error:

δ=1+0.99×0.50=1.495\delta = 1 + 0.99 \times 0.5 - 0 = 1.495

δ>0\delta > 0——这个状态比你想的要好!于是你把这个状态的 VV 往上调。经过几轮训练,V(s)V(s) 会逐渐稳定在某个值附近,δ\delta 也越来越小。当训练收敛时,TD Error 在 0 附近随机波动——这就是"学习完成"的信号。

在实际的训练日志中,你会看到 TD Error 从训练初期的大幅波动,逐渐收敛到接近 0 的小幅震荡。这种收敛模式在 SwanLab 看板中清晰可见——它是判断训练是否正常的最重要指标之一。

TD Error 在 RL 中承担着多重关键角色,贯穿后续几乎所有算法:第 4 章的 Q-Learning 用它来更新 Q 值,第 6 章的 Critic 网络直接用它作为训练信号,第 7 章的 GAE 是多个 TD Error 的指数加权和。可以说,理解了 TD Error,就理解了现代 RL 算法训练过程的一半。

思考题:TD Error 能不能永远为 0?

在确定性环境中,理论上可以:只要所有状态的 VV 值都精确满足贝尔曼方程,TD Error 就处处为 0。但在随机环境和函数逼近(神经网络)的情况下,TD Error 通常不会精确为 0。因为环境的随机性导致每次采样到的 (r,s)(r, s') 不同,而神经网络的参数有限,无法精确表示所有状态的价值。所以在实际训练中,我们追求的是 TD Error 的期望趋近于 0。

V 的局限:不告诉你选哪个动作

V(s)V(s) 告诉你一个局面值多少分,但它有一个根本性的局限:它不区分动作。V(s)=80V(s) = 80 只说明"这个棋局不错",但不告诉你"该走车还是走马"。在确定性环境中,你可以通过比较"走车后的 VV"和"走马后的 VV"来间接决策——但这要求你知道环境的转移模型 PP。而在不知道 PP 的情况下(大多数 RL 问题),V(s)V(s) 就不够用了。

要知道"做这个动作值多少分",我们需要给 VV 加上一个动作条件——这就是 Q(s,a)Q(s,a)。而围绕"怎么从 V/Q 得到最优策略",有两条截然不同的路线。

下一节将介绍路线一:Q(s,a)Q(s,a)——给每个动作打分。路线一:Q(s,a)

参考文献

Built for reusable bilingual course delivery