news 2026/10/1 14:58:07

事后经验回放HER:强化学习中的稀疏奖励破解之道

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
事后经验回放HER:强化学习中的稀疏奖励破解之道

1. hindsight 是什么:从一句“我早就知道”说起

“hindsight”这个词,翻译过来就是“事后眼光”、“后见之明”。谁的生活里都出现过这种时刻:看完比赛说“我早知道他会赢”,项目上线挂了说“我当初就觉得这里有问题”。心理学里管这叫“后见之明偏差”,人脑天生擅长在结果确定之后,把线索重新组织成一个“我早就预料到”的故事。这词本身不稀奇,真正有意思的是,这几年它在人工智能领域砸出了一个响亮的落地——2017 年 OpenAI 那篇《Hindsight Experience Replay》(简称 HER)直接把“事后经验”变成了强化学习的训练信号,解决了一批让学术界头疼多年的稀疏奖励问题。

我最初接触 HER 不是因为论文推送,而是因为一个真实到骨子里的困惑:我训练一个机械臂抓取物体,跑了几百万步,奖励永远是 -1,模型就是学不会。后来我才意识到,如果只盯着“成功”这个终点,一个失败的动作序列确实毫无信息量;但如果你学会了“事后”看待它——这个动作虽然没抓到指定目标,但碰到了旁边另一个东西,这难道不是一次成功?HER 干的就是这件事:把失败的经验重新标记成成功,让模型从自己的“差一点点就成功”里学到东西。

这篇文章围绕 hindsight 这个词,把它在技术上的核心载体——HER 算法——从头到尾拆一遍,包括它解决什么问题、为什么有效、怎么落地实现、遇到哪些坑。同时也聊聊“后见之明”在工程复盘里的另一面:算法利用它是利器,人脑错用它就是幻觉。适合正在做强化学习项目的人、被稀疏奖励折磨的炼丹选手,以及任何一个对“如何从失败中学习”这件事感兴趣的人。

2. 为什么需要“事后经验”:稀疏奖励让智能体寸步难行

2.1 从机械臂抓取说起:一顿操作全白费

强化学习的基本逻辑,是智能体通过和环境互动、拿奖励信号来调整策略。但这个逻辑成立的前提,是奖励信号本身得“够得着”。很多真实任务里,奖励是非常稀疏的:你让一只机械臂去抓取一个固定位置的积木,动作空间可能是七维甚至更高,末端执行器在三维空间里连续运动。绝大多数随机尝试都会扑空,手挪过去了但方向偏了 2 厘米,抓取动作触发了但没有合拢,或者干脆连积木的边都没碰到。

这种情况下,环境给出的奖励通常是恒定的 -1 或者 0,不存在任何中间梯度。策略梯度也好、Q 学习也好,拿到手的信号全是“没成功”,算法无法判断哪一步动作比哪一步更接近目标。这就是稀疏奖励问题,它让大量真实任务没法直接用标准强化学习算法训练。我见过不少入门项目,跑 CartPole、爬 Walker 都挺顺利,一换到 FetchReach、FetchPush 这类机械臂任务,立刻变成训练一小时、奖励纹丝不动。

从数学角度看,问题在于回报的方差。当奖励只在极少数轨迹结尾出现时,绝大多数轨迹贡献的梯度接近于零,有效样本极低。如果把整个状态空间想象成一片沙漠,奖励就是其中的一小片绿洲,随机探索找到绿洲的概率小到可以忽略。

2.2 随机探索的困境:给宇宙十亿年也不够

有人会想,那我多给些随机探索,总会撞到成功的吧?理论上确实可以,但实际代价高得离谱。以机械臂四维控制为例,目标位置是一个连续坐标,随机策略撞中目标的概率,和“在几千公里长的海岸线上随机抛硬币,恰好正面朝上”是一个量级。

更麻烦的是,即便撞上了目标,稀疏奖励也只会让这一条轨迹获得高回报,而这条轨迹里的每一个动作都缺乏细粒度归因。强化学习需要的是大量覆盖状态空间的反馈,而稀疏任务里你获得的反馈数量是几何级数级别的稀缺。这就像一场考试,满分是一百,但你只能知道“零分”和“满分”两个结果,中间全是黑箱,那任何训练方法都成了瞎猜——碰巧满分就过了,碰不到就永远卡在零分。

