HER算法解析:解决强化学习稀疏奖励问题的原理与实战
1. 从一个事后诸葛亮的算法聊起HER 要解决的痛点做强化学习的人几乎都绕不开同一个噩梦智能体在环境里跑了上百万步reward 始终是 0网络参数纹丝不动loss 曲线像条死人的心电图。你要是跑过 OpenAI Gym 里的 FetchReach 这类机械臂任务一定见过这种场面——机械臂在空中乱挥永远碰不到目标所有 episode 都返回 -1梯度回传过来的全是没有用的绝望。这个现象有个正式名字叫稀疏奖励问题Sparse Reward Problem。说白了就是环境只在极少数情况下才给你正反馈绝大多数时间智能体无论做什么都拿不到任何指导信号。它不像 CartPole 那样每一步都有实时奖励倒更像是让一个人在没有地图、没有路标的前提下去一座陌生城市找一家连招牌都没有的小店。你走错了不会受罚走对了也没人告诉你那这个人大概率一辈子都在街上闲逛。我当年第一次正面撞上这个问题是在做机械臂抓取仿真实验的时候。任务很简单让七轴机械臂把一个方块抓到目标位置。听起来不难对吧但用普通的 DDPG 跑了 80 万步成功率是 0%。我一度以为是代码写错了逐行检查网络结构、奖励计算、维度匹配折腾了一星期结果发现问题根本不在代码而在算法本身的探索逻辑。就在这个节骨眼上我读到了 OpenAI 在 2018 年发的那篇论文《Hindsight Experience Replay》作者是 Andrychowicz 等人。这篇论文提出了一个非常反直觉的思路既然智能体总是失败那就干脆让它在失败中学习把失败当作另一种成功来训练。这个想法的本质就是把人类身上最普通不过的一种能力——事后反思——搬进强化学习算法里。人做事失败了会复盘我刚才那个动作虽然没达成原目标但如果目标换一下其实我已经做到了。 HERHindsight Experience Replay干的事就是这个重新标注目标goal relabeling把没实现的目标替换成实际达到的状态把失败的轨迹变成带正奖励的成功轨迹。这个思想看上去简单到令人怀疑但它直接解决了强化学习里一个根源性的困境样本利用率太低。在稀疏奖励环境下绝大多数样本是废样本因为奖励恒为负数算法学不到任何有效信息。HER 的天才之处在于它把这些废样本重新加工成了有效样本变废为宝硬生生把样本利用率抬高了几个数量级。这篇文章我想把这个算法的来龙去脉、原理细节、实现要点和我在实操中踩过的坑一五一十地讲清楚。不管你是刚入门强化学习的研究生还是在工业界做机器人控制算法的工程师这篇内容都可以帮你少走很多弯路。2. 目标重标注HER 的核心机制与直觉解释2.1 把失败样本变成成功样本要理解 HER就得先理解它在强化学习训练流程里究竟改动了哪个环节。传统的 off-policy 算法比如 DDPG、DQN从经验池里采样state, action, reward, next_state四元组来更新网络。整个流程里目标goal和奖励绑定在一起你给智能体设定了一个目标它没达成奖励就是负的这条样本放进池子里下次采出来还是负的网络反复被教育你不行。HER 打破了这个绑定。它引入了一个额外的维度把目标从样本里解耦出来。具体做法是当一条 episode 结束时如果智能体没能达成原始目标算法就额外生成一组事后目标用它替换掉原来的目标然后重新计算奖励。因为新目标是智能体实际到达的状态所以重新计算出的奖励是正的直接对应成功。我举个特别生活化的例子帮你建立直觉。假设你让一个孩子投篮目标是投进篮筐。他投了十次都没投进其中有几次球擦着篮板弹到了地面某个位置。你如果只盯着投进篮筐这个目标这十次全是失败没有任何可学的。但如果你换个思路指着他球落地的那个位置说你刚才的目标其实是把球投到这个位置恭喜你你成功了然后把球落到这个位置作为新的训练目标让他再练。这样一来他每次出手都有机会获得正反馈他就能逐渐学会控制手臂力度和方向。这就是 HER 的关键直觉智能体的行为本身包含了大量信息即使它没有完成指定目标它的行为也揭示了一条通往某个可达状态的有效轨迹。我们要做的就是让算法承认这个实际达成的状态同样值得学习然后在这个基础上继续优化。从数学角度说HER 适用于**目标条件化强化学习Goal-Conditioned RL**框架。在这个框架下策略不再是只输入状态输出动作而是输入状态和目标输出动作。目标是额外的条件策略 π(a|s, g) 会根据我想去哪来决定我该怎么做。HER 在训练时用的就是 π(a|s, g)其中 g 是事后重新标注的目标。2.2 目标条件化强化学习与从零开始的经验积累你可能会问为什么要费这么大劲做目标条件化直接在原始目标上训练不行吗我的回答是原始目标如果只有一个那智能体确实只有成功和失败两种结局HER 能提供的信息量依然有限。但真实世界的任务几乎都有目标参数——抓取任务的目标是位置坐标导航任务的目标是目的地坐标炼丹任务的目标是特定温度范围。把目标变成输入条件之后算法能在同一个策略网络上学会应对无数个不同的目标这本质上是在学习一个通用的控制规律。这个思想往前再推一步就是后来的Universal Value Function ApproximatorsUVFA通用价值函数逼近器。UVFA 提出价值函数不只依赖于状态还依赖于目标V(s, g)。它的意义在于你不需要为每个新目标重新训练一套价值网络而是让一个网络同时学会在不同目标下各状态的价值高低。HER 实践了这个框架并把它落到了经验回放这个具体操作层面。我在跑 HER 的时候第一次真切感受到这个设计的威力是在 FetchReach 环境里。这个任务要求机械臂把末端执行器移动到目标点起始位置和目标位置都随机生成。刚开始训练机械臂的末端执行器位置是乱的几乎所有轨迹的终点都离目标十万八千里。但 HER 在后台默默地把这些乱终点标记成了新目标然后网络开始在一个巨大的目标空间里逐步学会从任意起点移动到任意终点的能力。训练到 20 万步左右我发现成功率开始显著爬升。到 50 万步时成功率已经稳定在 90% 以上。而同样的环境、同样的网络结构不带 HER 的 DDPG 跑了 80 万步成功率依然是 0。这个对比有多么悬殊我后面会给你看具体数字。还有一个值得注意的细节HER 不是在 episode 结束后重新生成一条样本而是生成多条。因为一条轨迹上通常有几十到几百个状态每个状态理论上都可以作为事后目标。实际操作中一般会从一条轨迹里抽 14 个事后目标来重标注生成更多训练样本。这个策略直接决定了 HER 的数据增强强度。2.3 四种目标采样策略怎么选HER 论文里提出了四种事后目标采样策略分别是final、future、episode、random。很多初学者直接忽略了这部分的差异随手选一个策略就跑但这里面的门道直接影响训练效果值得好好讲清楚。final整条轨迹只选最终状态作为事后目标。样本量小但目标分布比较稳定适合目标空间不大、轨迹长度较短的任务。future从当前时间步之后的某个状态里随机挑一个作为目标。这是论文重点推荐的策略因为它在时间维度上创造了预测未来的训练压力策略必须学会接下来几步内到达某个状态而不是最终到达某个状态。episode从同一 episode 的任意状态里随机挑目标不管它在当前时间步之前还是之后。样本量最大多样性最高但训练信号会有些松散因为有些目标可能已经错过了。random从整个目标空间里随机采样目标。这个策略通常作为 baseline 出现效果一般偏差因为随机目标往往和当前轨迹关系不大重标注后的奖励虽然可能为正但学习方向太发散。我的实测经验是future策略在绝大多数连续控制任务里表现最稳定论文里也推荐优先尝试。它兼顾了目标多样性和时序一致性。如果任务特别复杂、轨迹特别长可以考虑episode策略来增加样本量但要小心训练曲线会出现更多的震荡。采样策略目标来源优点适用场景final轨迹终点稳定、计算量小目标空间小、轨迹短future当前步之后的状态时序合理、效果好绝大多数连续控制任务episode同轨迹任意状态样本多样性高轨迹长、需要大量数据random整个目标空间最简单、零开销仅作 baseline 对比3. 完整实操基于 DDPG HER 复现一个抓取任务3.1 环境选择与建模纸上谈兵讲了这么多原理下面直接上实操。我用的是OpenAI Gym 的 FetchPickAndPlace 环境这是一个模拟七自由度机械臂抓取方块并放到目标位置的经典基准任务也是 HER 论文里最常用的验证环境之一。比起最简单的 FetchReach只需要移动机械臂末端FetchPickAndPlace 多了一个抓取动作需要学习夹爪的开合控制任务难度刚好合适适合用来展示 HER 的真实效果。这个环境的状态空间包含机械臂各个关节的角度、角速度、夹爪位置和物体位置动作空间是四维连续动作平移增量加夹爪开合。最关键的是它的目标定义一个三维坐标表示方块需要被放置的位置。Reward 只有一个判断条件如果方块中心与目标位置的距离小于 5 厘米奖励 0否则 -1。看到这个奖励设计你就明白了这就是典型的稀疏奖励问题任何一点接近目标的进步都不会获得额外奖励你要么成功要么失败。跑这个环境之前你要先理解一个关键概念观测observation和目标goal要分离。在 HER 的标准实现里观测中通常不包含目标坐标目标作为单独的量传入策略和价值网络。这个分离在设计网络输入的时候特别重要别一股脑把它们 concat 在一起就完事后面我还会详细说。我用的是 OpenAI 官方开源的 baselines 版本里的 HER 实现它基于 TensorFlow。说实话这个版本已经有点老了跑起来偶尔会有 API 兼容问题但胜在逻辑清晰、可读性强非常适合拿来学习和魔改。如果你不想折腾老代码也可以直接在 RLlib 或者 Stable-Baselines3 的社区扩展里找 HER 实现不过我建议第一次跑还是先用官方代码因为论文里的所有超参数都是基于官方代码调的复现性最好。3.2 算法超参数怎么配置我把我在 FetchPickAndPlace 上跑通的一组超参数列在下面这组参数基本沿用了论文的设置我自己做了很小幅度的调整主要是调整了目标采样策略的 K 值超参数取值说明采样策略future论文推荐实测最稳事后目标数量 K4每个状态额外生成 4 个目标Batch size256批量大小太小容易震荡回放池容量1e6足够大才能容纳多样策略数据Actor 学习率1e-3论文里 DDPG 用的标准值Critic 学习率1e-3同上折扣因子 γ0.98控制长期回报权重软更新系数 τ0.95注意官方代码里的 τ 含义是目标网络平滑系数探索噪声0.2高斯噪声用于探索训练回合数50每回合进行 50 次梯度更新总 timesteps2e6训练总量 200 万步网络结构256×256两层全连接激活函数用 ReLU有几个参数的解释值得展开说。第一K 4 表示每条轨迹的每个状态最多额外生成 4 个事后目标。K 值太大会导致目标分布过于事后诸葛——你强行让智能体学习很多它实际上从未试图达成的目标反而会稀释原始目标的训练信号。K 值太小时信息增强效果不够。我试过 K120 万步内成功率爬升明显变慢K8 时训练时间增加不少但成功率并没有相应提高所以 4 是一个很均衡的选择。第二软更新系数 τ 0.95 可能会让你困惑。传统 DDPG 里 τ 是 0.001 或 0.005用来缓慢更新目标网络。但在 OpenAI 的 HER 实现里这个参数表示目标网络直接用在线网络的参数做软替换公式是 target_params τ * online_params (1-τ) * current_target_paramsτ 越接近 1 目标网络更新越快。我一开始没看代码就按 DDPG 的惯性思维去了 0.001跑了半天发现 Critic loss 完全不下降查了半天才发现是目标网络更新太慢导致价值估计长期失真。第三每回合 50 次梯度更新这个设定也很关键。HER 生成了大量额外样本如果不做多步更新这些样本的利用率就打折扣。我在实验里对比了每回合 40 次和 80 次更新的区别40 次收敛稍慢但结果接近80 次训练耗时明显增加但成功率上限差不多。50 是官方默认值稳妥。3.3 训练过程与结果解读配置完环境我来说说训练过程到底长什么样。刚开始跑的前 10 万步成功率是 0。这是正常的因为机械臂连怎么把夹爪移到方块附近都没学会。但注意此时 Critic loss 已经开始下降了——这不是因为 reward 变好了而是因为 HER 创造的那些事后成功样本让价值网络开始学习哪些状态-动作组合能走到目标点。换句话说HER 的厉害之处在于即使整个训练过程没有一个真实成功样本价值网络依然有信号可学。到 30 万步左右成功率开始出现微弱的非零值大概 2%5%。这个阶段是质变的开始。你会发现机械臂的动作开始变得有目的了不再像无头苍蝇一样乱挥。当成功率开始爬升的时候训练曲线往往会进入一个快速上升期因为每多一个真实成功样本就多了一条高质量的示范轨迹HER 会把这些成功样本再次重标注后放大形成一个正反馈。到 100 万步左右我这边成功率大概到了 60%70%。继续训练到 200 万步成功率稳定在 85%95%剩余的那几个百分点大多是初始条件下物体位置太靠近机械臂底座或边界机械臂的初始构型本身就没办法完成抓取。这里我要强调一点HER 训练出的成功率并不代表每次任务都能成功而是代表在随机重置下目标可达范围内的成功率。在 FetchPickAndPlace 环境里物体的初始位置和目标位置都有一定的随机范围有些极端位置即使是训练好的策略也难以百分百成功。评估时你要在固定的随机种子下跑几百个 episode取平均成功率而不是跑几个 episode 就下结论。再分享一个我自己调试时常用的评判方法除了看成功率还要同时盯着Episode 结束时末态到目标的平均距离。这个指标比成功率更平滑能提前反映学习趋势。如果成功率还是 0但平均距离在缓慢下降说明策略正在往正确方向前进如果平均距离也在原地踏步那你得回头检查奖励函数或者网络结构大概率有 bug。4. 算法变体、局限性与替代方案4.1 泛化到其他任务时有哪些要注意的地方HER 不是一个只适用于机械臂抓取的奇技淫巧它可以迁移到很多其他领域——导航、迷宫、机器人控制、甚至一些组合优化问题。但迁移不是无脑复制代码有几个环节需要针对任务特性做改造。首先也是最关键的任务必须能写成目标条件化的形式。如果目标不可定义为一个状态向量HER 就无从下手。比如下围棋就没有明确的目标状态向量这类任务不适合 HER。反过来凡是目标能被期望到达的状态描述的HER 都能试试。其次要维护一个有效可用的状态表示。HER 的核心操作是把某个状态当作新目标这意味着目标必须存在于状态空间里。如果你的任务里目标需要设计者人为指定而非从状态里提取那 HER 的优势就打了折扣。最简单的做法是确保状态向量里包含你关心的那些维度比如物体坐标、机器人位姿然后直接把这些维度的一个子集当作目标向量。第三要注意目标空间分布与初始状态分布的匹配。HER 之所以高效恰恰因为训练时的目标采自真实轨迹所以目标是可达的。如果目标空间太大而初始策略又特别差模型可能很久都学不会如何把目标映射到动作。这就意味着HER 并不是在真空中工作它依然需要一个基础的判别力——物体在哪、手在哪、距离有多远。最后HER 天然和 off-policy 算法搭配。它依赖经验回放池来反复训练这些事后成功样本。如果用在 on-policy 算法比如 PPO上需要额外维护一个样本存储和重采样机制实现复杂度会高不少。我知道有些工作尝试在 PPO 里引入类似 HER 的机制但效果和效率通常不如 DDPG / SAC HER 来得直接。4.2 HER 的局限和它不能解决的问题实事求是地说虽然 HER 在很大程度上缓解了稀疏奖励问题但它不是万能药有几个先天局限我是亲身感受过的。第一它对事后悔过的依赖意味着它不能创造目标空间里不存在的信息。如果目标空间非常大而策略又始终停留在目标空间的某个狭小区域内HER 再怎么重标注也只能在已有轨迹覆盖的区域内学习没法凭空学会目标空间远端区域的控制方式。这其实就是探索不足问题HER 本身并不会主动探索它只是让已有的探索成果能被更高效地利用。第二真正的收敛速度依然受限于探索能力。你可以把 HER 想象成放大镜它能把一点点微弱的探索信号放大但如果放大镜前面什么都没有它也无能为力。在需要精细操作、复杂时序决策的任务中单靠随机探索加上 HER还是可能陷入局部最优。这时候往往要靠课程学习curriculum learning或者人工示范demonstration来引导探索方向HER 再负责把这些引导充分利用起来。第三计算开销和存储开销显著增加。HER 加上目标重标注会让经验回放池的样本量翻好几倍。每条真实轨迹都要额外生成多条事后目标轨迹训练周期里每次采样都要重新计算奖励。虽然这些计算本身不贵但如果任务复杂度高、每次更新需要好多轮回放整体训练时间会明显拉长。在训练大模型或是物理仿真复杂的环境中这个开销很难忽略。我自己在项目里碰到过一个更实际的问题HER 在 Fetch 这类目标空间离散且维度较低比如 3 维坐标的任务里效果非常好但如果你把目标改成高维空间比如整个机械臂的关节角度状态目标重标注后的相关性会显著下降策略学习会变得不稳定。所以在目标设计时尽量保留低维、语义清晰、直接可判读的坐标形式是让 HER 发挥最大效力的实践经验。5. 训练中的常见问题与排查技巧实录5.1 跑了很久成功率依旧为 0怎么查这是新手最容易碰到的噩梦代码跑起来了loss 也在变但成功率是一根直线死活不动。我把自己排查这类问题的顺序写出来按这个顺序查大概率能定位问题。第一检查奖励计算逻辑。先把 HER 关掉只跑普通的 DDPG故意设一个密集奖励比如每步给负的距离差看成功率能不能上升。如果连密集奖励都不涨说明问题不在 HER而在基础算法实现。第二检查重标注后的目标是否真的合理。我犯过一个特别隐蔽的错误重标注目标时直接把观察值里的某个坐标丢进了目标变量但忘记同步更新目标的条件空间维度导致训练时目标向量和策略网络输入的维度对不上训练过程处于半瞎状态。这种问题检查起来最麻烦因为你输入输出什么都能算但学的都是无效信息。我的经验是在重标注之后打印几组样本用肉眼看看目标和状态是否真的对齐了。第三观察分布变化。如果经验池里绝大多数都是事后成功样本而非真实成功样本那 Critic 网络学到的价值函数会偏向事后乐观导致 Actor 以为自己的动作很好了实际在真实目标上却毫无进展。典型特征是 Critic loss 一直很低但成功率不涨。解决办法是降低 K 值或者提高真实成功样本在 Batch 中的比例。第四检查随机种子和探索噪声。HER 对探索噪声比较敏感。如果噪声太大动作输出接近随机失败轨迹的代表性变差如果噪声太小策略很快收敛到一个糟糕的确定性动作探索不足。我做实验的时候把噪声方差从 0.2 调到了 0.1成功率从 80% 掉到了 40%可见噪声是一个性价比很高的调参项。5.2 训练后期震荡与熵增问题很多人在 HER 训练后期会遇到另一个经典问题成功率已经涨到 80%但突然掉到 60%然后再涨回来反复震荡。这个现象在强化学习里很常见但在 HER 里有其特殊原因——随着策略不断提升经验池里保存的样本分布和当前策略的分布差异越来越大。我解决这个问题的核心思路是控制回放池的新旧样本比例。回放池容量调到 1e6 是我最初用的实际运行下来发现容量太大反而容易让策略受陈旧样本干扰。后来我把容量改小到 5e5并提高每次更新时新鲜样本的采样比例比如采样时 30% 用最近一万步的样本训练曲线明显平稳了很多。还有一个排查点有些 HER 实现版本的重标注逻辑存在目标泄漏问题。代码实现里不小心让重标注目标使用了未来信息导致训练时价值函数开了天眼学到的是不可能的控制策略。在测试阶段这种目标泄漏不会被发现因为测试时没有未来信息策略自然会表现不佳。这个问题的排查办法也很直接把重标注前的轨迹数据重新按时间顺序打印出来手动检查每个时间步的观测里是否包含了未来才能知道的信息。现象可能原因排查手段成功率从 0 涨但极慢K 值太小、学习率太低增大 K 到 48调学习率成功率完全不涨奖励计算逻辑有误先跑密集奖励验证训练后期震荡回放池新旧样本失衡缩小池容量、提高新样本比例训练时好、测试时崩目标泄漏打印轨迹逐帧检查Critic loss 很低但策略不动事后样本过度主导降低 K、增加真实样本比例5.3 我的几点私家经验最后分享几个我从大量调参里沉淀下来的实操习惯不一定写在论文里但对结果影响非常直接。第一训练前先小规模跑通。我用脚本先跑 10 万步快速验证 pipeline 是否通畅顺手把成功率初始值记录下来。如果 10 万步内成功率竟然涨到了 20% 以上那大概率是任务太简单或者目标泄漏了。这个反直觉验证帮我排除过好几次 bug。第二保存中间模型并定期测试。HER 的优点之一是对 offline 样本的利用率高早期模型虽然成功率低但学到的一些动作技巧可能在后期依然有用。我做实验时每 10 万步保存一次模型最后发现 80 万步时的一个模型在后期任务变种上表现甚至比最终模型更好——这种现象在稀疏奖励任务里并不罕见。第三记录每个阶段的平均末态距离。我不仅记录成功率还额外记录每条 episode 结束时候物体位置到目标的平均欧氏距离。因为稀疏奖励的成功率是 0/1 信号非常不响应微小改进而距离信号是连续值能在训练早期就反馈出策略是否在朝着正确方向缓慢移动。我见过很多人在成功率还停在 0 的阶段就开始调参实际上这时候距离曲线已经在下降了只需再耐心等等就能等到成功率的突破。6. 写在最后的体会如果你问我学了这么多强化学习算法哪个让我觉得原来还能这么玩HER 绝对排第一。它没有复杂的数学推导也没有精巧的网络结构就是一个朴素到近乎天真的事后诸葛亮逻辑却把强化学习里最头疼的稀疏奖励问题撕开了一道大口子。我至今仍然记得第一次看到成功率曲线从 0 突然跳升到 90% 时的震撼那一刻我一整天都在念叨这也行。这个算法的出现也让我重新审视了失败样本在教育与训练中的价值。我们做强化学习太习惯于盯着奖励函数总想着怎么设计更精细的奖励来引导智能体却忘了失败本身也是一种宝贵的经验。HER 教会我的不是怎么让智能体不失败而是怎么让它从每一次失败里都学到点东西。现在我自己的习惯是但凡遇到稀疏奖励任务我会先去想一个问题这个任务里有没有一个自然的事后目标可以用如果有那就直接给算法加上这个能力。如果任务本身目标过于抽象、没法定义成状态向量我也会尽量去找一个相关的低维代理状态作为 HER 的落脚点。这个底层思路其实比 HER 这个具体算法本身更值得记住——机会就在你已经走过的路里只是需要一个回头的动作。