☰
HER事后经验回放全解析:解决稀疏奖励强化学习的核心技巧
2026/10/1 4:15:21 网站建设 项目流程

平时训练机械臂把方块推到指定位置,十万个回合跑下来,平均奖励几乎是零——不是代码写崩了,而是稀疏奖励(sparse reward)这个老对手在作祟。目标太苛刻,智能体又完全靠随机探索撞运气,碰不到目标就永远学不到东西。Hindsight Experience Replay(HER,事后经验回放)是专门为这种困境设计的一招:既然预设目标太难,那就换个思路,把实际到达的状态当作一个“事后目标”,让这次看似失败的尝试变成一条可以学习的成功轨迹。

这个算法的名字直译就是“事后诸葛亮”,核心哲学也很直白:利用结果来重新解释失败。这篇内容我会从算法设计思路、核心实现细节、完整实操过程到超参数的坑,逐个拆开讲清楚,适合正在做机器人控制、连续控制或稀疏奖励强化学习项目的人参考。如果你只听说过HER但没真正看懂它的原理,或者打算在自己环境里接入HER却不知道怎么动手,这篇文章应该能给你一份可直接落地的答案。

1. 内容整体设计与思路拆解

1.1 稀疏奖励为什么会把强化学习逼到死角

在讲HER之前,先得弄清它解决的问题到底难在哪。以机器人推动物体到达目标位置的任务为例,状态空间往往是连续的,物体可以出现在平面内的无数个位置。如果我们只在物体位置与目标位置足够接近时给奖励,比如距离小于0.05m,那么智能体在随机探索阶段几乎不可能恰好落到这个狭窄区间。

这样一来,整个训练过程中奖励长期为0,策略网络收到的梯度信号几乎每次都一样,既没有正向反馈,也没有负向反馈,网络参数更新完全迷失方向,等价于在做随机游走。更麻烦的是,探索能力会随着训练推进逐渐退化,因为动作选择的随机性会被策略网络收敛所压制,导致后续采样到的轨迹也难以命中目标,形成了一个死循环。

这里要特别提醒一点:稀疏奖励或者无奖励的episode并不是没有信息量,它里面包含了大量状态转移的真实数据,只是我们没有找到合适的方式去利用它们。HER的出发点恰恰是“把没有奖励的轨迹重新解释成有奖励的轨迹”,而不是放弃这批数据。

1.2 多目标设定是HER能成立的前提

HER不是对任意强化学习任务都能直接套用的,它的前置条件是任务可以被改写成“多目标强化学习”(multi-goal RL)的形式。多目标设定的基本结构是:状态由两份内容组成,一部分是环境本身的客观状态,另一部分是一个额外指定的目标goal。

在这个框架下,每个episode开始时会采样一个目标,智能体在环境中执行动作,最终要么达成目标,要么超时终止。传统做法里,episode结束时如果没有达成目标,整条轨迹就被扔掉;达成目标则整条轨迹都算作正样本。HER的做法完全不同:目标没达成也没关系,我们把这个episode结束时的状态当作新的目标,重新计算每个时间步的奖励,然后将这条轨迹连同新目标一起存入回放缓冲区。

从这个角度看,HER并非改写了强化学习的基本算法机制,而是改变了“经验”的定义方式。它让历史轨迹不再局限于它原本对应的目标,而是可以被重新利用、重新解释,相当于把数据利用效率放大了一个倍数。

1.3 后见之明的效果:一次失败,多次学习

传统经验回放中,一条transition只服务一个目标;HER中,一条transition可以服务原始目标和多个事后目标,这样训练样本量不变,但有效学习信号大幅增加。举一个投篮的例子,目标是把球投进篮筐,你随机投出的一个球没有进框,传统方法不产生任何学习信号。但如果我们把目标临时改成“让球砸中篮板右上角”,刚才那一球居然真的命中了这个新目标,我们因此获得了一条“在近似的状态下,认真的动作会导致球命中篮板右上角”的正样本,这个样本就可以指导策略网络往这个方向优化。

