ARTICLE DETAIL

资讯详情

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

稀疏奖励如何破局?详解HER后见经验回放原理与工程实践

稀疏奖励如何破局?详解HER后见经验回放原理与工程实践 如果你跑过连续控制的强化学习项目一定遇到过这种让人血压飙升的场景智能体在仿真环境里折腾几十万步reward 曲线纹丝不动偶尔冒出个1分又迅速消失agent始终学不出任何有效策略。这不是你代码写错了而是撞上了强化学习里最经典也最难啃的硬骨头——稀疏奖励sparse reward。而我今天要聊的 hindsight正是解决这类问题的一把通用钥匙。hindsight 这个词字面意思是事后聪明放到强化学习领域它对应的是 OpenAI 在 2018 年提出的Hindsight Experience Replay后见经验回放简称 HER算法。这套方法的核心思路非常反直觉既然原定目标没达成那就把轨迹里实际到达的状态改写成目标把失败的 episode 强行解释成成功样本让算法从一堆看似没用的数据里榨出学习信号。听起来有点自欺欺人但它确实让机器人操作、导航、游戏AI里那些奖励几乎全为0的任务从根本学不动变成能稳定收敛。这篇文章我会从问题根源、算法原理、核心参数、代码实现、踩坑实录到扩展应用把 HER 拆开揉碎讲清楚。不管你是在做机械臂抓取、自动驾驶决策还是想把稀疏奖励思路用到推荐系统里这套东西都能直接照着参考。内容会偏向实践适合有强化学习基础、正被稀疏奖励折磨得想换方向的同学也适合刚入门想搞懂 HER 到底在干什么的读者。1. 项目概述当一个强化学习项目叫 Hindsight1.1 稀疏奖励问题为什么 agent 一碰到就废先聊聊我为什么会盯上这个方向。之前我做机械臂抓取仿真时用 DDPG 训练一个策略环境很简单机械臂要把桌面上的物体推到指定位置。但环境给出的奖励函数非常抠门只有物体距离目标小于某个阈值时才给1其他时刻一律给-1或者0。这就带来一个致命问题agent 在环境里盲试绝大多数 rollout 拿到的都是同一个惩罚值它完全分不清这一步靠近了目标和这一步远离了目标到底有什么区别。强化学习的本质是让策略沿着奖励信号的梯度爬坡但稀疏奖励相当于把整个山坡都铺满了平地只有山顶插着一面旗子。你让 agent 从山脚下随机乱走它大概率这辈子都看不见那面旗子更别提走到山顶。用人话类比就像教小孩踢足球他每次触球你都面无表情只有当他进球那一刻你才欢呼那小孩根本不知道中间那么多盘带、传球动作里哪些是对的。这个问题不是调调学习率就能解决的它属于任务定义层面的根本矛盾。要绕过它传统做法是手工设计 reward shaping把稀疏的终极奖励拆成一步步的中间信号但这需要大量领域知识而且很容易制造出刷分捷径让 agent 学会钻空子而不是真正完成任务。我当时试了几种 reward shaping结果 agent 确实能拿到高分了但策略完全走样——它学会了把物体推到某个奖励函数定义不严谨的角落而不是用户真正想要的区域。1.2 Hindsight 的事后聪明到底聪明在哪HER 提出了一个几乎像是作弊的解决思路一条轨迹没达成原定目标这并不可惜因为它总是达成了某个别的目标。比如我本来想让机械臂把方块推到位置A结果它推到了位置B那好这一整条轨迹就当作把方块推到位置B的成功示范。我们在事后把目标改写成轨迹实际到达的状态然后重新计算奖励这不就是一次标准的成功经验了吗这个思想直接借鉴了人类学习的模式。人天生就有 hindsight 能力考砸了一次试你复盘时会把当时那种复习状态和最终的坏分数联系起来下回就知道不能用那种状态去考试而无需等到某次考试刚好超常发挥才获得正面反馈。HER 做的是同样的事它不要求 agent 在探索时运气好到恰好命中目标只要求它产生有意义的轨迹剩下的由事后改目标来补足学习信号。有人会质疑那 agent 岂不是只学会完成容易的目标对这个问题的回应是 HER 的精华所在它真正的产物不是一套特定目标的策略而是一个goal-conditioned policy——一个以目标为条件输入、能泛化到任意目标的策略网络。当你把推到B这样容易达成的伪目标大量塞进经验池网络学会的其实是给定任意目标我应该输出什么样的动作序列这种通用的条件映射。1.3 为什么不用奖励塑形或课程学习在我接触 HER 之前业界应对稀疏奖励的主流方案大概有三类我都试过一圈各有各的痛点。第一类是reward shaping也就是设计密集的中间奖励。它的问题是极度依赖人工经验奖励函数写得紧了agent 过度贪婪短期收益找不到真正的解写得松了又跟稀疏奖励没什么区别。而且 reward shaping 经常和原任务的真实目标耦合一旦环境改动全部推倒重来。第二类是curriculum learning课程学习先把简单任务教给 agent再逐步加大难度。听着合理但难点在于简单和难的划分标准很难拿捏且课程切换时机把握不好会导致前面学的东西全部遗忘。HER 天然具备内在课程效果训练初期agent 大多完不成遥远的目标重标记出来的伪目标自然就是离它最近的、最容易达成的状态随着策略进步轨迹末状态越来越靠近真实目标伪目标难度也随之平滑上升。整个课程是自动生成的不需要任何外部设计。第三类是手动给每个 state 加势能函数potential-based shaping理论上是保策略最优的但前提依然是你得设计出靠谱的势能场。HER 则完全不需要任何领域先验它只需要你能定义轨迹的末状态和判断目标是否达成这两件事在几乎所有强化学习任务里都是现成的。一个表格可以很直观地对比这几种路线方案是否需领域知识是否改变任务定义典型风险适用性Reward shaping高否但污染奖励局部最优、刷分捷径有经验且任务简单Curriculum learning中高否课程设计难、遗忘任务可分难度递进HER极低是重新解释目标目标空间需可定义任意目标条件任务综合来看HER 在通用性和工程成本之间取得了最好的平衡。这也是为什么它在 OpenAI 发布后迅速成为机器人操作领域的标配组件几乎所有做 goal-conditioned RL 的工作都会拿 HER 做 baseline。2. 核心细节HER 算法的原理与参数拆解2.1 四行伪代码讲清 HER 的核心逻辑HER 本身不是一个独立的强化学习算法而是一种经验处理机制它可以叠加在任意 off-policy 算法上使用DDPG、TD3、SAC 都行。理解了这一点你就不会被它复杂的名字吓到。整个机制的精髓用伪代码表达只有这么几行1. 采样目标 g重置环境跑完一整条 episode 2. 对 episode 里的每一步 transition以原目标 g 存入 replay buffer 3. 额外采样 k 个伪目标 g从该步之后的某个未来状态中取 4. 用 g 重新计算每一步的奖励 r把 (s, a, r, s, g) 也存入 buffer代码层面最核心的点就在于第 3、4 行一条原始轨迹不是只存一份而是被重新解读成 k1 份经验。假设某条轨迹长度为 L那么原来只有 L 条样本经过 HER 处理后会变成最多 (k1) × L 条k 通常取 4也可以更大。这些重标记样本中的一部分reward 因为伪目标的达成而变成正数agent 终于能从数据里看到成功的样子。实际操作中你会发现 HER 特别适合配合off-policy 算法使用因为 on-policy 算法如 PPO需要及时丢弃旧策略产生的数据重标记样本的价值来不及被充分利用。DDPG、TD3、SAC 这类 off-policy 算法把历史经验统一丢进大 bufferHER 改造后的数据可以在里面反复采样样本利用率呈数量级提升。2.2 目标重标记的四种策略选型HER 论文里对比了四种如何选伪目标的策略这一步看似简单实际效果差异巨大。我逐一说下我测试时的体会final直接取整条轨迹的最后一个状态做伪目标。实现最省事但问题在于如果轨迹期间状态波动很大比如机械臂在乱甩最终位置可能离轨迹中段状态很远重标记出来的成功轨迹在时间上并不连贯给 critic 的学习引入噪音。random从整条轨迹里随便抽一个状态做伪目标。相比 final 有改善但随机抽取会把轨迹早期还没执行什么动作时的状态也算成目标逻辑上很怪——agent 在时间步 t1 时的动作显然不是奔着 100 步之后某个状态去的。episode以轨迹中的某个状态作为伪目标实验里通常体现为选择整条 episode 内满足条件的状态。表现比 random 好一些但仍然没有利用时序信息。future从当前时刻 t 之后的所有未来状态里随机抽一个作为伪目标。这是论文验证后效果最好的方案也是我推荐的首选。为什么 future 最好因为它保证了伪目标在时间上永远不早于当前时刻。agent 在 t 时刻的动作确实有可能影响 tΔ 时刻的状态所以用未来的状态作为目标在因果上是合理的。相比之下random 或 final 可能把目标设在轨迹开头的状态那意味着 agent 需要回到过去这种样本对学到正确的状态-动作映射毫无帮助甚至有害。还有一个重要参数是重标记次数k。k0 相当于纯原始经验学习效果极差k4 是 OpenAI 论文里的默认值效果和 k8 差距不大但省一半存储k 再往上提升收益急剧递减。我自己的经验是在小规模环境如 FetchReach里 k2 就能看到明显效果但到了 FetchPickAndPlace 这种高难度任务k 至少得 4否则重标记样本不够支撑 critic 学到目标空间的结构。2.3 网络结构、超参数与 DDPG 搭配HER 论文采用 DDPG 作为底层算法主要是因为 DDPG 稳定、简单、适合连续控制。网络结构上最关键的决策是observation 和 goal 的编码方式。我见过很多新手把obs和goal直接拼成一个向量丢进网络这在目标空间复杂时效果很差。正确做法是让它们各自先过一层 MLP再拼接融合特征或者至少保证网络输入层对这两部分有清晰的区分因为 observation 和 goal 的维度、数值分布差异通常都很大。我贴一个在 Fetch 环境上验证过可复现的配置表参数基本沿用 OpenAI Baselines 的默认值适合作为起点超参数推荐值说明底层算法DDPG也可用 TD3/SAC效果更稳隐藏层维度256 × 256两层 ReLU 全连接actor 学习率1e-3Adam 优化器critic 学习率1e-3Adam 优化器目标网络 soft updateτ 0.05论文默认别用 0.001奖励裁剪0/1 二值成功1失败0 或 -1HER 重标记次数 k4future 策略replay buffer 容量1e6对 Fetch 任务足够batch size1024需要打满 GPU/CPU动作噪声高斯 0.2也可用 OU 噪声一个容易踩坑的地方是奖励的定义。原论文的成功奖励是二值的reward 0 if distance threshold else -1使用-1而不是0做失败奖励是为了让 agent 在一定程度上追求快点失败以更快获得正样本。但如果你把失败奖励设成-0.1之类的中间值反而会压缩 Q 值信号的区分度导致训练初期梯度太小。我建议紧跟原文用0/1或-1/0二值化奖励都行但不要加多余尺度。3. 实操过程从零跑通 Fetch 机器人环境3.1 环境准备与验证HER 最经典的实验场地是 OpenAI Gym 里的Fetch系列环境包括 FetchReach、FetchPush、FetchPickAndPlace、FetchSlide。这些环境都是稀疏奖励的典型代表尤其是 FetchPickAndPlace真实机械臂的夹取、移动、放置全流程建模是我见过最能体现 HER 价值的 benchmark。安装环节各位按自己的环境处理macOS 上受限于 MuJoCo 版本可能有坑建议直接用官方推荐的 gym 版本老版本是gym0.21配mujoco-py2.1或者直接使用现在维护更积极的gymnasium-robotics。装完之后先不要急着训练跑一段 smoke test 验证环境输出是否符合预期python -c import gym env gym.make(FetchReach-v1) obs, info env.reset() print(observation keys:, list(obs.keys())) print(observation shape:, obs[observation].shape) print(achieved_goal shape:, obs[achieved_goal].shape) print(desired_goal shape:, obs[desired_goal].shape) 如果能看到输出说明环境就绪。注意 Fetch 环境的observation是字典结构包含observation机器人状态、achieved_goal当前实际达成的位置、desired_goal真实目标位置三个字段。后面写代码时HER 的作用对象就是achieved_goal和desired_goal这对映射关系。3.2 HER-DDPG 核心代码实现完整代码几百行这里我把最核心的 HER 重标记逻辑单独抽出来讲。首先定义一个经验池它能按 episode 存储状态序列方便事后做目标重标记import numpy as np from collections import deque class HindsightReplayBuffer: def __init__(self, capacity, k4, strategyfuture): self.capacity capacity self.k k self.strategy strategy self.buffer deque(maxlencapacity) self.episodes [] # 存放完整 episode 的经验 def store_episode(self, episode): # episode: list of (obs, achieved_goal, action, reward, next_obs, done) self.episodes.append(episode) # 以原始目标存一份同时做 k 次重标记 for trans in episode: self.buffer.append(trans (trans[1],)) # 原目标就是 achieved_goal for _ in range(self.k): self._relabel_and_store(episode) def _relabel_and_store(self, episode): # 随机选一个时间步 t t np.random.randint(len(episode)) _, achieved_t, action, _, next_obs, done episode[t] if self.strategy final: g_prime episode[-1][1] elif self.strategy future: # 从 t 之后的未来状态中采样一个来当伪目标 future_idx np.random.randint(t, len(episode)) g_prime episode[future_idx][1] else: idx np.random.randint(len(episode)) g_prime episode[idx][1] # 用伪目标重新计算奖励 reward 0.0 if np.linalg.norm(achieved_t - g_prime) 0.05 else -1.0 self.buffer.append((episode[t][0], achieved_t, action, reward, next_obs, done, g_prime)) def sample(self, batch_size): idx np.random.choice(len(self.buffer), batch_size, replaceFalse) batch [self.buffer[i] for i in idx] return { obs: np.array([b[0] for b in batch]), achieved: np.array([b[1] for b in batch]), action: np.array([b[2] for b in batch]), reward: np.array([b[3] for b in batch]).reshape(-1, 1), next_obs: np.array([b[4] for b in batch]), goal: np.array([b[6] for b in batch]), }这段代码把 HER 的核心逻辑演示得很清楚store_episode时原始经验先存一份然后再采样k次不同的伪目标重算奖励后存进去。DDPG 的 actor 和 critic 更新逻辑和标准实现完全一样只是每次都从sample()返回的批数据里取obs和goal拼成网络输入。真正要改的就是这个 buffer其他模块可以照搬。要注意一个工程细节不要把重标记样本和原始样本分桶存放再按比例采样直接混在一起自然采样效果最好。不少优化版本会刻意控制原始和重标记样本的比例为 1:1但论文实验和我的实测都表明并不需要自然混合就已经能学到很好的策略了。3.3 训练效果与成功率分析我在 FetchReach 和 FetchPush 上做过训练测试。FetchReach 任务目标点非常近动作空间小HER 几乎 3000 个 episode 内就能看到成功率逼近 100%甚至没有 HER 的 DDPG 也能勉强学会。但这只能算热身真正拉开差距的是 FetchPickAndPlace目标是从桌上抓取方块并放到指定位置动作维度包括夹爪的开合难度陡增。我的训练日志大概是这样的节奏用 16 个并行环境 HER前 5 万步成功率基本是 0model 处于盲人摸象状态但这很正常buffer 里正在积累重标记样本。10 万步左右开始出现零星的成功尝试测试成功率跳到 5% 附近。这个阶段你是不是能感觉到 critic 对什么样的状态接近目标终于有了直觉。30 万步成功率爬升到 40% 附近中间会有几次回撤这不是 bug而是策略在探索新的目标区域时产生的波动。80 万步以后逐步稳定在 90% 的成功率再往上提升比较慢但一般不会再跌回 0。如果画一条成功率随训练步数变化的曲线你会发现它像是病人在高烧后缓慢退烧前一两个小时体温纹丝不动然后突然开始出汗降温最后平稳下来。很多人就是倒在了前 5 万步成功率 0这个阶段直接判定项目失败其实 HER 的启动期本来就需要耐心。3.4 有 HER 与无 HER 的对比表为了让你直观感受 HER 的价值我整理了一组典型效果对比不同实现、随机种子下会有差别但趋势一致环境无 HER 成功率HER (k4) 成功率说明FetchReach~85%~98%两者都能学HER 收敛更快FetchPush几乎为 0~90%差距最大HER 是决定性因素FetchPickAndPlace几乎为 0~90%无 HER 基本学不出来FetchSlide几乎为 0~70%需要滑行动力学HER 也吃力你会发现一个规律任务越复杂、目标空间越大HER 带来的增益越夸张。FetchPush 里机械臂只需要把方块推到一个点上目标仅是位置坐标纯 DDPG 在稀疏奖励下学到 0 成功率的概率极高而 HER 把这个数字硬生生提到了 90%。这也是为什么我后来做任何 goal-conditioned 任务都默认先带 HER它已经成了我的骨架标配。不过要清醒一点HER 不是万能药。它只解决稀疏奖励导致没有学习信号的问题解决不了奖励函数定义错误和环境本身不可解的问题。如果你设计的任务目标空间存在大量不可达区域或者动作粒度粗糙到无法精确控制位置HER 也只能打出低成功率。4. 常见问题与排查技巧实录4.1 训练不稳定loss 爆炸怎么办HER 训练过程中我遇到过好几次 loss 数值突然飞上天的状况一眼看过去整个曲线都像被雷劈过。这通常不是因为 HER 本身而是底层 DDPG 的老毛病critic 的 Q 值估计发散。排查的时候先查三件事。第一奖励有没有裁剪。如果 reward 的取值范围没限制突然出现一个异常大的 Q 值就会像滚雪球一样越滚越大。把奖励固定为二值0/1 或 -1/0是最稳妥的。第二target network 的更新速率。我见过有人把 τ 设成 0.001 想要更平滑结果导致目标 Q 值更新过慢critic 追着真实分布跑又追不上然后开始震荡。回到 τ0.05 基本就好了。第三actor 和 critic 的学习率配比。如果两边都是 1e-3 而 critic 训练的 batch 又大actor 容易被噪声梯度带偏可以适当把 actor 学习率降到 5e-4。还有一个容易被忽视的坑buffer 过大且包含过多旧策略经验。HER 的重标记样本虽然好但 agent 策略一旦大幅更新早期的失败轨迹重新解读就没什么意义了。DDPG 本身容忍度比较低建议 buffer 容量在 1e6 以内超过这个量之后就用优先经验回放PER这类进阶技巧否则普通均匀采样会让有效样本被淹没。4.2 agent 永远学不会先查三个地方换了新任务、目标一直推进不了不要急着调 HER 参数先按顺序排查这三个地方80% 的问题出在这里。第一目标达成判定的阈值是否合理。我见过有人把判定阈值设成 0.01而机械臂位置控制精度本身就达不到这个水平导致即便从人类视角看已经放好了环境依然判定为失败。这种时候 HER 重标记出来的伪成功也都是假的agent 感知不到任何正样本。建议先手动执行一条轨迹观察实际位置误差分布把阈值设在误差波动的合理范围。第二obs 和 goal 的归一化。Fetch 环境自带 normalize但自己搭建的环境经常忽略这一步。目标状态如果是像素坐标或关节角数值范围可能差出几个数量级网络输入层直接饱合。把所有状态分量映射到 [0,1] 或 [-1,1] 区间是基本操作量化完你会发现训练稳定度明显提升。第三伪目标采样的来源对不对。如果你用future策略一定要确保采样的是achieved_goal字段而不是observation字段。observation里包含机械臂关节等大量与目标无关的信息拿它当伪目标会彻底扰乱目标空间结构。这是一个我非常容易犯的低级错误一旦踩上训练成功率会是永远的一根平线。4.3 Buffer 与采样比例的坑HER 存储的样本量是原始经验的 k1 倍这在工程上带来一个隐藏问题重标记样本在 buffer 里占比过高挤掉了原始经验。如果 k4buffer 里 80% 都是重标记样本原始样本只剩 20%。原始样本包含真实目标下的奖励信号是校准 critic 对真实任务理解的重要来源丢失它们会让模型虽能完成伪目标却记不住用户真正想让它做什么。我的建议是给 buffer 做双通道把原始样本和重标记样本分开存储采样时固定按 1:1 比例混合。这样既保留了 HER 的样本利用率又不会让重标记样本喧宾夺主。标准库的实现里没有这个选项需要自己改一下这个改动很小但收益很实在我强烈推荐你做。另一个相关问题是k 值过大的收益递减。k16 时训练前期确实能看到成功率爬得更快但中后期会因为样本种类太过泛滥导致策略更新方向不稳定最终收敛效果反而不如 k4。记住HER 的目的是给 agent 提供可见的成功不是把 buffer 塞满各种伪目标。贪多反而嚼不烂。4.4 算力优化与 checkpoint 管理Fetch 环境带 MuJoCo 渲染非常耗 CPU训练时如果不关渲染16 个并行环境能把一台 16 核机器吃满训练速度直接掉一半。建议训练时新建环境时传render_modeNone需要看 demo 再用一个单独的环境实例不要和训练环境混用。并行环境数也要控制不是越多越好。我实测 Fetch 系列任务并行环境数从 1 加到 16 时吞吐量线性增长但加到 32 之后收益明显放缓而 CPU 占用和内存却翻倍。如果目标是快速验证算法正确性8 个并行环境就够要做最终效果16 个是比较均衡的选择。还有一个总要吃亏的点训练中断后千万记得加载 checkpoint。HER 训练动辄几小时中途一道断电或 OOM 就能让你重新跑一遍。我会在每 N 个 episode 后把 actor、critic、buffer 全部落盘。注意光是保存模型权重不够buffer 丢了等于之前积累的所有重标记经验全废恢复后又要从头熬过那段成功率 0 的启动期。保存 buffer 会让单个 checkpoint 文件很大1e6 条经验可能十几个 GB但有条件的情况下建议别省或者至少保存最近的 2e5 条。5. 这个思路还能用到哪些场景5.1 机器人抓取与操作HER 最直接的应用场景就是机器人操作。真实机械臂抓取任务的难点除了控制本身还包括目标位置不可达、夹爪遮挡、物体滑动等噪声因素。在这些场景里HER 的思想可以抽象成先做错了再修正目标——这对真实机械臂太重要了因为真实世界的探索成本极高你不能让机械臂在工厂里乱跑几十万步每个 episode 都必须是能产生学习价值的。实际项目里我看到不少团队在真实机械臂的数据采集环节就加入 HER 式的重标记机械臂执行一次随机动作无论有没有抓到物体轨迹数据都会被记录下来然后根据实际接触到的位置重新标记成功样本。这种做法把昂贵的真实机器人试错成本变成了密集的训练信号是部署层面最有价值的一种应用。5.2 导航与自动驾驶自动驾驶里的稀疏奖励问题同样突出一条导航轨迹几十秒甚至几分钟只有最终到达目的地才给奖励中间全是 0。HER 在这里的应用方式略有不同因为目标不是坐标系上的一个点而是到达某条车道完成换道这类结构化目标。处理办法是将目标状态编码成语义向量位置、朝向、车道编号然后用 HER 对中途实际到达过的状态做重标记。这样做的效果是 agent 可以先从大量随机驾驶但完成过某个中间动作的轨迹里学到基本的避障和跟车行为再逐步逼近最终目标。相比直接用终极稀疏奖励训练HER 版的训练速据实测能快一个数量级不过自动驾驶的安全性要求很高HER 只能作为离线数据扩充或仿真训练的一种手段真实路测仍需大量安全兜底。5.3 推荐系统与对话系统HER 扩展到离散动作空间也完全可行只是需要把底层算法换成支持离散动作的 off-policy 算法如 SQD、DQNHER。推荐系统里把用户是否点击/购买当作稀疏奖励item 的向量表示当作状态和目标就能用粗粒度的用户反馈信号来训练推荐策略。用户在几万条商品里只点击了少数几个直接学习几乎不可能但 HER 可以把用户看过但没点的状态当作伪目标让模型学到什么样的内容组合能吸引用户注意力的通用机制。对话系统也是同理一场多轮对话的最终目标是用户任务完成但过程中用户回复的正负信号极其稀薄。HER 可以把用户说了一句正面话的时刻当作伪目标重标记出若干轮次是成功引导的样本。这类应用现在已经有了不少论文但工程实现上比较绕的一点是对话状态空间很大伪目标需要通过语义相似度来衡量而不能像机器人那样直接用欧氏距离需要额外引入一个状态距离函数。5.4 关于未来的一点思考HER 的成功让我更确信一个道理强化学习在很多场景里难不是因为模型不会拟合而是因为数据里压根没有正样本。Hindsight 的本质是重新审视你已有的数据哪怕它们表面上是失败的只要换个角度就能找到埋藏其中的经验。这种从失败里找成功的思路其实是所有高效学习算法的共同哲学——不管是人还是机器都不会因为一次失败而无所得。我后来做新任务时会习惯性先问一句这个任务的失败轨迹里有没有哪个时刻其实是做对了某件事的如果答案是肯定的那 HER 大概率能帮上忙。如果答案是否定的说明任务设计本身有问题这时候需要回头改环境或奖励定义而不是继续在算法层面打转。HER 教给我的勘界感比它本身的性能提升更让我受用。如果你正打算在某个稀疏奖励任务上尝试 HER我的最后一条建议是从最简单的环境开始先跑通 FetchReach观察重标记样本确实让缓冲区里出现正奖励再逐步过渡到自己的任务。曾经我以为要完成从 0 到 90% 成功率的跨越需要什么精巧复杂的改造实际做下来才发现OpenAI 那几行伪代码配上正确的超参数和足够的耐心就完全足够了。希望这篇总结能帮你少踩几个我踩过的坑早日看到你的 agent 在稀疏奖励里跑出理想的成功率曲线。
返回列表