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

资讯详情

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

HER算法详解:后见之明经验回放如何破解强化学习稀疏奖励难题

HER算法详解:后见之明经验回放如何破解强化学习稀疏奖励难题 提到Hindsight这个英文词普通场景下翻译过来就是“事后诸葛亮”但在强化学习从业者的圈子里它是Hindsight Experience Replay的简称中文一般叫“后见之明经验回放”或“事后经验回放”是一项真真正正能救活稀疏奖励任务的样本复用技术。我第一次认真用上它是在一个想让机械臂抓取小物件的展示项目里模型随机抬起、随机掉落跑了两百万步都拿不到稳定奖励气得我把奖励函数改了四版。后来把经验池改造成HER之后同一套DDPG骨架训练曲线肉眼可见地抬升而且整个算法思路特别朴素——既然这次没够到原目标就别按原来那个够不到的目标去算惩罚干脆把实际到达的位置当成目标把“失败轨迹”重新加工成一段编造出来的“成功轨迹”。这篇文章边写边把踩过、也看别人踩过的坑整理出来既说清楚它为什么有效也给出能直接参考落地的改造步骤和参数方案。适合正在跟稀疏奖励较劲的强化学习新手也适合要在仿真控制、机械臂项目里快速验证算法的工程朋友。1. 为什么要研究Hindsight稀疏奖励让智能体“学不动”的真正原因1.1 稀疏奖励的残酷现实绝大多数回合没有任何有效反馈先回到机械臂项目本身。任务定义很直白给定一个随机位置的目标点智能体控制机械臂末端到达目标附近并保持稳定。奖励函数也简单末端位置与目标位置的距离小于阈值就给1否则给0。看起来毫无难度但每个回合随机初始化目标后机械臂的初始姿态和动作空间稍微分散一点一个回合 300 步走完全程可能一次1都拿不到。强化学习的本质是让策略根据奖励信号调整行为但当一个任务长期处于“奖励恒为0”的状态所有动作的回报期望都趋同梯度信号接近白噪声策略网络根本不知道往哪个方向调。更麻烦的是随机初始化带来的探索动作会在一次次0奖励中强化某些随机偏好表现出来就是智能体原地抖动、疯狂乱动或者干脆陷入一种“什么都不做”的惰性策略。体感上特别像在训练一个没有老师反馈的学生考一次试全是“错”你连他哪部分弱都判断不出来。很多人第一反应是把奖励函数改稠密给距离、给角度、给惩罚项。但这个路子在真实项目里很容易踩坑。我最开始就写了一个“负欧氏距离”的奖励结果智能体学会停在安全位置不动绝不做出大动作因为大动作可能带来更大的距离波动和惩罚。这类被称为“奖励黑客”的现象在连续控制任务里很常见根源是不合理的奖励塑形让智能体钻了空子。跟奖励函数搏斗一段时间后我意识到真正的问题不在奖励函数而在怎么把“失败轨迹”里藏着的有效信息挖出来。有一个特别好的生活类比小孩学投篮一直投不进随机扔了半小时只有一球偶然擦到筐沿进了。如果只看“进没进”这个二元结果学习信号稀疏得可怕但如果有教练让小孩复盘这球的出手位置、力度和角度把它当作“我学会了某种打板入筐方式”来记忆等于把一次偶发行为拆解进了有效经验库。HER的思路和这个复盘动作几乎一模一样——把做砸的事加工成某种意义上的“做成了”。1.2 “事后诸葛亮”为什么能带来真信号HER的核心观察其实一句话在稀疏奖励任务里“没达到指定目标”不等于“这次交互毫无价值”。轨迹中每一个状态都是智能体真实探索过的环境状态背后是环境动态的真实反馈包含了大量可控性信息。HER的做法就是从一条失败轨迹里挑出一个或几个实际到达过的状态把这个状态重新定义成“新目标”然后重新计算这条轨迹在新目标下的奖励。因为智能体确实在那个时刻到达过那里所以“这条轨迹在新目标下是成功的”这件事是成立的奖励从0变成了1。这套逻辑至少带来两个关键收益。第一训练数据里出现了更多“正样本”。原来一万条轨迹可能只有两条成功重标注之后每条轨迹至少可以产出若干条伪成功经验价值函数终于能看到高奖励区域长什么样。第二它天然增加了探索意图的多样性。明明想去A结果到了B如果把B也当成目标让网络学习“如何到达B”策略就能从失败轨迹里学到一串接近目标的可行路径而不是把所有尝试都按“失败”处理掉。样本复用率一上来原本几百万步都没起色的任务往往能在一个数量级内看到质的突破。我给做数据分析的同事打过一个比方稀疏奖励任务就像一份只判“对/错”的考卷HER相当于让学生自己把错题重新编成一套“在别的评分标准下的正确答案”再拿这套答案反复训练。听起来有点自欺欺人但它并不是在伪造环境而是在用“环境动态的一致性”约束学习方向。这件事成立的关键前提是重标注的新目标必须是真实可达的状态。只要满足这个前提价值函数学到的仍是环境规律。2. HER核心机制拆解它到底改了什么2.1 从普通经验回放到HER三处关键改动普通经验回放比如DQN或DDPG每个transition通常长这样(s, a, r, s, done)智能体在状态s执行动作a得到即时奖励r和下一个状态s。这里的s和s是环境状态r完全由环境奖励函数决定。HER在此基础上加了两个东西目标g和目标化的状态观测。transition变成(s, a, r, s, done, g)其中g是这条轨迹正在瞄准的目标。训练时策略网络和值网络都必须支持(s, g)输入策略网络根据“当前状态目标”输出动作Critic根据“当前状态目标动作”估计Q值。第一处关键改动是状态表示必须带目标。智能体的策略不能只知道自己在哪还必须知道要去哪否则网络根本无法分辨不同目标下“好动作”的定义差异。第二处关键改动是采样后重标注。从回放池取出经验时不一定用原始目标g而是按一定概率抽出另一个目标g重新计算奖励和终止标志再放进训练批次。第三处关键改动是目标采样策略。重标注时从当前轨迹的哪个位置取伪目标直接决定学习效果好坏。这一部分我单独拆开讲。2.2 目标重标注怎么做四种采样策略与选择逻辑HER原始论文里给出了四种从轨迹里取伪目标的方式final直接把轨迹最后一个状态作为新目标。episode从轨迹里随机挑一个状态作为新目标。random从整个经验池里随机挑一个非本轨迹的状态作为新目标。future从当前轨迹里当前时刻k之后再随机选一个状态s_tt k作为新目标。实际项目里最常见的是future和final两种尤其future策略基本是首选。为什么future更好因为在一个轨迹内部s_t是在s_k之后真实到达过的后续状态不仅满足“从s_k出发能够到达s_t”这个事实而且以“后继状态”做目标和环境的时序因果完全一致。这比随机选一个无关状态学起来稳得多。final策略更容易实现代码短而且对“目标必须在轨迹末端达成”这类任务有效但在长轨迹任务里它容易让学习过程过度偏向末端区域忽略轨迹中段那些同样有价值的状态信息。具体参数上HER不会把所有采样都替换成伪目标而是保留一部分原始目标经验。常见做法是每次采一个batch的transition其中一部分按原目标训练另一部分按重标注后的新目标训练。重标注倍数N代表每条原始轨迹额外构造多少条重标注轨迹。我在项目里的起点通常是N1~4也就是最多重标注出4个伪目标版本混合打乱后一起进训练批次。重标注倍数越大数据量越多但计算开销也线性增长倍数过小正样本密度提升不明显。这个值跟任务复杂度相关没有绝对最优只能跑几个对比实验。2.3 奖励函数的关键配合稀疏还是二进制HER能正常工作的前提是奖励函数可以直接按目标g重新计算。多数项目采用二进制奖励当|φ(s) - φ(g)| ε时为1否则为0。这里的φ可以看作状态到目标空间的转换函数比如机械臂末端位置就是三维坐标那么φ(s)就是末端在当前时刻的坐标φ(g)就是目标坐标。有一个细节非常关键计算伪目标的新奖励时必须使用同一个φ和同一个ε。不能出现“主目标用距离阈值伪目标又改成另一个阈值”这种不一致否则价值函数学的不是同一个世界的规律训练震荡会非常明显。如果原任务本身是稠密奖励直接用HER也不是不行但有坑。比如机械臂位置控制任务里奖励函数含“-距离项”当你把轨迹中的某个真实状态换成目标时距离项会瞬间变成0甚至变成“完美命中”价值函数会看到大量过于乐观的样本策略可能偏离真实的可控性边界。因此HER最经典的搭配是稀疏奖励加二进制判据先让系统获得稳定的正负信号再考虑连续奖励的平滑性。我在实验里试过“稀疏HER稳定之后再逐步加入惩罚项”的方案效果比一步到位更可控训练过程也更好诊断。3. 实操落地从普通RL算法改造到HER3.1 先判断任务适不适合别盲目套用不是所有任务都适合用HER动手前先用三个条件筛一遍任务是否带可定义的目标goal且目标能否由状态函数映射出来。比如“到达某个坐标”“把物体移到某个目标点”非常适合“保持平衡但无明确目标点”这种任务就不好直接套。奖励是否稀疏或者难以手工塑形。如果当前已经有一套稳定有效的稠密奖励先用稠密奖励别为了上HER强行替换。是否有足够多的“跑偏但仍有用”的失败轨迹可以重标注。HER的价值恰恰来自大量失败轨迹如果环境里每步都能获得有意义的奖励重标注的边际收益自然下降。如果你正在做一个机械臂抓取、机器人导航、四足移动目标跟踪这类项目且当前因为奖励稀疏导致训练长期没进展那先别急着换网络结构或加一堆熵权重花半天把经验回放改成HER往往比换模型更立竿见影。3.2 以DDPG为例的五个改造步骤我用DDPG做示例因为HER在连续控制里最常见的学术基线和工业落地基线就是DDPG或TD3。假设你已经有一个能跑的DDPG改造按以下五步走扩展状态和动作定义把单状态(s)扩展成(s, g)。策略网络输入(s, g)输出动作Critic输入(s, g, a)输出Q值。目标和状态必须映射到同一个特征空间或者经过一个共享编码层否则网络很难学出两者之间的关系。修改经验存储transition里除了(s, a, r, s, done)必须额外存目标g同时还要记录这条transition所属的轨迹ID和时间步索引方便后续按轨迹做future采样。实现重标注入口从回放池采样一个batch后对每个transition按设定概率决定是否重标注。重标注时从该transition所在轨迹的future状态中随机选一个s_t把g设为s_t对应的目标形式再用统一奖励函数计算r。合成训练batch将原目标batch和重标注batch混合输入策略网络和Critic网络正常做梯度更新。周期控制重标注比例不是每一步都重标注而是通过概率p或固定比例控制。常见设置是80%的经验重标注、20%保留原目标如果环境初期失败率特别高可以把这个比例调到90%。伪代码形式大致如下# 每个episode收集完毕后执行 for each episode: trajectory collect_episode(env, policy, initial_goal) store_transitions_with_original_goal(trajectory) # HER重标注 for relabel_index in range(relabel_count): for t, transition in enumerate(trajectory): new_goal extract_goal_from_state( random_future_state(trajectory, t) ) new_reward compute_binary_reward( transition.s_next, new_goal, epsilon ) store_transition_with_goal( transition.s, transition.a, new_reward, transition.s_next, new_goal )需要说明的是这版写法用“每条轨迹重标注N次”代替“逐transition逐概率重标注”一是因为它更容易实现二是因为它更接近常见开源复现代码的实际逻辑。你如果愿意也可以换成按transition概率重标注效果差异不大但代码复杂度会高一些。3.3 关键超参设置与实际建议下面这张表是多个仿真环境里实测过、相对可靠的起点参数。每个环境都要微调但可以从这个起点开始。参数常用起点说明回放池大小10^6~10^7HER需要大量轨迹级经验buffer太小时重标注价值不高轨迹重标注倍数 N1~4典型值4数据量充足时可降至1重标注概率0.880%样本用伪目标20%保留原目标future采样窗口k1到轨迹末尾只从当前时刻之后取状态做目标奖励阈值 ε任务距离精度的5%~10%太严则伪目标也变伪失败轨迹长度50~200HER对短轨迹更友好过长建议分段或改用final目标空间范围限制在真实可达区域别让网络学根本到不了的目标调参时还有一个容易被忽略的维度伪目标生成后的分布。如果原始目标只有几个固定值重标注的多样性就差如果目标空间很大且采样随机价值函数又会分散注意力。更务实的做法是开始时把目标空间限制在真实可到达的区域内。比如机械臂末端能到达的三维空间就只生成这块空间内的伪目标。我在项目里就吃过亏一开始把整个房间空间都设成目标坐标很多伪目标落在墙外模型输出大量怪异动作去够“空气目标”训练效率极低。4. 实战翻车现场与排查笔记4.1 伪目标太随意策略学到“精神分裂”有一次实验我偷懒用random策略做重标注从整个buffer随便挑目标。训练到中期策略一会儿朝A点冲一会儿朝B点冲动作极不稳定Q值曲线上下乱跳。排查后发现random目标往往和当前轨迹没有任何时序关联重标注出来的奖励信号在时间维度上错位价值函数无法把“当前动作”和“奖励来源”对应起来。这个坑让我明白选伪目标不是“越随机越丰富”而是要尊重轨迹内部的因果顺序。future策略之所以稳是因为它保证目标一定是该时刻后续能真实到达的状态时序因果成立。如果你发现策略抖动严重第一件要查的事就是重标注用的是哪种采样策略是否破坏了轨迹时序。把random换成future往往立刻有效。4.2 别把HER强行和PPO等on-policy算法混用很多工程同学习惯用PPO做基线想着直接把HER套进去结果崩得很惨。原因很简单HER的本质依赖经验回放和离线重标注而PPO是同策略算法要求训练样本来自当前策略的交互分布。把旧策略收集的轨迹重标注后直接混入PPO更新等于破坏了“在策略性”策略更新方向被污染失稳几乎是必然的。学术界虽然有一些扩展工作试图把后见之明机制引入同策略算法但它们不是简单加一个relabel操作就能实现而是设计了更复杂的修正项和权重方案。如果你当前主力算法是PPO我的建议是先冷静评估项目是否可以换用DDPG、TD3或SAC这类异策略算法能换就换如果因为业务原因必须保留PPO那HER这条路基本走不通只能考虑其他稀疏奖励方案。4.3 回放池机制与存储爆炸HER需要存储轨迹级信息甚至要按轨迹索引去采样。如果直接沿用普通回放池的实现数据结构会很快膨胀内存也会吃不消尤其是连续控制环境里每个transition还带着目标向量。我的方案是把轨迹分成若干小段每段存独立的目标ID和时间索引重标注时只在一段内选future状态既保证时序关系又避免全轨迹扫描的开销。另外大回放池在高频更新时普通随机采样会丢失“近期高相关经验”的密度。可以考虑按轨迹组织高优先级采样或者按时间倒数加权给新经验更高概率。这种改动在HER里比在普通回放里影响更大因为重标注后的样本相关性更强权重分配稍有不平衡就容易造成分布偏移。4.4 训练很久不见效按顺序排查四件事如果用了HER之后曲线还是平的别急着怀疑算法不行先按顺序排查目标表示和状态是否在同一个特征空间。空间一致性不好再多的伪目标也学不明白。奖励阈值设得合不合理。太严格伪目标也变成伪失败太宽松模型会认为到处都成功。网络容量是否足够。HER提升学习信号密度后Q函数和策略网络需要更大容量去拟合尤其在任务维度较高的时候。我遇到过四层MLP怎么都不收敛、换成两层更大宽度反而收敛的情况。输入数据是否做了归一化。目标坐标和状态量纲差异大又没有归一化训练稳定性会非常差。这一条在机器人学仿真项目里尤其重要我在最近一个项目里把上述四个问题全部踩了一轮做完归一化和空间限制之后训练曲线才开始稳步上升。所以HER本质上不是一个“改个名字就完事”的方案它是一个完整的数据组织和样本复用流程目标表达、目标空间、奖励一致性、算法家族这些环节都需要整体配合。任何一个环节出了问题都可能让重标注变成纯粹的噪声注入。最后说点个人体感。HER最打动我的不是某个数学技巧而是它逼着我去重新思考“学习目标到底是什么”。以前写奖励函数时总想着把一个任务描述成精确的数值公式但真实环境里的成功条件往往模糊且分散。HER让我学会了把目标从“给定值”变成“可替换变量”一旦想通这一点很多稀疏奖励项目都能找到新的突破口。如果你现在正对着一个怎么跑都学不会的任务发呆我建议先别急着加深网络也别着急写更复杂的奖励塑形先花半天把回放池改造成重标注结构跑几十万步和普通回放做一次对比大概率会有完全不同的体感。这个技术后续还可以和课程学习、自动目标生成器结合使用我下一步的实验就是在HER基础上叠加目标难度自动排序等有结论了再写一篇出来分享。
返回列表