尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Hindsight与HER:从强化学习经验回放到日常复盘,把失败变成学习信号

Hindsight与HER:从强化学习经验回放到日常复盘,把失败变成学习信号 开年初我换了个新工作接手了一个跟机器人抓取有关的强化学习项目。第一周开会mentor 抛出一个词——hindsight我下意识以为是事后复盘的意思。他说得对也不对。在强化学习里hindsight 指的是 Hindsight Experience Replay后见经验回放一种让智能体从失败里反向挖出学习信号的思路而在生活决策里hindsight 是后见之明是你回顾过去时冒出来的各种我早知道。同一个单词横跨技术和认知两个领域而且都指向同一个动作把已经发生的结果重新变成下一步的燃料。这篇文字想跟你聊的就是这个。我会先把 hindsight 放在强化学习的技术语境里讲清楚它在解决什么、怎么落地、参数怎么调再退回来聊一个我们每天都在无意识做、却又常常搞反的事——复盘。如果你是做 AI 算法、机器人控制或者游戏 AI 的同学前三章可以直接当技术笔记用如果你只是对怎么从过去学到东西感兴趣也可以直接跳到第四章看看复盘框架。两套东西底层是同一个逻辑站在终点回看路径重算你的决策。1. 从 hindsight 说起这个事后聪明凭什么值得专门研究1.1 事后聪明的两张脸技术命名与认知陷阱Hindsight 这个词在英文里的日常用法多少带点贬义。说一个人 hindsight意思是他在事情结束后马后炮讲一堆我当时就知道会这样。心理学里有个专门名词叫后见之明偏差hindsight bias指的是人们在知道结果之后会系统性高估自己事前预测的准确度。股市里回头看全是黄金坑复盘会里这个风险我们早该识别出来本质都是同一个偏差在作祟。但在强化学习算法里hindsight 却被当成宝贝。2017 年 OpenAI 的研究者提出 Hindsight Experience Replay 时思路恰恰是把马后炮变成一种合法的训练信号智能体没有完成任务但在事后把实际到达的状态当作一个虚拟目标重新给这段轨迹打一遍分然后扔进经验池。难点在于这段轨迹虽然没达成原目标却可能已经展示了一些有意义的状态转移模式如果不用 hindsight这些差一点的尝试全被当作负样本扔掉学习效率会非常差。这两个层面的事后聪明放在一起看很有意思一个是认知偏差让你误以为自己很强是负资产一个是算法技巧让智能体从失败里捡回另一半价值是正收益。我们得学会区分它们。1.2 hindsight 为什么值得单独立章聊对一个做算法的人而言HER 是那种第一次看懂会觉得我怎么没想到的工作。它不引入新的网络结构不改变 Q 函数不动机器人本体只改经验回放池里的数据怎么存、怎么采样效果却极其显著。在稀疏奖励的多目标任务里没有 HER 的 DDPG 经常从头到尾什么都学不会加上 HER 之后几十万个 step 内就能看到明显的成功率上升。对一个普通人而言hindsight 相关的复盘能力决定了你是把经历吃干榨净还是年复一年地重复同样的坑。我见过太多团队的复盘会开了等于没开大家坐在一起把自己夸一顿把结果归因给一两个宏大理由然后散会。真正有价值的回顾需要反着来——承认事前信息不足把结果放在当时的约束条件下重新推演提炼出下一轮马上能用的规则。Hindsight 这个词恰好把这两个话题缝在了一起。技术层面教你如何设计事后重标目标的机制认知层面教你如何设计回看过去的检查单。两件事都没有标准答案但有成熟的框架这篇就把框架和细节一起给你。2. 强化学习里的 HindsightHER 也在解决什么问题2.1 稀疏奖励机器人抓取任务里的冷板凳先把强化学习的奖励做个粗分类。一种是密集奖励dense reward每一步都告诉智能体你做得好不好比如每个 step 离目标近一点就 0.1。另一种是稀疏奖励sparse reward只在最终完成时给一个大奖比如抓到了给 1其他时候全给 0。稀疏奖励在真实任务里非常常见因为真实世界的反馈本来就是稀疏的。你没法让机器人的每个关节都朝正确位置微调你能检测到的只有物体有没有被抓起来这一个布尔量。问题在于当奖励处处都是 0 时策略梯度算出来几乎处处是 0智能体压根不知道往哪个方向走。它拍了一大堆随机动作直到偶然抓起来才拿到一次正信号——这个概率在多维连续动作空间里小到可以忽略。结果就是训练陷入死锁没有正样本就学不到策略学不到策略就没有正样本。这就是经典的冷板凳问题。我举个例子你就懂了。让一个 DDPG 智能体去控制一个五自由度机械臂把一个方块从桌面抓到目标点每 1000 步算一个 episode成功给 1否则全 0。不做任何改造的话训练 50 万步以后成功率曲线大概率还是贴着地面。智能体每次开局都是一顿乱挥最后什么都没发生过渡的 200 步全是 0 奖励经验池里自然全是不见天日的轨迹。于是网络参数更新时处处都找不到梯度方向。眼看就陷入死循环了。HER 的设计目标就是要给这些全程拿零分的轨迹找到一丝可以学的东西。2.2 HER 的核心思路让失败的轨迹自己长出目标HER 的语法没有用复杂强度。它的核心做法只有一行逻辑当你的一条 episode 没能达成设定目标 g 时不要急着把整条轨迹丢进经验池当垃圾。你挑出轨迹结束时的真实状态 s_T比如机器人最后实际停留的位置把它改写成一条目标本身就是 s_T的成功轨迹再把这一条也存进经验池。这个改写的关键在于修改目标后这条轨迹成了居然成功了的一条轨迹因为新的目标含义是最终落到了自己实际所在的位置那它当然满足成功条件最后一步必然命中奖励可以从 0 改成 1。这样经验池里就多了一批带正奖励的样本。下次更新网络时它们会给策略一个信号朝最终状态那样去行动是对的。你可能会问这不是换题了吗智能体并没真的学会目标 g 啊。没错它没学会原目标但它学到了一个更底层的规律——这些状态转移是能闭环到目标上的而这个规律恰恰能泛化到原目标上。原理在于许多目标其实是可迁移的换标的后的轨迹虽然不等于完成 g却蕴含了如何从当前状态走到任意一个可达目标的运动模式。HER 论文里的关键实验证明面对一个方块到达指定位置这类任务用 HER 存在经验池里的样本能让智能体逐渐把把物体移到任意目标点的能力训练出来。当它理解了这个通用模式再把目标切回 g成功率自然就起来了。打个生活化的比方。你们组做一个项目失败了但你带着失败版本回到了当时某个中间节点重新定义那个节点为终点那你起码验证了一种路径是走得通的。把这些走过的路都记录在案下次遇到真正的目标你能避开死胡同的概率就大得多。算法层面的事后重标和这个思维模型没有本质区别。2.3 目标替换策略同一个思路的四路刀法HER 实现时有一个细节决定了最终效果一条失败的轨迹里到底要挑哪个状态来当事后目标。论文里给了四种方式如图中四个拼接策略键目标替换策略含义适用性与直觉final取轨迹最后一个状态作为替代目标最简单、最稳适合大多数任务future从当前 step 之后随机抽一个状态作为目标相当于把一个轨迹视角切成多个成功样本效率更高episode从同一 episode 里随机抽一个状态作为目标比 future 更分散适合目标空间需要多样性的场景random从经验池里随机抽一个已出现状态作为目标基本等于不加 HER 的对照组动态目标时类似基线我更愿意把它理解成决定目标的空间覆盖范围。final 策略只产生一条成功轨迹future 策略能在一段轨迹里生成多条阶段成功样本episode 策略进一步分散到整条轨迹。论文与后续不少实现比如把 HER 集成进 DDQN 以处理游戏场景都建议默认可以先试 future并且从第 k 步之后的状态采样k 通常在 3 到 5 之间。至于 random它更多是学术对比用的基线实跑时一般不会选它作为主力。还有一个工程细节替换完目标之后奖励函数必须能根据新目标 实际状态重新计算。这就要求环境在设计时把奖励函数做成以 (状态, 目标) 为输入、可重新求值的形式而不是把奖励直接打进环境返回的 step 结果里。很多新手在踩坑时会对这条硬编码导致奖励无法回溯。请在初构环境时就把它抽象出来。2.4 HER 的适用边界与训练技巧HER 不是万能药。我把它理解为目标条件强化学习goal-conditioned RL的超级外挂而不是稀疏奖励的终极解。需要同时满足以下条件HER 才能发挥功力环境的状态必须能拆出目标部分并且目标与状态分布在同一语义空间比如都是坐标。奖励必须能计算距离或命中判定这样换目标后可以重新求值。算法得是 off-policy即通过经验池采样更新的。DDPG、TD3、DQN 这些都没问题而 A2C/A3C 这类 on-policy 算法哪怕加了 HER也很难吃到红利因为样本是当前策略下的。目标空间不能过于稀疏到状态永不重叠。如果智能体永远无法接近任何目标那事后状态也会失败得五花八门难学出有效规律。训练时我还总结出几个经验第一HER 样本与普通样本的混合比例强烈建议前者优先维持在 80% 左右第二分母里的奖励可以用距离是否小于阈值这种离散判定的比搭建连续别的高斯奖励更为稳定第三只要条件允许就在网络输出侧做归一化避免不同目标幅度差异引发不稳定第四HER 对回合长度的敏感性比你想象得高episode 过长时未来采样得到的目标距离当前过远信号漂移得厉害需要配合注意力或近端回报裁剪。3. 实操参考在一个抓取任务里复现 HER 的关键步骤3.1 环境定义目标与状态的表示拆解我把一个 OpenGL 场景简化成绩二三维小环境我们设状态 s [机械臂关节角, 方块坐标]目标 g [方块坐标]。每步控制量为关节角速度。成功条件为方块的最终坐标落进目标点半径约 0.05 的球域。这样目标与状态坐标天然同维奖励函数可以直接改写成 def compute_reward(achieved_goal, desired_goal, info) 形式其中同时输出是否命中的布尔与稠密负距离方便对照实验。代码块里我通常会写成类似这样的形式伪代码带注释读者可按自己的框架改写def compute_reward(achieved, desired, info): # 使用欧氏距离作为度量和命中参考 dist np.linalg.norm(achieved - desired) # 阈值判定稀疏 / 半稠密兼容 sparse (dist 0.05) and 1.0 or 0.0 dense -dist * 0.1 return sparse dense if use_dense else sparse这里 use_dense 只是一个开关,便于做对比实验。请勿把奖励只写入环境内部的 step 返回值里否则后续 HER 更换目标后你无法重新评估这一条经验的价值。3.2 经验回放池的改造经典的经验池里每条样本是 (s, a, r, s, done)。HER 需要在写入时做一次双写原始样本按原目标存入一份。从同一 episode 里选取一个事后目标把该样本中的 s / s 的目标分量临时替换成新目标同时用 compute_reward 重新计算 r 和 done再写入一份。这里的细节在于s 与 s 的目标分量都要同步替换否则智能体会看到现在目标 A但下一帧目标 B凭空污染 Q 网络。我在 TensorFlow 的老代码里踩过这个坑整整一天香草 DDPG 怎么都不收敛。替换后你有两份经验一份是它对原目标的尝试一份是它对某个可达目标的演示。后者虽然语义上与原目标偏离却以一种小成功的形式把能力留在梯度里。经验池容量建议比普通 RL 调得更大一些比如普通任务 10 万起步HER 任务最好 50 万到 100 万。因为你要容纳双写的样本并且多样化采样要打破时序相关性海量样本是前提。每次采样时我会让每个 batch 约 70% 的结构来自 HER 版本30% 来自原始版本用这个比例跑出来的成功率比 5:5 更稳。3.3 训练超参数与调参心得HER 的开放超参并不高但有几个值得反复调试超参数我的初始建议调参方向episode 长度200任务目标可达性低时适当放宽但过长会导致未来采样噪声大经验池大小50w ~ 100w样本越多样HER 越从容HER 替换概率80%太高会让原始目标被淹没网络学不到真正的问题future 采样起点k 取 3~5太近则新增信息少太远则噪声大batch size256HER 中多样性更关键batch 小了容易方向抖动learning rate1e-3Adam如果损失振荡降到 3e-4优先保住稳定性我一般训练流程是先不给 HER纯用 DDPG 跑 20 万 step 看成功率能到多少全凭运气。然后开 HER让成功率曲线从第 5 万步前后就明显抬起来。值得说明的是HER 不会用相同算力把成功率拉到 99%它更多是把原来0% 学到的任务变成50%~80%的任务要再往上通常需要配合 Hindsight 以外的技巧比如自适应课程学习或轨迹平滑。3.4 从曲线里读出算法是否在学我经常跟团队讲读 HER 训练曲线跟读心电图一样你得知道哪些波动是正常的哪些是出事信号。稳定学习的曲线特征是前若干万步成功率近似平躺这是正常潜伏期随后出现一段学到的陡升往往横跨 5 万~10 万步再往后进入平台成功率在 40%~70% 之间抖动这本身说明目标替换的多样性让策略的梯度产生天然随机性并不意味着过拟合。如果曲线全段平躺且经验池里的成功样本占比始终接近 0通常要排查三件事目标状态换没替换对尤其是 s 与 s 要一起改、奖励函数是否已改成 输入 strgoal 可重算 的形式、未来采样选的 k 是不是太大导致目标全部远超当前可达范围。后者的听觉表现是 AI 在刻意远跳、离成功越来越远。把 k 调小到一个半阶范围很快能见到起色。4. 日常决策里的后见之明如何把事后聪明变成真本事4.1 后见之明偏差为什么复盘常常骗你聊完工程我想把同样的逻辑搬到人身上。Hindsight 作为热词的高频语境其实是hindsight bias——后见之明偏差。你回顾某个项目时明明当时有大量不确定信息但因为结果已经摆在眼前你的大脑会自动把当时的信息筛选成与结果更相关的那部分于是产生这事本来就该预料到的错觉。这个偏差的危害不在于让你有点自信而在于它系统性扭曲归因。三年前你投过一个项目结果翻了五倍。复盘时你很容易把成功归因于我当时嗅觉敏锐我们团队执行力强。但如果你三年前同时投了五个项目其中四个血本无归那这一次成功很可能是幸存者偏差的产物。后见之明偏差一旦主导复盘你会提取出错误的经验并在下一轮加大错误投入。所以我说复盘是一个有风险的动作。不是说别复盘而是要认清事后聪明是天然的感受必须用结构化校验把它按在地上摩擦。4.2 一套能落地的复盘框架分享一个我用了很久的四步复盘法。每一步都有明确产物你要么在白板上写下来要么在文档里留下记录绝对不要让复盘停留在闲聊里。步骤关注的问题产出物目标回顾当时我到底做了什么决策衡量的标准是什么写出原始目标与决策依据清单结果对照实际结果与预期差多少在哪个分支上发生的偏移一事一列的差距表过程推演当时有哪些信息可用哪些信息事后才显示出来时间轴上的决策点与信息快照规律提炼提炼一个如果重来会怎样的可迁移原则三条以内、可执行的原则第四步的可迁移原则绝不是写成以后要更细心这种废话。它得是有触发条件的比如当方案给到我能设置完整A/B对拍数据时才允许跳过代码评审。模糊道理没有信息量。4.3 团队复盘时的三个坑做个人复盘容易自欺欺人做团队复盘更难因为多了一堆社会性博弈。我把我见过的坑打包成一个列表给你甩锅与揽功。大家都倾向于把失败原因说成环境变了把成功归因给团队决策正确。化解方法是复盘时引入一个控制点概念资源变化、信息变化、人员变化分别列出不提前预判谁是主导。追责式的为什么。提问方式决定回答质量。问谁的责任只会得到防御性说法问当时还有什么别的选择才会涌现出深入思考。复盘会上的每一句话都该是描述性的不评价对错。过早跳到结论。经常是有人讲了一两个失败 case大家就达成共识说我们应该避免 XX。这时要先喊停问一句这个结论可以经受反例考验吗你把复盘结论当成一个临时假说花一天做个小实验验证总好过全团队照着错误结论猛跑半年。我认为复盘最重要的态度是把事后聪明当成工具而不是身份。你是利用 hindsight 去重新计算目标与路径的人而不是那个站在终点宣布一切都可预见的神。这一点做对了一招一式都能受益。5. 常见问题与排查技巧实录5.1 HER 训练不收敛怎么排查我根据自己带项目时的真实经历整理了一张 HER 问题排查速查表。如果你按这个顺序查一遍大部分时候都能找到突破口现象可能原因排查动作成功率一直 0经验池里没有命中原始轨迹全失败HER 目标没正确替换打印替换后的 r 与 done 是否为 1有成功样本但曲线仍平躺学习率太高 / 网络结构过深降学习率至 3e-4简化 MLP 层数成功率稳步上升但后期崩溃HER 样本占比过高原始目标被淹没把 HER 比例从 0.8 降到 0.4~0.5经验池中目标出现乱码/NaNs 与 s 替换不一致检查双写逻辑里状态目标分量是否同步替换训练前期就表现不错后期泛化差目标空间采样不够宽把 final 随机采样换成 future/episode 混合还有一个经验不要一开始就开 HER 或加多样性采样。先拿香草 DDPG 验证环境奖励设计没错——比如你可以让一个演示的脚本录制一个成功轨迹放进去看看 Q 值是否走高——再关掉脚本让智能体自己从零开始学。这样可以排除环境/奖励本身是烂的这一层问题。5.2 复盘偏差怎么修正如果你已经意识到自己可能被后见之明带偏最有效的修正是写事前笔记。在项目开始时把你要做的判断、预期概率、风险清单写进一个文档封存。等项目结束后再打开对比。这样一个简单的操作能让你的事后聪明现出原形你会发现当初根本没写预期会翻倍只写了可能会持平当时的风险清单里列了三条但没有一条指向最终暴雷的点。这份对照会让你诚实地承认你的预测能力其实一般成功更多依赖尝试次数与快速调整能力。此时你才真正回到了从失败/不定中学习的正确位置。5.3 快速自查清单最后送你一份可以直接复制粘贴到项目文档里的自查清单无论是跑 HER 还是做团队复盘都有用[ ] 环境奖励是否可基于 (状态, 目标) 重新计算[ ] HER 的双写逻辑是否同时更新 s 与 s 的目标分量[ ] 经验池容量是否充足HER 比例是否优于基线[ ] 是否有事前笔记/目标记录可供后续对比[ ] 复盘结论是否落到具体的触发条件与行为规则而非空洞口号[ ] 是否在复盘里使用重写目标的思维将失败尝试也视为学习数据[ ] 是否检查了幸存者偏差与盲目自我归因结尾写到这里我想到自己第一次在机械臂抓取实验里看到成功率曲线跳起来的那一刻。那条曲线前面 5 万步平得像死胎然后突然以一个陡峭的斜率爬过 60%。我当时脑子里只有一个词hindsight。原来让一个 agent 变厉害有时不是给它更多奖励而是允许它在事后重新定义目标从失败里偷出信号。后来我慢慢发现我们做人也是一样。现在每逢项目结束我都会先问一句如果当时重新定一次目标这段经历能给我留下什么这句话帮我避开了很多自嗨的复盘也让每一次回想都变得更值钱。如果你也有被事后聪明困扰的时刻试试今天分享的框架。那玩意不只是算法更是一种活着的方式。
返回列表