新闻详情

新闻详情

首页 / 资讯中心 / 详情

HER算法:用“后见之明”破解稀疏奖励难题——强化学习样本效率提升之道

发布时间:2026/9/30 9:58:08来源:尧图网络
HER算法:用“后见之明”破解稀疏奖励难题——强化学习样本效率提升之道
1. 为什么一个叫“后见之明”的算法成了稀疏奖励的救星先说个我自己的例子。去年我在训练一个机械臂模型任务是让它把方块推到桌面上的指定位置。跑了几十万步reward纹丝不动模型没有任何要学习的迹象。痛定思痛把奖励函数重新设计成基于距离的稠密奖励才勉强有了反馈。后来回头看真正的问题不是奖励函数不够精细而是环境本身就处于“大部分时间都拿不到任何奖励”的状态——这其实是强化学习里最常遇到的坑专业上叫稀疏奖励问题Sparse Reward Problem。当时我如果早一点知道今天要聊的这个算法至少能少走一个多月的弯路。它就是由OpenAI在2018年提出的Hindsight Experience Replay缩写是HER论文标题就叫《Hindsight Experience Replay》。名字里的“Hindsight”直译过来是“后见之明”讲的正是人类最熟悉的一种心理现象事后复盘总是容易的但我们能不能把这种“事后聪明”教给机器一句话概括HER的核心思想当一个回合失败了没关系我们把它重新解释成“成功”——只是目标变了而已。比如机械臂没把方块推到目标点但它其实把方块推到了另一个位置。换个角度看它并没有失败它只是成功完成了一个“推到另一个位置”的任务。只要把那个实际到达的位置当作目标这个轨迹就不再是零奖励的失败样本而是充满正奖励的成功样本。这篇文章不打算停留在概念层面。我会带你把HER的原理拆开揉碎从目标重标记、轨迹采样、网络结构一直聊到参数怎么调代码怎么写以及我在实战里踩过的那些坑。适合正在入门强化学习、被稀疏奖励折磨的读者也适合已经跑通DQN/DDPG、想进一步提升样本效率的朋友。2. 先把“后见之明”这件事想明白2.1 人类视角的“事后聪明”和机器有什么不同先做一个思想实验。你让一个小孩去投篮他的目标是“把球投进篮筐”。前面二十次都投丢了球落在了不同位置。如果只看结果他的每次尝试都失败了。但下一次轮到他投的时候他其实学会了什么呢他学会了“往那个方向用力一点球会飞得更高”“往左边偏一点会落在更左边”——这些是基于之前每一次投丢动作的经验调整。换句话说虽然目标没完成但每一次失败都提供了有效的经验信息。强化学习的情况很类似。在稀疏奖励环境下一个回合结束只返回一个信号比如“是否到达目标点”到达给1否则给0。这样的reward信号量太少了模型很难从中学到任何梯度信息。你可能会想那我加上每一步的距离作为reward不就行了但实际工程里奖励函数设计本身就是一门玄学设计得不好会诱导模型钻空子比如机械臂发现“把方块扔到地上”能获得更大的距离收益于是学会了摔东西而不是推方块。HER的思路则完全不同它不修改奖励函数的定义而是修改“这个回合追了什么目标”。既然球落到了地上某个位置那我们就新定义一个目标“让球落在这个位置”然后回头看这个回合里每一步动作它们都是朝这个目标前进的有效动作每一步都能给予正向的reward。这样一来原本完全不可学习的稀疏奖励问题被转换成了稠密且有效的经验数据。2.2 为什么普通回放缓冲区学不到东西强化学习里的经验回放Experience Replay是把智能体与环境互动的transition状态、动作、奖励、下一状态存进一个缓冲区然后随机抽样去更新Q网络或策略网络。这种做法的好处是打乱了样本之间的时间相关性让网络更新更稳定。但这里存在一个结构性问题如果样本里的奖励基本都是0那缓冲区里存的全是无效样本。无论怎么抽样、采样多少次模型都得不到任何“做得好”的信号。我们说强化学习是试错学习但试错的前提是至少偶尔能试成功一次从而获得正样本。HER的贡献就在于它从“存量样本”上做文章不增加新的交互而是把缓冲区里已经存在的那些“失败轨迹”通过重新分配目标把它们变成正样本。样本数没变但有效信号的数量成倍增长。这就相当于把一个班级里所有考了60分以下的学生都按“55分是目标”的标准重新评价发现孩子们“完成度”其实不低。这当然有自欺欺人的味道但对训练网络来说这种重新标注恰恰提供了渐进式的学习信号。2.3 HER的三句话总结每个回合跑的轨迹除了按“原目标”存储还要额外按“实际到达状态”重新存储一份存储时把“实际到达状态”作为新的目标重新计算reward采样训练时新目标和原始目标混合使用让模型既学“怎么达成指定目标”又学“怎么达成眼前这个已达成目标”有了这个框架下面就可以进到具体实现层面了。3. 核心原理拆解目标重标记到底做了什么3.1 你需要一个能“带目标”的transition结构普通强化学习里的一个transition长这样(s, a, r, s)到了目标条件强化学习Goal-Conditioned RL里transition会多一个目标变量(s, g, a, r, s)这里的g就是当前回合要完成的目标。整个回合的目标是固定的每一帧都会带着这个目标去决策。网络学到的策略也是一个带条件的策略π(s, g)意思是“在这个状态下朝着这个目标我该做什么动作”。HER的改动就在这个g上。当智能体执行完一个回合我们手里有一条完整的轨迹[(s_0, g_original, a_0, r_0, s_1), (s_1, g_original, a_1, r_1, s_2), ..., (s_T, g_original, a_T, r_T, s_{T1})]注意这个g_original是预设的初始目标。由于稀疏奖励大部分时刻的r都是0。然后HER会做一件事在轨迹中挑一个实际状态s_t把它当作新的目标 g s_t再用g代替g_original为这条轨迹重新生成一份transition序列。因为每一步的状态都是朝着s_t前进的所以每一步的reward会变成非零值通常距离越近reward越大或到达时给正奖励。3.2future策略怎么选“新目标”最科学目标重标记听起来简单但有一个选择选哪个状态作为新目标论文里比较了四种策略分别是final选轨迹的最终状态作为新目标future选当前transition之后的某个随机状态episode选当前回合中随机某个状态random从整个回放缓冲区里随机选一个状态作为目标很多人直觉上会觉得final最合理毕竟轨迹最终状态就是实际到达的状态。但实验结果表明future策略效果最好。原因也不难理解。final把整条轨迹都重新标记为“到达最终状态”这话没错但容易产生大量“长期目标已完成”的样本另外无法回答“如果目标的可行域很大最终状态并不代表整条轨迹都朝它前进”的问题。future在当前时间步t往后随机选一个状态当作目标这样在时刻t目标确实在将来的某个位置说明从t向后的这段轨迹确实是在朝目标前进而t之前的那些transition虽然也被存储但因为目标状态是“未来的”它们仍然是一条合理逼近目标的轨迹。这种策略巧妙地把“目标不可达”转换成“目标在进度上更远的地方”配合时序逻辑学习信号最自然。我在实际实现中基本只用future策略。3.3 奖励函数的一致性必须保证HER涉及到一个容易出错但被很多人忽略的细节重新标记目标后奖励函数形式不能变。如果原始奖励函数是r(s, a, g) -[f(s) g]即“下一状态是否符合目标符合为0否则为-1”那么重新标记后也要用同一个函数去计算reward。如果原奖励函数是稠密的负距离函数r(s, a, g) -|f(s) - g|重新标记后也用它重算。好处是无论目标怎么换网络看到的reward分布是统一的不会出现“同一状态、同一动作、两个目标、reward数值范围完全不同”的矛盾信号。我遇到过一种错误做法为了偷懒重新标记后不重算reward直接沿用原来那步的r。这会导致新目标下的样本与奖励值完全错位训练出来的策略会非常怪异。记住HER的核心是重新计算reward绝不是简单复制一份数据。3.4 HER在DDPG里的位置HER本身不依赖某种特定的RL算法它是一个“数据层面”的改造方法。理论上它可以叠加在任意off-policy算法上比如DQN、DDPG、TD3、SAC。但最经典的搭配还是DDPGHER因为DDPG天然适合连续控制问题而HER最初就是为了解决连续动作空间的机器人操作任务设计的。在DDPG框架里HER只改动了一个地方采集完一个回合的轨迹后除了按原来的目标存储一遍再额外按重新标记的目标存储一遍。存储完成后后续的采样训练流程完全不变。也就是说HER可以像一个插件一样嵌入你已有的代码框架改造成本很低。4. 从零实现HER核心代码怎么写4.1 环境的选择与目标怎么抽象先选一个合适的验证环境。OpenAI Gym里有个经典环境叫FetchReach-v1任务是控制机械臂移动到某个目标点。目标空间是三维坐标。这个环境是稀疏奖励的只有机械臂末端接近目标位置时给1否则给0。用这个环境验证HER再合适不过。环境返回的观测分两部分observation是机械臂相关的状态desired_goal是目标位置。当回合结束时检查实际末端位置与目标位置的距离是否小于阈值来决定是否给正奖励。我自己复现实验时没有直接用Gym的版本而是自己写了一个简化的2D点目标环境一个点在平面上移动目标是到达某个坐标。这一步的抽象意义在于把“目标”和“状态”的类型统一成向量方便直接演示HER的逻辑。4.2 transition的存储与重新标记先定义一个buffer里存储的数据结构。注意我把每个transition按“原始目标”和“重标记目标”各存一份这是最简单的做法。更省显存的做法是先只存原始transition采样时再随机替换目标但那个思路会带来代码复杂度提升。上代码。先看核心的HER回放缓冲区class HERReplayBuffer: def __init__(self, capacity, k4, strategyfuture): self.capacity capacity self.k k # 每个transition额外重新标记的目标数量 self.strategy strategy self.buffer collections.deque(maxlencapacity) def store_episode(self, episode_transitions, info): 参数说明 episode_transitions: 一个列表每个元素是 (s, a, r, s_next, g_original) info: 回合额外信息如实际到达的goal集合 for transition in episode_transitions: s, a, r, s_next, g_original transition # 先按原始目标存储一份 self.buffer.append((s, a, r, s_next, g_original)) # 对每一条transition额外生成k条重标记样本 T len(episode_transitions) for t in range(T): s, a, r, s_next, g_original episode_transitions[t] # 按future策略从t之后的时刻里随机取k个状态作为新目标 future_states [episode_transitions[i][3] for i in range(t1, T)] if len(future_states) self.k: # 如果剩余状态不够k个就允许重复采样 chosen np.random.choice(future_states, sizeself.k, replaceTrue) else: chosen np.random.choice(future_states, sizeself.k, replaceFalse) for new_goal in chosen: # 以新目标重新计算reward这里用简单的稀疏奖励 new_reward 0.0 if np.linalg.norm(s_next[:2] - new_goal[:2]) 0.05 else -1.0 self.buffer.append((s, a, new_reward, s_next, new_goal))注意代码里的两个细节第一new_reward必须用new_goal重新算不能沿用原来的r第二future_states是从t1开始取保证新目标在未来的方向上。4.3 训练循环的完整接入有了HER回放缓冲区后训练主循环和普通DDPG差别不大。伪代码如下for epoch in range(total_epochs): episode_transitions [] obs env.reset() episode_reward 0 goal obs[desired_goal] for t in range(max_steps): action policy.get_action(obs[observation], goal) next_obs, reward, done, info env.step(action) episode_transitions.append( (obs[observation], action, reward, next_obs[observation], goal) ) obs next_obs if done: break # 关键HER利用整个回合的轨迹做重新标记 her_buffer.store_episode(episode_transitions, info) # 从缓冲区里随机采样mini-batch更新网络 for _ in range(n_updates): batch her_buffer.sample(batch_size) # 对batch里每个样本用一致的reward和goal更新Q网络和策略网络 update_policy_and_q(batch)实现上最容易忽略的一步在store_episode阶段episode_transitions中已经包含了原始reward。如果你用的是稀疏奖励环境reward大部分是-1或0但原始目标下这些样本照存不误。HER的妙处在于虽然原始样本大部分是负奖励但重标记后的样本会带来大量高价值正样本两者混合后Q网络才学得到区分优劣。4.4 参数怎么选k值、R_mix和网络结构HER论文里有一个超参数k控制每个transition额外重放多少个目标。论文实测表明k4在多数场景下效果比较好。更大的k意味着更大的重放样本容量但也会拉长训练时间更小的k省时间但样本多样性不足。还有一个常被忽略的超参叫“重放比例”replay ratio。实际训练时每次梯度更新采样的batch里最好混合原始目标样本和HER重标记样本。我在实践中的做法是50%原始目标样本、50%HER样本。如果HER样本比例太高模型会对“目标的统计分布”产生偏移比如更擅长从“当前状态出发完成随机一个状态”而不是“完成设定目标”。这个比例没有标准答案需要根据任务微调。网络结构方面DDPGHER通常用两层全连接网络每层256或512个神经元激活函数用ReLU。目标空间维度如果很大比如图像目标则需要加卷积层或使用视觉编码器。我自己在机器人仿真任务里直接用512512的结构效果已经很稳定。5. 实操效果对比HER到底能快多少5.1 Bit Flipping实验一个教科书级别的验证为了直观理解HER的威力我用一个极简环境做测试。这个环境叫Bit Flipping有一个长度为20的比特串目标串是随机的另一个比特串每个动作是翻转某一位。只有当整串比特全部匹配时奖励才为1。这个环境最大的特点是随机策略几乎不可能碰到正奖励。因为成功概率是2的20次方分之一约等于一百万分之一。在这个环境里普通DDPG完全无法学习训练曲线是一条水平线因为经验缓冲区里连一个正样本都没有。而加入HER之后大约几千个回合就能达到接近100%的成功率。原因很直接HER把一条随机翻转的轨迹重新标记为“目标就是最终翻转后的比特串”于是这条轨迹的每一步都接近final goal每一步都会收到奖励。模型可以不断地从这些虚拟成功样本中学习。我把训练成功率画出来对比过第一阶段前2000回合普通DDPG成功率永远挂零HER则已经爬升到60%以上。这个对比是我见过的最直观的“HER有效”的证据。5.2 FetchReach环境连续控制的表现在FetchReach-v1环境里目标是一个三维点机械臂要移动末端去触摸它。这个任务其实已经不能算完全稀疏了因为环境还有个observation里包含物体位置信息。但我把奖励替换成严格稀疏的只有当距离小于5cm时才给1。这种情况下普通DDPG成功率在30万步内几乎没有突破DDPGHER大约在10万步时可以达到约80%的成功率。另一个值得一提的现象是HER训练出来的策略对目标点的泛化性更强。因为重放缓冲区里的目标来自“实际采样到的状态”这些状态的分布天然覆盖了机械臂可达空间。而普通目标条件策略如果只在一个固定目标点上训练换一个目标点可能就失灵了。HER相当于隐式地做了数据增强丰富了目标的采样分布。5.3 交替采样对训练稳定性的影响我在实验中发现一个有意思的现象如果每次更新100%从HER重标记样本里抽样早期训练会非常快但后期会出现Q值过高估计的问题。因为那些“虚拟成功样本”的target reward都是接近满分的Q网络会倾向于认为所有状态下都能快速成功从而过度乐观。混入一部分原始稀疏样本后Q值能回归到合理区间。这解释了为什么我一直强调原始样本和重标记样本需要混合使用。实操中我还会给HER样本设一个小的优先级权重。比如让HER样本的采样概率略低于原始样本0.4 vs 0.6或者反过来根据任务决定。这不是论文里的标准做法但在我测试的多个任务里适当的样本比例调控确实能提升最终成功率。6. 常见问题与排查技巧实录6.1 训练很久仍然无法成功最先该查哪里如果DDPGHER跑了几十万步成功率还是零我的排查顺序是先检查重新标记后的reward是否真的是正的。打印几个HER样本出来核验新目标是否确实与s_next距离接近。很多情况下这里出的问题在于目标空间和状态空间的单位不一致比如目标是四元数状态是欧拉角但直接拿二者做距离计算导致reward全是负的。检查future策略取的是s_next还是s。有的实现会把当前状态s_t误当作新目标这样模型学到的是“原地不动”训练当然无效。查看采样比例。如果HER样本比例过低效果就不明显如果过高Q值过估计。我一般先从9:1原始HER开始试如果学习速度太慢再逐步调高HER比例。6.2 为什么有时HER会导致策略“躺平”有一种典型故障策略学会了“不管目标是什么都往一个固定的平均位置跑”。这本质上是因为重放缓冲区里很多目标状态是从轨迹中采样的而这些目标的分布偏向于轨迹走向的中间态。如果目标空间很大而轨迹覆盖不足模型可能找到一条“中间路线”来最小化平均距离误差。我遇到这种情况后采取的修正措施是把一部分HER目标改为final策略仅取回合最终状态作为新目标这样可以强制模型训练数据覆盖到真正的可达空间边界。或者把原始目标的采样比例提高一点让模型更关注“达成预设目标”而不是“去过的地方”。但需要注意这仍然是一个任务层面的调节问题没有一个固定配方能通吃所有环境。6.3 代码层面的常见bug清单写HER代码时最常见的几个bug重标记后没有重新计算reward导致reward与goal不匹配存储transition时只存了(s, a, r, s_next)丢掉了原始目标g使用final策略时把最终状态当成所有时间步的目标导致早中期transition的目标是“将来才会到达的状态”这些transition在t时刻其实是无效的没有注意轨迹长度不一致future策略在短轨迹上采样越界目标空间是归一化的但状态空间没有归一化导致距离计算失效这些bug都不会导致程序崩溃但会让训练结果看起来像“玄学”。我建议在写完HER后写一个单元测试手动构造一条简单轨迹手动计算预期的新目标和新reward与代码输出比较。6.4 什么时候不应该用HERHER不是万能的。它适合问题结构满足“目标可以在状态空间中直接定义”的情况比如机械臂抓取、导航、机器人操作。但如果目标的定义依赖隐藏信息、或者目标本身不可从观测中推断HER就很难奏效。比如一个对话任务目标是“用户满意”这个目标无法直接从状态空间里取值HER就无法重标记。另外HER改善的是样本效率不改变算法本身的探索能力。如果动作空间极大而奖励信号又极端稀疏HER能提供渐进信号但初始随机探索如果真的完全到不了任何有意义的区域那它的帮助也会有限。在这种情况下可以考虑结合随机化目标采样如Go-Explore做更激进的探索。7. 从HER延伸到更广的“后见之明”思维7.1 目标重采样在其他算法里的影子HER之后很多工作吸收了它的思想。比如RIGRelabeling and Implicit Goals、GCBCGoal-conditioned BC里都能看到类似“利用事后状态作为目标”的思路。在多任务强化学习里用行为状态自动生成目标是一种绕过人类设计目标的通用策略。它的本质是用智能体自己的行为轨迹来定义任务伪目标从而消除对人工目标设计的依赖。这个思路在工程落地里有个很重要的作用降低了任务设计的门槛。传统IRL逆向强化学习需要专家轨迹来学奖励函数HER却直接从失败轨迹中“萃取”目标。对一个工业应用场景来说与其让工程师花两周时间定义reward逼近函数不如设置一个可达性检测函数然后把HER作为默认的数据增强手段加上去。7.2 事后复盘思维对整个AI项目的启发说实话HER给我的最大启发不在算法本身而在“如何重新认识失败数据”。很多AI项目都会积累大量失败的任务日志在传统的监督学习里这些数据如果不能标注正确答案几乎就是垃圾。但HER告诉我们换个目标定义失败数据就能变成另一种任务的训练样本。这是一种数据利用观的转变——从“只使用成功数据”变成“让失败数据也说话”。这个思路迁移到业务里也很有效。比如推荐系统里用户点了这个商品但没点击那个商品站在“预测点击率”的任务里没点击就是负样本但站在“理解用户偏好相似性”的任务里没点击的商品和点击过的商品之间也存在结构关系完全可以换个预测目标再学一次。7.3 落地时值得注意的工程事项最后聊几个工程化部署HER时的经验优先把HER封装在数据采集和存储层不要侵入到网络结构代码里这样算法可以灵活切换从DDPG换到TD3只需改一个配置项对每个episode先完整存原始轨迹训练时再统一做目标重标记比存入缓冲区前做重标记更省内存目标空间的归一化非常重要。我在实验里踩过坑位置目标直接用原始坐标导致距离范围从0.01到10差异巨大reward一直在饱和区或截断区震荡学习极慢。归一化到[-1,1]后一切正常。如果环境有并行采集注意线程安全的缓冲区写入。多进程采集加上无锁队列容易在重标记时出现数据错乱。我习惯在主进程统一做HER重标记子进程只负责把原始transition发送回来。8. 写在最后一点真实体会从第一次在论文里读到HER到亲手复现、调参、部署我最大的感受是“后见之明”看起来是一个心理学概念实际上它是一类工程方法论。我们总是希望模型一次就能学到正确行为但现实是大多数时候模型都在犯错。与其硬碰硬地跟稀疏奖励较劲不如大方承认“这个回合失败了”然后换个角度把它重新定义成成功经验。如果你现在正被稀疏奖励折磨得头大我建议你先别急着用复杂的好奇心探索机制或者手调稠密奖励函数先动手加一个HER看看。我赌你会在半天之内看到训练曲线的明显变化。当然HER不是银弹它会引入新的超参数和调试成本但当你亲眼看到那条从零开始爬升的成功率曲线时一切折腾都是值得的。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