好,既然问题出在“反馈太少”,自然有一个逆向思路:与其让智能体费尽力气去撞目标,不如把已经撞到的东西“重构”成目标。这就是 hindsight 概念的核心发力点。

2.3 事后视角:从失败里读出成功

人类在日常生活里早就在用这种事后视角。你投篮没进,但球弹到了左边某个点,你会意识到“如果目标在左边那个位置,我这一投其实很准”。你写代码没有一次通过测试,但报错信息暴露了某个模块的边界条件,你会把这个边界条件当成一个新的测试用例。这种“换目标重新评价”的能力,就是直觉层面的 hindsight。

HER 算法做的事情,本质上就是把这种直觉形式化:一条轨迹没能到达你最初设定的 goal,但它到达了某个实际状态 s‘,那就把这条轨迹里的目标改写成 s’,然后假设“我们的任务本来就是到达 s‘”,这样一来,这条轨迹就成了一个成功样本。因为智能体确实做到了——它从初始状态出发,最终到达了 s’,这就是事实。

这个操作的厉害之处在于,它不改变物理环境,不修改奖励函数,唯一改的是“这条轨迹原本想要什么”。在目标条件化强化学习的框架里,goal 是输入的一部分,对 same trajectory、不同 goal 重新计算奖励,就能凭空造出海量正样本。

2.4 为什么“事后诸葛”在这里是对的:目标条件化与奖励函数设计

你可能会问:这不是在自欺欺人吗?拿一个没满足的任务当满足,会不会误导策略?

关键在于目标条件化的奖励函数设计。在 HER 的典型设定里,奖励函数只和“当前状态是否匹配目标”有关,和“目标是哪个”无关。对于 skill 这类用负欧式距离做稠密奖励的任务,换一个目标只是修改距离计算的基准点,逻辑上完全自洽。对于稀疏二值奖励的任务,也是一样:你到达了 s’,那么“目标是 s’”这件事就真的完成了,奖励就是 1,不存在欺骗。

更深入地说,HER 利用了强化学习中的一个结构性特点:策略需要学会的是一个从“状态+目标”到动作的映射。目标本身是灵活的输入变量,同一个动作序列,在不同目标下有不同的含义。所以一条失败轨迹,在原始目标视角下是负样本,但在它实际到达的状态作为目标时,就成了正样本。后者提供的信息是真实的——它至少证明“从起点到这个状态”这个子问题是可解的,而且给出了一条可行的动作链。

这就是为什么“后见之明”在算法领域不是认知偏差,而是一个强大的数据增强策略。下面进入正题,看具体的实现机制。

3. 核心算法拆解:Hindsight Experience Replay 是怎么在代码里落地的

3.1 经验从哪来:回放池的巧妙改造

HER 的全称里有 Experience Replay,它的基础设施就是标准 DDPG(或者 SAC、TD3 这类 off-policy 算法)里的经验回放池。标准回放池里存的是五元组:(state, action, reward, next_state, done),每一条都是一次环境交互的原始记录。

HER 的改造点是:一条真实轨迹被采样之后,除了保留原始记录,还会额外生成若干条“改写记录”。改写记录里的 state、action、next_state 都不动,变的只有目标——把原始目标替换成轨迹中某个后面时刻的实际状态,再根据这个新目标重新计算 reward 和 done。然后把原始记录和改写记录一起塞进回放池。

这意味着回放池里的样本量不再是环境交互次数,而是交互次数乘以“每条轨迹生成多少改写样本”。我自己的实验里,通常设置为每个 episode 额外生成 4 到 8 条改写轨迹,数据量立刻扩大一个量级,而且每条都是有效学习信号。

这里有一个容易忽略的工程细节:done 的判定也要跟着目标走。如果原始目标是“到达 A”,轨迹结束在 B(不等于 A),那么原始视角下 done=False;但改写视角下目标是 B,轨迹结束时确实到达了 B,done 应该设为 True。如果不做这个区分,时序差分学习会得到混乱的 bootstrapping 信号。很多新手实战时只改了 reward 忘了改 done,训练直接崩,后面我会再细讲。

