对应 :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 本讲要回答的问题
如果我完全知道世界如何运转(转移概率 P P P 和奖励 R R R 都已知),怎样找到最优的决策方式?
这叫**规划(planning)**问题。你可能会疑惑:RL 不是讲”从经验中学习”吗?为什么要花一整讲研究”模型已知”的情况?有四个理由:
规划是学习的子程序 。一种很自然的 RL 方法是”先从数据中学出模型,再在模型上做规划”(基于模型的 RL)。不会规划,这条路就走不通。
概念是通用的 。本讲引入的价值函数 V π V^\pi V π 、动作价值 Q π Q^\pi Q π 、贝尔曼方程、策略改进,是后面所有 无模型算法(TD、Q-learning、DQN、策略梯度、PPO)的理论骨架。Q-learning 本质上就是”不知道模型时的价值迭代”。
很多现实问题的模型确实已知 :棋类游戏的规则、库存系统的供需统计、物理仿真器……
理论干净 :在已知模型下,我们能严格证明算法收敛、找到的策略是最优的。这些证明中的思想(比如压缩映射)会反复出现。
0.2 学完本讲,你应该能够
写出 MDP 的定义 ( S , A , P , R , γ ) (S, A, P, R, \gamma) ( S , A , P , R , γ ) ,并能把一个简单的现实问题建模成 MDP。
解释为什么”MDP + 固定策略 = MRP ”,并计算 P π P^\pi P π 和 R π R^\pi R π 。
写出贝尔曼期望方程,用迭代法和解析法做策略评估 。
定义动作价值函数 Q π ( s , a ) Q^\pi(s,a) Q π ( s , a ) ,说清它和 V π ( s ) V^\pi(s) V π ( s ) 的关系,以及它为什么是”改进策略”的关键。
写出贝尔曼最优方程 ,解释为什么存在一个在所有状态上同时最优的确定性策略。
陈述并证明策略改进定理 ,写出策略迭代 算法并解释它为什么一定终止于最优策略。
写出价值迭代 算法,证明贝尔曼最优算子是压缩映射 ,推导停止准则。
比较策略迭代与价值迭代的优缺点;理解有限视界下最优策略为什么是”非平稳”的。
通过网格世界的例子,理解奖励设计和折扣因子如何决定”最优”的含义 。
0.3 先修知识
知识点 用在哪里 最低要求 第 1 讲:MRP、回报、价值、MRP 贝尔曼方程、三种计算方法 全讲 必须 。本讲大量直接复用第 1 讲 8.7 节的压缩映射直觉 第 8 节 看过即可,本讲会严格证明 max \max max 与 arg max \arg\max arg max 第 6–8 节 max a f ( a ) \max_a f(a) max a f ( a ) 是”f f f 的最大值”,arg max a f ( a ) \arg\max_a f(a) arg max a f ( a ) 是”使 f f f 最大的那个 a a a ”无穷范数 ∥ x ∥ ∞ = max i ∣ x i ∣ \lVert x \rVert_\infty = \max_i \lvert x_i \rvert ∥ x ∥ ∞ = max i ∣ x i ∣ 第 8 节 就是”向量中绝对值最大的那个元素” 不等式的传递:a ≤ b a \le b a ≤ b 且 b ≤ c ⇒ a ≤ c b \le c \Rightarrow a \le c b ≤ c ⇒ a ≤ c 第 7、8 节的证明 会用即可
0.4 第 1 讲回顾(30 秒版)
MRP ( S , P , R , γ ) (S, P, R, \gamma) ( S , P , R , γ ) :状态按 P P P 随机转移,每个状态给奖励 R ( s ) R(s) R ( s ) ,没有动作。
回报 G t = r t + γ r t + 1 + γ 2 r t + 2 + ⋯ = r t + γ G t + 1 G_t = r_t + \gamma r_{t+1} + \gamma^2 r_{t+2} + \cdots = r_t + \gamma G_{t+1} G t = r t + γ r t + 1 + γ 2 r t + 2 + ⋯ = r t + γ G t + 1 。
价值 V ( s ) = E [ G t ∣ s t = s ] V(s) = \mathbb{E}[G_t \mid s_t = s] V ( s ) = E [ G t ∣ 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 ( s ) = R ( s ) + γ ∑ s ′ P ( s ′ ∣ s ) V ( s ′ ) ,矩阵形式 V = R + γ P V V = R + \gamma P V V = R + γ P V 。
三种求法 :蒙特卡洛(采样平均)、解析解 V = ( I − γ P ) − 1 R V = (I - \gamma P)^{-1} R V = ( I − γ P ) − 1 R 、迭代法 V k = R + γ P V k − 1 V_k = R + \gamma P V_{k-1} V k = R + γ 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)} ( S , P , R , γ ) MRP + 动作 A ( S , A , P , R , γ ) MDP
加入动作后,转移概率和奖励都依赖于所选的动作 :同一个位置,向左走和向右走会到达不同的地方。
1.2 定义
马尔可夫决策过程 是一个五元组 ( S , A , P , R , γ ) (S, A, P, R, \gamma) ( S , A , P , R , γ ) :
S S S :有限的状态 集合;
A A A :有限的动作 集合;
P P P :转移模型 ,P ( s ′ ∣ s , a ) = Pr ( s t + 1 = s ′ ∣ s t = s , a t = a ) P(s' \mid s, a) = \Pr(s_{t+1} = s' \mid s_t = s, a_t = a) P ( s ′ ∣ s , a ) = Pr ( s t + 1 = s ′ ∣ s t = s , a t = a ) ;
R R R :奖励函数 ,R ( s , a ) = E [ r t ∣ s t = s , a t = a ] R(s, a) = \mathbb{E}[\,r_t \mid s_t = s, a_t = a\,] R ( s , a ) = E [ r t ∣ s t = s , a t = a ] ;
γ ∈ [ 0 , 1 ] \gamma \in [0, 1] γ ∈ [ 0 , 1 ] :折扣因子 。
马尔可夫性体现在:下一个状态只取决于当前状态和当前动作 ,与更早的历史无关。
和 MRP 的对比 :MRP 的 P P P 是一张 N × N N \times N N × N 的表;MDP 的 P P P 是 ∣ A ∣ |A| ∣ A ∣ 张这样的表——每个动作一张 。可以把 MDP 想象成”一个遥控器上有 ∣ A ∣ |A| ∣ A ∣ 个按钮,每个按钮对应一个不同的马尔可夫链,智能体每一步可以选择按哪个按钮”。
1.3 火星车 MDP
沿用第 1 讲的火星车,现在它有两个动作:
状态 :s 1 , … , s 7 s_1, \dots, s_7 s 1 , … , s 7
动作 :TryLeft(尝试向左)、TryRight(尝试向右)
转移 :以 0.8 的概率朝想去的方向移动一格,以 0.2 的概率打滑原地不动;撞墙也原地不动
奖励 :R ( s 1 , ⋅ ) = 1 R(s_1, \cdot) = 1 R ( s 1 , ⋅ ) = 1 ,R ( s 7 , ⋅ ) = 10 R(s_7, \cdot) = 10 R ( s 7 , ⋅ ) = 10 ,其余为 0(本例中奖励只取决于状态,与动作无关)
两个动作的转移矩阵(行 = 当前状态,列 = 下一状态):
P ( ⋅ ∣ ⋅ , TryLeft ) = ( 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 ) P ( ⋅ ∣ ⋅ , TryRight ) = ( 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 ) 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} P ( ⋅ ∣ ⋅ , TryLeft ) = 1.0 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 0.2 P ( ⋅ ∣ ⋅ , TryRight ) = 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 0 0 0 0 0 0 0.8 1.0
注意左上角和右下角的 1.0:在 s 1 s_1 s 1 向左、在 s 7 s_7 s 7 向右会撞墙,“成功”和”打滑”都是原地不动,概率加起来是 1。
代码对应 :01_mdp_basics.py 的 build_mars_rover_mdp。注意其中用的是 P[s, a, target] += ... 而不是 =——撞墙时两部分概率落在同一格,必须累加。这是一个很典型的隐蔽 bug。
1.4 奖励的几种写法
不同教材对奖励的写法不同,初学者容易混淆。其实它们可以互相转换:
写法 含义 例子 R ( s ) R(s) R ( s ) 只取决于所在状态 火星车:在 s 7 s_7 s 7 就给 +10 R ( s , a ) R(s, a) R ( s , a ) 取决于状态和动作 机器人:同一位置,“跳跃”比”走路”耗电多 R ( s , a , s ′ ) R(s, a, s') R ( s , a , s ′ ) 还取决于到达的状态 游戏:从 s s s 做 a a a 成功到达 终点才给奖励
它们的关系: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 ) = ∑ s ′ P ( s ′ ∣ s , a ) R ( s , a , s ′ ) (对下一状态取期望)。所有算法只需要 R ( s , a ) R(s, a) R ( s , a ) 这个期望值,所以本讲统一使用 R ( s , a ) R(s, a) R ( s , a ) 。
1.5 用 MDP 建模现实问题
问题 状态 S S S 动作 A A A 转移 P P P 奖励 R R R 库存管理 仓库中的库存量 今天订多少货 由随机的顾客需求决定 销售收入 − 进货成本 − 缺货损失 − 仓储费 自适应教学 学生对各知识点的掌握程度 出哪一道题 学生做题后掌握程度的变化 掌握程度的提升 慢病管理 病人的生理指标 用药方案 病人对药物的反应 指标在健康范围 +,副作用 − 棋类游戏 棋盘局面 落子位置 自己落子 + 对手回应 赢 +1,输 −1,其他 0
建模本身就是一门艺术 :状态选多少信息(回忆第 1 讲 3.5 节的马尔可夫性权衡)、动作粒度多细、奖励怎么设计(第 10 节会看到奖励的微小改变如何彻底改变最优策略)——这些决定往往比算法选择更影响最终效果。
1.6 MDP 在代码中的样子
数学对象 代码 形状 读法 P ( s ′ ∣ s , a ) P(s' \mid s, a) P ( s ′ ∣ s , a ) P[s, a, s2]( N , A , N ) (N, A, N) ( N , A , N ) “在 s 做 a 到 s2 的概率” R ( s , a ) R(s, a) R ( s , a ) R[s, a]( N , A ) (N, A) ( N , A ) “在 s 做 a 的期望奖励” 某动作的转移矩阵 P[:, a, :]( N , N ) (N, N) ( N , N ) “所有状态都做 a 时的马尔可夫链” 某 ( s , a ) (s,a) ( s , a ) 的下一状态分布 P[s, a]( N , ) (N,) ( N , ) 一个概率分布,和为 1
合法性检查:P 非负,且对每一对 ( s , a ) (s, a) ( s , a ) ,P[s, a].sum() == 1(代码中的 check_mdp)。
2. 策略
2.1 确定性策略与随机策略
策略 π \pi π 规定了智能体在每个状态下如何选择动作:
确定性策略 :π ( s ) = a \pi(s) = a π ( s ) = a ,每个状态对应一个固定的动作。代码中是长度 N N N 的整数数组。
随机策略 :π ( a ∣ s ) = Pr ( a t = a ∣ s t = s ) \pi(a \mid s) = \Pr(a_t = a \mid s_t = s) π ( a ∣ s ) = Pr ( a t = a ∣ s t = s ) ,每个状态对应一个动作的概率分布。代码中是 ( N , A ) (N, A) ( N , A ) 的矩阵,每行和为 1。
确定性策略是随机策略的特例(选中的动作概率为 1,其余为 0,即”独热编码”)。代码中统一转换成 ( N , A ) (N, A) ( N , A ) 矩阵,后续算法只需写一个版本(deterministic_to_stochastic 函数)。
2.2 平稳策略
本讲的策略都是平稳的(stationary) :只看当前状态,不看”现在是第几步”,也不看历史。
你可能会问:会不会存在一种”看历史”或”看时间”的策略,比所有平稳策略都好?对于无限视界、有折扣 的 MDP,答案是不会 ——可以证明一定存在一个平稳、确定性 的最优策略(6.1 节解释直觉)。这让我们可以放心地只在平稳确定性策略中寻找。
但对有限视界 问题,最优策略通常依赖剩余步数 (8.7 节会看到),是非平稳的。
2.3 策略一共有多少个?
每个状态独立地从 ∣ A ∣ |A| ∣ A ∣ 个动作中选一个,所以确定性策略一共有 ∣ A ∣ ∣ S ∣ |A|^{|S|} ∣ A ∣ ∣ S ∣ 个:
问题 ∣ S ∣ \lvert S \rvert ∣ S ∣ ∣ A ∣ \lvert A \rvert ∣ A ∣ 确定性策略数 火星车 7 2 2 7 = 128 2^7 = 128 2 7 = 128 4×4 网格世界 16 4 4 16 ≈ 4.3 × 10 9 4^{16} \approx 4.3 \times 10^9 4 16 ≈ 4.3 × 1 0 9 10×10 网格世界 100 4 4 100 ≈ 10 60 4^{100} \approx 10^{60} 4 100 ≈ 1 0 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) R π ( s ) = a ∈ A ∑ π ( a ∣ 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) P π ( s ′ ∣ s ) = a ∈ A ∑ π ( a ∣ s ) P ( s ′ ∣ s , a )
直觉 :从 s s s 到 s ′ s' s ′ 有好几条”路”——通过不同的动作。每条路的概率 = “选这个动作的概率” × “这个动作把你带到 s ′ s' s ′ 的概率”。把所有路加起来就是总概率(全概率公式)。
对确定性策略,求和只剩一项:R π ( s ) = R ( s , π ( s ) ) R^\pi(s) = R(s, \pi(s)) R π ( s ) = R ( s , π ( s )) ,P π ( s ′ ∣ s ) = P ( s ′ ∣ s , π ( s ) ) P^\pi(s' \mid s) = P(s' \mid s, \pi(s)) P π ( s ′ ∣ s ) = P ( s ′ ∣ s , π ( s )) ——直接”挑出”所选动作对应的那一行。
于是 ( S , P π , R π , γ ) (S, P^\pi, R^\pi, \gamma) ( S , P π , R π , γ ) 就是一个标准的 MRP 。
3.2 两个例子
例 1:一直向右 。每个状态都选 TryRight,所以 P π P^\pi P π 就是 TryRight 那张转移矩阵,R π = [ 1 , 0 , 0 , 0 , 0 , 0 , 10 ] R^\pi = [1, 0, 0, 0, 0, 0, 10] R π = [ 1 , 0 , 0 , 0 , 0 , 0 , 10 ] 。
例 2:随机策略 (每个状态以 0.5 的概率选每个动作)。计算 P π P^\pi P π 的第 4 行(从 s 4 s_4 s 4 出发):
到 s 3 s_3 s 3 :0.5 × 0.8 0.5 \times 0.8 0.5 × 0.8 (选左且成功)= 0.4 = 0.4 = 0.4
到 s 5 s_5 s 5 :0.5 × 0.8 0.5 \times 0.8 0.5 × 0.8 (选右且成功)= 0.4 = 0.4 = 0.4
留在 s 4 s_4 s 4 :0.5 × 0.2 + 0.5 × 0.2 0.5 \times 0.2 + 0.5 \times 0.2 0.5 × 0.2 + 0.5 × 0.2 (两个动作各自打滑)= 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] [ 0 , 0 , 0.4 , 0.2 , 0.4 , 0 , 0 ] ——这恰好就是第 1 讲的火星车马尔可夫链! 第 1 讲那个”随机游走”的火星车,其实就是在这个 MDP 中执行随机策略。这也解释了一个现象:第 4 节计算出的随机策略价值,会和第 1 讲 γ = 0.9 \gamma = 0.9 γ = 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 V π
策略 π \pi π 的状态价值函数 :
V π ( s ) = E π [ r t + γ r t + 1 + γ 2 r t + 2 + ⋯ | s t = 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] V π ( s ) = E π [ r t + γ r t + 1 + γ 2 r t + 2 + ⋯ s t = s ]
下标 π \pi π 表示”动作按策略 π \pi π 选择”。它回答:“从 s s s 出发、一直按 π \pi π 行动,平均能拿到多少折扣回报?”
策略评估(policy evaluation) 就是计算 V π V^\pi V π 。
4.2 贝尔曼期望方程
由于 MDP + π \pi π = MRP,第 1 讲的 MRP 贝尔曼方程直接适用,只需把 R , P R, P R , P 换成 R π , P π R^\pi, P^\pi R π , P π :
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') V π ( s ) = R π ( s ) + γ s ′ ∑ P π ( s ′ ∣ s ) V π ( s ′ )
把 R π , P π R^\pi, P^\pi R π , P π 的定义代进去,得到更”原始”的形式:
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]\;} V π ( s ) = a ∑ π ( a ∣ s ) [ R ( s , a ) + γ s ′ ∑ P ( s ′ ∣ s , a ) V π ( s ′ ) ]
逐项解读 :
方括号里:如果在 s s s 选了动作 a a a ,价值 = 即时奖励 + 折扣后的”下一状态的平均价值”;
外面的 ∑ a π ( a ∣ s ) \sum_a \pi(a \mid s) ∑ a π ( a ∣ s ) :按策略对各个动作的价值取平均 。
这叫贝尔曼期望方程 (“期望”指的是对动作按 π \pi π 取期望)。
4.3 迭代策略评估与”贝尔曼备份”
用第 1 讲的迭代法:从 V 0 = 0 V_0 = 0 V 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 γ = 0.9
从 V 0 = 0 V_0 = 0 V 0 = 0 开始。
第 1 次备份 :V 1 ( s ) = R ( s , Right ) + 0.9 × ( 下一状态平均价值 = 0 ) V_1(s) = R(s, \texttt{Right}) + 0.9 \times (\text{下一状态平均价值} = 0) V 1 ( s ) = R ( s , Right ) + 0.9 × ( 下一状态平均价值 = 0 ) ,所以 V 1 = R π = [ 1 , 0 , 0 , 0 , 0 , 0 , 10 ] V_1 = R^\pi = [1, 0, 0, 0, 0, 0, 10] V 1 = R π = [ 1 , 0 , 0 , 0 , 0 , 0 , 10 ] 。
第 2 次备份 ,以 s 6 s_6 s 6 和 s 7 s_7 s 7 为例:
V 2 ( s 6 ) = 0 + 0.9 × ( 0.2 × V 1 ( s 6 ) ⏟ 打滑 + 0.8 × V 1 ( s 7 ) ⏟ 成功右移 ) = 0.9 × ( 0 + 8 ) = 7.2 V_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 V 2 ( s 6 ) = 0 + 0.9 × ( 打滑 0.2 × V 1 ( s 6 ) + 成功右移 0.8 × V 1 ( s 7 ) ) = 0.9 × ( 0 + 8 ) = 7.2
V 2 ( s 7 ) = 10 + 0.9 × ( 1.0 × V 1 ( s 7 ) ) = 10 + 9 = 19 V_2(s_7) = 10 + 0.9 \times \big(1.0 \times V_1(s_7)\big) = 10 + 9 = 19 V 2 ( s 7 ) = 10 + 0.9 × ( 1.0 × V 1 ( s 7 ) ) = 10 + 9 = 19
第 3 次备份 ,以 s 5 s_5 s 5 为例:
V 3 ( s 5 ) = 0 + 0.9 × ( 0.2 × V 2 ( s 5 ) + 0.8 × V 2 ( s 6 ) ) = 0.9 × ( 0 + 0.8 × 7.2 ) = 5.184 V_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 V 3 ( s 5 ) = 0 + 0.9 × ( 0.2 × V 2 ( s 5 ) + 0.8 × V 2 ( s 6 )) = 0.9 × ( 0 + 0.8 × 7.2 ) = 5.184
完整结果:
s 1 s_1 s 1 s 2 s_2 s 2 s 3 s_3 s 3 s 4 s_4 s 4 s 5 s_5 s 5 s 6 s_6 s 6 s 7 s_7 s 7 V 0 V_0 V 0 0 0 0 0 0 0 0 V 1 V_1 V 1 1.00 0 0 0 0 0 10.00 V 2 V_2 V 2 1.18 0 0 0 0 7.20 19.00 V 3 V_3 V 3 1.21 0 0 0 5.18 14.98 27.10 V π = V ∞ V^\pi = V_\infty V π = V ∞ 47.05 52.19 59.44 67.69 77.10 87.80 100.00
观察 :+10 的”消息”每迭代一次向左传播一格。V 2 V_2 V 2 时 s 6 s_6 s 6 才”知道”右边有 +10,V 3 V_3 V 3 时 s 5 s_5 s 5 才知道。这就是”备份”的物理含义:价值从后继状态一步步往回流。
验算 V π ( s 7 ) = 100 V^\pi(s_7) = 100 V π ( s 7 ) = 100 :在 s 7 s_7 s 7 一直向右就是一直撞墙待在 s 7 s_7 s 7 ,每步 +10,总价值 10 1 − 0.9 = 100 \frac{10}{1 - 0.9} = 100 1 − 0.9 10 = 100 ✓。
4.5 三个策略的价值(γ = 0.9 \gamma = 0.9 γ = 0.9 )
策略 s 1 s_1 s 1 s 2 s_2 s 2 s 3 s_3 s 3 s 4 s_4 s 4 s 5 s_5 s 5 s 6 s_6 s 6 s 7 s_7 s 7 一直向左 10.00 8.78 7.71 6.77 5.94 5.22 16.78 一直向右 47.05 52.19 59.44 67.69 77.10 87.80 100.00 随机 6.91 6.05 6.87 9.61 15.01 24.58 40.97
几个值得思考的现象:
随机策略这一行 和第 1 讲 MRP 在 γ = 0.9 \gamma = 0.9 γ = 0.9 时的价值一模一样 ——正如 3.2 节所说,它们是同一个马尔可夫链。
一直向右在每一个状态都是最好的 ,连 s 1 s_1 s 1 都是:在 s 1 s_1 s 1 原地拿 +1 的总价值只有 1 1 − 0.9 = 10 \frac{1}{1-0.9} = 10 1 − 0.9 1 = 10 ,而花大约 6 / 0.8 = 7.5 6/0.8 = 7.5 6/0.8 = 7.5 步走到 s 7 s_7 s 7 后每步拿 +10,折扣后仍有 47.05。
一直向左时 V ( s 7 ) = 16.78 > V ( s 1 ) = 10 V(s_7) = 16.78 > V(s_1) = 10 V ( s 7 ) = 16.78 > V ( s 1 ) = 10 :尽管策略是向左走,但在 s 7 s_7 s 7 至少能拿一次 +10(还可能因打滑多拿几次),这比 s 1 s_1 s 1 的”每步 +1”开局更好。
4.6 同步更新 vs 原地更新
上面的算法是同步更新 :用上一轮的 V k − 1 V_{k-1} V k − 1 计算所有状态的 V k V_k V k ,需要两份数组。
另一种是原地更新(in-place,也叫 Gauss–Seidel 式) :只用一份数组,按某个顺序逐个更新状态,更新 s s s 时立刻使用 本轮已更新过的其他状态的新值。两种方式收敛到同一个 V π V^\pi V π 。
更新顺序很重要 。对”一直向右”策略,只迭代 1 轮后的结果:
更新方式 s 1 s_1 s 1 s 2 s_2 s 2 s 3 s_3 s 3 s 4 s_4 s 4 s 5 s_5 s 5 s 6 s_6 s 6 s 7 s_7 s 7 同步 1.00 0 0 0 0 0 10.00 原地,s 1 → s 7 s_1 \to s_7 s 1 → s 7 顺序 1.00 0 0 0 0 0 10.00 原地,s 7 → s 1 s_7 \to s_1 s 7 → s 1 顺序 2.39 1.93 2.69 3.73 5.18 7.20 10.00
从右往左扫时,先算出 s 7 s_7 s 7 的新值,马上用它算 s 6 s_6 s 6 ,再用 s 6 s_6 s 6 的新值算 s 5 s_5 s 5 ……一轮之内 +10 的信息就传遍了所有状态 。
但一个反直觉的实验结果 :三种方式收敛到 10 − 10 10^{-10} 1 0 − 10 精度所需的总轮数完全相同 (都是 242 轮)。原因是 s 7 s_7 s 7 的自环 :V ( s 7 ) ← 10 + 0.9 V ( s 7 ) V(s_7) \leftarrow 10 + 0.9\, V(s_7) V ( s 7 ) ← 10 + 0.9 V ( s 7 ) ,它自己每轮只能把误差缩小到 0.9 倍,与更新顺序无关——总轮数被最慢收敛的部分卡住了。
教训 :“信息传播得快”和”总体收敛得快”是两回事。原地更新在很多问题上确实能加速(尤其是没有强自环的问题),但不是万能的。
代码对应 :02_policy_evaluation.py 的 policy_evaluation_iterative(参数 in_place 和 order)。
4.7 解析解
同样可以直接解线性方程组:
V π = ( I − γ P π ) − 1 R π V^\pi = (I - \gamma P^\pi)^{-1} R^\pi V π = ( I − γ P π ) − 1 R π
代码中用 np.linalg.solve,计算量 O ( ∣ S ∣ 3 ) O(|S|^3) O ( ∣ S ∣ 3 ) ,要求 γ < 1 \gamma < 1 γ < 1 。在状态数不太大时(几千以内),这是最精确、最省事的策略评估方法。
5. 动作价值函数 Q π Q^\pi Q π
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') Q π ( s , a ) = R ( s , a ) + γ s ′ ∑ P ( s ′ ∣ s , a ) V π ( s ′ )
含义 :在状态 s s s 先执行动作 a a a (不管 π \pi π 在 s s s 会选什么),之后一直按 π \pi π 行动 ,所能获得的期望回报。
直觉 :V π ( s ) V^\pi(s) V π ( s ) 回答”这个状态有多好”,Q π ( s , a ) Q^\pi(s, a) Q π ( s , a ) 回答”在这个状态做这个动作有多好”。前者给状态打分,后者给”状态–动作对”打分。
一个类比:你在下棋,按照你一贯的风格(策略 π \pi π )下,当前局面的胜率是 V π ( s ) V^\pi(s) V π ( s ) 。现在你考虑”这一步走个不寻常的招法 a a a ,之后再回到我的风格”,此时的胜率就是 Q π ( s , a ) Q^\pi(s, a) Q π ( s , a ) 。
5.2 V V V 与 Q Q Q 的关系
两者可以互相表示:
V π ( s ) = ∑ a π ( a ∣ s ) Q π ( s , a ) (状态价值 = 按策略对动作价值取平均) V^\pi(s) = \sum_a \pi(a \mid s)\, Q^\pi(s, a)
\qquad\text{(状态价值 = 按策略对动作价值取平均)} V π ( s ) = a ∑ π ( a ∣ s ) Q π ( s , a ) (状态价值 = 按策略对动作价值取平均)
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{(动作价值 = 即时奖励 + 下一状态的平均价值)} Q π ( s , a ) = R ( s , a ) + γ s ′ ∑ P ( s ′ ∣ s , a ) V π ( s ′ ) (动作价值 = 即时奖励 + 下一状态的平均价值)
对确定性策略,第一个式子简化为 V π ( s ) = Q π ( s , π ( s ) ) V^\pi(s) = Q^\pi(s, \pi(s)) V π ( s ) = Q π ( s , π ( s )) 。
把第二个式子代入第一个,就回到了贝尔曼期望方程;把第一个代入第二个,得到 Q Q Q 的贝尔曼期望方程:
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') Q π ( s , a ) = R ( s , a ) + γ s ′ ∑ P ( s ′ ∣ s , a ) a ′ ∑ π ( a ′ ∣ s ′ ) Q π ( s ′ , a ′ )
5.3 例子:Q π Q^\pi Q π 揭示了哪里可以改进
对”一直向左”策略(γ = 0.9 \gamma = 0.9 γ = 0.9 )计算 Q π Q^\pi Q π :
s 1 s_1 s 1 s 2 s_2 s 2 s 3 s_3 s 3 s 4 s_4 s 4 s 5 s_5 s 5 s 6 s_6 s 6 s 7 s_7 s 7 V π ( s ) V^\pi(s) V π ( s ) 10.00 8.78 7.71 6.77 5.94 5.22 16.78 Q π ( s , Left ) Q^\pi(s, \texttt{Left}) Q π ( s , Left ) 10.00 8.78 7.71 6.77 5.94 5.22 16.78 Q π ( s , Right ) Q^\pi(s, \texttt{Right}) Q π ( s , Right ) 9.12 7.13 6.26 5.50 4.83 13.02 25.10
验算一个:Q π ( s 6 , Right ) = 0 + 0.9 × ( 0.2 × V π ( s 6 ) + 0.8 × V π ( s 7 ) ) = 0.9 × ( 1.044 + 13.424 ) = 13.02 Q^\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 Q π ( s 6 , Right ) = 0 + 0.9 × ( 0.2 × V π ( s 6 ) + 0.8 × V π ( s 7 )) = 0.9 × ( 1.044 + 13.424 ) = 13.02 ✓。
关键观察 :在 s 6 s_6 s 6 和 s 7 s_7 s 7 ,Q π ( s , Right ) > V π ( s ) Q^\pi(s, \texttt{Right}) > V^\pi(s) Q π ( s , Right ) > V π ( s ) 。也就是说,在这两个状态”偏离一次策略、改成向右”会更好 。自然的想法是:把这两个状态的动作改成向右,得到一个新策略——它会更好吗?第 7 节的策略改进定理 会给出肯定的回答。
有趣的是,在 s 1 s_1 s 1 到 s 5 s_5 s 5 ,向右的 Q Q Q 值反而更低——因为 Q π Q^\pi Q π 假设”之后仍按一直向左走”,向右走一步然后又被策略拉回来向左,白白浪费了时间。只有 s 6 s_6 s 6 、s 7 s_7 s 7 “看得见” s 7 s_7 s 7 的 +10。
5.4 为什么 Q Q Q 如此重要?
Q Q Q 让”比较动作”变得直接:在状态 s s s 选 arg max a Q ( s , a ) \arg\max_a Q(s, a) arg max a Q ( s , a ) 就是选最好的动作 。
对比一下,如果只有 V V V ,要在状态 s s s 选最好的动作,你得计算 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] arg max a [ R ( s , a ) + γ ∑ s ′ P ( s ′ ∣ s , a ) V ( s ′ ) ] ——这需要知道模型 P P P 和 R R R 。而有了 Q Q Q ,直接 arg max a Q ( s , a ) \arg\max_a Q(s, a) arg max a Q ( s , a ) 即可,完全不需要模型 。
这就是为什么第 4 讲的无模型控制算法(SARSA、Q-learning)都选择直接学习 Q Q Q 而不是 V V V :在不知道模型的情况下,只有 Q Q Q 能直接告诉你该怎么做。
6. 最优性:什么叫”最好的策略”?
6.1 比较策略
两个策略怎么比较?一个自然的定义是:
π ≥ π ′ ⟺ V π ( s ) ≥ V π ′ ( s ) 对所有状态 s 都成立 \pi \ge \pi' \iff V^\pi(s) \ge V^{\pi'}(s) \quad \text{对所有状态 } s \text{ 都成立} π ≥ π ′ ⟺ V π ( s ) ≥ V π ′ ( s ) 对所有状态 s 都成立
这个定义很严格:要求在每一个 状态都不差。于是出现一个疑问:会不会有两个策略,π \pi π 在 s 1 s_1 s 1 更好、π ′ \pi' π ′ 在 s 2 s_2 s 2 更好,谁也不比谁强?那”最优策略”岂不是不存在?
MDP 理论中的一个核心定理 :对于有限状态、有限动作、无限视界、γ < 1 \gamma < 1 γ < 1 的 MDP,一定存在一个确定性、平稳的策略 π ∗ \pi^* π ∗ ,它在每一个状态上都同时达到最优 :
V π ∗ ( s ) = max π V π ( s ) 对所有 s V^{\pi^*}(s) = \max_\pi V^\pi(s) \quad \text{对所有 } s V π ∗ ( s ) = π max V π ( s ) 对所有 s
为什么这是对的?直觉来自马尔可夫性 :从状态 s s s 出发怎样最好,只取决于 s s s 本身,与”你是怎么来到 s s s 的”无关。所以,对每个状态分别找到”从这里出发的最好做法”,把它们拼在一起,不会产生矛盾——在 s s s 的最好做法里,如果路过 s ′ s' s ′ ,接下来应该做的恰好就是”从 s ′ s' s ′ 出发的最好做法”。(这就是 Bellman 的最优性原理 :最优策略的任何”尾巴”本身也是最优的。)
代码验证 :03_policy_iteration.py 的演示 3 暴力枚举了火星车全部 128 个确定性策略。对每个状态分别在 128 个策略中取价值的最大值,结果恰好等于同一个 策略(一直向右)在各状态的价值:
s 1 s_1 s 1 s 2 s_2 s 2 s 3 s_3 s 3 s 4 s_4 s 4 s 5 s_5 s 5 s 6 s_6 s 6 s 7 s_7 s 7 max π V π ( s ) \max_\pi V^\pi(s) max π V π ( s ) (逐状态取最大)47.05 52.19 59.44 67.69 77.10 87.80 100.00 V π ∗ ( s ) V^{\pi^*}(s) V π ∗ ( s ) (一个策略)47.05 52.19 59.44 67.69 77.10 87.80 100.00
注意 :最优价值 V ∗ 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) V ∗ ( s ) = π max V π ( s ) , Q ∗ ( s , a ) = π max Q π ( s , a )
Q ∗ ( s , a ) Q^*(s, a) Q ∗ ( s , a ) 的含义:“在 s s s 先做 a a a ,之后一直按最优 方式行动”的期望回报。
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]\;} V ∗ ( s ) = a max [ R ( s , a ) + γ s ′ ∑ P ( s ′ ∣ s , a ) V ∗ ( s ′ ) ]
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')\;} Q ∗ ( s , a ) = R ( s , a ) + γ s ′ ∑ P ( s ′ ∣ s , a ) a ′ max Q ∗ ( s ′ , a ′ )
与贝尔曼期望方程的唯一区别 :对动作是”按策略取平均 ” ∑ a π ( a ∣ s ) [ ⋯ ] \sum_a \pi(a \mid s)[\cdots] ∑ a π ( a ∣ s ) [ ⋯ ] 还是”取最大 ” max a [ ⋯ ] \max_a [\cdots] max a [ ⋯ ] 。
贝尔曼期望方程 贝尔曼最优方程 描述的对象 给定策略 π \pi π 的价值 V π V^\pi V π 最优价值 V ∗ V^* V ∗ 对动作的操作 ∑ a π ( a ∣ s ) [ ⋯ ] \sum_a \pi(a \mid s)[\cdots] ∑ a π ( a ∣ s ) [ ⋯ ] 取平均max a [ ⋯ ] \max_a[\cdots] max a [ ⋯ ] 取最大方程类型 线性 ,可直接用矩阵求解非线性 (因为 max),不能直接用矩阵求解求解方法 解析解 / 迭代 策略迭代 / 价值迭代
为什么不能像第 1 讲那样用矩阵求逆? 因为 max \max max 不是线性运算:max ( a + b ) ≠ max ( a ) + max ( b ) \max(a+b) \ne \max(a) + \max(b) max ( a + b ) = max ( a ) + max ( b ) 。这就是我们需要本讲两个迭代算法的根本原因。
6.4 从 V ∗ V^* V ∗ 或 Q ∗ Q^* Q ∗ 读出最优策略
一旦有了最优价值,最优策略就是”贪心地”选最好的动作:
π ∗ ( s ) = arg max a Q ∗ ( 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] π ∗ ( s ) = arg a max Q ∗ ( s , a ) = arg a max [ R ( s , a ) + γ s ′ ∑ P ( s ′ ∣ s , a ) V ∗ ( s ′ ) ]
所以问题转化为:如何求出 V ∗ V^* V ∗ 或 Q ∗ Q^* Q ∗ ?
6.5 暴力搜索为什么不行
最直接的办法:评估所有 ∣ A ∣ ∣ S ∣ |A|^{|S|} ∣ A ∣ ∣ S ∣ 个确定性策略,挑最好的。火星车可以(128 个),但 2.3 节的表已经说明,稍大一点的问题就完全不可行。我们需要只评估少数 策略就能找到最优的方法。
7. 策略迭代(Policy Iteration)
7.1 直觉:复盘,然后改进
想象你是一名棋手,想提高棋艺:
评估 :按照你现在的下法(策略 π \pi π )下很多盘棋,搞清楚每个局面下你的胜率(V π V^\pi V π )。
改进 :复盘每个局面,问自己”如果这一步换一种下法,之后照旧,胜率会不会更高?“(比较 Q π ( s , a ) Q^\pi(s, a) Q π ( s , a ) )。把所有能改进的地方都改掉,得到新的下法 π ′ \pi' π ′ 。
重复,直到”复盘时发现没有任何一步可以改进”为止。
这就是策略迭代。
7.2 策略改进步
给定当前策略 π i \pi_i π i 及其价值 V π i V^{\pi_i} V π i ,对每个状态计算 Q π i ( s , a ) Q^{\pi_i}(s, a) Q π i ( s , a ) ,然后贪心地 选择:
π i + 1 ( s ) = arg max a Q π 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] π i + 1 ( s ) = arg a max Q π i ( s , a ) = arg a max [ R ( s , a ) + γ s ′ ∑ P ( s ′ ∣ s , a ) V π i ( s ′ ) ]
注意这里有一个”大胆的”操作:Q π i ( s , a ) Q^{\pi_i}(s, a) Q π i ( s , a ) 衡量的是”只在 s s s 这一步 换成 a a a ,之后仍按 π i \pi_i π i “的价值。但 π i + 1 \pi_{i+1} π i + 1 是在所有状态、所有时刻 都换掉了。凭什么保证这样整体上更好?这需要一个定理。
7.3 策略改进定理
定理 :设 π i + 1 \pi_{i+1} π i + 1 是对 Q π i Q^{\pi_i} Q π i 贪心得到的策略。那么对所有状态 s s s :
V π i + 1 ( s ) ≥ V π i ( s ) V^{\pi_{i+1}}(s) \ge V^{\pi_i}(s) V π i + 1 ( s ) ≥ V π i ( s )
证明 (CS234 课上的证明,请逐行理解):
第一步,贪心选择意味着新动作的 Q Q Q 值不低于旧动作的 Q Q Q 值(旧动作的 Q Q Q 值就是 V π i V^{\pi_i} V π i ):
V π i ( s ) = Q π i ( s , π i ( s ) ) ≤ max a Q π 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)) V π i ( s ) = Q π i ( s , π i ( s )) ≤ a max Q π i ( s , a ) = Q π i ( s , π i + 1 ( s ))
第二步,把 Q π i ( s , π i + 1 ( s ) ) Q^{\pi_i}(s, \pi_{i+1}(s)) Q π i ( s , π i + 1 ( s )) 展开。为书写简洁,记 a ∗ = π i + 1 ( s ) a^* = \pi_{i+1}(s) a ∗ = π 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{ 用第一步)}} Q π i ( s , a ∗ ) = R ( s , a ∗ ) + γ s ′ ∑ P ( s ′ ∣ s , a ∗ ) ≤ Q π i ( s ′ , π i + 1 ( s ′ )) (对 s ′ 用第一步) V π i ( s ′ )
所以:
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')) V π i ( s ) ≤ R ( s , a ∗ ) + γ s ′ ∑ P ( s ′ ∣ s , a ∗ ) Q π i ( s ′ , π i + 1 ( s ′ ))
第三步,再把 Q π i ( s ′ , π i + 1 ( s ′ ) ) Q^{\pi_i}(s', \pi_{i+1}(s')) Q π i ( s ′ , π i + 1 ( s ′ )) 展开,里面又出现 V π i ( s ′ ′ ) V^{\pi_i}(s'') V π i ( s ′′ ) ,再用第一步放大……每展开一次,“按 π i + 1 \pi_{i+1} π i + 1 行动”的步数就多一步,而剩下的 V π i V^{\pi_i} V π i 被 γ k \gamma^k γ k 压得越来越小:
V π i ( s ) ≤ E π i + 1 [ r t + γ r t + 1 + ⋯ + γ k − 1 r t + k − 1 + γ k V π i ( s t + k ) | s t = 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] V π i ( s ) ≤ E π i + 1 [ r t + γ r t + 1 + ⋯ + γ k − 1 r t + k − 1 + γ k V π i ( s t + k ) s t = s ]
第四步,令 k → ∞ k \to \infty k → ∞ ,γ k V π i ( s t + k ) → 0 \gamma^k V^{\pi_i}(s_{t+k}) \to 0 γ k V π i ( s t + k ) → 0 (因为 γ < 1 \gamma < 1 γ < 1 且 V V V 有界),右边恰好变成”从 s s s 出发一直按 π i + 1 \pi_{i+1} π i + 1 行动的期望回报”:
V π i ( s ) ≤ V π i + 1 ( s ) ■ V^{\pi_i}(s) \le V^{\pi_{i+1}}(s) \qquad \blacksquare V π i ( s ) ≤ V π i + 1 ( s ) ■
证明的直觉 :如果”只在第一步用新策略、之后用旧策略”不比旧策略差,那么”前两步用新策略”也不比”只第一步用新策略”差(因为第二步所在的状态上,新策略的选择同样不差),以此类推,“一直用新策略”当然也不差。每多用一步新策略,只会更好或持平。
代码验证 :03_policy_iteration.py 的演示 2 对每一步都检查了不等式链 V π ( s ) ≤ max a Q π ( s , a ) ≤ V π ′ ( s ) V^{\pi}(s) \le \max_a Q^{\pi}(s,a) \le V^{\pi'}(s) V π ( s ) ≤ max a Q π ( s , a ) ≤ V π ′ ( s ) ,并打印每个状态的提升量——全部 ≥ 0 \ge 0 ≥ 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}
一个实现细节:平局怎么处理? 如果某个状态有多个动作的 Q Q Q 值相等,随便选一个在理论上都可以。但如果每次随机 选,策略可能在”同样好的动作”之间来回切换,导致第 6 行的停止条件迟迟满足不了。
03_policy_iteration.py 的演示 5 构造了一个有两个完全相同动作(→ 和 →‘)的 MDP:
正确做法(平局时保留旧动作 ):7 次评估后停止;
错误做法(平局时随机选):216 次评估后才碰巧停下——价值早就最优了,策略却在 → 和 →’ 之间乱跳。7 个状态每个都有 2 个等价动作,随机选时恰好不变的概率只有 ( 1 / 2 ) 7 = 1 / 128 (1/2)^7 = 1/128 ( 1/2 ) 7 = 1/128 。
规则 :只有当某个动作严格更好 时才改变策略。
7.5 为什么一定终止?终止时为什么一定最优?
终止性 :
由策略改进定理,每次迭代 V π i + 1 ≥ V π i V^{\pi_{i+1}} \ge V^{\pi_i} V π i + 1 ≥ V π i 。
如果策略改变了(按上面的平局规则,意味着某个状态有严格更好的动作),那么至少在那个状态上是严格 提升的,所以不可能回到以前的任何策略(以前的策略价值都更低)。
确定性策略只有有限个(∣ A ∣ ∣ S ∣ |A|^{|S|} ∣ A ∣ ∣ S ∣ 个),不能重复,所以最多 ∣ A ∣ ∣ S ∣ |A|^{|S|} ∣ A ∣ ∣ S ∣ 次迭代就一定停止 。
这是一个很松的上界。实践中策略迭代通常只需要很少 的迭代次数(火星车 128 个策略中只评估了 7 个)。理论研究也已证明,对固定的 γ \gamma γ ,所需迭代次数有关于 ∣ S ∣ |S| ∣ S ∣ 和 ∣ A ∣ |A| ∣ A ∣ 的多项式上界。
最优性 :停止时 π i + 1 = π i \pi_{i+1} = \pi_i π i + 1 = π i ,即对每个状态 π i ( s ) = arg max a Q π i ( s , a ) \pi_i(s) = \arg\max_a Q^{\pi_i}(s, a) π i ( s ) = arg max a Q π i ( s , a ) ,于是:
V π i ( s ) = Q π i ( s , π i ( s ) ) = max a Q π 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] V π i ( s ) = Q π i ( s , π i ( s )) = a max Q π i ( s , a ) = a max [ R ( s , a ) + γ s ′ ∑ P ( s ′ ∣ s , a ) V π i ( s ′ ) ]
这正是贝尔曼最优方程 !而贝尔曼最优方程的解是唯一的(第 8 节的压缩映射会证明这一点),所以 V π i = V ∗ V^{\pi_i} = V^* V π i = V ∗ ,π i \pi_i π i 是最优策略。
另一个有用的推论 :一旦策略不再改变,它就永远不会再改变——因为下一次评估得到的是同一个 V V V ,改进得到的也是同一个策略。
7.6 火星车上的完整过程
从”一直向左”出发,γ = 0.9 \gamma = 0.9 γ = 0.9 :
迭代 策略(s 1 … s 7 s_1 \dots s_7 s 1 … s 7 ) V ( s 1 ) V(s_1) V ( s 1 ) V ( s 2 ) V(s_2) V ( s 2 ) V ( s 3 ) V(s_3) V ( s 3 ) V ( s 4 ) V(s_4) V ( s 4 ) V ( s 5 ) V(s_5) V ( s 5 ) V ( s 6 ) V(s_6) V ( s 6 ) V ( s 7 ) V(s_7) V ( s 7 ) π 0 \pi_0 π 0 ← ← ← ← ← ← ← 10.00 8.78 7.71 6.77 5.94 5.22 16.78 π 1 \pi_1 π 1 ← ← ← ← ← → → 10.00 8.78 7.71 6.77 5.94 87.80 100.00 π 2 \pi_2 π 2 ← ← ← ← → → → 10.00 8.78 7.71 6.77 77.10 87.80 100.00 π 3 \pi_3 π 3 ← ← ← → → → → 10.00 8.78 7.71 67.69 77.10 87.80 100.00 π 4 \pi_4 π 4 ← ← → → → → → 10.00 8.78 59.44 67.69 77.10 87.80 100.00 π 5 \pi_5 π 5 ← → → → → → → 10.00 52.19 59.44 67.69 77.10 87.80 100.00 π 6 \pi_6 π 6 → → → → → → → 47.05 52.19 59.44 67.69 77.10 87.80 100.00
π 6 \pi_6 π 6 改进后不再变化,算法停止。
解读 :
第一次改进只改了 s 6 s_6 s 6 和 s 7 s_7 s 7 ——这正是 5.3 节 Q π Q^\pi Q π 表格揭示的”可以改进的地方”。
改进是从右往左、一次一个状态 地推进的。原因:在 π 1 \pi_1 π 1 下,s 5 s_5 s 5 向右会到达 s 6 s_6 s 6 ,而 s 6 s_6 s 6 现在的价值很高(87.80),所以 s 5 s_5 s 5 发现向右更好;但 s 4 s_4 s 4 向右只会到达 s 5 s_5 s 5 ,而 s 5 s_5 s 5 在 π 1 \pi_1 π 1 下还在向左,价值仍低……要等 s 5 s_5 s 5 改好了,s 4 s_4 s 4 才会跟着改。
这是这个问题的”最坏情况”:7 个状态,恰好 7 次评估。如果从其他策略出发,次数会少得多(代码演示 4 中,随机初始策略分别用了 7、3、2 次评估)。
7.7 γ \gamma γ 改变最优策略
γ \gamma γ 最优策略(s 1 … s 7 s_1 \dots s_7 s 1 … s 7 ) 0.3 ← ← ← → → → → 0.5 ← ← → → → → → 0.7 → → → → → → → 0.9 → → → → → → → 0.99 → → → → → → →
解读 :γ \gamma γ 小(短视)时,靠近 s 1 s_1 s 1 的状态宁可去拿近在咫尺的 +1,也不愿长途跋涉去拿遥远的 +10——因为远处的 +10 被打了太多折扣。γ \gamma γ 大(有耐心)时,所有状态都愿意去 s 7 s_7 s 7 。
“最优”是相对于 γ \gamma γ 而言的 。γ \gamma γ 不是算法的”超参数”,而是问题定义的一部分 :它刻画了你有多在乎未来。
8. 价值迭代(Value Iteration)
8.1 动机:两个角度
策略迭代的每一轮都要完整地 评估当前策略(解一个线性方程组,或迭代到收敛)。这有点”浪费”:刚开始时策略很差,花大力气把一个很差的策略评估得非常精确,意义不大。
角度一:截断的策略迭代 。能不能策略评估只做一步 备份,就马上改进?把”评估一步”和”改进”合并成一个操作:
V k + 1 ( s ) = max a [ R ( s , a ) + γ ∑ s ′ P ( s ′ ∣ s , a ) V k ( s ′ ) ] V_{k+1}(s) = \max_a \left[\, R(s, a) + \gamma \sum_{s'} P(s' \mid s, a)\, V_k(s') \,\right] V k + 1 ( s ) = a max [ R ( s , a ) + γ s ′ ∑ P ( s ′ ∣ s , a ) V k ( s ′ ) ]
这就是价值迭代。它不维护显式的策略,直接逼近 V ∗ V^* V ∗ 。
角度二:有限视界的动态规划 。设 V k ( s ) V_k(s) V k ( s ) 表示”只剩 k k k 步时,从 s s s 出发的最优价值 ”:
剩 0 步:什么都拿不到,V 0 = 0 V_0 = 0 V 0 = 0 。
剩 k k k 步:先选一个动作拿即时奖励,然后还剩 k − 1 k-1 k − 1 步——而”剩 k − 1 k-1 k − 1 步时的最优价值” V k − 1 V_{k-1} V k − 1 已经算好了。所以:V k ( s ) = max a [ R ( s , a ) + γ ∑ s ′ P ( s ′ ∣ s , a ) V k − 1 ( s ′ ) ] V_k(s) = \max_a [R(s,a) + \gamma \sum_{s'} P(s' \mid s, a) V_{k-1}(s')] V k ( s ) = max a [ R ( s , a ) + γ ∑ s ′ P ( s ′ ∣ s , a ) V k − 1 ( s ′ )] 。
公式和角度一完全一样!所以价值迭代的第 k k k 步,就是在计算”视界为 k k k “的最优价值 。随着 k k k 增大,我们看得越来越远;由于 γ < 1 \gamma < 1 γ < 1 ,远处的奖励越来越不重要,V k V_k V k 收敛到无限视界的 V ∗ 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 π :
( 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] ( B π V ) ( s ) = a ∑ π ( a ∣ s ) [ R ( s , a ) + γ s ′ ∑ P ( s ′ ∣ s , a ) V ( s ′ ) ]
贝尔曼最优算子 B B B :
( B V ) ( 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] ( B V ) ( s ) = a max [ R ( s , a ) + γ s ′ ∑ P ( s ′ ∣ s , a ) V ( s ′ ) ]
用这个记号:
迭代策略评估就是 V k + 1 = B π V k V_{k+1} = B^\pi V_k V k + 1 = B π V k ;
价值迭代就是 V k + 1 = B V k V_{k+1} = B V_k V k + 1 = B V k ;
贝尔曼期望方程是 V π = B π V π V^\pi = B^\pi V^\pi V π = B π V π (V π V^\pi V π 是 B π B^\pi B π 的不动点 );
贝尔曼最优方程是 V ∗ = B V ∗ V^* = B V^* V ∗ = B V ∗ (V ∗ V^* V ∗ 是 B B B 的不动点 )。
“不动点”就是”被算子作用后不变的点”。所以问题变成了:反复用 B B B 作用,能不能找到 B B B 的不动点?
8.4 压缩映射:价值迭代为什么一定收敛
定义 :如果对任意两个价值向量 V , V ′ V, V' V , V ′ ,都有
∥ B V − B V ′ ∥ ∞ ≤ γ ∥ V − V ′ ∥ ∞ , 0 ≤ γ < 1 \lVert BV - BV' \rVert_\infty \le \gamma\, \lVert V - V' \rVert_\infty, \qquad 0 \le \gamma < 1 ∥ B V − B V ′ ∥ ∞ ≤ γ ∥ V − V ′ ∥ ∞ , 0 ≤ γ < 1
就称 B B B 是一个压缩映射(contraction) ,γ \gamma γ 是压缩系数。直觉:无论两个点原来相距多远,被 B B B 作用一次后,距离至少缩小到 γ \gamma γ 倍。
定理 :贝尔曼最优算子 B B B 是无穷范数下的 γ \gamma γ -压缩映射。
先证一个引理 :对任意两个函数 f , g f, g f , g ,
∣ max a f ( a ) − max a g ( 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| a max f ( a ) − a max g ( a ) ≤ a max ∣ f ( a ) − g ( a ) ∣
引理证明 :不妨设 max a f ( a ) ≥ max a g ( a ) \max_a f(a) \ge \max_a g(a) max a f ( a ) ≥ max a g ( a ) ,记 a f = arg max a f ( a ) a_f = \arg\max_a f(a) a f = arg max a f ( a ) 。那么
0 ≤ max a f ( a ) − max a g ( a ) = f ( a f ) − max a g ( a ) ≤ f ( a f ) − g ( a f ) ≤ 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)| 0 ≤ a max f ( a ) − a max g ( a ) = f ( a f ) − a max g ( a ) ≤ f ( a f ) − g ( a f ) ≤ a max ∣ f ( a ) − g ( a ) ∣
(中间的"≤ \le ≤ "是因为 max a g ( a ) ≥ g ( a f ) \max_a g(a) \ge g(a_f) max a g ( a ) ≥ g ( a f ) 。)另一种情况对称。□ \square □
直觉 :两个函数逐点相差都不超过 c c c ,它们的最大值之差也不会超过 c c c 。
定理证明 :固定任意状态 s s s ,令
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') f ( a ) = R ( s , a ) + γ s ′ ∑ P ( s ′ ∣ s , a ) V ( s ′ ) , g ( a ) = R ( s , a ) + γ s ′ ∑ P ( s ′ ∣ s , a ) V ′ ( s ′ )
则 ( B V ) ( s ) = max a f ( a ) (BV)(s) = \max_a f(a) ( B V ) ( s ) = max a f ( a ) ,( B V ′ ) ( s ) = max a g ( a ) (BV')(s) = \max_a g(a) ( B V ′ ) ( s ) = max a g ( a ) 。由引理:
∣ ( B V ) ( s ) − ( B V ′ ) ( 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} ( B V ) ( s ) − ( B V ′ ) ( s ) ≤ a max f ( a ) − g ( a ) = a max γ s ′ ∑ P ( s ′ ∣ s , a ) ( V ( s ′ ) − V ′ ( s ′ ) ) ≤ γ a max s ′ ∑ P ( s ′ ∣ s , a ) V ( s ′ ) − V ′ ( s ′ ) ≤ γ a max s ′ ∑ P ( s ′ ∣ s , a ) ∥ V − V ′ ∥ ∞ = γ ∥ V − V ′ ∥ ∞ (引理) ( R 抵消了) (三角不等式) (每项不超过最大值) ( ∑ s ′ P ( s ′ ∣ s , a ) = 1 )
这对每个 s s s 都成立,所以对左边取 max s \max_s max s :∥ B V − B V ′ ∥ ∞ ≤ γ ∥ V − V ′ ∥ ∞ \lVert BV - BV' \rVert_\infty \le \gamma \lVert V - V' \rVert_\infty ∥ B V − B V ′ ∥ ∞ ≤ γ ∥ V − V ′ ∥ ∞ 。■ \blacksquare ■
证明中每一步的”物理意义” :
奖励 R R R 在两边相同,相减后消失——差异只来自”未来”;
∑ s ′ P ( s ′ ∣ s , a ) ( ⋯ ) \sum_{s'} P(s' \mid s, a)(\cdots) ∑ s ′ P ( s ′ ∣ s , a ) ( ⋯ ) 是加权平均 ,加权平均不会放大差异;
乘以 γ < 1 \gamma < 1 γ < 1 ,差异被严格缩小 。
同样的证明(去掉 max 那一步,把 max a \max_a max a 换成 ∑ a π ( a ∣ s ) \sum_a \pi(a \mid s) ∑ a π ( a ∣ s ) )说明 B π B^\pi B π 也是 γ \gamma γ -压缩映射——这就是第 1 讲迭代法收敛的严格理由。
代码验证 :04_value_iteration.py 演示 2 随机生成 5 对价值向量,备份后距离之比分别为 0.518、0.758、0.760、0.480、0.490,全部 ≤ γ = 0.9 \le \gamma = 0.9 ≤ γ = 0.9 。
8.5 压缩映射的推论
由巴拿赫不动点定理 (压缩映射原理),压缩映射有三个重要性质:
不动点存在且唯一 :B B B 恰好有一个不动点,就是 V ∗ V^* V ∗ 。(唯一性的证明很简单:如果 V ∗ V^* V ∗ 和 U ∗ U^* U ∗ 都是不动点,则 ∥ V ∗ − U ∗ ∥ = ∥ B V ∗ − B U ∗ ∥ ≤ γ ∥ V ∗ − U ∗ ∥ \lVert V^* - U^* \rVert = \lVert BV^* - BU^* \rVert \le \gamma \lVert V^* - U^* \rVert ∥ V ∗ − U ∗ ∥ = ∥ B V ∗ − B U ∗ ∥ ≤ γ ∥ V ∗ − U ∗ ∥ ,由于 γ < 1 \gamma < 1 γ < 1 ,只能 ∥ V ∗ − U ∗ ∥ = 0 \lVert V^* - U^* \rVert = 0 ∥ V ∗ − U ∗ ∥ = 0 。)这也补全了 7.5 节的论证:策略迭代停止时满足贝尔曼最优方程,而这个方程的解唯一,所以就是 V ∗ V^* V ∗ 。
从任何初始值出发都收敛 :∥ V k − V ∗ ∥ = ∥ B V k − 1 − B V ∗ ∥ ≤ γ ∥ V k − 1 − V ∗ ∥ ≤ ⋯ ≤ γ k ∥ V 0 − 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 ∥ V k − V ∗ ∥ = ∥ B V k − 1 − B V ∗ ∥ ≤ γ ∥ V k − 1 − V ∗ ∥ ≤ ⋯ ≤ γ k ∥ V 0 − V ∗ ∥ → 0 。
收敛速度是几何级数的 :误差每步至少缩小到 γ \gamma γ 倍。要把误差缩小 10 倍,大约需要 ln 10 − ln γ \frac{\ln 10}{-\ln \gamma} − l n γ l n 10 步(γ = 0.9 \gamma = 0.9 γ = 0.9 时约 22 步,γ = 0.99 \gamma = 0.99 γ = 0.99 时约 229 步)。
代码验证 :演示 2 中从一个”离谱”的随机初始值(标准差 1000)出发,价值迭代同样收敛到与从 0 出发相同的 V ∗ V^* V ∗ (最大差 10 − 6 10^{-6} 1 0 − 6 量级)。
停止准则的推导 。我们只能观察到相邻两次迭代的差 δ = ∥ V k + 1 − V k ∥ ∞ \delta = \lVert V_{k+1} - V_k \rVert_\infty δ = ∥ V k + 1 − V k ∥ ∞ ,看不到真正的误差 ∥ V k + 1 − V ∗ ∥ ∞ \lVert V_{k+1} - V^* \rVert_\infty ∥ V k + 1 − V ∗ ∥ ∞ (因为不知道 V ∗ V^* V ∗ )。两者有什么关系?
∥ V k + 1 − V ∗ ∥ = ∥ B V k − B V ∗ ∥ ≤ γ ∥ V k − V ∗ ∥ ≤ γ ( ∥ V k − V k + 1 ∥ + ∥ V k + 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} ∥ V k + 1 − V ∗ ∥ = ∥ B V k − B V ∗ ∥ ≤ γ ∥ V k − V ∗ ∥ ≤ γ ( ∥ V k − V k + 1 ∥ + ∥ V k + 1 − V ∗ ∥ ) (三角不等式)
移项得 ( 1 − γ ) ∥ V k + 1 − V ∗ ∥ ≤ γ δ (1 - \gamma) \lVert V_{k+1} - V^* \rVert \le \gamma\, \delta ( 1 − γ ) ∥ V k + 1 − V ∗ ∥ ≤ γ δ ,即
∥ V k + 1 − V ∗ ∥ ∞ ≤ γ 1 − γ δ \lVert V_{k+1} - V^* \rVert_\infty \le \frac{\gamma}{1 - \gamma}\, \delta ∥ V k + 1 − V ∗ ∥ ∞ ≤ 1 − γ γ δ
所以只要 δ < ε ( 1 − γ ) 2 γ \delta < \frac{\varepsilon (1 - \gamma)}{2\gamma} δ < 2 γ ε ( 1 − γ ) ,就有 ∥ V k + 1 − V ∗ ∥ < ε / 2 \lVert V_{k+1} - V^* \rVert < \varepsilon / 2 ∥ V k + 1 − V ∗ ∥ < ε /2 。进一步可以证明,从 V k + 1 V_{k+1} V k + 1 读出的贪心策略 π \pi π 满足 ∥ V π − V ∗ ∥ < ε \lVert V^\pi - V^* \rVert < \varepsilon ∥ V π − V ∗ ∥ < ε ,即它是 ε \varepsilon ε -最优 的。
注意 γ 1 − γ \frac{\gamma}{1-\gamma} 1 − γ γ 这个放大系数 :γ = 0.99 \gamma = 0.99 γ = 0.99 时它是 99。也就是说,相邻两次变化只有 0.01,真实误差却可能高达 0.99。“看起来不怎么变了”不等于”已经接近答案了” ,γ \gamma γ 越接近 1 越要警惕。
代码验证 :演示 3 在不同 ε \varepsilon ε 下停止,实际误差远小于理论保证(例如 ε = 10 \varepsilon = 10 ε = 10 时 ∥ V − V ∗ ∥ = 4.71 < 5 \lVert V - V^* \rVert = 4.71 < 5 ∥ V − V ∗ ∥ = 4.71 < 5 ,而读出的策略已经是精确最优的)。理论界是最坏情况,通常很保守。
8.6 火星车上的过程
γ = 0.9 \gamma = 0.9 γ = 0.9 ,从 V 0 = 0 V_0 = 0 V 0 = 0 开始(右列是由当前 V k V_k V k 读出的贪心策略):
s 1 s_1 s 1 s 2 s_2 s 2 s 3 s_3 s 3 s 4 s_4 s 4 s 5 s_5 s 5 s 6 s_6 s 6 s 7 s_7 s 7 贪心策略 V 0 V_0 V 0 0 0 0 0 0 0 0 ← ← ← ← ← ← ← V 1 V_1 V 1 1.00 0 0 0 0 0 10.00 ← ← ← ← ← → → V 2 V_2 V 2 1.90 0.72 0 0 0 7.20 19.00 ← ← ← ← → → → V 3 V_3 V 3 2.71 1.50 0.52 0 5.18 14.98 27.10 ← ← ← → → → → V 4 V_4 V 4 3.44 2.22 1.17 3.73 11.72 22.21 34.39 ← ← → → → → → V 5 V_5 V 5 4.10 2.88 2.90 9.11 18.10 28.76 40.95 ← ← → → → → → V 6 V_6 V 6 4.69 3.47 7.08 14.67 23.96 34.66 46.86 ← → → → → → → V 7 V_7 V 7 5.22 5.72 11.84 19.89 29.27 39.98 52.17 → → → → → → → V 10 V_{10} V 10 12.38 17.36 24.58 32.83 42.23 52.94 65.13 → → → → → → → V 30 V_{30} V 30 42.81 47.95 55.20 63.46 72.86 83.57 95.76 → → → → → → → V ∗ V^* V ∗ 47.05 52.19 59.44 67.69 77.10 87.80 100.00 → → → → → → →
总共迭代 182 次满足 ε = 10 − 6 \varepsilon = 10^{-6} ε = 1 0 − 6 的停止准则。
三个重要观察 :
V k V_k V k 不是任何策略的价值 。对比策略迭代:策略迭代的每个中间 V V V 都是某个真实策略的价值;价值迭代的中间 V k V_k V k 只是”k k k 步视界的最优价值”。
早期的贪心策略”向左”是合理的 。看 V 2 V_2 V 2 的贪心策略:s 1 ∼ s 4 s_1 \sim s_4 s 1 ∼ s 4 选向左。因为如果只剩 3 步,从 s 4 s_4 s 4 出发根本走不到 s 7 s_7 s 7 ,不如去拿 s 1 s_1 s 1 的 +1。随着 k k k 增大,“看得够远”的状态越来越多,转而向右。
策略比价值收敛得早得多 :贪心策略在第 7 次迭代后就再也没有变过,但价值还要再迭代 175 次才满足停止准则。我们真正需要的是策略,所以在实践中常常不必等价值完全收敛。这个观察也是 9.2 节”修正策略迭代”的动机。
8.7 有限视界与非平稳策略
如果问题本身就是有限视界的(比如一共只能走 H H H 步),价值迭代的每一步都有精确含义:V k V_k V k 是剩 k k k 步时的最优价值,对应的最优动作是
π k ( s ) = arg max a [ R ( s , a ) + γ ∑ s ′ P ( s ′ ∣ s , a ) V k − 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] π k ( s ) = arg a max [ R ( s , a ) + γ s ′ ∑ P ( s ′ ∣ s , a ) V k − 1 ( s ′ ) ]
有限视界时 γ = 1 \gamma = 1 γ = 1 完全没问题 (有限项求和不会发散)。火星车,γ = 1 \gamma = 1 γ = 1 ,最多 10 步:
剩余步数 k k k 最优动作(s 1 … s 7 s_1 \dots s_7 s 1 … s 7 ) V k ( s 1 ) V_k(s_1) V k ( s 1 ) V k ( s 2 ) V_k(s_2) V k ( s 2 ) V k ( s 3 ) V_k(s_3) V k ( s 3 ) V k ( s 4 ) V_k(s_4) V k ( s 4 ) V k ( s 5 ) V_k(s_5) V k ( s 5 ) V k ( s 6 ) V_k(s_6) V k ( s 6 ) V k ( s 7 ) V_k(s_7) V k ( s 7 ) 1 ← ← ← ← ← ← ← 1.00 0.00 0.00 0.00 0.00 0.00 10.00 2 ← ← ← ← ← → → 2.00 0.80 0.00 0.00 0.00 8.00 20.00 3 ← ← ← ← → → → 3.00 1.76 0.64 0.00 6.40 17.60 30.00 4 ← ← ← → → → → 4.00 2.75 1.54 5.12 15.36 27.52 40.00 5 ← ← → → → → → 5.00 3.75 4.40 13.31 25.09 37.50 50.00 6 ← ← → → → → → 6.00 4.75 11.53 22.73 35.02 47.50 60.00 7 ← → → → → → → 7.00 10.17 20.49 32.56 45.00 57.50 70.00 8 → → → → → → → 10.54 18.43 30.15 42.52 55.00 67.50 80.00 9 → → → → → → → 17.85 27.80 40.04 52.50 65.00 77.50 90.00 10 → → → → → → → 26.81 37.60 50.01 62.50 75.00 87.50 100.00
同一个状态,剩余步数不同,最优动作不同 。例如 s 2 s_2 s 2 :剩 6 步时应该向左(去拿 s 1 s_1 s 1 的 +1,因为 6 步内到 s 7 s_7 s 7 的希望不大),剩 7 步时应该向右。这样依赖剩余时间的策略叫非平稳策略 。
生活中的类比:离考试还有一个月时,你应该系统地学习新知识;离考试只剩一天时,最优策略是复习已经掌握的内容——“同样的你”,在不同的剩余时间下,最优行为不同。
(k = 1 k = 1 k = 1 时两个动作一样好,因为只剩最后一步,奖励只取决于当前格子,走到哪里都无所谓。表中显示 ← 只是平局时取编号最小的动作。)
9. 策略迭代 vs 价值迭代
9.1 对比
策略迭代 价值迭代 维护的对象 显式策略 π \pi π + 它的价值 V π V^\pi V π 只有价值估计 V k V_k V k 每轮做什么 完整的策略评估 + 一次策略改进 一次贝尔曼最优备份 每轮计算量 评估 O ( ∣ S ∣ 3 ) O(\lvert S\rvert^3) O (∣ S ∣ 3 ) + 改进 O ( ∣ S ∣ 2 ∣ A ∣ ) O(\lvert S\rvert^2 \lvert A\rvert) O (∣ S ∣ 2 ∣ A ∣) O ( ∣ S ∣ 2 ∣ A ∣ ) O(\lvert S\rvert^2 \lvert A\rvert) O (∣ S ∣ 2 ∣ A ∣) 迭代次数 通常很少(火星车 7 次) 较多,约与 1 1 − γ \frac{1}{1-\gamma} 1 − γ 1 成正比(火星车 182 次) 中间结果的含义 每个 V π i V^{\pi_i} V π i 都是某个真实策略的价值 V k V_k V k 是 k k k 步视界的最优价值停止条件 策略不再变化(精确停止) 变化量小于阈值(近似停止) 结果 精确最优 ε \varepsilon ε -最优理论基础 策略改进定理 压缩映射
简单总结 :策略迭代”次数少但每次贵”,价值迭代”每次便宜但次数多”。状态数不大、γ \gamma γ 接近 1 时,策略迭代通常更快;状态数很大时,价值迭代每步的开销更容易承受。
9.2 两者之间:修正策略迭代
两个算法其实是一个”光谱”的两端:
策略迭代:每轮做无穷多次 评估备份(评估到收敛),再改进一次;
价值迭代:每轮做1 次 评估备份,就改进一次(max 操作隐含了改进)。
修正策略迭代(modified policy iteration) 取中间:每轮做 m m m 次评估备份再改进。m = 1 m = 1 m = 1 就是价值迭代,m = ∞ m = \infty m = ∞ 就是策略迭代。实践中取适中的 m m m 往往效果最好。
这个”评估和改进交替进行、不必每次都做到底”的思想叫广义策略迭代(Generalized Policy Iteration, GPI) ,它是几乎所有 RL 算法的共同骨架——第 4 讲的 SARSA、Q-learning 都可以看成 GPI 的特例。
9.3 异步价值迭代
4.6 节的”原地更新”也可以用于价值迭代:不必每轮都更新所有状态,可以按任意顺序、甚至只挑一部分状态更新,只要每个状态都会被无限次更新,仍然收敛到 V ∗ 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 γ = 1 。
新概念:终止状态与吸收状态 。怎么在 MDP 框架里表示”回合结束”?标准技巧是加一个额外的吸收状态 END :在 ±1 格子执行任何动作,获得 ±1 后以概率 1 进入 END;END 永远留在原地,奖励为 0。这样”结束”就变成了”进入一个再也不产生奖励的状态”,所有算法都无需修改。
有了终止状态,只要最优策略保证最终会到达出口(且”永不离开”的代价足够大),γ = 1 \gamma = 1 γ = 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 γ = 1 时:永远在场地里闲逛能拿无穷多奖励,价值迭代不收敛 (500 次迭代后起点价值涨到 50.7,还在继续涨)。
γ = 0.9 \gamma = 0.9 γ = 0.9 时:收敛,但策略是:
↑ ↑ ↑ +1
↑ # ← -1
↑ ↑ ← ↓
智能体刻意远离出口,在 -1 附近朝墙走来避免滑进去。原因:待在场地里每步 +0.1,永远不离开的价值是 0.1 1 − 0.9 = 1 \frac{0.1}{1 - 0.9} = 1 1 − 0.9 0.1 = 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 教训
奖励定义了”最优” 。最优策略是奖励函数的”忠实执行者”,不会理解你的”本意”。
γ \gamma γ 也定义了”最优” 。它决定了智能体有多在乎未来,也决定了某些问题是否有有限解。
不确定性改变最优行为 。同样的目标,在随机的世界里需要更保守的策略。
在把 RL 应用到真实问题前,用规划算法在简化模型上检查一下”你设计的奖励会导致什么样的最优行为” ,是一个非常实用的习惯。
代码对应 :05_gridworld.py 。你可以修改 LAYOUT 画自己的地图。
11. 从规划到学习
本讲的所有算法都假设模型 P P P 和 R R R 完全已知 。现实中往往不是这样。如果不知道模型,怎么办?回顾本讲用到模型的地方:
本讲的步骤 用到模型的地方 不知道模型时的替代方案 在哪一讲 策略评估 V π = R π + γ P π V π V^\pi = R^\pi + \gamma P^\pi V^\pi V π = R π + γ P π V π 用采样代替期望:蒙特卡洛(等回合结束取回报的平均)、时序差分 TD(用”一步奖励 + 下一状态的估计价值”代替期望) 第 3 讲 策略改进 arg max a [ R + γ P V ] \arg\max_a [R + \gamma P V] arg max a [ R + γ P V ] 直接学习 Q Q Q ,改进时只需 arg max a Q ( s , a ) \arg\max_a Q(s,a) arg max a Q ( s , a ) ,不需要模型(5.4 节) 第 4 讲 价值迭代 max a [ R + γ P V ] \max_a [R + \gamma P V] max a [ R + γ P V ] Q-learning :用采样的 r + γ max a ′ Q ( s ′ , a ′ ) r + \gamma \max_{a'} Q(s', a') r + γ max a ′ Q ( s ′ , a ′ ) 代替 E [ ⋯ ] \mathbb{E}[\cdots] E [ ⋯ ] 第 4 讲 整体思路 — 先从数据中估计模型(第 1 讲 7.7 节的”数数”),再在估计的模型上做规划 第 3、15 讲
一个贯穿全课的视角 :几乎所有 RL 算法都可以看成”用数据近似本讲某个贝尔曼备份 ”的方法。本讲打下的理论基础,会在后面反复用到。
12. 本讲总结
12.1 核心概念清单
MDP ( S , A , P , R , γ ) (S, A, P, R, \gamma) ( S , A , P , R , γ ) :在 MRP 上加入动作,每个动作对应一个转移矩阵。
策略 :确定性 π ( s ) \pi(s) π ( s ) 或随机 π ( a ∣ s ) \pi(a \mid s) π ( a ∣ s ) ;确定性策略共 ∣ A ∣ ∣ S ∣ |A|^{|S|} ∣ A ∣ ∣ S ∣ 个。
MDP + 固定策略 = MRP :R π ( s ) = ∑ a π ( a ∣ s ) R ( s , a ) R^\pi(s) = \sum_a \pi(a \mid s) R(s,a) R π ( s ) = ∑ a π ( a ∣ 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) P π ( s ′ ∣ s ) = ∑ a π ( a ∣ s ) P ( s ′ ∣ s , a ) 。
策略评估 :用贝尔曼期望方程计算 V π V^\pi V π (迭代或解析)。
动作价值 Q π ( s , a ) Q^\pi(s,a) Q π ( s , a ) :先做 a a a 再按 π \pi π ;它让我们无需模型就能比较动作。
最优策略存在 :有一个确定性平稳策略在所有状态同时最优;V ∗ V^* V ∗ 唯一,π ∗ \pi^* π ∗ 不一定唯一。
贝尔曼最优方程 :V ∗ = B V ∗ V^* = BV^* V ∗ = B V ∗ ,因为 max 而非线性,不能直接求逆。
策略迭代 :评估 → 贪心改进 → 重复;策略改进定理保证单调改进,有限步内精确收敛到最优。
价值迭代 :V k + 1 = B V k V_{k+1} = BV_k V k + 1 = B V k ;B B B 是 γ \gamma γ -压缩映射,保证从任意初值几何收敛到唯一的 V ∗ V^* V ∗ 。
有限视界 :V k V_k V k 是 k k k 步最优价值,最优策略是非平稳的。
奖励和 γ \gamma γ 定义了”最优” :微小的奖励改动可以彻底改变最优行为。
12.2 公式速查表
名称 公式 MDP + 策略 → MRP R π ( s ) = ∑ a π ( a ∣ s ) R ( s , a ) R^\pi(s) = \sum_a \pi(a \mid s) R(s,a) R π ( s ) = ∑ a π ( a ∣ 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) P π ( s ′ ∣ s ) = ∑ a π ( a ∣ s ) P ( s ′ ∣ s , a ) 状态价值 V π ( s ) = E π [ ∑ k ≥ 0 γ k r t + k ∣ s t = s ] V^\pi(s) = \mathbb{E}_\pi[\sum_{k \ge 0} \gamma^k r_{t+k} \mid s_t = s] V π ( s ) = E π [ ∑ k ≥ 0 γ k r t + k ∣ 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') Q π ( s , a ) = R ( s , a ) + γ ∑ s ′ P ( s ′ ∣ s , a ) V π ( s ′ ) V V V 与 Q Q Q V π ( 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 ) Q π ( 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 π ( s ) = ∑ a π ( a ∣ s ) [ R ( s , a ) + γ ∑ s ′ P ( s ′ ∣ s , a ) V π ( s ′ )] 策略评估解析解 V π = ( I − γ P π ) − 1 R π V^\pi = (I - \gamma P^\pi)^{-1} R^\pi V π = ( I − γ P π ) − 1 R π 贝尔曼最优方程(V V V ) 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')] V ∗ ( s ) = max a [ R ( s , a ) + γ ∑ s ′ P ( s ′ ∣ s , a ) V ∗ ( s ′ )] 贝尔曼最优方程(Q Q Q ) 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') Q ∗ ( s , a ) = R ( s , a ) + γ ∑ s ′ P ( s ′ ∣ s , a ) max a ′ Q ∗ ( s ′ , a ′ ) 最优策略 π ∗ ( s ) = arg max a Q ∗ ( s , a ) \pi^*(s) = \arg\max_a Q^*(s,a) π ∗ ( s ) = arg max a Q ∗ ( s , a ) 策略改进 π i + 1 ( s ) = arg max a Q π i ( s , a ) \pi_{i+1}(s) = \arg\max_a Q^{\pi_i}(s,a) π i + 1 ( s ) = arg max a Q π i ( s , a ) 策略改进定理 V π i + 1 ( s ) ≥ V π i ( s ) ∀ s V^{\pi_{i+1}}(s) \ge V^{\pi_i}(s)\ \forall s V π i + 1 ( s ) ≥ V π i ( s ) ∀ s 价值迭代 V k + 1 ( s ) = max a [ R ( s , a ) + γ ∑ s ′ P ( s ′ ∣ s , a ) V k ( s ′ ) ] V_{k+1}(s) = \max_a [R(s,a) + \gamma \sum_{s'} P(s' \mid s,a) V_k(s')] V k + 1 ( s ) = max a [ R ( s , a ) + γ ∑ s ′ P ( s ′ ∣ s , a ) V k ( s ′ )] 压缩性质 ∥ B V − B V ′ ∥ ∞ ≤ γ ∥ V − V ′ ∥ ∞ \lVert BV - BV' \rVert_\infty \le \gamma \lVert V - V' \rVert_\infty ∥ B V − B V ′ ∥ ∞ ≤ γ ∥ V − V ′ ∥ ∞ 误差估计 ∥ V k + 1 − V ∗ ∥ ∞ ≤ γ 1 − γ ∥ V k + 1 − V k ∥ ∞ \lVert V_{k+1} - V^* \rVert_\infty \le \frac{\gamma}{1-\gamma} \lVert V_{k+1} - V_k \rVert_\infty ∥ V k + 1 − V ∗ ∥ ∞ ≤ 1 − γ γ ∥ V k + 1 − V k ∥ ∞ 停止准则 ∥ V k + 1 − V k ∥ ∞ < ε ( 1 − γ ) 2 γ ⇒ \lVert V_{k+1} - V_k \rVert_\infty < \frac{\varepsilon(1-\gamma)}{2\gamma} \Rightarrow ∥ V k + 1 − V k ∥ ∞ < 2 γ ε ( 1 − γ ) ⇒ 贪心策略 ε \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 中,考虑随机策略:在 s 4 s_4 s 4 以 0.7 的概率选 TryRight、0.3 的概率选 TryLeft。计算 P π P^\pi P π 的第 4 行。
参考答案
到 s 3 s_3 s 3 :0.3 × 0.8 = 0.24 0.3 \times 0.8 = 0.24 0.3 × 0.8 = 0.24
留在 s 4 s_4 s 4 :0.3 × 0.2 + 0.7 × 0.2 = 0.20 0.3 \times 0.2 + 0.7 \times 0.2 = 0.20 0.3 × 0.2 + 0.7 × 0.2 = 0.20
到 s 5 s_5 s 5 :0.7 × 0.8 = 0.56 0.7 \times 0.8 = 0.56 0.7 × 0.8 = 0.56
即 [ 0 , 0 , 0.24 , 0.20 , 0.56 , 0 , 0 ] [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 V π ,手算 Q π ( s 6 , Left ) Q^\pi(s_6, \texttt{Left}) Q π ( s 6 , Left ) 和 Q π ( s 1 , Right ) Q^\pi(s_1, \texttt{Right}) Q π ( s 1 , Right ) (γ = 0.9 \gamma = 0.9 γ = 0.9 )。第一个结果应当等于什么?为什么?
参考答案
Q π ( s 6 , Left ) = 0 + 0.9 × ( 0.8 × V π ( s 5 ) + 0.2 × V π ( s 6 ) ) = 0.9 × ( 0.8 × 5.94 + 0.2 × 5.22 ) = 0.9 × 5.796 ≈ 5.22 Q^\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 Q π ( s 6 , Left ) = 0 + 0.9 × ( 0.8 × V π ( s 5 ) + 0.2 × V π ( s 6 )) = 0.9 × ( 0.8 × 5.94 + 0.2 × 5.22 ) = 0.9 × 5.796 ≈ 5.22 。
它应当等于 V π ( s 6 ) V^\pi(s_6) V π ( s 6 ) ,因为策略在 s 6 s_6 s 6 本来就选 Left,V π ( s ) = Q π ( s , π ( s ) ) V^\pi(s) = Q^\pi(s, \pi(s)) V π ( s ) = Q π ( s , π ( s )) 。
Q π ( s 1 , Right ) = 1 + 0.9 × ( 0.2 × V π ( s 1 ) + 0.8 × V π ( s 2 ) ) = 1 + 0.9 × ( 2.0 + 7.024 ) = 1 + 8.12 ≈ 9.12 Q^\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 Q π ( s 1 , Right ) = 1 + 0.9 × ( 0.2 × V π ( s 1 ) + 0.8 × V π ( s 2 )) = 1 + 0.9 × ( 2.0 + 7.024 ) = 1 + 8.12 ≈ 9.12 ✓(与 5.3 节表格一致)。
练习 3(理解价值) :在”一直向左”策略下,为什么 V π ( s 7 ) = 16.78 V^\pi(s_7) = 16.78 V π ( s 7 ) = 16.78 ?请用贝尔曼方程写出 V π ( s 7 ) V^\pi(s_7) V π ( s 7 ) 满足的方程并求解(已知 V π ( s 6 ) = 5.22 V^\pi(s_6) = 5.22 V π ( s 6 ) = 5.22 )。
参考答案
V ( s 7 ) = 10 + 0.9 × ( 0.2 V ( s 7 ) + 0.8 V ( s 6 ) ) V(s_7) = 10 + 0.9 \times (0.2\, V(s_7) + 0.8\, V(s_6)) V ( s 7 ) = 10 + 0.9 × ( 0.2 V ( s 7 ) + 0.8 V ( s 6 )) ,即 V ( s 7 ) ( 1 − 0.18 ) = 10 + 0.72 × 5.22 = 13.758 V(s_7)(1 - 0.18) = 10 + 0.72 \times 5.22 = 13.758 V ( s 7 ) ( 1 − 0.18 ) = 10 + 0.72 × 5.22 = 13.758 ,所以 V ( s 7 ) = 13.758 / 0.82 ≈ 16.78 V(s_7) = 13.758 / 0.82 \approx 16.78 V ( s 7 ) = 13.758/0.82 ≈ 16.78 ✓。
直觉:在 s 7 s_7 s 7 先拿 +10;每一步有 20% 的概率打滑留下再拿一次 +10;一旦成功左移,就进入价值较低的 s 6 s_6 s 6 ,并一路向左最终停在 s 1 s_1 s 1 。
练习 4(策略改进定理) :设新策略 π ′ \pi' π ′ 只在一个状态 s 0 s_0 s 0 与 π \pi π 不同,且 Q π ( s 0 , π ′ ( s 0 ) ) > V π ( s 0 ) Q^\pi(s_0, \pi'(s_0)) > V^\pi(s_0) Q π ( s 0 , π ′ ( s 0 )) > V π ( s 0 ) 。证明 V π ′ ( s ) ≥ V π ( s ) V^{\pi'}(s) \ge V^\pi(s) V π ′ ( s ) ≥ V π ( s ) 对所有 s s s 成立,并且 V π ′ ( s 0 ) > V π ( s 0 ) V^{\pi'}(s_0) > V^\pi(s_0) V π ′ ( s 0 ) > V π ( s 0 ) 。
参考答案
对所有 s s s 都有 V π ( s ) ≤ Q π ( s , π ′ ( s ) ) V^\pi(s) \le Q^\pi(s, \pi'(s)) V π ( s ) ≤ Q π ( s , π ′ ( s )) :在 s ≠ s 0 s \ne s_0 s = s 0 处 π ′ ( s ) = π ( s ) \pi'(s) = \pi(s) π ′ ( s ) = π ( s ) ,取等号;在 s 0 s_0 s 0 处由假设严格成立。于是 7.3 节证明的每一步都照样成立,得到 V π ′ ≥ V π V^{\pi'} \ge V^\pi V π ′ ≥ V π 。
严格性:V π ′ ( s 0 ) = R ( s 0 , a ′ ) + γ ∑ s ′ P ( s ′ ∣ s 0 , a ′ ) V π ′ ( s ′ ) ≥ R ( s 0 , a ′ ) + γ ∑ s ′ P ( s ′ ∣ s 0 , a ′ ) V π ( s ′ ) = Q π ( s 0 , a ′ ) > V π ( s 0 ) 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) V π ′ ( s 0 ) = R ( s 0 , a ′ ) + γ ∑ s ′ P ( s ′ ∣ s 0 , a ′ ) V π ′ ( s ′ ) ≥ R ( s 0 , a ′ ) + γ ∑ s ′ P ( s ′ ∣ s 0 , a ′ ) V π ( s ′ ) = Q π ( s 0 , a ′ ) > V π ( s 0 ) ,其中 a ′ = π ′ ( s 0 ) a' = \pi'(s_0) a ′ = π ′ ( s 0 ) ,中间的"≥ \ge ≥ "用了刚证明的 V π ′ ≥ V π V^{\pi'} \ge V^\pi V π ′ ≥ V π 。
练习 5(压缩映射) :仿照 8.4 节,证明贝尔曼期望算子 B π B^\pi B π 也是 γ \gamma γ -压缩映射。为什么这个证明比 B B B 的证明更简单?
参考答案
( 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')) ( 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 ′ )) 。
取绝对值:≤ γ ∑ 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 ≤ γ ∑ s ′ P π ( s ′ ∣ s ) ∣ V ( s ′ ) − V ′ ( s ′ ) ∣ ≤ γ ∥ V − V ′ ∥ ∞ 。对 s s s 取最大值即得。
更简单是因为 B π B^\pi B π 是线性 的(仿射的),不需要处理 max,也就不需要那个 ∣ max f − max g ∣ ≤ max ∣ f − g ∣ |\max f - \max g| \le \max |f - g| ∣ max f − max g ∣ ≤ max ∣ f − g ∣ 的引理。
练习 6(γ = 0 \gamma = 0 γ = 0 ) :在火星车 MDP 中令 γ = 0 \gamma = 0 γ = 0 ,最优价值 V ∗ V^* V ∗ 是多少?哪些策略是最优的?一般的 MDP 中,γ = 0 \gamma = 0 γ = 0 时的最优策略是什么?
参考答案
γ = 0 \gamma = 0 γ = 0 时 V ∗ ( s ) = max a R ( s , a ) V^*(s) = \max_a R(s, a) V ∗ ( s ) = max a R ( s , 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] V ∗ = [ 1 , 0 , 0 , 0 , 0 , 0 , 10 ] ,所有 128 个策略都是最优的 (最优策略不唯一的极端例子)。
一般情况下,γ = 0 \gamma = 0 γ = 0 时最优策略是”完全短视”的:每个状态选即时奖励最大的动作 arg max a R ( s , a ) \arg\max_a R(s, a) arg max a R ( s , a ) ,完全不考虑后果。这相当于一个老虎机问题(第 1 讲 3.7 节)。
练习 7(有限视界) :根据 8.7 节的表格,解释为什么剩 6 步时 s 2 s_2 s 2 选向左、剩 7 步时选向右。从 s 2 s_2 s 2 到 s 7 s_7 s 7 最少需要几步?
参考答案
从 s 2 s_2 s 2 到 s 7 s_7 s 7 最少需要 5 次成功右移,每次成功概率 0.8,期望需要约 5 / 0.8 = 6.25 5/0.8 = 6.25 5/0.8 = 6.25 步。剩 6 步时,到达 s 7 s_7 s 7 的概率不高,而且即使到达也只剩 1 步左右能拿 +10;而向左 1 步到 s 1 s_1 s 1 之后,剩下的每一步都能稳拿 +1(V 6 ( s 2 ) = 4.75 V_6(s_2) = 4.75 V 6 ( s 2 ) = 4.75 主要来自这里)。剩 7 步时,到达 s 7 s_7 s 7 后能多拿几次 +10,期望收益(10.17)超过了向左的收益。
练习 8(γ 与策略迭代)★ :运行 03_policy_iteration.py,观察演示 4。尝试找到使 s 3 s_3 s 3 的最优动作从 ← 变为 → 的 γ \gamma γ 临界值(精确到 0.01)。
提示
在 main() 里写一个循环,让 γ \gamma γ 从 0.3 以 0.01 的步长增加到 0.7,每次运行 policy_iteration(P, R, g),打印 pol[2](代码中 s 3 s_3 s 3 的下标是 2)。
参考结果:s 3 s_3 s 3 在 γ ≈ 0.37 \gamma \approx 0.37 γ ≈ 0.37 时变为 →;同样可以找出 s 2 s_2 s 2 约在 0.62、s 1 s_1 s 1 约在 0.69 时变为 →。离 s 7 s_7 s 7 越远,需要越大的 γ \gamma γ 才”看得见”它;s 1 s_1 s 1 的临界值最大,因为它脚下就有 +1,放弃它的代价最高。
练习 9(奖励设计)★ :修改 05_gridworld.py,把 step_reward 从 −0.04 以 0.001 的步长逐渐减小,找出 (2,2) 的最优动作从 ← 变成 ↑ 的临界值。你能用”绕远路多花的步数 × 每步成本” vs “走近路掉进 -1 的风险 × 损失”来直观解释这个临界值吗?
提示与参考结果
临界值出人意料地接近标准设定:大约在 − 0.045 -0.045 − 0.045 附近,(2,2) 就改为 ↑。也就是说,教科书里的”标准策略”恰好处在一个转折点边上。
粗略估算:从 (2,2) 出发,近路是 (2,2)→(1,2)→(0,2)→(0,3),远路是绕左边一圈到 (0,3),远路多走 4 步,多花约 4 ∣ c ∣ 4|c| 4∣ c ∣ 。近路的风险主要在 (1,2) 向上走那一步:有 10% 的概率滑进 -1,损失约为 2(本来能拿 +1,结果拿到 -1),期望损失约 0.1 × 2 = 0.2 0.1 \times 2 = 0.2 0.1 × 2 = 0.2 。令 4 ∣ c ∣ ≈ 0.2 4|c| \approx 0.2 4∣ c ∣ ≈ 0.2 ,得 ∣ c ∣ ≈ 0.05 |c| \approx 0.05 ∣ c ∣ ≈ 0.05 ,和代码算出的 0.045 很接近。这种”粗略估算 + 精确计算相互印证”的习惯很有用。
练习 10(思考题) :价值迭代中,贪心策略在第 7 次迭代后就不再变化,但价值还需 175 次迭代才收敛。能否设计一个”当贪心策略连续 m m m 次不变时就停止”的规则?它有什么风险?怎样才能确认策略真的是最优的?
参考答案
风险:贪心策略可能”暂时稳定”一段时间后又改变(例如某个遥远的大奖励的信息还没传播过来)。没有理论保证连续 m m m 次不变就是最优。
确认方法:对当前贪心策略 π \pi π 做一次精确的策略评估 得到 V π V^\pi V π ,再检查 π \pi π 是否对 V π V^\pi V π 贪心(即是否满足贝尔曼最优方程)。如果是,π \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. 下一讲预告
本讲的一切都建立在”模型已知 ”的前提上。但在真实世界中,我们通常不知道 P P P 和 R R R ——火星车不知道打滑的概率,推荐系统不知道用户会如何反应。
下一讲我们去掉这个假设:只能与环境交互、收集经验,怎样评估一个策略? 你会看到:
蒙特卡洛(MC) :跑完整个回合,用实际回报的平均值估计价值——第 1 讲的蒙特卡洛方法的直接推广;
时序差分(TD) :不等回合结束,走一步就更新——用”一步奖励 + 下一状态的估计价值”代替本讲贝尔曼备份中的期望;
两者的偏差–方差权衡 ,以及马尔可夫性对 TD 为何如此关键。
下一讲之前,建议你 :跑通 code/lecture02/ 下的 5 个脚本,完成练习 2、4、8,并尝试练习 9 中修改网格世界的奖励。