虽然这个新目标是随机出现的、不一定是最终要达成的目标,但积累了大量这种重新标注的样本之后,策略网络能逐步学会将任意当前状态映射到与之匹配的动作上,这种“状态到可达目标”的映射最终会汇聚成对真实目标的泛化能力。这就是HER最精妙的地方:不追求每条经验都指向最终目标,而是让每条经验都产生价值。

1.4 四种目标采样策略怎么选

HER的论文提出了四种事后目标采样方式,实际操作中它们的表现差异很大,这里先把定义列清楚:

策略名称采样方式特点适用场景
final用整条轨迹的最终状态作为唯一事后目标每条轨迹只多学一次,效率最低但最稳定轨迹较短、状态变化小
random从整个回放缓冲区中随机选一个状态作为目标目标分布广但可能非常不相关不推荐单独使用
episode从当前这一条轨迹中随机选一个状态目标和当前状态之间存在一定关联轨迹较长时效果尚可
future从当前时间步之后的轨迹状态中随机选目标与当前状态存在可行性关联,效果最好大多数连续控制任务的默认选择

future策略的理论依据值得多说一句:从当前状态之后的状态中采样目标,等价于假设“从现在开始继续往下执行,最终能达到这个状态”,这个目标对当前状态来说是有机会达成的。这种可行性约束让奖励信号既不虚假又不遥远,学习起来的效率和稳定性都更好。

在实际项目中,大多数人使用future策略,每个transition额外采样4个目标,效果已经足够好。如果想要简单省事,final策略也可以作为基线。

2. 核心细节解析与实操要点

2.1 状态空间如何设置:三个关键字段

在HER的工程实现里,环境状态不能再只是一个observation数组,必须拆分成三类字段:观测状态obs、实际达成状态achieved_goal、期望目标状态desired_goal。比如FetchReach任务中,obs是机械臂关节位置和速度,achieved_goal是机械臂末端的三维坐标,desired_goal是目标点的三维坐标。

这个拆分看起来简单,却直接决定了缓冲区设计、网络输入和奖励计算的复杂度。一个容易犯的错误是直接使用完整状态向量作为目标,而不区分achieved和desired,导致奖励函数无法计算,因为你需要知道“当前实际在哪”和“期望在哪”才能算出距离和奖励。

如果你在自定义环境里接入HER,务必将环境返回的observation定义为字典或包含多个元素的tuple,或者至少保证你能从观测中提取出achieved_goal的位置。这一步做错了,后面所有模块都会连带出错,而且调试起来非常隐蔽。

2.2 奖励函数重标注的完整流程

HER最核心的工程环节是“重标注奖励”(reward relabeling),过程分三步:

第一步,采集原始轨迹。智能体在目标g下执行策略,得到状态序列s_0, s_1, ..., s_T和动作序列a_0, a_1, ..., a_{T-1},同时记录每一步的achieved_goal序列。

第二步,生成事后目标。比如使用future策略时,对轨迹中每个时间步t,从t之后的状态中随机采样一个状态,把它的achieved_goal作为新目标g'。

第三步,重算奖励。原始目标下,每个时间步的奖励是r_t = -d(achieved_goal_t, g);新目标下,奖励是r'_t = -d(achieved_goal_t, g')。然后将(obs_t, action_t, r'_t, next_obs_t, g')作为一条新的transition存入缓冲区,原始目标g同时也会保留一份。

这里有一个重点:动作并不需要重新生成,因为动作在物理世界中已经被执行过了,它导致了从状态s_t到s_{t+1}的转移。重标注只改变我们看待这次转移的角度,不改变客观的动力学关系。

很多初学者会疑惑“事后目标改变了奖励,但动作不是朝着原始目标做的,这样学出来的策略能行吗”。实际上,策略网络学的是一种条件策略,即在给定当前状态和当前目标情况下输出合适的动作。当目标分布多样时,策略被强制学会区分不同目标并采取不同动作,这种目标条件策略的泛化能力恰恰是真正目标所需要的。

2.3 奖励尺度与距离度量函数的影响