3.2 核心机制:目标重标记的四步流程

目标重标记是 HER 的心脏,它按固定流程执行:

第一步,采样一条完整 episode。这条轨迹记录了一串状态序列 s_0, s_1, ..., s_T,以及对应的动作序列。原始任务有一个预设的 goal g。

第二步,选择一个“事后目标” g‘。最常见的选择是这条轨迹最后到达的状态 s_T。也可以选轨迹中间某个状态 s_k,取决于你要多稀疏还是多密集的信息。选 s_T 最稳定,因为它是“最终达成的事”,对目标条件化策略最直接。

第三步,用新目标重新计算整条轨迹的奖励和 done。假设奖励函数是 r(s, g) = -||phi(s) - phi(g)||_2,那么对每个时刻 t,新的奖励就是 -||phi(s_t) - phi(s_T)||_2(如果选 s_T 作为新目标)。注意,这里的 phi 是状态到目标向量的映射,在机械臂任务里就是末端执行器的三维坐标。

第四步,把改写后的完整轨迹按四元组拆开,逐条加入回放池,同时保留原始轨迹样本。

这四步走完,回放池里就出现了大量“我试过,并且做到了”的正样本。关键在于,这些正样本不是靠运气撞出来的,而是从失败轨迹本身提炼出来的——真实状态转移发生了,动作序列真实可行,唯一的改动是“意图”。

3.3 多目标并行:一个 episode 产出十几个样本

理论上,一条轨迹到达的中间状态有一大串,每一个都可以作为事后目标。今天实践中很少只生成一条改写样本,而是会批量生成。OpenAI 论文里提到两种常见策略:

  • final:只把最终状态作为事后目标,每条轨迹生成 1 条改写样本。
  • future:对轨迹中的每一个时间步,从“未来某个时刻的状态”里随机选一个作为目标,每条轨迹生成多条。

我用 future 策略时通常选择“每个原始样本额外生成 4 个改写目标”,这些改写目标分别从轨迹后面的随机时刻抽取,这样回放池里既有“终点视角”的样本,也有“中场视角”的样本。后者特别有用,因为它让模型学会“即使还没到终点,我也能达成一个阶段性目标”,提升了中间状态的价值密度。

这也是 HER 和普通 reward shaping 的本质区别:reward shaping 是人手工设计中间奖励,需要领域知识,还可能有“刷分”漏洞;HER 是从真实轨迹里自动提取中间里程碑,不需要额外知识,完全数据驱动。

3.4 网络结构怎么选:Actor-Critic 与目标编码

HER 本身不指定网络结构,它常和 DDPG、SAC、TD3 这类连续控制算法搭配。核心结构是 Actor-Critic:Actor 网络输入 (state, goal) 输出连续动作,Critic 网络输入 (state, goal, action) 输出 Q 值。goal 和 state 通常都经过一个特征编码(比如 MLP),然后拼接在一起。

这里有个容易被忽视的地方:在实现时,state 和 goal 的维度可能不一样。比如 FetchReach 环境里,state 是 25 维的完整状态,goal 是 3 维的末端位置,但二者都描述了同一个物理世界的某个切面。我在实战里的做法是分别过一层全连接,得到相同维度的嵌入,再拼接。不要直接把 25 维和 3 维拼起来就丢进网络,训练初期的尺度不匹配会拖慢收敛。

另外一个重要选择是:要不要为 HER 单独设计奖励网络。我的经验是不要搞设计,直接使用环境自带的目标条件奖励函数,或者一个简单的欧式距离函数。HER 的卖点之一就是免去繁杂的奖励工程,如果你又回去设计花式奖励函数,相当于亲手把优势扔掉。

3.5 伪代码级流程:一个可复现的训练循环

把 HER 挂到 DDPG 上,整个训练循环长这样:

