第 9 章 连续控制 解决了单智能体在连续动作空间中的样本效率与稳定性问题,第 10 章 离线 RL 解决了"只有历史数据、不能交互"的困难。本章处理三种此前被刻意回避的情形:(1) 环境奖励极度稀疏,ε-greedy 永远撞不到正样本——需要内在动机驱动的探索;(2) 环境里有多个智能体同时学习,非平稳性打破了 MDP 假设——需要 CTDE 范式与集中式 critic;(3) 任务 horizon 极长,单层策略无法跨越子目标——需要分层 RL 把长程决策分解为 option 序列。三者共同指向同一个工程问题:当经典 RL 的假设被破坏后,结构化归纳偏置如何挽回样本效率。
第 3 章的探索和利用问题 已经在无状态设定下引入了探索-利用权衡:每个臂的期望回报未知,智能体必须在"拉目前最优臂"(利用)与"拉不确定臂"(探索)之间分配预算。那里介绍的 UCB 会使用上置信界
深度 RL 把这个问题放大了。在 Atari 的 Montezuma's Revenge 或 Pitfall 中,智能体从初始状态到第一个奖励需要执行几十个有意义的动作(跳过陷阱、拿钥匙、开门),随机探索
问题的本质在于奖励信号的稀疏性。设智能体从
形式上,总奖励变为
其中
- 可计算:只依赖已观测数据,不需要外部监督
- 可耗尽:一个状态被访问够多次后,其内在奖励应衰减到零,避免智能体陷入局部"刷分"
下面两节给出两条主流路线:基于预测误差的 ICM 与基于随机网络蒸馏的 RND。
Intrinsic Curiosity Module(Pathak et al. 2017)的核心想法:如果智能体无法预测自己的下一步状态,说明这个区域是"陌生"的,值得探索。预测误差越大,内在奖励越高。
直接在像素空间做预测是失败的——下一帧的像素细节太多,预测误差会被无关高频噪声主导。ICM 先用一个逆向模型
然后训练前向模型
内在奖励定义为前向预测误差:
整体损失:
class ICM(nn.Module):
def __init__(self, feat_dim=256, action_dim=6):
self.encoder = CNNtoMLP(out=feat_dim) # Φ(s)
self.inverse = nn.Linear(feat_dim * 2, action_dim) # g_φ
self.forward_net = MLP(feat_dim + action_dim, feat_dim)
def intrinsic_reward(self, s, a, s_next):
phi, phi_next = self.encoder(s), self.encoder(s_next)
phi_pred = self.forward_net(torch.cat([phi, a], -1))
return 0.5 * (phi_next - phi_pred).pow(2).sum(-1)
def forward_loss(self, s, a, s_next):
phi, phi_next = self.encoder(s), self.encoder(s_next)
phi_pred = self.forward_net(torch.cat([phi, a], -1))
return F.mse_loss(phi_pred, phi_next.detach()) + \
F.cross_entropy(self.inverse(torch.cat([phi, phi_next], -1)), a)ICM 在 Super Mario Bros 等连续控制 + 视觉输入的任务上让智能体在没有外部奖励的情况下穿过整张地图。它的弱点是噪声电视问题:如果环境中存在不可预测的随机源(屏幕角落的电视随机播雪花),前向模型永远学不会,内在奖励永远居高,智能体会被钉在电视前不动。
Random Network Distillation(Burda et al. 2018)用一个更巧妙的机制规避噪声电视问题。固定一个随机初始化、永不更新的目标网络
机制很简单:已访问过的状态被预测网络学过,预测误差小;新状态没见过,预测误差大。随机目标网络本身没有任何语义,它的作用只是提供一个固定但不可穷尽的学习信号。
RND 的优势:
- 不需要逆向模型,省一半计算
- 不依赖动作,可叠加到任何 model-free 算法上(PPO、A2C)
- 天然抗噪声电视:随机目标的复杂度有限,预测误差有上界,不会被无限推高
class RND(nn.Module):
def __init__(self, obs_shape, feat_dim=512):
# 目标网络:冻结,永不更新
self.target = CNN(obs_shape, feat_dim)
for p in self.target.parameters():
p.requires_grad = False
# 预测网络:训练
self.predictor = CNN(obs_shape, feat_dim)
def intrinsic_reward(self, s):
with torch.no_grad():
target = self.target(s)
pred = self.predictor(s)
return (pred - target).pow(2).sum(-1) # 每个状态一个标量Burda et al. 在大规模实验中发现:仅用 RND 内在奖励(无任何外部奖励),PPO 智能体能在多个 Atari 游戏上探索出复杂行为;在外部奖励稀疏的 Montezuma's Revenge 上首次突破零分。
| 维度 | ICM | RND |
|---|---|---|
| 是否依赖动作 | 是(前向模型需要 |
否 |
| 需要训练的子模块 | 编码器 + 逆向 + 前向 | 仅预测器 |
| 噪声电视鲁棒性 | 弱 | 强 |
| 计算开销 | 高 | 中 |
| 代表应用 | 视觉探索(Mario、DMLab) | Atari hard-exploration |
ICM 和 RND 各自解决了部分问题,但仍有共同的盲区:episodic 记忆缺失。一个状态可能在单条 episode 内是新颖的(短期),但在跨 episode 看已经访问过千万次(长期)。仅凭神经网络拟合的预测误差无法区分这两种新颖度。Never Give Up(Badia et al. 2020)与后续的 Agent57(Badia et al. 2020)通过同时建模这两个时间尺度的探索,成为 Atari 全套 57 个游戏上首个超越人类水平的算法。
NGU 的内在奖励由两部分拼接:
短期(episodic)部分
其中
长期(life-long)部分
NGU 用 R2D2 的分布式架构(多个 actor 并行采样 + LSTM 处理部分可观测性),用 Retrace(
NGU 仍有一个遗留问题:内在奖励权重
- 维护一族策略
$\pi_i$ ,每个有不同的探索参数$(\beta_i, \gamma_i, c_i)$ ,分布在"纯利用"到"纯探索"的区间上 - 用 meta-controller 在线估计每个策略的相对回报,优先采样表现好的策略
- 训练时各策略共享 replay buffer 和 Q 网络
这样无需人工为每个游戏调
内在动机驱动的探索是 hard-exploration 问题的根本解法。从 ICM 的"预测误差作为内在奖励"、RND 的"随机网络蒸馏",到 NGU 的"短期+长期不确定性融合"、Agent57 的"自适应探索-利用平衡"——这条线让 DQN 在 Montezuma's Revenge 等 hard-exploration 游戏上从 0 分提升到超人类水平。
下一节 14.2 多智能体 RL:CTDE、MADDPG、MAPPO 转向另一个挑战——当环境里有多个 agent 同时学习时,非平稳性打破了 MDP 假设。