资讯动态

Hindsight Experience Replay (HER):破解强化学习稀疏奖励难题的实战指南

发布时间:2026/10/1 1:07:36 来源:尧图企业网站定制
1. 项目概述从事后诸葛到强化学习的关键思路Hindsight直译过来就是后见之明我们平时总说事后诸葛亮怎么怎么样带着一点贬义。但在我做强化学习项目的这几年里这个词反而成了我解决一大类难题的救命稻草。我说的不是那种感叹早知道当初就怎样怎样的日常后悔而是强化学习领域里一个非常经典且实用的算法思想——Hindsight Experience Replay通常简称 HER。这个项目的核心要解决的问题是所有做强化学习的人都会撞上的一堵墙稀疏奖励。简单说就是智能体在环境里折腾了半天得到的奖励几乎全是零只有最后完成某一个非常精确的目标时才会拿到一个正反馈。比如让机械臂把积木推到桌面上的某个固定点推歪了没奖励没推到位没奖励只有恰好推到目标点才算成功。这种环境下智能体一开始就是纯瞎试大部分时间都在做无用功连一次成功经验都攒不出来梯度信号基本为零训练根本推不动。HER 的思路乍一听有点作弊的味道既然当前这个目标太难那我不如换个视角把这次失败尝试里实际达到的状态当作目标重新讲一遍这个故事。比如机械臂没把积木推到指定点但推到了旁边另一个位置那好我就假装本来就打算把积木推到那个旁边位置——这次尝试从彻底失败变成了完美成功。用这种手段我们能把失败的轨迹重新包装成高价值的学习样本告诉智能体看这种朝着目标走的轨迹其实能拿到奖励下次往这个方向使劲是对的。我在跑机械臂相关的仿真实验时用了这个思路后训练效率提升非常明显。某些原本怎么训都学不会的稀疏奖励任务加入 HER 之后几百个 episode 就能看到明显的策略改善。这篇文章我会从原理开始讲把它拆成代码级的实现要点再把我在实操里踩过的坑和调参经验一起分享出来。不管你是刚接触强化学习的新手还是已经被稀疏奖励折磨到想摔键盘的老手这个思路都值得你花一下午吃透。2. 核心思想拆解为什么重新定义目标能解决稀疏奖励2.1 稀疏奖励到底难在哪里要理解 HER 的价值首先得搞清楚稀疏奖励问题为什么这么顽固。在密集奖励环境里比如让智能体学会走路每一步都有关于速度、姿态、平衡的连续反馈智能体每走一步都能感知到这样走比那样走要好一点这等于每时每刻都有人告诉你方向对不对。而在稀疏奖励环境里反馈几乎完全是沉默的。拿我最早跑的一个二维点机器人实验举例。目标任务是从起点移动到地图上的一个固定坐标点只有进入目标点周围很小的一个范围才算成功奖励为 1其余所有时间奖励都是 0。智能体一开始的策略是随机的它的行为轨迹就是一条乱七八糟的布朗运动碰巧走到目标点的概率极低。在 100 万个时间步里成功 episode 一只手数得过来甚至一次都没有。没有成功样本Replay Buffer 里存的全是零奖励体验值函数网络也好、策略网络也好都是靠这些数据在做梯度更新。零奖励数据之间几乎是无法区分的网络根本学不到任何有区分度的信息最后表现为 loss 震荡、训练曲线平平、智能体永远在当时原地打转。这就是为什么很多人在跑这类任务时会觉得模型根本没在学——不是模型坏了是数据里根本没有可学的正面信号。2.2 HER 的灵感来源用失败讲一个成功的故事HER 的核心洞察其实来自一个非常朴素的生活经验如果你没达成原来的目标那你达成的那个结果本身就可以当作一个新目标。比如你本来想走到地铁站 A结果误打误撞走到了一个街边的便利店站在便利店门口你其实完成了一次从起点走到便利店的完整轨迹。如果把任务改成走到便利店你刚刚这段路就是一次完美的成功示范。在强化学习里这个想法落地成了一套非常优雅的数据改写机制。具体来说对于一个 episode我们本来存的是这样一组数据观测状态、动作、下一观测状态、奖励以及这一条轨迹原本要达成的目标。HER 做的事情就是在存储这些经验之前把目标这一项替换成这条轨迹上某个后续时刻实际达到的状态。这样一来原来那条失败轨迹就被重新标注成了成功轨迹。上一秒网络还在对着一条全零奖励的轨迹发愁下一秒这条轨迹的奖励就变成了 1而且它还带着明确的谁朝着这个目标走了、每一步做了什么的完整信息。网络再去学这个样本时就能提取出非常明确的梯度信号沿着这个方向的行动序列是能够导致目标达成的。这个改写的计算开销几乎可以忽略不计因为不需要再和环境交互不需要额外的仿真就是在已有的经验数据上做一次换标签。这也让 HER 成了 off-policy 强化学习算法天然的搭档尤其是 DDPG、SAC、TD3 这些本身就依赖经验回放池的算法只需在存储经验时多写几行改写逻辑整个训练过程就能被彻底激活。2.3 用一个机械臂任务讲清楚数据改写流程为了把上面的逻辑讲明白我用一个更具体的场景来演示。假设我们在跑一个 FetchReach 任务一个七自由度机械臂需要把末端执行器移动到一个目标位置。目标是一个三维坐标向量观测里包含了当前末端位置、目标位置和几个关节状态。如果末端位置和目标位置的距离小于某个阈值奖励为 0否则奖励为 -1。这算是稀疏奖励里比较温和的设置但已经足以让普通 DDPG 完全学不动。假设在某一个 episode 里智能体从初始位置出发目标点是 (1.0, 0.0, 0.5)但整条轨迹走下来它最终停在了 (0.8, 0.1, 0.4)这显然没达到成功阈值所以每个时间步的即时奖励都是 -1最后的 episode 总回报是负的。按常规流程这条轨迹进入经验回放池后每条经验都是这样存储的当前状态、动作、奖励、下一状态、原目标。而在 HER 框架下我们会从这条轨迹里挑一个事后目标。最简单的策略是选轨迹的最后一个状态也就是机械臂最终到达的位置 (0.8, 0.1, 0.4)。然后我们把这条轨迹的目标字段全部替换成这个事后目标再重新计算每一条经验的奖励。这时候神奇的事情发生了这条轨迹最后一步的末端位置正好等于事后目标距离为 0小于阈值所以最后一步的奖励变成了 0而不是 -1。前几步虽然仍然是 -1但整条轨迹看起来形成了一次离目标越来越近、最终到达目标的有效尝试。对网络来说这个样本明确传达了一个信息从初始位置出发执行这串动作可以把机械臂末端朝 (0.8, 0.1, 0.4) 这个方向推进一大截。这就是一个高质量的学习信号。3. 算法细节与实现要点如何才能高效地伪造成功经验3.1 四种事后目标采样策略的对比HER 的论文里提出了几种从轨迹中采样事后目标的策略我实际用过之后要提醒一句它们之间的效果差距相当大而且跟具体任务有很强的关联。我逐个说说我的使用感受。final 策略是最简单粗暴的直接用每条轨迹的最后一个状态作为事后目标。这个策略的优点是不用调参、不用额外计算在很多任务上已经足够好用。我在 FetchReach 和 FetchPush 上都用这个策略拿到了不错的结果。它的缺点是对长轨迹不友好如果一条轨迹特别长早期时间步的状态和最终状态差距非常大训练时可能产生一些方差过大的更新。future 策略是从当前时间步之后的时间点里随机采样一个状态作为事后目标。这个策略有个很重要的特性因为目标是在当前时间步之后的状态中采的所以它天然保证了从当前时间步开始朝着这个事后目标推进是有一条实际可行的后续路径的。这种一致性让学习出来的 Q 值更稳定。论文里 future 策略配合一个参数 K每个轨迹额外保存的经验条数通常表现最好我自己实验做下来也确实是这么回事。episode 策略是从当前 episode 的所有状态里随机采样不管是在当前时间步之前还是之后。这个策略比 future 更激进因为采到的目标可能出现在当前时间步之前意味着智能体已经路过了那个目标但现在又离开了这种经验仍然能提供信息但可信度不如 future。random 策略则完全脱离当前轨迹从历史所有 episode 的状态池里采样一个目标来改写当前轨迹。这个策略通常会引入太多噪声我在大多数任务里都发现它拖慢了训练速度。我用一个表格来直观对比这四种策略策略采样范围目标与当前轨迹的一致性我的实测效果排名final轨迹最后一个状态高★★★☆future当前时间步之后的状态很高★★★★episode整个轨迹任意状态中★★★random历史所有状态池低★★3.2 核心代码逻辑HER 的数据改写是怎么实现的纸上谈兵没意思我直接把 HER 在 DDPG 里最核心的那段改写逻辑用 Python 写出来给大家看。这里假设我们已经用某种策略采样好了一条 episode 的完整数据包括每一时间步的观测、动作、奖励和目标。我用的是收集整个 episode 再统一处理的方式这样逻辑上比较好理解。import numpy as np def her_process_episode(episode_data, future_k4, strategyfuture, success_threshold0.05): episode_data 是一个列表每个元素是 (obs, action, reward, done, goal, achieved_goal) obs 里包含 achieved_goal 和 goal 的信息这里为了直观单独提取出来 her_samples [] episode_len len(episode_data) for t in range(episode_len - 1): obs_t, action_t, reward_t, done_t, goal_t, achieved_t episode_data[t] obs_tp1, _, _, _, _, achieved_tp1 episode_data[t 1] # 原始经验也保留不能完全用改写数据替代真实交互 her_samples.append((obs_t, action_t, reward_t, obs_tp1, goal_t)) # 根据策略采样事后目标 if strategy final: future_goals [episode_data[-1][5]] elif strategy future: future_indices np.random.randint(t 1, episode_len, sizefuture_k) future_goals [episode_data[idx][5] for idx in future_indices] elif strategy episode: future_indices np.random.randint(0, episode_len, sizefuture_k) future_goals [episode_data[idx][5] for idx in future_indices] else: future_goals [] for future_goal in future_goals: # 用事后目标重新计算奖励关键一步 new_reward -1.0 if np.linalg.norm(achieved_tp1 - future_goal) success_threshold: new_reward 0.0 # 重新拼接包含新目标的观测向量 new_obs replace_goal_in_obs(obs_t, future_goal) new_obs_tp1 replace_goal_in_obs(obs_tp1, future_goal) her_samples.append((new_obs, action_t, new_reward, new_obs_tp1, future_goal)) return her_samples这段代码里有个非常容易被新手忽略的点原始经验必须保留。我见过一些人实现 HER 时直接把所有经验都改写成事后目标版本这会导致一个很严重的问题智能体从头到尾都没有见过真实的奖励信号它学到的是一个完全建立在事后诸葛逻辑上的世界模型等它真要去做原始目标时反而会犯错。我建议原始经验和 HER 改写经验的比例保持在 1:1 左右也就是说每条真实经验都配 1 到 4 条改写经验但不能只留改写经验。另外replace_goal_in_obs这个函数是根据具体环境的状态空间结构来写的。如果观测向量里目标信息是拼接在后面的那直接切片替换就行如果目标贯穿了整个观测结构那就需要更细致地处理。写代码时最稳妥的做法是先打印一下环境 reset 之后返回的观测到底是什么结构亲眼确认目标字段的位置再写替换逻辑别凭感觉。3.3 HER 与 Off-Policy 算法的配合逻辑HER 从原理上就必须配合 off-policy 的算法使用理由很简单它要求我们从经验回放池中反复采样历史数据来训练也就是经验可以重复利用多次。on-policy 算法像 PPO每一次梯度更新之后采集的经验就作废了必须重新和环境交互生成新数据HER 改写出来的大量历史经验根本没有被反复学习的机会价值大打折扣。DDPG 和 SAC 是我用得最多的两个搭配。DDPG 是确定性策略输出的是一个确定动作配合 HER 之后在机械臂控制这类连续动作任务上收敛速度非常快SAC 是随机策略额外引入了熵正则项探索能力更强在更复杂的任务上稳定性更好。如果你是在自己的项目里做选型我的建议很简单目标是单点到达类任务用 DDPG HER目标是操作类、移动类或者对探索要求比较高的任务用 SAC HER。从数据集层面来看HER 的加入等于让经验回放池里的样本从稀疏奖励的绝望数据变成了充满成功示范的高质量数据。Q 函数拟合时能频繁看到从某个状态出发沿着某条动作序列最终达成目标的正样本价值分布学得又快又准。策略网络再根据 Q 函数做梯度上升时就能顺着这些高质量梯度飞速迭代。整个训练循环从此转起来了。4. 实操过程与关键参数调优我在机械臂仿真实验中的完整记录4.1 实验环境搭建与基线对比先说一下我搭建这套实验的环境配置。我用的是 MuJoCo 物理引擎配合 OpenAI Gym 环境接口开发的 FetchReach 和 FetchPush 两个任务。算法框架是自己用 PyTorch 手写的 DDPG 和 SAC这样方便在训练过程中随时修改网络结构和参数不会被高层封装挡住。动手做 HER 之前我先把基线跑了一遍在不加 HER 的情况下用标准 DDPG 训练 FetchReach。不出所料训练结果非常难看。400 个 episode 过去成功率曲线一直在 0% 附近徘徊偶尔蹦出一个成功样本下一轮又跌回去。我把网络的 loss、Q 值预测都打印出来看Q 值一直在一个很窄的范围内波动完全学不出有意义的价值区分。这个结果基本就是稀疏奖励环境的标配症状。然后我在完全相同的参数设置下加入 HER用的是 future 策略future_k 取 4。这一次训练曲线出现了肉眼可见的变化。前 50 个 episode 还在摸索之后成功率逐渐爬升200 个 episode 左右已经到了 80%400 个 episode 时基本稳定在 95% 以上。同样一套代码只改了一个存储逻辑训练效率和最终性能完全是两个世界。FetchPush 这个任务比 FetchReach 要难因为它不只是把末端移动到目标点而是要通过机械臂把一个小方块推到目标位置。这个任务里HER 的效果仍然显著但收敛速度明显比 FetchReach 慢最终成功率稳定在 70% 左右。我发现原因在于任务本身存在的多解性——同一个目标可能有多种推动方式而未来采样策略有时会把一些极端轨迹也当作成功经验加进来带来一定噪声。4.2 关键参数的设置逻辑和实验数据我整理了自己在调参过程中反复验证过的几组关键参数给出我最终采用的值和理由。需要注意的是这些参数是为 Fetch 系列机械臂任务调的如果你的任务是其他类型基础设定可以照搬但更敏感的系数仍然需要重新搜索。目标采样个数 future_k论文推荐 4我实测发现这个值跟任务复杂度和计算资源密切相关。FetchReach 这种简单任务future_k 取 1 到 4 之间都看不出明显差别FetchPush 这种任务取 4 有明显优势取 8 略有提升但训练时间几乎翻倍。我的最终建议是先从 4 开始如果训练稳定性和成功率都很理想就别往上加了。这个参数直接影响经验回放池的容量占用因为每增加一条 HER 改写经验就相当于多存了一条完整轨迹数据。奖励函数设计我使用的是二值稀疏奖励成功给 0失败给 -1。很多教程会建议用距离的负值作为奖励函数比如reward -distance这么做在密集奖励环境下确实有效但在 HER 场景下反而会引入新的问题。事后目标跟实际到达状态之间距离很近时距离奖励会非常接近 0和真实成功奖励难以区分价值函数的学习反而变得不稳定。我做了一系列对比实验二值奖励在 HER 下的整体表现优于距离奖励训练的方差更小。目标成功阈值FetchReach 里目标阈值被我设定为 0.05也就是末端位置和目标点的欧氏距离小于 0.05 就算成功。这个值不能设得太大否则假成功太多智能体学到的策略精度会很差也不能设得太小否则在一次训练前期极难采样到真正的成功样本HER 的改写奖励也全部是失败的等于没有激活。我用 0.03 和 0.1 也分别跑过实验0.03 时成功率明显偏低0.1 时虽然训练曲线更平滑但最终策略的控制精度比较差。最终 0.05 是性价比最高的。网络结构我用的 DDPG 网络是三层全连接隐藏层维度分别是 256、256、128激活函数 ReLU。这个容量在机械臂任务上完全够用。网络结构更大并不能直接提升 HER 的效果反而是经验数据的质量和多样性对结果影响更大。我试过把隐藏层加到 512 和 1024训练更慢最终性能没有显著提升。我把最关键的几组实验对照结果整理成了表格参数组合FetchReach 成功率FetchPush 成功率备注final 策略, K178%51%训练速度快但精度一般future 策略, K182%58%推荐起步配置future 策略, K495%70%综合最优配置episode 策略, K485%62%中规中矩距离奖励 future K488%60%训练波动比较大这组数据里的一个明显规律是future 策略配合适中的 K 值始终占据优势。用 K4 时成功率提升效果最为显著但用更大的 K 时边际收益会递减。如果你在跑自己的实验时遇到成功率卡住不动的情况我会建议先检查奖励的稀疏程度再检查未来目标采样时选择的 K 大小。4.3 训练稳定性与调参路上常见的隐性陷阱除了上面这些明面上的参数还有一些隐性选择对训练结果影响非常大但这些在教科書里没人讲。我在做项目时第一个撞上的隐形选择是 HER 改写经验的奖励计算时机。有些实现会在采样事后目标时把轨迹上每一个时间步的奖励都重新算一遍而有些实现只算被选中的那个时间点的奖励其他时间步沿用原来的奖励。我一开始采用后者结果训练很不稳大量经验的状态和奖励对不上Q 值网络学到了内部矛盾的信息。正确做法应该是一旦选定了一个事后目标就必须把整条轨迹上所有目标相关的时间步的奖励全部重新计算保证轨迹和目标保持一致。第二个隐性陷阱是目标替换后观测的一致性。我们存进经验回放池的是完整观测向量里面包含着目标信息。HER 改写之后如果只是改了奖励和目标字段但观测向量里的目标还是旧的网络在看到状态和新目标不匹配的数据时会产生严重的理解偏差。我在代码里专门写了一个函数保证新观测向量中的目标字段被完整替换并且通过单元测试验证过。这种细节看起来低级但实际出问题时排查起来很费劲。第三个陷阱是策略网络的过拟合风险。HER 效果太好可能会让你手头的正样本比例变得特别高。比如整个回放池里有 80% 都是改写出来的成功经验真实交互中却很少成功这样策略网络容易倾向于输出那些在改写目标下看似成功的动作一旦实际目标回到原始任务策略就失灵了。我在 FetchPush 上观察到了这个现象训练后期成功率曲线不再增长反而略有回落。解决办法是控制 HER 经验在回放池里的比例我通常会把 HER 改写经验的数量控制在总样本数的 50% 到 70% 之间如果出现上述情况就降低改写经验的数量。经验回放池的容量也对 HER 的效果有直接影响。HER 的思路是经验越多改写的基础越丰富所以回放池应该调得比平时大一些。我在 DDPG 中把回放池容量设为 100 万条和论文的设置一致。如果你用的回放池只有 10 万条那么旧的 HER 经验很快会被挤出去学习信号就跟着消失了。另外有个小技巧要和你们分享在训练早期也就是前 50 个 episode 里我通常不会让 HER 完全生效。具体做法是先正常和环境交互积累一些原始经验再逐步加入 HER 改写经验。这样一来网络先学到一个基本的动态模型再开始接触大量事后诸葛样本训练会稳很多。这个方法我在做 FetchPush 时效果特别明显。5. 常见问题与排查技巧实录我踩过的坑和解决方法5.1 训练曲线完全不动怎么办如果你的训练曲线在几百个 episode 之后还是平坦的直线成功率一直为 0那大概率是 HER 没有真正生效。我排查这个问题时有一套固定的步骤。第一步是检查经验回放池里是否存在奖励被改写过的样本。可以通过在存储时打印日志的方式验证比如每存 1000 条经验输出一次非零奖励的比例。如果比例始终为 0说明你的事后目标采样和奖励重计算逻辑有 bug。第二步是检查目标替换后的观测是否真的被写入了新的目标。我遇到过一种情况环境本身对观测的处理是深拷贝而我只修改了外层的数组引用导致实际存储的经验里目标字段还是旧的。建议在训练脚本里单独写一个测试用例手动构造一条轨迹跑一遍 HER 改写流程对比改写前后观测向量中目标字段的变化。这种问题用单测拦下来能帮你省掉整整一下午的调试时间。第三步是检查 Q 值的输出范围。把 Q 函数在随机采样状态上的输出打印出来。如果 Q 值一直在负值区间浮动且方差极小说明网络正在对所有样本一视同仁价值函数没有学到区分度。这时候问题可能出在奖励信号的尺度上而不是网络结构上。HER 依赖的那部分样本如果占比太低正样本淹没在负样本的汪洋里Q 学习同样会学不到东西。如果你检查下来发现这几项都没有问题那就要看看是不是任务定义本身的问题了。目标空间如果设计得太狭窄比如一个机械臂只能在 1 毫米范围内成功那事后目标的改写频率也会非常低。我遇到过一个类似的任务成功阈值比观测精度还小HER 根本不可能获得非零奖励的改写样本。把成功阈值放大到和观测噪声一个量级问题就解决了。5.2 训练收敛了但最终精度不够高这个问题的典型症状是成功率曲线涨到一定水平后就不动了比如一直卡在 85% 左右上不去。我遇到的情况是假成功样本太多造成的——事后目标采样时选了一些几乎接近成功的状态被当成了完美成功但实际策略离真正完成任务还差得远。随着训练的进行这种低质量目标会拖累整个价值函数的质量。解决方法有两个方向。一是降低 HER 改写经验在总样本中的占比让网络更多地从真实经验中学习。二是提高成功阈值让它更严格一些。但这里有一个矛盾阈值太严格前期真正的成功样本就少了。我的做法是动态调整阈值训练早期设得宽松一点让 HER 尽快积累大量改写成功样本训练中后期逐步收紧阈值逼策略往高精度方向优化。还有一种情况是目标采样策略太单一。final 策略虽然稳定但每个 episode 只能提供一条完整故事线改写经验的多样性远远不够。换成 future 策略并适当调大 future_k通常能让成功率再上一个台阶。我自己的 FetchPush 项目就从 final 换成 future 之后成功率从 51% 涨到了 70%。5.3 计算资源不足时怎么优化HER 本身的计算开销很小但它会让经验回放池中的数据量成倍增加这就带来了额外的存储和采样压力。尤其是当你用 future_k8 时一条真实轨迹会额外生成 8 条改写轨迹回放池增长飞快显存和内存双双报警。我实际用过两个有效的优化手段。第一个是按需生成不要一次性把所有 HER 经验全部生成并存储而是在采样时实时生成。训练时从回放池里随机采样一条真实经验临时采样一个事后目标并计算改写奖励用完就扔。这样内存占用和 future_k 完全解耦缺点是要在训练循环里多加几步计算CPU 压力会稍微高一些。第二个优化手段是降低经验回放池容量从 100 万降到 50 万训练效果差距不大但内存占用直接减半。如果你的任务比较轻量比如二维点机器人或小规模导航任务其实不需要把 HER 和 DDPG 全部用上。直接用一个小型的 DQN HER 组合就足够解决。我在初学阶段就是这么练手的效果直观且调试快。5.4 常见问题速查表我把实操中遇到的问题和对应的排查方案整理成了一个速查表供你直接把这份经验备份带走用。现象可能原因排查方向训练曲线完全不动HER 未生效 / 目标替换 bug打印回放池中非零奖励比例单测目标替换逻辑训练后期成功率回落HER 经验比例过高策略过拟合降低改写经验占比增加真实经验比例最终控制精度不高成功阈值过宽动态调整阈值中后期收紧内存和显存占用暴增回放池容量过大K 值过高降低回放池容量或按需生成 HER 经验模型对原始目标失效改写目标和原始目标空间不一致检查观测向量中目标字段的替换是否完整训练波动剧烈奖励函数设计用了距离奖励切换为二值稀疏奖励重跑采样目标不稳定随机策略采样了太多噪声目标改用 future 策略并控制 K 值6. 从机械臂到更多场景hindsight 思路的扩展应用与个人总结6.1 在更复杂的强化学习任务中使用 HERHER 的这种重新定义目标的思路并不仅限于机械臂操作它在很多其他任务里都有应用潜力。比如机器人导航目标是让机器人从起点走到指定房间如果智能体走错了房间普通的稀疏奖励环境什么都学不到。HER 会把走到的那个错误房间当作事后的正确目标告诉策略网络朝着那个房间前进的路径也是有效的从错误中提炼出运动控制的经验。另一个典型应用是带约束的物体操作任务比如推箱子、叠杯子。这些任务的共同特点是一个目标可以用多个位姿状态来表示失败轨迹里往往已经包含了大量接近成功的中间状态是天然的 HER 素材。我见过有人把 HER 和 分层强化学习 结合上层决策模块给出子目标下层控制模块用 HER 来学习如何到达子目标效果非常不错。OpenAI 在《Spinning Up in Deep RL》教程中也专门把 Hindsight Experience Replay 作为一个独立章节来讲足以说明它在整个强化学习知识体系里的分量。它和我们熟悉的课程学习Curriculum Learning也有内在关联课程学习是把任务从易到难排列让智能体逐步推进HER 则是自动从简单的经验里生成事后目标相当于一种隐式的课程生成器。两者结合使用能进一步降低复杂任务的训练难度。6.2 跳出强化学习后见之明思路给产品迭代的启发其实把 HER 的思路抽象出来它对任何需要从失败中学习的系统都很有参考价值。我在做实验时经常联想到日常产品迭代的经历一个功能上线后用户没有按预期使用大多数团队的直觉是这个功能浪费了直接砍掉或者重做但如果切换一下视角把用户实际使用的方式当作一种新的需求输入来理解反而会发现问题所在产生新的产品灵感。这和 HER 的做法几乎没有区别。HER 会把实际达到的状态当作目标重新评估整条经验的价值产品团队也可以把用户实际行为当作目标场景审视现有方案对那个目标场景是否友好。这套换目标重新审视旧路径的思维方式让我在处理很多非技术问题时也觉得特别顺手。6.3 几个值得思考的扩展方向如果你看完这篇分享后想进一步玩一玩 hindsight 相关的内容我建议可以从下面几个方向入手。第一个方向是把 HER 和基于模型的强化学习结合起来。既然 HER 让我们获得了大量可以反复利用的改写经验那这些经验本来就非常适合用来训练一个环境动态模型。有了模型之后智能体可以在不与环境交互的情况下做想象 rollout进一步加速学习。我目前正在尝试这个方向初步实验显示在 FetchReach 任务上训练步数可以再降到原来的 60% 左右但模型误差对策略的影响还需要持续关注。第二个方向是让事后目标的采样过程变得更智能。目前标准的 future 策略是均匀随机采样未来时间点的状态这其实比较粗糙。如果设计一个基于当前策略不确定性的采样机制优先选择那些智能体真的不太擅长但又足够接近成功的状态作为事后目标训练效率可能还有提升空间。这是一个值得发论文的研究坑有兴趣的读者可以往这个方向深入。第三个方向是把 HER 用于多智能体协作任务。在多个机器人协同完成一个目标的场景里事后目标可以是整个团队行为的最终状态也可以拆解到每一个智能体身上。每个智能体都可以把自己的失败轨迹改写成对某个子目标的成功轨迹这种分布式 HER 的思路在我看到的文献里讨论还不多很有探索价值。6.4 我的实际体会与最终建议最后再聊一点项目之外的个人感受。我最初接触 HER 的时候总觉得事后诸葛式的学习方法不太靠谱像是在自欺欺人——把没达到的目标假装达到了真的能提升学习效果吗但当我真正在代码里实现完、亲眼看到成功的曲线从天堑变通途的那一刻我对强化学习中目标这两个字的理解彻底变了。目标不是天然的不是环境给定的不可变教条它只是我们用来组织学习信号的一种工具。既然工具是可以调整的那么根据实际结果更换目标就是一种完全合理的学习策略。在给大家做技术选型的建议时我始终坚持一个原则如果你的任务本来就有一个密集的、设计良好的奖励函数那完全没必要引入 HER它反而可能让简单问题变复杂。但如果你的任务天生就是稀疏奖励的而且你对奖励函数的设计感到无从下手——先别急着花两周手工设计一堆启发式奖励直接考虑 HER 才是性价比更高的路径。传统强化学习教程通常会把奖励函数设计当作一门玄学但 HER 用一套几乎不需要调参的机制直接绕过了绝大多数奖励工程噩梦。无论你是新手还是老手我都建议你找一个经典的稀疏奖励环境亲手实现一遍 HER 的数据改写逻辑把训练曲线跑出来看看效果。书本上读一百遍原理都比不上亲眼目睹一条原本是直线的成功率曲线因为你改写了几个目标字段而突然起飞来得震撼。那是一种我真正掌控了强化学习里的学习信号的实感。希望这篇分享能为你省下一些弯路也祝你早日在自己的项目里体会到这种感觉。

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

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

免费获取报价 →
↑