第 2 讲:已知模型的规划——MDP、贝尔曼方程、策略迭代与价值迭代

Reinforcement Learning · Lecture 02。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

对应:Stanford CS234 Lecture 2(Making Good Decisions Given a Model of the World / Tabular MDP Planning) 配套代码:code/lecture02/ 预计阅读时间:4–5 小时(第一遍通读 2 小时,第二遍推导证明 + 跑代码 2–3 小时)


0. 本讲导航

0.1 本讲要回答的问题

如果我完全知道世界如何运转(转移概率 PP 和奖励 RR 都已知),怎样找到最优的决策方式?

这叫**规划(planning)**问题。你可能会疑惑:RL 不是讲”从经验中学习”吗?为什么要花一整讲研究”模型已知”的情况?有四个理由:

  1. 规划是学习的子程序。一种很自然的 RL 方法是”先从数据中学出模型,再在模型上做规划”(基于模型的 RL)。不会规划,这条路就走不通。
  2. 概念是通用的。本讲引入的价值函数 VπV^\pi、动作价值 QπQ^\pi、贝尔曼方程、策略改进,是后面所有无模型算法(TD、Q-learning、DQN、策略梯度、PPO)的理论骨架。Q-learning 本质上就是”不知道模型时的价值迭代”。
  3. 很多现实问题的模型确实已知:棋类游戏的规则、库存系统的供需统计、物理仿真器……
  4. 理论干净:在已知模型下,我们能严格证明算法收敛、找到的策略是最优的。这些证明中的思想(比如压缩映射)会反复出现。

0.2 学完本讲,你应该能够

  1. 写出 MDP 的定义 (S,A,P,R,γ)(S, A, P, R, \gamma),并能把一个简单的现实问题建模成 MDP。
  2. 解释为什么”MDP + 固定策略 = MRP”,并计算 PπP^\pi 和 RπR^\pi。
  3. 写出贝尔曼期望方程,用迭代法和解析法做策略评估。
  4. 定义动作价值函数 Qπ(s,a)Q^\pi(s,a),说清它和 Vπ(s)V^\pi(s) 的关系,以及它为什么是”改进策略”的关键。
  5. 写出贝尔曼最优方程,解释为什么存在一个在所有状态上同时最优的确定性策略。
  6. 陈述并证明策略改进定理,写出策略迭代算法并解释它为什么一定终止于最优策略。
  7. 写出价值迭代算法,证明贝尔曼最优算子是压缩映射,推导停止准则。
  8. 比较策略迭代与价值迭代的优缺点;理解有限视界下最优策略为什么是”非平稳”的。
  9. 通过网格世界的例子,理解奖励设计和折扣因子如何决定”最优”的含义。

0.3 先修知识

知识点用在哪里最低要求
第 1 讲:MRP、回报、价值、MRP 贝尔曼方程、三种计算方法全讲必须。本讲大量直接复用
第 1 讲 8.7 节的压缩映射直觉第 8 节看过即可,本讲会严格证明
max⁡\max 与 arg⁡max⁡\arg\max第 6–8 节max⁡af(a)\max_a f(a) 是”ff 的最大值”,arg⁡max⁡af(a)\arg\max_a f(a) 是”使 ff 最大的那个 aa”
无穷范数 ∥x∥∞=max⁡i∣xi∣\lVert x \rVert_\infty = \max_i \lvert x_i \rvert第 8 节就是”向量中绝对值最大的那个元素”
不等式的传递:a≤ba \le b 且 b≤c⇒a≤cb \le c \Rightarrow a \le c第 7、8 节的证明会用即可

