1. 为什么需要贝尔曼方程?

在第1章中,我们建立了 MDP 模型,但留下了一个核心问题:如何评价一个策略(Policy)的好坏?

直观上,如果一个策略能让 Agent 获得更多的 Return(累积回报),它就是好的。但 Return是一个随机变量(取决于未来的随机状态转移和奖励),我们不能直接比较随机变量。因此,我们引入 期望(Expectation),即 状态价值(State Value)

贝尔曼方程(Bellman Equation)就是描述状态价值之间关系的数学工具,它是强化学习的基石。


2. 状态价值函数 (State Value Function)

2.1 定义

给定一个策略,状态的价值定义为从状态出发,遵循策略能获得的期望回报:

2.2 为什么叫 “Bootstrapping” (自举)?

我们可以把 Return 展开:

对两边求期望:

这看起来像是一个死循环:要算当前状态的价值,得先知道未来状态的价值。这种“自己提着鞋带把自己提起来”的思想在 RL 中称为 Bootstrapping。但实际上,这是一组联立方程,完全可以求解。


3. 贝尔曼方程的推导 (Step-by-Step)

为了把上面的期望展开成具体的计算公式,我们需要用到 MDP 的转移概率和策略

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

  1. 平均动作: 我可能选动作 A,也可能选动作 B,按概率加权。
  2. 平均结果: 选了动作 A 后,环境可能把我送到,也可能送到,按概率加权。

4. 矩阵形式与代码求解 (Matrix Form)

对于有限状态 MDP,我们可以把贝尔曼方程写成非常漂亮的矩阵形式。这是理解“求解价值”本质的关键。

4.1 矩阵公式

假设状态有个,我们将排列成向量

其中:

  • 平均即时奖励向量,其第个元素为
  • 状态转移矩阵,其第元素为

4.2 解析解 (Closed-form Solution)

通过简单的线性代数变换:

只要,矩阵就是可逆的。这意味着:只要环境模型 () 和策略 () 已知,状态价值是唯一的,且可以直接算出!

4.3 深度思考:矩阵逆与无穷级数的统一

这里隐藏着一个极美的数学联系。我们知道,对于标量(),有级数展开
同样的逻辑应用到矩阵上,Neumann Series 告诉我们:

将这个展开式代入,我们得到:

物理意义震撼人心

  • :第一步的平均奖励。
  • :第二步的平均奖励(转移了一次)。
  • :第三步的平均奖励(转移了两次)。

结论“解线性方程组”(代数视角)和**“累加未来所有奖励”**(轨迹视角)在数学上是完全等价的!这也解释了为什么必须小于 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}")

运行结果会告诉你每个状态“值多少钱”。如果,意味着从开始玩,平均会亏 2.5 分。


5. 迭代法求解 (Iterative Solution)

虽然矩阵求逆很帅,但在状态很多(比如围棋)时,求逆矩阵是不可能的。这时我们需要迭代法

算法逻辑

  1. 随便猜一个(比如全 0)。
  2. 用贝尔曼方程右边算出一个新的
  3. 再把代入右边算出
  4. 一直算,直到几乎一样(收敛)。

这正是动态规划 (Dynamic Programming) 的雏形,也是后续 Value Iteration 算法的基础。


6. 动作价值函数 (Action Value, Q-function)

除了状态价值,还有一个更重要的概念:动作价值
它表示:在状态强制采取动作,之后遵循策略的期望回报。

6.1 为什么要 Q 值?

如果只有,Agent 到了路口不知道怎么选,因为它只知道“我在这个路口平均能得 10 分”,但不知道“往左走得多少分,往右走得多少分”。
明确给出了每个动作的评分,有了 Q 值,Agent 就能直接选 Q 值最大的动作(Greedy Policy),从而改进策略。

6.2 V 与 Q 的关系


7. 总结

本章我们攻克了 RL 中最核心的数学堡垒:

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

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


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