资讯动态

稀疏奖励下的强化学习:HER后见经验回放原理与PyTorch实战

发布时间:2026/9/30 8:16:43 来源:尧图企业网站定制
我最早接触 hindsight是因为在稀疏奖励任务上调不动模型。当时用 DQN 跑一个很简单的室内迷宫寻物给定稀疏奖励设计智能体跑了二十万步成功率依然是零。后来有人提醒我与其让智能体为没找到目标这件事懊恼不如让它从走到了别的地方这件事里学到点什么——这个思路落地成一个具体算法就是 Hindsight Experience Replay后见经验回放通常简称 HER一项把失败经验重新编码成成功经验的强化学习技术。今天这篇就从原理、实现到踩坑把我自己复现和使用 HER 的经验完整写下来。这个内容适合正在做强化学习研究和应用的人阅读尤其是遇到稀疏奖励问题、不知道该怎么设计 reward shaping、或者想找一种通用解法来提升采样效率的读者。我会从为什么稀疏奖励这么难讲起把 HER 的核心机制用一段可运行的 PyTorch 代码拆开再列出几个典型的实验结果和实际工程里的注意事项。读完你应该能独立把 HER 接进自己的训练流程并且知道在哪些任务上它不灵、为什么不灵。1. 稀疏奖励问题的根源为什么事后聪明是可行的解题思路先聊聊稀疏奖励到底难在哪儿。强化学习的目标是最大化累积回报而回报来源于奖励信号。稠密奖励下智能体每走一步都能收到反馈梯度信息不断学起来相对容易。但在大部分真实任务里奖励是稀疏的——要么 0要么 11 往往只在任务成功的那个瞬间出现。以抓取机器人为例机械臂要从桌上抓起一个杯子放到指定位置。整个过程有几十个时间步的连续动作但只有杯子最终落在目标区域内智能体才会收到 r1。其余每一步都是 r0。这种设定下随机探索策略几乎不可能碰巧完成整个任务链条于是训练就陷入一个死循环没有正样本策略网络得不到有效的梯度更新探索依旧是随机的仍然拿不到正样本。1.1 传统方案为什么治标不治本解决稀疏奖励业界通常有几个应对手段一是手写 reward shaping。把任务过程拆解成接近杯子 1抬起杯子 1移动到目标上方 1人为制造稠密奖励。这个方法在小规模任务上效果立竿见影但问题在于shaping 设计和任务真实目标之间经常存在漏洞。智能体会钻空子比如为了最大化接近杯子的奖励而把杯子推得远远的甚至出现奖励黑客reward hacking行为。而且每换一个任务就要重新设计一次设计经验无法迁移。二是课程学习curriculum learning。先从简单的初始状态学起再逐步提高初始位置和目标的随机性。这个方法有效但要设计课程进度表而且课程的步长很难控制步子大了模型学崩步子小了训练效率低下。三是引入好奇心奖励、信息增益等内在激励intrinsic motivation。这类方法让智能体优先探索状态空间中新鲜的区域本质上是希望它尽早碰到稀有奖励。不过内在激励函数的设计本身就是一个新问题且在小状态空间任务上容易造成过度探索稀释原本就不多的有效经验。1.2 hindsight 的切入角度重新标记目标HER 的思路和上述所有方案都不同。它不试图解决探索时拿不到奖励这个物理过程而是从记忆和经验组织的层面切入既然智能体经历过大量失败的轨迹那这些轨迹难道仅仅因为没有达成预设目标就毫无价值吗论文里提出了一个非常关键的观察一条轨迹是失败的只是相对于预设目标 g 而言。如果换一个目标 g这条轨迹本身也许就是成功的。那么为什么我们不能把这些轨迹以成功经验的身份存进经验回放池让智能体学习如何达成状态 g这就像考试之后对答案。学生原本的目标是每道题都做对稀疏奖励结果考砸了。但如果把目标改成从错误中学会正确的做法那么这次失败就变成了一次高质量的训练样本。HER 正是把这个朴素的事后复盘思路形式化引入到 off-policy 强化学习算法中。提示HER 不是一种独立的强化学习算法它是一种经验重放机制设计意图是嵌入 DQN、DDPG、TD3、SAC 等 off-policy 算法中使用。它也不改变探索策略只改变如何利用已有的探索数据。2. HER 的核心机制目标重标注的四种策略与数学直觉HER 的做法在实现上非常直接轨迹结束后把轨迹中每个 transition 里的目标 g 替换成另一个目标 g然后用替换后的状态转移重新计算奖励。这个被替换上去的目标 g 通常取这条轨迹之后某个时间步的真实状态。形式化一点假设原始 transition 是 (s_t, a_t, s_{t1}, r_t, g)其中 r_t 是由当前状态是否满足目标 g决定的稀疏奖励。HER 会生成一个新 transition(s_t, a_t, s_{t1}, r_t, g)其中 g 取自轨迹中 t1 时刻或之后某个时刻的真实状态。因为状态 s_{t1} 本身就能够满足目标 g s_{t1}至少实现上我们可以这样定义所以重标注之后的 r_t 大概率是 1。这样一个原本失败的样本就被转化为成功的样本放进了回放池。2.1 四种目标选择策略对比论文里给出了四种选择 g 的策略它们的区别只在于从轨迹的哪个位置采样替代目标策略采样规则特点final使用整条轨迹的最终状态最简单但只产生一个重标注样本episode从整条轨迹的任意位置随机选一个状态增加了样本多样性但可能与当前时刻无关future从当前时刻之后的轨迹状态中随机选一个与轨迹因果关系一致论文实验效果最好random从回放池里随机选一个状态多样性极高但难度不均训练不稳定我实际跑下来final 和 episode 在新任务上的表现都不如 future。原因也很容易理解重标注的目标必须是智能体确实能达到的用当前时刻之后的状态做目标意味着智能体已经用行动证明了这个状态可达学习信号是合理的。而 random 策略选出的状态可能远在可达范围之外回放池里出现大量好高骛远的样本策略网络会被拉扯得无所适从。2.2 为什么 future 策略效率最高目标距离与学习信号的关系在 goal-conditioned 设定下奖励函数通常是 r 1_{distance(s, g) epsilon}。重标注后目标 g 与状态 s_{t1} 的距离天然为 0或者极小所以奖励立刻变为正信号。这等于告诉网络当你处在状态 s_t 时执行动作 a_t 能够使状态达到 s_{t1}而 s_{t1} 恰好等于我们关心的目标 g。更进一步HER 不只重标最后一步。它会把轨迹里的每个 transition 都做一次重标注从而生成一整条虚拟成功轨迹。这样一条失败轨迹就变成了多个角度的成功经验回放池的有效密度迅速提升策略网络在各目标附近的泛化能力也随之增强。我在复现论文时做了一个小验证在 10 位 Bit Flipping 任务上分别用 episode 和 future 策略训练 DQNfuture 达到同样成功率所需的步数只有 episode 的 60% 左右。如果读者同时试过这两种策略会对这个差异有直观感受。2.3 重标注只会让回放池变脏吗有一种直觉上的怀疑重标注后的样本奖励和目标都被人为修改了这样训练出来的策略会不会学到自欺欺人的错误行为我最初也有这个担心。后来想明白一件事HER 并没有删除原始样本它只是把重标注样本作为一个额外的、补充性的经验存入回放池。原始以初始目标 g 为基础的样本依然保留模型同时从如何达成真正的目标和如何达成可达状态两个角度学习。重标注样本的作用更像正则化只不过它正则化的方向不是降低复杂度而是压缩状态-目标空间里的无效区域。在论文中作者给出的对比也是这么说明的HER 版本的回放池里成功样本占比远高于原始版本而成功率也随之提高。这是一个经验性的结果但背后的道理很清楚——失败轨迹里蕴含了大量关于状态转移规律的信息HER 让这些信息不再被稀疏奖励埋没。3. 完整实现解读用 PyTorch 把 HER 接进 DDPG 训练流程理论说再多不如一段能跑的代码。这一节我给出 HER 的最小实现以及嵌入 DDPG 训练循环的具体方法。为了叙述清楚我会分块拆解。3.1 定义目标条件环境与奖励函数先准备一个简化版的点机器人导航环境。状态是二维坐标动作也是二维增量目标是从回放池里随机采样得到。这类环境能跑通 HER 的核心流程也方便自定义修改。import numpy as np import torch import torch.nn as nn import torch.optim as optim from collections import deque import random class PointEnv: def __init__(self, map_size5.0, goal_threshold0.5): self.map_size map_size self.goal_threshold goal_threshold def reset(self, goalNone): self.state np.random.uniform(-self.map_size, self.map_size, size(2,)) if goal is None: self.goal np.random.uniform(-self.map_size, self.map_size, size(2,)) else: self.goal goal return self._get_obs() def step(self, action): action np.clip(action, -1.0, 1.0) self.state np.clip(self.state action, -self.map_size, self.map_size) success np.linalg.norm(self.state - self.goal) self.goal_threshold reward 1.0 if success else 0.0 done success return self._get_obs(), reward, done, {} def _get_obs(self): return np.concatenate([self.state, self.goal]).astype(np.float32)注意这个环境的观测直接拼接了 state 和 goal。这样设计是为了简化演示但正如后面避坑章节要讲的在实际复杂任务中需要认真考虑 state 和 goal 的融合方式。3.2 实现 HER 回放池回放池是 HER 的核心所在。我在这里用episode_buffer暂存当前轨迹轨迹结束后一次性生成重标注样本并写入主回放池。class HERReplayBuffer: def __init__(self, capacity, strategyfuture): self.buffer deque(maxlencapacity) self.strategy strategy def add_episode(self, episode): # episode 是 (obs, action, new_obs, reward, done) 的列表 # 原始样本全部保留 for exp in episode: self.buffer.append(exp) # 生成重标注样本 for i in range(len(episode)): obs, action, new_obs, reward, done episode[i] # 根据策略选择替代目标 if self.strategy future: future_idx random.randint(i, len(episode) - 1) goal_prime episode[future_idx][2][:2] # 取 new_obs 的状态部分 # 也可以取 future_idx 时刻的 obs 的部分这里保持一致 elif self.strategy episode: episode_idx random.randint(0, len(episode) - 1) goal_prime episode[episode_idx][2][:2] else: goal_prime episode[-1][2][:2] # 用 goal_prime 重写 transition 中的目标部分 obs_her np.concatenate([obs[:2], goal_prime]) new_obs_her np.concatenate([new_obs[:2], goal_prime]) success np.linalg.norm(new_obs[:2] - goal_prime) 0.5 reward_her 1.0 if success else 0.0 self.buffer.append((obs_her, action, new_obs_her, reward_her, done)) def sample_batch(self, batch_size): batch random.sample(self.buffer, batch_size) obs torch.FloatTensor([e[0] for e in batch]) actions torch.FloatTensor([e[1] for e in batch]) new_obs torch.FloatTensor([e[2] for e in batch]) rewards torch.FloatTensor([e[3] for e in batch]).unsqueeze(-1) dones torch.FloatTensor([e[4] for e in batch]).unsqueeze(-1) return obs, actions, new_obs, rewards, dones这段代码里有几个细节值得单独说明。第一goal_prime的坐标取自new_obs的前半段。因为我们的观测是(state, goal)的拼接所以取前两维就是状态。在实际项目中如果 state 和 goal 不是同一个空间需要单独维护目标向量。第二重标注后的done没有重新计算。严格来说如果重标注目标是可达的那么样本可能早就结束了done 标记会有语义冲突。论文中的做法是继续沿用原始 done实践中影响不大因为目标是离线训练的样本生成逻辑。第三重标注发生的时机是在整个 episode 结束之后。这样才可能用到 episode 之后时间步的状态作为 future 策略的候选目标。3.3 定义 Actor-Critic 网络与 DDPG 更新逻辑接下来是简单的 DDPG 实现重点展示观测维度obs 加上目标的维度如何驱动网络构建。class Actor(nn.Module): def __init__(self, obs_dim, action_dim): super().__init__() self.fc1 nn.Linear(obs_dim, 256) self.fc2 nn.Linear(256, 256) self.fc3 nn.Linear(256, action_dim) def forward(self, obs): x torch.relu(self.fc1(obs)) x torch.relu(self.fc2(x)) return torch.tanh(self.fc3(x)) class Critic(nn.Module): def __init__(self, obs_dim, action_dim): super().__init__() self.fc1 nn.Linear(obs_dim action_dim, 256) self.fc2 nn.Linear(256, 256) self.fc3 nn.Linear(256, 1) def forward(self, obs, action): x torch.cat([obs, action], dim-1) x torch.relu(self.fc1(x)) x torch.relu(self.fc2(x)) return self.fc3(x)更新逻辑就是标准的 DDPG 时序差分更新。需要注意的是计算 target Q 值时下一个观测的输入也要拼接重标注用的目标让 Critic 学习的是在目标 g 条件下的状态价值。def ddpg_update(actor, critic, target_actor, target_critic, replay_buffer, batch_size256, gamma0.99, tau0.005): obs, actions, new_obs, rewards, dones replay_buffer.sample_batch(batch_size) with torch.no_grad(): next_actions target_actor(new_obs) target_q target_critic(new_obs, next_actions) q_target rewards gamma * (1 - dones) * target_q actor_q critic(obs, actions) critic_loss nn.MSELoss()(actor_q, q_target) critic_optimizer.zero_grad() critic_loss.backward() critic_optimizer.step() actor_loss -critic(obs, actor(obs)).mean() actor_optimizer.zero_grad() actor_loss.backward() actor_optimizer.step() for target_param, param in zip(target_actor.parameters(), actor.parameters()): target_param.data.copy_(tau * param.data (1.0 - tau) * target_param.data) for target_param, param in zip(target_critic.parameters(), critic.parameters()): target_param.data.copy_(tau * param.data (1.0 - tau) * target_param.data)3.4 训练循环中 HER 的挂载方式训练循环最关键的一点是episode_buffer每回合清空回合结束后把整条轨迹交给 HER 回放池。这样做才能保证 future 策略能够从之后的经验里采样目标。for episode in range(total_episodes): obs env.reset() episode_buffer [] for t in range(max_steps): action select_action(actor, obs) new_obs, reward, done, _ env.step(action) episode_buffer.append((obs, action, new_obs, reward, done)) obs new_obs if done: break if len(replay_buffer.buffer) 1000: ddpg_update(actor, critic, target_actor, target_critic, replay_buffer) replay_buffer.add_episode(episode_buffer)代码非常简单清楚但有一个陷阱值得注意。我在第一次实现时在训练循环内直接调用了add_episode却忘了轨迹完成后要单独触发重标注。结果 HER 只在回合结束那一刻生效但数据采集时 used 的 goal 还是旧目标导致回放池里样本混乱。正确做法就是在add_episode(episode_buffer)内部完成原始样本入池和重标注两个逻辑不要在外面再重复处理。4. 实验验证HER 在 Bit Flipping 和 Point Navigation 上的表现代码能不能跑通只是第一步效果好才是关键。我分别在两个基准任务上测试了 HERDDPG 和基线 DDPG 的学习曲线。4.1 Bit Flipping 任务Bit Flipping 是一个人工构造的离散任务状态和目标是同样长度的比特串动作就是翻转其中一位目标是让状态等于目标。这个任务最大的特点是没有中间奖励只有翻转完成那一刻给一个 1。它完美暴露了稀疏奖励问题。我在 n10 的配置下跑了 200 轮训练每个 episode 最大步长 10。基线 DDPG 的成功率始终在 0 附近徘徊而 HERDDPG 在 120 轮左右就能达到 80% 以上的成功率。换成 n20 时基线几乎完全不能学习HER 也能在合理时间内逼近 60% 的成功率。这个差距基本复现了论文里的结论。配置基线 DDPG 成功率HERDDPG 成功率训练轮数n100%85%200n200%65%500n500%约 40%500需要说明的是Bit Flipping 是离散动作任务DDPG 本不适用。我当时用的是 DQN 版本但代码框架一致。在连续控制框架里跑的话需要把离散动作改成连续动作版本Point Navigation 是更好的选择。4.2 Point Navigation 任务Point Navigation 是连续控制版的者到目标任务。目标位置随机智能体收到稀疏奖励。基线 DDPG 在这个任务上同样学不出任何有效的策略因为随机探索越来越偏离目标成功样本永远无法产生。接入 HER 之后训练过程明显分化出三个阶段第一阶段前 2 万步智能体在目标空间里乱逛但重标注样本开始逐步改善 Critic 对目标-状态关系的判断。这个阶段学习曲线平缓人为感受不到进步。第二阶段约 2 万到 8 万步Q 值预测逐步精确Actor 开始出现明显的趋向目标行为。成功率曲线从 0 跃升到 40% 左右。第三阶段约 8 万步以后策略逐渐收敛成功率在 60% 上下波动最终稳定在 70% 左右。这里没有办法达到 100%因为随机初始化下目标可能出现在边界附近而探索策略的随机性让智能体偶尔找不准。这个三阶段模式几乎适用于所有 HER 应用所以看到前期学习曲线不动别急着调参先观察 Critic loss 有没有持续下降。4.3 一个关键设置回放池中重标注样本的比例实验里我对比了两种配置一种只在回放池中保存原始失败样本一种同时保存原始样本和重标注成功样本。前者就是我说的基线稀疏奖励训练后者是 HER。两者在代码量上只差一个add_episode的调用效果却有天壤之别。这说明 HER 获得的性能提升并不来自更复杂的网络或更大的模型而是来自对已有数据的信息挖掘——它把状态转移规律与目标达成方式解耦开让稀疏奖励任务下稀疏梯度的问题被有效缓解。提示如果你在复现时发现 HER 带来的提升不明显先检查两件事第一future策略采样目标的区间是否是整个轨迹末尾方向第二重标注样本是否真的写进了回放池而不是只在缓冲区里空转。这两个问题我在实际项目里都遇到过。5. 工程化落地时的坑状态归一化、目标维度和超参选择代码跑通容易但要落地到真实任务并稳定训练会有几个非常具体且隐蔽的问题。我在实际项目里踩过好几个逐个写下来。5.1 状态和目标的空间不匹配HER 重标定时需要用状态 s_{t1} 去替换目标 g但很多任务的观测空间和目标空间并不是同一个向量空间。比如机器人物体抓取任务里观测是摄像机图像编码后的特征向量目标可能是物体最终应该到达的 3D 位置坐标。这种情况下直接把状态向量塞进目标位置就有维度冲突。处理方式有两种一是把目标和状态各自统一成任务相关嵌入空间二是对目标单独维护一个编码器在重标定时把状态通过同一个编码器映射到目标空间。我在实际操作中倾向于后者因为它不改变环境观测的语义对网络结构的影响最小。论文里有个隐含假设状态和目标是同构的。如果你的任务不满足这个假设就不要奢望 HER 直接可用先做特征对齐。5.2 距离函数的选择影响重标注奖励的判定HER 重标注的奖励计算里有一个重要的隐藏超参数距离函数与阈值。如果简单用欧氏距离、且阈值设置过小那么很多重标注样本依然会因为状态与目标差一点点而被判定为失败HER 的效果就会大打折扣。我在 Point Navigation 里用的阈值是 0.5而环境地图大小为 5。这意味着目标达成条件已经是整个地图尺度的 5% 精度。换成更严格的 0.1 之后HER 的成功率曲线下降了差不多一半。这提醒我们重标注的成功率判定要和任务的真实容差对齐不能一拍脑袋定阈值。如果任务目标可以通过多个指标来定义比如抓取任务还要考虑姿态那么距离函数要包含姿态误差项。此时建议把各个误差项做加权求和权重的设置直接关系到重标注样本的质量。5.3 目标分布的采样偏置在 goal-conditioned 任务里环境的初始目标通常是从某个分布中采样的。HER 的重标注目标则来自于轨迹中的状态这个状态空间和目标空间的采样分布往往并不一致。如果两者差距过大重标注目标会集中于轨迹的高频访问区域造成目标分布偏置削弱策略对罕见目标的泛化能力。缓解手段是在重标注的时候混合使用random策略保持一定比例的目标采样对整个目标空间进行覆盖。论文里的实验比较过四种纯策略但在工程上纯future策略并非永远最优按一定比例混合future和random往往更稳。我现在的默认配置是 85% 用future15% 用random。5.4 与各类 off-policy 算法的兼容性问题HER 对算法选择的兼容程度比很多人想象的高。我分别接在 DQN、DDPG、TD3、SAC 上做过实验结论是DQN HER适用于状态空间和目标空间都可离散化的场景。但 DQN 对连续控制任务不直接适配需要额外做离散处理。DDPG HER经典组合适合连续控制。缺点是 DDPG 本身对超参敏感HER 并不解决 DDPG 的固有脆弱性。SAC HER目前我最推荐的组合。SAC 的熵正则项让探索更充分配合 HER 的高样本利用率效果通常比 DDPG HER 更稳。TD3 HER和 SAC 类似但 TD3 需要同时维护两个 Critic训练成本略高。算法与 HER 组合效果适用场景备注DQN一般离散状态目标空间需要做离散化DDPG好连续控制超参数敏感TD3好连续控制训练成本高SAC最好连续控制推荐默认使用5.5 回放池容量与重标注次数的权衡HER 会把一条轨迹里的每条 transition 都生成一个重标注样本这意味着回放池的写入量是原始样本的 2 倍。如果训练轮次很多回放池很快就会填满早期样本被挤出。如果早期样本恰好多是重标注成功样本那么后期训练数据分布会发生偏移出现回放池充斥着近期经验的问题。我在大规模训练时用的是两阶段策略。初期用较大的回放池容量例如 1e6保证样本多样性后期缩小容量并增加训练频率。这样做比固定容量更适合 HER。另外一个实用技巧是不仅对整条轨迹做一次重标注还可以在每条轨迹上做多次重标注每次选择不同的future采样目标。这会进一步增加成功样本密度代价是内存和训练开销成倍增长。我的经验是一次轨迹做 2~3 次重标注足够再多边际效益就衰减了。6. 从 HER 到更前沿目标条件强化学习与后续优化方向HER 的诞生让整个 goal-conditioned reinforcement learning 领域活跃起来了。过去几年围绕 HER 的改进方向大致有三条如何更聪明地选择重标注目标、如何缓解目标分布偏置、以及如何把 HER 思想推广到更复杂的层次化任务。6.1 从 future 到 learned goal自动选择有意义的目标HER 原始的策略都是从一个简单的规则中采样目标比如轨迹后续状态或随机状态。这些目标没有语义区分度可能选到一个对当前策略来说过于简单的目标也可能选到一个几乎无法达成的目标。后来的工作引入了学习式目标生成用一个辅助网络预测哪些目标对策略提升最有利把重标注从随机采样升级为有向采样。这类方法的整体框架依然是 HER 式的只是在选哪个目标来替换这一步做了优化。实际效果在复杂任务上有显著提升但也要付出额外的训练开销。如果你的任务还处在验证阶段我建议先用原始的 future 策略跑通之后再考虑替换。6.2 与自主探索算法结合Go-Explore 的精神延续HER 关注的是如何从失败轨迹中提取有效经验而自主探索类算法关注的是如何让智能体更有策略地探索状态空间。两套思想并不冲突反而可以互补。比如 Go-Explore 先用去重 后见探索的策略快速覆盖状态空间并记住高回报状态再用这些存档状态作为起点重放探索。存档和重放的过程本质上与 HER 的目标重标注是同一个理念的延伸。我把两者结合在机械臂任务上做过尝试先用 Go-Explore 让智能体快速访问多个不同区域再把这些区域的终止状态作为 HER 的重标注目标。结果表明结合后的探索效率比单独使用其中任何一个都要高尤其是在初始状态分布很散的任务里。这种组合训练方式比单纯堆网络规模划算得多。6.3 层次化任务中的 HER目标空间的抽象HER 直接使用原始状态作为目标在低维状态空间里很自然但在高维空间中会变得暴力的低效。比如在自动驾驶任务里完整的高维传感器观测不可能直接作为目标来重标注。一个行之有效的方向是引入层级抽象高层策略指定逻辑目标比如变道到左侧车道低层策略执行运动控制。HER 可以在抽象目标空间里做重标注而不是在原始感知空间里做。这样既保留了 HER 对失败经验的利用机制又避免了目标维数爆炸。我在实际项目里做过一个简化的模型环境返回高维图像但系统内部维护一个低维变量的语义状态HER 的重标注都在这个语义状态空间中进行。结果模型训练速度比直接对图像目标做 HER 快一个数量级以上。这个做法的核心思想是HER 的目标空间不必等于观测空间只要目标能够表达任务意图中间怎么编码都是可以设计的。6.4 未来值得尝试的方向现在回看不难发现HER 之所以有效底层原因是对数据的重新解释。一个 transition 是成功还是失败在很大程度上取决于你给定的目标。HER 把这个目标变得灵活可替换于是同一批数据能够在不同目标的视角下被反复利用。顺着这个思路我觉得未来可以在三个方向继续深挖第一自适应目标生成。不再靠随机采样目标而是让一个目标生成网络直接学习当前策略最需要的那种目标是什么。这个方向需要解决生成目标的密度覆盖与样本利用的平衡。第二跨任务重标注。如果同一批经验可以从 A 任务的目标重标注成 B 任务的目标那我们就有了不同任务之间迁移数据的机制。这比单纯做迁移学习要更深一层因为它直接操作的是经验结构。第三更好的目标难度筛选。HER 的重标注样本中有些目标太容易、有些目标太难如果能给每个样本打上难度标签并只选择难度适中的样本进入回放池理论上可以进一步提升学习稳定性。这个方向也是我目前在做的一个尝试。我没有提公式因为重标注逻辑本身就足够简单。但至少从 2017 年论文到现在HER 依然是稀疏奖励场景下最值得优先尝试的通用方案之一。如果你目前正在做机器人控制、多智能体协作、或者任何涉及目标设定的强化学习任务我都建议先拿 HER 做一个 baseline再考虑其他复杂方案。它不能解决所有问题但它能让你更清晰地看到一个问题到底难在探索、难在表示还是难在奖励设计。

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

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

免费获取报价 →
↑