香港科技大学工学院2027FALL研究生项目招生宣讲会-长安大学专场 2026/9/30 12:57:28

香港科技大学工学院2027FALL研究生项目招生宣讲会-长安大学专场

时间:2026年10月13日(星期二)18:30 地点:长安大学渭水校区WH1104 港科大《QS 2027》全球第 33 位|工程学 QS 连续 16 年全港第 1 授课型 TPG(MSc):18 个热门硕士课程,一…

阅读更多 →
LLM推理部署实战:AI硬件加速器选型与优化指南 2026/9/30 12:57:28

LLM推理部署实战:AI硬件加速器选型与优化指南

这两年只要碰LLM,基本逃不开一个问题:算力从哪来。模型参数从几十亿涨到几千亿,每次回复都是一个 token 一个 token 蹦出来的,每蹦一个 token,背后都是整张大模型在前向计算一遍。AI硬件加速器,正是这个背景…

阅读更多 →
LLM本地部署硬件加速器选型与性能调优实战指南 2026/9/30 12:57:28

LLM本地部署硬件加速器选型与性能调优实战指南

1. 从模型到算力:为什么LLM离不开专门的AI硬件加速器聊LLM的人越来越多,但真正把LLM跑起来、跑得快、跑得省的人,大家聊到最后都会落到同一个话题上:算力。很多人一开始接触大模型,是在开源榜单上看到某个模型效果不错…