HER默认采用负的欧氏距离作为奖励,即reward = -||achieved_goal - desired_goal||_2。这是一个稠密化的伪奖励,它让网络有连续梯度可学,而不是只在二值奖励(0/1)下学习。但注意,它毕竟不是环境真实奖励,只是重标注出来的辅助信号。

距离度量的选择直接影响学习效果。在高维目标空间或不同量纲的特征拼接在一起时,用欧氏距离容易导致某些维度主导学习。比如机械臂任务中,末端三维位置都是米制单位,用欧氏距离没问题;但如果目标向量包含位置和姿态四元数,那姿态部分会严重干扰距离计算。

我的建议是:如果目标空间维度较低且物理含义一致,用欧氏距离;如果目标空间包含不同物理量,考虑对每个维度归一化之后再算加权距离,或者干脆用逐分量的加权L1距离。这个细节看起来不起眼,但在高维目标任务中往往是稳定性差、收敛慢的直接原因。

2.4 与Off-Policy算法的组合方式

HER本身不是一个独立的强化学习算法,它要嵌入到某个off-policy算法中使用。我没有特别推荐某一家框架,只用自己最常用的组合来举例:

  • 连续动作控制:HER + DDPG,这是论文的标准配置,实现简单、调参量适中。
  • 更稳的连续控制:HER + TD3,双Q网络和三重更新能降低过估计,配合HER效果更好。
  • 随机策略版本:HER + SAC,适合环境随机性大、需要探索更强的任务,但代价是计算量更大。

如果任务是离散动作场景,HER同样适用,只需把Actor换成DQN系列。但要注意,稀疏奖励环境中纯DQN容易因为目标网络更新慢而拖慢学习,建议配合优先经验回放使用。

无论选哪个基础算法,HER对这个基础的唯一改动点就是回放缓冲区中额外存储事后目标,并且在采样数据时同时包含原始目标transition和重标注transition。整个梯度更新逻辑其实不需要大改,这是HER工程友好性的体现。

3. 实操过程与核心环节实现

3.1 环境选择与配置建议

想最快验证HER效果,首选OpenAI Gym的Fetch系列环境。FetchReach是单臂末端到达任务,目标空间只有三维,奖励稀疏却容易学习,适合作为HER的入门实验环境;FetchPush和FetchPickAndPlace是推物体和抓取放置任务,难度递增,适合观察HER在复杂接触场景下的表现。

这些环境默认已经实现了真实稀疏奖励(物体与目标距离小于阈值给1,否则给0),并且环境返回的observation_dict中包含observation、achieved_goal、desired_goal三个字段,可以直接接入HER,不用自己做状态拆分。

如果你需要自定义环境,至少需要保证三个接口:reset之后能返回初始观测和目标;step之后能返回下一个观测、真实奖励、终止标志,以及本次转移的achieved_goal;同时提供计算奖励所需的距离函数。这是我多次踩过坑后的体会:环境设计阶段就预留好这三个接口,后面接入HER几乎零修改。

3.2 回放缓冲区的数据结构设计

HER要求缓冲区能存储完整的目标条件经验,我常用的结构是一个列表,每个元素存一个字典,包含obs、action、reward、next_obs、done、achieved_goal、desired_goal七个字段。

这里要注意,obs和next_obs都是包含目标信息的完整观测向量,而achieved_goal和desired_goal是目标向量本身。在采样mini-batch训练时,网络输入使用desired_goal,而计算奖励时使用存储的reward。如果你想让重标注部分和原始部分区分开来,可以为每条经验增加一个source标志位,方便调试和统计。

缓冲区大小因任务而异。FetchReach任务中,3万条经验就够用,而FetchPickAndPlace可能要15万到50万条。缓冲区太大会导致重放时新鲜经验占比过低,学得慢;太小则样本重复度高,容易过拟合。一个经验法则是:缓冲区容量设为单轮训练更新的1000倍左右,但也要根据显存和算力平衡。

3.3 训练主循环与关键参数

训练主循环的骨架大致是标准off-policy强化学习过程,但有三处关键细节需要你落实到位。