0.4 第 1 讲回顾(30 秒版)

  • MRP (S,P,R,γ)(S, P, R, \gamma):状态按 PP 随机转移,每个状态给奖励 R(s)R(s),没有动作。
  • 回报 Gt=rt+γrt+1+γ2rt+2+⋯=rt+γGt+1G_t = r_t + \gamma r_{t+1} + \gamma^2 r_{t+2} + \cdots = r_t + \gamma G_{t+1}。
  • 价值 V(s)=E[Gt∣st=s]V(s) = \mathbb{E}[G_t \mid s_t = s]。
  • MRP 贝尔曼方程 V(s)=R(s)+γ∑s′P(s′∣s)V(s′)V(s) = R(s) + \gamma \sum_{s'} P(s' \mid s) V(s'),矩阵形式 V=R+γPVV = R + \gamma P V。
  • 三种求法:蒙特卡洛(采样平均)、解析解 V=(I−γP)−1RV = (I - \gamma P)^{-1} R、迭代法 Vk=R+γPVk−1V_k = R + \gamma P V_{k-1}(每次误差缩小到 γ\gamma 倍)。

0.5 本讲地图

第1节 MDP:在 MRP 上加入"动作"
   │
第2节 策略:智能体如何选择动作
   │
第3节 关键观察:MDP + 固定策略 = MRP  ──────────►  第1讲的方法全都能用
   │
第4节 策略评估:这个策略有多好?(V^π)
   │
第5节 动作价值 Q^π:每个动作有多好?
   │
第6节 最优性:什么叫"最好的策略"?贝尔曼最优方程
   │
   ├──► 第7节 策略迭代:评估 → 改进 → 评估 → 改进 ……
   │
   └──► 第8节 价值迭代:直接逼近最优价值;压缩映射
          │
第9节 两者对比   第10节 网格世界:奖励如何塑造策略   第11节 从规划走向学习

1. 马尔可夫决策过程(MDP)

1.1 从 MRP 到 MDP:把选择权交给智能体

第 1 讲的火星车只会”随机游走”——它不做任何决定,我们只能旁观它会拿到多少奖励。这就像评价一个”掷骰子决定去哪”的人。

现在我们让火星车自己选择向左还是向右。一旦有了选择,问题就从”预测会怎样”变成了”决定该怎样”。这就是 MDP:

MRP⏟(S, P, R, γ)  →  +动作 A    MDP⏟(S, A, P, R, γ)\underbrace{\text{MRP}}_{(S,\,P,\,R,\,\gamma)} \;\xrightarrow{\;+\text{动作 } A\;}\; \underbrace{\text{MDP}}_{(S,\,A,\,P,\,R,\,\gamma)}

加入动作后,转移概率和奖励都依赖于所选的动作:同一个位置,向左走和向右走会到达不同的地方。

1.2 定义

马尔可夫决策过程是一个五元组 (S,A,P,R,γ)(S, A, P, R, \gamma):

  • SS:有限的状态集合;
  • AA:有限的动作集合;
  • PP:转移模型,P(s′∣s,a)=Pr⁡(st+1=s′∣st=s,at=a)P(s' \mid s, a) = \Pr(s_{t+1} = s' \mid s_t = s, a_t = a);
  • RR:奖励函数,R(s,a)=E[ rt∣st=s,at=a ]R(s, a) = \mathbb{E}[\,r_t \mid s_t = s, a_t = a\,];
  • γ∈[0,1]\gamma \in [0, 1]:折扣因子。

马尔可夫性体现在:下一个状态只取决于当前状态和当前动作,与更早的历史无关。

和 MRP 的对比:MRP 的 PP 是一张 N×NN \times N 的表;MDP 的 PP 是 ∣A∣|A| 张这样的表——每个动作一张。可以把 MDP 想象成”一个遥控器上有 ∣A∣|A| 个按钮,每个按钮对应一个不同的马尔可夫链,智能体每一步可以选择按哪个按钮”。

1.3 火星车 MDP

沿用第 1 讲的火星车,现在它有两个动作:

  • 状态:s1,…,s7s_1, \dots, s_7
  • 动作:TryLeft(尝试向左)、TryRight(尝试向右)
  • 转移:以 0.8 的概率朝想去的方向移动一格,以 0.2 的概率打滑原地不动;撞墙也原地不动
  • 奖励:R(s1,⋅)=1R(s_1, \cdot) = 1,R(s7,⋅)=10R(s_7, \cdot) = 10,其余为 0(本例中奖励只取决于状态,与动作无关)

两个动作的转移矩阵(行 = 当前状态,列 = 下一状态):

P(⋅∣⋅,TryLeft)=(1.00000000.80.20000000.80.20000000.80.20000000.80.20000000.80.20000000.80.2)P(⋅∣⋅,TryRight)=(0.20.80000000.20.80000000.20.80000000.20.80000000.20.80000000.20.80000001.0)P(\cdot \mid \cdot, \texttt{TryLeft}) = \begin{pmatrix} 1.0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0.8 & 0.2 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0.8 & 0.2 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0.8 & 0.2 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0.8 & 0.2 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0.8 & 0.2 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0.8 & 0.2 \end{pmatrix} \qquad P(\cdot \mid \cdot, \texttt{TryRight}) = \begin{pmatrix} 0.2 & 0.8 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0.2 & 0.8 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0.2 & 0.8 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0.2 & 0.8 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0.2 & 0.8 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0.2 & 0.8 \\ 0 & 0 & 0 & 0 & 0 & 0 & 1.0 \end{pmatrix}

注意左上角和右下角的 1.0:在 s1s_1 向左、在 s7s_7 向右会撞墙,“成功”和”打滑”都是原地不动,概率加起来是 1。

代码对应:01_mdp_basics.py 的 build_mars_rover_mdp。注意其中用的是 P[s, a, target] += ... 而不是 =——撞墙时两部分概率落在同一格,必须累加。这是一个很典型的隐蔽 bug。

1.4 奖励的几种写法

不同教材对奖励的写法不同,初学者容易混淆。其实它们可以互相转换:

写法含义例子
R(s)R(s)只取决于所在状态火星车:在 s7s_7 就给 +10
R(s,a)R(s, a)取决于状态和动作机器人:同一位置,“跳跃”比”走路”耗电多
R(s,a,s′)R(s, a, s')还取决于到达的状态游戏:从 ss 做 aa 成功到达终点才给奖励

它们的关系:R(s,a)=∑s′P(s′∣s,a) R(s,a,s′)R(s, a) = \sum_{s'} P(s' \mid s, a)\, R(s, a, s')(对下一状态取期望)。所有算法只需要 R(s,a)R(s, a) 这个期望值,所以本讲统一使用 R(s,a)R(s, a)。

1.5 用 MDP 建模现实问题

问题状态 SS动作 AA转移 PP奖励 RR
库存管理仓库中的库存量今天订多少货由随机的顾客需求决定销售收入 − 进货成本 − 缺货损失 − 仓储费
自适应教学学生对各知识点的掌握程度出哪一道题学生做题后掌握程度的变化掌握程度的提升
慢病管理病人的生理指标用药方案病人对药物的反应指标在健康范围 +,副作用 −
棋类游戏棋盘局面落子位置自己落子 + 对手回应赢 +1,输 −1,其他 0

建模本身就是一门艺术:状态选多少信息(回忆第 1 讲 3.5 节的马尔可夫性权衡)、动作粒度多细、奖励怎么设计(第 10 节会看到奖励的微小改变如何彻底改变最优策略)——这些决定往往比算法选择更影响最终效果。

1.6 MDP 在代码中的样子

数学对象代码形状读法
P(s′∣s,a)P(s' \mid s, a)P[s, a, s2](N,A,N)(N, A, N)“在 s 做 a 到 s2 的概率”
R(s,a)R(s, a)R[s, a](N,A)(N, A)“在 s 做 a 的期望奖励”
某动作的转移矩阵P[:, a, :](N,N)(N, N)“所有状态都做 a 时的马尔可夫链”
某 (s,a)(s,a) 的下一状态分布P[s, a](N,)(N,)一个概率分布,和为 1

合法性检查:P 非负,且对每一对 (s,a)(s, a),P[s, a].sum() == 1(代码中的 check_mdp)。


2. 策略

2.1 确定性策略与随机策略

策略 π\pi 规定了智能体在每个状态下如何选择动作:

  • 确定性策略:π(s)=a\pi(s) = a,每个状态对应一个固定的动作。代码中是长度 NN 的整数数组。
  • 随机策略:π(a∣s)=Pr⁡(at=a∣st=s)\pi(a \mid s) = \Pr(a_t = a \mid s_t = s),每个状态对应一个动作的概率分布。代码中是 (N,A)(N, A) 的矩阵,每行和为 1。

确定性策略是随机策略的特例(选中的动作概率为 1,其余为 0,即”独热编码”)。代码中统一转换成 (N,A)(N, A) 矩阵,后续算法只需写一个版本(deterministic_to_stochastic 函数)。

2.2 平稳策略

本讲的策略都是平稳的(stationary):只看当前状态,不看”现在是第几步”,也不看历史。

你可能会问:会不会存在一种”看历史”或”看时间”的策略,比所有平稳策略都好?对于无限视界、有折扣的 MDP,答案是不会——可以证明一定存在一个平稳、确定性的最优策略(6.1 节解释直觉)。这让我们可以放心地只在平稳确定性策略中寻找。

但对有限视界问题,最优策略通常依赖剩余步数(8.7 节会看到),是非平稳的。

2.3 策略一共有多少个?

每个状态独立地从 ∣A∣|A| 个动作中选一个,所以确定性策略一共有 ∣A∣∣S∣|A|^{|S|} 个:

问题∣S∣\lvert S \rvert∣A∣\lvert A \rvert确定性策略数
火星车7227=1282^7 = 128
4×4 网格世界164416≈4.3×1094^{16} \approx 4.3 \times 10^9
10×10 网格世界10044100≈10604^{100} \approx 10^{60}

指数增长意味着:除了极小的问题,挨个试遍所有策略是不可能的。这就是我们需要聪明算法的原因。


3. 关键观察:MDP + 固定策略 = MRP

3.1 推导

一旦把策略 π\pi 固定下来,“选哪个动作”就不再是决策,而只是一个已知的随机过程——和”掷骰子”没有区别。于是可以把动作的随机性”平均掉”:

Rπ(s)=∑a∈Aπ(a∣s) R(s,a)R^\pi(s) = \sum_{a \in A} \pi(a \mid s)\, R(s, a) Pπ(s′∣s)=∑a∈Aπ(a∣s) P(s′∣s,a)P^\pi(s' \mid s) = \sum_{a \in A} \pi(a \mid s)\, P(s' \mid s, a)

直觉:从 ss 到 s′s' 有好几条”路”——通过不同的动作。每条路的概率 = “选这个动作的概率” × “这个动作把你带到 s′s' 的概率”。把所有路加起来就是总概率(全概率公式)。

对确定性策略,求和只剩一项:Rπ(s)=R(s,π(s))R^\pi(s) = R(s, \pi(s)),Pπ(s′∣s)=P(s′∣s,π(s))P^\pi(s' \mid s) = P(s' \mid s, \pi(s))——直接”挑出”所选动作对应的那一行。

于是 (S,Pπ,Rπ,γ)(S, P^\pi, R^\pi, \gamma) 就是一个标准的 MRP。

3.2 两个例子

例 1:一直向右。每个状态都选 TryRight,所以 PπP^\pi 就是 TryRight 那张转移矩阵,Rπ=[1,0,0,0,0,0,10]R^\pi = [1, 0, 0, 0, 0, 0, 10]。

例 2:随机策略(每个状态以 0.5 的概率选每个动作)。计算 PπP^\pi 的第 4 行(从 s4s_4 出发):

  • 到 s3s_3:0.5×0.80.5 \times 0.8(选左且成功)=0.4= 0.4
  • 到 s5s_5:0.5×0.80.5 \times 0.8(选右且成功)=0.4= 0.4
  • 留在 s4s_4:0.5×0.2+0.5×0.20.5 \times 0.2 + 0.5 \times 0.2(两个动作各自打滑)=0.2= 0.2

即 [0,0,0.4,0.2,0.4,0,0][0, 0, 0.4, 0.2, 0.4, 0, 0]——这恰好就是第 1 讲的火星车马尔可夫链! 第 1 讲那个”随机游走”的火星车,其实就是在这个 MDP 中执行随机策略。这也解释了一个现象:第 4 节计算出的随机策略价值,会和第 1 讲 γ=0.9\gamma = 0.9 时 MRP 的价值完全相同。

3.3 为什么这个观察这么重要?

因为它意味着:评估 MDP 中的一个策略 = 计算一个 MRP 的价值。第 1 讲学过的所有方法(蒙特卡洛、解析解、迭代法)都可以直接拿来用,不需要任何新工具。

代码对应:01_mdp_basics.py 的 mdp_to_mrp_loop(for 循环教学版)和 mdp_to_mrp(np.einsum 实用版),演示中验证了两者结果完全一致。


4. 策略评估:这个策略有多好?

4.1 状态价值函数 VπV^\pi

策略 π\pi 的状态价值函数:

Vπ(s)=Eπ[ rt+γrt+1+γ2rt+2+⋯  |  st=s ]V^\pi(s) = \mathbb{E}_\pi\left[\, r_t + \gamma r_{t+1} + \gamma^2 r_{t+2} + \cdots \;\middle|\; s_t = s \,\right]

下标 π\pi 表示”动作按策略 π\pi 选择”。它回答:“从 ss 出发、一直按 π\pi 行动,平均能拿到多少折扣回报?”

策略评估(policy evaluation) 就是计算 VπV^\pi。

4.2 贝尔曼期望方程

由于 MDP + π\pi = MRP,第 1 讲的 MRP 贝尔曼方程直接适用,只需把 R,PR, P 换成 Rπ,PπR^\pi, P^\pi:

Vπ(s)=Rπ(s)+γ∑s′Pπ(s′∣s) Vπ(s′)V^\pi(s) = R^\pi(s) + \gamma \sum_{s'} P^\pi(s' \mid s)\, V^\pi(s')

把 Rπ,PπR^\pi, P^\pi 的定义代进去,得到更”原始”的形式:

  Vπ(s)=∑aπ(a∣s)[ R(s,a)+γ∑s′P(s′∣s,a) Vπ(s′) ]  \boxed{\;V^\pi(s) = \sum_{a} \pi(a \mid s) \left[\, R(s, a) + \gamma \sum_{s'} P(s' \mid s, a)\, V^\pi(s') \,\right]\;}

逐项解读:

  • 方括号里:如果在 ss 选了动作 aa,价值 = 即时奖励 + 折扣后的”下一状态的平均价值”;
  • 外面的 ∑aπ(a∣s)\sum_a \pi(a \mid s):按策略对各个动作的价值取平均。

这叫贝尔曼期望方程(“期望”指的是对动作按 π\pi 取期望)。

4.3 迭代策略评估与”贝尔曼备份”

用第 1 讲的迭代法:从 V0=0V_0 = 0 开始,反复套用贝尔曼期望方程:

算法:迭代策略评估
1. V_0(s) = 0,对所有 s
2. 对 k = 1, 2, ... 重复:
3.     对每个状态 s:
4.         V_k(s) = Σ_a π(a|s) [ R(s,a) + γ Σ_s' P(s'|s,a) V_{k-1}(s') ]
5.     如果 max_s |V_k(s) - V_{k-1}(s)| < 容差,停止

第 4 行这个操作叫贝尔曼备份(Bellman backup)。为什么叫”备份”?画成一棵树就明白了:

                        s              ← 要更新的状态(根)
                      ╱   ╲
              π(a₁|s)╱     ╲π(a₂|s)    ← 按策略对动作取平均
                   ╱         ╲
                 a₁           a₂       ← 每个动作:R(s,a) + γ × (下一状态的平均价值)
               ╱ │ ╲        ╱ │ ╲
              s'  s'  s'   s'  s'  s'  ← 叶子:已知的 V_{k-1}(s')

信息从叶子(后继状态)往回流到根——把”未来的价值”备份到”现在的状态”上。

4.4 手算例子:一直向右,γ=0.9\gamma = 0.9

从 V0=0V_0 = 0 开始。

第 1 次备份:V1(s)=R(s,Right)+0.9×(下一状态平均价值=0)V_1(s) = R(s, \texttt{Right}) + 0.9 \times (\text{下一状态平均价值} = 0),所以 V1=Rπ=[1,0,0,0,0,0,10]V_1 = R^\pi = [1, 0, 0, 0, 0, 0, 10]。

第 2 次备份,以 s6s_6 和 s7s_7 为例:

V2(s6)=0+0.9×(0.2×V1(s6)⏟打滑+0.8×V1(s7)⏟成功右移)=0.9×(0+8)=7.2V_2(s_6) = 0 + 0.9 \times \big(\underbrace{0.2 \times V_1(s_6)}_{\text{打滑}} + \underbrace{0.8 \times V_1(s_7)}_{\text{成功右移}}\big) = 0.9 \times (0 + 8) = 7.2 V2(s7)=10+0.9×(1.0×V1(s7))=10+9=19V_2(s_7) = 10 + 0.9 \times \big(1.0 \times V_1(s_7)\big) = 10 + 9 = 19

第 3 次备份,以 s5s_5 为例:

V3(s5)=0+0.9×(0.2×V2(s5)+0.8×V2(s6))=0.9×(0+0.8×7.2)=5.184V_3(s_5) = 0 + 0.9 \times (0.2 \times V_2(s_5) + 0.8 \times V_2(s_6)) = 0.9 \times (0 + 0.8 \times 7.2) = 5.184

完整结果:

s1s_1s2s_2s3s_3s4s_4s5s_5s6s_6s7s_7
V0V_00000000
V1V_11.000000010.00
V2V_21.1800007.2019.00
V3V_31.210005.1814.9827.10
Vπ=V∞V^\pi = V_\infty47.0552.1959.4467.6977.1087.80100.00

观察:+10 的”消息”每迭代一次向左传播一格。V2V_2 时 s6s_6 才”知道”右边有 +10,V3V_3 时 s5s_5 才知道。这就是”备份”的物理含义:价值从后继状态一步步往回流。

验算 Vπ(s7)=100V^\pi(s_7) = 100:在 s7s_7 一直向右就是一直撞墙待在 s7s_7,每步 +10,总价值 101−0.9=100\frac{10}{1 - 0.9} = 100 ✓。

4.5 三个策略的价值(γ=0.9\gamma = 0.9)

策略s1s_1s2s_2s3s_3s4s_4s5s_5s6s_6s7s_7
一直向左10.008.787.716.775.945.2216.78
一直向右47.0552.1959.4467.6977.1087.80100.00
随机6.916.056.879.6115.0124.5840.97

几个值得思考的现象:

  1. 随机策略这一行和第 1 讲 MRP 在 γ=0.9\gamma = 0.9 时的价值一模一样——正如 3.2 节所说,它们是同一个马尔可夫链。
  2. 一直向右在每一个状态都是最好的,连 s1s_1 都是:在 s1s_1 原地拿 +1 的总价值只有 11−0.9=10\frac{1}{1-0.9} = 10,而花大约 6/0.8=7.56/0.8 = 7.5 步走到 s7s_7 后每步拿 +10,折扣后仍有 47.05。
  3. 一直向左时 V(s7)=16.78>V(s1)=10V(s_7) = 16.78 > V(s_1) = 10:尽管策略是向左走,但在 s7s_7 至少能拿一次 +10(还可能因打滑多拿几次),这比 s1s_1 的”每步 +1”开局更好。

4.6 同步更新 vs 原地更新

上面的算法是同步更新:用上一轮的 Vk−1V_{k-1} 计算所有状态的 VkV_k,需要两份数组。

另一种是原地更新(in-place,也叫 Gauss–Seidel 式):只用一份数组,按某个顺序逐个更新状态,更新 ss 时立刻使用本轮已更新过的其他状态的新值。两种方式收敛到同一个 VπV^\pi。

更新顺序很重要。对”一直向右”策略,只迭代 1 轮后的结果:

更新方式s1s_1s2s_2s3s_3s4s_4s5s_5s6s_6s7s_7
同步1.000000010.00
原地,s1→s7s_1 \to s_7 顺序1.000000010.00
原地,s7→s1s_7 \to s_1 顺序2.391.932.693.735.187.2010.00

从右往左扫时,先算出 s7s_7 的新值,马上用它算 s6s_6,再用 s6s_6 的新值算 s5s_5……一轮之内 +10 的信息就传遍了所有状态。

但一个反直觉的实验结果:三种方式收敛到 10−1010^{-10} 精度所需的总轮数完全相同(都是 242 轮)。原因是 s7s_7 的自环:V(s7)←10+0.9 V(s7)V(s_7) \leftarrow 10 + 0.9\, V(s_7),它自己每轮只能把误差缩小到 0.9 倍,与更新顺序无关——总轮数被最慢收敛的部分卡住了。

教训:“信息传播得快”和”总体收敛得快”是两回事。原地更新在很多问题上确实能加速(尤其是没有强自环的问题),但不是万能的。

代码对应:02_policy_evaluation.py 的 policy_evaluation_iterative(参数 in_place 和 order)。

4.7 解析解

同样可以直接解线性方程组:

Vπ=(I−γPπ)−1RπV^\pi = (I - \gamma P^\pi)^{-1} R^\pi

代码中用 np.linalg.solve,计算量 O(∣S∣3)O(|S|^3),要求 γ<1\gamma < 1。在状态数不太大时(几千以内),这是最精确、最省事的策略评估方法。


5. 动作价值函数 QπQ^\pi

5.1 定义与直觉

Qπ(s,a)=R(s,a)+γ∑s′P(s′∣s,a) Vπ(s′)Q^\pi(s, a) = R(s, a) + \gamma \sum_{s'} P(s' \mid s, a)\, V^\pi(s')

含义:在状态 ss 先执行动作 aa(不管 π\pi 在 ss 会选什么),之后一直按 π\pi 行动,所能获得的期望回报。

直觉:Vπ(s)V^\pi(s) 回答”这个状态有多好”,Qπ(s,a)Q^\pi(s, a) 回答”在这个状态做这个动作有多好”。前者给状态打分,后者给”状态–动作对”打分。

一个类比:你在下棋,按照你一贯的风格(策略 π\pi)下,当前局面的胜率是 Vπ(s)V^\pi(s)。现在你考虑”这一步走个不寻常的招法 aa,之后再回到我的风格”,此时的胜率就是 Qπ(s,a)Q^\pi(s, a)。

5.2 VV 与 QQ 的关系

两者可以互相表示:

Vπ(s)=∑aπ(a∣s) Qπ(s,a)(状态价值 = 按策略对动作价值取平均)V^\pi(s) = \sum_a \pi(a \mid s)\, Q^\pi(s, a) \qquad\text{(状态价值 = 按策略对动作价值取平均)} Qπ(s,a)=R(s,a)+γ∑s′P(s′∣s,a) Vπ(s′)(动作价值 = 即时奖励 + 下一状态的平均价值)Q^\pi(s, a) = R(s, a) + \gamma \sum_{s'} P(s' \mid s, a)\, V^\pi(s') \qquad\text{(动作价值 = 即时奖励 + 下一状态的平均价值)}

对确定性策略,第一个式子简化为 Vπ(s)=Qπ(s,π(s))V^\pi(s) = Q^\pi(s, \pi(s))。

把第二个式子代入第一个,就回到了贝尔曼期望方程;把第一个代入第二个,得到 QQ 的贝尔曼期望方程:

Qπ(s,a)=R(s,a)+γ∑s′P(s′∣s,a)∑a′π(a′∣s′) Qπ(s′,a′)Q^\pi(s, a) = R(s, a) + \gamma \sum_{s'} P(s' \mid s, a) \sum_{a'} \pi(a' \mid s')\, Q^\pi(s', a')

5.3 例子:QπQ^\pi 揭示了哪里可以改进

对”一直向左”策略(γ=0.9\gamma = 0.9)计算 QπQ^\pi:

s1s_1s2s_2s3s_3s4s_4s5s_5s6s_6s7s_7
Vπ(s)V^\pi(s)10.008.787.716.775.945.2216.78
Qπ(s,Left)Q^\pi(s, \texttt{Left})10.008.787.716.775.945.2216.78
Qπ(s,Right)Q^\pi(s, \texttt{Right})9.127.136.265.504.8313.0225.10

验算一个:Qπ(s6,Right)=0+0.9×(0.2×Vπ(s6)+0.8×Vπ(s7))=0.9×(1.044+13.424)=13.02Q^\pi(s_6, \texttt{Right}) = 0 + 0.9 \times (0.2 \times V^\pi(s_6) + 0.8 \times V^\pi(s_7)) = 0.9 \times (1.044 + 13.424) = 13.02 ✓。

关键观察:在 s6s_6 和 s7s_7,Qπ(s,Right)>Vπ(s)Q^\pi(s, \texttt{Right}) > V^\pi(s)。也就是说,在这两个状态”偏离一次策略、改成向右”会更好。自然的想法是:把这两个状态的动作改成向右,得到一个新策略——它会更好吗?第 7 节的策略改进定理会给出肯定的回答。

有趣的是,在 s1s_1 到 s5s_5,向右的 QQ 值反而更低——因为 QπQ^\pi 假设”之后仍按一直向左走”,向右走一步然后又被策略拉回来向左,白白浪费了时间。只有 s6s_6、s7s_7 “看得见” s7s_7 的 +10。

5.4 为什么 QQ 如此重要?

QQ 让”比较动作”变得直接:在状态 ss 选 arg⁡max⁡aQ(s,a)\arg\max_a Q(s, a) 就是选最好的动作。

对比一下,如果只有 VV,要在状态 ss 选最好的动作,你得计算 arg⁡max⁡a[R(s,a)+γ∑s′P(s′∣s,a)V(s′)]\arg\max_a \left[R(s,a) + \gamma \sum_{s'} P(s' \mid s, a) V(s')\right]——这需要知道模型 PP 和 RR。而有了 QQ,直接 arg⁡max⁡aQ(s,a)\arg\max_a Q(s, a) 即可,完全不需要模型。

这就是为什么第 4 讲的无模型控制算法(SARSA、Q-learning)都选择直接学习 QQ 而不是 VV:在不知道模型的情况下,只有 QQ 能直接告诉你该怎么做。


6. 最优性:什么叫”最好的策略”?

6.1 比较策略

两个策略怎么比较?一个自然的定义是:

π≥π′  ⟺  Vπ(s)≥Vπ′(s)对所有状态 s 都成立\pi \ge \pi' \iff V^\pi(s) \ge V^{\pi'}(s) \quad \text{对所有状态 } s \text{ 都成立}

这个定义很严格:要求在每一个状态都不差。于是出现一个疑问:会不会有两个策略,π\pi 在 s1s_1 更好、π′\pi' 在 s2s_2 更好,谁也不比谁强?那”最优策略”岂不是不存在?

MDP 理论中的一个核心定理:对于有限状态、有限动作、无限视界、γ<1\gamma < 1 的 MDP,一定存在一个确定性、平稳的策略 π∗\pi^*,它在每一个状态上都同时达到最优:

Vπ∗(s)=max⁡πVπ(s)对所有 sV^{\pi^*}(s) = \max_\pi V^\pi(s) \quad \text{对所有 } s

为什么这是对的?直觉来自马尔可夫性:从状态 ss 出发怎样最好,只取决于 ss 本身,与”你是怎么来到 ss 的”无关。所以,对每个状态分别找到”从这里出发的最好做法”,把它们拼在一起,不会产生矛盾——在 ss 的最好做法里,如果路过 s′s',接下来应该做的恰好就是”从 s′s' 出发的最好做法”。(这就是 Bellman 的最优性原理:最优策略的任何”尾巴”本身也是最优的。)

代码验证:03_policy_iteration.py 的演示 3 暴力枚举了火星车全部 128 个确定性策略。对每个状态分别在 128 个策略中取价值的最大值,结果恰好等于同一个策略(一直向右)在各状态的价值:

s1s_1s2s_2s3s_3s4s_4s5s_5s6s_6s7s_7
max⁡πVπ(s)\max_\pi V^\pi(s)(逐状态取最大)47.0552.1959.4467.6977.1087.80100.00
Vπ∗(s)V^{\pi^*}(s)(一个策略)47.0552.1959.4467.6977.1087.80100.00

注意:最优价值 V∗V^* 是唯一的,但最优策略不一定唯一——如果某个状态有两个动作一样好,选哪个都是最优的。

6.2 最优价值函数

V∗(s)=max⁡πVπ(s),Q∗(s,a)=max⁡πQπ(s,a)V^*(s) = \max_\pi V^\pi(s), \qquad Q^*(s, a) = \max_\pi Q^\pi(s, a)

Q∗(s,a)Q^*(s, a) 的含义:“在 ss 先做 aa,之后一直按最优方式行动”的期望回报。

6.3 贝尔曼最优方程

最优价值满足一组特殊的方程。直觉推导:最优地行动,意味着在当前状态选最好的动作,之后也继续最优地行动:

  V∗(s)=max⁡a[ R(s,a)+γ∑s′P(s′∣s,a) V∗(s′) ]  \boxed{\;V^*(s) = \max_a \left[\, R(s, a) + \gamma \sum_{s'} P(s' \mid s, a)\, V^*(s') \,\right]\;}   Q∗(s,a)=R(s,a)+γ∑s′P(s′∣s,a) max⁡a′Q∗(s′,a′)  \boxed{\;Q^*(s, a) = R(s, a) + \gamma \sum_{s'} P(s' \mid s, a)\, \max_{a'} Q^*(s', a')\;}

与贝尔曼期望方程的唯一区别:对动作是”按策略取平均” ∑aπ(a∣s)[⋯ ]\sum_a \pi(a \mid s)[\cdots] 还是”取最大” max⁡a[⋯ ]\max_a [\cdots]。

贝尔曼期望方程贝尔曼最优方程
描述的对象给定策略 π\pi 的价值 VπV^\pi最优价值 V∗V^*
对动作的操作∑aπ(a∣s)[⋯ ]\sum_a \pi(a \mid s)[\cdots] 取平均max⁡a[⋯ ]\max_a[\cdots] 取最大
方程类型线性,可直接用矩阵求解非线性(因为 max),不能直接用矩阵求解
求解方法解析解 / 迭代策略迭代 / 价值迭代

为什么不能像第 1 讲那样用矩阵求逆? 因为 max⁡\max 不是线性运算:max⁡(a+b)≠max⁡(a)+max⁡(b)\max(a+b) \ne \max(a) + \max(b)。这就是我们需要本讲两个迭代算法的根本原因。

6.4 从 V∗V^* 或 Q∗Q^* 读出最优策略

一旦有了最优价值,最优策略就是”贪心地”选最好的动作:

π∗(s)=arg⁡max⁡aQ∗(s,a)=arg⁡max⁡a[ R(s,a)+γ∑s′P(s′∣s,a) V∗(s′) ]\pi^*(s) = \arg\max_a Q^*(s, a) = \arg\max_a \left[\, R(s, a) + \gamma \sum_{s'} P(s' \mid s, a)\, V^*(s') \,\right]

所以问题转化为:如何求出 V∗V^* 或 Q∗Q^*?

6.5 暴力搜索为什么不行

最直接的办法:评估所有 ∣A∣∣S∣|A|^{|S|} 个确定性策略,挑最好的。火星车可以(128 个),但 2.3 节的表已经说明,稍大一点的问题就完全不可行。我们需要只评估少数策略就能找到最优的方法。


7. 策略迭代(Policy Iteration)

7.1 直觉:复盘,然后改进

想象你是一名棋手,想提高棋艺:

  1. 评估:按照你现在的下法(策略 π\pi)下很多盘棋,搞清楚每个局面下你的胜率(VπV^\pi)。
  2. 改进:复盘每个局面,问自己”如果这一步换一种下法,之后照旧,胜率会不会更高?“(比较 Qπ(s,a)Q^\pi(s, a))。把所有能改进的地方都改掉,得到新的下法 π′\pi'。
  3. 重复,直到”复盘时发现没有任何一步可以改进”为止。

这就是策略迭代。

7.2 策略改进步

给定当前策略 πi\pi_i 及其价值 VπiV^{\pi_i},对每个状态计算 Qπi(s,a)Q^{\pi_i}(s, a),然后贪心地选择:

πi+1(s)=arg⁡max⁡aQπi(s,a)=arg⁡max⁡a[ R(s,a)+γ∑s′P(s′∣s,a) Vπi(s′) ]\pi_{i+1}(s) = \arg\max_a Q^{\pi_i}(s, a) = \arg\max_a \left[\, R(s, a) + \gamma \sum_{s'} P(s' \mid s, a)\, V^{\pi_i}(s') \,\right]

注意这里有一个”大胆的”操作:Qπi(s,a)Q^{\pi_i}(s, a) 衡量的是”只在 ss 这一步换成 aa,之后仍按 πi\pi_i“的价值。但 πi+1\pi_{i+1} 是在所有状态、所有时刻都换掉了。凭什么保证这样整体上更好?这需要一个定理。

7.3 策略改进定理

定理:设 πi+1\pi_{i+1} 是对 QπiQ^{\pi_i} 贪心得到的策略。那么对所有状态 ss: Vπi+1(s)≥Vπi(s)V^{\pi_{i+1}}(s) \ge V^{\pi_i}(s)

证明(CS234 课上的证明,请逐行理解):

第一步,贪心选择意味着新动作的 QQ 值不低于旧动作的 QQ 值(旧动作的 QQ 值就是 VπiV^{\pi_i}):

Vπi(s)=Qπi(s,πi(s))≤max⁡aQπi(s,a)=Qπi(s,πi+1(s))V^{\pi_i}(s) = Q^{\pi_i}(s, \pi_i(s)) \le \max_a Q^{\pi_i}(s, a) = Q^{\pi_i}(s, \pi_{i+1}(s))

第二步,把 Qπi(s,πi+1(s))Q^{\pi_i}(s, \pi_{i+1}(s)) 展开。为书写简洁,记 a∗=πi+1(s)a^* = \pi_{i+1}(s):

Qπi(s,a∗)=R(s,a∗)+γ∑s′P(s′∣s,a∗) Vπi(s′)⏟≤ Qπi(s′,πi+1(s′))(对 s′ 用第一步)Q^{\pi_i}(s, a^*) = R(s, a^*) + \gamma \sum_{s'} P(s' \mid s, a^*)\, \underbrace{V^{\pi_i}(s')}_{\le\, Q^{\pi_i}(s', \pi_{i+1}(s'))\text{(对 } s' \text{ 用第一步)}}

所以:

Vπi(s)≤R(s,a∗)+γ∑s′P(s′∣s,a∗) Qπi(s′,πi+1(s′))V^{\pi_i}(s) \le R(s, a^*) + \gamma \sum_{s'} P(s' \mid s, a^*)\, Q^{\pi_i}(s', \pi_{i+1}(s'))

第三步,再把 Qπi(s′,πi+1(s′))Q^{\pi_i}(s', \pi_{i+1}(s')) 展开,里面又出现 Vπi(s′′)V^{\pi_i}(s''),再用第一步放大……每展开一次,“按 πi+1\pi_{i+1} 行动”的步数就多一步,而剩下的 VπiV^{\pi_i} 被 γk\gamma^k 压得越来越小:

Vπi(s)≤Eπi+1[ rt+γrt+1+⋯+γk−1rt+k−1+γkVπi(st+k)  |  st=s ]V^{\pi_i}(s) \le \mathbb{E}_{\pi_{i+1}}\left[\, r_t + \gamma r_{t+1} + \cdots + \gamma^{k-1} r_{t+k-1} + \gamma^k V^{\pi_i}(s_{t+k}) \;\middle|\; s_t = s \,\right]

第四步,令 k→∞k \to \infty,γkVπi(st+k)→0\gamma^k V^{\pi_i}(s_{t+k}) \to 0(因为 γ<1\gamma < 1 且 VV 有界),右边恰好变成”从 ss 出发一直按 πi+1\pi_{i+1} 行动的期望回报”:

Vπi(s)≤Vπi+1(s)■V^{\pi_i}(s) \le V^{\pi_{i+1}}(s) \qquad \blacksquare

证明的直觉:如果”只在第一步用新策略、之后用旧策略”不比旧策略差,那么”前两步用新策略”也不比”只第一步用新策略”差(因为第二步所在的状态上,新策略的选择同样不差),以此类推,“一直用新策略”当然也不差。每多用一步新策略,只会更好或持平。

代码验证:03_policy_iteration.py 的演示 2 对每一步都检查了不等式链 Vπ(s)≤max⁡aQπ(s,a)≤Vπ′(s)V^{\pi}(s) \le \max_a Q^{\pi}(s,a) \le V^{\pi'}(s),并打印每个状态的提升量——全部 ≥0\ge 0。

7.4 算法

算法:策略迭代
1. 任意初始化策略 π_0(例如全部选动作 0)
2. 对 i = 0, 1, 2, ... 重复:
3.     策略评估:计算 V^{π_i}(解析解或迭代法)
4.     计算 Q^{π_i}(s,a) = R(s,a) + γ Σ_s' P(s'|s,a) V^{π_i}(s')
5.     策略改进:π_{i+1}(s) = argmax_a Q^{π_i}(s,a)
6.     如果 π_{i+1} == π_i,停止,返回 π_i 和 V^{π_i}

一个实现细节:平局怎么处理? 如果某个状态有多个动作的 QQ 值相等,随便选一个在理论上都可以。但如果每次随机选,策略可能在”同样好的动作”之间来回切换,导致第 6 行的停止条件迟迟满足不了。

03_policy_iteration.py 的演示 5 构造了一个有两个完全相同动作(→ 和 →‘)的 MDP:

  • 正确做法(平局时保留旧动作):7 次评估后停止;
  • 错误做法(平局时随机选):216 次评估后才碰巧停下——价值早就最优了,策略却在 → 和 →’ 之间乱跳。7 个状态每个都有 2 个等价动作,随机选时恰好不变的概率只有 (1/2)7=1/128(1/2)^7 = 1/128。

规则:只有当某个动作严格更好时才改变策略。

7.5 为什么一定终止?终止时为什么一定最优?

终止性:

  1. 由策略改进定理,每次迭代 Vπi+1≥VπiV^{\pi_{i+1}} \ge V^{\pi_i}。
  2. 如果策略改变了(按上面的平局规则,意味着某个状态有严格更好的动作),那么至少在那个状态上是严格提升的,所以不可能回到以前的任何策略(以前的策略价值都更低)。
  3. 确定性策略只有有限个(∣A∣∣S∣|A|^{|S|} 个),不能重复,所以最多 ∣A∣∣S∣|A|^{|S|} 次迭代就一定停止。

这是一个很松的上界。实践中策略迭代通常只需要很少的迭代次数(火星车 128 个策略中只评估了 7 个)。理论研究也已证明,对固定的 γ\gamma,所需迭代次数有关于 ∣S∣|S| 和 ∣A∣|A| 的多项式上界。

最优性:停止时 πi+1=πi\pi_{i+1} = \pi_i,即对每个状态 πi(s)=arg⁡max⁡aQπi(s,a)\pi_i(s) = \arg\max_a Q^{\pi_i}(s, a),于是:

Vπi(s)=Qπi(s,πi(s))=max⁡aQπi(s,a)=max⁡a[R(s,a)+γ∑s′P(s′∣s,a)Vπi(s′)]V^{\pi_i}(s) = Q^{\pi_i}(s, \pi_i(s)) = \max_a Q^{\pi_i}(s, a) = \max_a \left[ R(s,a) + \gamma \sum_{s'} P(s' \mid s, a) V^{\pi_i}(s') \right]

这正是贝尔曼最优方程!而贝尔曼最优方程的解是唯一的(第 8 节的压缩映射会证明这一点),所以 Vπi=V∗V^{\pi_i} = V^*,πi\pi_i 是最优策略。

另一个有用的推论:一旦策略不再改变,它就永远不会再改变——因为下一次评估得到的是同一个 VV,改进得到的也是同一个策略。

7.6 火星车上的完整过程

从”一直向左”出发,γ=0.9\gamma = 0.9:

迭代策略(s1…s7s_1 \dots s_7)V(s1)V(s_1)V(s2)V(s_2)V(s3)V(s_3)V(s4)V(s_4)V(s5)V(s_5)V(s6)V(s_6)V(s7)V(s_7)
π0\pi_0← ← ← ← ← ← ←10.008.787.716.775.945.2216.78
π1\pi_1← ← ← ← ← → →10.008.787.716.775.9487.80100.00
π2\pi_2← ← ← ← → → →10.008.787.716.7777.1087.80100.00
π3\pi_3← ← ← → → → →10.008.787.7167.6977.1087.80100.00
π4\pi_4← ← → → → → →10.008.7859.4467.6977.1087.80100.00
π5\pi_5← → → → → → →10.0052.1959.4467.6977.1087.80100.00
π6\pi_6→ → → → → → →47.0552.1959.4467.6977.1087.80100.00

π6\pi_6 改进后不再变化,算法停止。

解读:

  • 第一次改进只改了 s6s_6 和 s7s_7——这正是 5.3 节 QπQ^\pi 表格揭示的”可以改进的地方”。
  • 改进是从右往左、一次一个状态地推进的。原因:在 π1\pi_1 下,s5s_5 向右会到达 s6s_6,而 s6s_6 现在的价值很高(87.80),所以 s5s_5 发现向右更好;但 s4s_4 向右只会到达 s5s_5,而 s5s_5 在 π1\pi_1 下还在向左,价值仍低……要等 s5s_5 改好了,s4s_4 才会跟着改。
  • 这是这个问题的”最坏情况”:7 个状态,恰好 7 次评估。如果从其他策略出发,次数会少得多(代码演示 4 中,随机初始策略分别用了 7、3、2 次评估)。

7.7 γ\gamma 改变最优策略

γ\gamma最优策略(s1…s7s_1 \dots s_7)
0.3← ← ← → → → →
0.5← ← → → → → →
0.7→ → → → → → →
0.9→ → → → → → →
0.99→ → → → → → →

解读:γ\gamma 小(短视)时,靠近 s1s_1 的状态宁可去拿近在咫尺的 +1,也不愿长途跋涉去拿遥远的 +10——因为远处的 +10 被打了太多折扣。γ\gamma 大(有耐心)时,所有状态都愿意去 s7s_7。

“最优”是相对于 γ\gamma 而言的。γ\gamma 不是算法的”超参数”,而是问题定义的一部分:它刻画了你有多在乎未来。


8. 价值迭代(Value Iteration)

8.1 动机:两个角度

策略迭代的每一轮都要完整地评估当前策略(解一个线性方程组,或迭代到收敛)。这有点”浪费”:刚开始时策略很差,花大力气把一个很差的策略评估得非常精确,意义不大。

角度一:截断的策略迭代。能不能策略评估只做一步备份,就马上改进?把”评估一步”和”改进”合并成一个操作:

Vk+1(s)=max⁡a[ R(s,a)+γ∑s′P(s′∣s,a) Vk(s′) ]V_{k+1}(s) = \max_a \left[\, R(s, a) + \gamma \sum_{s'} P(s' \mid s, a)\, V_k(s') \,\right]

这就是价值迭代。它不维护显式的策略,直接逼近 V∗V^*。

角度二:有限视界的动态规划。设 Vk(s)V_k(s) 表示”只剩 kk 步时,从 ss 出发的最优价值”:

  • 剩 0 步:什么都拿不到,V0=0V_0 = 0。
  • 剩 kk 步:先选一个动作拿即时奖励,然后还剩 k−1k-1 步——而”剩 k−1k-1 步时的最优价值” Vk−1V_{k-1} 已经算好了。所以:Vk(s)=max⁡a[R(s,a)+γ∑s′P(s′∣s,a)Vk−1(s′)]V_k(s) = \max_a [R(s,a) + \gamma \sum_{s'} P(s' \mid s, a) V_{k-1}(s')]。

公式和角度一完全一样!所以价值迭代的第 kk 步,就是在计算”视界为 kk“的最优价值。随着 kk 增大,我们看得越来越远;由于 γ<1\gamma < 1,远处的奖励越来越不重要,VkV_k 收敛到无限视界的 V∗V^*。

8.2 算法

算法:价值迭代
1. V_0(s) = 0,对所有 s
2. 对 k = 0, 1, 2, ... 重复:
3.     对每个状态 s:
4.         V_{k+1}(s) = max_a [ R(s,a) + γ Σ_s' P(s'|s,a) V_k(s') ]
5.     如果 ||V_{k+1} - V_k||∞ < ε(1-γ)/(2γ),停止
6. 读出策略:π(s) = argmax_a [ R(s,a) + γ Σ_s' P(s'|s,a) V_{k+1}(s') ]

第 5 行的停止准则在 8.5 节推导。

8.3 贝尔曼算子:一种简洁的记号

为了方便证明,把”做一次备份”看成一个算子(输入一个价值向量,输出一个价值向量):

贝尔曼期望算子 BπB^\pi:

(BπV)(s)=∑aπ(a∣s)[R(s,a)+γ∑s′P(s′∣s,a) V(s′)](B^\pi V)(s) = \sum_a \pi(a \mid s) \left[ R(s, a) + \gamma \sum_{s'} P(s' \mid s, a)\, V(s') \right]

贝尔曼最优算子 BB:

(BV)(s)=max⁡a[R(s,a)+γ∑s′P(s′∣s,a) V(s′)](B V)(s) = \max_a \left[ R(s, a) + \gamma \sum_{s'} P(s' \mid s, a)\, V(s') \right]

用这个记号:

  • 迭代策略评估就是 Vk+1=BπVkV_{k+1} = B^\pi V_k;
  • 价值迭代就是 Vk+1=BVkV_{k+1} = B V_k;
  • 贝尔曼期望方程是 Vπ=BπVπV^\pi = B^\pi V^\pi(VπV^\pi 是 BπB^\pi 的不动点);
  • 贝尔曼最优方程是 V∗=BV∗V^* = B V^*(V∗V^* 是 BB 的不动点)。

“不动点”就是”被算子作用后不变的点”。所以问题变成了:反复用 BB 作用,能不能找到 BB 的不动点?

8.4 压缩映射:价值迭代为什么一定收敛

定义:如果对任意两个价值向量 V,V′V, V',都有

∥BV−BV′∥∞≤γ ∥V−V′∥∞,0≤γ<1\lVert BV - BV' \rVert_\infty \le \gamma\, \lVert V - V' \rVert_\infty, \qquad 0 \le \gamma < 1

就称 BB 是一个压缩映射(contraction),γ\gamma 是压缩系数。直觉:无论两个点原来相距多远,被 BB 作用一次后,距离至少缩小到 γ\gamma 倍。

定理:贝尔曼最优算子 BB 是无穷范数下的 γ\gamma-压缩映射。

先证一个引理:对任意两个函数 f,gf, g,

∣max⁡af(a)−max⁡ag(a)∣≤max⁡a∣f(a)−g(a)∣\left| \max_a f(a) - \max_a g(a) \right| \le \max_a \left| f(a) - g(a) \right|

引理证明:不妨设 max⁡af(a)≥max⁡ag(a)\max_a f(a) \ge \max_a g(a),记 af=arg⁡max⁡af(a)a_f = \arg\max_a f(a)。那么

0≤max⁡af(a)−max⁡ag(a)=f(af)−max⁡ag(a)≤f(af)−g(af)≤max⁡a∣f(a)−g(a)∣0 \le \max_a f(a) - \max_a g(a) = f(a_f) - \max_a g(a) \le f(a_f) - g(a_f) \le \max_a |f(a) - g(a)|

(中间的"≤\le"是因为 max⁡ag(a)≥g(af)\max_a g(a) \ge g(a_f)。)另一种情况对称。□\square

直觉:两个函数逐点相差都不超过 cc,它们的最大值之差也不会超过 cc。

定理证明:固定任意状态 ss,令

f(a)=R(s,a)+γ∑s′P(s′∣s,a)V(s′),g(a)=R(s,a)+γ∑s′P(s′∣s,a)V′(s′)f(a) = R(s,a) + \gamma \sum_{s'} P(s' \mid s, a) V(s'), \qquad g(a) = R(s,a) + \gamma \sum_{s'} P(s' \mid s, a) V'(s')

则 (BV)(s)=max⁡af(a)(BV)(s) = \max_a f(a),(BV′)(s)=max⁡ag(a)(BV')(s) = \max_a g(a)。由引理:

∣(BV)(s)−(BV′)(s)∣≤max⁡a∣f(a)−g(a)∣(引理)=max⁡a∣γ∑s′P(s′∣s,a)(V(s′)−V′(s′))∣(R 抵消了)≤γmax⁡a∑s′P(s′∣s,a) ∣V(s′)−V′(s′)∣(三角不等式)≤γmax⁡a∑s′P(s′∣s,a) ∥V−V′∥∞(每项不超过最大值)=γ ∥V−V′∥∞(∑s′P(s′∣s,a)=1)\begin{aligned} \big|(BV)(s) - (BV')(s)\big| &\le \max_a \big| f(a) - g(a) \big| && \text{(引理)}\\ &= \max_a \Big| \gamma \sum_{s'} P(s' \mid s, a) \big(V(s') - V'(s')\big) \Big| && \text{(}R\text{ 抵消了)}\\ &\le \gamma \max_a \sum_{s'} P(s' \mid s, a)\, \big| V(s') - V'(s') \big| && \text{(三角不等式)}\\ &\le \gamma \max_a \sum_{s'} P(s' \mid s, a)\, \lVert V - V' \rVert_\infty && \text{(每项不超过最大值)}\\ &= \gamma\, \lVert V - V' \rVert_\infty && \text{(}\textstyle\sum_{s'} P(s' \mid s, a) = 1\text{)} \end{aligned}

这对每个 ss 都成立,所以对左边取 max⁡s\max_s:∥BV−BV′∥∞≤γ∥V−V′∥∞\lVert BV - BV' \rVert_\infty \le \gamma \lVert V - V' \rVert_\infty。■\blacksquare

证明中每一步的”物理意义”:

  • 奖励 RR 在两边相同,相减后消失——差异只来自”未来”;
  • ∑s′P(s′∣s,a)(⋯ )\sum_{s'} P(s' \mid s, a)(\cdots) 是加权平均,加权平均不会放大差异;
  • 乘以 γ<1\gamma < 1,差异被严格缩小。

同样的证明(去掉 max 那一步,把 max⁡a\max_a 换成 ∑aπ(a∣s)\sum_a \pi(a \mid s))说明 BπB^\pi 也是 γ\gamma-压缩映射——这就是第 1 讲迭代法收敛的严格理由。

代码验证:04_value_iteration.py 演示 2 随机生成 5 对价值向量,备份后距离之比分别为 0.518、0.758、0.760、0.480、0.490,全部 ≤γ=0.9\le \gamma = 0.9。

8.5 压缩映射的推论

由巴拿赫不动点定理(压缩映射原理),压缩映射有三个重要性质:

  1. 不动点存在且唯一:BB 恰好有一个不动点,就是 V∗V^*。(唯一性的证明很简单:如果 V∗V^* 和 U∗U^* 都是不动点,则 ∥V∗−U∗∥=∥BV∗−BU∗∥≤γ∥V∗−U∗∥\lVert V^* - U^* \rVert = \lVert BV^* - BU^* \rVert \le \gamma \lVert V^* - U^* \rVert,由于 γ<1\gamma < 1,只能 ∥V∗−U∗∥=0\lVert V^* - U^* \rVert = 0。)这也补全了 7.5 节的论证:策略迭代停止时满足贝尔曼最优方程,而这个方程的解唯一,所以就是 V∗V^*。
  2. 从任何初始值出发都收敛:∥Vk−V∗∥=∥BVk−1−BV∗∥≤γ∥Vk−1−V∗∥≤⋯≤γk∥V0−V∗∥→0\lVert V_k - V^* \rVert = \lVert BV_{k-1} - BV^* \rVert \le \gamma \lVert V_{k-1} - V^* \rVert \le \cdots \le \gamma^k \lVert V_0 - V^* \rVert \to 0。
  3. 收敛速度是几何级数的:误差每步至少缩小到 γ\gamma 倍。要把误差缩小 10 倍,大约需要 ln⁡10−ln⁡γ\frac{\ln 10}{-\ln \gamma} 步(γ=0.9\gamma = 0.9 时约 22 步,γ=0.99\gamma = 0.99 时约 229 步)。

代码验证:演示 2 中从一个”离谱”的随机初始值(标准差 1000)出发,价值迭代同样收敛到与从 0 出发相同的 V∗V^*(最大差 10−610^{-6} 量级)。

停止准则的推导。我们只能观察到相邻两次迭代的差 δ=∥Vk+1−Vk∥∞\delta = \lVert V_{k+1} - V_k \rVert_\infty,看不到真正的误差 ∥Vk+1−V∗∥∞\lVert V_{k+1} - V^* \rVert_\infty(因为不知道 V∗V^*)。两者有什么关系?

∥Vk+1−V∗∥=∥BVk−BV∗∥≤γ∥Vk−V∗∥≤γ(∥Vk−Vk+1∥+∥Vk+1−V∗∥)(三角不等式)\begin{aligned} \lVert V_{k+1} - V^* \rVert &= \lVert BV_k - BV^* \rVert \le \gamma \lVert V_k - V^* \rVert \\ &\le \gamma \left( \lVert V_k - V_{k+1} \rVert + \lVert V_{k+1} - V^* \rVert \right) && \text{(三角不等式)} \end{aligned}

移项得 (1−γ)∥Vk+1−V∗∥≤γ δ(1 - \gamma) \lVert V_{k+1} - V^* \rVert \le \gamma\, \delta,即

∥Vk+1−V∗∥∞≤γ1−γ δ\lVert V_{k+1} - V^* \rVert_\infty \le \frac{\gamma}{1 - \gamma}\, \delta

所以只要 δ<ε(1−γ)2γ\delta < \frac{\varepsilon (1 - \gamma)}{2\gamma},就有 ∥Vk+1−V∗∥<ε/2\lVert V_{k+1} - V^* \rVert < \varepsilon / 2。进一步可以证明,从 Vk+1V_{k+1} 读出的贪心策略 π\pi 满足 ∥Vπ−V∗∥<ε\lVert V^\pi - V^* \rVert < \varepsilon,即它是 ε\varepsilon-最优的。

注意 γ1−γ\frac{\gamma}{1-\gamma} 这个放大系数:γ=0.99\gamma = 0.99 时它是 99。也就是说,相邻两次变化只有 0.01,真实误差却可能高达 0.99。“看起来不怎么变了”不等于”已经接近答案了”,γ\gamma 越接近 1 越要警惕。

代码验证:演示 3 在不同 ε\varepsilon 下停止,实际误差远小于理论保证(例如 ε=10\varepsilon = 10 时 ∥V−V∗∥=4.71<5\lVert V - V^* \rVert = 4.71 < 5,而读出的策略已经是精确最优的)。理论界是最坏情况,通常很保守。

8.6 火星车上的过程

γ=0.9\gamma = 0.9,从 V0=0V_0 = 0 开始(右列是由当前 VkV_k 读出的贪心策略):

s1s_1s2s_2s3s_3s4s_4s5s_5s6s_6s7s_7贪心策略
V0V_00000000← ← ← ← ← ← ←
V1V_11.000000010.00← ← ← ← ← → →
V2V_21.900.720007.2019.00← ← ← ← → → →
V3V_32.711.500.5205.1814.9827.10← ← ← → → → →
V4V_43.442.221.173.7311.7222.2134.39← ← → → → → →
V5V_54.102.882.909.1118.1028.7640.95← ← → → → → →
V6V_64.693.477.0814.6723.9634.6646.86← → → → → → →
V7V_75.225.7211.8419.8929.2739.9852.17→ → → → → → →
V10V_{10}12.3817.3624.5832.8342.2352.9465.13→ → → → → → →
V30V_{30}42.8147.9555.2063.4672.8683.5795.76→ → → → → → →
V∗V^*47.0552.1959.4467.6977.1087.80100.00→ → → → → → →

总共迭代 182 次满足 ε=10−6\varepsilon = 10^{-6} 的停止准则。

三个重要观察:

  1. VkV_k 不是任何策略的价值。对比策略迭代:策略迭代的每个中间 VV 都是某个真实策略的价值;价值迭代的中间 VkV_k 只是”kk 步视界的最优价值”。
  2. 早期的贪心策略”向左”是合理的。看 V2V_2 的贪心策略:s1∼s4s_1 \sim s_4 选向左。因为如果只剩 3 步,从 s4s_4 出发根本走不到 s7s_7,不如去拿 s1s_1 的 +1。随着 kk 增大,“看得够远”的状态越来越多,转而向右。
  3. 策略比价值收敛得早得多:贪心策略在第 7 次迭代后就再也没有变过,但价值还要再迭代 175 次才满足停止准则。我们真正需要的是策略,所以在实践中常常不必等价值完全收敛。这个观察也是 9.2 节”修正策略迭代”的动机。

8.7 有限视界与非平稳策略

如果问题本身就是有限视界的(比如一共只能走 HH 步),价值迭代的每一步都有精确含义:VkV_k 是剩 kk 步时的最优价值,对应的最优动作是

πk(s)=arg⁡max⁡a[R(s,a)+γ∑s′P(s′∣s,a) Vk−1(s′)]\pi_k(s) = \arg\max_a \left[ R(s, a) + \gamma \sum_{s'} P(s' \mid s, a)\, V_{k-1}(s') \right]

有限视界时 γ=1\gamma = 1 完全没问题(有限项求和不会发散)。火星车,γ=1\gamma = 1,最多 10 步:

剩余步数 kk最优动作(s1…s7s_1 \dots s_7)Vk(s1)V_k(s_1)Vk(s2)V_k(s_2)Vk(s3)V_k(s_3)Vk(s4)V_k(s_4)Vk(s5)V_k(s_5)Vk(s6)V_k(s_6)Vk(s7)V_k(s_7)
1← ← ← ← ← ← ←1.000.000.000.000.000.0010.00
2← ← ← ← ← → →2.000.800.000.000.008.0020.00
3← ← ← ← → → →3.001.760.640.006.4017.6030.00
4← ← ← → → → →4.002.751.545.1215.3627.5240.00
5← ← → → → → →5.003.754.4013.3125.0937.5050.00
6← ← → → → → →6.004.7511.5322.7335.0247.5060.00
7← → → → → → →7.0010.1720.4932.5645.0057.5070.00
8→ → → → → → →10.5418.4330.1542.5255.0067.5080.00
9→ → → → → → →17.8527.8040.0452.5065.0077.5090.00
10→ → → → → → →26.8137.6050.0162.5075.0087.50100.00

同一个状态,剩余步数不同,最优动作不同。例如 s2s_2:剩 6 步时应该向左(去拿 s1s_1 的 +1,因为 6 步内到 s7s_7 的希望不大),剩 7 步时应该向右。这样依赖剩余时间的策略叫非平稳策略。

生活中的类比:离考试还有一个月时,你应该系统地学习新知识;离考试只剩一天时,最优策略是复习已经掌握的内容——“同样的你”,在不同的剩余时间下,最优行为不同。

(k=1k = 1 时两个动作一样好,因为只剩最后一步,奖励只取决于当前格子,走到哪里都无所谓。表中显示 ← 只是平局时取编号最小的动作。)


9. 策略迭代 vs 价值迭代

9.1 对比

策略迭代价值迭代
维护的对象显式策略 π\pi + 它的价值 VπV^\pi只有价值估计 VkV_k
每轮做什么完整的策略评估 + 一次策略改进一次贝尔曼最优备份
每轮计算量评估 O(∣S∣3)O(\lvert S\rvert^3) + 改进 O(∣S∣2∣A∣)O(\lvert S\rvert^2 \lvert A\rvert)O(∣S∣2∣A∣)O(\lvert S\rvert^2 \lvert A\rvert)
迭代次数通常很少(火星车 7 次)较多,约与 11−γ\frac{1}{1-\gamma} 成正比(火星车 182 次)
中间结果的含义每个 VπiV^{\pi_i} 都是某个真实策略的价值VkV_k 是 kk 步视界的最优价值
停止条件策略不再变化(精确停止)变化量小于阈值(近似停止)
结果精确最优ε\varepsilon-最优
理论基础策略改进定理压缩映射

简单总结:策略迭代”次数少但每次贵”,价值迭代”每次便宜但次数多”。状态数不大、γ\gamma 接近 1 时,策略迭代通常更快;状态数很大时,价值迭代每步的开销更容易承受。

9.2 两者之间:修正策略迭代

两个算法其实是一个”光谱”的两端:

  • 策略迭代:每轮做无穷多次评估备份(评估到收敛),再改进一次;
  • 价值迭代:每轮做1 次评估备份,就改进一次(max 操作隐含了改进)。

修正策略迭代(modified policy iteration) 取中间:每轮做 mm 次评估备份再改进。m=1m = 1 就是价值迭代,m=∞m = \infty 就是策略迭代。实践中取适中的 mm 往往效果最好。

这个”评估和改进交替进行、不必每次都做到底”的思想叫广义策略迭代(Generalized Policy Iteration, GPI),它是几乎所有 RL 算法的共同骨架——第 4 讲的 SARSA、Q-learning 都可以看成 GPI 的特例。

9.3 异步价值迭代

4.6 节的”原地更新”也可以用于价值迭代:不必每轮都更新所有状态,可以按任意顺序、甚至只挑一部分状态更新,只要每个状态都会被无限次更新,仍然收敛到 V∗V^*。这叫异步动态规划。它的意义在于:可以把计算集中在重要的状态上——比如智能体实际会经过的状态。这个思想后来发展成了实时动态规划(RTDP),以及第 14 讲的蒙特卡洛树搜索。


10. 奖励与折扣如何塑造最优策略:网格世界

火星车只有”向左”和”向右”,最优策略比较单调。我们换一个经典的二维例子来直观感受:只改变奖励中的一个数字,最优策略会如何剧烈变化。

10.1 问题设定

Russell & Norvig《人工智能:一种现代方法》中的 4×3 网格世界:

        第0列  第1列  第2列  第3列
第0行     .      .      .     +1      ← 好出口:到达后获得 +1,回合结束
第1行     .     墙      .     -1      ← 坏出口:到达后获得 -1,回合结束
第2行    起点    .      .      .
  • 动作:上、右、下、左。
  • 噪声:80% 按意图走;10% 向意图的左侧偏、10% 向右侧偏(例如想向上,可能滑向左或右)。撞墙或出界则原地不动。
  • 生存奖励:在普通格子每走一步获得 step_reward(通常是小负数,代表”时间成本”)。
  • γ=1\gamma = 1。

新概念:终止状态与吸收状态。怎么在 MDP 框架里表示”回合结束”?标准技巧是加一个额外的吸收状态 END:在 ±1 格子执行任何动作,获得 ±1 后以概率 1 进入 END;END 永远留在原地,奖励为 0。这样”结束”就变成了”进入一个再也不产生奖励的状态”,所有算法都无需修改。

有了终止状态,只要最优策略保证最终会到达出口(且”永不离开”的代价足够大),γ=1\gamma = 1 的价值迭代也能收敛。这类问题叫随机最短路径问题。

10.2 价值如何从出口”扩散”

step_reward = -0.04,价值迭代的过程:

第 1 次迭代后:                  第 3 次迭代后:                 收敛后(36 次迭代):
 -0.04  -0.04  -0.04   1.00      -0.12   0.55   0.83   1.00      0.81   0.87   0.92   1.00
 -0.04  ####   -0.04  -1.00      -0.12  ####    0.45  -1.00      0.76  ####    0.66  -1.00
 -0.04  -0.04  -0.04  -0.04      -0.12  -0.12  -0.12  -0.12      0.71   0.66   0.61   0.39

和火星车一样,每迭代一次,出口的”好消息”和”坏消息”向外多传一格。

10.3 标准最优策略

 →   →   →  +1
 ↑   #   ↑  -1
 ↑   ←   ←   ←

最值得注意的是下排第三格 (2,2):它可以 ↑ 走近路(经过 -1 左边的 (1,2),再向上、向右到 +1),但最优动作是 ←,宁可绕左边一大圈的远路!原因是噪声:在 (1,2) 向上走时,有 10% 的概率滑向右边、直接掉进 -1。每步只花 0.04 的时间成本,多走几步换来”完全不碰 -1”是划算的。(不过练习 9 会揭示,这个选择其实”险胜”:每步成本只要再高一点点,比如 0.045,近路就会胜出。)

10.4 只改生存奖励

  step=-0.01          step=-0.04          step=-0.4           step=-2.0
 →   →   →  +1       →   →   →  +1       →   →   →  +1       →   →   →  +1
 ↑   #   ←  -1       ↑   #   ↑  -1       ↑   #   ↑  -1       ↑   #   →  -1
 ↑   ←   ←   ↓       ↑   ←   ←   ←       ↑   →   ↑   ←       →   →   →   ↑
生存奖励性格典型行为
−0.01极度谨慎(1,2) 选择 ←(朝墙撞,原地不动),(2,3) 选择 ↓(朝边界撞)——这两个动作的两个”偏移方向”都不会进入 -1,而撞墙几乎没有代价,所以宁可原地磨蹭,等 10% 的偏移慢慢把自己带离危险区
−0.04谨慎但务实标准策略,绕远路避开 -1
−0.4着急(2,1)、(2,2) 改为 → 再 ↑ 的近路,冒险经过 -1 旁边
−2.0“活着就是受罪”(1,2) 和 (2,3) 直接冲进 -1!拿 -1 结束,比每走一步 -2 强

我们没有改变任何”规则”(地图、噪声、出口都一样),只改了一个数字,智能体的”性格”就从极度谨慎变成了自我毁灭。

10.5 正的生存奖励:智能体不想结束游戏

如果 step_reward = +0.1 会怎样?

  • γ=1\gamma = 1 时:永远在场地里闲逛能拿无穷多奖励,价值迭代不收敛(500 次迭代后起点价值涨到 50.7,还在继续涨)。
  • γ=0.9\gamma = 0.9 时:收敛,但策略是:
 ↑   ↑   ↑  +1
 ↑   #   ←  -1
 ↑   ↑   ←   ↓

智能体刻意远离出口,在 -1 附近朝墙走来避免滑进去。原因:待在场地里每步 +0.1,永远不离开的价值是 0.11−0.9=1\frac{0.1}{1 - 0.9} = 1,与 +1 出口相当,又比 -1 好得多。

这是一个典型的奖励投机(回忆第 1 讲 3.3 节):设计者想让智能体去 +1 出口,于是”鼓励它活着”,结果它发现”永远不结束”才是最划算的。

10.6 噪声的影响

  noise=0.0            noise=0.2            noise=0.5
  V(起点)=0.80         V(起点)=0.71         V(起点)=0.36
 →   →   →  +1        →   →   →  +1        →   →   ↑  +1
 ↑   #   ↑  -1        ↑   #   ↑  -1        ↑   #   ←  -1
 ↑   →   ↑   ←        ↑   ←   ←   ←        ↑   ←   ←   ↓
  • noise = 0(确定性世界):走在 -1 旁边毫无风险,所以 (2,1)、(2,2) 走近路。
  • noise = 0.5:极其保守。连 +1 左边的 (0,2) 都不直接向右了——向右有 25% 会滑到下面的 (1,2)(-1 旁边),而改为向上(撞顶原地不动)仍有 25% 滑进 +1,又不会靠近 -1。
  • 噪声越大,世界越难控制,起点的价值越低。

10.7 教训

  1. 奖励定义了”最优”。最优策略是奖励函数的”忠实执行者”,不会理解你的”本意”。
  2. γ\gamma 也定义了”最优”。它决定了智能体有多在乎未来,也决定了某些问题是否有有限解。
  3. 不确定性改变最优行为。同样的目标,在随机的世界里需要更保守的策略。
  4. 在把 RL 应用到真实问题前,用规划算法在简化模型上检查一下”你设计的奖励会导致什么样的最优行为”,是一个非常实用的习惯。

代码对应:05_gridworld.py。你可以修改 LAYOUT 画自己的地图。


11. 从规划到学习

本讲的所有算法都假设模型 PP 和 RR 完全已知。现实中往往不是这样。如果不知道模型,怎么办?回顾本讲用到模型的地方:

本讲的步骤用到模型的地方不知道模型时的替代方案在哪一讲
策略评估Vπ=Rπ+γPπVπV^\pi = R^\pi + \gamma P^\pi V^\pi用采样代替期望:蒙特卡洛(等回合结束取回报的平均)、时序差分 TD(用”一步奖励 + 下一状态的估计价值”代替期望)第 3 讲
策略改进arg⁡max⁡a[R+γPV]\arg\max_a [R + \gamma P V]直接学习 QQ,改进时只需 arg⁡max⁡aQ(s,a)\arg\max_a Q(s,a),不需要模型(5.4 节)第 4 讲
价值迭代max⁡a[R+γPV]\max_a [R + \gamma P V]Q-learning:用采样的 r+γmax⁡a′Q(s′,a′)r + \gamma \max_{a'} Q(s', a') 代替 E[⋯ ]\mathbb{E}[\cdots]第 4 讲
整体思路—先从数据中估计模型(第 1 讲 7.7 节的”数数”),再在估计的模型上做规划第 3、15 讲

一个贯穿全课的视角:几乎所有 RL 算法都可以看成”用数据近似本讲某个贝尔曼备份”的方法。本讲打下的理论基础,会在后面反复用到。


12. 本讲总结

12.1 核心概念清单

  1. MDP (S,A,P,R,γ)(S, A, P, R, \gamma):在 MRP 上加入动作,每个动作对应一个转移矩阵。
  2. 策略:确定性 π(s)\pi(s) 或随机 π(a∣s)\pi(a \mid s);确定性策略共 ∣A∣∣S∣|A|^{|S|} 个。
  3. MDP + 固定策略 = MRP:Rπ(s)=∑aπ(a∣s)R(s,a)R^\pi(s) = \sum_a \pi(a \mid s) R(s,a),Pπ(s′∣s)=∑aπ(a∣s)P(s′∣s,a)P^\pi(s' \mid s) = \sum_a \pi(a \mid s) P(s' \mid s, a)。
  4. 策略评估:用贝尔曼期望方程计算 VπV^\pi(迭代或解析)。
  5. 动作价值 Qπ(s,a)Q^\pi(s,a):先做 aa 再按 π\pi;它让我们无需模型就能比较动作。
  6. 最优策略存在:有一个确定性平稳策略在所有状态同时最优;V∗V^* 唯一,π∗\pi^* 不一定唯一。
  7. 贝尔曼最优方程:V∗=BV∗V^* = BV^*,因为 max 而非线性,不能直接求逆。
  8. 策略迭代:评估 → 贪心改进 → 重复;策略改进定理保证单调改进,有限步内精确收敛到最优。
  9. 价值迭代:Vk+1=BVkV_{k+1} = BV_k;BB 是 γ\gamma-压缩映射,保证从任意初值几何收敛到唯一的 V∗V^*。
  10. 有限视界:VkV_k 是 kk 步最优价值,最优策略是非平稳的。
  11. 奖励和 γ\gamma 定义了”最优”:微小的奖励改动可以彻底改变最优行为。

12.2 公式速查表

名称公式
MDP + 策略 → MRPRπ(s)=∑aπ(a∣s)R(s,a)R^\pi(s) = \sum_a \pi(a \mid s) R(s,a),Pπ(s′∣s)=∑aπ(a∣s)P(s′∣s,a)P^\pi(s' \mid s) = \sum_a \pi(a \mid s) P(s' \mid s,a)
状态价值Vπ(s)=Eπ[∑k≥0γkrt+k∣st=s]V^\pi(s) = \mathbb{E}_\pi[\sum_{k \ge 0} \gamma^k r_{t+k} \mid s_t = s]
动作价值Qπ(s,a)=R(s,a)+γ∑s′P(s′∣s,a)Vπ(s′)Q^\pi(s,a) = R(s,a) + \gamma \sum_{s'} P(s' \mid s,a) V^\pi(s')
VV 与 QQVπ(s)=∑aπ(a∣s)Qπ(s,a)V^\pi(s) = \sum_a \pi(a \mid s) Q^\pi(s,a)
贝尔曼期望方程Vπ(s)=∑aπ(a∣s)[R(s,a)+γ∑s′P(s′∣s,a)Vπ(s′)]V^\pi(s) = \sum_a \pi(a \mid s) [R(s,a) + \gamma \sum_{s'} P(s' \mid s,a) V^\pi(s')]
策略评估解析解Vπ=(I−γPπ)−1RπV^\pi = (I - \gamma P^\pi)^{-1} R^\pi
贝尔曼最优方程(VV)V∗(s)=max⁡a[R(s,a)+γ∑s′P(s′∣s,a)V∗(s′)]V^*(s) = \max_a [R(s,a) + \gamma \sum_{s'} P(s' \mid s,a) V^*(s')]
贝尔曼最优方程(QQ)Q∗(s,a)=R(s,a)+γ∑s′P(s′∣s,a)max⁡a′Q∗(s′,a′)Q^*(s,a) = R(s,a) + \gamma \sum_{s'} P(s' \mid s,a) \max_{a'} Q^*(s',a')
最优策略π∗(s)=arg⁡max⁡aQ∗(s,a)\pi^*(s) = \arg\max_a Q^*(s,a)
策略改进πi+1(s)=arg⁡max⁡aQπi(s,a)\pi_{i+1}(s) = \arg\max_a Q^{\pi_i}(s,a)
策略改进定理Vπi+1(s)≥Vπi(s) ∀sV^{\pi_{i+1}}(s) \ge V^{\pi_i}(s)\ \forall s
价值迭代Vk+1(s)=max⁡a[R(s,a)+γ∑s′P(s′∣s,a)Vk(s′)]V_{k+1}(s) = \max_a [R(s,a) + \gamma \sum_{s'} P(s' \mid s,a) V_k(s')]
压缩性质∥BV−BV′∥∞≤γ∥V−V′∥∞\lVert BV - BV' \rVert_\infty \le \gamma \lVert V - V' \rVert_\infty
误差估计∥Vk+1−V∗∥∞≤γ1−γ∥Vk+1−Vk∥∞\lVert V_{k+1} - V^* \rVert_\infty \le \frac{\gamma}{1-\gamma} \lVert V_{k+1} - V_k \rVert_\infty
停止准则∥Vk+1−Vk∥∞<ε(1−γ)2γ⇒\lVert V_{k+1} - V_k \rVert_\infty < \frac{\varepsilon(1-\gamma)}{2\gamma} \Rightarrow 贪心策略 ε\varepsilon-最优

12.3 中英术语对照表

中文英文中文英文
马尔可夫决策过程Markov Decision Process (MDP)规划Planning
确定性策略Deterministic policy随机策略Stochastic policy
平稳策略Stationary policy非平稳策略Non-stationary policy
策略评估Policy evaluation策略改进Policy improvement
策略迭代Policy iteration价值迭代Value iteration
状态价值函数State-value function动作价值函数Action-value function (Q-function)
贝尔曼期望方程Bellman expectation equation贝尔曼最优方程Bellman optimality equation
贝尔曼备份Bellman backup贝尔曼算子Bellman operator
最优价值函数Optimal value function最优策略Optimal policy
贪心策略Greedy policy策略改进定理Policy improvement theorem
压缩映射Contraction mapping不动点Fixed point
无穷范数Infinity norm (max norm)最优性原理Principle of optimality
同步 / 原地更新Synchronous / In-place update异步动态规划Asynchronous dynamic programming
修正策略迭代Modified policy iteration广义策略迭代Generalized policy iteration (GPI)
终止状态Terminal state吸收状态Absorbing state
随机最短路径Stochastic shortest pathε\varepsilon-最优ε\varepsilon-optimal

13. 练习题

建议先自己想,再展开答案。标 ★ 的是需要动手算或跑代码的题。

练习 1(MDP → MRP):在火星车 MDP 中,考虑随机策略:在 s4s_4 以 0.7 的概率选 TryRight、0.3 的概率选 TryLeft。计算 PπP^\pi 的第 4 行。

参考答案
  • 到 s3s_3:0.3×0.8=0.240.3 \times 0.8 = 0.24
  • 留在 s4s_4:0.3×0.2+0.7×0.2=0.200.3 \times 0.2 + 0.7 \times 0.2 = 0.20
  • 到 s5s_5:0.7×0.8=0.560.7 \times 0.8 = 0.56

即 [0,0,0.24,0.20,0.56,0,0][0, 0, 0.24, 0.20, 0.56, 0, 0],和为 1 ✓。

练习 2(Q 值计算):用 4.5 节表格中”一直向左”策略的 VπV^\pi,手算 Qπ(s6,Left)Q^\pi(s_6, \texttt{Left}) 和 Qπ(s1,Right)Q^\pi(s_1, \texttt{Right})(γ=0.9\gamma = 0.9)。第一个结果应当等于什么?为什么?

参考答案

Qπ(s6,Left)=0+0.9×(0.8×Vπ(s5)+0.2×Vπ(s6))=0.9×(0.8×5.94+0.2×5.22)=0.9×5.796≈5.22Q^\pi(s_6, \texttt{Left}) = 0 + 0.9 \times (0.8 \times V^\pi(s_5) + 0.2 \times V^\pi(s_6)) = 0.9 \times (0.8 \times 5.94 + 0.2 \times 5.22) = 0.9 \times 5.796 \approx 5.22。

它应当等于 Vπ(s6)V^\pi(s_6),因为策略在 s6s_6 本来就选 Left,Vπ(s)=Qπ(s,π(s))V^\pi(s) = Q^\pi(s, \pi(s))。

Qπ(s1,Right)=1+0.9×(0.2×Vπ(s1)+0.8×Vπ(s2))=1+0.9×(2.0+7.024)=1+8.12≈9.12Q^\pi(s_1, \texttt{Right}) = 1 + 0.9 \times (0.2 \times V^\pi(s_1) + 0.8 \times V^\pi(s_2)) = 1 + 0.9 \times (2.0 + 7.024) = 1 + 8.12 \approx 9.12 ✓(与 5.3 节表格一致)。

练习 3(理解价值):在”一直向左”策略下,为什么 Vπ(s7)=16.78V^\pi(s_7) = 16.78?请用贝尔曼方程写出 Vπ(s7)V^\pi(s_7) 满足的方程并求解(已知 Vπ(s6)=5.22V^\pi(s_6) = 5.22)。

参考答案

V(s7)=10+0.9×(0.2 V(s7)+0.8 V(s6))V(s_7) = 10 + 0.9 \times (0.2\, V(s_7) + 0.8\, V(s_6)),即 V(s7)(1−0.18)=10+0.72×5.22=13.758V(s_7)(1 - 0.18) = 10 + 0.72 \times 5.22 = 13.758,所以 V(s7)=13.758/0.82≈16.78V(s_7) = 13.758 / 0.82 \approx 16.78 ✓。

直觉:在 s7s_7 先拿 +10;每一步有 20% 的概率打滑留下再拿一次 +10;一旦成功左移,就进入价值较低的 s6s_6,并一路向左最终停在 s1s_1。

练习 4(策略改进定理):设新策略 π′\pi' 只在一个状态 s0s_0 与 π\pi 不同,且 Qπ(s0,π′(s0))>Vπ(s0)Q^\pi(s_0, \pi'(s_0)) > V^\pi(s_0)。证明 Vπ′(s)≥Vπ(s)V^{\pi'}(s) \ge V^\pi(s) 对所有 ss 成立,并且 Vπ′(s0)>Vπ(s0)V^{\pi'}(s_0) > V^\pi(s_0)。

参考答案

对所有 ss 都有 Vπ(s)≤Qπ(s,π′(s))V^\pi(s) \le Q^\pi(s, \pi'(s)):在 s≠s0s \ne s_0 处 π′(s)=π(s)\pi'(s) = \pi(s),取等号;在 s0s_0 处由假设严格成立。于是 7.3 节证明的每一步都照样成立,得到 Vπ′≥VπV^{\pi'} \ge V^\pi。

严格性:Vπ′(s0)=R(s0,a′)+γ∑s′P(s′∣s0,a′)Vπ′(s′)≥R(s0,a′)+γ∑s′P(s′∣s0,a′)Vπ(s′)=Qπ(s0,a′)>Vπ(s0)V^{\pi'}(s_0) = R(s_0, a') + \gamma \sum_{s'} P(s' \mid s_0, a') V^{\pi'}(s') \ge R(s_0, a') + \gamma \sum_{s'} P(s' \mid s_0, a') V^\pi(s') = Q^\pi(s_0, a') > V^\pi(s_0),其中 a′=π′(s0)a' = \pi'(s_0),中间的"≥\ge"用了刚证明的 Vπ′≥VπV^{\pi'} \ge V^\pi。

练习 5(压缩映射):仿照 8.4 节,证明贝尔曼期望算子 BπB^\pi 也是 γ\gamma-压缩映射。为什么这个证明比 BB 的证明更简单?

参考答案

(BπV)(s)−(BπV′)(s)=γ∑aπ(a∣s)∑s′P(s′∣s,a)(V(s′)−V′(s′))=γ∑s′Pπ(s′∣s)(V(s′)−V′(s′))(B^\pi V)(s) - (B^\pi V')(s) = \gamma \sum_a \pi(a \mid s) \sum_{s'} P(s' \mid s, a)(V(s') - V'(s')) = \gamma \sum_{s'} P^\pi(s' \mid s)(V(s') - V'(s'))。

取绝对值:≤γ∑s′Pπ(s′∣s)∣V(s′)−V′(s′)∣≤γ∥V−V′∥∞\le \gamma \sum_{s'} P^\pi(s' \mid s) |V(s') - V'(s')| \le \gamma \lVert V - V' \rVert_\infty。对 ss 取最大值即得。

更简单是因为 BπB^\pi 是线性的(仿射的),不需要处理 max,也就不需要那个 ∣max⁡f−max⁡g∣≤max⁡∣f−g∣|\max f - \max g| \le \max |f - g| 的引理。

练习 6(γ=0\gamma = 0):在火星车 MDP 中令 γ=0\gamma = 0,最优价值 V∗V^* 是多少?哪些策略是最优的?一般的 MDP 中,γ=0\gamma = 0 时的最优策略是什么?

参考答案

γ=0\gamma = 0 时 V∗(s)=max⁡aR(s,a)V^*(s) = \max_a R(s, a)。火星车中 R(s,a)R(s, a) 与动作无关,所以 V∗=[1,0,0,0,0,0,10]V^* = [1, 0, 0, 0, 0, 0, 10],所有 128 个策略都是最优的(最优策略不唯一的极端例子)。

一般情况下,γ=0\gamma = 0 时最优策略是”完全短视”的:每个状态选即时奖励最大的动作 arg⁡max⁡aR(s,a)\arg\max_a R(s, a),完全不考虑后果。这相当于一个老虎机问题(第 1 讲 3.7 节)。

练习 7(有限视界):根据 8.7 节的表格,解释为什么剩 6 步时 s2s_2 选向左、剩 7 步时选向右。从 s2s_2 到 s7s_7 最少需要几步?

参考答案

从 s2s_2 到 s7s_7 最少需要 5 次成功右移,每次成功概率 0.8,期望需要约 5/0.8=6.255/0.8 = 6.25 步。剩 6 步时,到达 s7s_7 的概率不高,而且即使到达也只剩 1 步左右能拿 +10;而向左 1 步到 s1s_1 之后,剩下的每一步都能稳拿 +1(V6(s2)=4.75V_6(s_2) = 4.75 主要来自这里)。剩 7 步时,到达 s7s_7 后能多拿几次 +10,期望收益(10.17)超过了向左的收益。

练习 8(γ 与策略迭代)★:运行 03_policy_iteration.py,观察演示 4。尝试找到使 s3s_3 的最优动作从 ← 变为 → 的 γ\gamma 临界值(精确到 0.01)。

提示

在 main() 里写一个循环,让 γ\gamma 从 0.3 以 0.01 的步长增加到 0.7,每次运行 policy_iteration(P, R, g),打印 pol[2](代码中 s3s_3 的下标是 2)。

参考结果:s3s_3 在 γ≈0.37\gamma \approx 0.37 时变为 →;同样可以找出 s2s_2 约在 0.62、s1s_1 约在 0.69 时变为 →。离 s7s_7 越远,需要越大的 γ\gamma 才”看得见”它;s1s_1 的临界值最大,因为它脚下就有 +1,放弃它的代价最高。

练习 9(奖励设计)★:修改 05_gridworld.py,把 step_reward 从 −0.04 以 0.001 的步长逐渐减小,找出 (2,2) 的最优动作从 ← 变成 ↑ 的临界值。你能用”绕远路多花的步数 × 每步成本” vs “走近路掉进 -1 的风险 × 损失”来直观解释这个临界值吗?

提示与参考结果

临界值出人意料地接近标准设定:大约在 −0.045-0.045 附近,(2,2) 就改为 ↑。也就是说,教科书里的”标准策略”恰好处在一个转折点边上。

粗略估算:从 (2,2) 出发,近路是 (2,2)→(1,2)→(0,2)→(0,3),远路是绕左边一圈到 (0,3),远路多走 4 步,多花约 4∣c∣4|c|。近路的风险主要在 (1,2) 向上走那一步:有 10% 的概率滑进 -1,损失约为 2(本来能拿 +1,结果拿到 -1),期望损失约 0.1×2=0.20.1 \times 2 = 0.2。令 4∣c∣≈0.24|c| \approx 0.2,得 ∣c∣≈0.05|c| \approx 0.05,和代码算出的 0.045 很接近。这种”粗略估算 + 精确计算相互印证”的习惯很有用。

练习 10(思考题):价值迭代中,贪心策略在第 7 次迭代后就不再变化,但价值还需 175 次迭代才收敛。能否设计一个”当贪心策略连续 mm 次不变时就停止”的规则?它有什么风险?怎样才能确认策略真的是最优的?

参考答案

风险:贪心策略可能”暂时稳定”一段时间后又改变(例如某个遥远的大奖励的信息还没传播过来)。没有理论保证连续 mm 次不变就是最优。

确认方法:对当前贪心策略 π\pi 做一次精确的策略评估得到 VπV^\pi,再检查 π\pi 是否对 VπV^\pi 贪心(即是否满足贝尔曼最优方程)。如果是,π\pi 就是最优的——这正是策略迭代的停止条件。把”价值迭代若干步 + 精确评估检查”结合起来,就是修正策略迭代的思想。


14. 延伸阅读

  • Sutton & Barto,Reinforcement Learning: An Introduction(第 2 版):第 3 章(有限 MDP)、第 4 章(动态规划)。第 4 章的”Jack’s Car Rental”是一个很好的策略迭代练习。
  • CS234 Spring 2024 Lecture 2 录像与课件。
  • David Silver UCL RL 课程:Lecture 2 后半(MDP)、Lecture 3(Planning by Dynamic Programming)。
  • Russell & Norvig,Artificial Intelligence: A Modern Approach:第 17 章(Making Complex Decisions),本讲的网格世界例子来自这里。
  • 进阶:Puterman,Markov Decision Processes——MDP 理论的标准参考书,包含本讲所有定理的严格证明。

15. 下一讲预告

本讲的一切都建立在”模型已知”的前提上。但在真实世界中,我们通常不知道 PP 和 RR——火星车不知道打滑的概率,推荐系统不知道用户会如何反应。

下一讲我们去掉这个假设:只能与环境交互、收集经验,怎样评估一个策略? 你会看到:

  • 蒙特卡洛(MC):跑完整个回合,用实际回报的平均值估计价值——第 1 讲的蒙特卡洛方法的直接推广;
  • 时序差分(TD):不等回合结束,走一步就更新——用”一步奖励 + 下一状态的估计价值”代替本讲贝尔曼备份中的期望;
  • 两者的偏差–方差权衡,以及马尔可夫性对 TD 为何如此关键。

下一讲之前,建议你:跑通 code/lecture02/ 下的 5 个脚本,完成练习 2、4、8,并尝试练习 9 中修改网格世界的奖励。

← 返回课程目录