阅读更多 →
信息化技术架构规划方案:超融合与云管理落地指南 2026/9/30 12:57:27

信息化技术架构规划方案:超融合与云管理落地指南

简介:这份PPT案例面向企业IT架构师、信息化规划人员及数字化转型项目负责人,围绕2022年信息化技术架构规划方案展开,重点解决业务扩张驱动组织整合拆分、多云部署协同困难、IT资源异构等现实问题。内容涵盖架构规划、云管理、信息安全体系建设…

阅读更多 →
C++单调栈全解析:原理、模板与经典面试题 2026/9/30 12:57:21

C++单调栈全解析:原理、模板与经典面试题

刷LeetCode和准备C面试的时候,单调栈几乎是绕不开的一块硬骨头。我第一次接触这东西是在刷每日温度那道题,当时用双重循环写了个O(n)的解法,一提交数据稍微大点就超时,整个人处于既懵又急的状态。后来把单调栈的原理吃透了才明白&…

阅读更多 →
制造业人员背调方案的实施流程、周期与SLA是否透明可验证? 2026/9/30 12:57:21

制造业人员背调方案的实施流程、周期与SLA是否透明可验证?

制造业人员背调的周期不能用一个“平均几天”概括。身份、教育、任职、资格、证明人访谈和异常复核所依赖的来源不同,多厂区、批量招聘、轮班到岗和关键工种资质又会改变优先级。可验证的SLA应分别定义起算条件、各阶段完成标准、暂停计时、超时升级、数据截止时间和…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