拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
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 条重标记样本,也就是 k=4。太少,信息量不够;太多,缓冲区会出现大量同质化样本,训练效率反而下滑。

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)。这里要注意,一个重标记样本是否算“终止”,完全取决于伪目标是否达成。如果达成就 done=1,否则为 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(low=0, high=5, shape=(2,), dtype=np.float32) self.action_space = gym.spaces.Box(low=-0.1, high=0.1, shape=(2,), dtype=np.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, *, seed=None, options=None): 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_k=4): """ 输入:一整条轨迹的转移列表,每条转移为 (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), size=min(future_k, len(future_states)), replace=False) 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 的索引是从 t+1 开始,保证新目标一定在“未来”;用 replace=False 防止同一个未来状态被重复抽中;每条原始转移生成 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_dim=2, goal_dim=2, hidden=128, act_dim=4): 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,目标网络软更新 tau=0.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.1,0.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 场景下我更推荐软更新(每一步做 tau=0.01 的加权平均),可以有效抑制 Q 值震荡。

5.4 从仿真到真机的迁移问题

如果你把 HER 从仿真环境迁到真实机器人,会发现一个头疼的问题:仿真里可以精确知道时间步、状态转移、目标是否达成的判定阈值,但真机上全部有延迟和噪声。动作执行后,真实位置和传感器读到的位置有误差;目标达成判定依赖的“距离小于 0.5”在真机上需要多次测量取均线。

我的建议是,真机上不要把成功判定直接交给环境本身,而是单独训练一个小的“goal classifier”——输入当前观测和目标,给一个成功概率。这个分类器相当于一个可学习的奖励函数,比手动设阈值稳定得多。HER 的重标记流程完全不需要改,只是把 reward 的计算从“手动距离函数”换成“分类器输出”。

还有一个工程化建议:HER 产出的样本在缓冲区里天然带有“目标多样性”,这反而让真机部署时出现一个奇特现象——模型在目标空间泛化好了,但动态特性(比如关节力矩限制、摩擦系数)拟合不好。建议在仿真环境里加入随机物理参数扰动,每轮 episode 的摩擦力、质量在 ±20% 区间随机采样,这样学习到的策略对真机环境更鲁棒。

6. 怎么判断你的任务该不该用 HER

6.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 的任务做得很到位——它已经学会把失败经验高效转化成了策略能力。设这个调试指标,能帮你快速区分“策略真的学好了”和“只是重标记带来了虚假繁荣”。

返回列表