动态规划 — 把 Bellman 方程改成赋值语句
这一章讲三件事: 已知环境的完整规则时,值函数和最优策略怎么一步步算出来; 「评估」与「改进」这两个动作怎么咬合成策略迭代、又能怎么剪成值迭代; 以及 GPI 这个词为什么能罩住后面所有的算法。 读完你会得到全书的第一个「完整可解」样本——之后所有章节都在回答同一个问题: 不给你这么好的条件,怎么办。
1. 这一章在全书里的位置
先把立场摆正。动态规划(DP)需要环境的完整模型——那个四参数的动力学函数 p(s′,r|s,a),每个状态动作组合的概率都得知道。现实中这几乎从不成立;而且计算上也不便宜。但作者开篇就给 DP 派了角色:后面所有方法,都可以看成「想达到 DP 的效果,但计算更少、也不要完整模型」的尝试1。DP 是标尺,不是终点。
DP 的关键想法只有一句:用值函数来组织和结构化对好策略的搜索2。做法则简单得惊人——第 03 章说过,每个值函数都满足一条 Bellman 方程(一个等式);把等号读成赋值号,方程就变成了算法3。
2. 核心原理一:策略评估——「照这套打法,值多少」
策略评估(policy evaluation)回答:给定一套策略 π,每个状态的 vπ(s) 是多少。做法:先把所有状态的值随便设个数(终止态必须是 0),然后一遍遍按 Bellman 方程的右端刷新每个状态——用旧的邻居值算出新的自己的值4。这种「对全部可能后继按概率取期望再更新」的操作,书里统一叫期望更新(expected update)——DP 的所有更新都属于这一类5。
3. 主走查:4×4 网格世界,第一遍扫描
拿书里的例 4.1 走一遍(规则与 k=1 那一行的数取自书;sweep 2 的两个数是我们照规则自己算的,计算过程当场写出)6:
规则:4×4 网格,14 个普通格 + 终止格(右上、右下角,实为同一状态);
四个动作(上下左右)确定性移动,撞墙留在原地;
每走一步奖励 −1,到达终止格游戏结束;不折扣(γ=1);
策略:四方向等概率(各 0.25)。初始:所有格 0。
┌ 1 2 3 ⬛ ┐
│ 4 5 6 7 │ ⬛ = 终止格
│ 8 9 10 11 │
└ 12 13 14 ⬛ ┘
第 1 遍扫描,格子 1(左上角):
上→撞墙留原地:−1 + 0(自身旧值 0)
左→撞墙留原地:−1 + 0
右→格子 2: −1 + 0
下→格子 4: −1 + 0
v(1) = 0.25 × (−4) = −1.0
格子 5(正中):四邻全是普通格,旧值全 0:
v(5) = 0.25 × 4 × (−1 + 0) = −1.0
事实上这一遍扫完,所有 14 个格全是 −1.0 —— 书中 k=1 那一栏正是如此:
离终止一步之内的信息(「再走一步要花 1」)刚好传遍全盘。
第二遍扫描开始,信息才往深处走。格子 1(所有邻居在第一遍后都是 −1.0):
v(1) = 0.25 × [ (−1 + (−1.0)) + (−1 + (−1.0)) + (−1 + (−1.0)) + (−1 + (−1.0)) ]
= 0.25 × (−8) = −2.0
格子 3(紧 挨终止格,向右一步就到):
v(3) = 0.25 × [ 上(撞墙): −1 + v(3) + 左: −1 + v(2) + 右: −1 + 0(终止)
+ 下: −1 + v(7) ] ← 此刻邻居都还是第一遍的 −1.0
= 0.25 × [ (−2) + (−2) + (−1) + (−2) ] = 0.25 × (−7) = −1.75
照这个速度,「离终止的平均步数」这个真值从终止格一圈圈往回扩散。书里给出的收敛结果(vπ 的准确值)是:左上角 −14、上排第二格 −20、上排第三格 −22——这就是随机乱走时各格平均要走的步数7。还有个书里明说的彩蛋:虽然要很多遍才收敛,第三遍之后对应的贪心策略就已经是最优策略了8。