初始化 actor 网络 mu、critic 网络 Q,以及各自的目标网络 初始化回放池 R for episode in range(max_episodes): 采样初始状态 s_0 和原始目标 g for t in range(max_steps): 根据 mu(s_t, g) 加噪声选择动作 a_t 执行 a_t,得到 s_{t+1} 和原始奖励 r_t 存储原始四元组 (s_t, a_t, r_t, s_{t+1}, g) 计算事后目标 g' = s_T(或从未来状态中采样) 用 g' 重算每条转移的奖励和 done 将改写转移加入 R for update_step in range(n_updates): 从 R 采样一个 batch 更新 critic:最小化 Q(s, a, g) 与 target 的 MSE 更新 actor:最大化 Q(s, mu(s, g), g) 软更新目标网络

这个流程直接可以落到 MuJoCo 的 Fetch 系列环境上。论文里 OpenAI 给出的效果是:在 FetchReach、FetchPush、FetchPickAndPlace 三个环境上,HER 都能在较短步数内完成训练,而普通 DDPG 在同样步数下达不到目标。我自己复现时的体验也基本一致。

4. 实操记录:把 HER 跑在机械臂抓取任务上

4.1 环境准备:gym 与 Fetch 系列

我用的是 OpenAI Gym 的 FetchReach-v1 和 FetchPush-v1 环境,底层是 MuJoCo 物理引擎。第一步确认依赖:gym、mujoco-py(或者新版的 mujoco)、numpy、PyTorch。如果环境配置有问题,可以先跑一下随机策略,看看能不能正常渲染,再进入训练环节。

然后定义目标条件奖励函数。Fetch 环境自带一个 is_success 标志,判断当前末端位置和目标位置的欧式距离是否小于某个阈值。我通常会计算 achieved_goal 和 desired_goal 的范数作为稠密奖励:reward = -np.linalg.norm(achieved_goal - desired_goal),这样每步都有一个梯度信号,训练更稳。HER 论文里也讨论过稀疏与稠密奖励的兼容性:HER 在两种设置下都能工作,但我实测稠密奖励配合 HER 收敛明显更快。

4.2 基线对比:没有 HER 时有多绝望

为了让自己心里有数,我先跑了一个没有 HER 的 DDPG 作为基线。训练 50 万步,actor 和 critic 用三层 MLP,每层 256 个神经元,ReLU 激活。结果不出意外:训练曲线从头到尾是平的,成功率永远挂在零附近。中间我也加了探索噪声、调过学习率、增大过回放池,统统没用——这是一个典型的稀疏奖励死亡场景。

关键在于,这个“死”不是网络容量不够,而是反馈信号缺失。我把每一步的 reward 分布打出来看,95% 都是负常数,剩下 5% 是噪声波动。没有任何一个信号能告诉策略“你刚才的动作接近目标了”。这种情况下,再强的表示学习也学不出策略,就像没有 GPS 信号让你盲飞几千公里。

4.3 加入 HER:改造回放池的三处改动

接着我把 HER 加进同一个 DDPG 模型,只改了三个地方:

第一处,episode 结束后立刻生成事后目标。我选择的策略是 future 采样,对轨迹中的每个时刻 t,从 t+1 到 T 之间随机选一个状态索引 k,把 achieved_goal(末端位置)作为新目标。每条轨迹额外生成 4 条改写轨迹。

第二处,重算奖励和 done。对原始轨迹里的每一步,用新目标重新计算欧式距离奖励,同时判断是否成功并更新 done。这里我特别小心:done 必须和当前选定的目标对应,不能沿用原始 done。

第三处,把改写轨迹拆成四元组,混合原始轨迹一起加入回放池。回放池容量设为 100 万条,batch size 用 256。

改完后重新训练,50 万步内成功率已经爬到 80% 以上。同样一个模型、同样的随机种子、同样的超参数,唯一区别就是回放池里多了事后样本。这个对比直观得让人反直觉:模型在训练时“成功”的经验,大部分不是来自真正的成功,而是来自失败但被重新标记的轨迹。

4.4 训练曲线解读与超参数调优

