新闻详情

新闻详情

首页 / 资讯中心 / 详情

事后经验回放HER:用失败轨迹破解强化学习稀疏奖励难题

发布时间:2026/10/2 22:31:11来源:尧图网络
事后经验回放HER:用失败轨迹破解强化学习稀疏奖励难题
hindsight这个词直译过来就是“后见之明”说难听点叫“事后诸葛亮”。生活里到处都是它的影子股票涨了有人喊“我早就看出来了”考试出分有人懊恼“那道题我明明会做”。心理学家专门给这种倾向起过一个名字——“后见之明偏差”hindsight bias说的是人在结果揭晓之后总会下意识高估自己事前预判的准确度。但今天我想聊的不是心理学而是“事后诸葛”这个概念如何被人工智能研究者捡起来变成强化学习里一个非常好用的算法基石——Hindsight Experience Replay简称HER一般翻译成“事后经验回放”。如果你和我一样第一次听到“把失败轨迹重新标成成功样本”这个思路时脑子里冒出来的第一句话大概率是这也能行答案是不仅能行而且在多目标稀疏奖励任务里往往是最有效的解法之一。这篇内容我会从思路来源、算法机制、代码实现到调参踩坑完整拆一遍。不管你是正在做机器人控制、游戏AI还是单纯想搞懂强化学习里最巧妙的设计之一这篇文章应该都能给你一点启发。1. “hindsight”灵感从哪里来认知偏差与算法思想的碰撞1.1 人类认知里的后见之明偏差在认知科学里hindsight bias是个非常经典的课题。研究者做过不少实验先让参与者估一个事情的发生倾向过段时间告诉ta真实结果再让ta回忆自己当初是怎么判断的。结果大部分参与者都会“记错”把自己当初的判断往真实结果的方向靠拢。这不是记忆力差而是大脑在整理记忆时会拿已知结果去重新“校准”过去的判断。这个现象常年被当成认知缺陷来讨论因为它会污染复盘的真实性一旦结果揭晓你就很难老老实实承认自己当时是猜的。但只要稍微换一个角度这个“缺陷”背后藏着一个极其强大的能力——大脑天然善于利用结果信息来总结经验。不管过程多混乱结果一出来我们就能围绕结果快速组织出解释和记忆。这种“拿最终结果反哺过程经验”的机制恰好是强化学习模型最初非常缺的东西。我刚接触强化学习的时候折腾过一个栅格找球问题智能体在一个100x100的网格里要走到一个随机位置。因为目标每次都在一个很远的角落模型训练了很久奖励曲线都是平的。当时第一反应是“加大学习率、换网络”折腾好几天没什么用。后来才意识到问题根本不是优化器不够强而是模型从头到尾没收到过几次正反馈它连“什么算是好”都没见过怎么可能学得会1.2 强化学习里的稀疏奖励是训练启动的头号阻碍强化学习的标准玩法是让智能体通过和环境不断交互最大化累计奖励。任务目标通常很直白走到某个坐标、把物体推到指定位置、赢得一局对局。问题在于很多任务的目标达成条件极其苛刻。拿机器人抓取来举例目标是机械臂末端到达某个精确坐标坐标每回合随机变化。如果奖励函数写成“到达才算成功”训练初期智能体会经历非常长的“双重黑”阶段一是它不知道怎么动二是就算动了也不知道动得对不对因为反正每一步都是0分。这种状态一旦持续几百上千个episode标准的梯度下降几乎找不到任何有用的学习信号。我试过在仿真环境里观察这个过程随机策略跑出来的轨迹回放池里塞满了“失败样本”每一条的reward都是0。此时你去训练Q网络它的loss其实很快就降下来了——因为所有目标值都是0只要把预测输出都压到0附近loss自然就小了。但这根本没有带来任何策略进步预测值全部趋同动作选择等于乱猜。这里最隐蔽的坑是很多人看到loss下降就觉得模型在进步实际上一丁点策略变化都没有。这也是稀疏奖励问题特别能“骗人”的地方。1.3 反向用“事后视角”失败轨迹里也能挖出成功样本HER的出发点是一条很朴素但反直觉的想法。这一局我定的目标是A结果智能体从初始状态出发折腾了半天也没到A最后停在了B点。那么这条轨迹对目标A来说是失败的但换个视角它对“目标B”来说是不是刚好就是一条成功的完整轨迹智能体从起点出发一步步调整最终落在了B点附近——这正是“到达B”这件事的标准示范。那我为什么不把这条轨迹存进经验池时顺手给它打上“目标B”的标签把奖励改写成“成功到达B1”呢这样一来一条原本毫无学习价值的失败轨迹摇身一变就成了正样本。这个过程用人类的“后见之明”来理解非常顺虽然没达成原计划但如果过程中意外完成了别的目标那这段经历同样值得记下来。我自己练投篮就是这样一开始怎么投都不进每一次出手的落点其实都在告诉我“用力、角度和落点之间是什么关系”。只不过人脑会自动吸收这些隐含信息而机器人需要研究者专门设计一个机制把这些“落点信息”显式地标成目标喂给学习算法。2. HER算法的机制拆解与选型逻辑2.1 普通经验回放在零奖励环境里的困境聊HER之前必须把经验回放Experience Replay的基本机制说清楚。它是DQN时代引入的经典设计把交互中产生的四元组状态、动作、奖励、下一状态存进回放池训练时随机采样一小批打破样本之间的时序关联。回放池就像一个错题本模型每天随机翻几道旧题出来复习。这个设计在奖励较密集的环境里很好用。但放到稀疏奖励场景错题本里全是“0分题”。无论怎么随机抽样样本给模型传递的信息都趋同反正做什么都没奖励。Q值的更新方向会变得很平滑却没有意义模型根本无法建立起“状态-动作-结果”的因果关系。有人会问那把奖励函数改宽松点不就行了比如把“到达才给1分”改成“距离目标越近分越高”。这确实是一种缓解办法但它有一个代价奖励塑形本身是一门玄学尺度、函数形态、奖励范围都会影响训练收敛性。而且塑形奖励很容易带偏策略——智能体可能找到一堆刷分的捷径而不是真正完成目标。HER提供的是另一种思路不调环境、不改奖励只改造经验池里的样本标签把错题本里的一部分“废题”改写成“好题”。2.2 目标重标记HER的核心操作HER的全称是Hindsight Experience Replay核心操作就两步。第一步正常rollout一整条轨迹把状态转移序列和动作序列完整记下来。第二步在把这批样本写入经验池之前用“事后视角”给轨迹指定一个新目标goal。这个goal通常取轨迹实际到达过的某个状态比如终点状态或者未来某一步的状态。随后用这个新目标重新计算每一步的奖励得到一批“重标记样本”。举例最直观一个机械臂推木块目标是推到坐标(1.2, 3.4)结果木块最后停在(2.0, 3.1)。原始轨迹里每步奖励都是0但把目标改成(2.0, 3.1)后轨迹末段的几个状态恰好落在这个目标的有效邻域内于是那些步骤的奖励变成了1。整条轨迹从“废品”变成了“含金量不错的样本”。需要注意一个前提HER要求任务必须是多目标设定的。也就是说环境里除了状态空间和动作空间还存在一个可描述的goal space奖励函数能表示为r(s, a, goal)。如果你是单一固定目标的任务比如不管怎么重置小车永远只往同一个位置开那轨迹实际到达状态就等于固定目标本身重标记没有意义甚至会把样本引向错误方向。2.3 四种目标采样策略怎么选HER论文里给出了四种选择新目标的方式我直接用表整理出来策略重标记目标的来源适用情况final取轨迹最终状态实现最简单轨迹较短、目标空间较集中时够用future取当前时刻未来k步内的某个状态最推荐多样性和可达性平衡得最好episode取本回合内任意随机状态样本多样性高但可能造出难度过高的假目标random从整个目标空间随机采样覆盖整个目标空间但前期训练难度大我自己在项目里最常用的是future策略加k4兼顾了样本的时间跨度和目标可达性。final策略的问题是会形成一个“取样偏差”大量重标记样本的目标都集中在轨迹终点附近导致目标空间里离起点近的区域被过度学习远处的目标覆盖不足。episode策略虽然多样性上来了但随机抽到的目标可能离当前状态太远生成的样本学习价值不高。random就更极端了相当于让模型一上来就学一张全目标空间的“世界地图”对初始阶段的Q值估计来说负担偏重。顺带说一个经验k值不是越大越好。我试过k8和k16某些环境里训练反而变慢。因为k越大重标记目标与当前时刻的关联越弱样本的有效性下降。具体k值建议从4起步结合目标空间大小和单回合步数来调。2.4 哪些任务适合HER哪些不适合HER的优点很突出但它有明确的适用范围硬上往往会踩坑。适合的任务有三个硬性条件第一多目标设定存在可描述的goal space第二奖励可以根据goal快速重算否则重标记每一条样本的代价太高第三底层算法是off-policy的比如DQN、DDPG、TD3、SAC因为HER依赖经验回放池。on-policy算法比如A2C、PPO的标准版本每次采样策略都会变化历史轨迹的重标意义会打折扣需要额外改造才能用。不适合的场景也要说清楚如果目标空间极度不规则或者真实目标分布和轨迹状态分布差得离谱那重标记出来的“伪目标”可能并不反映真实任务分布反而引入偏差。我遇到过一个真实案例在仿真环境里HER效果非常好但把同一套流程搬到真实机械臂上就崩了。原因很简单仿真里的目标空间是连续平滑的而真实平台的目标采样带一些离散约束重标记出的目标在真实环境中根本不可达策略学了一堆花架子。后来把重标记目标限制在轨迹实际访问过的状态集合里才算稳定下来。这个细节论文里不明显但工程上非常关键。3. 手写一个HER最小demo从零到出效果3.1 一个随机目标的一维移动问题理论讲再多不如动手跑一个例子。我用一个极简环境演示HER的原理一维坐标长度101个格子小球初始位置在50。每回合从0到100之间均匀抽11个离散目标之一作为本回合的目标点。小球每步可以选择向左一格、原地不动、向右一格如果小球位置与目标位置的距离不超过2格奖励1分否则0分。单回合最多100步。这个环境把稀疏奖励和多目标两个痛点都浓缩了成功条件苛刻目标随机变化。随机策略下的成功率非常低绝大多数轨迹完全拿不到正奖励。更妙的是目标空间和状态空间在这个例子里是统一的重标记的目标就是“一个真实存在过的位置”可达性天然有保证。这里把“目标”和“状态”设计成同一种数据是HER最常见也最舒服的一种用法。实际机器人场景里goal往往是“物体位置”或“末端位置”而state里还会包含速度、关节角等额外变量但核心逻辑一模一样。为了演示方便我一维空间里让它们重合了。3.2 不带HER奖励全零loss下降但策略不动先用普通DQN在这个环境上跑注意观察两个指标一个是loss一个是成功率。我先把核心网络定义列出来。状态是一个位置的标量目标也是一个标量输入神经网络前并成一个两维向量网络输出三个动作左、停、右各自的Q值。import torch import torch.nn as nn class QNet(nn.Module): def __init__(self): super().__init__() self.net nn.Sequential( nn.Linear(2, 64), nn.ReLU(), nn.Linear(64, 64), nn.ReLU(), nn.Linear(64, 3), ) def forward(self, state, goal): x torch.cat([state.float(), goal.float()], dim-1) return self.net(x)训练循环里每回合正常采样轨迹把(s, goal, a, r, s_next)存入回放池随机抽batch更新Q网络。在强化学习流程里写得多了以后你会发现代码结构都差不多真正改变命运的往往就是“样本进池子之前做了什么”。不带HER跑到3000回合最典型的现象是loss很快就降到一个贴近0的低位但成功率始终上不去甚至因为探索率衰减策略开始固定在某个无意义动作上成功率比随机策略还要差。原因我在2.1已经说过——回放池里全是零奖样本模型唯一学到的事情就是“把所有Q值输出到接近0”。这里给大家提个醒训练曲线里loss下降不等于策略变好一定要同时看成功率/累计奖励这类更有意义的指标。3.3 HER重标记函数成败就在这几十行接下来是HER的核心重标记函数。我在完整demo里抽出的关键代码是这样import numpy as np def reward_for(x, goal): return 1.0 if abs(x - goal) 2 else 0.0 def her_relabel(transitions, original_goal, strategyfuture, k4): transitions: 列表每个元素是 (s, a, s_next) original_goal: 本回合真实目标 T len(transitions) samples [] for i, (s, a, s_next) in enumerate(transitions): # 原始目标样本保留 samples.append((s, original_goal, a, reward_for(s_next, original_goal), s_next)) # 事后重标记样本另选一个目标并重算奖励 if strategy final: g_new transitions[-1][2] # 终点状态 elif strategy future: upper min(T, i 1 k) # 从未来k条转移里抽 j int(np.random.randint(i 1, upper)) if i 1 upper else T - 1 g_new transitions[j][0] # 取该转移的起点状态 elif strategy episode: j int(np.random.randint(0, T)) g_new transitions[j][0] # 本回合内任意状态 else: g_new float(np.random.choice([0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100])) samples.append((s, g_new, a, reward_for(s_next, g_new), s_next)) return samples这几十行代码就是HER的全部灵魂。注意这里的每个episode都会产出两倍数量的样本一份保留原始目标一份用重标记后的目标生成。让模型同时看到“原任务的失败”和“变体任务的成功”它才能在对比中学到真正的因果结构。future策略里我取的是未来某条转移的起点状态作为新目标。当抽到i1这条转移时g_new恰好等于s_{i1}那么当前样本的奖励立刻变成1正样本就这样无中生有了。整条轨迹越往后越容易命中这种“短距离目标”所以轨迹末端会生成一片高质量正样本这正是HER能带动稀疏奖励训练的关键。采集轨迹时记得记录完整的转移序列而不要只记录奖励。因为在重标记时要重新算奖励原始奖励已经没用了状态转移才是原材料。3.4 训练曲线与我的参数建议加上HER之后同一套DQN只在样本入池前多调用一次her_relabel训练行为会发生肉眼可见的变化。我用这个demo跑出来的典型趋势是前一两百回合正样本比例逐渐增加随后Q值开始出现明显的分化成功率曲线从底部慢慢抬起最终稳定在一个远高于随机策略的水平。整个过程没有改动任何奖励函数也没有增加任何手工知识只靠“改标签”就把训练盘活了。这里给出一组我调试时踩出来的参数基线适合这类小规模离散环境作为起点参数建议值备注经验池容量50000用collections.deque实现满了从左侧弹出batch size256太小不稳定k值4目标空间100格时比较稳探索率1.0到0.02线性衰减衰减周期约2000回合目标网络更新每500步软更新或硬拷贝DQN必备HER重标记比例每条轨迹生成1倍重标记样本和原始样本等比例入池还有一个常被问到的问题既然重标记生成的样本这么好干脆只存重标记样本不存原始样本行不行我的建议是不要。原始样本保留了“真实目标”的分布信息如果只重标记模型会忽略真实目标空间中那些远离轨迹的区域造成目标覆盖偏差。两倍样本、两边都要是HER论文及大多数工程实现默认的方案这个平衡不建议打破。4. 实战中容易踩的坑与排障经验4.1 HER不收敛先检查这三件事如果加了HER训练还是不动先不要怀疑算法本身按照下面顺序排查第一确认环境是不是真的多目标。很多任务看起来有随机目标但奖励函数里并没有显式使用goal来计算重标记后奖励根本不变那HER等于白加。快速验证方法随机取一条轨迹把目标改成轨迹终点手动重算奖励看最后几步是不是变成了1如果不是说明goal和reward的关联没接好。第二确认采样策略和k值是否得体。如果重标记后正样本比例仍然极低你可以在训练代码里加一个计数器统计每次采样时reward为1的样本占比。我见过有些项目里这个比例连1%都不到那说明目标空间离轨迹可达区域太远此时可以换final策略或者增大k值。反过来如果正样本比例一开始就高达30%以上说明任务其实没那么稀疏优先检查是不是奖励阈值设得太宽了。第三确认on-policy/off-policy的匹配。如果你用的是REINFORCE或者A2C这类on-policy算法HER的重标记目标会和当前策略的行为分布不一致效果大打折扣。这时候要么换成DQN/DDPG/SAC等off-policy算法要么做额外的importance sampling修正但后者实现成本很高我一般不推荐新手碰。4.2 采样策略、目标合理性带来的隐蔽问题HER看起来简单但工程实现里有几个隐蔽的坑我踩过也帮别人排查过。第一个隐蔽坑是“重标记目标不等于实际可达目标”。在仿真环境里目标空间和状态空间通常完全重合重标记出的任何位置理论上都可达。但真实系统里goal往往是“物体的期望位置”而状态里的物体实际位置会受到物理约束、障碍物、关节限位的影响。如果你把轨迹终点直接当新目标这个目标在物理上可能并不可达模型学出来的策略就会带着“虚拟目标”的偏见部署时立刻失效。解决方法就是我在2.4提到的把重标记目标限制在轨迹实际访问过的状态集合内或者加一个物理可行性检查。第二个隐蔽坑是“重标记样本和原始样本在回放池里的比例失衡”。如果你的her_relabel函数被调用了两次比如在一段完整episode里又对折半子序列分别重标了一次那么重标记样本可能占主导模型会被“事后视角”带跑偏。建议固定比例比如每条轨迹原始样本和重标记样本1:1不要贪多。第三个坑和目标编码方式有关。很多任务里goal只是状态的一部分比如状态是(物体位置, 物体速度, 机械臂关节角)目标却只关心物体位置。要是直接把状态整体当goal模型要学的东西是“整个高维状态的轨迹分布”难度陡然上升效果反而不如只取目标子空间。我在项目里一般会单独写一个字典/映射来区分state和goal防止数据维度揉在一起。4.3 从仿真到真实平台重标记目标必须可达到前面我已经提过仿真和真实平台的差别这里再展开讲一次因为这是我个人印象最深的一次翻车经历。当时做一个双臂协作推箱子的项目仿真阶段一切顺利成功率做到了90%以上。迁移到真实平台后头几百次部署测试就暴露了问题机械臂经常摆出一些奇奇怪怪的姿态明明是在往一个看似正确的目标移动但轨迹末端总会卡在关节极限附近要么就是目标点被另一个臂挡住了。后来定位到根因真机训练时经验池里很多重标记样本的目标来自仿真离线轨迹这些目标在真实环境中由于臂间碰撞而不可达策略却在努力朝这些“鬼目标”靠近。处理办法是加一条约束重标记目标必须满足真实环境的碰撞检测和关节限位检查不满足的直接丢弃。同时把future策略的k值从4降到2因为真实平台轨迹更嘈杂远期状态作为目标的可靠性下降。这两处调整之后真机成功率重新回到85%以上。这个案例给我的教训是HER在仿真里表现好不代表在真实环境里直接照搬就安全凡是重标记目标都要做“可达性复审”。4.4 调试技巧监控正样本比例最后分享一个调试技巧也是我每次跑HER必做的一件事在训练循环里加一个指标实时统计每个批次中reward为1的样本占比。这个比例是杠杆点。如果它长期接近0说明训练信号没起来问题大概率在采样策略或目标空间设计如果这个比例在训练中后期逐渐走高说明模型确实在学会“靠近目标”的技能重标记机制在起作用。我一般把它和成功率画在同一张图里两个曲线的先后关系能帮我看清楚HER是“先产生信号再带动成功率”还是“信号不产生、成功率也一直被压着”。另外我还习惯把重标记出来的正样本单独打一个logging标记抽样打印出对应的s、goal和s_next。用肉眼确认这些正样本不是“贴脸生成”的假样本而是有意义的中间状态。这一步看起来笨但在复杂环境里往往能救回好几个小时的调试时间。这篇文章写到这里我最后想说的是HER真正教会我的其实不只是那一套重标记函数而是一种处理“失败数据”的思维方式不要急着扔掉没有目标的轨迹先想一想这些数据在什么目标下可能是有价值的。这种思路现在已经延伸到许多方向比如模仿学习里做轨迹标注、离线强化学习里做伪目标数据增强甚至在一些推荐系统的冷启动策略里也能看到“事后视角”的影子。hindsight这个词在心理学里带着点自嘲的意味但在强化学习这条技术路线上它正经是一个能把稀疏奖励盘活的利器。如果你手头正好有一个“多目标奖励稀疏”的任务卡着没进展不妨按这篇文章的步骤先实现一个最小demo再逐步加大环境复杂度。我自己的体验是第一次亲眼看到假样本数量从0涨起来的时候你真的会相信失败里面确实藏着金子。
网站建设高端定制企业官网
RELATED

