V(s) 与贝尔曼方程——价值评估的基础
本节导读
核心内容
- 掌握状态价值函数 如何评估一个局面的长期好坏。
- 理解 DP、MC、TD 三种方法如何从理论公式或实际数据中估计 。
- 学会用 TD Target 和 TD Error 判断价值估计应该上调还是下调。
核心公式
为什么需要这些公式
这一页继续追问一个很实际的问题:既然 表示"这个局面值多少分",那程序里这个数到底怎么学出来?如果规则全知道,可以用 DP 一格一格算;如果规则不知道,可以用 MC 跑完整局后用真实结果修正;如果连等到结束都太慢,就用 TD 走一步修一步。这里的恍然大悟点是:价值函数不是一开始就准确的评分器,它更像一个不断被训练的预报员。每来一条新经验,它就把原来的预测往真实结果挪一点。后面训练 Critic 时,用的正是这类思想。
上一节我们定义了 MDP 五元组、折扣累积回报 和策略 。现在要回答一个核心问题:当前的局面对智能体来说到底值多少分?
这就是状态价值函数 的任务。本节将聚焦于一个更实际的问题:贝尔曼方程给了我们计算 的理论公式,但在实际中,怎么从数据里把 估计出来?我们将看到三种经典方法——DP、MC、TD——每一代都解决了前一代的核心局限。
V(s):这个局面值多少分
的定义是:站在状态 ,遵循策略 行动,平均能拿多少分:
用一个类比来说, 就像一个棋局评估器——给你一个棋盘局面,它告诉你从这步开始最终能赢的概率有多大。好的局面 值高,差的局面 值低。
注意 的上标是 ——这意味着同一个状态,用不同的策略会得到不同的价值。好策略的 高,差策略的 低。RL 的终极目标,就是找到让 最高的那个策略 。
但 的定义存在一个计算上的困难:它要求将当前时刻到终止的所有奖励累加起来——即需要知道未来每一步会发生什么。对于只有 1 个状态的老虎机,尚可硬算。但 CartPole 有无限多个状态,大模型有天文数字的 token 序列——穷举未来是不可能的。
上一节已经展示了贝尔曼方程如何将这个"无穷"问题转化为一个递归结构,以及如何用老虎机验证了 。现在的问题是:知道了理论公式,怎么从实际数据中算出 ?
三种算 V 的方法:DP、MC、TD
贝尔曼方程给出了计算 的理论公式。但在实际中,怎么从数据里估计 ?有三代方法,每一代都解决了前一代的局限。
第一代:动态规划(DP)—— 知道一切时的最优解
如果你完全知道环境的转移概率 和奖励函数 ——比如你自己写的 GridWorld——你可以直接用贝尔曼方程迭代:
反复对所有状态执行这个更新, 最终会收敛到精确值。完美、精确、优雅——理论上。
局限: 现实中你几乎不可能知道完整的 和 。围棋有 个状态,LLM 有天文数字的 token 序列组合。DP 还有一个致命问题——"维数灾难"(Curse of Dimensionality):状态空间每增加一个维度,需要存储的 值数量就指数级增长。一个 的网格只有 100 个状态,但一个 的 Atari 屏幕有天文数字的像素组合。DP 就像一把只能在理想世界使用的完美钥匙——漂亮,但打不开现实中的锁。
第二代:蒙特卡洛(MC)—— 跑完一整趟再回头看
不知道环境模型?那就跑起来看看。MC 方法采样完整的轨迹(从起点到终点),用实际回报 来估计 :
这里 是学习率。 就是"实际拿到的分数减去你之前的预测"——差多少就补多少。
举个具体例子。假设你估计某状态的 ,然后跑了一局游戏,从那个状态到结束实际拿到了 。说明你低估了这个局面的价值。更新后:。再跑几局, 会逐渐趋近真实值。
局限: 必须等到 episode 结束才能更新,不能边走边学。想象你在学开车——MC 方法相当于"每次开完一整趟才能反思哪里做得好",而不是"每过一个路口就能微调"。而且同一个状态,不同 episode 的 波动很大——方差巨大。一个局面可能在某局最终赢了(),另一局最终输了(),仅仅是因为后续决策的运气不同。
第三代:时序差分(TD)—— 走一步就微调预判
TD 是 DP 和 MC 的折中——既不需要环境模型(像 MC),又能边走边学(不像 MC 要等结束):
方括号里就是 TD Error(下一小节详细介绍)。每走一步,用 TD Error 来微调价值估计——偏高就往下调,偏低就往上调。不需要等 episode 结束,也不需要知道环境模型。
TD 的直觉可以用"天气预报"来类比。MC 方法相当于"等一个月后回头看,验证今天的预报准不准"。TD 方法相当于"明天看实际天气,如果和今天的预报不一致,立刻修正今天的预报模型"。后者显然效率更高——你不需要等一个月,一天就能得到反馈。
三代方法的演进与选择
用一个表格总结:
| DP | MC | TD | |
|---|---|---|---|
| 需要环境模型? | 需要 | 不需要 | 不需要 |
| 需要完整轨迹? | 不需要 | 需要 | 不需要 |
| 自举(用估计更新估计)? | 是 | 否 | 是 |
| 偏差 | 无 | 无 | 有(初始估计不准会传播) |
| 方差 | 无 | 高 | 低 |
| 一句话 | 知道一切,离线算 | 跑完一整趟再反思 | 走一步就微调 |
演进逻辑:DP 需要知道一切但不现实 → MC 不需要知道但要等很久 → TD 不需要知道也不需要等。每一代都解决了前一代的核心局限。
什么时候用哪种方法? 这不是一个抽象的理论问题——在实践中,选择往往由任务特征决定:
- 环境模型已知 + 状态空间小(如 GridWorld、简单棋盘游戏)→ DP。这是唯一能保证精确收敛的方法。Sutton & Barto 的教材中大量使用了 DP 来建立直觉。
- 环境模型未知 + episode 短 + 必须无偏(如棋盘游戏的自我对弈)→ MC。AlphaGo 的早期版本就使用了类似 MC 的策略评估。
- 环境模型未知 + episode 长 + 需要在线学习(如机器人控制、游戏 AI)→ TD。这是现代 RL 的默认选择——PPO 中的 Critic 网络本质上就是一个 TD 学习器。
值得注意的是,这条 MC→TD 的演进线不仅出现在价值估计中。在第 5 章,我们将看到 REINFORCE(策略版的 MC,用完整轨迹 )和 Actor-Critic(策略版的 TD,用 )呈现完全相同的演进关系。理解了价值估计中的三代演进,就等于提前理解了策略优化中的三代演进。
TD Error:预测与现实的落差
贝尔曼方程告诉我们价值应该是多少。但在实际训练中,我们对价值的估计往往不准确。TD Error 衡量的是预测与现实的落差:
- :实际比预期好,价值被低估,应该上调
- :实际比预期差,价值被高估,应该下调
- :预测完美,学习完成
TD Error 在训练中到底长什么样?
想象你正在评估 CartPole 中某个特定状态——比如"杆子微微向右倾斜"。一开始你对所有状态的 估计都是 0(初始化)。现在你从这个状态出发,走了一步,拿到了 (杆子没倒),新状态的估计值是 。代入 TD Error:
——这个状态比你想的要好!于是你把这个状态的 往上调。经过几轮训练, 会逐渐稳定在某个值附近, 也越来越小。当训练收敛时,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?
在确定性环境中,理论上可以:只要所有状态的 值都精确满足贝尔曼方程,TD Error 就处处为 0。但在随机环境和函数逼近(神经网络)的情况下,TD Error 通常不会精确为 0。因为环境的随机性导致每次采样到的 不同,而神经网络的参数有限,无法精确表示所有状态的价值。所以在实际训练中,我们追求的是 TD Error 的期望趋近于 0。
V 的局限:不告诉你选哪个动作
告诉你一个局面值多少分,但它有一个根本性的局限:它不区分动作。 只说明"这个棋局不错",但不告诉你"该走车还是走马"。在确定性环境中,你可以通过比较"走车后的 "和"走马后的 "来间接决策——但这要求你知道环境的转移模型 。而在不知道 的情况下(大多数 RL 问题), 就不够用了。
要知道"做这个动作值多少分",我们需要给 加上一个动作条件——这就是 。而围绕"怎么从 V/Q 得到最优策略",有两条截然不同的路线。
下一节将介绍路线一:——给每个动作打分。路线一:Q(s,a)