ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

HER事后经验回放:破解稀疏奖励下的强化学习难题

HER事后经验回放:破解稀疏奖励下的强化学习难题 先说个结论hindsight 这个词如果按字面理解为“事后诸葛亮”基本就把强化学习里一类最实用的思路说透了。我在实际项目里第一次接触它的场景是训练一个机械臂去做抓取任务环境给的奖励稀疏得可怜前几千个回合模型几乎学不到任何东西成功率徘徊在个位数。后来把 Hindsight Experience ReplayHER事后经验回放接进采样流程才算把整个训练盘活。这篇就围绕 hindsight 的核心机制、实操配置、踩坑记录以及它对整个强化学习领域的影响范围展开聊一聊。至于它常规的用法大部分人会把 HER 当作一种稀疏奖励下的通用策略。如果你手头有一个目标条件化的强化学习任务奖励又非常稀疏想知道怎么让模型依然学得动这篇文章就是为你准备的。无论是刚上手强化学习的新人还是已经跑过一些 RL 项目的工程师应该都能从这里拿到可以直接抄作业的配置和思路。1. 为什么强化学习一上来就慌稀疏奖励是头号难点1.1 稀疏奖励的典型场景很多真实任务并不会像游戏里那样频繁给分。机械臂抓取、机器人行走、自动驾驶变道、智能体在迷宫里找出口都属于“要么不做要么做到最后才给奖励”的类型。拿机械臂举例子你给它一个目标位置它要完成“把物体推过去”或“把物体拿起放到指定点”的任务环境只有在物体与目标足够近时才返回一个非零值比如 1 或 -1。中间成百上千步的动作既没有正反馈也没有负反馈全都像石沉大海。这种设计从控制角度看是合理的因为真实世界的物理任务就是非零即一做没做到一目了然。但到了强化学习里它就成了灾难。智能体需要通过奖励信号估计每个动作的价值现在信号变成了“绝大多数情况下没奖励”神经网络能学到的梯度信息自然稀薄得可怜。1.2 为什么随机探索解决不了有人会说那让智能体多随机探索不就行了理论上确实可以但现实是探索成本高得离谱。在连续动作空间里机械臂的动作维度至少有 3 到 7 个每一步动作由连续浮点数组成纯靠随机策略碰巧让末端执行器达到目标位置的几率小到你没法在有限训练时间内等到。我见过很多入门项目在这里吃亏用的是标准 DDPG环境稀疏奖励训练几万步actor 的 loss 一点变化都没有所有 episode 的 reward 全是 -1。这时候不是网络结构不够深也不是学习率没调好而是采样到的数据里几乎全是失败经验优化器根本找不到改进方向。随机探索没有“从失败中提取有用信息”的能力这是它解决不了稀疏奖励的根本原因。1.3 HER 解决的思路一句话版本HER 的核心逻辑异常简单既然失败经验里没有奖励那就给这些失败经验重新指定一个目标目标设为智能体在失败后实际达到的位置。这样做之后原本零奖励的经验就变成了“成功达到某一个目标”的经验可以被用来学习“如何向真实目标靠近”。你可能已经嗅到了关键它不是增强探索而是改变经验数据的标注方式。它没让智能体变得更聪明地去搜索真实目标而是让智能体在尝试过程中产生的每一次位置变化都具备可学习的价值。这就是 hindsight 翻译成“后见之明”的所以然——你在事后回头看这次交互发现虽然没达成原定目标但达成了另一个目标那这个达成过程就是实打实的正样本。2. 核心机制拆解目标重标记是怎么把死局盘活的2.1 原始经验与替代经验在 HER 下强化学习处理的不是一条普通的“状态-动作-新状态-奖励”四元组而是“状态-动作-新状态-目标”四元组。你的目标必须参与奖励计算比如机械臂到目标点的距离小于阈值就返回 0否则返回 -1这也就是所谓的目标条件化奖励函数。训练时智能体确实会按照原始目标 g 去尝试完成一个 episode。但 episode 跑完之后HER 会做一件额外的事从这条 episode 里挑选一些时间步把那些时间步之后达到的状态作为“替代目标”。对于原始轨迹里的每一步它除了保留原始目标下的经验还会额外存一份“如果当时我的目标不是 g而是后面才到达的那个状态我的这一步动作是不是就够了”的新经验。这里有一个通常需要用公式表示的细节替代经验里的奖励必须重新计算。原来奖励函数给了 0 或 -1换成替代目标后奖励要按相同评判规则重新判定。多数情况下智能体在后续时间步确实到达了替代目标所以替代经验里的奖励通常是 0说明它成功。这等于人为制造了大量“成功轨迹”给后续的 value function 学习提供了充足正样本。2.2 future 目标策略的选择使用重标记目标时有四种常用选择final、episode、random、future。前两种比较直觉化。final 是把当前 episode 最后到达的状态作为替代目标episode 是在当前 episode 的后续状态里随机挑一个random 是在整个轨迹的任意状态里挑future 则要求替代目标必须是比当前时间步更晚到达的状态。实际测试下来future 策略表现最好final 次之random 最差。原因并不复杂用未来状态做目标相当于给智能体设定了一个“循序渐进”的课程。它在第 t 步做的动作被用于朝着某个后续位置努力这个位置不会突然跳到一个完全无关的方向所以目标难度是自然递进的。而 random 选出的目标可能来自轨迹很早的阶段和当前上下文毫无关系建立出来的学习信号噪声极大。我在实验里确实验证过不同的替代目标策略会直接影响训练收敛速度和最终成功率单纯改用 future 后平均训练回合数能压缩到接近原来的一半。2.3 通用价值函数近似器HER 离不开的结构前提HER 能成立还有一个隐藏前置条件你必须使用通用价值函数近似器UVFA。简单说你的 critic 网络不能只输入观测状态还必须输入一个目标向量输出是“在这个目标前提下当前状态-动作对的价值”。如果网络架构不支持目标向量参与计算那你就算造出了替代经验也没有地方利用这些目标信息。实际操作中常见做法是把观测状态和目标向量拼接在一起一起喂进 actor 和 critic。这类网络在 DDPG、TD3、SAC 框架里都很容易实现只需要多写一个 target embedding 的输入端口。一个值得注意的工程细节是不要用两个独立网络分别编码目标和观测再相加拼接通常更稳定特别是在输入维度不高的小型任务里。2.4 为什么后见之明有效概率直觉回归数学直觉原本稀疏奖励环境里一次随机探索中得到正样本的概率可能只有万分之一。而用 future 策略重标记后正样本比例可以瞬间提升到百分之几十甚至更高因为替代目标本身就是从后续轨迹里来的。这直接把“成功经验”的采样概率抬高了几个数量级价值函数也就不再是无源之水。可以把这个过程理解成你学投篮真实比赛里要求你从三分线外命中但你在训练时可以先练习在篮下出手。每次训练动作虽然没投进三分但你获得了“出手、瞄准、投球”这些环节的正确体验再把这种体验逐步迁移到更高难度目标上。HER 做的就是这个筛选过程——把失败轨迹里那些“已经做对了的事”识别出来单独强化。3. 实操记录用 HER 训练一个稀疏奖励的机械臂任务3.1 环境准备与选型如果你想复现最简单的起点是 OpenAI Gym 里的 FetchReach-v1 或者 FetchPickAndPlace-v1。前者是单一目标到达任务动作空间是 4 维连续控制观测空间包括机械臂末端位置和物体位置信息奖励本身就是稀疏的能完全体现 HER 的威力。它还有一个好处环境自带目标字段不需要自己额外包装接口。推荐使用较新的 Gym 版本配套 Mujoco 物理引擎。如果你不想折腾破解版可以用 MuJoCo 的免费试用版本或者用仿真环境替代但在做难度对比时最好保证环境版本一致。FetchReach 虽然简单但在非 HER 情况下仍然很难达到高成功率是非常经典的中等难度基准。3.2 网络结构、采样器和目标重标记实现网络结构直接复用 DDPG 的标准双层感知机每层 256 个神经元激活函数用 ReLU输出层用 tanh 把动作限制到 [-1,1]。关键是 actor 和 critic 的输入层都必须拼接目标向量。Critic 还要在第二层拼上动作向量。HER 的目标重标记可以放在 episode 结束后统一执行。伪代码如下def store_episode_with_her(episode_transitions, replay_buffer, final_goal, k4): # episode_transitions: [(obs_t, action_t, obs_next, reward_t, goal_raw), ...] # 先存原始经验 for transition in episode_transitions: replay_buffer.add(transition) # 再抽取k个替代目标 her_goals np.random.choice(len(episode_transitions), sizek, replaceFalse) for t in her_goals: future_idx np.random.randint(t 1, len(episode_transitions) 1) substitute_goal episode_transitions[future_idx - 1][obs_next][:goal_dim] for transition in episode_transitions: new_reward compute_reward(transition[obs_next], substitute_goal) her_transition ( transition[obs_t], transition[action_t], transition[obs_next], new_reward, substitute_goal, ) replay_buffer.add(her_transition)上面这段代码还需要注意一个地方compute_reward必须和你环境里的奖励函数逻辑一致。如果你把替代目标存进 buffer却在计算奖励时偷懒复制原奖励整条经验的数据分布就是坏的训练会发现成功信号时有时无非常不稳定。3.3 训练参数配置与结果对比训练参数的设置我直接在表里列出来了这个配置是我在 FetchReach 上调过几次之后比较稳的方案可以直接参考。至少对 FetchReach 和类似的简单环境不需要额外改动。参数项推荐值说明算法框架DDPG HER连续控制入门最稳组合网络结构两层 MLP256 神经元不推荐加太深容易过拟合学习率Actor 1e-3Critic 1e-3如果发散可降到 3e-4折扣因子0.98稀疏任务下不需要太高探索噪声高斯噪声std0.2前期可更大后期减小每 episode 替代目标数k4太大易让经验分布偏置未来采样策略future务必用 future别用 random回放缓冲区大小1e6目标是覆盖尽量多轨迹batch size256小 batch 加 HER 效果会差一些训练回合数250k-500k简单环境通常 250k 内收敛在一个 250k 回合的训练里我用非 HER 的 DDPG 做基线平均成功率一直卡在不到 20%偶尔还会往回掉。而接入 HER 之后大概在 120k 回合左右成功率就冲到 90% 以上后面的波动明显减小。这个差距和论文里公开的基准数据基本一致。3.4 加入 HER 前后的成功率变化需要澄清的是即使在 HER 加持下成功率也不会一上来就线性上涨。我的训练曲线前 20k 回合基本是平地主要由随机噪声组成。大概到 40k 回合后批评网络才开始识别出“朝向替代目标移动”是有价值的随后 actor 的策略便开始往目标方向迁移。这个迁移过程不是单调递增的中间会有平台期属于正常现象不要急着掐断训练。另外一点HER 不是万灵药。如果任务本身的目标分布极不均匀或者环境动态差异太大光靠重标记也很难救回来。它更适合那些“目标在状态空间中连续且可达成”的任务。如果是离散目标、抽象任务HER 的效果会大打折扣。4. 常见坑与排查技巧实录4.1 重标记比例过大会把 replay buffer 搞偏这是最容易犯的错误。HER 会让每条真实轨迹额外生成很多替代经验一旦 k 值取得过大比如每条轨迹生成 8 个以上替代目标buffer 里就会被“人造成功经验”淹没。智能体看到的绝大多数样本都是人为构造出来的成功反而削弱了它对真实目标分布的真实估计。所以别迷信“越多越好”k4 在多数任务里是平衡点。如果发现训练后期策略在真实测试时表现差但训练 loss 很低先检查是不是重标记比例过高。4.2 目标和观测的拼接顺序影响学习虽然听起来有点玄学但在实际调参里目标向量和观测向量的拼接顺序确实影响收敛曲线稳定性。我一开始把目标拼在观测后面发现前几千回合容易产生震荡。后来改成把目标拼在观测前面曲线明显平滑了很多。这可能是网络初始权重对输入片段的敏感度不同导致的建议你自己动手试一下两种拼接顺序保留表现更稳定的那个方式。另外要注意拼接目标时不能让梯度传回目标向量。目标只是一个条件输入不应该被优化。如果在代码里创建了目标变量并开启了梯度或者误把它写进可训练列表你会看到 value 网络出现诡异的平移最终影响策略输出。4.3 奖励阈值与距离函数不匹配机械臂环境里奖励通常会根据欧氏距离阈值来判断比如末端位置和目标的距离小于 0.05 才算成功。做 HER 重标记时替代目标是从实际轨迹里取的它大概率仍然会满足这个距离条件所以不会有问题。但如果你用的是自定义环境距离函数的定义必须和主环境完全一致。我见过一个自定义任务里原环境用的是 L1 距离但 HER 模块为了加速计算改用欧氏距离导致替代经验明明物理上到达了目标奖励却给了 -1。这一类隐性 bug 不会直接报错但会让整个训练变成在地狱难度探索排查起来非常消耗时间。正确的做法是把奖励函数抽成一个公共函数HER 和环境都调用同一份代码。4.4 技巧速查表现象可能原因处理办法train loss 下降但测试成功率低重标记过多调低 k比如从 8 降到 4前 20k 回合完全无变化正常现象加大噪声保持耐心训练中后期剧烈震荡学习率偏高或 batch 过小降低学习率或加大 batch替代经验没有正奖励距离函数不一致统一奖励计算函数机械臂任务永远无法收敛没有用 future 策略检查和更新替代目标采样方法critic 输出整体偏大目标进入梯度更新确保目标张量不参与反向传播5. hindsight 思想的影响范围与变体方向5.1 哪些场景适合 HER哪些不适合HER 在机器人操控中的地位非常高覆盖面主要集中在连续的、目标条件化的场景。像机械臂抓取、堆叠、推箱子都是在这些任务里验证过最经典的方案。只要目标被定义成一个连续状态向量HER 就天然契合。但在纯离散任务、聊天任务、游戏任务里它就不一定适用。比如在 Atari 游戏里状态是像素画面目标不好抽象成可重标记的状态向量强行用 HER 只会让目标空间无限膨胀采样效率反而下降。所以入场之前先问自己一个问题这个任务失败后能不能用“我实际走到了哪里”来替代“我应该走到哪里”能回答“能”才值得用 HER。5.2 后续工作与变体HER 衍生出的变体非常多。一个常见方向是把“事后重标记”和优先级经验回放结合起来让更有价值的替代经验被更高频地采样。另一个方向是在多任务学习里把不同任务的失败经验相互重标记比如机械臂没抓到杯子但它推到了盒子那这次失败也可以作为“推盒任务”的成功样本。这些都是对 hindsight 思想的直接延伸。还有一类工作把 HER 用在不同数据层级比如对视频轨迹做目标提取再把提取到的目标作为 HER 的替代目标或者是和模型预测控制结合让重标记出来的目标真正输入到规划器里。整体来看hindsight 已经从单一技巧演进成一个思想框架核心始终没变后见之明地提取“其实已经接近某个目标”的有用信号。5.3 在实际项目里使用 HER 的建议我个人的建议是不要一上来就按照标准实现一股脑塞进训练脚本。先在简化环境里跑通 HER 的替代目标逻辑再推广到真实任务。把重标记逻辑单独封装成一个模块并加上单测验证替代目标的奖励计算和原始环境一致。这个模块如果出 bug往往要等训练几万步后才能发现排查成本极高。工程上还有一个容易被忽视的点HER 会显著增加 replay buffer 中经验的数量与多样性内存占用同步上升。在长 horizon 任务里一定要设计好经验去重或定期清理机制避免内存先被撑爆。我在实际使用中比较喜欢的扩展方案是在 HER 基础上再叠加一个较小概率的真实目标采样配额保证模型不会完全被替代目标主导。比如每 4 份替代经验配 1 份真实经验这样训练过程中既保留真实目标的形态又具备后续经验的密集反馈模型鲁棒性会好不少。最后再分享一个小技巧训练完 HER 模型后在部署前用一小段纯真实目标数据的微调做校准。这一步不需要训练很久只需让模型在真实测试分布下多跑几个 epoch。它能明显修正因为替代目标偏差导致的策略倾向让最终测试成功率比直接训练完就上线的版本高一截。这个过程操作起来也就多写几十行代码收益却非常直接。
返回列表