1. 为什么需要贝尔曼方程?
在第1章中,我们建立了 MDP 模型,但留下了一个核心问题:如何评价一个策略(Policy)的好坏?
直观上,如果一个策略能让 Agent 获得更多的 Return(累积回报),它就是好的。但 Return $G_t$ 是一个随机变量(取决于未来的随机状态转移和奖励),我们不能直接比较随机变量。因此,我们引入 期望(Expectation),即 状态价值(State Value)。
贝尔曼方程(Bellman Equation)就是描述状态价值之间关系的数学工具,它是强化学习的基石。
2. 状态价值函数 (State Value Function)
2.1 定义
给定一个策略 $\pi$,状态 $s$ 的价值 $v_\pi(s)$ 定义为从状态 $s$ 出发,遵循策略 $\pi$ 能获得的期望回报:
$$ v_\pi(s) = \mathbb{E}[G_t \mid S_t = s] $$
2.2 为什么叫 “Bootstrapping” (自举)?
我们可以把 Return 展开:
$$ \begin{aligned} G_t &= R_{t+1} + \gamma R_{t+2} + \gamma^2 R_{t+3} + \dots \ &= R_{t+1} + \gamma (R_{t+2} + \gamma R_{t+3} + \dots) \ &= R_{t+1} + \gamma G_{t+1} \end{aligned} $$
对两边求期望:
$$ v_\pi(s) = \mathbb{E}[R_{t+1} + \gamma v_\pi(S_{t+1}) \mid S_t = s] $$
这看起来像是一个死循环:要算当前状态的价值,得先知道未来状态的价值。这种“自己提着鞋带把自己提起来”的思想在 RL 中称为 Bootstrapping。但实际上,这是一组联立方程,完全可以求解。
3. 贝尔曼方程的推导 (Step-by-Step)
为了把上面的期望展开成具体的计算公式,我们需要用到 MDP 的转移概率 $p(s’|s,a)$ 和策略 $\pi(a|s)$。
$$ \begin{aligned} v_\pi(s) &= \mathbb{E}{\pi} [R{t+1} + \gamma v_\pi(S_{t+1}) \mid S_t = s] \ &= \sum_{a \in \mathcal{A}} \pi(a|s) \underbrace{\left( \sum_{s’ \in \mathcal{S}} p(s’|s,a) \left[ r(s,a,s’) + \gamma v_\pi(s’) \right] \right)}{\text{Action Value } q\pi(s,a)} \end{aligned} $$
这个公式可以拆解为两步理解(对应视频中的树状图):
- 平均动作: 我可能选动作 A,也可能选动作 B,按概率 $\pi(a|s)$ 加权。
- 平均结果: 选了动作 A 后,环境可能把我送到 $s’_1$,也可能送到 $s’_2$,按概率 $p(s’|s,a)$ 加权。
4. 矩阵形式与代码求解 (Matrix Form)
对于有限状态 MDP,我们可以把贝尔曼方程写成非常漂亮的矩阵形式。这是理解“求解价值”本质的关键。
4.1 矩阵公式
假设状态有 $n$ 个,我们将 $v_\pi(s)$ 排列成向量 $V \in \mathbb{R}^n$:
$$ V = R_\pi + \gamma P_\pi V $$
其中:
- $R_\pi$ 是平均即时奖励向量,其第 $s$ 个元素为 $\sum_a \pi(a|s) \sum_{s’} p(s’|s,a) r(s,a,s’)$。
- $P_\pi$ 是状态转移矩阵,其第 $(s, s’)$ 元素为 $\sum_a \pi(a|s) p(s’|s,a)$。
4.2 解析解 (Closed-form Solution)
通过简单的线性代数变换:
$$ \begin{aligned} V - \gamma P_\pi V &= R_\pi \ (I - \gamma P_\pi) V &= R_\pi \ V &= (I - \gamma P_\pi)^{-1} R_\pi \end{aligned} $$
只要 $\gamma < 1$,矩阵 $(I - \gamma P_\pi)$ 就是可逆的。这意味着:只要环境模型 ($P, R$) 和策略 ($\pi$) 已知,状态价值 $V$ 是唯一的,且可以直接算出!
4.3 深度思考:矩阵逆与无穷级数的统一
这里隐藏着一个极美的数学联系。我们知道,对于标量 $x$ ($|x|<1$),有级数展开 $\frac{1}{1-x} = 1 + x + x^2 + \dots$。
同样的逻辑应用到矩阵上,Neumann Series 告诉我们:
$$ (I - \gamma P)^{-1} = I + \gamma P + (\gamma P)^2 + (\gamma P)^3 + \dots $$
将这个展开式代入 $V = (I - \gamma P)^{-1} R$,我们得到:
$$ V = R + \gamma P R + \gamma^2 P^2 R + \dots $$
物理意义震撼人心:
- $R$:第一步的平均奖励。
- $\gamma P R$:第二步的平均奖励($P$ 转移了一次)。
- $\gamma^2 P^2 R$:第三步的平均奖励($P$ 转移了两次)。
结论:“解线性方程组”(代数视角)和**“累加未来所有奖励”**(轨迹视角)在数学上是完全等价的!这也解释了为什么 $\gamma$ 必须小于 1:为了保证这个无穷级数收敛。
4.4 Python 代码实战
让我们用 NumPy 实现这个求解过程。假设一个简单的 4 状态环境(如书中 Figure 2.3):
1 | import numpy as np |
运行结果会告诉你每个状态“值多少钱”。如果 $V(s_1) = -2.5$,意味着从 $s_1$ 开始玩,平均会亏 2.5 分。
5. 迭代法求解 (Iterative Solution)
虽然矩阵求逆很帅,但在状态很多(比如围棋 $10^{170}$)时,求逆矩阵 $O(n^3)$ 是不可能的。这时我们需要迭代法。
$$ v_{k+1} = R_\pi + \gamma P_\pi v_k $$
算法逻辑:
- 随便猜一个 $V_0$(比如全 0)。
- 用贝尔曼方程右边算出一个新的 $V_1$。
- 再把 $V_1$ 代入右边算出 $V_2$…
- 一直算,直到 $V_k$ 和 $V_{k+1}$ 几乎一样(收敛)。
这正是动态规划 (Dynamic Programming) 的雏形,也是后续 Value Iteration 算法的基础。
6. 动作价值函数 (Action Value, Q-function)
除了状态价值 $v_\pi(s)$,还有一个更重要的概念:动作价值 $q_\pi(s, a)$。
它表示:在状态 $s$ 强制采取动作 $a$,之后遵循策略 $\pi$ 的期望回报。
6.1 为什么要 Q 值?
如果只有 $v_\pi(s)$,Agent 到了路口不知道怎么选,因为它只知道“我在这个路口平均能得 10 分”,但不知道“往左走得多少分,往右走得多少分”。
$q_\pi(s, a)$ 明确给出了每个动作的评分,有了 Q 值,Agent 就能直接选 Q 值最大的动作(Greedy Policy),从而改进策略。
6.2 V 与 Q 的关系
$$ \begin{aligned} v_\pi(s) &= \sum_{a} \pi(a|s) q_\pi(s,a) \ q_\pi(s,a) &= \sum_{s’} p(s’|s,a) [ r(s,a,s’) + \gamma v_\pi(s’) ] \end{aligned} $$
7. 总结
本章我们攻克了 RL 中最核心的数学堡垒:
- State Value $v(s)$: 衡量处境好坏。
- Bellman Equation: $v(s)$ 必须满足的递归方程。
- 求解方法: 小规模用矩阵求逆,大规模用迭代更新。
- Action Value $q(s,a)$: 衡量动作好坏,是策略改进的桥梁。
有了评价标准,下一章我们终于可以聊如何寻找最优策略了。我们将引入 Bellman Optimality Equation (BOE)。