HER 训练曲线有几个典型特征,搞懂它们能省下很多无意义的调参时间。前期(大概 10 万步以内)成功率依然波动很大,这是因为策略还在探索,回放池里的事后样本也在快速积累。中期(10 万到 30 万步)曲线会出现一个明显爬坡,这个阶段模型开始学到“把动作映射到目标”的基本能力。后期(40 万步以后)成功率趋于平稳,但仍会有偶然下滑——这是 off-policy 算法对标称目标的正常波动,不是代码出错。

最敏感的超参数是“每条轨迹生成几条改写样本”。我对比过 1 条和 8 条的差异:1 条时训练曲线爬坡慢但每个样本更聚焦;8 条时数据量增大、前期收敛快,但也会引入更多冗余,训练步长要相应增加。中等规模任务我用 4 条,性价比最高。需要特别说明,这个值要结合回放池容量一起看:改写样本太多、回放池太小,样本很快被覆盖,反而不利于稳定学习。

另一个容易踩坑的超参数是探索噪声。HER 提高了正样本的利用率,但如果你完全去掉探索噪声,actor 输出会迅速趋同,事后来不及发现新目标。我在 DDPG 里用 Ornstein-Uhlenbeck 噪声,标准差 0.2,衰减系数 0.995,效果稳妥。如果你是 SAC 爱好者,可以靠熵正则来保探索,效果同样成立。

4.5 关键实现片段:目标重标记的核心代码

下面贴一段我在实现时用的核心函数,去掉平台相关细节,保留逻辑主干:

def her_sample(episode_transitions, achieved_goals, gamma=0.98, n_extra=4): """ episode_transitions: list of (obs, action, reward, next_obs, done) achieved_goals: 每个时刻的实际到达目标(如末端坐标) n_extra: 每条轨迹额外生成的改写目标数 """ new_transitions = [] T = len(episode_transitions) for t, (obs, action, reward, next_obs, done) in enumerate(episode_transitions): for _ in range(n_extra): # future 策略:从 t 之后随机选一个时刻的状态作为新目标 k = np.random.randint(t + 1, T) new_goal = achieved_goals[k] new_reward = compute_reward(new_goal, achieved_goals[t + 1]) new_done = float(achieved_goal_reached(achieved_goals[t + 1], new_goal)) new_transitions.append((obs, action, new_reward, next_obs, new_done, new_goal)) return new_transitions

这段代码逻辑很朴素:遍历原始轨迹,对每个时刻生成几条“未来的我完成了某个目标”的样本。新目标就是未来某个时刻实际到达的位置,奖励由目标条件奖励函数重新算出来。配合回放池混合采样,HER 就完整落地了。我一直觉得,HER 的优雅正在于它的简单:只改数据的含义,不改物理系统,不改网络结构,收益却能翻倍。

5. 常见问题与排错速查:我踩过的坑一个不少全在这里

5.1 目标采样方式怎么选?future 和 final 到底差在哪

我最早用的是 final 策略,只取轨迹终点作为事后目标,训练收敛慢,尤其在长 horizon 任务里,后半段轨迹的目标和前半段状态匹配度低,正样本质量打折。后来换成 future 策略,情况明显改善。

关键在于时间相关性。future 策略选的目标是“未来某个时刻实际到达的状态”,这意味着修改后的样本描述的是“从早期状态出发、在特定时刻到达某个目标”,这段经验在时间上更连贯,利于时序差分学习。而 final 策略直接把终点当目标,对于前半段轨迹来说,中间相隔太多步,bootstrapping 误差变大。我的建议:短任务可以用 final,长任务用 future 并让 k 的采样不要距离 t 太远,否则同样会引入长程误差。

5.2 奖励计算不一致引发的训练崩溃

这是一个隐蔽的 bug。我有一段重构代码时,把原始轨迹的奖励也一并替换成了事后目标的奖励,结果训练直接发散,Q 值爆炸。原因很简单:critic 在学习时,同时看到了“原始目标的轨迹配原始奖励”和“事后目标的轨迹配事后奖励”,两组数据必须严格对应各自的 goal。一旦交叉,网络学习到的目标-奖励映射就是混乱的。

正确做法是严格区分两组数据。原始轨迹保持原样,只有改写轨迹使用新奖励。我后来给每条样本加了一个 goal_mask,标注它属于哪一组,前向计算时把两组分开处理,训练瞬间恢复稳定。

