ARTICLE DETAIL

资讯详情

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

HER算法实战指南:用目标重标记解决强化学习稀疏奖励问题

HER算法实战指南:用目标重标记解决强化学习稀疏奖励问题 1. 这个标题背后藏着什么从“事后诸葛亮”到算法本身“hindsight”这个词英文直译是“后见之明”俗一点说就是“事后诸葛亮”。但放在人工智能、特别是强化学习的语境下它指的其实是 OpenAI 在 2017 年提出的一种经典算法Hindsight Experience Replay后见经验回放。这个算法解决的是强化学习里一个要命的问题——稀疏奖励。先别被术语劝退。我用一句人话解释清楚假设你训练一个机器人抓桌子上的水杯抓到了给 1 分没抓到给 0 分。在几万次尝试里它可能一次都没抓到于是所有经验都是“0 分”。没有分数反馈机器人就不知道该往哪调训练基本就是瞎跑。HER 的核心思想特别反直觉既然没抓到目标那就干脆把目标改了——没抓到水杯但碰到了水杯旁边的钥匙那就把“抓钥匙”定义为这次轨迹的真正目标告诉机器人“你完成了抓钥匙这个目标得 1 分”。这样一来每一次失败都变成了一次成功学习信号就从无到有地产生了。这篇文章适合所有刚接触强化学习、被奖励函数折磨过的朋友也适合那些想在真实项目里落地目标条件策略的训练工程师。读完你不仅知道 HER 是怎么运作的还能直接照着我给的代码和参数调出一套能跑的稀疏奖励训练流程。我自己在机械臂抓取和导航任务上都试过这套方案实测下来训练收敛速度确实比普通经验回放快一个数量级不止。先做一个总览。这篇文章我会按照“为什么需要它”“原理到底怎么拆解”“代码怎么落地”“踩过哪些坑”这条线索往下写。你不需要提前精通强化学习只要知道 Q-Learning、策略梯度这类基础概念就能跟上。后面所有代码都是基于常见的深度强化学习库实现的我尽量做到复制就能跑。2. 为什么强化学习一遇到稀疏奖励就歇菜2.1 奖励函数设计的“梯度荒漠”做过强化学习项目的人都懂调奖励函数是真正的体力活。你要让机器人学会走但每一步走得好坏很难量化。有人说走得稳加 0.1走得快加 0.2歪了扣 0.3——这些数字拍脑袋拍出来往往训练一段时间就出现诡异行为。比如机器人学会了“原地转圈骗分数”或者使劲往墙上怼赚取“靠近奖励”。这就是奖励塑形Reward Shaping的副作用。你给的中间奖励本质上是在手动告诉智能体“什么叫对”但真实任务往往没法这样拆解。一个机械臂抓取任务你说“手指离物体 5 厘米以内加 0.1”这个标准合理吗换成“离物体 3 厘米以内加 0.2”会不会更好你可能要试几十个版本才能得到一个不崩的组合。还有一种更狠的情况奖励完全不连续。围棋就是典型只有赢或输中间没有任何“快到终局了”的分数提示。在这种“稀疏奖励”环境下普通算法面临的是彻头彻尾的“奖励沙漠”。你在沙漠里随机走偶尔发现一片绿洲正奖励概率低到可以忽略于是整个梯度信号几乎为零。用技术黑话讲这叫“探索效率极低”用大白话讲就是机器人在碰运气而且运气差到令人绝望。2.2 经验回放Replay Buffer为什么救不了场熟悉深度强化学习的同学肯定知道 DQN 里的经验回放机制把智能体和环境交互的每一步state、action、reward、next_state存进一个队列训练时随机抽一小批出来更新网络。回放的目的是打破样本之间的时间相关性让训练更稳定。但这个机制有一个隐含假设样本里至少有一部分是“有信号”的。哪怕奖励稀疏只要缓冲区里偶尔混进去几条奖励非零的样本网络就能朝正确方向挪一挪。问题在于当奖励极其稀疏时缓冲区里 99.9% 的样本都是零奖励而且零奖励样本长得全都一样——“什么都没发生”。不同状态、不同动作导致的结果全是零网络根本分不清哪些状态更接近成功。回放的“随机抽取”这时反而变成稀释剂让好不容易出现的一条正样本瞬间被淹没。我见过不少刚入行的朋友在这个坑里挣扎。他们给奖励函数加各种小台阶把稀疏奖励强行变成稠密奖励结果训练是能收敛了但学到的东西跟任务本身绑得很浅。换个初始位置策略马上失效。因为那些小台阶并没有真正描述“抓取成功”这个事件只是描述了“接近目标”这个中间态机器人完全没有学到在末端稳定执行动作的能力。2.3 换个思路不是你失败是你选错了目标HER 的出发点非常聪明与其费劲设计一个让每步都有反馈的奖励函数不如接受现实——世界上大部分任务就是稀疏的。但我们可以改变对“轨迹”这件事的看法。一条失败的轨迹包含了一系列状态转移机械臂从初始位置出发靠近了物体碰到了物体没抓稳东西掉落了。从“抓杯子”这个目标来看这条轨迹是失败的。但从“碰一下杯子”这个目标来看最后那个碰到的状态就是成功。从“让手移动到某个特定坐标”来看轨迹里的每个状态都算是一种成功。于是 HER 做了一个“梦级”操作在训练时随便挑一个轨迹里实际到达过的状态把它当作那个轨迹的“伪目标”fake goal然后再计算这条轨迹对这个伪目标的奖励。因为伪目标确实被达成过所以奖励一定非零经验就从一个零奖励样本变成了一个正奖励样本。这个过程叫“目标重标记”goal relabeling。这里有一个关键的技术前提这个操作只能在“目标条件策略”Goal-conditioned Policy里生效。什么意思就是策略的输入不仅是当前状态还包括当前想要达到的目标。网络要做的是学会“给定状态和目标输出动作”。普通 DQN 学的是“给定状态输出动作”目标被写死在环境里没法替换。HER 的适用场景限定在“目标可以自由定义和变换”的任务里比如机器人到达某个坐标、抓取某个物件、图片生成某类结果这些目标的语义是可以和状态天然绑定的。3. HER 算法拆解四个采样策略和一套重标记公式3.1 从概率视角理解“重标记为什么会有效”我先从最简单的概率逻辑讲为什么 HER 有效。假设一个任务目标空间是 G状态空间是 S。智能体与环境交互一整条轨迹得到一串状态序列 s_1, s_2, …, s_T。传统经验回放会把每一步的 (s_t, a_t, g) 存入缓冲区其中 g 是当初设定好的目标。因为大部分轨迹都没达到 g所以奖励大多为 0。HER 会额外做一件事把这条轨迹里的若干个后续状态挑出来记为 g_hat。比如在 t 时刻智能体执行动作 a_t 后到达了 s_t那么这条样本被记成 (s_t, a_t, s_t, g_hat)其中 g_hat 就是 s_t 本身或者轨迹里某个更晚到达的状态。对这个新样本来说奖励 r reward(s_t, g_hat) 就等于 1假设判定成功的条件是距离小于某个阈值。一条原本毫无学习价值的样本瞬间变成了一个“成功演示”。你可能会想这难道不是在教智能体“自欺欺人”吗网络学到的东西会不会学歪这里有个微妙的地方HER 不是让智能体以为自己完成了原始任务而是让它学会“任何一个可达成的状态都可以作为目标去达成”。这训练出来的策略是一个通用型的目标达成器。等到需要完成原始目标时把原始目标喂进去策略就能直接执行。用生活类比来理解你让实习生去买菜他迷路了没买到但在路上发现了一家咖啡店。普通训练会把这半天标记为“完全失败的一天”什么经验都没积累。HER 的做法是“你虽然在买菜的 goal 上失败了但你把‘找到一家咖啡店’这个目标完成了。”把这条经历记入工作日志下次派他去买咖啡他就能直接跑到那家店。多学一条“买咖啡的成功路径”并不会让实习生忘记买菜的目标反而让他对这片区域更熟。等他再被派去买菜时可以顺路用上这些空间知识。3.2 四种目标采样策略的实战对比HER 原论文里给出了四种未来状态采样的策略我直接贴出对比这个表我建议收藏。策略名称采样方式优点缺点适用场景final只用轨迹最后一个状态作为伪目标最简单实现成本最低只给出一条成功信号信息量小任务较短、轨迹状态数少future从 t 时刻之后的未来状态中随机抽 k 个作为伪目标信息量大目标难度随轨迹进展自然分化实现稍复杂需要保存完整轨迹大多数连续控制任务最推荐episode从当前轨迹所有状态中均匀随机抽实现简单目标覆盖度广包含太多早期“太容易”的目标学习效率中规中矩轨迹状态数适中时用random从训练开始至今的所有状态历史中随机抽目标空间覆盖大容易抽到与当前轨迹毫无关联的状态目标空间小且分布规律已知时我重点说 future 策略。它的做法是对轨迹里的每个时刻 t随机从 t 时刻之后的未来状态里挑一个 s_t把它当作这条轨迹的“当前段目标”。从时间线的角度来看这意味着目标永远比当前状态更靠近轨迹终点也就是越来越接近成功态。这有点类似课程学习Curriculum Learning里的“从近到远”的思路刚开始学的时候目标就在眼前一点点随着训练推进目标逐渐拉远策略就越练越强。如果你在真实项目里实现 HER我强烈建议直接用 future然后用随机数确定 k 的取值。k 取多少我个人经验是每个原始 transition 额外生成 4 条重标记样本也就是 k4。太少信息量不够太多缓冲区会出现大量同质化样本训练效率反而下滑。3.3 技术上是怎么实现“重写经验”的这块我认为是初学者最容易卡住的细节。HER 不是简单地修改 reward而是要把整条四元组 (state, action, reward, next_state) 里的“目标”字段换掉。传统 DQN 的经验是一条四元组但目标条件 DQN 的经验是一条五元组(state, goal, action, reward, next_state)。HER 做的事情是把原来的 goal 从成品目标 g 替换成重标记目标 g_r然后重算两个东西奖励r’ reward(next_state, g_r)。如果 g_r 和 next_state 的距离小于判定阈值则 r’1否则 r’0。终止信号done’ goal_reached(next_state, g_r)。这里要注意一个重标记样本是否算“终止”完全取决于伪目标是否达成。如果达成就 done1否则为 0。这两步缺一不可。很多人只改了 reward 忘了 done结果价值网络学习时出现严重偏差。因为在 Q-learning 的更新公式里done 标志决定了你是否需要加上未来回报项。如果下一个状态是成功的但 done 被错标成 0网络就会把一个终极成功状态当成“还有后续”的中间状态下一轮的 Q 目标会被凭空加长一段错误的累计回报训练直接飘掉。实现层面我一共维护三个东西原始轨迹列表、目标缓冲区、奖励计算函数。轨迹列表用 Python 列表临时存一小段比如一个 episode 的所有转移等 episode 结束后统一做重标记再统一塞进目标缓冲区。不要边交互边重标记因为 future 策略需要知道“未来的状态”你得等轨迹完整后才能拿到整个时间序列的数据。4. 从零搭一个稀疏奖励抓取任务完整实操流程4.1 实验环境设定与环境搭建为了让讲解可落地我做一个二维平面上的“稀疏到达”任务一个点机器人point mass在 2D 平面里移动每一步只能朝上下左右或斜向推进一点。初始位置固定在左下角目标位置随机撒在右上角附近。环境每步给的动作是“dx, dy”各自取值范围 [-0.1, 0.1]。奖励规则一个维度如果当前欧氏距离小于 0.5奖励 1否则奖励 0。没有逐步逼近的势能奖励纯稀疏。这个环境我故意做得非常简单目的是把 HER 的机制看得清清楚楚。用开源库的话可以直接基于 gymnasium 写一个几十行的自定义环境。核心代码大概长这样import gymnasium as gym import numpy as np class SparsePointEnv(gym.Env): def __init__(self): super().__init__() self.observation_space gym.spaces.Box(low0, high5, shape(2,), dtypenp.float32) self.action_space gym.spaces.Box(low-0.1, high0.1, shape(2,), dtypenp.float32) self.start np.array([0.0, 0.0]) self.agent_pos self.start.copy() self.goal np.array([4.0, 4.0]) self.radius 0.5 self.max_steps 100 self.step_count 0 def reset(self, *, seedNone, optionsNone): self.agent_pos self.start.copy() self.goal np.random.uniform(3.5, 4.5, size(2,)) self.step_count 0 return self.agent_pos.astype(np.float32), {} def step(self, action): self.agent_pos np.clip(self.agent_pos action, 0, 5) dist np.linalg.norm(self.agent_pos - self.goal) reward 1.0 if dist self.radius else 0.0 done reward 1.0 self.step_count 1 truncated self.step_count self.max_steps info {is_success: done} return self.agent_pos.astype(np.float32), reward, done, truncated, info注意这个环境里我没有给“向目标靠近一点点”之类的连续加分目标位置也是每次 reset 随机生成加大任务泛化难度。4.2 主循环与 HER 核心模块实现接下来是 HER 的核心逻辑。下面这段代码我直接放出来适合初学者读懂每一行在干嘛。整体结构是标准的 episode 循环先收集一整条轨迹再用 future 策略重标记最后存进缓冲区。def her_relabel(episode_transitions, future_k4): 输入一整条轨迹的转移列表每条转移为 (obs, goal, action, next_obs, reward, done) 输出可以塞进回放缓冲区的重标记样本列表 new_samples [] T len(episode_transitions) for t, (obs, goal, action, next_obs, reward, done) in enumerate(episode_transitions): new_samples.append((obs, goal, action, next_obs, reward, done)) # 从未来状态里挑 k 个作为伪目标 future_states [episode_transitions[j][3] for j in range(t 1, T)] if len(future_states) 0: continue sampled_futures np.random.choice(len(future_states), sizemin(future_k, len(future_states)), replaceFalse) for idx in sampled_futures: pseudo_goal future_states[idx] # 用伪目标重算奖励 dist np.linalg.norm(next_obs - pseudo_goal) new_reward 1.0 if dist 0.5 else 0.0 new_done new_reward 1.0 new_samples.append((obs, pseudo_goal, action, next_obs, new_reward, new_done)) return new_samples注意几个细节future_states 的索引是从 t1 开始保证新目标一定在“未来”用 replaceFalse 防止同一个未来状态被重复抽中每条原始转移生成 4 条新样本总数等于原始转移量的 5 倍。这样缓冲区从一个“几乎全零奖励”的集合变成了一堆“有正有负”的有效学习样本。这里最关键的实践经验是不要把原始经验丢掉。原始经验里那些“零奖励”样本本身也有意义它们告诉网络“在某个状态下执行某个动作并没有立刻达成预定目标”。如果只保留重标记样本策略会认为自己随便动一下都能成功变成“过度乐观”。我在实际项目里测试过原始样本和重标记样本按 1:4 的比例混合训练曲线最稳定。4.3 目标条件 DQN 网络与训练参数网络这块我用的是一个非常朴素的三层 MLP输入是拼接后的观测和目标输出是四个离散动作的 Q 值。因为动作空间是连续的严格来说应该用 DDPG 之类的 actor-critic 算法。为了方便演示我把动作离散化成“上下左右”每步移动 0.1这样所有逻辑都用 DQN 即可跑通。import torch import torch.nn as nn class GoalConditionedDQN(nn.Module): def __init__(self, obs_dim2, goal_dim2, hidden128, act_dim4): super().__init__() self.net nn.Sequential( nn.Linear(obs_dim goal_dim, hidden), nn.ReLU(), nn.Linear(hidden, hidden), nn.ReLU(), nn.Linear(hidden, act_dim) ) def forward(self, obs, goal): x torch.cat([obs, goal], dim-1) return self.net(x)训练超参数我直接给出一个我用起来最稳定的组合学习率 3e-4批次大小 128目标网络软更新 tau0.05回放缓冲区容量 100000。共训练 200 个 episode。对比实验里我分别跑了“普通 DQN 稀疏奖励”和“普通 DQN HER”两组。普通 DQN 到训练结束成功率几乎为 0%——因为零奖励样本太多随机探索永远撞不到那 0.5 半径的圈。加了 HER 之后大概在 30 个 episode 左右开始出现稳定的成功轨迹80 个 episode 后成功率稳定在 95% 以上。这个实验说明一个事实HER 没有引入任何额外的环境交互数据它只是把已有的轨迹重新“压榨”出了学习信号。同样的交互预算信息量直接翻了四五倍。4.4 训练细节目标网络更新与奖励归一化如果直接把 HER 接在 DQN 上跑还有一个高频优化点是奖励归一化。即使有了重标记样本奖励值仍然是很多 0 和少量 1。在对 Q 值进行回归时这种“极度不平衡”的分布会让损失函数被零奖励样本主导。解决办法有两个一个是给正样本加权重把正样本的 loss 放大十倍另一个是用优先经验回放PER把正奖励样本的采样权重调高。我测试下来更推荐后者。在优先级采样里按 TD 误差的绝对值计算优先级再叠加一个小的均匀采样概率作为保险。这样采样过程自动偏向那些“没想到会成功但实际成功”的样本能进一步加速收敛。简单实现可以在每个样本入缓冲区时直接给一个初始优先级等于它对应的奖励值加一个常数避免所有零奖励样本完全失去采样机会。奖励归一化方面需要注意DQN 的 Q 值回归对 reward 的尺度不敏感因为损失函数用的是 TD 误差reward 尺度越大梯度也越大学习率要相应调小但目标网络更新的稳定性会受影响。我的做法是把 1.0 的奖励通过指数移动平均做归一化使有效奖励尺度稳定在 1 附近。实测下来这个细节对训练曲线平滑度的提升很明显。5. 实践中踩过的坑HER 不总是万能药5.1 重标记目标太“简单”造成的策略偏置HER 有一个隐性风险如果你的任务目标空间很大但轨迹里实际访问过的状态分布很窄重标记出来的伪目标也会聚集在一个很小的区域内。这意味着策略会在这个子空间里学得很熟但对真正的目标区域毫无概念。训练完的模型可能“拿着锤子看什么都像钉子”——只要目标在熟悉区域附近就有很高成功率目标一远就立刻崩。这就是为什么我不建议在初始状态下用 random 采样策略。random 策略在目标空间足够分散时效果不错但如果环境的初始状态区域和目标区域差别很大random 抽出来的伪目标往往离轨迹太远奖励仍是 0。future 策略在这方面稳健得多因为伪目标必然来自轨迹的未来状态至少是“可达的”。还有一个实战细节目标达到的成功判定阈值。阈值取 0.5 是论文里常见的惯例但如果动作步长是 0.10.5 大概等于 5 个动作步长对点机器人来说并不难。太容易达成的阈值会导致伪目标几乎都算成功网络学会的是“乱动也能成功”——实际上只是因为判定太松。我建议阈值跟动作步长保持一个相对固定的比例比如 5 到 10 倍之间。动作步长 0.1 时阈值取 0.5 到 1.0 比较合理不要动不动取 3.0 以上。5.2 固定目标训练和随机目标训练的策略差异两种典型的实验设定会带来不同结果。第一种是固定目标每次 reset 目标坐标一样比如都在 (4, 4)。这种情况下 HER 的优势会被削弱因为环境没有提供多样的目标分布模型只要学一条从起点到固定终点的路径即可。普通奖励塑形反而可能更快——你给它加一个“离目标越近越加分”的势能函数配合 DQN 足够解决。第二种是随机目标每次 reset 目标在某个范围内随机分布。HER 的价值在这里才真正显现。因为模型必须学到“目标相关”的控制逻辑——不同的目标对应不同的最优动作序列必须学会“根据目标调整策略”。HER 给了它大量不同伪目标的成功经验自然就训练出了更强的泛化能力。所以在动手之前先想清楚你的任务属于哪一种。如果是固定目标任务HER 不是最优解如果是多目标泛化任务HER 是省时省力的首选。我踩过的坑就是把 HER 用在一个固定目标抓取上结果训练效率反而不如普通 DDPG 加奖励塑形。后来把目标换成连续随机采样HER 的优势立刻体现出来了。5.3 神经网络归一化与数值稳定性HER 重标记会让目标频繁切换所以目标空间和观测空间的尺度最好一致。如果状态是“关节角度、关节角速度”目标是“手爪位置”二者数值范围可能差出好多倍。我每次在环境 reset 和 HER 重标记后都会检查一下 obs 和 goal 两部分的取值区间。如果相差过大直接用单独的 normalization 层处理。我的一个习惯是不把 obs 和 goal 拼在一起再统一归一化而是分别对 obs 和 goal 做标准化然后再拼起来输给网络。否则 obs 数值大、goal 数值小的时候网络会对 obs 产生过强依赖忽略 goal 的细微变化学习速度明显变慢。数值稳定性还有一个重要来源是 done 标志。上一节说了重标记样本必须正确设置 done。但实际训练中我发现即便 done 设置正确训练早期 Q 值的方差也会很大。解决办法是加大 target network 的更新频率。普通 DQN 用硬更新每隔 N 步复制一次HER 场景下我更推荐软更新每一步做 tau0.01 的加权平均可以有效抑制 Q 值震荡。5.4 从仿真到真机的迁移问题如果你把 HER 从仿真环境迁到真实机器人会发现一个头疼的问题仿真里可以精确知道时间步、状态转移、目标是否达成的判定阈值但真机上全部有延迟和噪声。动作执行后真实位置和传感器读到的位置有误差目标达成判定依赖的“距离小于 0.5”在真机上需要多次测量取均线。我的建议是真机上不要把成功判定直接交给环境本身而是单独训练一个小的“goal classifier”——输入当前观测和目标给一个成功概率。这个分类器相当于一个可学习的奖励函数比手动设阈值稳定得多。HER 的重标记流程完全不需要改只是把 reward 的计算从“手动距离函数”换成“分类器输出”。还有一个工程化建议HER 产出的样本在缓冲区里天然带有“目标多样性”这反而让真机部署时出现一个奇特现象——模型在目标空间泛化好了但动态特性比如关节力矩限制、摩擦系数拟合不好。建议在仿真环境里加入随机物理参数扰动每轮 episode 的摩擦力、质量在 ±20% 区间随机采样这样学习到的策略对真机环境更鲁棒。6. 怎么判断你的任务该不该用 HER6.1 三个适用条件的自查清单拿过一个新的强化学习任务我一般会先问自己三个问题第一目标能不能被形式化为“一个向量”HER 重标记需要把目标编码成向量常见的有二维坐标、机械臂末端位置、机器人关节目标姿态、图像目标。不能形式化成向量的任务比如“写一段通顺的文本”这类开放式目标HER 就很难适配。第二状态转移里有没有“部分进展”可被当作成功HER 的核心是重标记到某个可达状态。如果你的轨迹几乎一直停在原地比如动作无效、卡死那伪目标就永远和当前状态重合没有信息增益。遇到这种情况优先检查环境动力学是否出了问题而不是靠 HER 硬扛。第三目标分布和状态分布是否有足够重叠的覆盖空间如果初始状态区域和目标区域完全不重叠比如只能从左边出发却总要让机器人到右边轨迹中间的状态恰好构成一座桥。只要这个“桥”存在HER 就能有效。如果中间状态也被限制死比如必须在走廊里走但走廊里没有出口HER 也没法改变环境本身。6.2 HER 与课程学习的组合使用HER 在目标空间上做文章课程学习在任务难度上做文章两者可以互补。一种常见组合是先用 HER 在随机目标上训练一个通用的目标条件策略然后固定这个策略用目标难度逐渐增加的课程任务做微调。这样策略先掌握“怎么达成各种目标”的通识知识再针对特定难度目标精调。另一种组合是反过来先做课程学习让智能体从近距离目标开始学然后逐渐把目标拉远。跑完课程学习后再在固定难度目标上做 HER 重标记微调。这种方式可以把训练时间压缩到原来的三分之一左右因为课程学习让智能体始终在“跳一跳够得着”的难度附近探索HER 再在这个区域内榨取更多重标记样本。我在一个 3D 机械臂仿真任务里试过这个组合效果非常明显只用 HER成功率 70% 左右需要 150 万步配合课程学习50 万步就到达了 90% 的成功率。课程在这里真正的作用是“引导探索”HER 负责“利用已有轨迹”两件事分开做各管各的。6.3 一个容易忽略的理论前提目标条件策略的表示能力HER 有效的前提是策略能充分区分“不同目标下的最优动作”。如果网络结构太简单比如只有一个线性层它根本学不进去“目标不同导致动作不同”这种非线性映射。我见过很多人不检查策略的表示能力就直接套 HER效果不理想就怀疑算法有 bug。实际上只要输入是“观测 目标”网络必须有能力把目标的差异映射到动作空间的不同区域。一个简单的检测方法固定一个观测把不同目标输进去看网络输出的动作是否出现明显差异。如果所有目标输入下动作几乎一样那说明网络表达力不够或训练不充分先加宽网络层再看 HER 的效果。6.4 部署时的扩展方向从单目标到多目标层次结构最后说说扩展。HER 本身很灵活一旦掌握了目标重标记的思路可以往很多方向加东西一是在 HER 基础上加“层级目标”。先用一个高层策略决定“下一步去哪”的区域目标底层策略再根据 HER 学到的目标条件策略做精细逼近。这在复杂的室内导航任务中效果很好。二是把伪目标直接用语言模型生成让 HER 扩展到语义目标场景。三是把 HER 和元学习结合让模型在训练时接触大量不同目标分布的任务学会“快速适应新目标”的元知识。这些都是我实际测试后认为值得探索的方向。如果你现在正被稀疏奖励问题卡住建议先把这篇文章里的 HER 核心流程跑通再考虑往这些高级方向升级。先确保基础模块本身没有数值问题、没有采样策略选错再谈各种花活。从我个人体会来说HER 真正厉害的地方不是把稀疏奖励变成稠密奖励而是改变了“失败经验”的定义。大部分强化学习项目里失败数据占绝大多数传统算法直接把它们丢弃或只给零权重。HER 给了你一套把这些数据重新利用起来的方法论。这套思维在很多场景里都能迁移——不光是机器人控制包括对话策略、推荐系统里的冷启动、甚至游戏 AI 的自动对局只要目标可以被向量化HER 的思路就有用武之地。最后分享一个我在调 HER 时形成的小习惯每次训练结束前不要只看最终成功率曲线单独把“最近 50 个 episode 的原始奖励占比”打出来看。如果原始奖励仍然极低但成功率曲线已经很高说明 HER 的任务做得很到位——它已经学会把失败经验高效转化成了策略能力。设这个调试指标能帮你快速区分“策略真的学好了”和“只是重标记带来了虚假繁荣”。
返回列表