有了模型,算力可以花在两个时刻:部署之前,把模型里的推演变成训练数据;或者部署时,每一步现场搜索。两者并不互斥。AlphaZero 一类系统同时做这两件事,而且让它们互相改进。规划可以替学习造更好的标签,学习可以让规划更便宜;把两者接在一起时,要看清是哪一边在纠正哪一边的错误。
计算花在部署前,还是每一步?
背景规划(background planning)用模型生成经验,再用普通的 RL 更新去学 policy 或 Q;部署时只调用学好的 policy。决策时规划(decision-time planning)在每次行动前,从当前真实状态出发搜索。前者部署便宜,后者能针对眼前这个状态,甚至一个训练时没见过的状态现场算。
Sutton(1990)提出的 Dyna 是背景规划的原型:同一个学习过程交替作用于真实环境和学到的模型,Dyna-Q 就是在 Q-learning 上加这一步。Sutton(1991)把这种结构描述为把规划的结果“编译”进一个反应式策略(policy):动作由策略直接给出,几乎没有延迟,规划在后台持续改进它。
先算一个最小的例子。一条走廊 $A\to B\to G$,只有一个动作“前进”,进入 $G$ 得 1 分并结束,$\gamma=0.9$。表格 Q 从 0 开始,环境确定,为了手算把学习率取 1。第一个真实回合(episode)按顺序更新:先算 $Q(A)=0+0.9\,Q(B)=0$,因为这时 $Q(B)$ 还是 0;再算 $Q(B)=1$。只靠真实交互,要再走一个回合,$Q(A)$ 才会变成 0.9。
Dyna 把这两条 transition 记进模型。回合结束后,从模型里取出 $(A\to B)$ 再更新一次:$Q(A)=0+0.9\times1=0.9$。同样的真实数据,多花一次计算,价值就传回了起点。 这里的“模型”只是记下来的 transition,和回放(replay)没有区别(见学什么样的模型)。学到的参数化模型还能从没见过的状态生成数据,模型误差也就从这里进来;MBPO(Janner 等,2019)因此只从真实数据出发做短 rollout。
几种用法部署时每步付多少成本,放在文末的对照表里。下面先看另一件事:两种规划怎样和网络训练互相改进。
MCTS:把模拟次数分给有希望、又还没看够的分支
蒙特卡洛树搜索(MCTS)每次模拟从根节点走到一个叶子,分 4 步:
- 选择:在每个节点按下面的规则挑一条边,一直走到还没展开的位置;
- 展开:用模型算出新节点的状态,AlphaZero 用棋规,MuZero 用学到的动力学函数;
- 评估:让网络给新节点一个价值 $v$,不必随机下到终局;
- 回传:沿路径把 $v$(以及中途奖励(reward))传回去,每条边的 $Q$ 取经过它的各次模拟的平均,访问次数 $N$ 加 1。
选择用的是 PUCT 一类规则:
$$ a=\arg\max_a\left[Q(s,a)+c\,P(s,a)\,\frac{\sqrt{\sum_bN(s,b)}}{1+N(s,a)}\right]. $$
$Q$ 是回传值的平均,$P$ 是网络给的先验概率,$N$ 是访问次数,$c$ 控制探索强度。先验高、又很少被访问的边会得到加分;某条边被访问得越多,它的加分越小;父节点总访问次数增长时,所有边的加分按平方根缓慢变大。AlphaZero(Silver 等,2017)把这条规则概括为:倾向访问次数少、先验概率高、价值高的走法。MuZero 附录的式 (2) 还给加分项乘了一个随总访问次数缓慢增长的系数 $c_1+\log\frac{\sum_bN+c_2+1}{c_2}$(论文取 $c_1=1.25$、$c_2=19652$);访问次数远小于 $c_2$ 时,这个系数约等于 $c_1$,就回到上式。
手算一棵两动作的小树
根节点有 L、R 两个动作。网络先验 $P(L)=0.6$、$P(R)=0.4$;网络对两个子节点的估值是 $v(L)=0.2$、$v(R)=0.6$。取 $c=1$,没访问过的边 $Q=0$,平局时选先验大的。为了能手算,假设树只有一层,每次选中某个动作就回传那个固定估值;真实 MCTS 第二次经过时会继续往下展开,$Q$ 是更深处估值的平均。
| 第几次模拟 | $\sum N$ | L 的分数 | R 的分数 | 选中 | 之后 $(N_L,N_R)$ |
|---|---|---|---|---|---|
| 1 | 0 | 0 | 0 | L(平局,先验大) | (1, 0) |
| 2 | 1 | $0.2+0.6\times1/2=0.50$ | $0+0.4\times1/1=0.40$ | L | (2, 0) |
| 3 | 2 | $0.2+0.6\times1.414/3=0.48$ | $0+0.4\times1.414/1=0.57$ | R | (2, 1) |
| 4 | 3 | $0.2+0.6\times1.732/3=0.55$ | $0.6+0.4\times1.732/2=0.95$ | R | (2, 2) |
| 5 | 4 | $0.2+0.6\times2/3=0.60$ | $0.6+0.4\times2/3=0.87$ | R | (2, 3) |
| 6 | 5 | $0.2+0.6\times2.236/3=0.65$ | $0.6+0.4\times2.236/4=0.82$ | R | (2, 4) |
先验偏向 L,但 R 一旦被看到价值更高,后面的模拟就集中到 R。L 的加分随 $\sqrt{\sum N}$ 慢慢涨,继续模拟迟早会再看它一次;$c$ 越大,回访越早。
搜索结束后,把根节点的访问次数变成一个分布:
$$ \pi(a)=\frac{N(a)^{1/\tau}}{\sum_bN(b)^{1/\tau}}. $$
$\tau=1$ 时 $\pi=(2/6,\,4/6)\approx(0.33,\,0.67)$;$\tau=0.5$ 时把次数平方,$(4,16)/20=(0.2,\,0.8)$;$\tau\to0$ 时全部给 R。网络原来的先验是 $(0.6,\,0.4)$,搜索把它改成了 $(0.33,\,0.67)$。把这个 $\pi$ 当作策略头的训练标签,下一次搜索就从更好的先验出发。 MuZero 在 Atari 上按这个分布采样动作,并随训练把 $\tau$ 从 1 降到 0.5 再到 0.25;AlphaZero 自对弈时按访问次数比例选走法,评估时按访问次数贪心选。
这个例子也暴露了一个前提:搜索完全相信 $v(R)=0.6$。如果网络高估了 R,搜索会同样认真地把模拟集中过去。搜索改进的是“相对网络自己估值”的策略;估值本身的错误,要靠真实结果来纠正。
AlphaZero:搜索给出更好的标签,网络让搜索更省
AlphaZero 的网络 $(p,v)=f_\theta(s)$ 同时输出走法概率和局面价值。MCTS 用 $p$ 作先验、用 $v$ 评估叶子;自对弈时按搜索得到的 $\pi$ 走棋;一局结束得到结果 $z\in\{-1,0,+1\}$。损失是:
$$ l=(z-v)^2-\pi^\top\log p+c\|\theta\|^2. $$
两项各管一件事。第二项把 $p$ 拉向搜索结果 $\pi$:把搜索看成一个“策略改进(policy improvement)算子”,输入 $p$、输出更好的 $\pi$,训练让 $p$ 逐渐接近 $\pi$,搜索能改进的余地也就变小。第一项把 $v$ 拉向真实对局结果 $z$,而不是搜索自己的估计;上一节说的估值错误,靠的就是这一项。最后一项是权重正则。
网络反过来让搜索更省:先验 $p$ 把模拟集中在少数走法上,$v$ 代替一路下到终局的随机 rollout。Expert Iteration(Anthony 等,2017)把同样的分工说得很直白:“Planning new policies is performed by tree search, while a … network generalises those plans”(摘要),即树搜索负责规划出更强的策略,网络负责把这些规划推广到新局面,再反过来引导搜索。
注意 AlphaZero 的“模型”是准确的棋规,不是学出来的。规则已知、可以完美模拟的问题里,这套循环已经是成熟做法;模型需要学的时候,下面两节的问题才变得突出。
末端价值:让短视的 MPC 看到规划长度之外
Model-based 那篇的 MPC 目标末尾有一项 $\gamma^H\hat V(\hat s_{t+H})$。它就是学习喂给规划的东西:规划只看 $H$ 步,剩下的未来交给学到的价值。
一条走廊有位置 0、1、2,从 0 出发,到达 2 得 10 分并结束;每走一步花 1 分,原地不动不花分,$\gamma=0.9$,模型准确。真实价值是 $V^*(1)=-1+10=9$,$V^*(0)=-1+0.9\times9=7.1$。比较几种规划设置下第一步怎么选:
| 规划设置 | 第一步“停”的最好分数 | 第一步“右”的最好分数 | 选择 |
|---|---|---|---|
| $H=1$,不加末端价值 | 0 | $-1$ | 停,而且以后每一步都停 |
| $H=1$,$\hat V=V^*$ | $0.9\times7.1=6.39$ | $-1+0.9\times9=7.1$ | 右 |
| $H=1$,$\hat V(1)$ 低估成 7 | 6.39 | $-1+0.9\times7=5.3$ | 停 |
| $H=2$,$\hat V(1)$ 仍是 7 | $0.81\times7.1\approx5.75$ | $-1+0.9\times9=7.1$,两步直接到终点 | 右 |
不加末端价值,$H=1$ 的规划器(planner)只看到走一步要花 1 分,永远看不到那 10 分。加上准确的 $\hat V$,一步规划就做出了长远正确的选择。但 $\hat V$ 在边界上的误差会直接改变决定:低估 2 分,智能体又不动了。把 $H$ 加到 2,真实奖励进入了搜索范围,$\hat V(1)$ 的误差就不再起作用,代价是搜索更多、模型误差累积的步数也更多。
POLO(Lowrey 等,2018)研究的就是这种配合:近似价值函数可以缩短规划时域,局部轨迹(trajectory)优化可以容忍价值函数的误差,并加快价值函数的学习。MuZero 训练价值时用 $n$ 步真实奖励再接搜索给出的价值,是同一个想法放在训练标签上。
把规划器蒸馏成快策略,丢掉了什么
另一种组合:在很多状态上运行规划器,再训练一个策略网络模仿规划器的输出。部署时只需要一次前向计算。Guided Policy Search(Levine & Koltun,2013)用轨迹优化来引导策略搜索、避开差的局部最优;Levine 等(2016)把策略搜索变成监督学习:老师是使用完整状态的轨迹优化器,学生只看原始图像。
省下了部署时的搜索,也丢掉了 3 样东西:
- 现场重规划。 前方突然多了一个障碍,或者奖励改了,规划器能重新算,学生只会做训练时学过的动作。
- 自己走偏后的恢复。 学生每步犯一点小错,就会走到老师从没标注过的状态,错误逐步复合。这和模仿学习里 DAgger 要解决的问题一样。Levine 等的做法是交替训练,让老师的监督逐渐落在学生自己会访问的状态上,收敛时两者行为一致。
- 一致性。 绕过一根柱子,向左绕(动作 $-1$)和向右绕($+1$)一样好,规划器按随机种子有时选左、有时选右。用平方误差训练的学生会学到平均值 0,直直撞上柱子。要么让老师保持一致,要么让学生输出能表示两个峰的分布。
隐式规划:模型只为“让规划算对价值”而学
前面的组合里,模型和规划器是分开训练、分开检查的。另一条路是把规划计算放进网络内部,只用价值或回报(return)目标端到端地训练,模型学成什么样,由“规划时用得上”来决定。
- Value Prediction Network(Oh 等,2017)学一个抽象状态上的动力学,训练它预测未来的价值(折扣奖励之和),而不是未来的观测(observation);论文报告,在几个 Atari 游戏上即使只做很短的前瞻规划,也超过了 DQN。
- TreeQN(Farquhar 等,2017)在网络里递归调用学到的转移函数,展开一棵固定深度的树,用树回传把预测的奖励和价值合成 Q 值;端到端训练让转移函数为“在树里被怎样使用”而优化。
- MuZero 在每个假想步只预测奖励、价值和策略,再用 MCTS 在这些隐藏状态(hidden state)上搜索。
学什么样的模型已经用推箱子说明了代价:这种模型跟当前任务绑定,换个奖励就得重训;隐藏状态不对应可检查的物理状态,规划“想”出来的过程没法逐步对照现实,只能检查预测的奖励和价值准不准。
截至 2026 年 10 月,“先学一个尽量完整的世界模型再规划”和“只学与价值有关的隐式模型”哪条路更好,仍在快速变化,不同领域的结论也不一样。本站的世界模型系列跟踪这部分;本篇里的 MCTS、PUCT 和 AlphaZero 的训练目标则是已经稳定的内容。
模型不只用来规划
探索。 预测误差可以当内在奖励(intrinsic reward):Pathak 等(2017)把好奇心定义为“预测自己动作后果”的误差,并且在一个由逆动力学模型(dynamics model)学出的特征空间里预测,使它忽略那些影响不到智能体的变化。RND 和“随机电视”问题见探索与层级。更进一步是用规划去探索:Plan2Explore(Sekar 等,2020)在学到的世界模型里规划,去寻找预期未来的新奇之处,新奇程度用一组潜在转移模型的预测分歧来衡量;探索时不需要任务奖励,之后再零样本或少样本地适应下游任务。
适应新奖励,或适应新动力学。 有了状态模型,换奖励只是换打分函数:推箱子加了每推一次扣 0.1 分之后,规划器马上能重新比较 $(1,3)$ 和 $(1,4)$,而无模型的 policy 或 Q 必须重新训练。动力学本身变了就不同:模型得先适应。Nagabandi 等(2018)用元学习训练动力学模型的先验,部署时用最近的数据在线调整,再用 MPC 规划;论文报告,一台真实的足式微型机器人在失去一条腿后能在线适应。
当辅助损失。 预测奖励或未来观测,可以只是为了让表示学得更好,预测结果根本不拿来规划。UNREAL(Jaderberg 等,2016)让智能体同时优化多个伪奖励任务,其中包括奖励预测,这些任务共享同一个表示。
几种组合放在一起看
| 组合 | 学什么 | 搜什么 | 部署时每步成本 | 典型失败 |
|---|---|---|---|---|
| Dyna / MBPO | 动力学 + policy 或 Q | 不在线搜,用模型生成训练数据 | 一次 policy 前向 | rollout 太长时,生成的数据带偏 |
| MPC + 学到的模型(如 PETS) | 动力学,可含 ensemble | 每步搜动作序列 | 时域 × 候选(candidate)数次模型调用 | 规划器钻模型漏洞,延迟高 |
| MPC + 末端价值(如 POLO) | 动力学或已知模型 + $V$ | 每步短时域搜索 | 同上,但时域可以短 | 边界上的 $V$ 误差直接改变选择 |
| AlphaZero | 策略和价值网络,规则已知 | MCTS | 每步若干次模拟,每次一次网络评估 | 价值估错时,搜索集中到错的分支;需要准确的模拟器 |
| MuZero | 价值等价模型 + 策略和价值 | 在隐藏状态上做 MCTS | 每次模拟各调用一次动力学和预测函数 | 换任务要重训,隐藏状态难检查 |
| 规划器蒸馏(如 GPS) | 学生策略 | 训练时由规划器搜 | 一次学生前向 | 复合误差,老师不一致被平均,不能现场重规划 |
| 网络内的隐式规划(VPN、TreeQN) | 抽象转移 + 价值 | 网络内部固定深度的展开 | 固定次数的前向 | 只对训练任务有效,展开深度有限 |
| 模型当辅助损失 | 共享表示 | 不搜 | 一次 policy 前向 | 辅助任务和主任务无关时帮不上忙 |
这张表比较的是结构,不是性能排名;PETS 见 Chua 等(2018)。
这里讲到哪里为止
这篇讲组合方式和各自的代价,没有实现完整的 MCTS:多层展开、两人对弈中价值的符号翻转、根节点先验上加的 Dirichlet 噪声等细节,以 AlphaZero 与 MuZero 原文为准。模型本身该学什么,回到学什么样的模型;具体的轨迹优化器,看规划与 LQR;模型误差为什么会被规划放大,看 Model-based 总览。
本页术语 14
- 策略 policy
- 给定状态,规定怎样选动作;可以输出一个动作,也可以输出动作的概率分布
- 回合 episode
- 从初始状态开始的一次交互过程;采样片段结束不一定代表任务真正结束
- 回放 replay
- 用固定输入重新执行一段数据或模型链路,检查结果是否一致
- 奖励 reward
- RL 里指导策略更新的标量信号
- 策略改进 policy improvement
- 根据当前价值估计调整动作选择;精确表格情形的保证不能直接搬到任意近似实现
- 规划器 planner
- 利用模型比较未来动作序列,再选择当前要执行的动作
- 轨迹 trajectory
- 与环境交互得到的一串状态、动作和奖励;采样时也可能只保存其中一段
- 回报 return
- 从某一步开始,把后续奖励按约定累加;有折扣时还要乘上相应的折扣权重
- 观测 observation
- 智能体实际收到的信息,可能只是环境完整状态的一部分
- 隐藏状态 hidden state
- 这里指环境中未直接观测到的真实状态;不要与 RNN 内部的隐藏表示混为一谈
- 内在奖励 intrinsic reward
- 为探索或其他辅助目的添加的反馈,与外部任务奖励分开检查
- 动力学模型 dynamics model
- 预测给定状态和动作后,下一状态或其分布会怎样变化
- 候选 candidate
- 召回阶段捞出来、等待精排挑选的内容
- 蒸馏 distillation
- 用一个模型的输出训练另一个通常更小的模型