1. 从"事后聪明"到强化学习:HER算法到底解决什么问题
1.1 人类与机器在"失败"上的认知差距
"hindsight"这个词,翻译过来就是"后见之明"。心理学里有个著名的"后见之明偏差",说的是人在事情发生后,总倾向于觉得自己"早就预料到了"——比赛赢了说早就看好这支队伍,项目失败了说早就感觉方向不对。这种偏差虽然影响了我们对自身判断力的客观评估,但它背后藏着一个极其有用的学习机制:人类天生就会从已经发生的结果反推"如果当初换个目标,这个结局就很好了"。
这个能力放到强化学习里,就是整个HER算法的灵魂。我在做机器人抓取任务的时候,第一次深刻体会到这件事——你让机械臂把一个方块从桌面上抓起来放到一个指定框里,它试了几万次都是失败的,99%的尝试里它连方块都没碰到。如果按传统的强化学习来训练,每一次失败得到的奖励都是-1或者0,算法根本不知道该往哪个方向调整参数,因为它拿到的反馈全部是"不行"。可人类教练在旁边看一眼就能说出很有价值的话:"虽然没放到框里,但这次你碰到了方块,这个进步方向是对的。"换句话说,人类能从失败里分辨出"部分成就",而标准强化学习算法只会冷酷地判它死刑。
这种"从失败结果中提取有价值信息"的能力,放在算法层面之前几乎没有被好好利用过。直到2017年OpenAI那篇《Hindsight Experience Replay》发表,才正式把这个思路变成了一个通用方法。论文标题就是在玩这个双关——hindsight既是"后见之明",又在算法上把"回顾已有经验"这件事做到了极致。我之前在项目里读这篇论文的时候就有种"原来还可以这样"的感觉,后来在多个仿真环境里复现它,又踩了不少坑,这篇博文就当作一次完整的经验梳理。
1.2 稀疏奖励:强化学习最让人头疼的困境之一
要理解HER的价值,得先理解强化学习在稀疏奖励场景下面临的绝境。所谓稀疏奖励,就是环境里绝大多数状态下你拿不到任何反馈信号,只有极少数特殊状态才有奖励。最典型的就是下围棋——棋盘上99%的落子位置不会立刻告诉你"这一步好不好",只有到了终局才知道输赢。机器人抓取也一样,目标位置和初始位置差着十几厘米,机械臂必须在三维空间里连续运动几十步才能碰到目标,中间任何一步走偏了,整个过程就废了,而环境给你的反馈永远是同一个数字:-1。
这种场景下,传统的基于策略梯度的算法会陷入"探索瘫痪"。因为奖励信号太稀疏,智能体随机探索一万步都未必能踩中一次正奖励,没有正奖励就没有梯度,没有梯度就更新不了网络,参数一直原地打转。很多人第一次跑这种任务时的体验是:训练曲线从头到尾就是一条水平线,loss不降,reward不变,像坏掉的血压计一样让人绝望。
你可能会想,那把奖励设计得稠密一点不就行了吗?比如用"当前机械臂末端到目标的欧氏距离"作为奖励。听起来合理,但实际做起来坑很多——距离奖励函数在靠近目标时梯度变化激烈,机械臂很容易在目标点附近来回震荡;而且距离函数设计稍有不慎就会诱导智能体学会"钻空子":不动手抓取,只把末端移到目标附近拿分。稠密奖励相当于给每个尝试都贴标签,但这个标签往往不够准确,反而引入了大量人为设计的偏差。HER走的是另一条路——先让智能体在稀疏奖励下随便探索,然后把失败的轨迹"重新解释"成对某个虚构目标的成功轨迹。
1.3 HER的核心思想:把失败经验改造成成功经验
HER的全称是Hindsight Experience Replay,直接翻译就是"后见之明经验回放"。它的核心操作可以概括成一句话:一条失败的轨迹,不是因为"轨迹本身没价值",而是因为"你拿错了评判标准"。
打个比方。你让一个人投篮,目标是把球投进左侧的篮筐。他投了十次,全部偏右。按正常逻辑,这十次都是失败,没有任何利用价值。但换个角度想:这十次投篮里,每一次都离"右侧某个位置"挺准的。如果你把目标改成"把球投到右侧那个位置",那这十次投篮里面至少有一两次算得上成功。于是你把这些"本来失败的经验"配上"右侧那个目标"重新存进记忆库,下次训练时告诉智能体:"看,这样做就能把球打到右侧,如果你想去右侧,这就是成功示范。"
HER做的事情就是这个。它在一条多步轨迹结束之后,取出轨迹中真实经历过的某个状态,把它当作"替代目标",然后用这个替代目标重新计算每一步的奖励,把一条全-1的失败轨迹变成一个包含0奖励的成功轨迹,丢进经验回放池。智能体下一次采样到这批数据时,看到的就是"朝着某个目标走,走对了,拿正反馈"——这就有了梯度,也就有了学习机会。
我第一次看到这个idea的时候确实很震撼,因为它从根本上重构了"经验"的定义。传统强化学习里,经验是关于"状态-动作-奖励"的静态记录;HER里,经验是一块可以"换个目标重新解释"的素材。这种思维转变直接影响了后面一大片goal-conditioned方法,直到今天它在机器人操作、导航、游戏AI里依然是被广泛使用的训练手段。
2. 吃透HER背后的算法原理
2.1 多目标视角:把Goal写进状态
想实现HER,第一步要改变的是对"策略"的理解。普通强化学习里,策略是π(a|s)——给定状态s,输出动作a。HER所在的领域叫goal-conditioned reinforcement learning,多目标条件强化学习,策略长成π(a|s, g)——给定状态s和目标g,输出动作a。
这里的目标g不是一个固定值,而是一组向量,和状态s一样是数字化的。以机器人抓取任务FetchReach为例,状态s是机械臂末端的三维坐标加关节角度等信息,目标g是"期望末端到达的位置",也是一个三维坐标。智能体的任务就是学习一个策略:不管g的数是多少,都能把末端移到对应位置。一旦写成这种形式,整个经验回放池里的每一条数据都可以被同一个策略复用——今天我们拿到的目标是左上角,明天换到右下角,网络照样能学,因为输入g的位置多了一维。
HER的精妙之处就在于,它盯上了经验样本里的g这一项。原始轨迹采集的时候,g是环境给我们设定的真实目标;但HER允许我们在训练时把这条轨迹的g替换成别的值,只要替换完之后的奖励也重新算过就行。这就是"hindsight"的字面实现——就像事后回想"如果当初目标是此刻的位置,那刚才那些动作就是对的"。
需要额外说明的是,状态空间和目标空间的维度可以不同,但它们之间存在某种映射关系。在OpenAI Gym的Fetch系列环境里,环境给你一个achieved_goal字段,表示当前智能体实际到达的位置,这个achieved_goal就是从环境中读取的"可达成目标"集合。HER在选取替代目标时,必须从achieved_goal里选,而不能随意构造一个不合物理规律的目标——这听起来是常识,实际操作中却经常被忽略,后面我会细说。
2.2 四种替代目标采样策略,为什么future是最优解
HER论文里给出了从一条轨迹中选取替代目标的四种策略,理解它们之间的差异,是做对参数调整的关键。
第一种叫final,是把整条轨迹最后一个状态当作替代目标。打个比方,一场足球比赛踢完,不管球最后滚到哪,这个位置就算是"目标",之前所有传球都理解为"为了把球送到终点而做的努力"。这种策略实现最简单,但在长轨迹里效果一般——因为最后一步离轨迹开头太远,前几分钟的动作和最终位置之间几乎没有因果关系。
第二种叫episode,是从同一轨迹里随机抽一个状态当目标。它的好处是增加了替代目标的多样性,不会永远只盯着终点看。
第三种叫future,是只从当前时间步之后的状态里抽一个当目标。论文里测试的效果最好,原因是它保持了时间上的连续性:某个时间步之后的动作,和这一时间步是否"朝某个目标前进"是有因果关系的。用生活类比就是,你只回看"决定要回家之后走的路",而不是把三小时前出门前的动作也归因为"为了回家"。因果关联越强,学习信号质量越高。
第四种叫random,是从整个经验池里随机采个状态当目标。它多样性最强,但和目标轨迹的相关性最弱,大多数情况下效果反而不如future。
我在实际项目里的实验结论和论文基本一致:future策略配一个80%的替代概率,在FetchReach和FetchPush任务上都稳定收敛。这里"80%的替代概率"指的是,每一条原始经验在存入回放池时,有80%的概率会额外生成一条带替代目标的新经验,同时保留20%的原始经验不动。有人图省事把替代概率设成100%,结果会让智能体彻底忘掉真实目标,训练出来的策略在原始目标上表现很差——这个坑我踩过一次,后面第4章专门讲。
四种策略的关键差异我整理成了表格,方便你直观对比:
| 策略 | 做法 | 优点 | 缺点 |
|---|---|---|---|
| final | 用轨迹最终状态当替代目标 | 实现简单,全局信息完整 | 轨迹太长时因果关联弱 |
| episode | 从整条轨迹随机抽状态 | 目标多样性好 | 可能选到因果无关的状态 |
| future | 从当前步之后随机抽状态 | 因果关联最强,实操效果好 | 实现稍微复杂 |
| random | 从回放池随机采样状态 | 多样性最高 | 相关性弱,训练效率不稳定 |
2.3 奖励重构与DDPG的Q函数更新
HER本身不是一个完整的强化学习算法,它更像是一套"经验预处理机制"。你需要把它挂在一个现成的强化学习算法上,最经典的搭档是DDPG(Deep Deterministic Policy Gradient)。原因也好理解:DDPG天生适合连续控制动作空间,机械臂那种"三维连续移动"的任务用DDPG最顺手。
以DDPG为例,训练时更新Critic网络的损失函数原本长这样:
L = E[(Q(s, a) - (r + γ Q'(s', a')))^2]这里r是环境给的真实奖励。引入HER之后,每条经验会被"重放"两次。第一次用它本来的目标g,奖励r原本是稀疏的;第二次把目标替换成g_her,并重新计算奖励r_her。这时候新的损失函数变成:
L_her = E[(Q(s, a) - (r_her + γ Q'(s', a')))^2]关键在于,替换目标并不意味着把真实目标给丢掉。实际操作里,一条经验会以原始目标存一份,再用替代目标存一份,回放池里这两种数据都有。网络既能学到"朝真实目标走的动作能得到什么反馈",也能从替代目标数据里学到"探索过程中哪些动作路径是物理可达的、有效的"。
这套双份数据机制的真正价值在于,它极大提高了经验回放池的样本效率。传统DDPG一次训练可能需要上百万步才学会一个简单抓取任务,加上HER之后,样本量需求可以降到原来的十分之一甚至更低。我自己跑下来的感受是,在FetchReach这种相对简单的任务上,不加HER要跑两三百万步才看到收敛趋势,加了HER五十万步左右就能达到接近满分的成功率。
3. 实操指南:从零跑通HER
3.1 环境选择:为什么拿FetchReach练手最合适
如果你打算自己复现HER,我的建议是不要一上来就上真实机器人,先在仿真环境里跑通。OpenAI Gym里的Fetch系列是当年论文里用的测试环境,一共有四个:FetchReach、FetchPush、FetchSlide和FetchPickAndPlace,按难度从低到高排列。
FetchReach是最简单的入门任务:一个七自由度机械臂,需要把末端执行器移动到空间中的一个目标点。目标点是随机生成的,动作空间是三维连续平移。这个环境里的奖励是稀疏的——只有末端和目标距离小于5厘米,才算成功,拿到0奖励;否则就是-1。难度低、错误定位容易,特别适合验证HER的代码实现是否正确。
FetchPush稍微难一点,机械臂需要把一个方块推到目标位置,这里面涉及和物体的物理接触,但还不需要抓取。FetchPickAndPlace则要完整经历"移动到物体上方、抓取、抬起来、放到目标位置"的全流程,是我当时项目里最接近真实机器人操作的仿真环境。跑完这四个环境的难度递增过程,你基本就能把握HER在不同任务特征下的表现了。
我建议的路径是:先在FetchReach上复现出收敛曲线,确认你的训练框架没问题;然后上FetchPush,体验一下有物体交互时替代目标怎么选;最后再冲FetchPickAndPlace,这个阶段你会真正理解"为什么稀疏奖励会让agent完全学不动,而HER能把轨迹里的每一步都利用起来"。
3.2 网络结构与核心超参数推荐
我用的训练框架是标准DDPG加HER,网络结构不花哨但很稳定。Actor和Critic都是三层全连接网络,隐藏层节点数分别是256、256,激活函数ReLU。Actor输出层是tanh,把动作限制在[-1, 1]区间,然后在环境里通过action_space将动作映射到实际物理范围。
我在多次实验后确定的一组超参数,放在这里供你参考:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 替代目标策略 | future | 论文推荐,实战验证 |
| her_rate | 0.8 | 80%经验用替代目标,20%保留原始 |
| 回放池容量 | 1e6 | 至少存50万条以上经验 |
| batch_size | 256 | 和回放池容量匹配 |
| Actor学习率 | 1e-3 | Adam优化器 |
| Critic学习率 | 1e-3 | Adam优化器 |
| 折扣因子 γ | 0.98 | 稀疏任务里适度调高 |
| Polyak系数 τ | 0.05 | 目标网络软更新速度 |
| 探索噪声 | 0.2 | 高斯噪声,动作上加一点随机 |
这里特别要说明一下为什么τ=0.05。Polyak系数控制的是目标网络参数向当前网络参数靠拢的速度,大了更新快但容易震荡,小了更新慢但稳定。HER因为会把替代目标经验生成出来,Critic在训练早期见过"成功样本"的频率比传统DDPG高很多,梯度变化更猛,所以我刻意把τ调低一点让目标网络变得慢一些,能有效防止Q值过早发散。这个参数在很多教程里都是默认的0.005或者0.05,具体到HER场景,我的体感是0.05比0.005收敛更快,但如果你发现训练后期Q值开始跳了,回头把τ降到0.01也是合理的。
3.3 一版完整的训练流程伪代码与解释
下面这段伪代码是我在项目中实际跑通HER的核心逻辑高度压缩后的版本。它不是完整的工程代码,但把HER最关键的处理流程都展示出来了,照着这个骨架往自己的代码里填,基本不会出大问题:
# 核心逻辑:HER经验生成 + DDPG更新 for episode in range(max_episodes): goal = env.sample_goal() # 采样一个真实目标 obs = env.reset() trajectory = [] # 存整条轨迹,用于HER for t in range(max_steps): action = actor(obs, goal) + noise # 探索动作 next_obs, reward, done, info = env.step(action) # obs包含observation、achieved_goal、desired_goal三个部分 trajectory.append((obs, action, reward, next_obs, goal)) obs = next_obs if done: break # HER:用future策略生成替代目标经验 for t, (obs, action, reward, next_obs, goal) in enumerate(trajectory): # 先存原始经验 replay_buffer.add((obs, action, reward, next_obs, goal)) # 以her_rate概率再存一条替代目标经验 if random.random() < her_rate: # future策略:从当前步之后随机选一个achieved_goal future_idx = random.randint(t, len(trajectory) - 1) her_goal = trajectory[future_idx][3]['achieved_goal'] her_reward = compute_sparse_reward(her_goal, next_obs['achieved_goal']) replay_buffer.add((obs, action, her_reward, next_obs, her_goal)) # 训练更新(每隔一定步数) if len(replay_buffer) > batch_size: for _ in range(num_updates): batch = replay_buffer.sample(batch_size) # 按DDPG方式更新Critic和Actor这段代码里有一个细节值得特别注意:compute_sparse_reward这个函数。标准的稀疏奖励定义是,如果替代目标和实际到达位置之间的距离小于阈值(比如FetchReach里的5cm),奖励为0,否则为-1。你可能会问,为什么"成功"的奖励是0而不是正数?这是稀疏奖励环境里常见的设定方式——每一步都给-1,成功的那一步拿到0,就相当于告诉智能体"少扣一分当奖励"。这样做的好处是奖励尺度稳定,不会因为目标距离远近不同而产生数值范围差异,DDPG这类算法学习起来更平稳。
还有一个改动思路值得一试:如果你觉得0/-1这种稀疏奖励在训练早期梯度信号还不够强,可以把成功判定阈值从5cm放宽到10cm。这样替代目标经验里"成功"的比例更高,训练曲线会更快抬起来。代价是策略的最终精度会受影响,所以建议前中期放宽促进探索,后期逐步收紧到原始阈值。这个"奖励松弛"技巧不属于官方论文内容,是我自己实验里的心得,后面章节会再说一次。
4. 真实训练中的踩坑记录与排查经验
4.1 Q值发散问题
我第一次在FetchPush上实验,训练到大概十几万步的时候,Critic的loss突然从个位数一路窜到几千上,整个训练曲线就像心电图室里的危急病人一样狂跳。这种情况在DDPG里常见,但在HER下出现的概率明显更高——原因是替代目标导致经验池里"成功样本"的比例大增,一个batch里Q值更新强度变大,网络没站稳就冲过了头。
我的排查顺序是:先看奖励数值有没有异常,再看回放池里是否混入了脏数据,最后才是调训练参数。如果奖励数值正常,那多半就是学习步长和目标网络更新速度匹配不上。解决方法有三个,按试用先后排列:把Critic学习率从1e-3降到3e-4;把τ从0.05降到0.01;如果再严重,就在Critic更新时给目标Q值加一个梯度裁剪,限制单次更新对Q网络的冲击幅度。大多数情况下,降低Critic学习率就能稳住。
4.2 目标空间处理不当导致替代目标无效
HER的替代目标来自轨迹中的achieved_goal,但这个值不一定总和环境允许的目标范围一致。比如Fetch环境中机械臂末端可能暂时移动到工作空间边界之外的混乱角落,如果原封不动把它当目标,策略更新时就会试着去学习一个"物理上根本不可能达到的目标",白白浪费梯度。
我当时的做法是在生成替代目标后加一个clip操作,把目标向量的每个维度约束到环境目标空间的合法范围内。这看起来只是增加了一行代码,但训练稳定性的提升是肉眼可见的。另外还要确认一点:achieved_goal和desired_goal的坐标系必须一致。Fetch环境里这两个向量本来同源,但如果你自定义环境,可能一个用了世界坐标另一个用了机械臂基座坐标,那HER生成的"目标"就会变成毫无意义的乱码。这部分排查起来最隐性,因为训练曲线不会立刻崩,只是收敛缓慢,容易让人误判成超参问题。
4.3 future策略实现里的隐藏细节
future策略本身实现不难,从当前时间步之后的状态里随机选一个就行。真正需要小心的是"当前时间步之后"这个区间在边界时的行为。轨迹末尾的几个时间步,可选的future状态很少,最后一步甚至只能选自己——替代目标等于原始目标,HER直接退化成普通经验。这意味着轨迹末尾的部分经验没有真正享受到HER带来的信息增益。
我的处理方式是,设定一个"最小future窗口长度"。比如轨迹长度是50步,时间步45之后就不再生成替代目标经验,直接保留原始经验。这个窗口虽然只影响每轮的最后几步,但累积下来对数据的多样性影响不小。论文里没有细说这个边界细节,网上开源的实现里也很少有人注意,属于那种你不去比对实验就永远发现不了的隐性因素。
4.4 经验回放池的维护教训
HER会大幅提高经验池里成功经验的比例,这本是好事,但如果管理不当就会变成另一种问题。我有一段时间发现,训练中期成功率到了70%左右就再也上不去了,怎么调参都突破不了。后来分析回放池里数据分布才发现:因为HER用future策略生成的替代目标经验实在太多了,回放池里"成功经验"占了绝对优势,原始目标经验的比例低得可怜,策略被带偏成"只朝着附近目标移动",缺少远距离目标下的尝试。
解决这个问题有三个思路。第一个是控制her_rate,不要超过0.8,保留至少20%原始经验。第二个是对目标距离做分层采样,让回放池里近目标经验和远目标经验的比例维持在一个均衡值附近,不要让近目标的成功经验淹没远目标的稀疏经验。第三个是定期重置回放池,训练到一定阶段后把太老的经验清出去,避免旧目标分布和新目标分布差异过大时网络被互相矛盾的样本干扰。第一和第三个我都实测过,都有明显的平滑效果。
我把这些坑整理成一个速查表,方便遇到问题时对照:
| 现象 | 可能原因 | 解决方式 |
|---|---|---|
| Q值/loss突然发散 | 学习率过高或τ太大 | 降Critic学习率至3e-4,τ降到0.01 |
| 训练中期停滞在某个成功率 | 替代目标经验过多,原始目标被淹没 | her_rate降到0.6-0.8,分层采样 |
| 替代目标物理不可达 | 目标未做clip或坐标系不一致 | 检查目标空间边界并clip |
| future策略在轨迹末尾失效 | 末尾可选future状态太少 | 设置最小future窗口长度 |
| 原始目标成功率反而低 | her_rate设成1.0,忘记保留原始经验 | 每次采样时保留至少20%原始数据 |
5. 应用边界与后续扩展方向
5.1 适合HER的任务特征
经过这些实验,我个人对"什么样的任务适合用HER"有了一个更清醒的判断。不是说所有稀疏奖励问题都能用HER一键解决,它有自己的适用边界。
HER真正擅长的是那些"目标状态可以用向量描述,并且智能体在探索时大概率能触达某些有意义状态"的任务。机器人操作是最典型的场景——物体在空间里有明确坐标,探索中即使没放到目标位置,也可能推到了别处,这个"别处"依然是个有物理意义的位置。反过来,像下围棋这种"目标状态是什么"本身难以用连续向量定义的任务,HER就完全用不上,因为一局结束后的终局状态和"我们希望达成的胜局"之间,没有一个清晰的连续距离度量。
另外,轨迹长度也是一个重要约束。HER依赖轨迹中采样替代目标的因果性,如果一条轨迹长达几千步,早期动作和后期状态之间的因果关系会被稀释,替代目标经验的学习信号质量就变差。我实测下来,轨迹长度控制在50到200步范围内效果最好,超过500步的稀疏奖励任务,最好还是配合状态抽象或者时序抽象手段先把问题拆小,不要指望只靠HER硬解。
5.2 从HER到HGG:算法演进
HER提出了"把失败轨迹重新解释成成功轨迹"这个思路之后,后面有不少工作沿着这个方向继续挖。其中有一个Hindsight Goal Generation值得关注,它更进一步,不光从已有轨迹里找替代目标,还主动生成一系列难度递进的目标来引导训练。这就好比学跳高,HER看到你跳到1米2,就告诉你"你能跳1米2,这是个好成绩";HGG则会给你布置一个1米25的目标,等你跳过去了再给你加高一点。
这种"课程化"思路对训练效率的提升非常明显。我在实际任务里也试过类似的变体,做法是:开始训练时把成功判定的距离阈值放宽到15cm,当成功率超过60%后收紧到10cm,然后再到5cm。这种"阈值退火"方式和HGG的核心精神一致,实现成本很低,但收敛速度比固定阈值快了一倍以上。如果你不想引入复杂的目标生成网络,这条工程化的路径是性价比极高的折中方案。
5.3 还能怎么玩:机器人、导航与多任务
HER在真实工业界项目里的应用,我身边能看到的至少有这几个方向。一个自然是机械臂操作,比如分拣线上的"抓取-放置"任务,仓库里把不同商品放到对应料箱,目标基本都是空间坐标形式,HER可以大幅减少人工设计奖励函数的工作量。另一个是室内导航,移动机器人从一个房间走到另一个房间,目标是一个目标点坐标,机器人即便走错了路线到达了错误的房间,这条路线的运动学经验在HER下依然能用于学习"如何到达类似空间位置"。第三个是多任务机械臂,把"抓取红色方块"和"抓取蓝色方块"统一成一个以物体颜色为条件的目标描述,HER的经验复用能力在这里能体现出巨大的样本节省优势。
第2节刚开始的时候我们提到,HER不是一个独立的算法,它是DDPG等基础算法的"经验预处理层"。这一点在工程落地上非常重要。你完全可以把HER和SAC、TD3等更现代的连续控制算法组合在一起用,只需要保证这些算法拥有经验回放机制,并且支持以目标为条件输入策略。从我实验的结果来看,TD3加HER在训练稳定性上比DDPG加HER更好,SAC加HER的探索能力更强但超参更敏感。如果项目对样本效率要求极高,我会首选TD3加HER;如果任务探索难度大,SAC加HER更合适。
我在实际项目里跑过二十多个版本的HER变体配置,有一个体会特别深:这个算法最大的价值不在于它的代码实现有多复杂,而在于它改变了你对"失败"这个概念的工程态度。稀疏奖励任务里,失败从来不是噪音,而是信息,只是需要换一套解码方式。当你把hindsight从心理学名词变成训练方法论之后,很多原本"学不会"的机器人任务就会打开一个突破口。
最后分享一个调参小技巧。如果你在某个新环境上第一次跑HER,不确定参数是否合适,先不要把全套训练跑完,就让它跑十万步,然后把训练曲线拉出来看两件事:一是替代目标经验的平均奖励是不是明显高于原始经验,如果差不多,说明替代目标选得有问题,优先检查achieved_goal的坐标;二是原始目标成功率有没有启动上升趋势,如果十万步了还在原地趴着,先试把成功判定的距离阈值放宽一倍。这两招能帮你省掉大量盲目排障的时间。HER是个好算法,但真正让它起作用的,还是细节里那些不断调整的过程。