12.3 分层强化学习与世界模型
本节导读
核心内容
- 理解长程任务的困难:为什么上千步的任务用单层策略几乎训不动?奖励信号传太远,被"稀释"了。
- 掌握分层 RL 的核心思想:高层选子目标/option,底层执行原子动作,把长 horizon 切成短 horizon。
- 对比三种经典分层方法:Options 框架的形式化定义、FeUdal Networks 的 Manager-Worker 架构、HIRO 的 off-policy 连续子目标学习。
- 了解生成式世界模型(Dreamer、Genie)如何把环境本身变成学习对象——从互联网视频学游戏引擎,在想象中训练策略。
- 思考探索、多智能体、分层这三类方法如何在世界模型提供的生成环境中重新组合。
上一节 12.2 我们解决了多智能体同时学习时的非平稳性问题,通过 CTDE 范式让多个智能体能协同训练。这一节我们回到单个智能体,但把任务的时间尺度拉长——想象一个家用机器人要完成"打扫整栋房子"的任务,它需要:先去客厅拿吸尘器、再吸卧室、再倒垃圾、最后拖地——这可能需要上千步连续的原子动作。
你可能会问:我们不是已经学过 PPO、SAC、RND 这些方法了吗?直接用它们训不行吗?
让我们停下来想一下折扣因子的问题。假设每一步折扣 (这是常用值),那么 100 步之后的奖励,折到现在值多少?——还剩 37%。那 1000 步之后呢?——只剩万分之四了!最终奖励信号几乎完全被"稀释"了,前面的步骤根本拿不到有效的学习信号。这就是为什么单层策略在长程任务上很难训。
怎么办?分层强化学习给出了一个很自然的答案:像人类做事一样——不要每一步都想"我最终要干嘛",而是先想一个"小目标",专注完成这个小目标,完成之后再想下一个。
1. 用层级缩短长程任务的决策跨度
还是拿《蒙特祖玛的复仇》举例子:智能体需要先拿钥匙、再开门、最后进入下一关。这是一个长程任务,如果直接用 PPO 训练,最终"通关"的奖励很难准确分配到"伸手拿钥匙"这种前面的动作——中间隔了几百步。
分层强化学习(Hierarchical RL, HRL)把决策分解成两层甚至多层:
- 高层策略(High-level policy):不用每一步都决策,每隔 步才输出一次决策——要么选一个"子目标"(subgoal),要么选一个"option"(时间扩展动作)
- 底层策略(Low-level policy):在高层给出的子目标引导下,每一步输出原子动作,直到子目标完成或者超时
这样做有什么好处?高层不需要关心"怎么走到钥匙那里"这种细节——它只需要决定"现在去拿钥匙",然后把这个目标交给底层,底层自己想办法走过去。高层只需要在稀疏的"子目标完成"节点上做决策,把原来长达成百上千步的 horizon,切成了很多个只有 步的短 horizon。梯度信号在每个子层内部都可以有效传播——底层只需要关心"在这 步内到达子目标",高层只需要关心"选哪个子目标能让团队收益最大"。
这就像你写代码:你不会直接写汇编指令——你会先想"我要写一个排序函数",然后在这个函数内部再考虑用什么循环、什么比较。高层是函数调用,底层是具体实现。
2. 比较三种分层强化学习方法
分层思想很直觉,但具体怎么实现?我们来看三个经典的工作:从最早的形式化框架 Options,到端到端可学习的 FeUdal Networks,再到现代 off-policy 方法 HIRO。
2.1 Options:把一段策略封装成时间扩展动作
Sutton, Precup & Singh 1999 年提出的 options 框架是分层 RL 的形式化基础。你可以把一个 option 理解成一个"可以连续执行多步的宏动作"——比如"去门口"就是一个 option,它不是一步动作,而是一整段策略,直到走到门口才终止。
形式化地说,一个 option 由三部分组成:
我们一个一个来看:
- Initiation set(初始集) :哪些状态下可以启动这个 option?比如"去门口"这个 option,你得在房子里才能启动——如果你已经在门外了,就不需要用它了
- Intra-option policy(内部策略) :option 运行期间遵循的策略——也就是"怎么走到门口"的具体策略
- Termination function(终止函数) :到达状态 后,以多大的概率终止这个 option?到了门口,终止概率就接近 1;没到的时候,终止概率接近 0
你可能会问:既然 option 可能连续执行 步,那高层在学习选择 option 的时候,Q 函数应该怎么写?原来的 Q-learning 一次只看一步,现在一步对应 option 里的 步啊。
没错,所以 option 的 Q 函数需要把这 步的奖励都加起来,再接上终止状态的价值:
我们把这个式子拆开:
- :启动 option 时的状态
- :当前选择的 option
- :这个 option 实际执行的步数(可能是随机的,取决于终止函数)
- :option 终止时的状态
- 第一项求和 :option 执行期间获得的所有奖励的折扣和
- 第二项 :option 结束后,从终止状态开始,继续选最优 option 能拿到的未来价值
高层在一个叫 SMDP(Semi-Markov Decision Process,半马尔可夫决策过程)的框架上选择 option——"半"的意思是每一步的时间不再是固定的 1,而是可能持续 步。底层则执行各个 option 的内部策略。
Options 框架很优雅,但它有个实际问题:option 需要预先定义——你得手动告诉系统有哪些 option、什么时候启动、怎么终止。这在复杂环境里很难做到。能不能让系统自己学出 option 来?
2.2 FeUdal Networks:Manager 指方向,Worker 执行动作
FeUdal Networks(封建网络,Vezhnevets et al. 2017)把这个想法推进了一步:它让"高层"和"底层"都是端到端可学习的神经网络,不需要预先定义子目标。
它的架构很像一个封建等级制度(所以叫 FeUdal):
- Manager(领主/高层) :位置比较高,不需要管每一步怎么走,它每隔 步(比如 )输出一个隐藏空间的方向向量 ——注意,它不是直接输出子目标,而是一个"方向",比如"往隐藏空间那个方向走"
- Worker(工人/底层) :真正干活的,在 步窗口内,每一步输出原子动作 ——它的策略被 Manager 给的方向 调制,也就是"朝着领主指的方向走"
你可能会问:Manager 输出一个隐藏空间的方向,怎么知道 Worker 有没有真的往那个方向走?毕竟这是隐藏空间,我们看不到啊。
FeUdal 用了一个很巧妙的辅助损失来训练 Manager。它用一个共享的编码器把每个状态 编码成隐藏表示 ,然后看接下来 步之后,隐藏表示的变化方向是不是和 Manager 给的方向一致:
这个式子看起来有点抽象,我们解释一下:
- :第 步(Manager 做决策时)的隐藏状态表示
- :过了 步之后(下一次 Manager 决策时)的隐藏状态表示
- :这 步里,隐藏状态实际移动的方向向量
- :两个向量的内积——如果两个方向大致相同,内积就是正的,且越大越同向;如果方向相反,内积就是负的
- 前面的负号:我们希望内积越大越好(实际方向和 Manager 指的方向一致),所以最小化负内积就等于最大化内积
用二维的数字算一遍。设 Manager 给的方向 (在隐藏空间里"向右指")。如果接下来 步隐藏表示实际移动了 ,内积是 ,损失 ——方向基本一致,损失小;如果实际移动了 ,内积是 ,损失 ——Worker 往反方向走了,这个方向被强烈否定。
这个辅助目标的作用是什么?它训练 Manager 给出"Worker 实际能够执行"的方向——Manager 不能乱指方向,指了Worker 走不到也没用。任务的外部奖励仍然决定"哪些方向值得选",但这个辅助损失保证了层级之间的"语言"是通的。
FeUdal 在《蒙特祖玛的复仇》等长程任务上展示了分层结构的潜力,但它也暴露了问题:端到端联合训练 Manager 和 Worker 对超参数很敏感,经常训不稳定——Manager 不知道该怎么指方向,Worker 也听不懂 Manager 在说什么。
2.3 HIRO:用异策略数据学习连续子目标
Data-Efficient Hierarchical Reinforcement Learning(HIRO,Nachum et al. 2018)是 FeUdal 的现代化改进,它解决了 FeUdal 的稳定性问题,关键创新是两点:off-policy 训练和目标转移。
HIRO 的设计更直接:
- 高层每 步输出一个连续空间的子目标 ——这次不是隐藏空间方向了,而是直接在状态空间里的位移:"我要你在 步之后,状态相对于现在位移 "
- 底层的内在奖励直接定义为"离目标点还有多远":——目标点是"从当前位置位移 "后应到达的位置,你离它越近,奖励越高;走偏了奖励就低
- 高层用 off-policy 算法(比如 TD3)训练,可以用 replay buffer 里的旧数据,样本效率更高
用坐标数字走一遍。状态是机器人在地面上的位置,高层此刻给子目标 ——"向东移动 10 米"。当前位置是 ,目标点就是 。底层走完一步到 ,离目标点还有 9 米,内在奖励 ;继续走到 ,只剩 1 米,奖励 。底层不需要理解"打扫房子"这种外部任务,它唯一要做的是每一步都离目标点更近;外部奖励则全部记在高层的账上。
HIRO 的代码骨架看起来很清晰:
# HIRO 主循环骨架
for step in range(total_steps):
if step % c == 0:
# 高层每 c 步采样子目标
goal = high_level_policy(state)
# 底层条件策略:给定当前状态和目标,输出动作
a = low_level_policy(state, goal)
s_next, r_ext, done = env.step(a)
# 底层的内在奖励:实际位移离目标位移多远
r_int = -np.linalg.norm(s_next - (state + goal))
low_buffer.add(state, a, r_int, s_next)
if step % c == 0:
# 高层的奖励是这 c 步累积的外部奖励
high_buffer.add(state, goal, ext_reward_sum, s_next_c)
update(low_level_policy, low_buffer)
update(high_level_policy, high_buffer, goal_transition=transition_fn)等等——你可能注意到了一个问题:高层用 off-policy 训练,从 replay buffer 里取出旧数据。但是旧数据里的子目标 是"当时的底层策略"要达到的目标,现在底层策略已经更新了啊!就算底层站在同样的状态、看到同样的子目标 ,它现在的行为也可能和当时不一样了——这就是 off-policy 偏差问题。
HIRO 最关键的技术创新就是目标转移(goal transition)来解决这个问题:当我们从 replay buffer 里取出旧转移 时,我们不直接用旧的 ,而是把它重新映射成一个"新的子目标 "——这个 满足:如果用现在的底层策略从 出发,目标是 ,它最终会到达的终点大致还是 。
加餐:目标转移是怎么工作的
目标转移的具体做法是:我们要找一个新的目标 ,使得在当前底层策略 下,从 出发,目标设为 ,走 步之后的期望到达状态 尽量接近 replay buffer 里实际到达的 。
实践中 HIRO 用一个简单的近似:直接让 ,也就是"这 步实际走了多少位移"——因为底层现在的策略如果足够好,给它"实际走的位移"当目标,它应该能复现这次转移。
这个技巧看起来简单,但非常关键——它让高层的 off-policy 训练变得稳定,因为高层看到的数据都是"用当前底层策略能做到"的,不会因为底层更新了就让旧数据变得"过时"。
2.4 比较 Options、FeUdal 与 HIRO
我们把这三种分层方法放在一起对比:
| 算法 | 高层输出 | 底层目标 | 训练方式 | 主要问题 |
|---|---|---|---|---|
| Options | option id | 固定子策略 | SMDP-Q | 需预设 option |
| FeUdal | 隐藏方向 | worker 内在 | on-policy,端到端 | 训练不稳定 |
| HIRO | 状态位移 | 状态匹配 | off-policy | 目标转移设计 |
2.5 分层 RL 的实际困难
说了这么多好处,你可能会想:分层这么好用,为什么没有成为所有 RL 任务的默认选择?
因为分层结构本身引入了额外的假设和困难:
- 层次划分问题:多少层合适?c 步设多少?子目标空间怎么定义?这些都要手动设计或者调参
- 层级脱节问题:如果高层输出的子目标底层根本执行不了,或者底层干脆学会"忽略"高层的指令(反正自己直接拿外部奖励也行),分层就白建了——Manager 输出无意义的方向,Worker 假装没看见
- 信用分配问题:任务做砸了,到底是高层决策错了,还是底层执行错了?这个 blame assignment 问题在分层结构里更严重
你可能注意到了:现在 LLM Agent 经常显式地写成"先规划、再执行"的流程——比如先让模型写一个计划(ReAct、Plan-and-Solve),然后再一步步执行。为什么不把分层做在神经网络里面,而是显式写成交互流程?原因之一就是:显式的计划和执行记录更容易检查和调试——高层的"子目标"就是自然语言写的计划,我们能看懂,也容易修正。
但无论是把层次放在网络内部还是交互流程中,核心原则都是一样的:要验证子目标是否真的缩短了原任务的决策跨度,是否真的让奖励传播更容易了。
3. 把生成式世界模型作为训练环境
前面的分层方法都假设环境已经存在,我们要做的只是在环境里学习策略。那能不能更进一步——连环境本身也让模型学出来?
这就是生成式世界模型(Generative World Model)的思路:先根据真实数据训练一个模型,让它学会"在状态 s 做动作 a,下一状态是什么"——也就是学会环境的转移动力学;然后策略可以直接在这个模型生成的"想象轨迹"里训练或者规划,不需要每次都和真实环境交互。
3.1 从 Dreamer 到 Genie
我们在 第 9 章 Dreamer V3 已经见过世界模型的一个成功代表:Dreamer 系列先用真实交互数据训一个 RSSM(Recurrent State Space Model)世界模型,然后在模型生成的"想象"轨迹里训练 actor-critic。Dreamer 证明了"在世界模型里训策略"是可行的,甚至在很多任务上比 model-free 方法样本效率更高。
但是 Dreamer 的世界模型还是任务相关的——你在哪个 Atari 游戏上训,它就只能学那个游戏的环境;换一个游戏就得重新训一个世界模型。
Genie(Bruce et al. 2024)把世界模型推到了一个新的阶段——生成式、跨任务的世界模型。给它一段互联网视频或者一张图片,它能学出一个可交互的"游戏引擎":你可以输入动作,模型生成下一帧画面。这意味着什么?
几个革命性的变化:
- 环境数据可以来自互联网视频,不再依赖官方游戏引擎或者物理仿真——YouTube 上有无数人玩游戏的视频,这些都可以当训练数据
- 同一个模型可以生成多个环境,跨任务泛化——你不需要为每个游戏单独训模型了
- RL 训练可以完全在生成环境中进行,不需要真实的物理引擎——想象一下:你在模型生成的《超级马里奥》里训一个智能体,训完了直接放到真实游戏里也能用?
Genie 3 又进了一步,引入了潜在动作(latent action)学习:不需要任何人工标注的动作数据,模型自动从视频中发现"导致下一帧变化的潜在控制变量"。形式化地:
我们解释一下这两个式子:
- :第 帧的视频画面
- :一个模型,看连续两帧画面,自动推断出"从 变到 是因为做了什么潜在动作 "——即使我们从来没有给动作标签
- :给定当前帧 和一个潜在动作 ,预测下一帧会长什么样
- :就是模型学出来的"潜在动作"——它表示视频中导致画面变化的隐藏控制因素
拿一段《超级马里奥》的录像走一遍。模型看到第 100 帧马里奥站在水管前、第 101 帧马里奥跳过了水管——能解释这组变化的潜在动作 ,学到最后大概对应"按跳";两帧之间背景的云朵也在飘,但云的位置变化用任何动作都解释不了,潜在动作模型学会忽略它。解码器则反过来用:给它"马里奥站在水管前"加上"按跳",它生成"马里奥跳过水管"的下一帧。
如果这些潜在动作 能够被稳定控制(不是乱跳的噪声),那我们就可以把 当作智能体的动作空间,再让解码器充当"环境"——智能体输出一个潜在动作,解码器返回下一帧画面,奖励函数另外定义。这样我们甚至可以从"无标注的视频"里学出一个完全可交互的环境!
当然这里还有一个重要的限制没有完全解决:学出来的潜在动作是否对应人类可理解、可执行的真实控制?比如模型会不会把"镜头晃动"也学进动作里?这需要在具体环境中验证。
4. 探索、协作与分层怎样使用生成环境
当我们把世界模型本身变成可生成、可交互的训练环境之后,本章讲的三类方法——探索、多智能体、分层——就可以作用在环境的不同层面上,重新组合:
探索:内在奖励不再需要作用在像素空间,可以直接作用在世界模型的隐藏空间上。你发现了吗?ICM 的前向预测误差,和世界模型本身的状态预测损失,其实结构非常相近——世界模型本来就在做"预测下一状态",那预测误差天然就是一个探索信号。
多智能体:像 Genie 这样的生成模型可以生成包含 NPC(非玩家角色)的复杂环境,多个智能体可以在生成环境里做 self-play(自我博弈),就像 第 26 章 self-play 讲的那样——队友和对手都在生成环境里,不需要人类玩家数据。
分层:高层策略不需要再输出状态空间里的位移作为子目标了,可以直接输出潜在子目标,让世界模型解码成环境状态的变化——这相当于 option 框架的隐式版本,子目标是在世界模型的隐藏空间里定义的。
这些方向共同把世界模型从"预测下一状态的辅助模型",推进到了"提供可交互训练轨迹的基础设施"。当然我们仍然需要保持警惕:要检查生成环境是否遵守真实任务的规则,策略有没有在利用生成模型的漏洞"作弊"——比如模型在某块区域生成的画面有 bug,智能体就卡在那里刷分。后续的 Agent 章节会继续讨论,怎样用工具环境和可执行反馈来替代纯文本或纯生成的模拟。
本章总结
这一章我们讨论了经典单智能体、稠密奖励设定之外的三类重要扩展问题:
奖励稀疏 → 内在奖励:
- ICM 用前向模型的预测误差做好奇心,但需要逆向模型过滤无关噪声,还有噪声电视问题
- RND 用随机网络蒸馏更简单鲁棒,不依赖动作,天然抗噪声电视
- NGU 把单回合 episodic 新颖度和跨回合 RND 长期新颖度结合起来
- Agent57 自适应切换探索-利用强度,是 Atari 57 个游戏上首个全游戏超人类的算法
多智能体非平稳 → CTDE:
- 核心困难是环境非平稳:其他智能体学习会改变转移概率
- CTDE 是最实用范式:训练时 Critic 用全局信息当教练,执行时 Actor 分散决策
- MADDPG 给每个智能体配集中式 Critic,能处理混合合作竞争,但继承了 DDPG 的不稳定
- MAPPO 用共享 Critic + PPO 裁剪更新,实现简单、训练稳定,是 SMAC、Hanabi 等合作任务的常用强基线
长 horizon → 分层:
- 核心思想是把长任务拆成多层:高层选子目标,底层执行原子动作,缩短决策跨度
- Options 框架提供了时间扩展动作的形式化基础
- FeUdal Networks 提出 Manager-Worker 端到端架构,但训练不稳定
- HIRO 用 off-policy 训练和目标转移技巧做连续子目标学习
- 分层方法的实际困难是层次设计和层级脱节问题
这三条路线也为后面的 LLM 强化学习提供了工具和灵感:
- 工具调用可以看作一种时间扩展动作(类似 option)
- 多智能体协作需要处理联合训练与分散执行的平衡
- 世界模型则可以生成可交互的训练环境,减少对真实交互的依赖
下一章 第 13 章 RLHF 训练流水线 我们进入大模型对齐的主线——怎么把人类偏好变成奖励信号,再用 RL 把基础模型训成有用的助手。我们在这一章讲的探索、协作、分层决策的思想,还会在后续的 Agent 章节再次出现,以更大的规模、更有意思的方式组合起来。
延伸阅读
- Pathak et al. 2017 "Curiosity-driven Exploration by Self-Supervised Prediction" (ICM)
- Burda et al. 2018 "Exploration by Random Network Distillation" (RND)
- Badia et al. 2020 "Agent57: Outperforming the Atari Human Benchmark"
- Lowe et al. 2017 "Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments" (MADDPG)
- Yu et al. 2022 "The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games" (MAPPO)
- Vezhnevets et al. 2017 "FeUdal Networks for Hierarchical Reinforcement Learning"
- Nachum et al. 2018 "Data-Efficient Hierarchical Reinforcement Learning" (HIRO)
- Bruce et al. 2024 "Genie: Generative Interactive Environments"