免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

HER算法解析:用后见之明经验回放攻克稀疏奖励难题

HER算法解析:用后见之明经验回放攻克稀疏奖励难题 Hindsight这个词英文原意是“后见之明”就是我们常说的“马后炮”。但如果你在机器学习社区里听到有人提 Hindsight他们说的不是人类心理学而是一个让智能体从失败里学到成功经验的算法——Hindsight Experience Replay简称 HER。我第一次在论文里看到这个标题时脑子里瞬间蹦出来的念头就是这不就是把人类“事后诸葛亮”的本领硬生生变成了一种训练技巧吗这篇文章我想把它掰开揉碎讲清楚包括它的原理、实现、踩坑还有我在实际用下来的一些感受。如果你正在做强化学习、机器人控制或者被稀疏奖励问题折磨得睡不着那这份内容应该能帮到你。1. 从“后见之明”说起Hindsight到底是什么1.1 生活中的后见之明AI里的后悔药先说说这个词本身的含义。我们都有过这种经历考完试对答案看着错题觉得“这题我是会做的”看球赛输球复盘时觉得“早就知道会这样”。心理学管这叫后见之明偏差说的是人在事情结果出来之后会倾向认为结果本来是可预测的。这种偏差在人类决策里经常带来负面影响比如过度自信、复盘失真。但有意思的是把这个“偏差”反过来用反而是强化学习里的一剂良药。你可以想象一个场景你教小孩投篮他投偏了球从篮筐旁边滚到地上。你如果只奖励“球进”那小孩每一投都是失败学得极慢。但如果你换一种教法只要他碰到了篮筐就给个小鼓励或者干脆把他实际投到的位置当作新目标告诉他“下次你再投到这个地方就算成功”他就能从每一次失败中拿到反馈。HER 做的就是这么件事——用“实际达成了什么”来替代“原本想要达成什么”把那些看起来失败的轨迹变成有学习价值的训练数据。所以Hindsight 作为项目名背后其实是两个层次的隐喻人类有能力在事后找到“本来应该怎么做”而强化学习智能体如果能拥有这种能力就能在稀疏奖励环境里走出困境。1.2 强化学习里的“稀疏奖励”困境讲 HER 之前先把背景说透。强化学习的基本套路是智能体通过与环境交互根据奖励信号调整策略。最理想的情况下每一步都能拿到密集的奖励比如游戏里每走一步就有分数。但现实里大量任务并不是这样。机器人抓取物体只有手掌真正握住目标物体的那一刻才知道成功机械臂推箱子只有把箱子推到指定位置才算得分自动驾驶变道只有安全进入隔壁车道才算成功。这种环境里绝大多数时间你拿到的奖励都是零甚至负反馈都很稀少。我把这种环境叫“三点一线式成功”成功点是单一状态奖励信号像远方的灯塔你在一望无际的黑夜里探索不知道哪条路能到灯塔甚至不知道灯塔长什么样。如果你用标准的 DQN 或者 DDPG 硬跑结果往往非常感人策略基本不动损失函数毫无变化或者探索了很久还在原地打转。其根本原因不是网络不够深、调参不够努力而是因为拿不到梯度的信号。你在一个棋局里下了一百步只有第一百步告诉你“赢了”前面九十九步完全不知道是走对了还是走错了你怎么可能学得快这就是稀疏奖励问题被称为“强化学习最大敌人之一”的原因。为了解决它研究者提出过奖励塑形、课程学习、内在好奇心、分层强化学习等一大堆方案。但 HER 走了一条完全不同的路既然奖励太稀疏那我就不依赖原有奖励了我自己创造密集奖励而且不是靠人工设计是靠“事后重标记”。1.3 HER的核心思想重标记目标把废物变宝贝HER 的核心思路拿一句话概括在一次尝试里如果智能体没有达到原始目标那就把“它实际达到的状态”当作新目标重新计算这条轨迹里每一步的奖励然后再放入经验回放池训练。举个例子机械臂想抓取桌子上的红色杯子结果动作歪了最后抓到了旁边一个绿色罐子。普通经验回放会把这整条轨迹标记为“全程零奖励”然后当垃圾丢掉。HER 的做法则是把目标改成“抓取绿色罐子”然后回放这条轨迹时机械臂发现它在最后一步确实完成了抓取所以那一步奖励是 1。这样原本毫无正反馈的一条轨迹突然就变成了一个成功样本。你可能已经发现这个思路有一点“曲线救国”的味道。但它的价值恰恰在于不用改环境不用设计奖励函数只需要在训练框架里加一个“目标重标记”的过程。对于多目标并行训练的智能体来说相当于每个 episode 都可以被复用成多个不同目标下的样本。简单算一笔账假设一个 episode 有 50 步原本只有第 50 步有奖励信号重标记之后如果你把每一步的目标都设为“未来某步实际达到的状态”那么这条轨迹可以生成几十个正奖励信号。这不是简单地把 0 变成 1而是把经验池的信噪比彻底改变了。1.4 为什么这个思路能在AI领域火起来HER 真正火起来是因为它解决了一个非常务实的痛点很多现实任务比如机器人操作天然是稀疏奖励的而你又很难手工设计每一步的奖励函数。奖励塑形虽然有效但非常脆弱。你设了“靠近目标加 0.1”智能体可能就学会了绕圈刷分你设了“提高目标速度加 0.2”它可能就学会了原地抖。HER 完全绕开了这个问题它不需要人定义什么是“好的中间状态”而是直接从数据里提取。只要智能体确实到达了某个状态那么这个状态就可以作为“目标”来回放不管这个状态是不是人类想要的。更妙的是HER 是“算法无关”的它不挑强化学习的肉搏算法。只要你的基础算法是 off-policy 的也就是有经验回放池的那种就能把 HER 像插件一样插进去。DQN、DDPG、TD3、SAC 都能用。我见到过不少团队把 DDPG 换成 TD3再把 HER 接上效果立竿见影。这也是它能在工程界传播开来的原因改动量小兼容性好收益大。2. HER为什么有效原理与核心机制拆解2.1 火力对比HER与奖励塑形成什么差别很多人第一次接触 HER 时会问这不就是换个奖励函数吗跟奖励塑形有什么区别区别非常大。奖励塑形是在环境侧做修改你在每个状态给智能体一个中间奖励比如“离目标越近奖励越高”。但问题是你怎么设计这个“距离函数”对于机械臂抓取你可以用欧氏距离可如果是拿勺子舀水、叠衣服、开门距离函数就变得极其抽象。设计得不好反而会诱导智能体投机取巧出现“奖励黑客”行为。HER 则完全避开了“人为设计中间奖励”这一步。它只在你原有的目标集合里做文章把一个 episode 中实际到达的状态作为“目标”参与学习。这样就相当于环境奖励函数没变但训练数据的分布变了。智能体在回放过程中看到的是“只要达到过这个状态就算完成目标”于是它就能学会一条通往“任何可达状态”的策略。之后你再给它指定真正的目标它发现原来那个真正目标也是在“任何可达状态”分布里的自然就有更大的概率能完成。我打个比方。奖励塑形像你在黑夜里给行人每隔一段路放一盏灯放多少灯、放哪你得自己设计。HER 则是让行人走完一段路后回头看看自己走过的路告诉他“你刚才走过的每一个脚印都可以当成一个目的地”。它利用的是一切已经发生过的、真实的状态不需要任何假设。2.2 目标重标记的四种采样策略HER 论文里详细对比了几种重标记策略我简单说一下因为实际编码时你会遇到选择困难。假设你有一个 episode(s_0, s_1, ..., s_T)其中 (s_T) 是最后状态。你想要重标记第 (t) 步的目标 (g)有几种可行做法future从第 (t) 步之后的状态里随机挑一个状态作为新目标。这是论文里效果最好的方案。原因是它选的是一个“未来时刻真实达到的状态”这个状态通常比当前状态离原目标更近而且和当步动作有因果联系。final直接用 episode 的最终状态当目标。这个最简单但可能太远离中间步导致早期步骤缺乏学习信号。random从整条轨迹里随机挑一个状态当目标。鲁棒性一般因为可能选到过于随机的目标。episode整条轨迹只重标记一次用最终状态作为新目标。效率最低因为生成的经验少。我实际测试下来的体会是future 策略是默认首选但它的随机采样范围需要控制。如果从 (t) 步之后太远的状态采样目标与当前状态之间的因果关系可能太弱如果太近目标又太简单。论文里的做法是从所有未来状态中均匀采样大多数情况下就够用了。不过在一些复杂任务里我会把采样窗口限制在未来 5 到 20 步内效果更稳。2.3 数据利用率的直观计算说 HER 能“变废为宝”到底能变出多少宝我们不算模糊账直接算一笔。假设一个 episode 长度为 (T50)原始目标 (g) 下这个 episode 可能只有最后一步 (r1)前面全是零。HER 的 future 策略允许你对每一步都重标记一个未来状态作为新目标那么这一步就能得到一个“该步之后达到某个状态”的 success signal。只要未来状态与当前状态是可达的那么在某一步的 hindsight goal 下这个 episode 的某个后续状态一定会是成功的。极端情况下一条 50 步的轨迹你可以拆出 (T) 个不同的有正奖励的经验点而从采样角度看每个 transition 都可能被重标记成不同的目标总样本量可以多达 (T \times N_{\text{episodes}})。实际训练时我们一般不会对每个 transition 全量重标记而是设定一个概率 (k)比如 0.8。也就是说从经验池里采样 batch 时80% 的样本采用重标记后的目标20% 保留原始目标。别小看这个 80/20它能让经验池里的“正样本率”从几乎为零提升到接近 30%—50%。梯度信号密度完全不同。我见过一个 FetchReach 环境的实验普通 DDPG 训 500 个 episode 成功率还是 0而 DDPG HER 在 100 个 episode 内就能达到接近 100% 成功率。数据利用率差距是数量级的。2.4 适用场景边界别把HER当万能药HER 很强大但它不是万能的。我总结它的适用边界方便大家少走弯路。第一它要求任务必须是goal-conditioned也就是可以用一个明确目标描述任务。比如“移动到某个点”“抓住某个物体”“把状态变成某一个目标状态”。如果任务没法定义目标空间HER 无从下手。第二目标空间必须是从状态中可观测或可推导的。你要能把“实际达到的状态”提取成目标。比如机械臂的末端位置直接可以从状态里读出来但是像“让对话更友善”这种语义目标就没法提取。第三范围更合适的是稀疏奖励场景。如果环境本身每一步都有很好的密集奖励HER 的收益有限反而会引入多余的重标记让训练变慢。第四HER 要求off-policy的训练范式。因为你是在回放过去的数据时重标记目标on-policy 算法在更新策略时用到的数据必须来自当前策略重标记等于改变了数据分布理论就不扎实了后面会专门讲。说到底HER 适合的是“目标明确、过程难测、奖励稀疏”的一类问题。它解决的痛点是“我没有中间奖励但我知道什么状态是可达的”。3. 从零实现HER关键步骤与代码剖析3.1 用FetchReach环境热身先推荐一个最适合练手的环境OpenAI Gym 里的 FetchReach。这个任务是把机械臂的末端移动到桌面上的一个三维目标点。动作是四维的三轴位移加一个夹爪控制状态空间里既包含机械臂当前的末端位置achieved_goal也包含你设定的目标位置desired_goal。为什么选它因为 FetchReach 的目标定义很干净直接用 XYZ 坐标奖励函数就是“末端位置是否和目标点距离小于阈值”。更重要的是这个环境自带一个稀疏奖励版本只有距离小于某个阈值时给 1否则 0。用这个环境你能非常直观地看到 HER 到底带来了什么变化。装环境很简单pip install gymnasium然后导入环境就行。我这里不想花大篇幅讲安装网上教程很多。主要说一下如何在任务定义层面把“目标”这个概念接进来。import gymnasium as gym import numpy as np env gym.make(FetchReach-v2) obs, _ env.reset() print(obs.keys()) # dict_keys([observation, desired_goal, achieved_goal])这个 obs 结构里observation是完整状态desired_goal是我们要完成的原始目标achieved_goal是当前实际到达的位置。HER 的核心就是把achieved_goal在训练时当作新的desired_goal用。3.2 经验存储设计Episode才是最小单元大部分强化学习实现里经验池的最小单元是一个 transition( (s, a, r, s, done) )。但用了 HER 之后这个结构就不够了。因为你不能在一开始就确定最终奖励重标记后 reward 会变所以你必须存下整条 episode并且保留每步的desired_goal和achieved_goal。我推荐的做法是先用一个临时列表保存当前 episode 的所有 transition。每个 transition 包含多个字段不只是 obs还有 goal。等这个 episode 结束之后你把它作为一个整体推入一个“episode 级缓冲区”而不是直接拆成 transition 丢进普通回放池。训练采样时你从这个 episode 级缓冲区随机选一批 episode再从每个 episode 里随机选 transition然后进行重标记。这里有一个很容易踩的坑有些人直接把整条 episode 存成一个大数组比如list of dict这在规模小的时候没问题但如果你跑的是图像输入或者 episode 很长内存会爆炸。后面我会专门讲内存优化。3.3 采样与重标记的核心代码实现直接上一个简化版的 HER 采样代码逻辑写清楚方便照着自己实现。这里以 future 策略为蓝本。def sample_her_batch(episode_buffer, batch_size, k0.8): 从episode_buffer中采样batch并做目标重标记 batch_obs [] batch_act [] batch_rew [] batch_next_obs [] batch_done [] nb_episodes len(episode_buffer) batch_size min(batch_size, nb_episodes) for _ in range(batch_size): # 随机选一个完整episode ep_idx np.random.choice(nb_episodes) episode episode_buffer[ep_idx] episode_len len(episode) # 随机选一个transition t t np.random.randint(episode_len) transition episode[t] obs transition[obs] act transition[act] next_obs transition[next_obs] goal transition[goal] # 原始goal # 以概率k执行目标重标记 if np.random.uniform() k: # future策略从t之后的某个状态挑选achieved_goal作为新goal future_idx np.random.randint(t, episode_len) new_goal episode[future_idx][next_obs][achieved_goal] # 根据新goal重算reward reward compute_reward(next_obs[achieved_goal], new_goal, None) done check_done(next_obs[achieved_goal], new_goal) # 用new_goal替代原始goal放入batch obs[desired_goal] new_goal next_obs[desired_goal] new_goal goal new_goal else: reward transition[reward] done transition[done] batch_obs.append(obs) batch_act.append(act) batch_rew.append(reward) batch_next_obs.append(next_obs) batch_done.append(done) return batch_obs, batch_act, batch_rew, batch_next_obs, batch_done需要注意几点episode里的每一步存的是obs是一个 dict包含achieved_goal和desired_goal字段。重标记的时候要同时改obs、next_obs里的desired_goal不然网络输入不一致训练直接崩。compute_reward和check_done是从环境里拿到的函数。实际实现时直接复用环境内部的reward_fn即可。如果t恰好是 episode 的最后一帧future_idx取值范围是[t, T-1]也允许选到当前状态这时 new_goal 就是已完成目标这没问题。注意我的batch_size基于 episode 数量一次 batch 可能包含同一条 episode 的多个 transition这在 off-policy 里是允许的但最好加一个“去除重复 ep_idx”的限制防止样本偏差过大。3.4 把HER接入DDPG训练一个拿到球的机器人HER 本身不是算法而是构造训练数据的策略。你最终还是需要一个 off-policy 强化学习算法来吃这些数据。我这里以 DDPG 为例讲一下接入结构。假设你已经实现了一个标准的 DDPG包括 Actor 网络、Critic 网络、Target network。HER 的接入点就在“采样 batch 之后更新网络之前”。具体流程是环境交互收集一个完整 episode。episode 结束后存入 episode_buffer。从 episode_buffer 用sample_her_batch采样出 batch。用这个 batch 更新 DDPG 的 Critic 和 Actor。周期性软更新 target network。这里有一个我刚做的时候很容易忽略的细节Critic 的输入是 (当前状态, 动作, 目标)。因为有了目标重标记同一个状态在不同目标下价值是完全不同的。你自己想象一下机械臂停在某个位置如果目标是“到达这个位置”那这一步价值很高如果目标是“到达另一个位置”价值就很低。所以网络结构里必须把 goal 作为一个输入而不是只喂状态和动作。我用一个压缩版的伪代码示例说明这种“目标作为输入”的结构def critic_loss(batch): obs batch[obs] # dict, 包含observation和desired_goal obs concat(obs[observation], obs[desired_goal]) act batch[act] next_obs concat(batch[next_obs][observation], batch[next_obs][desired_goal]) target_q reward gamma * q_target(next_obs, target_actor(next_obs)) q q_critic(obs, act) return mse(q, target_q)训练时我发现一个比较实用的小技巧在给 Actor 更新梯度时也要把多样化的 goal 传给它这样才能让策略学会“无论目标是什么都能做出合适动作”。不要只在 critic 里用 goal那样 actor 会退化成一个只管当前状态的控制器。3.5 超参数配置与效果实测我基于自己跑实验的经验列一个常用的超参初始值。这个配置在 FetchReach 和 FetchPush 上都表现不错大家可以先抄作业再根据任务调。参数推荐值说明重标记概率 k0.880% 样本重标记保留 20% 原始目标防止策略忘掉原始任务重标记策略future从未来状态中随机采样新目标经验池大小$10^6$存的是 episode实际占用的 transition 也会很大batch size256从 episode_buffer 中采样 episode 数episode 最大长度50Fetch 系列默认过长会导致重标记目标过于遥远actor 学习率1e-3用 Adam 优化器critic 学习率1e-3用 Adam 优化器target 网络软更新系数0.05默认 0.05 比 5e-3 收敛更快一点探索噪声Gaussian, std0.2动作噪声需与环境动作范围匹配我用 FetchReach 环境实测普通 DDPG 在 200 个 episode 内成功率始终在 0% 附近打转换成 DDPG HER之后通常在 80 到 120 个 episode 就能达到 90% 以上成功率。FetchPush 这种稍微复杂一点的任务DDPG 单独训练几乎学不到东西加上 HER 后大约在 500 个 episode 左右开始有明显提升。这个效果并不是因为 HER 让奖励更密了而是因为同样的数据它被用“多种目标”学习了很多遍。本质上它把“一条轨迹只能表达一次”变成了“一条轨迹可以服务于多个目标”。数据利用率上来了训练效率自然就上来了。4. 实操踩坑HER常见问题与排查笔记4.1 训练不收敛先检查这四件事我遇到过的“HER 训练不收敛”的情况排查顺序基本固定。第一件事是检查goal 是否真的被重标记了。听起来很蠢但有很多人是在代码里加了if分支但没生效或者把new_goal赋值给了下一步但忘了改当前步。你可以在训练循环里打印几个 batch 的obs[desired_goal]跟reward看看是否有正奖励样本出现。第二件事是检查achieved_goal 是否准确。机械臂的末端位置在仿真里直接读可以但在真实环境里如果你的感知系统给出的是带噪声或不准确的末端位置HER 会把这些错误的状态当成目标导致整个经验池信息混乱。我见过一个项目视觉识别出的目标物体位置偏了 3 厘米HER 训出来的策略就始终差那么一点。第三件事是检查网络结构是不是把 goal 融入进去了。如果你的 actor/critic 输入里没包含desired_goal那目标重标记就完全白做了。第四件事是检查reward 计算和 done 的计算是否与重标记后的 goal 保持一致。很多人重标记了 goal但done还是按原始目标算的这样就会出现“明明达到了新目标算法却认为任务没结束”的矛盾信号训练必然乱套。4.2 重标记比例k到底怎么调k 这个参数太小的话大量样本还是 0 奖励HER 的威力发挥不出来太大的话比如 0.95 以上绝大多数样本都用 new_goal 训练策略会越来越偏向“迎合实际结果”而忽略你真正想让它完成的任务。这好比分批学生考试如果每次纠正答案时都告诉他们“你写的答案就是正确答案”他们很快就不会再去思考第几题才是真正要做的题。我拉过一组对比数据在 FetchPush 上k0.5 时训练速度明显偏慢k0.8 效果最佳k0.95 时虽然早期学习快但最后成功率卡在 80% 上不去。因为策略被过多的“替代成功”带偏了。所以我的经验是训练初期可以把 k 提高到 0.85 甚至 0.9让智能体快速建立起“任意目标都能完成”的稳健策略训练后期降低到 0.6-0.7把注意力拉回原始目标上。4.3 为什么on-policy算法用不了HER这个坑在网上讨论特别多。有人把 HER 放到 PPO 里跑结果发现根本不收敛。原因其实不复杂PPO 这类 on-policy 算法要求每一条训练样本都来自当前策略。HER 在重标记后样本的“目标”变了但原始行为并不是在“新目标”下产生的。按严格定义这些样本就不再服从当前策略的分布强行用它更新策略会产生很大的偏差。你可以尝试把 HER 和 on-policy 算法结合但需要额外做一些重要性修正或参数化处理这已经不是标准 HER 的范畴了。所以我个人建议别在这上面纠结直接选 DDPG、TD3、SAC 这类 off-policy 算法配合 HER 简单又稳定。4.4 内存爆炸的解决思路HER 要求存完整 episode所以经验内存消耗通常是普通经验回放的数倍。我在一个高分辨率图像状态的任务里曾把服务器 64GB 内存直接跑满。应对办法有这几层能存低精度就不存高精度。状态里的数组全部转成float32不要用float64。对图像输入做降维。比如用 VAE 把高维图像编码成 32 维向量再把向量作为achieved_goal存进经验池。这相当于在“表征层面”做 HER效果依然不错。限制最大 episode 长度避免某些任务里智能体一直“原地转圈”导致 episode 无限长。使用“物理剪枝”只存经验池里最近的 N 个 episode旧的直接丢弃。HER 的收益没有想象中那么依赖巨量历史数据所以可以把 N 设小一点比如 200 个 episode先跑通再调大。4.5 部署到真实机器人前必须知道的几件事仿真里 HER 跑得飞起不代表真实机器人就万事大吉。第一件要命的事是真实环境里你的“achieved_goal”通常来自外部感知比如视觉定位。这个感知的噪声如果超过任务容差HER 重标记出来的目标本身就是错的策略学到的也是一个带噪声的目标映射。第二件事是真实机器人没办法像仿真那样高频采样。你需要把仿真里训练好的策略迁移到真实世界然后只做少量微调。我之前试过在仿真中用 HER 训练好机械臂皮皮虾推方块任务然后迁移到真机误差一开始很大但只用了非常少的真实数据微调就好了很多。原因是 HER 在仿真中学到的“任意可达目标都能完成”的能力天然对目标变化有泛化性。第三件事是注意安全约束。HER 鼓励智能体探索“任何可达状态”在仿真里随便搞没关系但在真实机器人上这可能导致机械臂撞到限位、插到自己的线束、或者冲到运动规划的禁止区域。部署时我会给动作空间加限制或者用一个安全层去过滤高风险动作。5. Hindsight的延伸算法之外的价值5.1 从HER到目标自动生成HER 解决了一个很重要的问题人类不需要为环境设计中间奖励只需要给出一个“目标空间”。但依然有一个问题悬而未决对于复杂任务目标空间本身怎么定义比如“把洗碗机里的碗按大小叠好”这种抽象目标状态里根本没有一个现成的achieved_goal可以读出来。所以后来才有了一系列后续工作。比较有名的有 GoalGAN用 GAN 来自动生成难度适中的目标让智能体既能学到新技能又不会因为目标太难而挫败。还有 Hindsight with Online Rewards在 HER 的基础上增加一个 online 的奖励预测器让“目标重标记”不再局限于真实可达状态而是可以扩展到预测的虚拟目标。这些方向本质上都是在琢磨同一个问题怎么让智能体更好地理解“我完成了什么”。我觉得 HER 最大的贡献不是它本身的效果而是它打开了一扇门让研究界意识到经验重放时可以不只是重放“环境给的经验”还可以重放“我们事后构建的经验”。这个思想后来渗透到了很多领域比如 meta-imitation learning、自监督强化学习、甚至推荐系统里的样本增强。5.2 把后见之明用在项目复盘和产品决策上回到 Hindsight 这个词的本意它在项目管理里的价值其实同样值得说一说。很多团队做复盘容易陷入两个极端要么全员互相甩锅要么一句“当时信息不足”就带过去了。但如果借鉴 HER 的思路复盘的重点可以从“找责任”变成“重建目标”。你说“这个需求当时就不该做”这其实是一种事后目标重标记把失败后的实际结果设为已有事实反推当初在什么条件下做哪个选择会更合理。这不是为了给谁洗地而是为了让下一次决策时更有场景感。我个人习惯的做法是每个项目上马前先写下“决策日志”包括当时假设、可用信息、预期结果。复盘的时候把“实际结果”当作新目标重新走一遍当时的决策逻辑看在哪一步如果选了另一条路会产生什么不同。这样做会比单纯记“教训”更有效因为教训往往停留在口头而“重标记”会强制你理解因果关系。当然我也要说清楚项目复盘里的“后见之明”要小心过度使用。人类本来就容易在结果出来后高估自己的预判能力如果我们刻意用 HER 式的“重标记”去复盘可能会放大这种偏差。所以在实际应用里我建议把它当成一种训练辅助手段而不是最终结论。5.3 一点个人经验和最后提醒我最初被 HER 吸引是因为它简单到让人觉得“这也能行”。但用久了之后我对那四个字“从失败中学习”有了更深的理解。失败本身没有信息量信息量在于你如何定义目标。HER 不给智能体喂后悔药它只是提醒智能体“你实际达到的地方也能成为你的目的地。”这正是人类学习的某种秘密不是所有的目标都来自外界很多内在的成就感来自于“完成了一件原本不在计划内的事”。最后说一个能立刻上手的小技巧。如果你想在自己的强化学习任务里试 HER但一时不想改太多代码那就先把你的经验回放结构改成“episode 级存储”然后在采样时用我上面给的sample_her_batch函数替换原来的采样函数。你甚至可以不用装任何复杂框架只要有一条现成的环境加上 100 行代码就能看到稀疏奖励环境里的训练信号密度发生质变。等这笔账尝到甜头了你自然会理解为什么 HER 会是这么多机器人操作项目的标配。
返回列表