跳转到正文

12.1 内在动机与探索

本节导读

核心内容

  • 理解为什么在稀疏奖励任务中,随机探索几乎不可能成功——以《蒙特祖玛的复仇》为例,-greedy 撞到第一个奖励的概率只有 ,这是一个什么概念?
  • 掌握内在奖励的核心思想:在外部奖励到来之前,用"好奇心"给智能体提供学习信号。
  • 理解 ICM(内在好奇心模块)如何用预测误差构造内在奖励,以及它为什么需要一个逆向模型来过滤无关噪声。
  • 理解 RND(随机网络蒸馏)为什么更简单却更鲁棒——不需要动作、不需要逆向模型,还能解决"噪声电视"问题。
  • 了解 NGU 和 Agent57 如何同时管理短期(单回合内)和长期(跨回合)的探索,成为 Atari 57 个游戏上首个超越人类水平的算法。

第 9 章连续控制研究单个智能体怎样在连续动作空间稳定学习,第 10 章离线 RL研究无法继续在线交互时怎样利用固定数据集,第 11 章模仿学习与元强化学习研究没有显式奖励或需要快速适应新任务时的学习方法。本章我们继续放宽经典 MDP 设定,准备面对三个更现实的挑战:奖励可能很久才出现一次(稀疏奖励探索),环境里可能还有其他智能体同时在学习(多智能体),任务甚至可能长到单层策略根本拿不到有效的训练信号(分层强化学习)。

让我们先从第一个挑战开始——稀疏奖励。

你可能会问:前面我们不是已经学过 -greedy、UCB 这些探索方法了吗?为什么还需要专门讲一节探索?

别急,让我们停下来想一个具体的数字。

1. 稀疏奖励为什么需要内在动机

第 2 章的探索和利用问题 已经在无状态的老虎机设定下引入了探索-利用权衡:每个臂的期望回报未知,智能体必须在"拉目前看起来最优的臂"(利用)与"拉还不确定的臂"(探索)之间分配采样预算。那里介绍的 UCB 会使用上置信界:

让我们把这个式子拆开看:

  • :到第 步为止,臂 的平均奖励估计——这是"利用"部分,告诉我们目前哪个臂看起来最好
  • :不确定性惩罚项——拉的次数 越少,这一项越大,鼓励我们去试一试还没怎么拉过的臂
  • :探索系数,控制我们有多大程度愿意为了不确定性而尝试

在老虎机问题里,这个公式工作得很好。但是——当我们进入深度 RL 的高维视觉环境时,问题被放大了成千上万倍。

那个令人绝望的数字:

