首页 / 资讯中心 / 文章详情

强化学习稀疏奖励难题破解:HER算法原理与工程实践详解

强化学习稀疏奖励难题破解:HER算法原理与工程实践详解 ★ FEATURED ARTICLE
第一次跑机器人抓取任务的时候我心里只有一个想法这破任务怎么这么难学智能体在仿真环境里折腾了几十万步成功率纹丝不动调试窗口里打印的奖励全是 -1断点打了一堆看不出逻辑哪里错。后来我换了个思路不再盯着“失败的经验怎么用”这个老问题而是问了一个反直觉的问题——明明没抓到为什么不能把“没抓到”本身当成一次成功来学这个想法就是 hindsight后见之明。它在强化学习领域最著名的落地形态是 OpenAI 在 2017 年提出的 Hindsight Experience Replay也就是 HER专门解决稀疏奖励sparse reward下智能体学不动的问题。这篇文章我会把 HER 的原理、代码实现、参数调优和踩坑经验一次性讲透适合正在啃稀疏奖励问题、想给机械臂任务或者任何带目标条件的强化学习任务提速的读者。内容偏工程实践我会把我自己跑实验时的真实体验和排错过程都写进来做一个能直接照着改的实战参考。1. 什么是 hindsight一个看似朴素却改变训练逻辑的思想1.1 从生活经验说起为什么“事后反思”是最高效的学习方式人类学习有个天然优势会复盘。考试考砸了很少有人只是简单记下一句“我考砸了”而是会重新翻卷子分析“当时那道数学题如果换个思路其实可以拿分”。走错路回到家你不会只记得“今天白跑一趟”而是会记住“原来这条路也能通到小区门口只是绕了点”。这种把失败经验重新解读、提炼出有价值信息的能力心理学上有个词叫后见之明偏误通常被认为是一种认知偏差——因为它会让人们觉得“自己早就知道会这样”。但从工程角度来看后见之明完全可以被当成一种武器你不必纠结经验本身是成功还是失败只需要给经验一个后验的目标它就能变成有效的学习样本。强化学习里的智能体本质上也是在学习一种“如果做了动作 a通常会到达什么状态”的经验。问题在于传统 RL 非常挑剔它只关心“这个经验离我设定的目标近不近”如果目标没达成整条经验几乎就没有学习价值。这导致了一个尴尬的处境复杂任务里智能体前面几百上千次尝试大多都是失败的而这些失败数据全部被浪费掉。HER 的核心思想就是把人类这种“事后反思”能力机械化既然没达成原目标那我就换一个“你实际达成”的新目标让这次失败变成一次针对新目标的成功示范。这个类比不是心灵鸡汤它直接对应了 HER 算法里的目标重标记操作。后面我会详细展开但你先记住一句话hindsight 不是让你假装失败不存在而是让你重新给失败分配一个目标让失败数据本身发光发热。理解了这一点HER 的其他技术细节都只是实现这个理念的手段。1.2 强化学习里的“稀疏奖励”困境智能体为什么学不动强化学习的训练信号来自奖励。如果环境里到处都是奖励线索比如每走一步都有距离减小的反馈智能体当然好学。但真实世界的任务恰恰相反一个机械臂要抓取一个杯子在抓到之前没有任何中间反馈告诉你“你离杯子更近了还是更远了”只有最终那一瞬间要么抓到要么没抓到。这就是典型的稀疏奖励问题。在这种设定下随机初始化策略的智能体一开始几乎不可能碰到“成功”状态。设想一下一个简单的 FetchReach 任务机械臂末端要移动到某个随机点每步奖励要么是 0到达目标点要么是 -1没到达。初始策略下整个 episode 的 50 步全部是 -1总 reward 是 -50。智能体在成千上万个 -1 的经验里来回打转找不到任何“正向”信号来引导动作网络参数往好的方向调整。有人会说那把 -1 改成距离惩罚不就行了这就是 reward shaping人工奖励塑形。distreward shaping 确实能让训练动起来但代价很大第一你需要设计一个合理的距离度量函数这本身需要领域知识和调参时间第二人工奖励很容易引入局部最优让智能体学会“刷分”而不是真正“完成任务”第三塑形后的奖励函数和原始任务目标不完全一致你在训练一个“接近目标”的策略而不是“达成目标”的策略这两者在一些复杂环境下结果会差很多。HER 的价值就在这里它不动奖励函数它动的是经验数据本身。通过把失败轨迹重新标记成“对另一个目标而言是成功的轨迹”智能体在完全没有人为制造奖励线索的情况下就能从稀疏奖励里学到东西。1.3 HER 的核心机制失败经历也能变成宝贵教材现在我们把 HER 的机制说清楚。传统 replay buffer 里存一条经验通常是 (s, a, r, s, g)s 是当前状态a 是动作r 是针对目标 g 的奖励s 是转移后的状态。HER 做的操作朴素到令人惊讶它额外生成一条新经验 (s, a, r, s, g)。其中g 取的是这条经验实际到达的状态 s 里携带的“达成目标”achieved goalr 则是用这个新的 g 重新计算出来的奖励。因为 s 本身就是那个新目标 g 的达成状态所以 r 一定是“成功”的奖励。换句话说一条原本失败的轨迹被复制了一份变成了“如何成功到达某个状态”的示范数据。打个比方你原计划去超市买菜结果走岔路进了公园。传统 RL 记下的是“走岔路失败别学”。HER 多记了一条“走这条路可以到达公园下次想去公园时直接用”。这个多记的一条就是在目标层面做了一次重标记。用数学语言来说对于一条原始 transition (s_t, a_t, r_t, s_{t1}, g)HER 构造出至少一条新 transition (s_t, a_t, r_{t}, s_{t1}, g)其中 g 是从一个候选状态集合里采样得到的r_{t} 是环境 reward function 针对 (s_{t1}, g) 的输出。注意这里的奖励函数不改变变的只是目标输入。这样原本所有 -1 的经验只要配合一个合适的替代目标就能变成奖励为 0 的正样本。GO 直接改环境、直接改奖励的路线不同HER 是在样本层面动手脚这也决定了后面一个重要的技术选型HER 只能用在 off-policy 算法上原因我留到下一节详细解释。但历史已经证明这个简单操作的效果极其显著在 OpenAI 的 Fetch 系列任务里HER 配合 DDPG 能在几十万步内达到接近 100% 的成功率而普通 DDPG 在同样步数内甚至连 0% 都突破不了。这就是 hindsight 的力量。2. HER 的原理拆解与技术选型解析2.1 目标重标记Goal Relabeling是如何工作的目标重标记是 HER 的核心操作理解它的三个细节很重要重标记哪个目标、怎么算新奖励、按什么频率加。先看重标记哪个目标。在一个 episode 里环境会给出原始任务目标 desired goal记作 g。每一步智能体实际上都会产生一个 achieved goal通常是机械臂末端的位置、物品等状态信息。重标记时我们从整个 episode或者整个 replay buffer里选一个替代目标 g这个 g 必须是智能体在某个时刻真实到达过的状态。这个约束非常关键它保证了替代目标在物理上是可达成的不会出现“目标在万里之外”这种不切实际的幻想。再看新奖励怎么算。大部分 Gym GoalEnv 提供统一的 reward 接口例如 Fetch 系列里如果 achieved goal 与 desired goal 的 L2 距离小于一个阈值例如 0.05奖励为 0否则为 -1。重标记后我们把 s_{t1} 里的 achieved goal 和新目标 g 塞进这个 reward 函数因为 s_{t1} 本身就是从某个时刻采样的 achieved goal所以当 g 离它足够近时新奖励就是 0。你可能会问万一采样的 g 和 s_{t1} 距离较远怎么办这就是为什么要控制采样策略下一小节我会专门对比四种策略的差异。最后看频率。OpenAI 的原始实现中一条真实 transition 会被保留进 buffer同时额外生成 1 条或更多重标记后的 transition。最新的实现里通常先决定一个额外样本数 K每个 transition 额外生成 K 条重标记样本K 可以取 1 到 8 不等经验上取 1 或者 4 效果都不错。重标记后的样本和原始样本都会被放进同一个 buffer 参与训练比例大概就是 1:1这样既保留了原始目标信息又补充了成功示范。后面我给出的伪代码里会体现这一点。2.2 四种重标记策略对比final、future、episode、random目标重标记时从哪个候选集合里采样 g 直接决定了训练效率和稳定性。OpenAI 论文里对比了四种策略我这里把它们的关键差异整理成一张表策略候选集合特点适用建议final当前 episode 的最后一个状态最简单样本增量小经验价值高但数量少简单任务、资源有限时可以用future当前 episode 中当前步之后 k 步内的状态平衡了相关性和多样性效果最稳绝大多数任务的默认首选episode当前 episode 内任意状态比 future 更多样但可能选出与当前状态无关的目标可以作为 future 的补充random整个 replay buffer 随机状态多样性最高但目标与当前经验的因果性弱不建议单独使用容易让训练发散为什么 future 最常用因为它兼顾了两个关键因素可达性与因果相关性。future 策略也就是给 transition 选一个来自未来 k 步以内的状态当替代目标这个目标不仅是在同一条 trajectory 上真实到达过的而且和当前状态在时间上非常接近。这样重标记出的经验就近似于“从当前状态出发几步之内能到达某个地方”的示范逻辑自洽价值函数学起来也稳定。k 通常取 4步子太大目标太远价值函数估计方差变大步子太小目标和当前状态几乎重合提供的新信息太少。我还想多说一句 random 策略。很多人第一次接触 HER 时会想既然要从 buffer 里随机选目标那干脆最大化多样性直接 random 不就行了实测下来你会发现random 选出的替代目标往往和当前 transition 没有任何关系比如你明明在这一步没能移动物体却把它标记成“移动物体成功”的示范这种经验放在一起训练价值函数会左右打架反而拖慢收敛。所以我的建议是优先使用 future如果需要更强的多样性可以按 4:1 的比例混合 future 和 random而不是纯 random。2.3 为什么 HER 必须搭配 off-policy 算法DDPG/SAC/PPO 的取舍HER 的一个关键限制是只能用于 off-policy 的强化学习算法。因为它们用 replay buffer 随机采样历史经验来更新不需要训练数据严格来自当前策略。重标记本质上是“经验编辑”对 Q-learning 家族的算法来说你改的是 buffer 里经验的 reward 和目标标签完全不碰梯度计算时用到的策略分布所以没有任何问题。DDPG、SAC、TD3 这些算法天生就适合和 HER 配合。反过来PPO、A2C 这一类 on-policy 算法就不行。它们的梯度估计算法要求训练数据必须来自当前策略的 rollout你如果改了 buffer 里的目标标签就相当于拿“一份被篡改过的策略采样数据”去计算策略梯度梯度就不再是当前策略的无偏估计训练方向会逐渐漂移。有人说那我直接在 rollout 之后立即把 relabel 后的数据给 PPO 用不存 buffer 行不行实测效果依然很差因为 relabel 改变了 (s, a) 对应对应的目标任务而当前策略其实从未以那个“替代目标”为目标采样过严格来说这已经是分布不匹配。所以要在工程里用 HER直接选 off-policy 算法。选 DDPG 还是 SAC我的经验是如果追求实现简单和稳定先上 DDPG HER这也是 OpenAI 原始论文和官方实现的标准组合如果你的环境动作维度较高或者需要对探索更鲁棒SAC HER 往往收敛更快但 SAC 本身的熵温度系数调节又是一堆活。这里不展开对比我的建议是把 DDPG 跑通了再试 SAC这样出了问题你至少知道是 HER 的问题还是算法的锅。3. 从零实现 HER实操步骤与核心代码详解3.1 环境选择为什么用 OpenAI Gym 的 Fetch 系列学习 HER 最合适的实验场是 OpenAI Gym 里的 Fetch 系列环境它们都实现了 GoalEnv 接口自带稀疏奖励和 achieved goal / desired goal 的观测结构。常见的有四个任务FetchReach机械臂末端去够一个目标点、FetchPush用机械臂把物体推到指定位置、FetchPickAndPlace抓取物体并搬到指定位置、FetchSlide把物体滑到远处目标。这四个任务难度依次上升非常适合拿来做 HER 的阶梯式练习。用 Fetch 环境有几个好处。第一它们的奖励函数已经是稀疏的不需要你自己再写奖励。第二环境返回的 observation 是字典包含 observation机器人状态、achieved_goal当前实际达成的状态比如末端位置、desired_goal当前任务目标这个结构正好匹配 HER 重标记的需求。第三这些任务是公开 benchmark网上有大量参考实现和对比数据出了问题好排查。新手建议从 FetchReach 开始这个任务相对简单几十万步就能跑到不错的效果能快速验证你写的 HER 逻辑是否正确。跑通之后再上 FetchPush 和 FetchPickAndPlace。3.2 完整训练流程从 Replay Buffer 到网络更新这里我给出一份 HER DDPG 的核心训练伪代码。它是我根据 OpenAI 官方实现简化的版本保留了最关键的流程你理解了它就等于拿到 HER 的骨架。# HER DDPG 训练循环伪代码省略网络定义与优化器细节 replay_buffer_size 1_000_000 replay_buffer [] num_updates_per_episode 40 future_k 4 def reward_function(achieved_goal, desired_goal): # Fetch 环境默认稀疏奖励到达判定距离小于 0.05 则成功 # 注意很多环境里成功奖励是 0失败奖励是 -1 distance np.linalg.norm(achieved_goal - desired_goal) return 0.0 if distance 0.05 else -1.0 for episode in range(num_episodes): obs env.reset() episode_transitions [] total_reward 0 for t in range(env.max_episode_steps): s obs[observation] g obs[desired_goal] a actor.select_action(s, g) np.random.normal(0, 0.2, action_dim) next_obs, r, done, _ env.step(a) s_next next_obs[observation] achieved next_obs[achieved_goal] episode_transitions.append((s, a, r, s_next, g, done)) obs next_obs total_reward r if done: break # ------- HER 重标记 ------- for idx, (s, a, r, s_next, g, done) in enumerate(episode_transitions): # 保留原始经验 replay_buffer.append((s, a, r, s_next, g, done)) # 从未来的 k 步状态中采样一个替代目标future 策略 future_idx min(idx 1 np.random.randint(future_k), len(episode_transitions) - 1) g_prime episode_transitions[future_idx][3] # 取 s_next 中的 achieved_goal # 用替代目标计算新奖励 achieved s_next # 注意这里实际应取 s_next 中的 achieved_goal 部分 r_prime reward_function(achieved, g_prime) # 存入重标记经验 replay_buffer.append((s, a, r_prime, s_next, g_prime, done)) # ------- 训练更新 ------- if len(replay_buffer) batch_size: for _ in range(num_updates_per_episode): batch np.random.choice(len(replay_buffer), sizebatch_size, replaceFalse) update_actor_critic(batch) # DDPG 的常规更新逻辑请注意这段代码里有一个非常容易踩的坑achieved s_next是我为了简化写的实际环境里 s_next 是一个高维向量里面同时包含 observation 和 achieved_goal 的信息真正要传给 reward_function 的应该是从 next_obs 里取出来的achieved_goal字段而不是整个 s_next。这段代码更需要保留的其实是结构真正实现时务必把观测字段拆对。训练流程上的关键点有三个。第一重标记发生在每一条 episode 结束后利用的是整个 episode 的完整轨迹这样才能从未来状态里采样。第二原始经验和重标记经验都会被存进同一个 buffer这意味着 buffer 里成功样本的比例会显著提升这正是 HER 提升样本效率的直接原因。第三每个 episode 结束后更新 40 次这是 OpenAI 实现里的常见设定作用是让每次新收集的轨迹尽快发挥作用如果你卡在更新太慢或太激进可以调整这个 40 的值。3.3 关键参数怎么调经验池大小、actor/critic 学习率、探索噪声HER 能不能跑好参数影响非常大。我把自己调过的一些常用参数整理成一个速查表你直接对着抄也能跑出不错的基线参数建议值说明buffer 大小1e6Fetch 任务尽量给大太小会把好经验挤出去batch size256常用的稳定选择小任务可以降到 128actor 学习率1e-3OpenAI 原始实现常用稍激进但收敛快critic 学习率1e-3和 actor 相近也可以降到 3e-4gamma0.98Fetch 任务单 episode 最多 50 步不需要太大探索噪声N(0, 0.2)高斯噪声训练后期可以衰减到 0.1soft update tau0.05DDPG 目标网络更新系数future_k4重标记采样的未来步数窗口每 episode 更新次数40影响样本利用频率太大可能不稳定学习率方面很多新手会惯性用 3e-4 或者 1e-4 这种“AI 界标配”但在 DDPGHER 这个组合里1e-3 反而用得更多。原因在于 Fetch 任务的 reward 非常稀疏梯度信号稀少学习率太小会让网络几乎学不动。gamma 我特意提醒一下不要想当然设 0.99 以上。Fetch 任务一个 episode 短则 20 多步长则 50 步0.98 已经足够衡量长期回报设太大反而让价值函数对数万步之后的虚拟状态过于敏感产生不必要的方差。噪声也是关键。DDPG 本身确定性策略需要靠探索噪声保证动作多样性。我用的是高斯噪声一开始 sigma0.2训练跑到一半衰减到 0.1。如果你发现智能体总是往一个方向猛冲或者动作几乎不变大概率是噪声太小反过来如果动作像抽搐一样乱跳噪声就太大了。另一个实用技巧对观测做 RunningMeanStd 归一化。Fetch 环境的 state 维度不高数值也比较规整但归一化之后价值函数会更稳定尤其是在多个任务混合训练时能明显减少灾难性遗忘。个人实测归一化对收敛速度的提升大约有 10% 到 20%值得加上。4. 踩坑记录HER 训练不收敛的排查思路与避坑指引4.1 常见失败模式一训练跑了很久成功率一直为零但 critic loss 却在下降这是我在 FetchPush 任务上第一次遇到的情况特别容易让人误以为训练一切正常。critic loss 下降说明价值网络在学习但策略始终没有改进成功率毫无起色。排查方向有三个。第一检查探索噪声是不是太小。如果 actor 的初始策略太保守加上噪声幅度低智能体可能永远只会停留在初始区域附近根本没有机会去“够到”不同的状态导致重标记出来的目标都很雷同信息量不足。解决办法是把前几十个 episode 做成纯随机探索或者把 sigma 加大到 0.5 再观察。第二检查 reward 函数是不是用错了。如果你不小心把稀疏奖励换成了距离惩罚critic loss 下降会很快但由于目标策略和评价指标不一致任务成功率反而不涨。第三看看每 episode 更新次数是不是太多。更新次数太大会让网络在一条轨迹上过拟合表现出的症状就是 loss 长期下降但评估指标不动。一个有效的排查手段是直接打印重标记后样本的统计信息比如 g 和 s_next 的 L2 距离分布。正常情况下future 策略产出的样本应该是“距离都比较小因为目标来自未来几步之内”。如果你发现距离分布很均匀、很大那就是从 buffer 里采样随机目标而不是从未来窗口采样了代码逻辑有问题。4.2 常见失败模式二重标记目标导致价值函数过度乐观HER 本质上是在往样本里塞“成功经验”这会带来一个副作用价值函数对“成功”的估计容易偏乐观。具体表现是 critic 的 Q 值一路疯涨但真实评估成功率只有 10%。为什么会这样因为重标记的目标 g 虽然后验来看是可达的但智能体并没有主动规划“怎么到达 g”它的动作 a 只是恰好把状态带到了一个离 g 很近的地方。网络会把这种“巧合成功”误认为“这个动作走了狗屎运我只要做出这个动作就能成功”于是给出虚高的 Q 值。针对这个问题的解决方案我试过几种最有效的是限制替代目标和当前状态的距离。换个说法就是future 的 k 不要设太大我建议先固定 k4不要学别人调成 8 或者 16。另一些有效手段包括降低 critic 学习率到 3e-4给 critic 网络加 layer normalization以及在 DDPG 更新时对 target Q 做更保守的估计参考 TD3 的 trick。如果 Q 值已经虚高得离谱把整轮的 exploration noise 调大一点让策略重新探索真实状态分布也是有用的急救手段。4.3 常见失败模式三策略崩溃成功率像过山车一样忽高忽低策略崩溃是我踩过最头疼的坑。表现在训练曲线上就是成功率好不容易爬到 80%突然跌回 20%然后缓慢回升反复几次。第一次碰到时我还以为是随机种子问题后来才定位到是重标记目标分布不均匀导致的。如果你用了 future 策略但 k 特别大替代目标会偏向 episode 后半段的状态价值函数对这些远目标的估计方差很大训练波动就剧烈。k 特别小的话替代目标又都挤在最近几步策略会变得极其保守只能“复现”已经走过的轨迹不敢尝试更远的目标这样也会导致成功率不稳定。我的经验是k 固定 4 的同时把评估频率降低到每 100 个 episode 评估一次这样训练曲线看起来会更平滑也更接近真实水平。另一个很容易被忽视的坑是替换 done 标志。重标记时你在 episode 中途的 transition 里加了一条“成功样本”但 done 标志还停留在“未终止”状态。如果环境在成功时给 doneTrue而你忘了给重标记样本同步替换 doneDDPG 的价值备份就会出问题表现就是策略崩溃。别笑这个 bug 我犯过而且症状非常隐蔽。建议实现时重标记样本的 done 一律置为 False除非 g 实际上是整个 episode 的最终状态且要求截断。4.4 独家调试技巧怎么用一两个曲线判断训练是否健康训练 HER没必要每次盯七八张曲线我建议只盯三个核心指标mean episode reward、critic loss、评估成功率。mean episode reward 应该从负数稳步向 0 靠拢如果长期停在 -50 附近基本就是废了critic loss 应该先下降后基本稳定如果反复横跳说明样本分布变化太大这时候检查噪声和重标记策略成功率是最硬的指标不达到预期就是不达标不要因为 loss 好看就开始庆祝。还有一个我自己常用的早期体检方法训练刚开始的 20 个 episode 里打印每次评估时的最小、平均、最大 episode 长度。HER 重标记之后如果智能体在“碰巧缩短 task 耗时”上有明显进展说明状态空间探索正常。另一个生活习惯级的建议是训练前手动跑几次随机策略把所有 episode 的总 reward 记录下来作为 baseline。你能知道随机策略平均每个 episode 得多少分再来判断 HER 是进步了还是退步了。5. HER 的扩展应用与个人实践心得5.1 从机器人操作到更多领域HER 还能用在哪里很多人以为 HER 只能做机械臂抓取实际上凡是“带目标条件的决策任务”都有它的用武之地。目标条件意味着环境里有明确的 desired goal并且智能体的行为要以是否达到该目标来评价。比如自动驾驶里的导航任务目标就是“到达目标点”起点到终点之间通常没有稠密信号完全可以使用 HER对话系统里如果目标定义为“用户成功完成任务”那每一次没有达成目标的对话都可以通过重标记变成“如何参与一场某种话题的对话”的示范。甚至在 offline RL 场景里HER 也能作为数据增强手段对已有数据集做目标重标记让原本标签单一的经验变成多目标版本的训练数据提升离线数据的利用率。这些应用有一个共同条件你必须能定义出一个可量化的 achieved goal并且在一条 episode 内部可以看到它的轨迹变化。如果你的任务只有一个全局二元成功/失败没有连续的状态度量那 HER 就很难直接套用因为重标记需要的是“状态本身成为新目标”而不是一个二值标签。反过来只要你的任务天然有状态向量位置、姿态、语义向量等都可以试着把 HER 加进去成本不高回报却可能很可观。5.2 用 hindsight 思维重新审视问题对工程实践的启发除了算法本身hindsight 这个理念对我做工程实践也有很大启发。以前调模型的时候任何一个训练失败、任何一次 experiments 没达到指标我会习惯性地把它标记为“负面结果”然后束之高阁。后来想通 HER 之后我开始刻意练习“重标记”自己的实验日志每次失败我会问三个问题——这次的资源消耗教会了我什么配置是无效的这次的结果之间有什么规律哪怕不朝着原目标推进能不能把“没达到目标”重新定义成“验证了某个边界条件”的成功。这样做了半年之后我的实验效率高了不少因为很多“失败”的数据其实可以复用到下一步的决策里就像 RELABEL 之后 buffer 里原先的垃圾样本突然有了学习价值。当然这是一种工程心态上的延伸不是严格意义上的算法应用。但它解释了一个现象为什么 HER 的作者们能想到这样一个看似简单的 trick。他们不是被“40 万步都不收敛”的绝望冲昏头脑而是退一步想既然原目标学不会那就先学“我实际做到了什么”再去理解“我为什么没做到原来的目标”。这个思路放到任何调试场景里都成立——当某个方案原地踏步时与其死磕原目标不如先记录并利用你走过的每一个状态。反正状态空间已经探索了为什么要浪费掉呢最后再分享一个很实在的经验如果你想快速验证 HER 的理解是否正确不要直接上手写整套 DDPG先把环境跑起来手动做一次 episode然后打印出原始经验和重标记后经验的前五条人工对比 reward 和 goal 的差异。如果看到原本是 -1 的经验在重标记后变成了 0并且目标换成了一个实际到达过的状态那你的 HER 核心逻辑就通了。这个手动验算的步骤能帮你省掉后面至少一周的排查时间。我自己就是在这一步发现过坐标轴没对齐的 bug——替代目标取错了维度导致重标记出的“成功经验”其实离目标状态差了个十万八千里。这种问题如果靠训练曲线去找你永远也找不出来因为曲线只会告诉你“效果不好”不会告诉你“哪个维度错了”。先把细节确认好再上大规模训练这是我用一次次熬夜换来的教训。
阅读完成 · 觉得有帮助?
咨询建站