策略迭代与价值迭代:同一件事的两种做法
解同一个贝尔曼方程,有两条路。表面上是「哪个收敛快」的工程比较,实际上它揭示了一个更深的东西——而那个东西在第 17 章会长成策略梯度,在现代算法里叫 Actor-Critic。
两条路
上一章那个方程,可以从两头解。
路 A:价值迭代(第 7 章那个)
重复:
对每个状态,做一次 backup,直接取 max
直到价值不再变化
最后从收敛的 V 里读出策略
它压根不显式维护策略。策略是最后一步从 V 里推出来的副产品。
路 B:策略迭代
先随便定一个策略(比如「所有格子都往上」)
重复:
① 评估:算出「按这个策略走」的价值,算到收敛 ← 不取 max
② 改进:在每一格看看有没有更好的动作,有就换掉 ← 取 max
直到没有一格需要改动
它始终维护着一个明确的策略,反复地「先摸清家底,再改进决定」。
评估要不要做到收敛。
策略迭代:评估到底,再改进。
价值迭代:评估一步,就改进。
所以价值迭代其实是策略迭代的一个特例——把「评估到收敛」缩短成「只扫一遍」。中间还有无穷多种可能:扫三遍再改进、扫十遍再改进,都行,都收敛。
这一整族做法有个统称,叫广义策略迭代(GPI)。它是这本书剩下所有算法的共同骨架。
跑一下
那个不对称
结果很有意思:
- 策略迭代:5 轮改进就定了。每轮改动的格子数依次是 6、1、1、1、0——第二轮开始就只改一格,第五轮一格不改,收工。
- 价值迭代:46 轮扫描。
但别急着说策略迭代快。把账摊开算:策略迭代那 5 轮里,每一轮内部都藏着一次「评估到收敛」,加起来一共做了 1203 次扫描——比价值迭代的 46 轮多了二十多倍。
两者算出来的 V 完全一致,策略也完全一致。殊途同归。
真正值得琢磨的不是谁快,是那个 6 → 1 → 1 → 1 → 0:
价值要磨到小数点后八位才算收敛,但策略在第二轮就基本不动了。
原因不难想:策略只关心「哪个动作的 Q 最大」,是个比较;价值关心「到底是多少」,是个数值。比较的结果远比数值本身稳定——0.6114 和 0.6553 谁大,你在它们还是 0.61 和 0.65 的时候就知道了。
这个观察有一个非常实际的推论:价值只是中间品。你花在把 V 磨精确上的力气,绝大部分对最终策略没有任何贡献。
这个观察会长成什么
顺着「价值只是中间品」这个念头往下想,会长出两个不同的东西,而它们撑起了这本书的后半部分:
① 那干脆别学价值了 → 策略梯度
如果最终要的是策略,为什么要绕道价值?直接把策略参数化,然后对「期望回报」求梯度,推着策略往好的方向走。
这就是第 17 章的 REINFORCE,和它后面整个策略梯度家族(A2C、TRPO、PPO、SAC)。它们有一个价值迭代永远给不了的能力:处理连续动作——因为它们从不需要「对所有动作取 max」。
② 价值还是要的,但只用它当参照 → Actor-Critic
纯策略梯度有个大毛病:方差极大(第 17 章你会亲眼看到)。因为它只知道「这局总共拿了多少」,不知道「这一步本身好不好」。
解法是给它配一个价值估计,专门回答「这一步比平均水平好多少」。于是就有了两个部件:
- Actor(演员):那个策略,负责做动作。对应策略迭代里的改进步。
- Critic(评论家):那个价值函数,负责打分。对应策略迭代里的评估步。
这就是策略迭代,只不过两步不再交替进行,而是同时在跑,各自用梯度慢慢挪。PPO、A3C、SAC、以及 ChatGPT 的 RLHF,全是这个结构。
评估价值 ⇄ 改进策略
│ │
策略迭代 评估到收敛 一次改到最优 ← 这一章
价值迭代 只扫一遍 一次改到最优 ← 第 7 章
Q-learning 采样一步 一次改到最优 ← 第 12 章
Actor-Critic 梯度挪一点 梯度挪一点 ← 第 17-18 章
PPO 梯度挪一点 梯度挪一点(带刹车) ← 第 18 章
从上往下,两边都在变得越来越「小步」——从「一次算到底」退化成「每次挪一点点」。
为什么要退化?因为往下走的每一步都在放弃一样东西:先是放弃了模型 P(第 12 章),再是放弃了表格(第 15 章)。放弃得越多,能处理的问题越大,但能给的保证越少。
这条线你现在看着可能有点抽象。等你读到第 18 章再回来看它,会发现整本书的后半部分都在这张表上。
顺便:为什么策略迭代一定会停
一个小小的保证,但它的论证很漂亮,值得看一眼:
- 每次「改进」之后,新策略在每一个状态上的价值都不低于旧策略(这叫策略改进定理)。
- 策略的总数是有限的(每个状态选一个动作,一共 |A||S| 种)。
- 价值单调不减,而且只要还有改动就严格增加。
- 有限的集合里,单调严格递增的序列必然会停。而停下来的时候,说明没有任何一格能改进——那正是贝尔曼最优方程被满足的意思。
四步,完了。这是这本书里唯一一个会完整写出来的证明,因为它是整个领域唯一一处「保证」还这么干净的地方。
从下一卷开始,这些保证会一个个消失:去掉模型 P,收敛只剩概率意义上的;再换成神经网络,连概率意义上的都没有了。第 16 章那个把权重炸到 10⁶ 的例子,就是保证彻底失效之后的样子。
卷 II 到这里就结束了。临走前把它的边界说清楚——它有两条硬限制,正是这两条把我们推向卷 III:
① 需要完整的模型 P。第 5 章说过了,真实游戏里没有。
② 需要遍历所有状态。每一轮扫描都要把每个状态过一遍。11 个状态没问题,10^16993 个状态(第 14 章那个 Atari 的数字)连一轮都跑不完。
接下来两卷分别拆掉这两条:卷 III 拆掉「需要模型」,卷 IV 拆掉「需要遍历」。
但注意:拆掉限制不是免费的。你拆掉的每一条限制,都会同时拆掉一条保证。这是这本书后半部分反复出现的交易。
你不会在训练 Atari 的时候用它。但它在几个地方活得很好:
- 验证你的实现。在小环境上用动态规划算出精确解,拿它检验你的 Q-learning——这本书第 12 章就是这么做的,而且这是我最推荐的用法。
- 规划算法的内核。AlphaZero 的 MCTS、模型预测控制(MPC),骨子里都是「有了模型就往前推演」。
- 运筹学的日常。库存管理、排班、资源分配——这些领域的状态空间小、模型清楚,动态规划就是标准工具,而且已经用了六十年。
写一个 value_iteration() 放进你的工具箱吧(第 7 章有二十行的版本)。它是你以后唯一能拿到「标准答案」的地方。
那个学走路的小人,用的几乎肯定是 PPO 或者 SAC——也就是上面那张表最底下那一行。
但它做的事和这一章一模一样:Critic 在评估「这个姿势值多少」,Actor 在根据评估调整「这个姿势该怎么动」。两个网络同时在训,互相追着对方跑。
训练不稳定的时候,多半是这两个在互相带偏:Critic 估错了 → Actor 往错的方向改 → 走到更奇怪的状态 → Critic 估得更错。第 16、18 章讲的两个刹车(目标网络、裁剪),治的都是这个。
这一章的一句话
策略比价值先定下来——价值只是拿来推策略的中间品。顺着这句话往下想,一边长出了策略梯度,一边长出了 Actor-Critic。
卷 II 到此结束。你现在有了一套完整的理论:MDP、γ、价值、贝尔曼方程,以及两种解它的办法。
而这一整套,都建立在「你有那张转移概率表」这个假设上。下一卷第一句话就是:你没有。