5.3 回放池容量和采样比例怎么配

HER 生成大量改写样本,如果不控制比例,回放池会被事后样本淹没,模型会过度关注“事后视角”,丧失对原始目标的敏感性。我的经验是回放池里原始样本和改写样本的比例保持在 1:1 到 1:2 之间。如果采用分层采样,可以给两类样本不同的采样权重,防止一类样本主导。

这里也有一个工程建议:不要把回放池设得过大。过大意味着新策略的经验要过很久才能影响训练,收敛变慢;过小则样本生命周期太短,改写样本还没被充分学习就被覆盖。100 万条在我的任务里表现不错,你可以按 horizon 长度和 env step 频率来估计——回放池容量大约是“一个训练阶段内经验条目的 5 到 10 倍”。

5.4 还是学不会?先查这三个地方

如果加了 HER 训练仍然没起色,我会按顺序排查:

第一,检查 is_success 的判定阈值。Fetch 系列环境里 success 靠欧式距离阈值判定,如果你的目标维度是标准化后的,阈值可能不匹配,导致显示的“成功率”永远为 0,但其实策略已经学到东西了。第二,检查 done 是否被正确重标记,这个最容易错。第三,检查状态和目标是否归一化。HER 对目标空间的尺度很敏感,目标范围是 0 到 1 和 0 到 10 会有完全不同的收敛表现,我通常把 observation 和 goal 做零均值标准化。

在调试阶段,可以只跑一个确定性策略、关掉探索,看它能不能从回放池里稳定执行一条已知可解的轨迹。如果连已知轨迹都重现不了,那是网络或目标条件编码的问题,不是 HER 的问题。

5.5 一个隐藏技巧:用“事后失败”做课程学习

如果你希望 HER 在更复杂的任务里也有效,可以在目标分布上动手脚。HER 本身就可以看作一种自动课程学习——早期的改写目标都是简单可达状态,随着策略能力增强,真实目标逐渐变多。我有一次在 FetchPickAndPlace 任务里,把部分改写样本的“事后目标”保留成中等难度目标(离初始状态有一定距离,但不是太远),加速了早期学习阶段。

这算是 HER 的扩展玩法。标准 HER 已经很强,但这种“控制事后目标的难度分布”思路,可以帮你突破更难的稀疏奖励任务。当然,这也意味着你又在引入一点手工设计,技术上未必总是更好,但至少在工程实践里值得一试。

6. 回到 hindsight 本身:算法用它学习,人脑慎用它自欺

6.1 同样是事后视角,人和机器的区别在哪

HER 在强化学习里是妥妥的正向工具,但在人类的决策场景里,“hindsight”常常是陷阱。心理学实验早就证明,事后回顾时人会高估自己“事先知道”的程度,比如预测比赛结果时,哪怕事先完全未知,一旦结果揭晓,人们也会自然地认为“我早猜到了”。这种偏差在项目复盘、技术方案评审里危害不小——它让人误以为自己的判断力很好,导致过度自信,下一次照样踩坑。

机器用 hindsight 学习是诚实的:它基于真实的状态转移记录,重写目标,不篡改事实。人脑用 hindsight 时常不诚实:我们在记忆里重构过去的想法,让它和真实结果更一致,这种重构失真会让我们永远学不到真正该学的教训。

工程复盘时我的建议格外简单:写代码、写文档时尽量留“现场证据”。当时的日志、当时的决策理由、当时的 PR 描述,都比回忆可靠得多。我看到过太多事故复盘,开完会大家都会说“早就想到了”,但翻出当时的监控和会议纪要,其实谁都没有想到。这不是说复盘没有意义,而是说复盘要用“当时记录”校准“事后解释”。算法用 hindsight 是增强数据,人用 hindsight 至少得先校验数据。

6.2 复盘文化:避免让后见之明变成花瓶摆设

还有一个工程实践值得提:故障后复盘。行业里常见的 post-mortem 模式,本质上是一种组织级的 hindsight。它的正确用法是寻找系统性失效的原因,而不是给个人定性。我看到最糟糕的复盘,是会议一半时间都在确认“这个责任应该谁背”,结果技术细节没人深入,改进项没人跟进。最好的复盘,是像 HER 一样去“重标记”:这条失败轨迹,如果换一个目标去看,它暴露了什么真实状态?也许不是某个人的失误,而是流程缺少检查点、监控缺少告警、架构缺少容错。

