资讯动态

深度强化学习探索策略:从RND到ICM的实战指南

发布时间:2026/10/19 4:57:52 来源:尧图企业网站定制
1. 从“会做题”到“会探索”为什么策略优化之外还需要探索策略很多做深度强化学习的朋友第一次跑通DQN或者PPO的时候都会有一种错觉算法已经能跑起来了reward也在涨那剩下的就是调参和堆算力了。但真正做过几个项目之后你会发现一个RL智能体最终表现的上限往往不是由策略网络多深、优化器多先进决定的而是由它“怎么探索环境”决定的。这就是Exploration Strategies in Deep Reinforcement Learning这个主题真正要解决的问题。简单说探索策略要回答一个核心问题智能体在还没搞清楚环境规则的时候应该怎么选动作才能既拿到足够高的回报又能尽快把环境摸清楚这个问题在稀疏奖励、长序列决策、高维动作空间这三类场景下尤其致命。你如果只依赖策略网络输出的概率分布去采样很容易陷入“局部最优循环”——智能体反复做同一个动作reward一直不涨梯度也几乎为零训练曲线直接躺平。这篇文章适合谁看如果你已经写过至少一个完整的RL训练脚本能看懂Bellman方程和策略梯度但一遇到“训练不收敛”“reward卡住不动”“换了环境就崩”就束手无策那这篇内容就是给你准备的。我会从探索策略的设计思路、核心算法细节、实操落地步骤、常见坑与排查方法四个层面把这件事讲透。全文基于我实际做过的多个仿真环境和实际决策任务的经验不堆公式重点讲“为什么这么设计”和“怎么落地”。2. 探索策略的整体设计思路与方案选型2.1 为什么“随机采样”远远不够最朴素的探索方式就是ε-greedy以一定概率随机选动作其余时间选当前最优动作。这个方法在表格型RL里够用但在深度RL里问题很大。原因有两个第一随机动作在高维动作空间里效率极低比如机械臂控制有7个关节每个关节连续取值随机采样几乎不可能碰到一个有意义的动作组合第二ε-greedy没有记忆它不会根据“哪些区域还没探索过”来调整行为只是机械地按固定概率扰动。我早期做过一个迷宫导航任务状态空间是连续的奖励只在终点给。用ε-greedy跑了50万步智能体还在原地打转。后来换成基于内在奖励的探索方法同样的网络结构20万步就稳定到达终点了。这个对比让我彻底意识到探索策略不是附属品它是决定样本效率的核心模块。2.2 探索策略的三大流派与选型逻辑目前主流的探索策略可以归为三类每类背后对应不同的假设和适用场景。第一类基于不确定性的探索。核心思想是“哪里不确定就去哪里”。代表性方法有基于贝叶斯神经网络的方法、基于集成模型方差的方法如Random Network Distillation, RND。这类方法适合奖励稀疏但状态空间可度量的场景比如Atari游戏里的硬探索关卡。它的优势是理论清晰不确定性可以用方差量化缺点是计算开销大需要维护多个模型或额外网络。第二类基于内在奖励的探索。核心思想是“给自己发奖励”把“遇到新状态”本身当作一种奖励。代表性方法有ICMIntrinsic Curiosity Module、RND、基于计数的方法。这类方法适合奖励极度稀疏的场景比如只有通关才给分的游戏。它的优势是实现相对简单能和任意策略优化算法结合缺点是内在奖励和外在奖励的权重很难调调不好会导致智能体“沉迷探索”而不去完成任务。第三类基于记忆与回放的探索。核心思想是“优先回放那些不常见的经验”。代表性方法是优先经验回放Prioritized Experience Replay, PER的变体以及基于 episodic memory 的方法。这类方法适合环境有明确阶段性的场景比如多回合任务。它的优势是几乎不增加前向计算开销缺点是对连续控制任务效果一般。选型的时候我一般按这个逻辑走先看奖励密度如果奖励密集优先用ε-greedy加噪声如果奖励稀疏上内在奖励如果状态空间有明确的新颖性度量用RND或计数法如果计算资源紧张优先考虑PER类方法。下面这张表是我实际项目中总结的选型对照。场景特征推荐探索策略理由注意事项奖励密集、动作维度低ε-greedy 动作噪声实现简单、开销小噪声方差需要随训练衰减奖励稀疏、状态可度量RND 或 ICM内在奖励驱动探索内外奖励权重需网格搜索奖励稀疏、有明确阶段Episodic Memory利用回合边界需要环境提供回合终止信号高维连续动作参数空间噪声探索在策略参数上做噪声尺度对训练稳定性影响大计算资源受限PER 变体不增加前向开销优先级参数α和β需调2.3 探索与利用的平衡不是固定比例很多人把探索和利用理解成一个固定的比例比如“前10万步多探索后面多利用”。这个理解是错的。真正有效的探索策略是自适应的在训练早期智能体对环境的认知几乎为零探索应该激进随着认知增加探索应该自然衰减但在遇到“意外状态”时探索又应该重新被激活。我习惯用一个“探索预算”的概念来管理这件事。具体做法是给内在奖励一个初始权重β然后根据“最近N步的外在奖励方差”来动态调整β。如果外在奖励方差大说明智能体还在学习有效策略β可以小一点如果外在奖励方差趋近于零说明智能体卡住了β应该增大。这个逻辑在多个任务上实测有效比固定β稳定得多。3. 核心算法细节与实操要点拆解3.1 RND用“预测误差”量化新颖性RNDRandom Network Distillation是我最常用的探索方法之一它的核心思想非常优雅用两个网络一个固定随机初始化的目标网络一个可训练的训练网络让训练网络去预测目标网络的输出。如果当前状态是训练网络见过的预测误差就小如果是没见过的预测误差就大。这个误差就是内在奖励。为什么这个设计有效因为固定网络相当于一个“随机特征映射”它把状态映射到一个高维空间。训练网络在这个空间里做回归。对于训练数据分布内的状态回归误差自然小对于分布外的状态回归误差大。这就把“新颖性”转化成了一个可计算的数值。实操中RND有几个关键细节。第一目标网络的输出维度不能太低一般取64到256维。太低的话不同状态的映射容易撞车新颖性区分度不够太高的话训练网络很难拟合误差噪声大。第二训练网络的更新频率要和策略网络匹配一般每步都更新但学习率要小我常用1e-4到3e-4。第三内在奖励要归一化因为误差的尺度会随训练变化不归一化的话内在奖励会逐渐主导总奖励导致智能体忘记任务目标。下面是我常用的RND内在奖励计算代码片段基于PyTorch风格import torch import torch.nn as nn class RNDModule(nn.Module): def __init__(self, state_dim, hidden_dim256, output_dim128): super().__init__() self.target nn.Sequential( nn.Linear(state_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, output_dim) ) self.predictor nn.Sequential( nn.Linear(state_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, output_dim) ) # 冻结目标网络 for param in self.target.parameters(): param.requires_grad False def forward(self, state): with torch.no_grad(): target_feat self.target(state) pred_feat self.predictor(state) intrinsic_reward ((pred_feat - target_feat) ** 2).mean(dim-1) return intrinsic_reward提示目标网络虽然不训练但它的初始化种子要固定否则每次实验的新颖性度量不一致结果无法复现。3.2 ICM把“好奇心”拆成前向模型和逆向模型ICMIntrinsic Curiosity Module是另一类经典方法它的设计比RND更“心理学”好奇心来源于“预测下一步状态的能力”和“理解动作与状态变化关系的能力”。ICM由两个子模块组成前向模型根据当前状态和动作预测下一状态的特征逆向模型根据当前状态和下一状态预测动作。前向模型的预测误差作为内在奖励逆向模型的误差用来训练特征编码器。为什么要有逆向模型因为如果只用前向模型智能体可能会被“随机噪声”吸引——环境中有些状态转移本身就是随机的前向模型永远预测不准误差一直很大智能体就会一直待在那里。逆向模型的作用是过滤掉那些“与动作无关”的状态变化让特征编码器只关注可控的部分。实操中ICM的难点在于特征空间的维度和学习率。特征维度一般取64到128太小会丢失信息太大会导致前向模型难以训练。学习率我一般设得比策略网络小一个数量级因为ICM的误差会直接影响内在奖励不稳定的话训练会震荡。3.3 内在奖励与外在奖励的融合策略这是探索策略落地时最容易翻车的地方。很多人直接把内在奖励和外在奖励相加结果智能体要么完全忽略任务奖励要么完全忽略探索。正确的做法是分别归一化后再加权并且权重需要动态调整。我常用的融合公式是total_reward extrinsic_reward beta * intrinsic_reward_normalized其中intrinsic_reward_normalized是用运行均值方差归一化后的内在奖励beta是动态权重。beta的调整逻辑是维护一个最近100个回合的外在奖励均值如果这个均值连续20个回合没有提升就把beta乘以1.1如果外在奖励均值在提升就把beta乘以0.99。这样智能体在“学得动”的时候专注任务在“学不动”的时候加大探索。注意归一化内在奖励时不要用全局统计量要用滑动窗口统计量。因为内在奖励的尺度会随训练逐渐减小全局统计量会导致早期归一化过度、后期归一化不足。3.4 探索策略与策略优化算法的耦合方式探索策略不是独立运行的它必须和策略优化算法耦合。耦合方式主要有两种奖励层面耦合和策略层面耦合。奖励层面耦合就是把内在奖励加到总奖励里然后让策略优化算法去最大化这个总奖励。这是RND和ICM的标准做法优点是实现简单能兼容任意策略优化算法缺点是内在奖励会改变最优策略的定义如果权重没调好智能体学到的策略可能偏离任务目标。策略层面耦合是直接修改策略的探索行为比如在动作上加参数化噪声、用最大熵框架如SAC让策略本身保持随机性。这种方式的优点是任务目标不被修改探索是“在策略内部”发生的缺点是探索的多样性受策略表达能力限制。我一般优先用奖励层面耦合因为它更通用。只有在动作空间特别高维、内在奖励很难设计的时候才会考虑策略层面耦合。4. 完整实操流程从零搭建一个带探索策略的训练管道4.1 环境准备与基线搭建在加入探索策略之前必须先有一个能跑通的基线。这个基线不需要表现好但必须能稳定运行、能记录数据、能复现。我一般用以下清单来检查基线是否合格环境接口稳定reset()和step()的返回值格式固定策略网络和值网络能正常前向和反向传播经验回放缓冲区能正常存取训练日志包含每回合的外在奖励、回合长度、策略熵、值函数损失随机种子固定两次运行的结果差异在可接受范围内。基线跑通后先跑一次纯外在奖励的训练记录下“卡住”的位置。这个位置就是探索策略需要发力的地方。比如在某个迷宫任务里基线在平均回报20左右卡住那探索策略的目标就是把这个卡点突破。4.2 探索模块的接入与参数初始化接入RND或ICM时我建议分两步走先只记录内在奖励不把它加到总奖励里观察内在奖励的分布和变化趋势确认内在奖励能区分“新状态”和“旧状态”之后再把它加入总奖励。参数初始化方面RND的目标网络用正交初始化训练网络用默认初始化。ICM的特征编码器用较小的学习率前向和逆向模型的输出层用零初始化偏置。内在奖励的初始权重beta我一般设0.1然后根据训练情况调整。4.3 训练循环中的关键操作与监控指标训练循环里每一步需要做以下几件事从环境中采样动作动作由策略网络输出加探索噪声得到执行动作获得外在奖励和下一状态用探索模块计算内在奖励把内在奖励归一化后加到外在奖励上存入回放缓冲区从回放缓冲区采样批次更新策略网络和值网络更新探索模块的训练网络记录监控指标。监控指标里除了常规的回报和损失我特别关注三个内在奖励的滑动均值、策略熵、状态访问的新颖性比例。内在奖励滑动均值如果持续下降说明探索模块在正常收敛如果一直不降说明训练网络没学好。策略熵如果快速降到零说明策略过早确定化探索不足。新颖性比例是指一个批次里“内在奖励高于阈值”的状态占比这个比例一般应该从高逐渐降低如果一直很高说明智能体一直在探索但没利用。4.4 探索权重的衰减与终止条件探索权重beta不能一直保持高值否则智能体会一直“好奇”而不完成任务。我一般设一个衰减策略当外在奖励的滑动均值连续30个回合没有提升时beta乘以0.95当外在奖励达到基线卡点的1.5倍时beta直接降到初始值的0.1。终止条件一般是外在奖励达到目标值或者训练步数达到上限。提示beta的衰减不要用固定步数要用基于表现的触发条件。因为不同任务的训练速度差异很大固定步数很容易在简单任务上衰减太慢、在困难任务上衰减太快。5. 常见问题与排查技巧实录5.1 训练不收敛、回报震荡的排查思路探索策略引入后训练不收敛是最常见的问题。排查顺序我一般按这个来第一步检查内在奖励的尺度。如果内在奖励的绝对值远大于外在奖励智能体会被探索主导。解决办法是归一化内在奖励并降低beta。第二步检查探索模块的学习率。如果探索模块的学习率太大内在奖励会剧烈波动导致总奖励不稳定。解决办法是把探索模块的学习率降到策略网络的十分之一。第三步检查回放缓冲区的采样策略。如果用了PER优先级参数alpha太大会导致采样偏差过大训练不稳定。解决办法是把alpha从0.6降到0.4。第四步检查策略熵。如果策略熵快速降到零说明探索不足需要增大动作噪声或提高beta。下面这张表是我实际排查中总结的速查表。现象可能原因排查方法解决办法回报震荡大内在奖励尺度不稳定打印内在奖励滑动均值归一化内在奖励降低beta回报长期不涨探索不足或探索过度检查策略熵和状态新颖性比例调整beta或动作噪声训练后期崩溃探索模块过拟合检查探索模块损失降低探索模块学习率增加正则不同种子结果差异大探索模块初始化敏感固定随机种子多次运行用正交初始化固定目标网络种子内存占用持续增长回放缓冲区未限制大小检查缓冲区容量设置固定容量用环形缓冲区5.2 稀疏奖励场景下的探索失效与修复稀疏奖励场景是探索策略的“试金石”。我遇到过的典型失效模式有三种第一种智能体在起点附近反复探索永远走不远。原因是内在奖励在起点附近最高智能体没有动力离开。修复方法是给内在奖励加一个“距离衰减”离起点越远内在奖励的权重越高。第二种智能体探索到终点后不再探索其他区域。原因是终点奖励太高智能体学会了“直奔终点”不再关心其他状态。修复方法是降低外在奖励的即时权重或者用折扣因子让智能体更关注长期回报。第三种智能体在多个房间之间反复穿梭但不完成任务。原因是每个新房间都给内在奖励智能体把“逛房间”当成了任务。修复方法是引入“回合内新颖性衰减”同一个回合内重复访问的状态内在奖励递减。5.3 高维动作空间中的探索效率优化高维连续动作空间里直接加高斯噪声效果很差因为噪声会破坏动作的协调性。我常用的替代方案是参数空间噪声不在动作上加噪声而是在策略网络的参数上加噪声。这样探索是在“策略空间”里进行的采样出来的动作仍然具有协调性。具体做法是给策略网络的每一层权重加一个可学习的高斯噪声噪声的方差作为一个额外参数一起训练。这个方法在MuJoCo类任务上比动作噪声稳定得多但计算开销会大一些因为每次前向传播都要重新采样噪声。另一个技巧是动作维度分组。如果动作维度很高可以把动作分成若干组每组独立加噪声组间保持协调。比如机械臂的7个关节可以分成“肩部3个”和“腕部4个”两组组内噪声相关组间噪声独立。这个技巧在机械臂控制任务上实测能提升30%以上的探索效率。5.4 探索策略的评估与对比方法评估探索策略不能只看最终回报因为最终回报受策略优化算法影响很大。我一般用三个指标来评估探索策略本身第一个状态覆盖率。在离散状态空间里统计智能体访问过的状态占总状态的比例。覆盖率越高探索越充分。第二个首次到达目标所需的步数。这个指标直接反映探索效率。步数越少探索策略越好。第三个内在奖励的收敛速度。内在奖励越快收敛到低值说明探索模块越快“熟悉”环境。对比不同探索策略时要控制变量同样的策略优化算法、同样的网络结构、同样的训练步数、同样的随机种子集合。我一般跑5个种子取均值和标准差避免单次运行的偶然性。6. 探索策略的扩展方向与个人经验6.1 从单智能体到多智能体的探索迁移多智能体场景下的探索比单智能体复杂得多因为每个智能体的探索会影响其他智能体的环境。我做过的一个多智能体协作任务里如果所有智能体都用RND探索它们会互相“抢新颖性”导致内在奖励快速衰减探索失效。解决办法是给每个智能体分配不同的“探索区域”或者不同的随机种子让它们的新颖性度量不重叠。另一个思路是用“社会内在奖励”智能体不仅因为自己遇到新状态而获得奖励还因为“其他智能体遇到了自己没遇到的状态”而获得奖励。这个思路在协作任务里效果不错但实现复杂度高需要维护一个共享的状态访问计数器。6.2 探索策略与离线强化学习的结合离线RL里智能体不能和环境交互只能从固定数据集里学习。这时候探索策略的角色变了它不再是“怎么选动作”而是“怎么从数据集里采样”。我常用的做法是用RND或ICM给数据集里的每个状态算一个“新颖性分数”然后优先采样那些新颖性高的状态。这个方法在多个离线RL基准上都能提升最终表现尤其是当数据集覆盖不充分的时候。注意离线RL里的新颖性分数不能直接用在线RND的目标网络因为目标网络的随机初始化会影响分数。我一般先用数据集预训练目标网络然后再算新颖性。6.3 我在实际项目中的三条经验第一条探索策略不是越复杂越好。我见过很多项目上来就上ICM加RND加PER结果调参调到崩溃。实际上很多任务用简单的ε-greedy加动作噪声就能解决只有在确实卡住的时候才需要上复杂方法。先跑基线再逐步加探索这是最稳的路径。第二条内在奖励的归一化比内在奖励的设计更重要。我试过很多种内在奖励的设计最后发现决定效果的不是设计多巧妙而是归一化做得好不好。滑动窗口归一化加动态权重这两个技巧能解决80%的探索失效问题。第三条探索策略的评估要独立于策略优化。不要用最终回报来评估探索策略因为最终回报受太多因素影响。用状态覆盖率、首次到达步数、内在奖励收敛速度这三个指标能更干净地看出探索策略的好坏。最后再分享一个小技巧如果你不确定该用哪种探索策略可以先跑一个“纯随机”的基线记录状态覆盖率和首次到达步数。然后跑一个“纯贪婪”的基线记录同样的指标。这两个基线的差距就是探索策略需要填补的空间。如果差距很小说明任务本身不需要复杂探索如果差距很大再根据任务特征选探索方法。这个判断方法我用了很多次比盲目试算法靠谱得多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