🏠 总目录📚 本教程 04 · 动态规划 ← →
📑 本页目录(点开跳转)

04 · 动态规划:知道规则时怎么解

⏱ 18 分钟 | 🎁 理想情况的基准线


🎯 一句话

如果你完全知道环境规则(P 和 R),贝尔曼方程就是一个方程组, 可以直接迭代解出来 —— 这就是动态规划。

⚠️ 现实中你几乎从不知道 P 和 R。 那为什么还要学这一章?因为后面所有算法都是它的近似版, 而且它给了你一个"如果什么都知道,最好能做到多好"的上限参照。


🔁 一、策略评估:给定策略,算出它值多少

做法:把贝尔曼期望方程当成赋值语句,反复迭代。

$$V_{k+1}(s) \leftarrow \sum_a \pi(a|s)\Big[R(s,a) + \gamma\sum_{s'}P(s'|s,a)V_k(s')\Big]$$

操作步骤

  1. 所有 V 初始化为 0
  2. 用上面的公式,根据【旧的 V】算出【新的 V】
  3. 重复,直到 V 几乎不再变化

💡 为什么一定会收敛:

每迭代一次,误差就乘以 γ(<1)。γ^k → 0,所以必然收敛,且收敛到唯一解。 这在数学上叫「压缩映射」——γ<1 是全部保证的来源。

🔨 十几行就能写完

def policy_eval(pi, states, actions, P, R, gamma=0.9, tol=1e-8):
    V = {s: 0.0 for s in states}
    while True:
        delta = 0
        for s in states:
            v_new = sum(
                pi[s][a] * (R[(s, a)] + gamma * sum(
                    p * V.get(s2, 0.0) for s2, p in P[(s, a)].items()))
                for a in actions)
            delta = max(delta, abs(v_new - V[s]))
            V[s] = v_new
        if delta < tol:            # ⭐ 收敛判据看【最大变化量】
            return V

♻️ 二、策略迭代:评估 → 改进 → 再评估

流程图

① 随便来个策略 π₀
② 【评估】:算出 V^π
③ 【改进】:每个状态改成贪心选 argmax_a Q(s,a)
④ 策略没变?停。变了?回到 ②
π₀→评估→V₀→改进→π₁→评估→V₁→改进→π₂ ·

🔑 策略改进定理(这一章唯一需要记的理论): 按 V^π 贪心得到的新策略 π',一定不比 π 差。

因为策略数量有限、每次严格变好或不变,所以有限步内必然收敛到最优策略。

💡 一个反直觉的事实:策略迭代通常只需要很少几轮就收敛 (第 3 章那个 MDP 只要 2 轮)—— 大部分时间花在里面的"评估"上。


⚡ 三、价值迭代:把两步合成一步

观察:策略评估要迭代到完全收敛,很浪费 —— 反正马上就要改策略了。

价值迭代:干脆只做一次评估就改进,合并成一个公式:

$$V_{k+1}(s) \leftarrow \max_a\Big[R(s,a) + \gamma\sum_{s'}P(s'|s,a)V_k(s')\Big]$$

结果对照

和策略评估的唯一区别:Σ π(a|s) 换成了 max_a ⭐
直接迭代贝尔曼【最优】方程
收敛后得到 V*,再 argmax 一次拿到 π*

两者对比

策略迭代 价值迭代
每轮代价 高(要把评估迭代到收敛) 低(只扫一遍)
轮数 少(通常 < 10) 多
实现难度 稍复杂 简单 ⭐
实践首选 ✅ 一般用这个

💡 它们其实是同一个算法族的两端: 中间还有「广义策略迭代」——评估做几轮就去改进,不必等收敛。 ⭐ 后面所有算法(包括 PPO)本质上都是广义策略迭代: 一边估价值,一边改策略,两者交替推进。看懂这条线,后面就不会觉得算法是散的。


🧮 四、在第 3 章那个 MDP 上跑一遍

对照

初始 V = {上课: 0, 刷机: 0}

第 1 轮(价值迭代):

上课: max(学: 2+0.9(0.8·0+0.2·0)=2, 玩: 1+0.9·0=1) = 2

刷机: max(学: -1+0.9(0.6·0+0.4·0)=-1, 玩: 1+0.9(0.9·0)=1) = 1

第 2 轮:

上课: max(2+0.9·0.8·2=3.44, 1+0.9·1=1.9) = 3.44

刷机: max(-1+0.9(0.6·2+0.4·1)=0.44, 1+0.9·0.9·1=1.81) = 1.81

· 继续迭代 ·

收敛:V*(上课)=7.1429 V*(刷机)=5.2632 ⭐ 和第 3 章解方程的结果一致

✅ 两条路殊途同归:第 3 章是解方程,这里是迭代逼近。 迭代法的好处是 —— 状态一多,方程组根本解不动,但迭代永远能跑。


💀 五、动态规划的两个致命限制

限制 1:必须知道 P 和 R(模型已知)

结果对照

下围棋:你知道规则 ✅ 但状态太多(见限制2)
玩 Atari:你【不知道】游戏内部逻辑 ❌
推荐系统:你【不知道】用户看到某个商品后会怎样 ❌
RLHF:你【不知道】人类会怎么打分 ❌
⭐ 现实中绝大多数问题都是「模型未知」
第 5 章开始讲怎么在不知道规则的情况下学

限制 2:要遍历所有状态(维度灾难)

操作步骤

每一轮都要对【每个状态】算一遍
围棋:10¹⁷⁰ 个状态 💀
Atari 一帧画面:256^(84×84) 💀💀
语言模型的上下文:词表^长度 💀💀💀
第 8 章开始用神经网络【近似】价值函数,不再存表

🔗 这正是数学原理第 5 章维度灾难在强化学习里的样子。 表格法的天花板不是算法不好,是状态空间根本存不下。


🗺️ 六、这一章在整条线里的位置

问题的条件 用什么方法 在哪一章
模型已知 + 状态少 动态规划 本章
模型未知 + 状态少 MC / TD 第 5 章
模型未知 + 状态少 Q-learning 第 6 章
模型未知 + 状态多 DQN ⭐ 第 8 章
动作连续 策略梯度 ⭐ 第 9 章起

⭐ 每一步都是在放宽一个限制。


🔗 七、和站内其他章的关系

相关的地方 这里的位置
第 3 章贝尔曼方程 本章把它当赋值语句迭代
数学原理 05维度灾难 限制 2 的理论根据
算法课的动态规划 同一个思想(用子问题的解拼出大问题)
代码题拆解 05 · 动态规划 ⚠️ 同名不同物:那里的 DP 是「先定义 dp[i] 代表什么,再从已解决的小问题推当前问题」,没有环境、没有策略。⭐ 共用的那句话是「今天的最优由昨天的状态推出来」——本章的价值迭代就是它在贝尔曼方程上的样子

✅ 检查点

  1. 动态规划要求你知道什么?现实中通常满足吗?
  2. 策略评估为什么一定收敛?关键条件是什么?
  3. 策略改进定理说了什么?为什么能保证有限步收敛?
  4. 价值迭代和策略评估在公式上唯一的区别是什么?
  5. 策略迭代和价值迭代各自的代价在哪?实践中一般用哪个?
  6. 什么是广义策略迭代?为什么说后面所有算法都是它?
  7. 动态规划的两个致命限制是什么?分别由哪章解决?
👀 答案
  1. 必须知道转移概率 P 和奖励函数 R(模型已知)。现实中绝大多数问题都不满足——玩 Atari 不知道游戏内部逻辑、推荐不知道用户反应、RLHF 不知道人类怎么打分。
  2. 因为每迭代一次误差乘以 γ,γ<1 所以 γ^k→0,必然收敛到唯一解(压缩映射)。关键条件就是 γ<1。
  3. 按 V^π 贪心得到的新策略 π' 一定不比 π 差。因为策略数量有限且每次严格变好或不变,所以有限步内必收敛到最优。
  4. 策略评估用 Σπ(a|s)·[...](按策略加权),价值迭代用 max_a[...](直接取最好)。
  5. 策略迭代:每轮代价高(评估要迭代到收敛)但轮数少;价值迭代:每轮便宜但轮数多。实践一般用价值迭代(实现简单)。
  6. 评估做几轮就去改进、不必等收敛。后面所有算法(含 PPO)本质都是它:一边估价值一边改策略,两者交替推进。
  7. ①必须知道模型 P、R → 第 5 章(MC/TD 从经验中学)②要遍历所有状态,状态一多就爆炸 → 第 8 章(用神经网络近似,不再存表)。

🛑 可以停在这里

⚡ 走神救援

先记住这几件事

下一节 👉 05-蒙特卡洛与时序差分.md

打卡记录保存在你的浏览器里,首页能看到总进度