第一处是采样后立即做重标注入库。每次完成一个episode后,遍历其中的每个transition,对每条transition额外生成k个事后目标(k建议取4或8),重算奖励后追加到缓冲区。原目标对应的数据也保留,不要覆盖。

第二处是探索噪声。DDPG类算法在初始阶段需要加大动作噪声,否则策略网络最初的输出过于集中,采集到的轨迹多样性不够,HER重标注的效果也会打折扣。我会把噪声标准差设为0.2到0.3,并根据学习情况逐步衰减到0.05附近。

第三处是目标网络更新频率。HER本身不会改变基础算法对目标网络的要求,但如果发现训练损失震荡剧烈,先把目标网络的软更新系数从0.05降到0.01,多数情况下能压住震荡。

以下是我在FetchReach环境上跑通的配置参数,你可直接复制参考:

# HER + DDPG 关键参数 BUFFER_SIZE = 30000 # 回放缓冲区容量 BATCH_SIZE = 256 # mini-batch大小 HIDDEN_SIZES = [256, 256] # Actor/Critic隐藏层 ACTOR_LR = 1e-3 # Actor学习率 CRITIC_LR = 1e-3 # Critic学习率 TAU = 0.05 # 目标网络软更新系数 GAMMA = 0.98 # 折现因子 HER_STRATEGY = "future" # 目标采样策略 HER_K = 4 # 每个transition额外重放的目标数 EXPL_NOISE = 0.2 # 探索噪声标准差 EPOCHS = 50 # 训练轮数 CYCLES_PER_EPOCH = 10 # 每轮周期数

关于GAMMA取0.98而不是常见的0.99,原因是稀疏奖励环境下,过高的折现因子会让价值估计过于依赖远期收益,初期信号少时方差变大。我实测在25万步以内,0.98比0.99收敛更快也更稳。

3.4 网络输入与目标条件的编码方式

策略网络和值函数网络都需要接收“状态+目标”的联合输入。常见的做法是把obs和desired_goal拼接成一个长向量输入,这样做简单有效,缺点是目标维度过高时网络参数膨胀。

另一种做法是让值函数网络接收obs、achieved_goal和desired_goal三输入,分别过全连接层后再融合,这样做能更明确地区分状态信息和目标信息。我在PickAndPlace这类高维观测任务中使用第二种结构,V函数收敛更稳定,但实现和调试复杂度也更高。

对于只用MLP编码的场景,一个小技巧是:在输入层前对obs和goal分别做归一化,把不同量纲的特征压缩到相近尺度。归一化层的参数需要在线统计,不要在训练前用随机初始数据计算固定均值方差,因为RL训练过程中的数据分布本身就在漂移。

3.5 评估时机与指标判断

训练过程不能只看loss曲线,稀疏奖励任务中loss下降并不代表策略真的学会了。我的评估方法是每个epoch结束后,固定行为策略为当前策略的确定性版本,不加探索噪声,跑20个episode,统计真实环境下目标达成率。

记录两个指标:成功率(success rate)和平均回报。成功率是最终目标达成比例,这是最直观的评判标准;平均回报则是细粒度信号,可以帮助你判断策略是否在往目标方向靠近。

在FetchReach环境上,我第一次跑通时大约在8万个时间步时成功率开始跳跃上升,15万步时基本达到90%以上。FetchPush环境通常需要30万到60万步才能稳定超过70%,如果你的曲线在更少的步数内上升,多半是探索噪声或者HER重标定参数选得比较好。

4. 常见问题与排查技巧实录

4.1 学不动:成功率长期为0

这是稀疏奖励任务中最让人头疼的现象,表现为训练了十几万步,成功率仍然没有起色。最先排查的不是网络结构,而是数据流是否真的包含了有效信号。

第一步,检查缓冲区里重标注后的奖励分布。打印一条来自重标注transition的reward,如果奖励全是0,说明目标重标注逻辑没有生效,比如achieved_goal和desired_goal都是同一个值,距离计算结果恒为0。