每次复盘结束,我都会要求列出三条可执行的改动,并且指定时间段内验证。没有行动项的复盘,只是又一次后见之明的自我满足。

6.3 一些零碎但务实的心得

文章快收尾了,我再分享几个实操中沉淀下来的小心得,不成体系,但很实在。

第一点,HER 不只是算法,更是一种思维范式。在调试任何强化学习任务时,我都会问自己:这条失败轨迹里,有什么事实上已经完成、只是没有被当作目标的东西?这种提问方式经常帮我找到数据增强、特征选择、甚至奖励设计的新思路。

第二点,在工程里实现 HER 时,保持目标条件化的接口一致。尽量让 goal 作为函数参数而不是全局变量,这样后续切换 final/future 策略、切换奖励函数,都只需要改一个函数。我用这套接口同时跑了三个环境,没有额外开销。

第三点,把 HER 和密度估计、自监督表征结合起来是一个值得玩味的方向。HER 对目标的定义依赖状态映射,如果状态表征能做到自动学习,事后目标的选择也就不再依赖手写的欧氏距离。比如用对比学习把 high-dimensional observation 编码成紧凑向量,再做目标重标记,可以拓宽到图像输入场景。不过这是我的延展想象,如果你要做,要准备好踩比 MuJoCo 控制更多的坑。

最后再啰嗦一句:后见之明是强有力的学习信号,但前提是保持事实干净。代码里可以放心大胆用 Hindsight Experience Replay,人脑里的 hindsight 则要时时警惕。技术解决“学不会”,元认知解决“自以为学会了”,两件事都做好了,才算把 hindsight 这个字眼用明白了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 14:57:58

多节点部署下Session共享:用Redis解决登录状态丢失的完整实践

多节点部署之后,用户登录状态突然“三天两头掉线”,十有八九是Session没共享。明明在A节点登录成功了,下一次请求被负载均衡切到B节点,Session直接变成新会话,用户就以为自己被强制下线了。这个问题的标准解法就是把Se…

作者头像 李华
网站建设 2026/10/1 14:57:45

QuickBlue AI应用底座:微服务架构下Java与Python双栈融合实践

1. 从一堆“重复造轮子”的痛说起:QuickBlue 到底想解决什么如果你带过三五个人的后端小队,或者自己从零搭过一套带 AI 能力的业务系统,大概率经历过这种场面:项目立项时雄心勃勃,Spring Cloud 全家桶拉满,…

作者头像 李华
网站建设 2026/10/1 14:57:42

SAP BAPI扩展三层次原理:接口、数据流与持久化协同

1. 这不是“加个字段”那么简单:BAPI扩展与增强的本质是什么在SAP项目现场干了十多年,我见过太多人把“BAPI扩展字段”当成一个配置开关——点几下SE18、填几个字段名、激活一下就完事。结果上线一跑采购订单价格修改,BAPI_PO_CHANGE里传进去…

作者头像 李华
网站建设 2026/10/1 14:56:47

I3C比I2C快10倍?RK3576设备树配置与高速总线实战解析

先把结论放前面:标题里“I3C 比 I2C 快 10 倍”这个说法,只对了一半。如果你拿 I3C 的 SDR 模式 12.5MHz 去对比 I2C 最常见的 400kHz,那确实有三十多倍的差距;但如果你拿它对比 I2C 的 Fm 1MHz 档,就只剩 12.5 倍。真…

作者头像 李华
网站建设 2026/10/1 14:56:15

如何养成真正持久的每日阅读习惯

为什么你的阅读习惯总是失败(以及如何最终改正它)你买了书。也许你甚至开始了几个。它们摆放在你的床头柜上、架子上、亚马逊购物车里——都是善意的纪念碑。你知道阅读很重要。你钦佩的每个成功人士似乎都有自己的图书馆和每日阅读习惯。然而&#xff0…

作者头像 李华