在 Atari 的《蒙特祖玛的复仇》(Montezuma's Revenge)或《陷阱》(Pitfall!)这类游戏中,智能体从初始状态出发,要拿到第一个奖励,需要执行一连串精确的动作:跳过陷阱、爬上梯子、拿到钥匙、再打开门——大概需要几十个完全正确的步骤。

让我们算一笔账。假设智能体用最简单的 -greedy 探索,每一步随机选动作的概率是 (这已经是相当高的探索率了),每一步有 6 个可选动作,而拿到第一个奖励至少需要 50 步连续正确的选择。

那它靠纯瞎走撞到第一个奖励的概率是多少?

大约是

这个数字到底有多小?让我们具象化感受一下:

  • 宇宙的年龄大约是
  • 地球上的沙子总数大约是
  • 也就是说,智能体从宇宙大爆炸开始每秒探索一次,到今天可能还没碰见过一次奖励!

这就是为什么 DQN 在这些 hard-exploration(困难探索)游戏上的得分长期为零——不是算法不够好,而是随机探索在如此稀疏的奖励面前,从概率上就几乎不可能成功。

困难来自哪里?来自奖励信号过于稀疏。我们形式化一下:设智能体从初始状态 出发,到达第一个奖励状态 至少需要 步。任何只依赖环境奖励 的更新,都要等到第一条成功轨迹出现才能开始学习——而成功轨迹的密度随 增大而指数级下降。

这就引出了内在奖励(intrinsic reward)的核心思想:在到达外部奖励以前,我们自己给智能体制造一些"好奇心信号",鼓励它去访问新颖的、或者难以预测的状态,就像人类婴儿会主动探索周围环境一样——不是为了立刻拿到什么奖励,纯粹是因为"这个东西我没见过,我想看看"。

训练时我们把环境奖励和探索奖励加在一起:

我们把这个式子的每个符号都解释清楚:

  • :环境在第 步给出的外部奖励——也就是游戏定义的分数,可能大部分时候都是 0
  • :智能体自己根据状态新颖度计算的内在奖励——这是我们人为构造的"好奇心"
  • :探索系数,决定内在奖励信号占多大比重
  • :最终用于训练的总奖励

举个具体数值例子:如果外部奖励为 0(还没拿到分),内在奖励计算得 0.4,取 ,那么总奖励就是 。虽然只有 0.04,但这比全是 0 强多了——智能体至少知道"刚才那个地方有点意思"。

但是,内在奖励不能乱给,它需要满足两个关键条件:

  1. 可计算:只依赖已经观测到的数据,不需要额外的外部监督——我们总不能一边训练一边人工标"这个状态新不新颖"
  2. 可耗尽:一个状态被访问足够多次之后,它的内在奖励应该衰减到零。否则智能体会找到某面"新奇的墙",一直站在那里"刷分",再也不去真正完成任务了。

下面两节我们来看两条构造内在奖励的主流路线:基于预测误差的 ICM,与基于随机网络蒸馏的 RND。

2. 用 ICM 的预测误差驱动探索

2.1 从状态预测误差构造内在奖励

Intrinsic Curiosity Module(好奇心模块,Pathak et al. 2017)的核心想法非常直觉:如果我无法预测"做完这个动作之后下一步会发生什么",那就说明这个区域是"陌生"的,值得我多探索探索。预测误差越大,说明我越不了解这个地方,给的内在奖励就越高。

让我们停下来想一下:这个想法很自然,但直接在像素空间做预测行不行?比如直接预测下一帧的 RGB 像素值?

答案是不行——下一帧的像素细节太多了:树叶在晃动、水面有波纹、屏幕角落可能还有个小动画在闪烁……这些都是智能体无法控制、也和任务无关的高频噪声。如果直接在像素空间算预测误差,这些无关噪声会主导误差值,智能体会被吸引去看那些"永远预测不准但毫无意义"的东西。

ICM 很聪明地解决了这个问题:它先用一个逆向模型 学一个特征空间 。这个逆向模型做什么呢?它输入连续两帧 ,预测中间智能体执行了什么动作

你可能会问:为什么要预测动作?这和探索有什么关系?

关键就在这里:只有那些"动作能够影响的变化",才会被保留在特征 里。背景树叶怎么晃、屏幕怎么闪烁——这些东西和智能体的动作无关,逆向模型不需要关心它们,自然就被过滤掉了。留下来的特征,只包含"智能体能控制、能影响"的部分。

把这个过滤机制当成一道题来看更清楚。给逆向模型连续两帧,让它猜"玩家按了哪个键":马里奥向右移动了半格,这直接暴露了"按右";同一时间树叶换了个晃动角度、右上角的分数栏闪了一下——这些变化推不出任何按键。编码器若把树叶、分数栏塞进特征,对逆向模型答题毫无帮助,反而增加负担;于是训练出来的 里,留下的是马里奥位置、地形、敌人位置这类动作能影响的信息。

得到干净的特征 之后,我们再训练一个前向模型 ,根据当前特征和执行的动作,预测下一状态的特征:

符号解释:

  • :当前状态 经过编码器提取的特征
  • :在状态 执行的动作
  • :前向动力学模型,参数为
  • :前向模型预测的下一状态特征

然后,真实特征与预测特征之间的距离,就是我们要的内在奖励:

这就是预测误差的平方,前面的 只是为了求导的时候把 2 约掉,不改变奖励的相对大小。

这个机制为什么符合我们的直觉?

  • 刚进入陌生区域时,前向模型没见过这些状态,预测不准,这个距离就大,内在奖励高——鼓励智能体继续探索
  • 同类状态反复出现后,前向模型慢慢学会了预测,误差越来越小,奖励随之降低——智能体就会去别的地方找新鲜感

训练的时候,我们把策略损失、逆向模型损失、前向模型损失加在一起:

  • :控制两个辅助任务的权重
  • 逆向模型帮助特征提取器 只保留与动作有关的信息
  • 前向模型提供新颖度信号
  • 策略则使用加了内在奖励后的总奖励来更新
python
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 在《超级马里奥兄弟》等连续控制+视觉输入的任务上表现出色:智能体在没有任何外部奖励的情况下,纯粹靠好奇心就能穿过整张地图。但是——你可能已经猜到了——它有一个致命弱点,叫噪声电视问题(noisy TV problem)。

想象一下:如果环境里有一台电视,永远在播放随机雪花。不管智能体做什么,电视画面都是完全随机、无法预测的。那么前向模型永远学不会预测下一帧,内在奖励永远居高不下。结果是什么?智能体会钉在电视前面一动不动,永远看着雪花"刷分",再也不去完成真正的任务了。

有没有办法构造一个更鲁棒、更简单的内在奖励,同时解决噪声电视问题?这就是 RND 要做的事。

3. 用 RND 识别没有访问过的状态

Random Network Distillation(随机网络蒸馏,Burda et al. 2018)走了一条更简单、更巧妙的路。它根本不预测下一帧,甚至不需要知道动作是什么!

RND 的做法出人意料地简单:

  1. 先随机初始化一个目标网络 ,初始化之后就把它冻住,永远不更新
  2. 再训练一个预测网络 ,让它去拟合同一个输入对应的目标网络输出

训练损失是:

然后——最巧妙的地方来了——我们直接把同一个预测误差当作内在奖励:

等等,你可能会问:这是什么魔法?为什么随机初始化一个固定网络,预测它的输出误差就能表示新颖度?

让我们停下来想一下这个机制是怎么工作的:

  • 对于已经访问过很多次的状态:预测网络 在训练中反复见过它们,有充足的机会把这些输入对应的输出拟合好,所以误差通常较小
  • 对于第一次见到的新状态:预测网络从来没在训练中见过它们,自然拟合不好,误差通常较大
  • 目标网络 是固定的随机网络,它不需要表示任何任务语义——它的作用仅仅是"为每个输入提供一个固定的、随机的目标值",就像给每个状态发了一张独一无二的"身份证"

这就好比你在背单词:经常见到的单词你记得很熟(误差小),第一次见到的生词你肯定答不对(误差大)。RND 本质上就是在"记住"哪些状态是见过的,哪些是新的。

RND 相比 ICM 有几个巨大优势:

  • 不需要逆向模型,省掉了一半的计算量
  • 不依赖动作,可以直接叠加到任何 model-free 算法上(PPO、A2C、DQN 都行)
  • 天然抗噪声电视:随机目标网络的复杂度是有限的(它就是一个固定大小的神经网络),即使面对随机噪声,预测误差也有上界,不会被无限推高——智能体看一会儿电视,发现预测网络慢慢能拟合随机输出了,内在奖励就降下来了,它自然就会走开
python
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 游戏上探索出复杂行为;更重要的是,在外部奖励极其稀疏的《蒙特祖玛的复仇》上,RND 首次让智能体突破了零分。

3.1 比较 ICM 与 RND

我们把这两种方法放在一起对比,方便你理解它们各自的适用场景:

维度ICMRND
是否依赖动作是(前向模型需要
需要训练的子模块编码器 + 逆向 + 前向仅预测器
噪声电视鲁棒性
计算开销
代表应用视觉探索(Mario、DMLab)Atari hard-exploration

ICM 和 RND 各自解决了一部分问题,但它们还有一个共同的盲区——你能想到是什么吗?

提示一下:一个状态可能在当前这一回合里是第一次见(短期新颖),但从整个训练过程看,你已经在过去的回合里见过它成千上万次了。ICM 和 RND 的神经网络拟合误差,能区分这两种新颖度吗?

4. 同时管理短期与长期探索

答案是不能。仅凭神经网络的预测误差,我们无法区分"这个回合第一次见"和"训练以来第一次见"。

举个例子:假设你在玩一个游戏,每次回合开始你都会出生在同一个房间。这个房间你已经进过几百次了,从长期看一点都不新颖;但每次回合刚开始,你又确实"刚进入"这个房间。如果内在奖励只给"预测误差",那每次回合开始你都会拿到很高的奖励,但这其实是浪费——你已经知道这个房间了,不需要再探索了。

Never Give Up(NGU,Badia et al. 2020)与后续的 Agent57(Badia et al. 2020)正是通过同时建模短期长期两个时间尺度的探索,成为 Atari 全套 57 个游戏上首个超越人类水平的算法。

4.1 NGU 的双时间尺度内在奖励

NGU 的核心想法很直接:把内在奖励拆成两部分相乘:

我们分别来看这两部分:

短期(episodic / 单回合)部分 :维护一个固定容量的表,记录当前这一回合内访问过的状态特征。对于一个新状态,如果它和表中所有状态的距离都很远(k近邻距离大),说明这个回合内没怎么来过,新颖度高;如果这个回合已经频繁访问过,新颖度就快速衰减。

简化写法是:

让我们解释一下这个式子的各个部分:

  • :参与比较的近邻数量(kNN 中的 k)
  • :表中离当前状态 最近的 个历史状态
  • :当前状态到近邻 的距离——如果这一回合刚来过这里,表里就有一个几乎重合的近邻, 接近 0
  • :控制重复访问带来的衰减速度
  • 直观理解:邻居越近, 越大,分母越大,单回合新颖度就越低

用数字算一遍(取 ):当前状态在表中的最近邻距离 ,新颖度是 ,相当新鲜;如果这回合已经来过这里,最近邻距离缩到 ,新颖度掉到 。同一个地点,回合内第二次出现,内在奖励只剩原来的约七分之一——短期新颖度就是这样在回合内快速耗尽的。

长期(life-long / 跨回合)部分 :这部分直接用 RND,跨回合记录哪些状态在整个训练过程中是真正的新状态。它负责识别"当前回合没访问,但过去回合已经反复访问过"的状态——比如刚才说的每次出生的房间。

两者相乘之后,会发生什么?只有那些既在当前回合没怎么见过,又在整个训练历史上都很少出现的状态,才能获得较高的内在奖励。这就避免了每次回合开始在出生点"刷分"的问题。

4.2 用 Retrace 与分布式 Actor 传播奖励

光有双时间尺度奖励还不够——hard-exploration 游戏的 horizon 还是很长,奖励信号很难传回去。NGU 采用了 R2D2 的分布式架构:多个 actor 并行采样,用 LSTM 处理部分可观测性,再用 Retrace() 算法来稳定地估计 off-policy Q 值,把内在奖励信号传播到很长的决策序列上。

加餐:Retrace 算法的细节

Retrace() 是一种 off-policy 回报估计方法,它通过重要性采样截断来平衡偏差和方差,比普通的 Q() 在 off-policy 场景下更稳定。对于超长 horizon 的任务(比如需要几百步才能拿到奖励),Retrace 能更有效地把奖励信号往回传。NGU 结合了 R2D2 的经验回放和优先级采样,再加上 LSTM 记忆,才能在 Montezuma's Revenge 这类需要长程规划的游戏上成功。整套系统训练成本极高——需要数十亿帧游戏画面、数百个 TPU 核心——但它首次证明了 Atari hard-exploration 游戏是可以被端到端 RL 攻克的。

4.3 Agent57 怎样自适应选择探索强度

NGU 还有一个遗留问题:内在奖励的权重 是固定的。这会带来什么麻烦?

  • 在简单游戏(《Pong》、《Space Invaders》)上,如果 设得太高,智能体会像个好奇宝宝一样到处乱看,就是不好好利用已经学会的最优策略去得分
  • 在 hard-exploration 游戏上,如果 设得太低,智能体又太"功利",探索不足,永远走不到第一个奖励那里

那怎么办?总不能给 57 个游戏每个都单独调 吧?Agent57 用一个很聪明的方法解决了这个问题——自适应策略调度器

  • 维护一族策略 ,每个策略有不同的探索参数 ,参数分布从"纯利用、不探索"一直覆盖到"纯探索、不考虑得分"
  • 用一个 meta-controller(元控制器)在线估计每个策略的相对回报,优先采样表现好的策略来收集数据
  • 训练的时候,所有策略共享同一个 replay buffer 和 Q 网络,数据是通用的

这样一来,我们就不必为每个游戏手动固定一组 了——算法自己会决定什么时候多探索、什么时候多利用。在简单游戏上,它会自动让"利用型"策略多采样;在困难探索游戏上,它会给"探索型"策略更多机会。

Agent57 是第一个在 Atari 57 套件全部游戏上都超过人类基准分数的算法,这说明同一套系统可以同时覆盖需要强探索和需要强利用的两类任务。

本节总结

内在动机为稀疏奖励任务补充了可持续的训练信号,让智能体在外部奖励到来之前就能"好奇地"探索环境。我们回顾一下这条方法线的演进:

  • ICM 使用前向模型的预测误差,通过逆向模型过滤无关噪声,但受限于噪声电视问题
  • RND 使用随机网络蒸馏,更简单、更鲁棒,不依赖动作,天然抗噪声
  • NGU 把单回合的短期新颖度和跨回合的长期新颖度结合起来,解决了重复探索出生点的问题
  • Agent57 更进一步,根据任务表现自适应选择不同强度的探索策略,最终在 Atari 57 全游戏上超越人类

这条方法线显著改善了《蒙特祖玛的复仇》等 hard-exploration 游戏上的表现,也为后续 LLM 智能体的探索提供了基础思路。

但是,我们这一节一直假设环境里只有一个智能体。如果环境里同时有多个智能体在学习——比如你在玩多人对战游戏,队友和对手都在同时更新策略——那会发生什么?对单个智能体来说,环境变成"非平稳"的了:就算你站在同一个状态、做同一个动作,结果也可能因为其他智能体变了而不一样。这就是下一节要解决的问题。

下一节 12.2 多智能体 RL:CTDE、MADDPG、MAPPO 转向多智能体的挑战——当环境里有多个 agent 同时学习时,非平稳性打破了我们熟悉的 MDP 假设。

现代强化学习实战课程