ARTICLE DETAIL

资讯详情

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

HER算法详解:用“事后复盘”破解稀疏奖励难题

HER算法详解:用“事后复盘”破解稀疏奖励难题 第一次认真琢磨 Hindsight 这个词是在 OpenAI 那篇 Hindsight Experience ReplayHER论文里。当时觉得这名字起得真妙——事后复盘放在日常生活中有点无奈放在强化学习里居然成了一种正儿八经的训练策略。如果你做过机器人控制、游戏 AI或者任何带目标导向的决策任务大概率也被“稀疏奖励”折磨过agent 在一个空荡荡的环境里瞎转悠老半天拿不到一次正向反馈训练曲线一路躺平。HER 就是针对这个老大难问题的一个非常优雅的解法。简单说HER 的核心思路是一条没达成原始目标的失败轨迹换个角度去看它其实成功到达了一些别的状态。那为什么不用这些“中途路过”的状态作为目标重新生成成功经验喂给 agent这就是“后见之明”。它不是让 agent 学会后悔而是让 agent 从失败里硬生生挖出有用信号。这篇文章我打算把 HER 从直觉、原理、关键实现到踩坑经验完整拆一遍。适合已经会一点点强化学习基础、想给稀疏奖励问题找个实用解法的朋友也适合那些听说过 HER 但是一直没搞清楚“到底怎么重新标注目标”的人。1. Hindsight到底解决了什么问题1.1 稀疏奖励场景下的无解困境先花点篇幅把痛点说清楚。标准强化学习里reward是agent的唯一导师。奖励给得密agent进步就快奖励给得稀agent就像在黑屋子里找钥匙运气不好一辈子都摸不着门。举个例子机械臂把一个方块推到一个目标位置。如果只有机械臂把方块推到目标附近才给 1 奖励其他情况都是 0那么agent在随机策略下推到目标的概率可能只有千分之一甚至更低。它一年也碰不到一次正反馈价值函数学习无从谈起。这就是典型的稀疏奖励问题。传统解法不外乎几条路手工设计稠密奖励函数比如用距离、速度、接触力去构造连续奖励或者用课程学习从简单初始状态开始逐渐加大难度再或者用reward shaping在环境中注入先验知识。这些方法都能用但都有毛病。手工设计奖励非常依赖工程师的经验和领域知识而且很容易钻空子搞出“奖励黑客”行为。课程学习要提前规划难度阶梯任务一变又要重新设计。HER的存在恰好绕开了“手工设计奖励”这条最费力的路。1.2 “事后诸葛亮”的核心直觉HER的想法特别朴素。假设机械臂推方块目标是推到坐标 (1, 0)结果这次推到了 (0.5, 0.5)。从原始目标看这局失败了奖励为 0。但如果我们把目标改成 (0.5, 0.5)这局就是成功的。agent 被重新标记为“完成了一个目标”这条经验就带上了正反馈。你可能会觉得这不就是自欺欺人吗明明没完成任务强行说完成了。但从学习的角度看这里藏着深刻的道理agent 在探索过程中虽然没有到达预先设定的目标但它做出的那一串动作确确实实把环境状态改变到了某个具体状态。这一整段“状态-动作-新状态”的转移序列是一个真实发生过的、有价值的经验。我们把这段经验配上它实际到达的状态作为 goal它就变成了一条可以用来学习的“成功轨迹”。更本质地说HER 把“稀疏奖励下的目标达成问题”转换成了“从任意状态出发都能学习的问题”。agent 不需要等到天荒地老才看到一次正样本而是每一条轨迹都能学到东西。训练信号的密度大大提升。1.3 用一个生活化比喻理解HER可以类比学投篮。如果你每次都要求自己必须投进三分球才算成功那练一小时可能没几次正反馈很难知道动作哪里不对。反过来如果你每次投篮后不管球落在哪里都把“把球抛到那个落点”当作这次的目标那么每一次投掷都是一个成功案例。你会在这一小时里积累大量的“抛到某处”的经验慢慢修正出手角度和力度。这个类比其实不太严格因为投篮这种运动技巧更多靠连续反馈但它能帮初学者 get 到 HER 的精神从已经发生的结果中提取可学习的信号而不是只盯着那个极难达成的原始目标。机器人控制里经常说的“失败经验也是经验”就是这个道理。2. 算法拆解从直观到可实现的数学描述2.1 目标条件强化学习的基本设定要把 HER 落实到代码得先把它放进一个形式化框架里。HER 不是在普通 MDP 里改奖励它是在 Goal-Conditioned RL目标条件强化学习的框架下工作的。在这个框架里agent 的策略是 (\pi(s, g))也就是在状态 (s) 下朝着目标 (g) 做出动作。环境里有一个目标空间 (\mathcal{G})每个目标对应一个期望达到的状态或状态特征。奖励函数当然是目标相关的一般是这样定义[ r_g(s, a, s) -\mathbb{1}[s \neq g] ]也就是说如果新状态达到了目标奖励是 0否则是 -1。这个奖励函数看起来很简单但正是这种 0/-1 的稀疏结构让很多常规算法束手无策。HER 的目的就是在这种奖励结构下依然能高效学习。2.2 HER的重新标注逻辑拆解HER 的具体做法不复杂。先让 agent 与环境互动一整条轨迹然后对轨迹里的一部分经验做目标重标注。重点在于如何选择新的目标。论文里给出了几种候选策略我直接说结论实际效果排序一般是 future final episode random。这些策略的名字很直白final把整条轨迹的最终状态当作这条轨迹的替代目标。最简单但也最粗放。一条轨迹可能前半段乱走后半段才趋向某个状态用最终状态作为全轨迹目标其实会引入一些不准确的标签。future从当前时间步往后在轨迹未来的状态中随机选 k 个状态作为额外目标。这是论文推荐的主力方案。因为“未来状态”和“当前经历的动作”在时间上是连续的它们之间的关联更强重标注出来的样本更可信。episode从当前轨迹以外随机挑一整条轨迹的最终状态作为目标。这个策略会让经验跨越不同轨迹噪声稍大。random从所有历史状态里随机采样一个状态作为目标。这个基本是下界一般不太用。实际操作中一条轨迹里并不是每个 transition 都会重标注。一般会对原始目标下的经验保留再额外按 future 策略挑一部分 transition 配上替代目标存进同一个 replay buffer。这样 buffer 里既有原始目标经验也有重标注过的经验agent 每轮更新时都能均衡采样。2.3 为什么“失败”经验可以变成“成功”经验这是 HER 最容易让人疑惑的地方如何保证重标注后的经验是“成功”的其实就是靠奖励函数来保证。假设你有一个 transition在状态 (s_t) 下采取动作 (a_t)到达新状态 (s_{t1})。如果把这组 transition 的目标重新标成 (g s_{t1})那么代入奖励函数[ r_{g}(s_t, a_t, s_{t1}) -\mathbb{1}[s_{t1} \neq s_{t1}] 0 ]瞧新的奖励就是 0也就是“成功”。逻辑上就是这么简单每个 state 都天然可以作为自己的目标。所以不管 agent 走到了哪里只要我们把“到达那里”设为目标这条经验立刻就变成了一个有正反馈的样本。这带来了一个特别好的副作用replay buffer 里的正样本比例会大大上升。常规稀疏奖励下 buffer 几乎全是负样本价值网络很容易学到“做什么都没用”HER 之后正负样本比变得健康Q 函数或价值函数的学习就顺畅多了。2.4 伪代码一次完整的目标重标注过程我用伪代码把 HER 的核心流程捋一遍。实际工程里肯定有更多细节但骨架就是这个# 假设使用 goal-conditioned off-policy 算法如 DDPG/SAC def her_episode(env, policy, her_strategyfuture, k4): episode_transitions [] obs env.reset() goal env.sample_goal() # 原始目标 while not done: action policy.select_action(obs, goal) next_obs, _, done, info env.step(action) episode_transitions.append((obs, action, next_obs, goal)) obs next_obs # 原始目标经验直接进 buffer replay_buffer.add(episode_transitions) # 对每条 transition 做若干次目标重标注 for t, (obs, action, next_obs, _) in enumerate(episode_transitions): # future 策略从 t 之后的 future 状态里随机抽 k 个 future_states get_future_states(episode_transitions, t, k) for g_prime in future_states: new_reward 0 if next_obs g_prime else -1 replay_buffer.add((obs, action, new_reward, next_obs, g_prime))这段代码里最重要的是get_future_states函数实现。它要从当前时间步向后截取一段未来状态集合然后随机抽取。写的时候要注意不要越界也不能抽到当前时间步之前的状态——否则就失去“未来”的意义了。3. HER 的关键实现细节与代码实战3.1 HER 该和哪类 RL 算法搭配HER 不是一个独立的 RL 算法它更像一个“经验增强模块”。它需要和 off-policy 算法搭配使用原理也不难理解重标注后产生的新经验只有能被反复回放、反复采样的算法才能消化掉。On-policy 算法每条数据只用一次重标注的意义就被削弱了。实际工作中最常见的搭配是 DDPG、TD3、SAC也有不少人在 DQN 里用 HER 处理离散控制任务。选 SAC 还是 DDPG取决于你对熵正则和探索的偏好。我的经验是如果环境是连续动作空间SAC HER 通常比 DDPG HER 更稳训练曲线更平滑。但 SAC 需要维护两个 Q 网络加一个策略网络资源开销更大。入门做实验的话先用 DDPG 把整套流程跑通再切 SAC 调最优是比较经济的路线。还有一点要注意既然是 off-policy、要存经验replay buffer 的容量设置对 HER 影响很大。缓冲池太小重标注出来的样本很快被覆盖掉缓冲池太大训练初期又采不到足够新的经验。一般的经验值根据任务复杂度来定简单任务几十万条足够了复杂任务可以到一百万条甚至更多。3.2 目标空间设计第一个关键工程决策HER 理论上妙落地上第一个坑就在目标空间。目标必须用“状态或状态的特征”来表示否则没法重新标注。比如机械臂推方块的环境里目标就是方块的位置坐标机器人导航环境里目标就是机器人的末端位置。这里有个容易被忽略的点目标空间和状态空间往往不是同一个东西。拿机械臂来说状态可能是所有关节角度和角速度而目标只关心末端位置。重标注时你不能直接把完整状态当作目标那样会让目标任务变得过于苛刻。正确的做法是定义好一个提取函数把“目标相关特征”从完整状态里抽取出来。目标空间可以是连续坐标也可以是离散类别。离散目标空间下 HER 很好用比如厨房环境里往不同抽屉放物体目标就是“某个抽屉被打开”agent 没打开目标抽屉但打开了旁边抽屉重标注成“打开这个抽屉”依然有效。连续目标空间下 HER 同样有效但要注意目标的分布范围不能太离谱。如果目标空间在坐标上跨度非常大建议做归一化处理让目标所有维度都在相近量级内否则 Q 函数很难学到合适的尺度信息。3.3 超参数选择与“k 值”的讲究HER 里最核心的超参数就是 future 策略中的 k——从未来状态里抽取几个替代目标。论文里 k 取 4 是基准线实际任务中这个值可以调。k 太小重标注样本太少效果不明显k 太大buffer 里全是重标注样本原始目标经验被稀释agent 反而忽略了真正想完成的任务。我自己的体会是k 在 4 到 16 之间都是安全区。如果任务的目标空间比较大、原始目标特别难达成k 可以取大一点如果原始目标相对容易k 取小一点更好。还有一种做法是在重标注时随机混合原始目标和替代目标比如 50% 原始目标样本 50% 重标注样本。这样既能保留原始任务的真实难度又能利用重标注样本提供学习信号。另外别忽略环境自带的一些“潜在目标”。有些任务里agent 的状态本身包含多个维度的信息比如物体位置、物体速度、夹爪开合状态。你可以把“速度为零且位置在某个区间”作为目标这种复合目标在 HER 里也是可以重标注的但工程实现会更复杂。新手阶段还是先从单一目标维度做起比较好。3.4 一个可以“抄作业”的简化实现示例这里我给出一个最小可用的 HER 目标重标注实现重点是展示“如何从 trajectory 中提取 future 状态”。环境我用 OpenAI Gym 风格的接口算法部分不展开只展示 HER 相关的核心数据流。import numpy as np from collections import deque class HERBuffer: def __init__(self, capacity100000, k4, her_strategyfuture): self.capacity capacity self.k k self.her_strategy her_strategy self.buffer deque(maxlencapacity) def process_episode(self, episode, goal_extractor): episode: list of (obs, action, reward, next_obs, done) goal_extractor: function (state) - goal feature transitions [] goals [] for obs, action, reward, next_obs, done in episode: transitions.append((obs, action, next_obs)) goals.append(goal_extractor(next_obs)) # 原始目标经验入池 for t, (obs, action, next_obs) in enumerate(transitions): self.buffer.append({ obs: obs, action: action, reward: 0.0, next_obs: next_obs, goal: goal_extractor(obs) # 或者使用 episode 的真实目标按需调整 }) # future 策略重标注 T len(transitions) for t in range(T): obs, action, next_obs transitions[t] horizon min(T, t self.k 1) if self.her_strategy future: candidate_indices list(range(t 1, horizon)) elif self.her_strategy final: candidate_indices [T - 1] else: candidate_indices list(range(T)) if not candidate_indices: continue chosen np.random.choice(candidate_indices, sizemin(1, len(candidate_indices))) for idx in chosen: g_prime goals[idx] new_reward 0.0 if next_obs g_prime else -1.0 self.buffer.append({ obs: obs, action: action, reward: new_reward, next_obs: next_obs, goal: g_prime, })这段实现里有一个细节值得展开说goal_extractor函数是连接环境和 HER 的桥梁。在机械臂任务中它可能只是lambda state: state[achieved_goal]在更复杂的视觉任务中它可能是一整个特征提取网络。这个提取器选得好不好直接决定重标注的质量。目标空间的设计和特征提取我认为是 HER 实际落地中比算法参数更重要的部分。4. 什么场景效果显著什么场景别指望 HER4.1 效果突出的典型场景HER 最适合的任务有两个特征一是任务有明确的可描述目标二是目标是可观测或可从状态中提取的。这类任务非常多举几个我接触过的例子机械臂操作类任务是最典型的主场。推方块、抓取、放置、插孔这些任务目标都能用位置、姿态或相对关系描述。我去年的一个消融实验中在 FetchReach机械臂到达目标点任务上DDPG 原始版本训练 50 万步成功率不到 20%加上 HER 以后 30 万步就到了 90% 以上。差距就是这么明显。导航与探索类任务也不错。让机器人走到某个目标点目标就是二维坐标。HER 能帮助 agent 在稀疏奖励下学会从不同起点到达不同目标而不是只记住一条固定路径。多目标学习任务也受益明显。HER 天然适合多任务目标学习因为它能从一个轨迹里产生多个目标对应的经验。相当于同一份数据被反复利用了多次这大大提高了样本利用率。4.2 效果欠佳甚至无效的场景HER 不是万能药有几个场景要特别注意。第一类是目标空间极度庞大且高维的任务。比如目标是一整张图片。如果目标是 64x64x3 的像素状态重标注后作为 goal 的条件信息会让策略网络和价值网络的输入维度爆炸学习难度剧增。这种情况下一般需要先用表示学习把高维目标压缩成低维特征再做 HER。第二类是目标不可逆的任务。比如 agent 的状态只能单向变化像某些装配过程一旦螺钉拧过就不能退回来。HER 把“未来状态”作为目标但 agent 可能无法从当前状态反向操作到达那个未来状态这类经验是有误导性的。处理这类问题需要对动态模型有认识而不是盲目套 HER。第三类是纯竞争性对抗任务。比如下棋、打格斗游戏目标不是“达到某个状态”而是“击败对手”。HER 很难定义一个合适的重标注目标因为目标空间不是状态空间。这类任务更适合用 self-play 或 league training 一类方法。4.3 HER 与课程学习、奖励塑形的关系很多人在实际任务中不会只用一个技巧而是组合拳。HER 和课程学习是可以互补的。课程学习关心“从哪个起点开始学”HER 关心“如何从经验中提取信号”。你可以先用简单初始分布 HER 让 agent 学会基本技能然后逐渐把初始状态分布推到更难的位置同时保留 HER 的重新标注机制。Fetch 系列任务的标准做法其实就是这种组合。奖励塑形和 HER 之间有微妙的交互。如果你已经精心设计了稠密奖励HER 带来的额外收益会变小因为 agent 已经能从稠密奖励中获得信号了。反过来如果奖励特别稀疏HER 的效果会特别显著。实践中可以先用 HER 加简单 0/-1 奖励跑一遍如果收敛速度不满意再叠加最小程度的距离奖励。千万不要一上来就做一个又复杂又精密的奖励函数——那样既浪费精力又很难排查“到底是 HER 的问题还是奖励的问题”。4.4 目标条件价值函数与策略的耦合HER 还有一个潜在收益容易被忽略它让你自然获得一个目标条件的价值函数。这个价值函数不仅能评估“当前策略在某个目标下的表现”还能作为规划模块的输入。比如在多阶段任务中你可以用这个价值函数选择子目标或者用它做模型预测控制中的目标排序。这就把 HER 从“训练技巧”提升到了“决策基础设施”的层面。不过要注意目标条件 Q 函数对目标的泛化能力并不是无限的。如果训练时目标分布覆盖太窄评估新目标时 Q 值预测就会漂移。因此我建议在训练过程中尽量让采样的目标覆盖整个目标空间不要老是在同一个区域打转。5. 踩坑实录与排查技巧5.1 常见问题速查表这部分我直接按我实验中最常遇见的问题整理一个速查表。每一条都是真实踩过坑以后总结出来的。问题现象根本原因排查思路与解法训练刚开始 loss 就异常大目标空间未归一化Q 网络输入波动剧烈对状态和目标分别做标准化尤其注意目标各维度尺度是否一致成功率始终在随机水平附近徘徊重标注目标选择策略太弱如用了 random换 future 策略并调整 k 值到 4-8 之间训练上升后突然掉点replay buffer 中原始与重标注样本比例失衡降低 k 值或强制按固定比例混合两种样本agent 学会了“偷懒”策略目标定义有漏洞比如只学到达某个宽松区域重新定义目标提取器让目标更精确地反映任务本质future 重标注样本训练曲线抖动剧烈k 太大或抽取范围太宽混入过多低质量样本减小 k同时限制 future 采样的时间窗口长度状态空间与目标空间不一致导致学习受阻直接把完整状态当作目标使用用专用的 goal_extractor 提取目标特征而不是用原始状态离线评估效果好在线部署差训练时初始目标分布与测试分布不一致在训练循环中周期性地引入测试分布的目标样本目标条件网络欠拟合网络容量不够或目标特征对网络输入占比太低适当增大网络容量或在特征层面显式拼接目标向量这张表覆盖了我在实际调试中遇到的八成以上问题。前三条出现频率最高尤其是目标空间未归一化和 k 值设置不当。新手如果发现训练效果不好建议先对照这三条排查。5.2 目标空间归一化的具体做法目标空间归一化看起来小事实际操作有讲究。不能简单地把目标除以一个固定常数就完事。正确做法是先跑一段随机策略采集足够多的状态样本统计目标特征每一维的均值和方差然后做标准化。数据采集量不需要太大几千条随机状态就够用。为什么这个步骤重要因为目标条件网络要同时处理“当前状态特征”和“目标特征”两组输入。如果目标特征的尺度在 0.1 级别而状态特征在 1000 级别梯度更新会被状态特征支配目标条件的信息几乎传不进去。这就像两个人说话一个狂吼一个耳语神经网络只会学到那个狂吼的人。归一化之后还有一个工程细节归一化参数用什么时间的数据来统计我倾向于在训练初期固定下来不要在线更新。否则目标分布会随着训练漂移网络输入不稳定前期的学习成果会被打乱。或者你使用滑动平均但滑动窗口要尽量大保持统计稳定。5.3 奖励设计的“减法”哲学HER 让我养成了一个习惯做目标达成任务时先只给 0/-1 稀疏奖励别的什么都不加。你想HER 已经能把正样本比例提升这么大再去设计复杂的密集奖励反而容易引入噪声和局部最优。举个实际例子。我在某个任务里一开始写了三个奖励项距离奖励、平滑性惩罚、安全距离惩罚。结果 agent 学会了“待在原地不动”——因为这样可以同时满足距离项至少不恶化和平滑性惩罚最小。后来我把奖励全部删掉改用 HER 0/-1agent 在保持任务成功率的同时反而没有那些投机取巧的行为了。这段经历给我的教训是奖励设计的减法有时比加法更有效。你先让稀疏奖励 HER 跑出一个基线然后看这个基线在哪里不足再针对性地加一点奖励信号。这样的增量式设计逻辑比一开始就堆奖励函数要可控得多。5.4 可视化诊断技巧除了成功率还能看什么HER 训练过程有一点让新手困惑reward 曲线可能一直在 -1 附近徘徊看起来很绝望但成功率却已经在涨了。这是因为重标注样本的奖励自动变成了 0而采样时如果也采到了原始目标样本还是会得到 -1。不要只盯着平均奖励看这个指标在 HER 场景下特别容易误导人。我建议多看四个指标原始目标下的平均成功率主指标重标注目标的平均奖励反映 HER 样本的学习情况Q 值预测误差如果 Q loss 死活降不下来大概率是目标空间或网络结构有问题buffer 中正样本占比这个比例应当随着训练逐步上升如果正样本占比上升但原始目标成功率不变说明 agent 在学“走到任意状态”这个通用能力但还没有把通用能力转化为完成指定目标的能力。这时可以先检查探索噪声是否足够或者考虑在策略更新时加大对原始目标样本的权重。6. 冷思考HER 的局限与后续演进6.1 算法局限的根源HER 的成功建立在一个关键假设上目标可以事后从已发生的轨迹中提取。这个假设在很多实际任务里并不成立。先说一大类任务——对话系统。目标可能是“让用户感到满意”或“说服用户购买某产品”这是一个高度抽象的意图不是某个可观测状态。训练时你无法事后得知“哪种对话状态对应成功”也就无从重标注。再比如自动驾驶。目标“安全到达目的地”虽然状态可观测但重标注的意义不大。因为轨迹中经过的每个位置都可以作为目标但agent真正需要学习的是复杂交通语义下的决策策略而不是“到达某个坐标”这种几何目标。HER 在这类任务上几乎没有贡献因为它解决的是“目标明确但信号稀疏”的问题而不是“目标本身很难定义”的问题。6.2 和表示学习结合的扩展思路既然原始状态空间不适合直接做目标重标注一个自然的方向是用表示学习把高维状态压缩到语义清晰的低维空间再在这个空间里做 HER。这类方法在机器人视觉抓取任务里有不少成功案例先用自监督学习把图片编码为关键点坐标然后以关键点坐标为目标执行 HER。这样既保留了 HER 在稀疏奖励下的能力又避开了高维目标带来的学习困难。另一个方向是学习一个逆动力学模型用当前状态和目标状态的差分来预测动作通过这种“目标条件动作预测”来辅助策略学习。这类方法可以作为 HER 的协同组件进一步提升目标达成能力。6.3 与离线强化学习的结合点现代离线强化学习经常用到 HER 的思路。当数据集是从某个固定策略收集来的轨迹时这些轨迹大概率没有达成人们想要的最终目标。但通过 HER 重标注离线数据集里的轨迹也能被重新“定向”变成针对不同目标的有用经验。这给离线强化学习带来了一个额外好处目标条件的离线数据集能够训练出一个可以泛化到多个目标的价值函数。当智能体在测试环境里面对一个新目标时它可以依据这个目标条件价值函数做行为选择即使这个目标在训练数据里从未出现过但只要目标空间内的特征分布有覆盖泛化是可能的。当然离线数据里的动作覆盖是有限的HER 不会创造“没有做过的动作”。它只能重定义目标不能重定义行为。这个边界要想清楚否则容易高估 HER 在离线场景下的作用。6.4 给探索机制带来什么新视角HER 在一定程度上替代了“探索”的角色。传统稀疏奖励任务里agent 需要靠探索去碰到罕见正样本而 HER 让每一条轨迹都能创造正样本exploration 的压力变小了。但这也会引发一个新问题agent 会不会变得“满足于随便走走”而不是执着地追求原始目标理论上看因为 buffer 里始终保留了一部分原始目标经验agent 不会完全忘记原始任务。但实践中如果 k 太大原始目标经验占比过小确实可能出现“学会了各种状态到达能力但就是不关注指定目标”的情况。对策其实很简单——在采样时做分层一半样本来自原始目标经验一半来自重标注经验。这算是我在实践中最常用也最有效的干预手段。我个人现在做目标达成类任务时默认会先上一套 HER 作为 baseline再根据任务特性决定要不要叠加其他机制。它不复杂实现成本低带来的收益却经常超出预期。踩过几次坑之后我越来越习惯先跑“稀疏奖励 HER 简单归一化”这个最小配置再逐步加东西。很多看似需要复杂奖励设计的问题用这个最简配置就能得到一个还不错的起点。希望这篇文章能帮你在自己的任务里少走点弯路早点把“事后复盘”变成“有效训练”。
返回列表