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} $$

这个公式可以拆解为两步理解(对应视频中的树状图):

  1. 平均动作: 我可能选动作 A,也可能选动作 B,按概率 $\pi(a|s)$ 加权。
  2. 平均结果: 选了动作 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import numpy as np

def solve_bellman_equation(P, R, gamma=0.9):
"""
求解 v = R + gamma * P * v
:param P: 状态转移矩阵 (num_states x num_states)
:param R: 平均奖励向量 (num_states)
"""
num_states = P.shape[0]
I = np.eye(num_states)

# 核心公式: V = inv(I - gamma * P) * R
# 注意: np.linalg.solve(A, b) 比 inv(A) @ b 更快更稳
V = np.linalg.solve(I - gamma * P, R)
return V

# --- 示例数据 ---
# 假设 4 个状态,策略导致的状态转移概率如下:
# s1 -> 0.5->s1, 0.5->s2
# s2 -> 1.0->s3
# s3 -> 1.0->s4
# s4 -> 1.0->s4 (终点/吸收态)
P_pi = np.array([
[0.5, 0.5, 0.0, 0.0],
[0.0, 0.0, 1.0, 0.0],
[0.0, 0.0, 0.0, 1.0],
[0.0, 0.0, 0.0, 1.0]
])

# 每个状态出发获得的平均即时奖励
R_pi = np.array([-1.0, 0.0, 1.0, 0.0])

# 计算价值
V = solve_bellman_equation(P_pi, R_pi)
print(f"State Values: {V}")

运行结果会告诉你每个状态“值多少钱”。如果 $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 $$

算法逻辑

  1. 随便猜一个 $V_0$(比如全 0)。
  2. 用贝尔曼方程右边算出一个新的 $V_1$。
  3. 再把 $V_1$ 代入右边算出 $V_2$…
  4. 一直算,直到 $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 中最核心的数学堡垒:

  1. State Value $v(s)$: 衡量处境好坏。
  2. Bellman Equation: $v(s)$ 必须满足的递归方程。
  3. 求解方法: 小规模用矩阵求逆,大规模用迭代更新。
  4. Action Value $q(s,a)$: 衡量动作好坏,是策略改进的桥梁。

有了评价标准,下一章我们终于可以聊如何寻找最优策略了。我们将引入 Bellman Optimality Equation (BOE)


上一章:第1章 - 基本概念 | 下一章:第3章 - 最优状态值与贝尔曼最优方程 >>