稀疏奖励的破局者:HER Replay Buffer 深度解析与实验对比

当奖励信号如沙漠中的雨滴般稀少时,强化学习智能体如何在茫茫状态空间中学会导航?本文通过一个自建的 2D 点导航环境,从代码到实验,逐层剖析 Hindsight Experience Replay (HER) 如何让 TD3 在稀疏奖励下从"原地踏步"跃升为"精准导航"。
目录
1. 背景:稀疏奖励的困境
强化学习(Reinforcement Learning, RL)的核心机制是通过奖励信号引导智能体学习最优策略。然而在真实世界的许多任务中——机器人抓取、多步推理、迷宫导航——奖励仅在任务完成时才发放。这就是所谓的稀疏奖励问题。
在稀疏奖励场景下,一个典型的回合可能是:
Step 1: action → reward = -1(没到目标)
Step 2: action → reward = -1(没到目标)
...
Step 99: action → reward = -1(没到目标)
Step 100: action → reward = -1(没到目标,超时截断)
智能体收到的是 100 个完全相同的 -1。它无法区分"第 1 步的动作"和"第 99 步的动作"——因为它们的即时反馈一模一样。这种情况下,价值函数无法有效传播梯度,Critic 网络几乎没有可学习的信号,Actor 自然也找不到优化方向。
解决稀疏奖励的常见手段包括:
| 方法 | 思路 | 局限 |
|---|---|---|
| 奖励塑形(Reward Shaping) | 人为设计稠密的中间奖励 | 需要领域知识,容易引入偏差 |
| 好奇心驱动(Curiosity) | 用新颖性作为内在奖励 | 计算开销大,噪声奖励问题 |
| 演示学习(Imitation) | 提供专家轨迹 | 依赖高质量示范数据 |
| HER | 重标记失败样本为成功样本 | 需要目标条件化环境 |
本文将聚焦最后一种方法——Hindsight Experience Replay(HER),通过一个完整的代码实验来展示它的威力。
2. 实验环境:PointNavHer
我们设计了一个 2D 连续控制导航环境:PointNavHer。智能体是一个半径为 30 像素的圆,在一个 400×400 的窗口中移动,目标是到达一个随机生成的"期望目标"(desired goal,蓝色大圆)。
环境示意图:绿色圆 = 智能体当前位置(achieved goal),蓝色圆 = 目标位置(desired goal),红色圆 = 障碍物(cliff)
2.1 环境关键参数
| 参数 | 值 | 含义 |
|---|---|---|
win_x, win_y | 400×400 | 窗口大小(像素) |
achieved_r | 30 | 智能体半径 |
desired_r | 40 | 目标区域半径 |
agent_speed | 8 | 每步最大移动距离 |
MAX_STEP | 100 | 最大步数 |
success_threshold | 0.05 | 成功判定阈值(归一化距离) |
cliff_r | 40 | 障碍物半径 |
cliff_n | 1 | 障碍物数量 |
is_cliff_random | True | 每回合随机重置障碍物位置 |
与之前版本相比,当前环境引入了 1 个随机障碍物——这显著增加了导航难度。智能体不能简单地朝目标走直线,而需要学习绕开障碍物。is_cliff_random = True 确保每个回合障碍物位置都会变化,防止智能体死记硬背固定路线。
2.2 动作空间与观测空间
- 动作空间:连续二维向量
(dx, dy),每个分量 ∈[-1, 1],按agent_speed=8缩放 - 观测空间:
Dict类型,包含三个关键字段:observation:障碍物特征(3维/cliff) + 边界距离(4维) = 共 7 维,归一化到 [-1,1] 或 [0,1]achieved_goal:当前智能体位置(2维,归一化到 [0,1])desired_goal:目标位置(2维,归一化到 [0,1])
其中 observation 的 shape 为 (3 * cliff_n + 4,) = (7,)。当 cliff_n = 1 时,前 3 维是障碍物特征(相对 x、相对 y、归一化距离),后 4 维代表智能体到四条边界的距离。障碍物特征按距离排序后展平,确保观测具有排列不变性。
这个 Dict 观测空间是使用 HER 的必要条件——HER 需要通过 achieved_goal 和 desired_goal 来重标记经验。
3. HER 原理:事后聪明的智慧
3.1 核心思想
HER 由 OpenAI 在 2017 年提出(论文:Hindsight Experience Replay),其核心思想可以用一句话概括:
失败了没关系,假装你本来就想走到当前的位置。
假设一个回合的轨迹是这样的:
Step 1: 智能体在 A → 动作 → 到达 B (目标在 G,但没到达)
Step 2: 智能体在 B → 动作 → 到达 C (目标在 G,但没到达)
Step 3: 智能体在 C → 动作 → 到达 G (到达目标!)
在没有 HER 的情况下,经验回放缓冲器中存储的是:
| 状态 | 动作 | 奖励 | 下一状态 | 目标 |
|---|---|---|---|---|
| A | a₁ | -1 | B | G |
| B | a₂ | -1 | C | G |
| C | a₃ | 0 | G | G |
只有最后一条经验是"成功"的,前两条都是"失败"的——尽管智能体确实从 A 移动到了 B,从 B 移动到了 C,这些都是有意义的位移。
HER 的做法:对每条经验,用"已经到达的位置"来替代 desired_goal,重新计算奖励。
| 原始状态 | 动作 | 原始目标 | HER 替换目标 | HER 奖励 |
|---|---|---|---|---|
| A | a₁ | G | B(最终到达 B) | 0(成功!) |
| B | a₂ | G | C(最终到达 C) | 0(成功!) |
| C | a₃ | G | G(原始) | 0(成功!) |
这样一来,原本 3 条经验中只有 1 条是正样本,经过 HER 重标记后,全部变成了正样本。智能体学会了"无论目标在哪里,我的动作都有意义"——任何一个已经达到的状态都可以是一个有效的目标。
3.2 关键参数
在 Stable-Baselines3 中,HerReplayBuffer 有两个关键参数:
n_sampled_goal:每条原始经验额外生成多少条 HER 经验。设为 4 意味着原始经验的批量大小扩大 5 倍(1 原始 + 4 HER)。goal_selection_strategy:如何选择重标记的 goal,通常使用"future"——从该时刻之后的状态中随机选择 achieved_goal 作为新 desired_goal。这种策略天然保证了"在未来的某个时刻,智能体确实到达了新目标",确保了重标记后奖励为成功。
4. 环境代码逐段解读
4.1 类定义与初始化
class PointNavHer(gym.Env):
def __init__(self, render_mode=None, MAX_STEP=100) -> None:
self.win_x, self.win_y = 400, 400 # 窗口尺寸
self.achieved_r = 30 # 智能体半径
self.desired_r = 40 # 目标半径
self.agent_speed = 8 # 每步速度
self.cliff_r = 40 # 障碍物半径
self.cliff_n = 1 # 障碍物数量(1个)
self.is_cliff_random = True # 每回合随机重置障碍物
self.success_threshold = 0.05 # 成功阈值
# 初始化随机障碍物位置
self.cliff = self.np_random.uniform(
low=[self.cliff_r, self.cliff_r],
high=[self.win_x - self.cliff_r, self.win_y - self.cliff_r],
size=(self.cliff_n, 2)).astype(np.float32)
success_threshold = 0.05 是关键参数:当 achieved_goal 与 desired_goal 的欧氏距离(归一化后)小于 0.05 时,判定为成功。在 400×400 的窗口中,这相当于实际距离约 28 像素——略小于智能体半径 30 像素,意味着两个圆需要几乎重叠才算成功。
与旧版环境(cliff_n=0)相比,当前版本引入了障碍物,这使得 HER 的价值更加凸显——智能体不仅需要学习"如何到达目标",还要学习"如何绕开障碍物"。这是单纯的距离奖励塑形难以处理的场景。
4.2 观测空间设计
self.observation_space = spaces.Dict({
"observation": spaces.Box(-1.0, 1, shape=(3*self.cliff_n + 4,), dtype=np.float32),
"achieved_goal": spaces.Box(0, 1, shape=(2,), dtype=np.float32),
"desired_goal": spaces.Box(0, 1, shape=(2,), dtype=np.float32),
})
Dict 观测空间是 HER 能够工作的结构前提。SB3 的 HerReplayBuffer 通过字段名 achieved_goal 和 desired_goal 来识别哪些是要重标记的目标,哪些是环境本身的观测。
observation 的 shape 为 (3 * cliff_n + 4,)——当 cliff_n = 1 时为 (7,)。这 7 维的含义是:
| 维度索引 | 内容 | 范围 |
|---|---|---|
| 0 | 障碍物相对 x(归一化) | [-1, 1] |
| 1 | 障碍物相对 y(归一化) | [-1, 1] |
| 2 | 到障碍物的归一化距离 | [0, 1] |
| 3 | 到左边界的距离 | [0, 1] |
| 4 | 到右边界的距离 | [0, 1] |
| 5 | 到下边界的距离 | [0, 1] |
| 6 | 到上边界的距离 | [0, 1] |
如果 cliff_n = 2,则前 6 维是两个障碍物的特征(各 3 维),后 4 维仍是边界距离。这种动态 shape 设计使得环境可以灵活扩展障碍物数量而无需改动网络结构。
4.3 reset 方法
def reset(self, *, seed=None, options=None):
super().reset(seed=seed, options=options)
self.n_step = 0
# 每回合随机重置障碍物位置
if self.is_cliff_random:
self.cliff = self.np_random.uniform(
low=[self.cliff_r, self.cliff_r],
high=[self.win_x - self.cliff_r, self.win_y - self.cliff_r],
size=(self.cliff_n, 2)).astype(np.float32)
# 随机生成目标位置(避开边界 + 障碍物)
self.desired_goal = self.np_random.uniform(
low=[self.desired_r, self.desired_r],
high=[self.win_x - self.desired_r, self.win_y - self.desired_r],
size=(2,)).astype(np.float32)
while self.is_contact_cliff(self.desired_goal, self.desired_r):
self.desired_goal = self.np_random.uniform(...)
# 随机生成智能体初始位置(避开目标、障碍物、边界)
self.achieved_goal = self.np_random.uniform(
low=[self.achieved_r, self.achieved_r],
high=[self.win_x - self.achieved_r, self.win_y - self.achieved_r],
size=(2,)).astype(np.float32)
while self.is_contact_cliff(self.achieved_goal, self.achieved_r) or
self.is_achieve_contact_desired():
self.achieved_goal = self.np_random.uniform(...)
return self._obs(), {}
每次 reset 时:
- 障碍物随机化(
is_cliff_random=True):障碍物位置重新随机生成,确保智能体不会过拟合到固定障碍物布局 - 目标随机化:在窗口内随机采样,并通过
while循环 retry 确保目标不与障碍物重叠 - 智能体初始位置随机化:同时避开障碍物和目标区域,保证每个回合都从不同起点出发
三重随机化使得每个回合都是全新的导航任务,这对泛化能力提出了极高要求——智能体必须学会"通用的绕障碍导航策略",而非"从固定起点到固定终点的路线记忆"。
4.4 step 方法
def step(self, action):
self.n_step += 1
# 动作缩放:[-1,1] × agent_speed
action = np.clip(action, -1.0, 1.0).reshape(2)
candidate = (self.achieved_goal + action * self.agent_speed).astype(np.float32)
# 碰撞检测:边界 + 障碍物
collision_border = self.is_contact_border(candidate, self.achieved_r)
collision_cliff = self.is_contact_cliff(candidate, self.achieved_r)
collision = bool(collision_border or collision_cliff)
if not collision:
self.achieved_goal = candidate # 无碰撞则移动
# 计算奖励与终止条件
dist = np.linalg.norm(obs["achieved_goal"] - obs["desired_goal"])
success = bool(dist < self.success_threshold)
terminated = success
truncated = bool(self.n_step >= self.MAX_STEP and not terminated)
return obs, reward, terminated, truncated, info
核心逻辑:
- 动作缩放后计算候选新位置
- 碰撞检测(边界 + 障碍物),有碰撞则原地不动
- 判断是否成功到达目标,成功则
terminated=True - 步数超限则
truncated=True
4.5 _obs 方法:障碍物特征提取
这是新版本环境的核心升级。_obs 方法不仅输出智能体位置和目标位置,还构造了精细的障碍物感知特征:
def _obs(self):
win_size = np.array([self.win_x, self.win_y], dtype=np.float32)
pos = (self.achieved_goal / win_size).astype(np.float32)
goal = (self.desired_goal / win_size).astype(np.float32)
# 障碍物特征:相对位置 + 距离
diff_c = self.cliff / win_size - pos[None, :] # (cliff_n, 2)
dist_c = (np.linalg.norm(diff_c, axis=1, keepdims=True) /
np.sqrt(2.0)).astype(np.float32) # (cliff_n, 1)
# 按距离排序 → 排列不变性
order = np.argsort(dist_c[:, 0])
diff_c = diff_c[order]
dist_c = dist_c[order]
cliff_features = np.concatenate([diff_c, dist_c], axis=1).flatten() # 3*cliff_n 维
# 边界距离(到四条边界的归一化距离)
border = np.array(
[pos[0], 1 - pos[0], pos[1], 1 - pos[1]], dtype=np.float32) # 4 维
state = np.concatenate([cliff_features, border]).astype(np.float32)
return {
"observation": state, # 3*cliff_n + 4 维
"achieved_goal": pos, # 2 维
"desired_goal": goal # 2 维
}
关键设计点:
-
距离归一化:
dist_c除以sqrt(2)(归一化坐标下对角线的最大距离),确保距离值落在 [0, 1] 区间,与边界距离的量纲一致。 -
按距离排序:
np.argsort(dist_c)按最近障碍物优先排列。这保证了排列不变性——无论self.cliff数组中障碍物的存储顺序如何,_obs输出始终按距离排列,消除了顺序对策略学习的干扰。 -
拼接结构:
cliff_features(障碍物感知)+border(边界感知)→ 完整的环境感知向量。这种显式的特征工程让策略网络无需从原始像素中"自己发现"障碍物和边界——这在使用 MLP 策略时尤其重要。
5. 关键环节:奖励函数的设计
def compute_reward(self, achieved_goal, desired_goal, info):
dist = np.linalg.norm(desired_goal - achieved_goal, axis=-1)
reward = np.where(dist < self.success_threshold, 0.0, -1.0)
return np.asarray(reward, dtype=np.float32)
这是典型的稀疏奖励设计:
- 成功:距离 < 0.05 → 奖励 = 0
- 失败:距离 ≥ 0.05 → 奖励 = -1
注意:在 HER 的语境下,成功奖励设为 0(而非 +1)是一个合理选择。因为:
- HER 重标记会产生大量"伪成功"样本(奖励 = 0),如果成功奖励为正,这些样本会过度强化某些动作
- 失败奖励为 -1,意味着智能体被"惩罚"在未完成目标时继续探索——每一秒都在付出代价
- 这种 “0/-1” 二元奖励让价值函数的学习目标非常明确:
V*(s) = -(到达目标的最小步数)
为什么不用距离作为奖励?
一个常见的替代方案是:
reward = -dist # 距离越近奖励越高
这种稠密奖励可以帮助学习,但有明显问题:
- 在无障碍环境中,它本质上引导智能体"走直线",这可能是最优的
- 在有障碍物的环境中,最短距离路径可能被障碍物阻挡,稠密奖励会误导智能体走向局部最优
- 它要求对任务有先验知识——不是所有任务都能定义"距离"
稀疏奖励 + HER 的组合让智能体在无需人工设计中间奖励的情况下学会导航,这是 HER 最大的价值。
6. 训练脚本与 HER 集成
6.1 完整训练配置(启用 HER)
model = sb3.TD3(
policy="MultiInputPolicy",
env=env,
learning_starts=5000,
buffer_size=300_000,
batch_size=256,
action_noise=action_noise,
replay_buffer_class=sb3.HerReplayBuffer, # 启用 HER
replay_buffer_kwargs={
"n_sampled_goal": 4, # 每条经验额外生成 4 条 HER 经验
"goal_selection_strategy": "future", # 从未来状态中选择目标
},
tensorboard_log="./tb/her"
)
model.learn(total_timesteps=30_000)
model.save("./model/env_point_her")
这是实验中的 her\TD3_22 配置——TD3 + HER。总训练步数从旧版的 170k 缩减到 30k,因为加入障碍物后 HER 仍能在较短时间内学到有效策略。
6.2 无 HER 的基线配置(对比用)
实验中作为对比的 her\TD3_23 只需将上述两行 HER 参数注释掉:
model = sb3.TD3(
policy="MultiInputPolicy",
env=env,
learning_starts=5000,
buffer_size=300_000,
batch_size=256,
action_noise=action_noise,
# replay_buffer_class=sb3.HerReplayBuffer, # ← 注释掉即为无 HER
# replay_buffer_kwargs={...},
tensorboard_log="./tb/her"
)
model.learn(total_timesteps=30_000)
两行代码的差异,决定了智能体是"学会导航"还是"原地打转"。
6.3 评估脚本
episodes = 100
env = PointNavHer(render_mode="human")
model = sb3.TD3.load("./model/env_point_her", env=env)
for i in range(episodes):
obs, _ = env.reset()
env.render()
done = False
episode_total = 0.0
while not done:
action, _ = model.predict(obs)
obs, reward, terminated, truncated, info = env.step(action)
env.render()
episode_total += float(reward)
done = terminated or truncated
print(f"Finish {i}/{episodes}, Total_reward: {episode_total}")
评估时使用 render_mode="human" 可视化智能体的实际行为。注意评估环境是新创建的——它拥有独立的随机障碍物和目标布局,不会与训练环境的随机种子产生关联。每个回合结束后有 500ms 延迟,便于观察轨迹。
6.4 参数解读
| 参数 | 值 | 推理 |
|---|---|---|
learning_starts | 5000 | 先收集 5000 步随机经验再开始学习,避免初期偏差 |
buffer_size | 300,000 | 30k 步 × 4 envs × 5(1 原始 + 4 HER)= 600k,缓冲器容量充足 |
batch_size | 256 | 标准批量大小,平衡梯度稳定性和训练速度 |
n_sampled_goal | 4 | 每条原始经验生成 4 条 HER 经验,有效扩大正样本密度 |
goal_selection_strategy | "future" | 从该步之后 2~N 步中随机选 achieved_goal,保证可达性 |
total_timesteps | 30,000 | 缩减后的训练步数,30k 步已足够学到有效绕障策略 |
6.5 为什么 HER 只需要两行代码?
Stable-Baselines3 将 HER 的逻辑封装在 HerReplayBuffer 内部,核心流程如下:
原始经验存入缓冲器时:
1. 存储原始 transition: (obs, action, reward, next_obs, done, info)
2. 对每条 transition,从同一回合的后续 achieved_goal 中采样 n_sampled_goal 个
3. 将每个采样的 achieved_goal 替换 original desired_goal
4. 调用 env.compute_reward() 重新计算奖励
5. 生成新的 transition,追加存入缓冲器
采样时:
1. 均匀地从原始经验 + HER 经验中采样
2. 目标(desired_goal)已被正确替换,正常训练即可
7. 实验结果对比分析
以下是 TensorBoard 记录的两个实验运行结果对比。her\TD3_22 启用了 HER,her\TD3_23 为纯 TD3 基线。

