🏠 总目录📚 本教程 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]$$

   ① 所有 V 初始化为 0
   ② 用上面的公式,根据【旧的 V】算出【新的 V】
   ③ 重复,直到 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 的理论根据
算法课的动态规划 同一个思想(用子问题的解拼出大问题)

✅ 检查点

  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 章(用神经网络近似,不再存表)。

🛑 可以停在这里

走神救援

动态规划=知道环境规则(P,R)时,把贝尔曼方程当赋值语句反复迭代。⭐收敛保证来自 γ<1(每轮误差乘γ,压缩映射)。策略迭代=评估→改进→再评估,靠策略改进定理(按V^π贪心的新策略一定不比旧的差)保证有限步收敛;价值迭代=把两步合一,公式上唯一区别是 Σπ(a|s) 换成 max_a,实现简单所以实践首选。⭐两者是同一族的两端,中间是「广义策略迭代」——后面所有算法(包括PPO)本质都是它:一边估价值一边改策略,交替推进。在第3章那个MDP上迭代收敛到 V(上课)=7.1429、V(刷机)=5.2632,和解方程结果一致;迭代法的好处是状态一多方程组解不动但迭代永远能跑。💀两个致命限制:①必须知道P和R(现实中Atari/推荐/RLHF全都不知道)→第5章解决 ②要遍历所有状态(围棋10¹⁷⁰个)→第8章用神经网络近似。每往后一章就是放宽一个限制

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

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