相关资讯

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

较早相关资讯

最新相关资讯

集团首都公报:放飞炬人集团行政总裁方达炬批准  设置  自主战斗署全球范围的自主战斗主管部门,自主战斗领导机构。 2026/10/2 23:44:30

集团首都公报:放飞炬人集团行政总裁方达炬批准 设置 自主战斗署全球范围的自主战斗主管部门,自主战斗领导机构。

集团首都公报:放飞炬人集团行政总裁方达炬批准 设置 自主战斗署 全球范围的自主战斗主管部门,自主战斗领导机构。

阅读更多 →
[强网杯 2019]随便注_CTF2 2026/10/2 23:42:47

[强网杯 2019]随便注_CTF2

靶场环境:easy_sql 环境展示 解题过程 1. 判断注入类型 输入 1 正常回显 输入 1 报错 说明存在单引号字符型注入。 2. 判断字段数 通过 order by 探测: 1 order by 1# 正常 1 order by 2# 正常 1 order by 3# 报错 说明当前查询语句有 2 个字段。…

阅读更多 →
022_位填充规则违反后的错误检测过程 2026/10/2 23:40:52

022_位填充规则违反后的错误检测过程

022、位填充规则违反后的错误检测过程 那个让人抓狂的“幽灵丢帧” 前年做一个多节点同步采集的项目,主控和几个从节点走差分总线,波特率跑到500k。实验室里跑了一整天,丢帧率稳定在千分之三左右,偶尔某个从节点会彻底掉线,重新上电又好了。一开始怀疑是线缆屏蔽没做好,…

阅读更多 →
1-26笔记 2026/10/2 23:40:21

1-26笔记

1.计算机基础2.CS架构与BS架构 C:客户端(需要安装;不可跨平台) B:浏览器(无需安装;无需更新;可跨平台) S: 服务器 3.网页 结构(HTML) 表现&…

阅读更多 →
AI开始“主动上班”了:OpenAI推出24小时在线的智能体 Dots 2026/10/2 23:38:15

AI开始“主动上班”了:OpenAI推出24小时在线的智能体 Dots

以前用 AI,通常是人先提问,AI 再回答。现在,AI 开始尝试在你没发出下一条指令时,继续推进工作。 9月29日,OpenAI 发布智能体产品 Dots。据官方介绍,每个 Dot 都有自己的云端电脑,可以使用浏览器…

阅读更多 →
cywebdh导航主题6.1.0版本前瞻 2026/10/2 23:33:29

cywebdh导航主题6.1.0版本前瞻

1.全面优化导航系统细节。 重大更新: 2.内置indexNow实现必应快速收录[站点足够优质可实现天级收录,即当天发布当天收录] 3.全局改为采用模块化布局设计,像拼积木一样自由搭配组合。随心调整,无需繁琐操作,即可快速构…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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