ARTICLE DETAIL

资讯详情

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

HER算法详解:如何用事后经验回放解决稀疏奖励难题

HER算法详解:如何用事后经验回放解决稀疏奖励难题 1. 项目概述与核心需求解析1.1 Hindsight Experience Replay到底是什么先别急着看公式我先讲个场景。你教孩子投篮他第一次出手球偏了没进。你会怎么做大概率不是骂他一顿而是跟他说你刚才那个动作其实挺接近的如果手腕再压一点就进了。注意这里有个微妙但极其重要的操作——你把一个失败的结果重新解释成一个离成功更近的结果然后从这个失败里提炼出了可以改进的信息。Hindsight Experience Replay以下简称HER干的事就是这个只不过它教的不是孩子投篮而是机器人抓取、推箱子、组装零件这类操作任务。HER是强化学习领域里一个非常经典且实用的算法由OpenAI在2017年前后提出论文名字叫Hindsight Experience Replay作者包括Andrychowicz、Wolski、Ray等人。它解决的核心问题是在稀疏奖励sparse reward环境下机器人做操作任务时几乎拿不到任何中间奖励导致强化学习智能体完全无法学会东西。想象一下一个机械臂要抓取一个杯子它试了1000次一次都没抓中环境给的奖励永远是0那这个智能体的策略网络根本不知道该往哪个方向调参数。HER的思路很直接既然真实目标太难那我把这次失败的实际结果当作一个替代目标让智能体从这个替代目标里学到一点东西。哪怕这次没抓到杯子但机械臂至少学会了一个动作——把手伸到了杯子旁边这个动作离成功已经很近了。HER会把这个实际到达的位置重新标记成一个目标然后告诉智能体你刚才试图完成的任务我们重新定义为把手移动到杯子旁边恭喜你你完成了。这篇文章就是围绕HER做一次完整拆解从它解决的问题、核心公式、实现细节到机器人操作仿真环境里的真实效果再到我自己调试时踩过的坑。适合正在入门强化学习、或者已经在跑机器人操作任务但对HER理解还不够深的读者。1.2 机器人操作任务与稀疏奖励的死结机器人操作任务英文叫robot manipulation常见的形式有推箱子pushing、滑动物体sliding、抓取picking、放置placing、组装assembly等。这类任务天然带有几个特点高维度状态空间比如关节角度、物体位置、接触力、连续动作空间比如关节力矩或期望关节位置、以及最重要的——目标往往是一个精确到具体坐标的位姿。举个例子Fetch机器人推箱子任务里目标是把一个箱子推到桌面上的一个指定位置这个位置的容差通常是5厘米左右。如果箱子最终位置距离目标超过5厘米奖励就是-1只有落在容差范围内奖励才变成0。这听起来合理但问题是箱子的初始位置是固定的目标位置是随机采样的机械臂靠随机探索推到指定位置的概率低到可以忽略不计。我算过一笔账如果桌面是40厘米乘40厘米的区域目标容差是5厘米那么随机推一次箱子恰好停在目标区的概率大概只有1.6%左右。这还是一次成功的情况而整个训练过程中需要成千上万次成功才能收敛纯靠探索基本上是天文数字。更麻烦的是这类任务里如果不用HER这种事后重新标注目标的思路最常见的解决办法是手动设计稠密奖励函数。比如根据机械臂末端和目标的欧几里得距离给一个连续的负奖励距离每减小1厘米奖励增加一点。听起来可行但实际操作过的人都知道这类reward shaping太容易出问题奖励函数设计得不好智能体可能学会一些投机取巧的行为比如机械臂直接绕到箱子后面推或者故意把箱子推到某个中间位置蹭奖励而不是真正完成最终目标。HER最大的优势就是可以不用设计这些繁琐且脆弱的稠密奖励让奖励保持稀疏但通过反思失败的方式让样本效率大幅提升。2. HER算法核心原理与设计思路2.1 为什么事后经验回放有效目标重标注的哲学HER不是改变探索策略也不是改变奖励函数而是改变经验回放时的数据增强方式这一点很多初学者会搞混。标准的强化学习流程是智能体在环境里执行动作收集轨迹state, action, reward, next_state存进经验回放池然后从中采样小批量数据更新策略。这里面最关键的是reward这一项它由环境根据真实目标给出。但在HER里每一条轨迹除了用真实目标算一遍奖励之外还会额外生成几条假想轨迹这些假想轨迹的目标不是原本的真实目标而是这条轨迹在某个时刻实际到达的状态。为什么这样做有效我在理解这个问题时用过下面这个类比你让一个学生做一道高难度的数学竞赛题他做不出来但如果把这道题换成把已知条件抄一遍他肯定能得满分。HER做的事就是在考试之后把试卷改一改把不会做的难题换成他已经做出来的题然后告诉他这题你做对了让他在心理上获得一次成功的经验。虽然他没有学会解原来的难题但他对如何下笔有了更好的感觉。类似地机械臂虽然没有学会精确地把箱子推到目标点但它学会了把箱子推到某个位置这个动作本身而这个动作经验对完成真实目标是有用的。这里需要强调一个关键点HER不是直接把这条失败轨迹的奖励改成正的而是换一个目标重新计算奖励。原目标下这条轨迹的奖励可能是-1但如果把目标换成轨迹末尾箱子实际所在的位置那么奖励就变成0而且这条轨迹就成为一个成功轨迹。这个成功轨迹虽然对应的不是真实目标但它能让智能体学习到一个重要的映射关系当目标状态和当前状态一致时应该输出什么样的动作来保持这个状态或者接近这个状态。这在多目标强化学任务里非常有用因为智能体学到的其实是一个目标条件策略goal-conditioned policy输入是当前状态和目标状态输出是动作它天然就具备泛化能力。2.2 目标条件策略网络与状态拼接HER通常搭配的策略网络不是普通的DQN或者DDPG而是目标条件策略。以机器人操作最常用的DDPGDeep Deterministic Policy Gradient为例它的actor网络输入不再是单纯的状态s而是把状态s和当前目标g拼接在一起输出的动作a用于在当前状态下趋向目标g。critic网络输入则是状态s、目标g和动作a输出对应的Q值。这个拼接方式在实际实现中有一点需要注意。如果状态和目标的维度不一样比如状态是包含机械臂关节角度的9维向量目标是物体位置的三维坐标直接拼接没有任何问题。但如果目标本身就是状态的一部分比如目标是在三维空间中的末端位置而状态里已经包含了当前末端位置那么拼接时实际上给网络提供了当前位置和目标位置两种信息网络能够更好地区分我已经在哪和我还需要去哪。在我自己实现的时候发现有时候把目标和状态拼接的顺序搞反会导致训练不稳定建议统一把目标拼接在状态后面并且处理好归一化范围否则状态和目标的数值尺度差太多网络初期很容易被大数值的特征主导。另外HER并不强制要求使用某一个特定的强化学习算法。理论上它可以和任何off-policy算法结合包括DQN、DDPG、TD3、SAC。但在机器人连续控制任务里主流选择还是DDPG、TD3和SAC。如果选DQN需要先把连续动作离散化这在机械臂控制里通常不是一个好主意因为动作维度高离散化后会造成维度爆炸。所以下面我讲的实现细节都以DDPG作为基础算法来展开但它完全可以平移到TD3和SAC上。2.3 四种目标重标注策略final/random/episode/futureHER里有一个重要设计是在现场执行完之后到底拿什么状态来作为假目标。论文里提出了四种策略我用实际效果和适用场景逐个说明。第一种是final策略。整条轨迹执行完后取最后一步的观测状态中的物体位置作为假目标。这是最简单也最常用的方式。它的好处是目标一定是真实可达的因为轨迹最后确实到达了这个位置所以不存在设置了智能体无论如何也达不到的目标这种问题。缺点是整条轨迹只产生一个假目标信息量有限。第二种是random策略。从轨迹中间随机抽取k个状态作为假目标。这样一条轨迹能产生k个假目标数据增广倍数更大。缺点是有可能抽到的状态对应的物体位置和目标差得很远学习效率相对低一些。第三种是episode策略也叫episode-based。它不是从当前这条轨迹里抽样而是从整个经验回放池中随机抽取k条过去的轨迹取它们末尾的物体位置作为假目标。这种做法的好处是目标多样性更高加入了其他场景的信息。但这也意味着目标回溯池需要足够大否则采样出来的目标同质化严重。我自己实测下来episode策略在小规模环境里效果和final差不多但训练早期有轻微的不稳定可能是因为目标分布变化太快导致策略网络适应不过来。第四种是future策略。它在当前轨迹结束后从当前时刻之后的未来轨迹中采样状态作为假目标。注意这里和episode策略的区别future只考虑当前轨迹之后发生的状态而episode允许从旧的轨迹中采样。future策略在论文的实验里表现最好尤其是在FetchReach、FetchPush这些任务上。它的逻辑是当前轨迹的末尾状态可能离轨迹中间状态很远而future采样的状态都和当前轨迹的时间线有关目标分布的平滑性更好。用一个表格来概括这四种策略的差异策略名称假目标来源每条轨迹生成假目标数优点缺点final当前轨迹末状态1简单、目标可达性高信息量较少random当前轨迹随机状态k数据增广倍数高目标分布可能较分散ep历史轨迹末状态k目标多样性高训练早期可能不稳定future当前轨迹未来状态k平滑性好、实验效果好需要额外的未来状态缓存在实际使用中如果你只是做一个快速验证先用final策略就够了。如果是正式实验推荐直接上future策略k值取4较为合适也就是说每条真实轨迹额外生成4条假目标轨迹。这个值不是拍脑袋定的论文里的消融实验证明了k4在多数任务上收益已经饱和再增大k带来的提升很小反而增加训练开销。3. HER在机器人操作任务中的实操实现3.1 环境选择OpenAI Gym Robotics全家桶HER的论文实验主要是在OpenAI Gym的Robotics系列环境上做的包含三个经典任务FetchReach、FetchPush、FetchSlide以及一个基于Shadow Dexterous Hand的HandReach任务。这些环境后来被整合到了gymnasium中但目前Robotics环境在gymnasium里的兼容性还有改动早期的gym版本更稳定。我在本地的实际配置是Python 3.8 gym 0.21 mujoco_py 2.1这套组合是我试下来跑官方代码最省心的。FetchReach是入门级任务机械臂需要把末端执行器移动到随机目标点。这个任务很简单用DDPG直接训练几个小时就能收敛不需要HER也能搞定但它适合用来验证代码框架是否正确。FetchPush是经典任务机械臂末端装有一个平板需要把桌子上的箱子推到目标位置。这个任务下DDPG不管怎么调参都很难学会加上HER之后成功率能显著提升。FetchSlide更有意思箱子初始位置离目标很远机械臂不能直接推过去必须先甩一下让箱子靠惯性滑动到目标附近这对在线规划能力要求更高也是HER展示实力的舞台。如果你不想折腾mujoco的依赖也可以用mujoco的playground或者url_benchmark等替代环境。但我的建议是如果你想复现论文里的效果还是老老实实用gym robotics环境。这倒不是说其他环境不好而是论文公开的baseline代码和结果都基于这套环境对比起来更方便。3.2 数据流轨迹采样、存储与重标注的完整链路HER的整个数据流我用一句话概括先正常跑一条轨迹然后在这条轨迹的基础上伪造出几条假想轨迹一起存进回放池。在这一小节我把每一步拆开讲。第一步采样初始状态和目标。环境会随机初始化一个状态s0包括机械臂的关节位置、物体的初始位置如果有的话然后随机采样一个目标g这个g可能是末端要到达的位置、箱子要到达的位置等。第二步执行轨迹。从策略网络输出一个动作作用到环境上得到下一个状态和奖励。重复直到达到最大步数或者任务完成。每个时间步的(状态s_t, 动作a_t, 奖励r_t, 下一个状态s_{t1}, 目标g, 完成标志done)都会被保存下来作为原始轨迹。第三步是关键HER的目标重标注。根据你选的策略final、future等为这条轨迹生成一个或者多个额外目标g。然后对每一个额外的目标重新计算整条轨迹上每个时间步的奖励r_t。如果新的目标g是这条轨迹末尾实际到达的状态那么最后一步的奖励就会变成0其他步的奖励按照环境定义的稀疏奖励逻辑一般也是0或者-1。这里注意重新计算奖励的时候必须按照环境自带的奖励函数来算而不是自己随便设一个否则就破坏了环境语义。第四步把原始轨迹和假想轨迹都存进经验回放池。原始的轨迹对应目标g假想轨迹对应目标g。之后训练时的采样过程完全一样从回放池里随机采样小批量数据算出TD误差更新critic和actor。关键的区别只在于回放池里的数据更多了而且更多样化了——它包含了大量成功轨迹虽然是假目标下的成功但对稳定训练至关重要。我画过一张数据流的时序图在纸上但说实话光看文字描述也可以理解。想看直观一点的可以去看OpenAI的baselines仓库里her/experiment.py的实现代码量不大逻辑很清晰。3.3 关键代码实现基于DDPG的HER训练框架这里我不贴完整源码而是把核心片段拆出来讲。先说明一下以下代码参考了OpenAI baselines里her的实现思路同时结合了我自己简化后的版本方便理解不保证能直接跑但核心逻辑是正确的。首先是经验回放池它需要支持存储包含目标的状态转移数据。我用一个简单的字典结构来组织class ReplayBuffer: def __init__(self, capacity): self.buffer deque(maxlencapacity) def push(self, transition): self.buffer.append(transition) def sample(self, batch_size): batch random.sample(self.buffer, batch_size) obs np.stack([t[obs] for t in batch]) next_obs np.stack([t[next_obs] for t in batch]) actions np.stack([t[action] for t in batch]) rewards np.stack([t[reward] for t in batch]) goals np.stack([t[goal] for t in batch]) dones np.stack([t[done] for t in batch]) return obs, actions, rewards, next_obs, goals, dones这条轨迹数据结构里有一个容易被忽视的点obs本身通常已经包含了当前物体位置等观测信息goal是单独存储的目标向量。在计算critic的输入时把obs和goal拼接起来形成条件输入。然后是核心的HER重标注逻辑。假设原始轨迹已经收集完我可以用以下伪代码来生final策略和future策略的假想目标# 假设episode是一个列表每个元素包含obs, action, reward, next_obs, done # episode的每个obs其实已经包含了当前物体位置 def her_relabel_final(episode, goal, reward_func): # 取最后一步next_obs中的物体位置 fake_goal episode[-1][next_obs][achieved_goal] new_episode [] for transition in episode: new_reward compute_reward(transition[next_obs][achieved_goal], fake_goal, None) transition[goal] fake_goal transition[reward] new_reward new_episode.append(transition) return new_episode def her_relabel_future(episode, goal, reward_func, k4): # 事先收集所有访问过的achieved_goal achieved_goals [transition[next_obs][achieved_goal] for transition in episode] new_episodes [] horizon len(episode) for _ in range(k): # 随机选择一个未来时刻 future_idx np.random.randint(0, horizon) fake_goal achieved_goals[future_idx] new_episode [] for transition in episode: new_reward compute_reward(transition[next_obs][achieved_goal], fake_goal, None) transition[goal] fake_goal transition[reward] new_reward new_episode.append(transition) new_episodes.append(new_episode) return new_episodes这里需要注意一个细节在FetchPush任务中achieved_goal通常直接取自obs里的物件位置字段也就是把机器人的观测空间拆成两部分——一部分是事实信息observation一部分是目标达成度信息achieved_goal。环境会显式返回achieved_goal这一点在gym robotics环境里已经定义好了不需要自己额外去猜。接下来就是DDPG的更新过程。critic网络的目标是拟合Q值actor网络的目标是最大化critic给出的Q值。在HER下训练数据的格式变成每个样本是(obs, action, reward, next_obs, goal, done)。计算critic的目标值时需要把next_obs和goal拼接起来作为target actor的输入def update_critic_and_actor(obs, actions, rewards, next_obs, goals, dones, gamma0.98, tau0.05): # 目标Q值计算 next_actions target_actor(next_obs, goals) target_q target_critic(next_obs, goals, next_actions) q_target rewards gamma * (1 - dones) * target_q # critic损失 current_q critic(obs, goals, actions) critic_loss MSELoss(current_q, q_target) # actor损失 actor_loss -critic(obs, goals, actor(obs, goals)).mean() # 更新网络 optimizer_critic.zero_grad() critic_loss.backward() optimizer_critic.step() # 软更新 soft_update(target_actor, actor, tau) soft_update(target_critic, critic, tau)从这段代码可以看出HER并没有改变DDPG的更新公式只是改变了训练数据中goal和reward的来源。很多人初学时会误以为HER需要额外的网络结构或者额外的损失函数其实不用它只是数据流的改造。3.4 参数选择与训练技巧我在fetch push上的实测我在FetchPush-v1环境上做过一组实验用来对比HER开和关的效果。基础配置是DDPGactor和critic都是两层256单元的MLP学习率1e-3批大小256折扣因子0.98目标网络软更新系数0.05动作噪声采用正态分布噪声标准差从0.2逐步衰减到0.05经验回放池容量100万条每次采样的未来目标数k4训练总步数100万。机器是单卡RTX 3080mujoco环境本身不太吃GPUCPU单核性能更关键。训练结果非常有意思。不加HER时整个训练过程中成功率几乎一直是0波动极小大概在1%以下。加上HER后前20万步看似也平平无奇成功率不足5%但20万步之后开始快速爬升到60万步左右成功率到了60%以上最终稳定在80%到90%之间。那条曲线看起来就像是一个阶梯——前期平台期中期快速上升后期饱和。这个平台期不是网络没在学习其实是在积累失败经验一旦数据池里包含足够多的高质量假目标轨迹策略就能快速改进。如果你看到训练曲线长时间不动不要急于调参先确认HER的重标注逻辑是否正确然后耐心等着。还有一个小细节HER对动作噪声的敏感度比我想象中高。噪声太小探索不足采集到的轨迹多样性差假目标也集中在少数位置噪声太大策略学习不稳定成功率波动剧烈。我的经验是前30万步用标准差0.2的噪声后面逐步衰减到0.05这样既保证了前期探索又不至于后期震荡。4. 实验效果、消融分析与应用边界4.1 成功率曲线与不同任务上的效果对比任务无HER的DDPG成功率HERDDPG成功率备注FetchReach约90%以上99%以上任务简单HER提升不明显FetchPush几乎为080%~90%HER带来本质性提升FetchSlide几乎为060%~70%需要滑行动作模型能力要求高HandReach低基本达到目标高维手部控制样本效率大幅提升这个表格基本还原了论文里的对比趋势。FetchReach不需要HER也能收敛因为目标点随机采样但机械臂天生的运动学精度足够让末端靠近目标只要探索步数够总能碰到奖励区。但FetchPush就完全不同了机械臂和箱子之间存在接触动力学推力方向稍有偏差箱子就会滑到另一个位置随机探索几乎不可能正好把箱子推到目标上。HER把每次失败都转成了推动箱子到当前位置的成功经验智能体才有机会学到推力方向控制。FetchSlide是一个更有挑战性的任务因为机械臂只能施加瞬时推力之后箱子的运动完全靠物理惯性。这意味着策略必须学会根据目标距离决定击打速度本质上是逆动力学学习。HER在这种情况下依然有效但成功率天花板低于FetchPush原因在于假目标通常选在轨迹中箱子实际经过的位置这些位置往往离真实目标分布不一致策略学到的是让箱子动起来的粗略经验精确的滑行距离控制还需要更多真实目标样本。除此以外把HER推广到真实机器人上时还有一个问题需要注意仿真环境提供完整的观测信息但真实机器人的物体位姿需要视觉估计误差会直接影响achieved_goal的准确度。如果物体位置估计偏差大于任务容差HER就失去了意义。这就引出了另一个研究方向——把HER和视觉感知结合但这已经明显超出了这一篇的讨论范围。4.2 有哪些任务不适合用HERHER并不是银弹在实际应用中有一些明显的边界条件我在这里梳理几类不适合的情况帮助大家避坑。第一类目标状态无法从观测中直接提取的任务。HER需要一个关键的achieved_goal——也就是当前状态实际达到了什么目标。在机器人操作里这通常就是物体位置或者末端位置相对容易提取。但如果任务是把鸡蛋从桌上拿起而不捏碎那实际达到的状态不仅包含位置还包含接触力、姿态、完整性等复杂信息很难定义一个通用的achieved_goal。这种情况下HER用起来就很别扭。第二类奖励函数已经是稠密且精确的任务。如果环境本身已经提供了很好的稠密奖励比如每个时间步都有距离惩罚那么引入HER只会增加额外计算成本收益却很小。我见过有人在这种环境里强行加HER结果发现训练速度反而更慢因为假目标会让价值函数学得混乱。你要判断的是当前环境是不是真的缺奖励而不是盲目给所有任务都套HER。第三类多智能体或者非目标条件任务。HER的核心依赖是目标条件策略如果你的环境里根本没有一个目标概念比如一局对抗游戏或者一个纯粹的导航任务没有明确目标HER就无从谈起。对于这类任务更合适的方向是探索策略优化和内在奖励设计。第四类在线策略算法。HER属于经验回放类算法天然依赖off-policy的采样方式。如果你用的是PPO、A2C这类on-policy算法不能直接使用HER因为重标注后的假目标轨迹样本分布与当前策略不一致强行混入会造成严重的分布偏移。如果非要用HER可以借用重要性采样进行修正但对大多数场景来说成本和收益不成比例。4.3 真实机器人部署时的额外考量很多人在仿真里跑通了HER就想着直接搬到真实机械臂上这一步往往会踩不少坑。仿真和现实的差距主要体现在三方面。首先是位姿估计问题。仿真环境里物体的位置直接可以从物理引擎里读取但真实世界必须依赖视觉或者力传感器来估计。如果你的视觉系统帧率不够高或者检测精度差了几厘米那HER生成的目标就是错误的学习出来的策略自然也不可用。我记得有位同行的做法是先单独调视觉模块做到物体检测的误差小于任务容差的一半然后再接HER训练这样至少能保证算法层面的可行性。其次是环境重置。仿真环境可以一键重置状态但真实世界里每次重置都要把机械臂、物体、相机恢复到初始状态耗时费力。实践中如果要做真实机器人训练往往不是从零开始用HER训练而是先在仿真里用HER学到一个初步策略然后利用域随机化domain randomization迁移到真实世界。HER在这里扮演的是让仿真策略更泛化的角色而不是直接应对真实环境的复杂性。最后是安全限制。真实机械臂探索时不能乱撞动作噪声也不能太大否则轻则磕碰伤机器重则伤人。这时候通常的做法是降低探索幅度或者干脆用学习好的策略加一小部分噪声来探索而不是完全随机。但这些操作都会削弱HER的优势——HER的精髓就是大量失败后的反思如果探索不足失败的多样性不够假目标也帮不上太多忙。所以真实部署很少单独依赖HER而是把它作为整个pipeline中的一个数据增强模块来使用。5. 常见问题与调试心得5.1 训练不收敛的常见原因排查在调试HER时我遇到过几次训练曲线一动不动的情况每次都花了挺长时间才定位到原因。这里写几个最典型的问题供你对照排查。第一个问题奖励函数重标注时使用了错误的achieved_goal。这种情况非常隐蔽。gym robotics环境返回的obs是一个字典里面包含observation、achieved_goal、desired_goal三个字段。很多初学者会把observation整个当成achieved_goal来用这就包含了机械臂关节角度等与目标无关的信息导致假目标维度正确但语义错误网络学到的是保持当前关节形态而不是到达某个位置。解决方法是在重标注前先用一个简单的测试打印一条轨迹的achieved_goal和desired_goal确认achieved_goal的变化趋势与物体运动一致。第二个问题动作噪声过大或过小。噪声过大时策略输出完全被噪声淹没智能体学不到动作与结果之间的关系。噪声过小时策略很容易陷入局部最优轨迹单调假目标重复度高。我的经验是先用固定标准差0.2跑20万步观察观察成功率是否有一点点上升趋势如果有就继续如果没有先检查奖励和achieved_goal是否正确而不是盲目调噪声。第三个问题HER的k值设置不合理。k太小假目标轨迹数量不够提升不明显。k太大回放池里假目标轨迹占比过高真实目标轨迹被稀释导致策略在真实目标上的性能下降。论文建议k4但对于复杂任务可以适当增大到8再往上就没有必要了。我遇到过设置k20的情况训练速度反而变慢就是因为假目标分布太宽泛价值函数被平均得太平滑。第四个问题目标归一化缺失。state和goal的数值尺度差异很大时网络输入分布不均匀训练前期特别容易震荡。以FetchPush为例机器人的关节角度范围在-2到2之间物体位置在0到3之间如果不做归一化网络倾向于只关注数值更大的物体位置特征。建议对状态、目标、动作都做合适的归一化或者至少对目标进行归一化一般情况下归一化后训练稳定性会有明显改善。5.2 her与sac、td3结合时的参数调整心得HER不只可以用在DDPG上和TD3、SAC结合时我也有一些实际经验。TD3和HER的组合是我最推荐的。TD3本身解决了DDPG的高估问题加上HER的假目标数据训练过程比DDPG稳定不少。在使用TD3时注意把actor的更新频率和噪声平滑参数保留默认值然后只需要调整目标策略平滑噪声的标准差我一般设0.2衰减到0.05。与DDPG相比TD3在FetchSlide上的成功率通常能多5到10个百分点原因是TD3对Q值估计更准确当假目标带来的奖励信号有噪声时更鲁棒的critic能更有效地利用这些数据。SAC和HER的组合则需要格外小心熵系数。SAC会自动调节温度参数来保持探索程度但HER在高维度假目标数据的加持下回放池的数据分布变化更快如果温度系数调节得太慢策略容易出现过早收敛调节太快又会导致动作过于随机机械臂在仿真里乱晃轨迹中假目标分布松散。我的实践做法是把SAC的初始熵系数设得比默认值小一些比如默认0.2改成0.1同时把学习率适当调低训练会更稳。不过这个调参方向需要结合具体任务验证不能一概而论。5.3 训练曲线的解读与判断标准看HER训练曲线时我会重点看三个时间段。第一阶段0到10万步通常是积累经验期。此时成功率曲线基本为0但回放池里假目标的构成比例在快速变化。你不需要太关注曲线本身而是看回放池里成功轨迹的比例是否在上升。如果这个比例一直不变说明重标注逻辑可能有问题。第二阶段10万到50万步是能力爆发期。成功率可能会突然从5%跳到50%以上这个过程非常快。如果出现这种陡峭的上升说明网络学会了泛化——它不再需要三分球每次都能投中而是学会了投篮的发力模式。如果曲线一直平滑但上升缓慢可以考虑加大动作噪声或者增大k值。第三阶段50万步之后是饱和期。成功率可能会在高位波动这是正常的因为每次训练都会重新采样目标成功率天然带有方差。如果曲线在高位震荡加剧可以降低噪声、减小学习率或者增加回放池容量让训练更稳定。最后再分享一个调试小技巧在训练过程中定期把actor网络输出的动作和随机动作一起可视化看看机械臂的运动是不是有明显的目标趋向性。如果随机动作下机械臂的运动轨迹杂乱无章而策略动作下已经能明显看到末端奔向目标说明HER正在起作用你可以放心等训练完成。如果策略动作和随机动作没有明显区别那问题通常出在数据层面而不是算法层面优先检查目标和achieved_goal的格式。
返回列表