Skip to content

V(s) 与贝尔曼方程

本节导读

核心内容

  • 理解状态价值函数 Vπ(s)V^\pi(s):站在状态 ss,按策略 π\pi 行动,未来平均能拿多少总分。
  • 理解贝尔曼方程的核心递推:当前价值 = 眼前奖励 + 折扣后的下一状态价值
  • 区分贝尔曼期望方程和贝尔曼最优方程:一个评估给定策略,一个寻找最优选择。
  • 看懂 TD Target 和 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\mathcal{A}}\pi(a\mid s)\left[R(s,a)+\gamma\sum_{s'\in\mathcal{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\mathcal{S}}P(s'\mid s,a)V^*(s')\right] \quad \text{(贝尔曼最优方程:定义最优状态价值)}

状态价值与贝尔曼方程 (State Value and Bellman Equation):

  • Vπ(s)V^\pi(s):状态 ss 的价值(Value),即从 ss 开始按策略 π\pi 能拿到的平均总分。
  • rt+kr_{t+k}:未来第 kk 步拿到的单步奖励(Reward)。
  • γ\gamma:折扣因子(Gamma),控制对未来奖励的重视程度(010 \sim 1)。
  • π(as)\pi(a\mid s):策略(Policy),在状态 ss 下选择动作 aa 的概率。
  • P(ss,a)P(s'\mid s,a):状态转移概率,在状态 ss 采取动作 aa 后,跳到下一个状态 ss' 的概率。

为什么需要这些公式

有了 MDP 以后,我们已经能描述"局面怎么变"了,但还不知道"一个局面到底好不好"。只看眼前奖励会被骗:CartPole 每活一步都给 +1+1,可"杆子马上要倒"和"杆子很稳"显然不是同一个局面。于是需要 Vπ(s)V^\pi(s),把未来可能拿到的分数提前算回当前状态。可是未来太长,不可能一条条展开,所以贝尔曼方程把问题改成:"这个局面的价值 = 眼前一步 + 下一局面的价值"。读到这里会有一个很重要的"哦":价值不是硬看完整个未来,而是靠递推一层层传回来。下一节自然要问:理论上有了递推式,实际数据里怎么把它学出来?

上一节我们已经有了 MDP 五元组 S,A,P,R,γ\langle \mathcal{S}, \mathcal{A}, P, R, \gamma \rangle,也知道策略 π\pi 会决定智能体怎么行动。现在的问题变成:

站在当前这个局面,智能体到底处于优势还是劣势?

只看一步奖励不够。CartPole 里每活一步都是 +1+1,但“杆子已经快倒了”和“杆子非常稳定”显然不是同一个局面。我们需要一个数,能把未来也考虑进去。这个数就是状态价值函数 V(s)V(s)

符号说明

本节会反复使用下面这些符号。先明确它们各自表示什么:

符号可以先怎么理解
sts_ttt 步的状态,比如棋盘局面、机器人姿态
ata_ttt 步的动作,比如往左走、输出一个控制量
rtr_ttt 步拿到的即时奖励
π(as)\pi(a\mid s)策略在状态 ss 下选择动作 aa 的概率
γ\gamma折扣因子,越远的奖励权重越小
GtG_t从第 tt 步开始往后累积的总回报
Vπ(s)V^\pi(s)在状态 ss 开始,按策略 π\pi 行动的平均总回报

这里有一个很重要的区分:

  • rtr_t 是眼前这一步的即时奖励。它只看一步,走出这一步以后才知道。
  • GtG_t 是从第 tt 步开始,沿着某一条具体轨迹实际拿到的折扣总回报。它看的是一整条轨迹,所以不同轨迹会有不同的 GtG_t
  • Vπ(s)V^\pi(s) 不是某一条轨迹的分数,而是从状态 ss 出发、按策略 π\pi 行动时,对许多可能轨迹上的 GtG_t 取平均。

举个小例子。先写完整定义。折扣回报 GtG_t 的原始公式是:

Gt=k=0γkrt+kG_t = \sum_{k=0}^{\infty}\gamma^k r_{t+k}

把求和展开,就是:

Gt=rt+γrt+1+γ2rt+2+γ3rt+3+G_t = r_t+\gamma r_{t+1}+\gamma^2 r_{t+2} +\gamma^3 r_{t+3} +\cdots

现在为了演示,假设折扣因子 γ=0.9\gamma=0.9,从同一个状态 ss 出发,按同一个策略玩两次,并且每次只截取前三步奖励。也就是先看这个三步截断版本:

Gt=rt+γrt+1+γ2rt+2G_t = r_t+\gamma r_{t+1}+\gamma^2r_{t+2}

第一次比较顺利,三步奖励分别是 2,4,62,4,6。代入公式:

Gt(1)=2rt+0.9×4rt+1+0.92×6rt+2G_t^{(1)} = \underbrace{2}_{r_t} + 0.9\times \underbrace{4}_{r_{t+1}} + 0.9^2\times \underbrace{6}_{r_{t+2}}

计算得到:

Gt(1)=10.46G_t^{(1)} = 10.46

第二次后面遇到坏结果,三步奖励分别是 2,1,32,1,-3。同样代入公式:

Gt(2)=2rt+0.9×1rt+1+0.92×(3)rt+2G_t^{(2)} = \underbrace{2}_{r_t} + 0.9\times \underbrace{1}_{r_{t+1}} + 0.9^2\times \underbrace{(-3)}_{r_{t+2}}

计算得到:

Gt(2)=0.47G_t^{(2)} = 0.47

注意,两次的第一步即时奖励都是 rt=2r_t=2,但后面发生的事情不同,所以整条轨迹的 GtG_t 差很多。状态价值 Vπ(s)V^\pi(s) 是这些可能 GtG_t 的期望;如果现在只有这两次采样,可以先用它们的平均值做一个粗略估计:

Vπ(s)10.46+0.472=5.465V^\pi(s)\approx \frac{10.46+0.47}{2}=5.465

所以,rtr_t 是一步分数,GtG_t 是一整局实际分数,Vπ(s)V^\pi(s) 是站在状态 ss 时对这一整局分数的平均预测。

状态价值函数的定义

状态价值函数的定义是:

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

如果把 GtG_t 展开,就是:

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]

这行公式可以按三层读:

  1. k=0γkrt+k\sum_{k=0}^{\infty}\gamma^k r_{t+k}:从现在开始,把未来奖励加起来。
  2. γk\gamma^k:越远的奖励打折越多。γ=0\gamma=0 只看眼前,γ\gamma 接近 1 更重视长期。
  3. Eπ[]\mathbb{E}_\pi[\cdot]:环境和策略可能有随机性,所以我们看很多次尝试的平均结果。

一句话:Vπ(s)V^\pi(s) 是“从状态 ss 出发,按策略 π\pi 玩下去,平均能拿多少总分”。

为什么上标要写 π\pi?因为同一个状态,策略不同,价值也不同。在同一个棋局里,高手继续下和新手继续下,最终胜率当然不一样。好策略的 Vπ(s)V^\pi(s) 高,差策略的 Vπ(s)V^\pi(s) 低。RL 的目标,就是找到让价值最高的策略。

为什么我们需要贝尔曼方程?

在深入推导之前,我们先停下来理清一个重要的逻辑:是先有状态价值 VV,还是先有贝尔曼方程?

答案是:先有价值函数的概念,贝尔曼方程是为了计算这个价值而发明的“破局工具”。

我们在前面已经定义了状态价值 Vπ(s)V^\pi(s):它是未来所有奖励的折现总和的期望。如果想知道一个状态的价值,最直观的想法就是:直接顺着策略往下走,把一条长长轨迹上的奖励加起来不就行了吗?

但这在现实中面临两个巨大的困难:

  1. 未来太长了:有些任务没有明确的终点(比如维持机器人的平衡),你要加到猴年马月?
  2. 可能性太多了:因为环境和策略都有随机性,状态会像树枝一样呈指数级分叉。要算出一个准确的期望,你需要遍历无数条轨迹。

面对这种无限视野和庞大状态树的问题,1950 年代,美国应用数学家理查德·贝尔曼(Richard Bellman)在创立动态规划(Dynamic Programming)理论时,提出了大名鼎鼎的最优性原理(Principle of Optimality)。他发现:我们不需要一眼望穿整个未来,因为“今天的价值”里,必然包含着“明天的价值”

这就像是算退休金。你不需要现在就把未来 30 年每一天的利息都分别算清楚再相加,你只要知道:“今天的总资产 = 今天的收益 + 明天本金带来的未来总资产”。这种把一个无限期的大问题,精妙地拆解成“当前这一步”和“剩下所有步”的思想,就是动态规划的灵魂。

基于这个原理写出来的递推等式,就被称为贝尔曼方程(Bellman Equation)。它将状态价值从一个无法计算的“无限求和的单向链条”,巧妙地转化成了只依赖于相邻状态的“递归圈”。这不仅是整个强化学习理论的基石,也是后续所有算法(DP、MC、TD 等)能够通过不断迭代来学习价值的底层原因。

接下来,我们就来看看这个神奇的“递归圈”在数学上是如何从 V(s)V(s) 的原始定义中严谨推导出来的。

贝尔曼方程的严谨推导

前面我们凭直觉理解了价值的递推关系,现在我们给出严谨的数学推导。贝尔曼方程的本质是揭示了当前状态价值与未来状态价值之间的递归关系。这一步推导的伟大之处在于:它在数学上严格证明了,我们完全可以把对未来的无限穷举遍历,等价替换成只看“眼前一步”的递归计算。

根据状态价值函数的定义,将其展开:

V(s)=E[Gtst=s]=E[rt+γrt+1+γ2rt+2+st=s]=E[rtst=s]+γE[rt+1+γrt+2+st=s]=R(s)+γE[Gt+1st=s]\begin{aligned} V(s) &= \mathbb{E}[G_t \mid s_t = s] \\ &= \mathbb{E}[r_t + \gamma r_{t+1} + \gamma^2 r_{t+2} + \dots \mid s_t = s] \\ &= \mathbb{E}[r_t \mid s_t = s] + \gamma \mathbb{E}[r_{t+1} + \gamma r_{t+2} + \dots \mid s_t = s] \\ &= R(s) + \gamma \mathbb{E}[G_{t+1} \mid s_t = s] \end{aligned}

这里 R(s)R(s) 是在状态 ss 获得的期望即时奖励。

接下来是最关键的一步:很多人可能会觉得,上面公式里的 E[Gt+1st=s]\mathbb{E}[G_{t+1} \mid s_t = s] 不就是下一个状态的价值 V(st+1)V(s_{t+1}) 吗?直接替换不就完了?

直觉上是对的,但在数学上并不能直接画等号。

我们打个比方来理解这种微妙的差别:

  • E[Gt+1st=s]\mathbb{E}[G_{t+1} \mid s_t = s] 就像是:你**今天(站在 sts_t在预测明天开始(Gt+1G_{t+1})**能赚多少钱。因为明天可能会发生各种情况,所以这个预测里包含着对明天不确定性的猜测。
  • V(st+1)V(s_{t+1}) 就像是:你**明天(已经站在 st+1s_{t+1})**再来算未来能赚多少钱。这时候明天的状态已经是既定事实了。

所以,我们现在的公式是“站在今天算未来”,而我们想要凑出 V(st+1)V(s_{t+1}),就必须想办法把视角从“站在今天”严谨地转换到“站在明天”。

要把视角(也就是概率论里的条件)从 sts_t 顺利过渡到 st+1s_{t+1},我们其实不需要什么高深定理,只需要三个基础的数学工具:条件期望的定义概率论中的边缘化(Marginalization),以及强化学习最重要的物理假设——马尔可夫性(Markov Property)

补充证明:如何严谨地把条件从当前状态推到下一状态?

为了不引入让人眼花缭乱的新符号,我们全程只用 sts_t(当前状态)、st+1s_{t+1}(下一状态)和 Gt+1G_{t+1}(未来的总回报)这三个变量。 我们的终极目标是证明:E[Gt+1st]=E[V(st+1)st]\mathbb{E}[G_{t+1} \mid s_t] = \mathbb{E}[V(s_{t+1}) \mid s_t]

在推导之前,我们要先复习一个高中概率知识:什么是条件变量?期望(E\mathbb{E})到底怎么展开?

想象你在掷两枚骰子 XXYY。如果别人没告诉你任何信息,让你猜 XX 掷出来的点数平均会是多少(即期望),你会怎么算? 很简单:把骰子可能掷出的所有点数(1到6),分别乘以它们掷出的概率(1/6),然后全部加起来。写成公式就是:E[X]=xxP(x)\mathbb{E}[X] = \sum_x x \cdot P(x)。这就是最普通的期望。 但如果别人偷偷告诉你:“嘿,YY 掷出了个 6”。这时候,YY 就是一个已知条件(条件变量)。在已知 Y=6Y=6 的情况下去猜 XX,你的预测肯定会变,这就叫条件期望。写成公式就是把普通的概率换成条件概率:E[XY]=xxP(xY)\mathbb{E}[X \mid Y] = \sum_x x \cdot P(x \mid Y)

这个“把大写 E\mathbb{E} 拆成连加号 \sum 和条件概率 PP 相乘”的操作,是我们下面推导的核心武器。记住:竖线 | 后面的东西,就是我们站在当下已经确定的“既定事实”。

第一步:展开 V(st+1)V(s_{t+1}) 的期望

根据定义,V(st+1)V(s_{t+1}) 就是在给定 st+1s_{t+1} 的情况下,未来回报 Gt+1G_{t+1} 的期望。我们用上面复习的公式把它展开: V(st+1)=E[Gt+1st+1]=Gt+1Gt+1P(Gt+1st+1)V(s_{t+1}) = \mathbb{E}[G_{t+1} \mid s_{t+1}] = \sum_{G_{t+1}} G_{t+1} \cdot P(G_{t+1} \mid s_{t+1})

所以,我们等式右边要算的式子 E[V(st+1)st]\mathbb{E}[V(s_{t+1}) \mid s_t],其实就是在算一大串东西的期望:

E[V(st+1)st]=E[Gt+1Gt+1P(Gt+1st+1)  |  st]\mathbb{E}[V(s_{t+1}) \mid s_t] = \mathbb{E} \left[ \sum_{G_{t+1}} G_{t+1} P(G_{t+1} \mid s_{t+1}) \;\middle|\; s_t \right]

第二步:对下一状态 st+1s_{t+1} 再次展开期望

上面那个式子最外层还有一个大写的 E[st]\mathbb{E}[\dots \mid s_t]。括号里的东西虽然长,但它本质上就是明天(st+1s_{t+1})的价值

因为“明天”会发生什么是随机的,所以 st+1s_{t+1} 是一个不确定的变量。我们怎么算这个随机变量的期望?还是用刚才那招:把每种可能出现的明天,乘以明天出现的概率,然后加起来

也就是说,外层的 E[st]\mathbb{E}[\dots \mid s_t] 变成了 st+1()P(st+1st)\sum_{s_{t+1}} (\dots) \cdot P(s_{t+1} \mid s_t)

E[V(st+1)st]=st+1(Gt+1Gt+1P(Gt+1st+1))这就是 V(st+1)P(st+1st)明天出现的概率=st+1Gt+1Gt+1P(Gt+1st+1)P(st+1st)\begin{aligned} \mathbb{E}[V(s_{t+1}) \mid s_t] &= \sum_{s_{t+1}} \underbrace{\left( \sum_{G_{t+1}} G_{t+1} P(G_{t+1} \mid s_{t+1}) \right)}_{\text{这就是 } V(s_{t+1})} \cdot \underbrace{P(s_{t+1} \mid s_t)}_{\text{明天出现的概率}} \\ &= \sum_{s_{t+1}} \sum_{G_{t+1}} G_{t+1} P(G_{t+1} \mid s_{t+1}) P(s_{t+1} \mid s_t) \end{aligned}

_(注:第二行只是把括号拆开,把外面的 P(st+1st)P(s_{t+1} \mid s*t) 乘进去了)*

第三步:注入马尔可夫性(最关键的一步!)

注意上面式子里的 P(Gt+1st+1)P(G_{t+1} \mid s_{t+1})。根据马尔可夫性,未来的回报 Gt+1G_{t+1} 只和刚好发生的那一刻的状态 st+1s_{t+1} 有关,跟更早之前的状态 sts_t 没关系。 这就好比你掷骰子,第二把的结果只跟第二把怎么掷有关,跟第一把没关系。所以在数学上,我们可以在条件里强行塞进一个 sts_t,它并不会改变概率的值:P(Gt+1st+1)=P(Gt+1st+1,st)P(G_{t+1} \mid s_{t+1}) = P(G_{t+1} \mid s_{t+1}, s_t)。代入上式:

E[V(st+1)st]=st+1Gt+1Gt+1P(Gt+1st+1,st)P(st+1st)\mathbb{E}[V(s_{t+1}) \mid s_t] = \sum_{s_{t+1}} \sum_{G_{t+1}} G_{t+1} P(G_{t+1} \mid s_{t+1}, s_t) P(s_{t+1} \mid s_t)

第四步:概率的乘法公式与边缘化

如果高中的概率知识忘了也没关系,我们可以简单推导一下条件概率的乘法公式。 最基础的条件概率公式是:P(AB)=P(A,B)P(B)P(A \mid B) = \frac{P(A, B)}{P(B)},也就是“在 B 发生的前提下,A 发生的概率”等于“A 和 B 同时发生的概率”除以“B 本身发生的概率”。 把分母乘过去,就得到了乘法公式P(A,B)=P(AB)P(B)P(A, B) = P(A \mid B) \cdot P(B)

如果我们在所有事件上都加一个额外的条件 CC 作为大前提,这个公式依然成立: P(A,BC)=P(AB,C)P(BC)P(A, B \mid C) = P(A \mid B, C) \cdot P(B \mid C)

现在,我们把 Gt+1G_{t+1} 看作 AAst+1s_{t+1} 看作 BBsts_t 看作 CC。所以式子后面的两个概率相乘可以合并:P(Gt+1st+1,st)P(st+1st)=P(Gt+1,st+1st)P(G_{t+1} \mid s_{t+1}, s_t) \cdot P(s_{t+1} \mid s_t) = P(G_{t+1}, s_{t+1} \mid s_t)。 继续化简:

E[V(st+1)st]=st+1Gt+1Gt+1P(Gt+1,st+1st)=Gt+1Gt+1st+1P(Gt+1,st+1st)(把求和符号换个位置)=Gt+1Gt+1P(Gt+1st)(把所有可能的 st+1 的概率加起来,也就是消掉 st+1)=E[Gt+1st](这刚好就是条件期望的定义!)\begin{aligned} \mathbb{E}[V(s_{t+1}) \mid s_t] &= \sum_{s_{t+1}} \sum_{G_{t+1}} G_{t+1} P(G_{t+1}, s_{t+1} \mid s_t) \\ &= \sum_{G_{t+1}} G_{t+1} \sum_{s_{t+1}} P(G_{t+1}, s_{t+1} \mid s_t) \quad \text{(把求和符号换个位置)} \\ &= \sum_{G_{t+1}} G_{t+1} P(G_{t+1} \mid s_t) \quad \text{(把所有可能的 $s_{t+1}$ 的概率加起来,也就是消掉 $s_{t+1}$)} \\ &= \mathbb{E}[G_{t+1} \mid s_t] \quad \text{(这刚好就是条件期望的定义!)} \end{aligned}

证毕!我们就这样一步步严谨地证明了:E[Gt+1st]=E[V(st+1)st]\mathbb{E}[G_{t+1} \mid s_t] = \mathbb{E}[V(s_{t+1}) \mid s_t]

将这个结论代回原式,我们就得到了贝尔曼方程的标准形式:

V(s)=R(s)+γE[V(st+1)st=s]=R(s)+γsSP(ss)V(s)\begin{aligned} V(s) &= R(s) + \gamma \mathbb{E}[V(s_{t+1}) \mid s_t = s] \\ &= R(s) + \gamma \sum_{s' \in \mathcal{S}} P(s' \mid s) V(s') \end{aligned}

这就是贝尔曼方程最核心的魅力:当前状态的价值,等于即时奖励加上下一个状态价值的期望。

矩阵形式与解析解

当一个环境的状态数量有限时(比如只有 NN 个状态),贝尔曼方程就不再只是一条单独的等式,而是可以扩展为一个包含 NN 个方程的线性方程组。为了方便计算,我们通常会把它打包成矩阵的形式:

(V(s1)V(s2)V(sN))V=(R(s1)R(s2)R(sN))R+γ(P(s1s1)P(s2s1)P(sNs1)P(s1s2)P(s2s2)P(sNs2)P(s1sN)P(s2sN)P(sNsN))P(V(s1)V(s2)V(sN))V\underbrace{ \begin{pmatrix} V(s_1) \\ V(s_2) \\ \vdots \\ V(s_N) \end{pmatrix} }_{\boldsymbol{V}} = \underbrace{ \begin{pmatrix} R(s_1) \\ R(s_2) \\ \vdots \\ R(s_N) \end{pmatrix} }_{\boldsymbol{R}} + \gamma \underbrace{ \begin{pmatrix} P(s_1 \mid s_1) & P(s_2 \mid s_1) & \dots & P(s_N \mid s_1) \\ P(s_1 \mid s_2) & P(s_2 \mid s_2) & \dots & P(s_N \mid s_2) \\ \vdots & \vdots & \ddots & \vdots \\ P(s_1 \mid s_N) & P(s_2 \mid s_N) & \dots & P(s_N \mid s_N) \end{pmatrix} }_{\boldsymbol{P}} \underbrace{ \begin{pmatrix} V(s_1) \\ V(s_2) \\ \vdots \\ V(s_N) \end{pmatrix} }_{\boldsymbol{V}}

在这里:

  • V\boldsymbol{V} 是一个 N×1N \times 1 的列向量,装满了所有状态的价值。
  • R\boldsymbol{R} 是一个 N×1N \times 1 的列向量,代表每个状态对应的期望即时奖励。
  • P\boldsymbol{P} 是一个 N×NN \times N 的状态转移矩阵,描述了从任意状态跳到另一个状态的概率。

如果你熟悉线性代数,就能立刻看出,这个庞大的方程组其实可以被极致压缩成一行简洁的表达式:

V=R+γPV\boldsymbol{V} = \boldsymbol{R} + \gamma \boldsymbol{P} \boldsymbol{V}

既然这是一个关于 V\boldsymbol{V} 的一元一次线性方程,我们完全可以通过移项和提取公因式来直接解出 V\boldsymbol{V}

VγPV=R(IγP)V=RV=(IγP)1R\begin{aligned} \boldsymbol{V} - \gamma \boldsymbol{P} \boldsymbol{V} &= \boldsymbol{R} \\ (\boldsymbol{I} - \gamma \boldsymbol{P}) \boldsymbol{V} &= \boldsymbol{R} \\ \boldsymbol{V} &= (\boldsymbol{I} - \gamma \boldsymbol{P})^{-1} \boldsymbol{R} \end{aligned}

(注:这里的 I\boldsymbol{I} 是单位矩阵。)

至此,我们得到了贝尔曼方程的解析解(Analytic Solution)。这意味着,只要环境的规则(奖励 R\boldsymbol{R} 和转移概率 P\boldsymbol{P})是公开透明的,我们理论上就能直接算出所有状态的绝对准确的价值。

既然有公式,为什么还要学其他算法?

因为现实很残酷。计算解析解需要对矩阵 (IγP)(\boldsymbol{I} - \gamma \boldsymbol{P}) 求逆,而矩阵求逆的计算复杂度高达 O(N3)O(N^3)。如果状态空间稍微大一点(比如围棋的 1017010^{170} 种局面),这辈子都算不完。所以,这种“上帝视角”的直接求解法通常只存在于理论和极简单的玩具环境中。面对复杂问题,我们必须转向动态规划(DP)、蒙特卡洛(MC)或时序差分(TD)等通过不断迭代来逼近真实价值的算法。

引入动作:Q 函数与状态-动作价值

前面我们推导的 V(st)V(s_t) 是基于某个固定策略 π\pi(或者没有动作选择的马尔可夫奖励过程)。为了做决策,我们不仅需要知道“状态好不好”,还需要知道“在这个状态下采取某个动作好不好”。

这就引出了 Q 函数(Q-function),也被称为动作价值函数(Action-value function)。它定义为在某一个状态采取某一个动作后,未来可能得到的期望总回报:

Qπ(st,at)=Eπ[Gtst,at]Q_\pi(s_t, a_t) = \mathbb{E}_\pi[G_t \mid s_t, a_t]

V 和 Q 的关系是什么?Vπ(st)V_\pi(s_t) 是在状态 sts_t 下的平均期望,而我们在状态 sts_t 是按照策略 π(atst)\pi(a_t \mid s_t) 来选择动作的。因此,Vπ(st)V_\pi(s_t) 其实就是所有可能动作的 Qπ(st,at)Q_\pi(s_t, a_t) 按照策略概率的加权和:

Vπ(st)=atAπ(atst)Qπ(st,at)V_\pi(s_t) = \sum_{a_t \in \mathcal{A}} \pi(a_t \mid s_t) Q_\pi(s_t, a_t)

同样地,我们也可以对 Q 函数推导它的贝尔曼方程:

Qπ(st,at)=Eπ[Gtst,at]=Eπ[rt+γGt+1st,at]=R(st,at)+γEπ[Gt+1st,at]=R(st,at)+γEπ[Vπ(st+1)st,at]=R(st,at)+γst+1SP(st+1st,at)Vπ(st+1)\begin{aligned} Q_\pi(s_t, a_t) &= \mathbb{E}_\pi[G_t \mid s_t, a_t] \\ &= \mathbb{E}_\pi[r_t + \gamma G_{t+1} \mid s_t, a_t] \\ &= R(s_t, a_t) + \gamma \mathbb{E}_\pi[G_{t+1} \mid s_t, a_t] \\ &= R(s_t, a_t) + \gamma \mathbb{E}_\pi[V_\pi(s_{t+1}) \mid s_t, a_t] \\ &= R(s_t, a_t) + \gamma \sum_{s_{t+1} \in \mathcal{S}} P(s_{t+1} \mid s_t, a_t) V_\pi(s_{t+1}) \end{aligned}

这说明:采取动作 ata_t 的价值 = 动作 ata_t 带来的即时奖励 + 动作 ata_t 导致的下一状态的平均价值。

贝尔曼期望方程:策略评估

有了 VVQQ 的转换关系,我们就能顺理成章地写出完整的贝尔曼期望方程

Qπ(st,at)Q_\pi(s_t, a_t) 的展开式代入到 Vπ(st)V_\pi(s_t) 的公式中,就得到了评估给定策略 π\pi 的方程:

Vπ(st)=atAπ(atst)[R(st,at)+γst+1SP(st+1st,at)Vπ(st+1)]V^\pi(s_t) = \sum_{a_t \in \mathcal{A}} \pi(a_t \mid s_t) \left[ R(s_t, a_t) + \gamma \sum_{s_{t+1} \in \mathcal{S}} P(s_{t+1} \mid s_t, a_t) V^\pi(s_{t+1}) \right]

这个公式的逻辑非常清晰,分两层展开:

层级在平均什么对应公式
动作层策略可能选择不同动作atπ(atst)\sum_{a_t} \pi(a_t \mid s_t)
状态层同一个动作可能到达不同下一状态st+1P(st+1st,at)\sum_{s_{t+1}} P(s_{t+1} \mid s_t, a_t)

直观例子:宝藏走廊

假设你在一个 1x5 的走廊里寻宝,只能往右走(策略确定 π(st)=1\pi(\text{右} \mid s_t)=1),每走一步奖励 1-1,终点价值为 00,无随机性(P=1P=1),且不打折(γ=1\gamma=1)。 根据方程,V(倒数第二格)=1×[1+1×V(终点)]=1+0=1V(\text{倒数第二格}) = 1 \times [ -1 + 1 \times V(\text{终点}) ] = -1 + 0 = -1。 一层层从右往左递推,各个格子的价值就是 [4,3,2,1,0][-4, -3, -2, -1, 0]。这就是没有任何随机性时,贝尔曼期望方程最朴素的退化形式。

贝尔曼最优方程:寻找最优策略

贝尔曼期望方程回答的是:“如果我按照策略 π\pi 行动,状态 sts_t 值多少分?” 但 RL 的终极目标是寻找最好的策略。我们想知道:“如果我每一步都做最优选择,状态 sts_t 最多值多少分?”

这就引出了最优价值函数 V(st)V^*(s_t) 和最优动作价值函数 Q(st,at)Q^*(s_t, a_t)。 在一个状态下,最优的选择就是挑出那个让 Q(st,at)Q^*(s_t, a_t) 最大的动作:

V(st)=maxatAQ(st,at)V^*(s_t) = \max_{a_t \in \mathcal{A}} Q^*(s_t, a_t)

同样,最优的 Q(st,at)Q^*(s_t, a_t) 依然遵循贝尔曼递推关系(只是未来的状态也被认为会按照最优策略行动):

Q(st,at)=R(st,at)+γst+1SP(st+1st,at)V(st+1)Q^*(s_t, a_t) = R(s_t, a_t) + \gamma \sum_{s_{t+1} \in \mathcal{S}} P(s_{t+1} \mid s_t, a_t) V^*(s_{t+1})

Q(st,at)Q^*(s_t, a_t) 代入 V(st)V^*(s_t) 中,我们就得到了贝尔曼最优方程

V(st)=maxatA[R(st,at)+γst+1SP(st+1st,at)V(st+1)]V^*(s_t) = \max_{a_t \in \mathcal{A}} \left[ R(s_t, a_t) + \gamma \sum_{s_{t+1} \in \mathcal{S}} P(s_{t+1} \mid s_t, a_t) V^*(s_{t+1}) \right]

对比期望方程和最优方程,唯一的区别在于:求和(平均)变成了求最大值(max\max

  • 期望方程 atπ(atst)\sum_{a_t} \pi(a_t \mid s_t):按照策略的概率加权平均。
  • 最优方程 maxat\max_{a_t}:抛弃概率,直接挑选价值最大的那个动作。只要解出了最优方程,最优策略也就自然产生了(每次选 argmaxatQ(st,at)\arg\max_{a_t} Q^*(s_t,a_t) 即可)。

求解示例:迭代逼近

前面提到,矩阵求逆的复杂度太高,通常我们用迭代法来逼近解。现在用一个只有一个状态的老虎机验证贝尔曼方程。

设定:

  • 只有一个状态,玩完一轮还是回到同一个状态。
  • 永远选择 A 机器。
  • A 机器 60% 概率奖励 +1+1,40% 概率奖励 1-1
  • 折扣因子 γ=0.9\gamma=0.9

单步期望奖励是:

R=0.6×(+1)+0.4×(1)=0.2R=0.6\times(+1)+0.4\times(-1)=0.2

因为每一轮之后还是同一个状态,所以下一状态价值还是 VV。根据贝尔曼期望方程,有:

V=0.2+0.9VV=0.2+0.9V

解析解求法(类似于一维的 (IγP)1R(I-\gamma P)^{-1}R):

V0.9V=0.2    0.1V=0.2    V=0.20.1=2.0V-0.9V=0.2 \implies 0.1V=0.2 \implies V=\frac{0.2}{0.1}=2.0

这里的 2.02.0 不是单步奖励,而是“从现在开始一直玩下去,折扣后的平均总回报”。

迭代法求法

V=0V=0 开始,反复执行 VR+γVV\leftarrow R+\gamma V,最后会接近精确解。

python
R = 0.2
gamma = 0.9
V = 0.0

for i in range(50):
    V = R + gamma * V

print(round(V, 6))

运行结果

1.998698

这就是很多强化学习算法(如动态规划和价值迭代)的基本形状。

贝尔曼目标与时序差分误差 (TD Error)

前面我们一直在推导公式,甚至用矩阵求出了“完美解析解”。但现在我们要回到残酷的现实:如果我根本不知道转移概率 PP 和奖励函数 RR 怎么办? 在真实的强化学习任务里(比如玩游戏或者大模型生成),环境是个黑盒。你不可能像做数学题一样在纸上把 V(s)V(s) 算出来。

既然算不出来,那唯一的办法就是猜,然后在实践中不断修正

怎么修正呢?贝尔曼方程在这个时候就成了一把“尺子”。贝尔曼方程告诉我们,一个完美的价值估计,必须满足:

V(s)r+γV(s)V(s) \approx r + \gamma V(s')

注:这里我们用小写的 rrss' 表示在环境里真实走一步采样到的奖励和下一状态

如果等式右边的结果比左边的 V(s)V(s) 大,说明我们之前把 V(s)V(s) 低估了;如果比左边小,说明高估了。 所以,我们可以把右边这项当作一个我们要努力靠近的“目标”(Bellman Target):

Target=r+γV(s)\text{Target} = r + \gamma V(s')

有了目标,有了当前的估计,它们之间的差值,就是我们在强化学习中最重要的数据信号——时序差分误差(Temporal Difference Error,简称 TD Error)

δ=r+γV(s)Bellman targetV(s)当前估计\delta = \underbrace{r + \gamma V(s')}_{\text{Bellman target}} - \underbrace{V(s)}_{\text{当前估计}}

为什么叫“时序差分”?因为它利用了时间序列上相邻两步的差异(站在 ss' 回看 ss)来产生误差信号。

它的含义非常直接:

TD Error说明应该怎么调
δ>0\delta>0target 比当前估计高,说明低估了上调 V(s)V(s)
δ<0\delta<0target 比当前估计低,说明高估了下调 V(s)V(s)
δ=0\delta=0当前估计已经符合 Bellman 关系基本不用调

举个数字例子。假设当前状态的估计是:

V(s)=3V(s)=3

实际走一步后拿到奖励 r=1r=1,下一状态估计为 V(s)=4V(s')=4,折扣因子 γ=0.9\gamma=0.9。那么:

Target=1+0.9×4=4.6\text{Target}=1+0.9\times4=4.6

δ=4.63=1.6\delta=4.6-3=1.6

δ>0\delta>0,说明这个状态比原来以为的更好,应该把 V(s)V(s) 往上调。最简单的更新可以写成:

V(s)V(s)+αδV(s) \leftarrow V(s)+\alpha\delta

如果学习率 α=0.1\alpha=0.1,那么:

V(s)3+0.1×1.6=3.16V(s)\leftarrow 3+0.1\times1.6=3.16

这就是 TD 学习的基本动作:每走一步,就用“现实走出来的一步 + 下一状态估计”修正当前状态估计。

本节总结

这一页公式很多,但主线只有一条:

  1. Vπ(s)V^\pi(s) 是从状态 ss 出发,按策略 π\pi 行动的平均长期回报。
  2. 回报可以递推:Gt=rt+γGt+1G_t=r_t+\gamma G_{t+1}
  3. 所以价值也可以递推:当前价值等于眼前奖励加下一状态价值。
  4. 如果策略固定,就得到贝尔曼期望方程。
  5. 如果每步都选最好的动作,就得到贝尔曼最优方程。
  6. 如果我们只有采样数据,就用 Bellman target 和 TD Error 来一点点修正 V(s)V(s)

局限性与后续引申

V(s)V(s) 已经能告诉你“这个局面好不好”,但到这里还有两个缺口。

第一个缺口是:如果不知道环境模型,怎么估计 VV 贝尔曼期望方程里有 P(ss,a)P(s'\mid s,a)R(s,a)R(s,a),但真实任务里我们往往只拿得到一条条采样轨迹。下一节会讲 DP、MC、TD,它们就是三种从模型或数据中估计价值的方法。

第二个缺口是:VV 不直接告诉你该选哪个动作。 如果 V(s)=80V(s)=80,你只知道当前局面不错,却不知道该向左、向右,还是保持不动。更直接的办法是给每个动作也打分:

Q(s,a)Q(s,a)

所以接下来的顺序是:先看经典方法速览:DP、MC 与 TD,解决“怎么估计 VV”;再进入 Q(s,a)——给每个动作打分,解决“怎么用价值选动作”。

参考文献

Built for reusable bilingual course delivery