Skip to content

贝尔曼方程——递归地计算"这个局面值多少分"

本节导读

核心内容

  • 掌握贝尔曼方程的核心递归:当前价值由即时奖励和下一状态价值共同决定。
  • 理解贝尔曼期望方程、贝尔曼最优方程分别用于策略评估和最优控制。
  • 学会用 TD Error 衡量当前价值估计和贝尔曼目标之间的差距。

核心公式

Vπ(s)=Eπ[k=0γkrt+kst=s](状态价值函数定义:定义状态的期望累积回报)V^\pi(s) = \mathbb{E}_\pi\left[\sum_{k=0}^{\infty}\gamma^k r_{t+k}\mid s_t=s\right] \quad \text{(状态价值函数定义:定义状态的期望累积回报)}

Vπ(s)=aAπ(as)[R(s,a)+γsSP(ss,a)Vπ(s)](贝尔曼期望方程:给定策略下递归算价值)V^\pi(s) = \sum_{a \in A}\pi(a\mid s)\left[R(s,a)+\gamma\sum_{s'\in S}P(s'\mid s,a)V^\pi(s')\right] \quad \text{(贝尔曼期望方程:给定策略下递归算价值)}

V(s)=maxa[R(s,a)+γsSP(ss,a)V(s)](贝尔曼最优方程:定义最优策略价值)V^*(s) = \max_a\left[R(s,a)+\gamma\sum_{s'\in S}P(s'\mid s,a)V^*(s')\right] \quad \text{(贝尔曼最优方程:定义最优策略价值)}

δ=r+γV(s)V(s)(TD Error:衡量预测和目标的差距)\delta = r + \gamma V(s') - V(s) \quad \text{(TD Error:衡量预测和目标的差距)}

为什么需要这些公式

前面定义了 V(s)V(s),但定义还不等于会计算。要真按定义算,似乎得把从现在开始所有可能的未来都列出来,这对任何稍微真实一点的任务都不可能。贝尔曼方程的好处是把"看完整个未来"换成"只看一步,再相信下一状态已经有一个价值"。贝尔曼期望方程是在固定策略下算账,贝尔曼最优方程是在每一步都选更好的路。TD Error 则像老师批改作业:你原来猜 V(s)V(s) 是多少,现在看到 r+γV(s)r+\gamma V(s') 这个更接近现实的一步目标,差值就是该改多少。学到这里会发现,RL 很多更新其实都是在不断修正自己的预判。

上一节我们定义了价值函数 V(s)V(s)Q(s,a)Q(s, a)。但当你真正坐下来想计算 V(s)V(s) 的时候,会遇到一个计算上的困难:

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

这个公式要求你把从现在到永远的所有奖励都加起来——你需要知道未来每一步会发生什么。对于只有 1 个状态的老虎机,你也许还能硬算。但 CartPole 有无限多个状态,大模型有天文数字的 token 序列——穷举未来是不可能的。

贝尔曼方程(Bellman Equation)提供了一个优雅的解决方案。但在看公式之前,让我们先玩一个游戏——你可能已经在不知不觉中"发明"了这个方程。

先动手:手画一张宝藏地图

假设你在一个 1×5 的走廊里寻宝:

┌───┬───┬───┬───┬───┐
│ S │   │   │   │ 🏆 │
└───┴───┴───┴───┴───┘

规则:

  • 每走一步 扣 1 分(消耗体力)
  • 到达宝藏 🏆 处 不扣分(游戏结束)
  • 只能往右走

请你拿笔(或在脑子里)把每个格子的价值填进去。 从最右边开始,往左推。

……

想好了吗?

┌────┬────┬────┬────┬───┐
│ -4 │ -3 │ -2 │ -1 │ 0 │
└────┴────┴────┴────┴───┘
  S                      🏆

你是怎么填的?大概率是这样想的:

  • 🏆 那格:到了,不扣分,价值 0
  • 🏆 左边那格:走一步就到宝藏,扣 1 分,价值 -1
  • 再左边:走两步,扣 2 分,价值 -2
  • ……依次类推

现在问你:第 2 格(值 -2)和第 3 格(值 -1)之间有什么关系?

答案是:

第 2 格的价值=1这一步的代价+第 3 格的价值走到那里之后还值多少\text{第 2 格的价值} = \underbrace{-1}_{\text{这一步的代价}} + \underbrace{\text{第 3 格的价值}}_{\text{走到那里之后还值多少}}

也就是 2=1+(1)-2 = -1 + (-1)。每一格的价值,都等于"这一步的即时奖励"加上"下一格的价值"。

你刚才的思路就是贝尔曼方程。 你没有看到未来所有的步骤——你只看了一步(即时奖励)加上"下一格值多少"(下一步的价值),就推出了整条走廊上所有格子的价值。这一步的信息,递归地决定了整个未来的价值。

如果有岔路呢?

上面的走廊只有一条路,你可能会问:如果某个格子有岔路呢?比如走到第 3 格时,有 60% 概率走到宝藏所在的上层走廊(额外价值 +5),40% 概率走到下层的陷阱(价值 -3)。

答案很简单:你把两种可能性的价值按概率加权平均就行了。第 3 格的价值 = 这一步的即时奖励 + 0.6 × 上层走廊的价值 + 0.4 × 下层陷阱的价值。这就是完整版贝尔曼方程中 sP(ss,a)V(s)\sum_{s'} P(s'|s,a) V(s') 那一项的含义——对所有可能的下一状态按概率加权。

现实世界很少是一条直路。贝尔曼方程的强大之处在于:不管岔路有多少条、概率分布多复杂,"当前价值 = 即时奖励 + 未来价值的期望"这个递归结构始终成立。

贝尔曼期望方程

刚才的手画经验可以写成精确的数学公式。贝尔曼方程由美国数学家理查德·贝尔曼在 1957 年提出 [1],核心洞察就是:你不需要"看到未来",只需要看一步就够了。

假设策略是确定性的——在状态 ss 下永远只选动作 aa。那么贝尔曼期望方程可以写成:

Vπ(s)=R(s,a)即时奖励+γsP(ss,a)Vπ(s)折扣后的未来价值V^\pi(s) = \underbrace{R(s, a)}_{\text{即时奖励}} + \underbrace{\gamma \sum_{s'} P(s' | s, a) \, V^\pi(s')}_{\text{折扣后的未来价值}}

让我们逐项拆解:Vπ(s)V^\pi(s) 是我们想求的"状态 ss 在策略 π\pi 下值多少分";R(s,a)R(s, a) 是这一步拿到的即时奖励;γ\gamma 是折扣因子,意思是"未来的 1 分只值 γ\gamma 分";P(ss,a)P(s' | s, a) 是在状态 ss 执行动作 aa 后,环境变成 ss' 的概率;Vπ(s)V^\pi(s') 是下一状态的价值。s\sum_{s'} 对所有可能的下一状态求和,因为你不知道一定会走到哪个 ss'

一句话:当前状态的价值 = 这一步的即时奖励 + 未来所有奖励的折扣总和。

为什么这个递归结构如此重要?因为它把一个看起来不可能的计算——穷举未来无穷多步——降维成了一步的计算。你只需要知道两样东西:这一步的即时奖励 R(s,a)R(s, a),以及下一步的价值 V(s)V(s')。至于 V(s)V(s') 是怎么算出来的?它本身就是另一个贝尔曼方程的解。这种"大问题拆成相同结构的小问题"的思想,正是计算机科学中"分治"和"动态规划"的精髓——这也是贝尔曼当年把这个方法命名为"动态规划"的原因。

上面的公式假设策略只选一个固定的动作。但实际上,策略 π\pi 可能以不同的概率选择不同的动作——比如"70% 选 A,30% 选 B"。把所有动作都考虑进来,完整的贝尔曼期望方程是:

Vπ(s)=aAπ(as)[R(s,a)+γsSP(ss,a)Vπ(s)]V^\pi(s) = \sum_{a \in A} \pi(a | s) \left[ R(s, a) + \gamma \sum_{s' \in S} P(s' | s, a) \, V^\pi(s') \right]

多了一个外层的加权求和 aπ(as)\sum_a \pi(a|s),就是"策略选各动作的概率"。整体翻译:当前状态的价值 = 策略选各动作的概率 ×(每个动作带来的即时奖励 + 折扣后的下一状态价值)。

回看宝藏地图的例子:每一格的价值 = 这步的代价(-1)+ 下一格的价值。那就是最简单的贝尔曼方程——确定性环境,只有一个可能的下一状态,γ=1\gamma = 1

用老虎机亲手验证

理论讲完了,让我们用老虎机来验证这个方程确实成立。

设定:A 台出奖率 60%,策略是"永远选 A",折扣因子 γ=0.9\gamma = 0.9

因为策略固定选择 A,外层的 aπ(as)\sum_a \pi(a|s) 只有一项。而且老虎机是单状态的——不管选择多少轮,每一轮面对的情况完全一样,所以 VV 在每一轮都相同。

代入贝尔曼方程:

V=[0.6×(+1)+0.4×(1)]即时奖励的期望 =0.2+γ0.9×V下一轮还是一样的 VV = \underbrace{[0.6 \times (+1) + 0.4 \times (-1)]}_{\text{即时奖励的期望 } = 0.2} + \underbrace{\gamma}_{0.9} \times \underbrace{V}_{\text{下一轮还是一样的 V}}

注意这里的巧妙之处:因为每一轮的 MDP 结构完全相同,所以"下一状态的价值"就等于"当前状态的价值"——V(s)=V(s)=VV(s') = V(s) = V。这让方程变成了一个关于 VV 的一元方程!

解它:

V=0.2+0.9VV = 0.2 + 0.9V

V0.9V=0.2V - 0.9V = 0.2

0.1V=0.20.1V = 0.2

V=0.210.9=2.0\boxed{V = \frac{0.2}{1 - 0.9} = 2.0}

让我们感受一下 γ\gamma 的影响:当 γ=0\gamma = 0(只看眼前)时,V=0.2V = 0.2;当 γ=0.5\gamma = 0.5(中等远见)时,V=0.4V = 0.4;当 γ=0.9\gamma = 0.9(重视未来)时,V=2.0V = 2.0——未来还有很长,价值很高;当 γ1\gamma \to 1 时,VV \to \infty——无限期游戏中累积奖励发散。

你可以自己快速验证 γ=0.5\gamma = 0.5 的情况:方程变成 V=0.2+0.5VV = 0.2 + 0.5V,解出来 0.5V=0.20.5V = 0.2V=0.4V = 0.4。确实如此——只看一半远的未来,价值只有 γ=0.9\gamma = 0.9 时的五分之一。γ\gamma 每增加 0.1,VV 值就会有显著的增长,因为公式中 V=0.21γV = \frac{0.2}{1-\gamma} 的分母在迅速缩小。这就是为什么实践中 γ\gamma 的选择对训练效果影响巨大——γ\gamma 太小会导致短视策略,γ\gamma 太大则可能导致价值估计不稳定。

贝尔曼最优方程

贝尔曼期望方程评估的是某个给定策略 π\pi 的价值——它告诉你"如果你按这个策略行动,能拿多少分"。但我们的终极目标不是评估策略,而是找到最优策略 π\pi^*——让价值最大的那个策略。

贝尔曼最优方程只做了一个改动:把"对所有动作取策略加权平均"换成"选最好的那个动作":

V(s)=maxa[R(s,a)+γsSP(ss,a)V(s)]V^*(s) = \max_{a} \left[ R(s, a) + \gamma \sum_{s' \in S} P(s' | s, a) \, V^*(s') \right]

两个方程的区别就在于一个用 \sum(加权平均),一个用 max\max(取最大值)。贝尔曼期望方程问的是"如果我按规矩走,能拿多少分?"贝尔曼最优方程问的是"如果我每步都选最优,能拿多少分?"

思考题:贝尔曼最优方程里为什么没有 π?

因为在最优方程中,策略被 maxa\max_a 替代了——它直接选价值最高的动作,而不需要显式地定义"以多大概率选哪个动作"。换句话说,只要你知道了最优价值函数 VV^*QQ^*,最优策略就直接确定了:π(s)=argmaxaQ(s,a)\pi^*(s) = \arg\max_a \, Q^*(s, a)

但这里有一个陷阱:maxa\max_a 看起来简单,实际上要求你对所有动作都计算一遍再取最大。当动作空间很大(比如大模型有 5 万个 token 作为动作)时,这个"取最大"操作本身就是一件很难的事。

TD Error:预测与现实的落差

贝尔曼方程告诉我们价值应该是多少。但在实际训练中,我们对价值的估计往往是不准确的——就像天气预报不会每次都准一样。

TD Error(时序差分误差,Temporal Difference Error)由安德鲁·巴托和理查德·萨顿在 1988 年引入 RL 领域 [2],他们称之为"RL 的核心新想法"。TD Error 衡量的是一个简单而深刻的问题:你当前的预测和实际经历的结果差了多少?

想象你是个天气预报员,今天预测明天有 80% 概率下雨(V(s)=0.8V(s) = 0.8)。第二天实际没下雨(r=0r = 0),而且你观察到后天也不太会下雨(V(s)=0.3V(s') = 0.3)。用 TD Error 来计算:

δ=r+γV(s)V(s)=0+0.9×0.30.8=0.53\delta = r + \gamma V(s') - V(s) = 0 + 0.9 \times 0.3 - 0.8 = -0.53

δ=0.53<0\delta = -0.53 < 0:实际结果比你的预测差了 0.53,所以下次你会下调降雨概率的预测。

一个关键直觉:TD Error 在训练过程中是从大到小变化的。 训练刚开始时,你的预测 V(s)V(s) 还是随机初始化的,和真实值相差很远,所以 δ\delta 的绝对值通常很大。随着训练的推进,V(s)V(s) 逐渐逼近真实值,δ\delta 也相应地缩小。当训练充分收敛后,δ\delta 的期望值趋近于 0——这意味着你的预测已经足够准确,学习基本完成。这就是为什么在很多 RL 实验中,你会在训练曲线上看到 TD Error 从高值逐步下降到接近零的过程——它就像一个"剩余学习量"的指示器。

形式化地,TD Error 的定义是:

δ=r+γV(s)V(s)\delta = r + \gamma V(s') - V(s)

其中 r+γV(s)r + \gamma V(s') 叫做 TD Target——实际结果加上对未来估计,也就是你"本该"预测的值。V(s)V(s) 是你之前的预测。所以 TD Error = TD Target - 之前的预测 = 预测与现实的落差。

δ>0\delta > 0 时,实际情况比预想的好,价值被低估了,应该上调 V(s)V(s);当 δ<0\delta < 0 时,实际情况比预想的差,价值被高估了,应该下调 V(s)V(s);当 δ=0\delta = 0 时,预测完美,不需要调整,学习完成。

TD Error 不仅仅是一个误差指标——它在 RL 中承担着三重关键角色,贯穿后续几乎所有算法。第一,它是 Critic 网络的学习信号——Critic 直接用 δ\delta 来更新价值估计,偏高就往下调,偏低就往上调(第 5 章 Actor-Critic)。第二,TD Error 本身就是最简单的"优势函数"——A(s,a)=r+γV(s)V(s)=δA(s,a) = r + \gamma V(s') - V(s) = \delta,衡量"做了这个动作比预期好多少"(第 6 章 PPO / GAE)。第三,GAE(广义优势估计)是多个 TD Error 的指数加权和(第 6 章 GAE)。

TD Error 与贝尔曼方程的关系

这里是最关键的连接:贝尔曼方程说 V(s)V(s) 应该等于 r+γV(s)r + \gamma V(s')。TD Error 衡量的就是"当前的 V(s)V(s) 离这个理想值有多远":

δ=(r+γV(s))贝尔曼方程的右边——"应该是什么"V(s)你当前的估计——"现在是什么"\delta = \underbrace{(r + \gamma V(s'))}_{\text{贝尔曼方程的右边——"应该是什么"}} - \underbrace{V(s)}_{\text{你当前的估计——"现在是什么"}}

δ=0\delta = 0 时,贝尔曼方程成立,价值估计完美。当 δ0\delta \neq 0 时,你的估计和理想值有偏差,需要继续调整。RL 算法的核心就是在不断缩小这个落差。

回到宝藏地图的例子:如果你猜第 2 格值 -1(低估了,实际是 -2),走一步到第 3 格,TD Error = -1 + 1×(-1) - (-1) = -1。这个负值告诉你"价值猜高了,往下调"。

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

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

贝尔曼方程给了我们计算价值的工具,TD Error 告诉我们怎么修正价值的误差。但这里有一个前提:你能把每个状态的 VV 值存在一张表格里。如果状态空间太大了呢?

事实上,即使状态空间不大,你也面临一个更根本的问题:你不知道环境的 PPRR。贝尔曼方程里用到了 P(ss,a)P(s'|s,a)R(s,a)R(s,a),但现实中这些通常是未知的。那怎么从实际的交互数据中估计价值?

这两个问题——"不知道环境模型"和"状态空间太大"——驱动了 RL 发展历程中的三代经典方法。下一节,让我们看看研究者们是怎么一步步把贝尔曼方程和 TD Error 变成能跑的算法的。经典方法与路线图

参考文献


  1. Bellman, R. (1957). Dynamic Programming. Princeton University Press. ↩︎

  2. Sutton, R. S. (1988). Learning to predict by the methods of temporal differences. Machine Learning, 3(1), 9-44. ↩︎

Built for reusable bilingual course delivery