7.1 平均回合奖励(rollout/ep_rew_mean)
这是最直观的对比指标。
| 指标 | her\TD3_22 (HER) | her\TD3_23 (无 HER) |
|---|---|---|
| 最终平滑值 | -20.18 | -91.10 |
| 转折点 | ~12k 步 | 无 |
| 收敛趋势 | 12k 步后从 -100 跃升至 -20 | 全程缓慢改善至 -91 |
图 1: rollout/ep_rew_mean 对比
分析:
- 无 HER(TD3_23):奖励始终徘徊在 -90 到 -100 之间,智能体几乎没有学到任何有效策略。在 100 步的回合中,平均奖励 -92 意味着智能体几乎永远走不到目标(每步惩罚 -1,100 步就是 -100;如果偶尔成功一次 0 奖励,平均会略高于 -100)。实际上,智能体学到的策略就是"随机乱走"——偶尔运气好撞到目标区域。
- 有 HER(TD3_22):在 12k 步处出现明显的"顿悟时刻"(phase transition)——奖励从 -100 急剧上升到约 -20,随后稳定在这一水平。平均奖励 -20 意味着平均每个回合约 20 步到达目标(假设未成功前每步 -1),这是一个高效的导航策略。
7.2 Actor 损失(train/actor_loss)
| 指标 | her\TD3_22 (HER) | her\TD3_23 (无 HER) |
|---|---|---|
| 最终值 | 4.09 | 12.62 |
| 趋势 | 缓慢上升至稳定 | 线性持续上升 |
图 2: train/actor_loss 对比
分析:
- 有 HER:Actor 损失保持在 4 左右,轻微上升但整体稳定。这个上升是正常的——随着 Critic 对 Q 值的估计越来越准确,Actor 的优化目标(最大化 Q)变得更加明确,损失自然会略有增加。
- 无 HER:Actor 损失从接近 0 线性增长到 12.9。这不是"正在学习"的信号,而是梯度崩溃的表现:当 Critic 无法提供有效的价值估计时,Actor 的梯度更新方向几乎是随机的,导致策略持续退化。
7.3 Critic 损失(train/critic_loss)
| 指标 | her\TD3_22 (HER) | her\TD3_23 (无 HER) |
|---|---|---|
| 最终平滑值 | 0.0745 | 0.0771 |
| 波动特征 | 剧烈震荡后收敛 | 快速下降后平稳 |
图 3: train/critic_loss 对比
分析:
- 两条曲线最终值接近,但行为模式截然不同:
- 有 HER:初期小幅震荡,15k-25k 步之间出现剧烈波动,最终降到 0.07 左右。这些波动恰恰对应着"顿悟时刻"——当 Actor 的策略发生质变时,Critic 需要重新学习新的状态分布下的 Q 值,导致损失暂时升高。最终收敛到更低的值说明 Critic 学到了更准确的估值。
- 无 HER:Critic 损失初期很高(>0.3),迅速下降后稳定在 0.08-0.1 区间。看似稳定,但这实际上是因为Critic 学到的 Q 值本身就是常数值(接近 -100),任务过于"简单"以至于损失很低——但这不意味着它在学习有用的东西。
7.4 综合对比总结
| 维度 | HER (TD3_22) | 无 HER (TD3_23) | 差距 |
|---|---|---|---|
| 学习效果 | 有效学习,12k 步突破 | 几乎无学习 | 天壤之别 |
| 策略质量 | ~20 步到达目标 | 随机游走 | 4-5 倍 |
| Actor 稳定性 | 良好(Loss ~4) | 极差(Loss ~13) | 3 倍 |
| Critic 收敛 | 震荡后收敛到 0.07 | 伪收敛到 0.08 | 接近但本质不同 |
| 训练时间 | ~39s(23k 步) | ~40s(26k 步) | 相同量级 |
8. 结论与建议
8.1 核心结论
-
HER 是稀疏奖励任务的关键基础设施。在 PointNavHer 环境中,启用 HER 的 TD3 在 12k 步后学会高效导航(平均 20 步到达目标),而未启用 HER 的 TD3 完全无法学习,表现等同于随机策略。
-
HER 的成本极低。在 SB3 中,只需两行代码即可接入 HER。额外计算开销为每条经验生成 4 条 HER 样本,对整体训练时间影响微乎其微(本实验中两者训练时间几乎一致)。
-
HER 的价值在于"创造正样本"。在稀疏奖励下,随机探索几乎不可能偶然到达目标(特别是在高维状态空间或长程任务中)。HER 通过"事后重新标记"将每个失败样本转化为成功样本,从根源上解决了正样本匮乏的问题。
8.2 使用建议
-
何时使用 HER:
- 奖励是稀疏的(成功/失败二元,或无中间引导)
- 环境可以表达为目标条件化形式(有
achieved_goal和desired_goal) - 任务的"真正目标"和"智能体已到达的位置"共享相同的状态表示
-
何时不用 HER:
- 奖励已经是稠密的(如 CartPole、MountainCar)
- 环境无法定义有意义的 achieved goal(如雅达利游戏)
- 目标空间与状态空间不同构
-
参数调优建议:
n_sampled_goal:4 在大多数场景下工作良好。对于超长时序任务(1000+ 步),可尝试增加到 8goal_selection_strategy:"future"是通用首选。"episode"适用于需要鼓励探索的场景batch_size:由于 HER 会扩大批量大小(1 原始 + N HER),可能需要适当减小batch_size以控制内存
8.3 一个反直觉的洞察
很多工程师初次接触强化学习时,会直觉地尝试用距离/进度作为奖励来"帮助"智能体。这种做法在简单环境中有效,但本质上是在用自己的先验知识作弊——你已经在告诉智能体"往这个方向走是对的"。
HER 提供了一条完全不同的路径:保持奖励的稀疏性和客观性,通过数据增强而非奖励工程来解决问题。这不仅更优雅,也更具泛化性——当障碍物阻断了"直线前进"时,基于距离的奖励会误导智能体,而 HER 只关心"是否到达",让智能体自主发现绕行策略。
“Don’t shape the reward, relabel the experience.”
—— Hindsight Experience Replay 的哲学

377

被折叠的 条评论
为什么被折叠?