第二步,检查探索噪声是否过小。不少人在DDPG实现里把探索噪声设置成了固定很小的值,导致采样的轨迹高度相似,重标注出的事后目标也局限在一个小区域,覆盖不到真实目标。把初始噪声调到0.3再跑一段时间,成功率往往会有明显变化。

第三步,确认你的目标条件网络输入没有同时传入重复的目标。某些环境包装器会自动把desired_goal拼进obs字段,如果你在网络输入时又手动拼接一次,相当于目标被重复编码了两份,在实践中会导致优化困难。

4.2 学了但是学会的是“乱动”

另一个常见问题是成功率达到50%后上不去了,而且训练过程中loss曲线震荡剧烈。这种情况多数是因为目标分布过于单一,导致策略产生了过拟合。

检查HER的重标注参数:如果你把HER_K设为8,但缓冲区太小,那么重标注经验会反复出现,数据多样性不足,策略开始出现循环动作或抖动。调大缓冲区容量,同时把HER_K降到4,通常能改善。

还有一个隐蔽的坑:把future策略的采样范围限制了,导致重标注目标永远集中在轨迹后半段,前半段的transition得不到足够多的有效目标信息。确保采样时是从当前时间步之后的整段轨迹均匀采样,而不是只取episode末尾的那几个状态。

4.3 成功率在中间阶段倒退

在FetchPickAndPlace这类任务中,30万步时成功率到了60%,继续训练却掉回40%。我最初以为是模型崩溃,后来发现是缓冲区中旧经验比例过大,新的高质量经验被淹没在大量早期低质量经验中。

解决方案是增加周期内更新次数,或者缩小缓冲区容量。另一个有效做法是引入优先级经验回放,对重标注成功的transition给予更高采样权重,这样新鲜且有效的经验更容易被抽中。但要注意,优先级回放会引入分布偏差,需要配合重要性采样权重修正,否则训练后期可能出现新的不稳定。

4.4 硬件环境与训练成本参考

HER不是计算量特别大的算法,但多个目标重标注和更大缓冲区会带来额外内存开销。在16GB显存的GPU上,FetchPush任务的500万时间步训练大约需要4到6个小时,FetchPickAndPlace大约10到15小时。如果算力紧张,建议把缓冲区压缩到10万条以内,并将HER_K降为2,能在牺牲少量最终成功率的情况下大幅缩短训练时间。

还有一个原生的优化技巧:重标注过程完全可以并行化。缓冲区入库操作可以异步执行,主线程只需要把原始transition先存入队列,后台线程负责重标注并写入最终缓冲区,这样几乎不影响采样速度。

5. 一个实操中的心得与小扩展

HER落地到现在,我最深的体会是:它真正珍贵的地方不在于把失败样本思维运用到多么极致,而在于把“经验从目标中解放出来”这个思路扩展到了更广的领域。如果你的任务中,目标状态可以被观测并且被重新评价为成功或失败,HER就存在适用空间。

举几个真实扩展方向供参考:

第一,将HER与课程学习结合。先用容易达成的目标训练出一定基础能力,再用HER重标注难题目标,这种混合课程策略会比单一使用任一方法更稳定。

第二,在复杂环境中加入距离辅助函数作为探索引导。HER负责升级数据价值,辅助奖励负责提供初步的探索方向,两者互补,能解决纯HER下探索覆盖率不足的问题。

第三,HER同样适用于逆强化学习和模仿学习的场景。逆强化学习中需要推断奖励函数,而HER的事后重标注方法天然提供了一条线索:我们可以从“智能体实际做了什么”倒推“它可能在优化什么目标”,这种换位思考能帮你构建更合理的奖励模型。

最后分享一个小技巧:如果你在调试时实在找不到问题所在,不妨把一次episode的原始轨迹和重标注轨迹分别列出来,逐条对比动作、新目标、新奖励。很多看似玄学的失败,本质上都是在这些最具体的数据上暴露出来的。入门HER不必追求复杂环境,先把FetchReach跑通,再把样本利用率的思维迁移到自己的任务中,你会在代码层面收获比论文更多的东西。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询