动态规划方法
在强化学习中,有模型方法的核心是已知完整的环境模型:
- 状态转移概率 $P(s'|s,a)$:在状态 $s$ 执行动作 $a$,转移到 $s'$ 的概率
- 奖励函数 $R(s,a)$:执行动作后获得的即时奖励
因为已知这两个要素,智能体无需在真实环境中试错,而是直接在内部通过数学推演计算出最优策略。这种"已知模型 + 动态推演"的范式就是动态规划(Dynamic Programming, DP)。
策略迭代包含两个交替进行的步骤:
策略迭代的两步循环
策略评估(Policy Evaluation):给定当前策略 $\pi$,计算每个状态的价值函数 $V_\pi$。
策略改进(Policy Improvement):基于 $V_\pi$,在每个状态贪心地选择价值最大的动作,生成新策略 $\pi'$。
直到 $\pi$ 不再变化,就得到了最优策略 $\pi^*$。
策略评估的迭代公式
对每个状态 $s$,反复应用贝尔曼期望备份:
从任意初始值 $V_0$ 开始,每次迭代都将估值向真实价值推进一步。
策略改进
评估出 $V_\pi$ 后,对每个状态选使期望价值最大的动作:
为什么迭代能收敛?
收敛性的数学基础是巴拿赫压缩映射定理:
- 贝尔曼算子 $T_\pi$ 是一个 $\gamma$-压缩映射:$\|T_\pi V - T_\pi V'\|_\infty \leq \gamma \|V - V'\|_\infty$
- 每次迭代,估计值与真实值之间的最大误差乘以 $\gamma$(严格变小)
- 在完备度量空间中,压缩映射必然有唯一不动点
- 因此 $V_0, V_1, V_2, \ldots$ 以指数级速度收敛到 $V_\pi$
环境设定:4×4 网格,16 个状态(标号 0-15),状态 0 和 15 为终止状态。
| 属性 | 值 |
|---|---|
| 状态空间 | 16 个格子(0-15),0 和 15 是终止状态 |
| 动作空间 | 4 个方向:上、右、下、左 |
| 奖励 | 每步 $-1$(鼓励尽快到达终点) |
| 转移 | 确定性(撞墙则原地不动) |
| 折扣因子 | $\gamma = 1$(有限任务) |
初始策略:均匀随机策略,$\pi(a|s) = 0.25$(每个方向等概率)。
第一轮策略评估($k=0 \to k=1$)
初始 $V_0(s) = 0$ 对所有 $s$。现在计算 $V_1$。
以状态 1(第 1 行第 2 列)为例:
- 上 → 状态 0(终止),$V(0) = 0$,奖励 $= -1$
- 右 → 状态 2,$V(2) = 0$,奖励 $= -1$
- 下 → 状态 5,$V(5) = 0$,奖励 $= -1$
- 左 → 状态 0(终止,因为撞到边界后绕到终止态)……不对,左是状态 0 吗?让我重新核实。
实际上,网格布局如下(标号):0 在左上角,15 在右下角。
| 0(终) | 1 | 2 | 3 |
| 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15(终) |
对状态 1:
- 上 → 状态 0(终止),$V_0(0) = 0$,得到 $-1 + 1 \times 0 = -1$
- 右 → 状态 2,$V_0(2) = 0$,得到 $-1 + 0 = -1$
- 下 → 状态 5,$V_0(5) = 0$,得到 $-1 + 0 = -1$
- 左 → 状态 0(左出界了吗?不,状态 1 向左到状态 0),得到 $-1 + 0 = -1$
类似地,所有非终止状态的 $V_1 = -1.0$。
第二轮策略评估($k=1 \to k=2$)
以状态 1 为例:
- 上 → 状态 0(终止),$V(0) = 0$,得 $-1 + 0 = -1$
- 右 → 状态 2,$V_1(2) = -1$,得 $-1 + (-1) = -2$
- 下 → 状态 5,$V_1(5) = -1$,得 $-1 + (-1) = -2$
- 左 → 状态 0(终止),$V(0) = 0$,得 $-1 + 0 = -1$
边界状态(靠近终止态的)会更快收敛到更高的值,因为它们有更多机会走到终止态。
继续迭代直到收敛(约 50-100 步后 $\Delta$ 很小),然后进行策略改进:对每个状态,选使价值最大的动作。
策略改进结果
经过几轮"评估→改进"循环后,策略会稳定在最优策略上。例如,状态 1 的最优动作是"上"(直接走向终止态 0),状态 14 的最优动作是"右"(走向终止态 15)。
策略迭代需要"评估到完全收敛再改进",效率不高。价值迭代的核心洞察:不需要等策略评估完全收敛,每一步同时完成评估和改进。
核心公式:贝尔曼最优方程
注意与策略评估的区别:这里直接用 $\max$ 选最优动作,而不是按 $\pi$ 的概率加权。因此每一步迭代都在同时做评估和改进。
算法步骤
- 初始化 $V_0(s) = 0$(对所有 $s$)
- 对每个状态 $s$,用贝尔曼最优方程计算 $V_{k+1}(s)$
- 当 $\max_s |V_{k+1}(s) - V_k(s)| \lt \theta$ 时停止
- 提取最优策略:$\pi^*(s) = \arg\max_a \sum_{s'} P(s'|s,a)[r + \gamma V^*(s')]$
环境:3 个状态的小型 MDP。
| 状态 | 动作 | 转移 | 奖励 |
|---|---|---|---|
| $s_A$ | $a_1$ | $s_B$(确定) | $+2$ |
| $s_A$ | $a_2$ | $s_C$(确定) | $-1$ |
| $s_B$ | $a_1$ | $s_C$(确定) | $+5$ |
| $s_B$ | $a_2$ | $s_A$(确定) | $+0$ |
| $s_C$(终止) | — | — | $V = 0$ |
参数:$\gamma = 0.9$。
价值迭代过程
初始化:$V_0(s_A) = 0$,$V_0(s_B) = 0$,$V_0(s_C) = 0$
迭代 $k=1$:
迭代 $k=2$:
注意:$s_B$ 的最优动作从 $a_1$ 变成了 $a_2$!因为在 $k=2$ 时,回到 $s_A$($V=6.5$)比直接去 $s_C$($V=0$)更划算。
迭代 $k=3$:
完整收敛表格:
| $k$ | $V_k(s_A)$ | $V_k(s_B)$ | $s_A$ 最优动作 | $s_B$ 最优动作 |
|---|---|---|---|---|
| 0 | 0.000 | 0.000 | — | — |
| 1 | 2.000 | 5.000 | $a_1$ | $a_1$ |
| 2 | 6.500 | 5.850 | $a_1$ | $a_2$ |
| 3 | 7.265 | 6.539 | $a_1$ | $a_2$ |
| 4 | 7.885 | 7.097 | $a_1$ | $a_2$ |
| 5 | 8.387 | 7.547 | $a_1$ | $a_2$ |
| ... | ... | ... | $a_1$ | $a_2$ |
| $\infty$ | $\approx 15.3$ | $\approx 13.8$ | $a_1$ | $a_2$ |
关键观察
策略在第 2 轮就稳定了($s_A$ 始终选 $a_1$,$s_B$ 从第 2 轮起选 $a_2$)。但价值函数还需要更多轮才能收敛到精确值。这说明策略往往比价值函数更早稳定。
最终最优策略:$s_A \xrightarrow{a_1} s_B \xrightarrow{a_2} s_A \xrightarrow{a_1} s_B \cdots$ 这是一个循环!每次循环获得奖励 $2 + 0 = 2$,折扣后总价值 $\frac{2}{1-0.9^2} = \frac{2}{0.19} \approx 10.5$。实际上更精确的计算需要考虑 $\gamma^2$ 因子。
| 维度 | 策略迭代 | 价值迭代 |
|---|---|---|
| 核心思路 | 评估→改进循环 | 直接逼近 $V^*$ |
| 每步操作 | 多次迭代求 $V_\pi$(内循环) | 一次 Bellman 最优备份 |
| 收敛速度 | 外循环少(3-4轮),内循环多 | 总迭代次数可能更多,但每步简单 |
| 中间输出 | 每轮都给出明确的策略 | 最后才提取策略 |
| 适用场景 | 策略空间较小时更高效 | 更通用,实现更简单 |
在实践中,价值迭代因为实现简单且不需要内循环,往往更常用。策略迭代在状态空间较小时收敛更快。
有模型方法的前提是已知 $P(s'|s,a)$ 和 $R(s,a)$。但现实中这些通常是未知的。下一节,我们来看如何在没有模型的情况下学习 → 模块 03:无模型方法
参考来源
- Sutton, R. S., & Barto, A. G. (2018). Reinforcement Learning: An Introduction, Chapter 4. MIT Press.
- RethinFun 强化学习系列