ARTICLE DETAIL

资讯详情

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

后见经验回放HER:破解稀疏奖励的强化学习实践

后见经验回放HER:破解稀疏奖励的强化学习实践 1. 为什么说后见之明是强化学习的一剂解药“hindsight”这词如果直译就是“事后聪明”。放到强化学习领域它对应的就是那篇在ICLR 2019拿到Oral的著名论文Hindsight Experience Replay后见经验回放作者是OpenAI的Marcin Andrychowicz等人。我最早听到这个名字是在一个机器人抓取项目的调参现场——模型在稀疏奖励环境里死活不收敛训练了一晚上成功率还是0%。后来换了HER半小时就能看见策略开始出现东西了。当时我就觉得这技术绝不只是“换个奖励函数”那么简单它本质上是改变了对强化学习“失败经验”的理解方式。先讲清楚HER解决的问题是啥。我们平时训练一个策略智能体最常见的困境是“奖励太稀疏”。什么叫稀疏奖励就是整个试错过程里绝大多数动作都拿不到任何正向反馈。比如机械臂要从桌面抓起方块放进碗里动作空间是N维的碰巧抓对位置的概率低到可以忽略中间几乎没有中间奖励信号智能体学不到东西一直随机乱撞。传统做法是设计奖励塑形把大任务拆成子目标每完成一小步给一点分。但奖励塑形有个很头疼的问题人为定义的奖励函数往往蕴含了错误偏好会让智能体钻空子。你奖励它靠近物体它就学会了原地不动地“靠近”而不是真正抓起来这在真实工业场景里是致命的。HER的切入角度非常妙与其设计复杂的奖励函数不如把“没完成的目标”重新定义成“已经达成的目标”。就好比你本来想教机器人把一个红色方块放到左侧托盘它把红方块拿到了右侧。按常规逻辑这是个失败轨迹扔进垃圾桶。但HER会想右侧这个位置不是没有任何意义我们可以把“目标”从“放在左侧”改成“放在右侧”这样这条轨迹就成了成功样本。于是每一个原本失败的探索都变成了对策略有价值的教学样例。这个思路看似简单但真正落地的时候牵扯到目标空间的构造、采样策略、网络结构匹配、环境适配等一系列工程问题。反正我自己体会下来HER适合的受众很广你如果正在跑机器人控制、任务规划、游戏策略又经常卡在“模型不学”“loss不降”这种处境可以专门花半天时间把HER这套机制吃透。它不能解决所有稀疏奖励问题但在目标可定义的环境里效果提升往往是数量级的。这篇文章我会从数学原理、采样策略、代码实现、训练参数、踩坑记录几个角度把HER揉碎了讲清楚全程只讲实操不讲虚的。2. HER的核心机制目标重标记如何把失败变成教材2.1 从“奖励函数”到“目标空间”的思维转变先看看标准强化学习的建模方式。智能体在状态空间里和环境交互每一步得到一个奖励r目标是最大化累计奖励。在稀疏奖励场景下我们通常定义一个二元奖励如果达成了目标就1否则给0或者-1。于是整个训练过程普遍是这样的前几百个episode里智能体因为探索不充分几乎所有回报都是0。无论哪个算法——DQN、DDPG、PPO——在这样几乎全零的奖励流里都很难学习因为梯度要么消失要么完全由噪声主导。HER把问题视角从“奖励”切换到了“目标”。学术一点的表述是我们将环境形式化为一个目标条件强化学习问题每个episode不仅有一个状态转移序列还有一个“目标描述”。此时奖励函数可以写成 r(s, a, g)其中g是目标。训练的目标是让策略在给定目标g的情况下采取正确的动作序列。HER的关键动作发生在采样阶段当一条episode的结果没达到原定目标g时我们把这个episode拿出来重新选定一个实际上达成过的状态作为“新目标”改写这条轨迹的目标标签然后像“成功经验”一样存进经验池。举个例子。比如我们搞一个简单的二维点导航任务起点是(0,0)目标是(10,10)。智能体跑了一圈最终停在(3,4)。常规做法这个episode的奖励全是0没有学习价值。HER的做法把目标改写成(3,4)这条轨迹最后确实“到达”了(3,4)所以对“以(3,4)为目标”这个条件策略来说它是一条正样本。经验池里存下来的是 (状态序列, 动作序列, 新目标, 最后一步奖励为1) 的完整数据。多次试错之后经验池里会积累大量“虽然没有跑到指定终点但到过各种各样地方”的“伪成功轨迹”。如果你用过传统的经验回放Experience Replay会觉得这件事非常反直觉——我们不是应该只保留高质量数据吗拿没完成任务的轨迹训练不会带歪策略吗但仔细推敲你会发现HER并没有改变数据的基本结构状态、动作、新目标、奖励四个要素依然自洽。它们的自洽性来自奖励函数的构造方式——只要目标是轨迹中真实达成的状态奖励为1就是事实这比任何人工塑形都可靠。2.2 达成目标与观察目标HER里的两种目标表达虽然重标记思想很直观但工程实现的时候首先得弄清楚“目标”长什么样。HER论文里把目标的形式分成了两种达成目标achieved goal和观察目标desired goal。观察目标desired goal你希望智能体达成的目标是任务定义的一部分。比如抓取任务里目标就是“红色方块到达左托盘”。达成目标achieved goal智能体在当前时刻实际达成的状态是可观测的。比如“红色方块现在在右侧托盘的某个坐标”。在训练时策略网络输入的是状态和目标的组合比如拼接向量而HER重标记的实质就是替换掉desired goal——先用原始目标跑完一个episode然后挑一个episode中出现过的achieved goal作为新的desired goal再用这个新目标重新给整条轨迹算一遍奖励。这里有个重要细节新的目标必须来自同一轨迹的状态不能从外部随便采样否则状态转移和目标的组合可能不成立数据就失真了。更抽象一点说HER重标记其实是在构造一个“映射”把从同一轨迹中提取的一个实际状态当作原本就应该去追寻的目标。这个过程中奖励函数 r(s,a,g) 被重新评估原来全0的轨迹变得含金量极高——每个时刻都有了对应的正零奖励信号。这正好解决稀疏奖励下“采样效率过低”的恶性循环。2.3 四种经典重标记采样策略目标重标记的具体实现落到采样策略上HER在论文里给出了四个选项。我在实际工程中把这四个选项都跑过各有适用场景这里直接给结论和对比策略名称采样方式优点适用场景final只使用整个episode的最终状态作为新目标最少篡改原始轨迹意图近似于“任务最终状态”终点状态有明确语义的任务比如导航到位、物体接触future从当前时间步之后的未来状态中随机采样k个目标和状态在时间上更一致训练稳定性最高大多数连续控制任务推荐默认选项episode从整个episode的状态中随机采样k个探索分布更广经验池多样性更好目标空间大且复杂、单episode不够长的场景random从经验池中随机采样其他episode的k个状态完全解耦时间关联极端情况下也能覆盖几乎是备选方案很少单独用常与future混合这里的k一般取4。论文里future策略效果最好原因很直观目标与当前时间步状态之间的关联性强重标记后的轨迹“看起来”更像是一条有意完成某目标的过程。比如机械臂在120步里从初始位置出发如果选取第100步的真实状态作为目标那最后几十步是“真的在接近目标”的经验池里的数据时序关系清晰。相比之下random策略虽然增加了覆盖但常常把一段本来前后连贯的运动标成“拼凑的巧合”这对学习动态模型非常不利。2.4 为什么HER能打破稀疏奖励的“死锁”这里我想展开说一下为什么HER在数学上是“稳”的。在稀疏奖励下普通DQN/DDPG类算法依赖的策略梯度估计本质是采样奖励与动作之间的相关性。当几乎所有奖励都为零时即使有微小噪声Q网络也学不到有区分度的值。HER通过重标记把大量“伪成功”样本注入经验池相当于给这些算法提供了一批标签不为零的有效回归目标。归纳起来HER的增益体现在三个层面增加正样本密度原本1000条轨迹可能只有1条成功重标记后可以造出几十条“正样本”Q函数的回归目标变得有区分度。降低梯度方差更多的非零奖励样本直接拉低了TD误差估计的方差训练曲线更容易稳定下降。利用轨迹的自身结构一条失败的机械臂轨迹虽然不符合指定目标但在运动学上完全合理——它是在探索边界内的合法过渡。把这些合理过渡用目标条件方式学习等于在无监督地建立“状态—动作”动态模型后续对真正目标的搜索变得更容易。当然也有代价重标记过的轨迹并不是“真实达成指定目标”的样本它的语义是“如果目标是当前到达状态则这是一条成功轨迹”。这种语义转换如果使用不当会让策略把同一组动作错误地泛化到相似但不完全等价的目标上。这也是为什么目标空间的选择、状态表示的质量在HER里比一般算法更影响效果。3. HER实战落地从环境建模到训练调参的完整指南3.1 环境适配什么任务可以用HER什么任务最好别碰HER不是万能药。我先说筛选标准任务必须存在“可分解且可观测的达成目标”。三个条件目标空间里的元素必须是可观测状态函数重标记后要能找到一组合法的“伪目标”训练时策略网络必须能接收目标作为输入。三个条件缺一就别硬套HER。推荐使用的场景包括机械臂抓取、推箱、搬运类任务Fetch环境是HER的经典testbed二维/三维导航、点到点移动需要精确到达目标位姿的装配类任务只要位姿可观测游戏里需要“到达区域”的长视野任务不建议硬套的场景Chess、Go这类策略对抗性极强的游戏目标不可观测奖励本身有丰富连续结构的任务比如轨迹跟踪误差已经是平滑信号了HER收益不大目标空间维度极高且离散不可枚举的任务重标记目标分布极难覆盖实操中我曾试过一个抓取环境初始状态的目标是一个复杂3D位姿而机械臂末端实际到达位姿和观测位姿之间存在较大噪声。直接用原始位姿态做重标记效果很差。后来我换成了“目标表示为末端坐标的局部子集”只重标记位置部分、忽略旋转部分训练稳定性立刻上来了。这说明在工程里对目标空间做“降维或局部抽象”往往比在算法层面做更多功夫更有效。3.2 代码框架用PyTorch从零实现HER的核心模块很多文章会直接推荐用现成库比如stable-baselines3内置了HER但如果你想真正理解原理并把它移植到自定义环境里还是建议自己写一遍核心模块。下面是我实现HER时的核心片段只保留了replay buffer重标记的关键部分。import numpy as np import random class HindsightReplayBuffer: def __init__(self, capacity, k_future4, strategyfuture): self.capacity capacity self.k_future k_future self.strategy strategy self.buffer [] self.position 0 def push_episode(self, episode): # episode: dict, 包含 states, actions, achieved_goals, desired_goal, rewards, dones # 原始轨迹先入缓存不做处理 for i in range(len(episode[rewards])): transition ( episode[states][i], episode[actions][i], episode[desired_goal], episode[achieved_goals][i], episode[rewards][i], episode[dones][i], ) if len(self.buffer) self.capacity: self.buffer.append(transition) else: self.buffer[self.position] transition self.position (self.position 1) % self.capacity # HER核心额外生成k_future条重标记样本 if self.strategy future: future_indices range(i 1, len(episode[states])) if len(future_indices) 0: sampled_indices random.sample( list(future_indices), min(self.k_future, len(future_indices)) ) for j in sampled_indices: new_goal episode[achieved_goals][j] new_reward compute_reward( episode[achieved_goals][i], new_goal, episode[reward_sparse] ) her_sample ( episode[states][i], episode[actions][i], new_goal, episode[achieved_goals][i], new_reward, False, # 重标记样本的done通常设为False ) self.buffer.append(her_sample)这里要注意几个工程细节new_reward的计算因为新目标是从“未来状态”中选出而当前状态的achieved_goal可能未达该目标所以new_reward大概率是0但这不影响后期正样本的积累当i对应的状态恰好和新目标一致时new_reward1这就是我们需要的正样本。done标志重标记后不要轻易把done设成True因为新目标的工作还没结束把done设为False能防止Q学习误判。buffer的重复写入我用了循环覆盖方式capacity一般设在10^5到10^6的量级和DDPG默认的经验池规模保持一致。还有网络结构层面的一个心得HER通常配合off-policy算法最经典是DDPG也可以用SAC、TD3。我在实践中发现HERSAC的组合稳定性比HERDDPG好一截尤其是目标空间维度比较高的时候SAC的熵正则项能减少策略过早坍缩到某个目标点的问题。3.3 关键训练参数怎么定拿FetchPush举例讲几个具体参数。以FetchPush机械臂推箱子到目标点为例我用过一套相对可靠的基础配置参数项数值说明每个episode最大步数50不宜过长重标记策略依赖轨迹完整性actor网络结构MLP 256x256ReLU目标拼接后输入输入维度 state_dim goal_dimcritic网络结构MLP 256x256ReLU输出单Q值网络参数不需要过大优化器Adamlr1e-3actor和critic独立优化器gamma0.98稀疏奖励任务里折扣系数不宜太高否则Q值方差大tau软更新率0.005目标网络更新率训练批量大小256批量大小影响Q回归稳定性HER k_future4论文默认我试过8没有显著提升replay buffer容量1e6重标记样本多容量要足够大总训练步数20万步在该环境足够收敛复杂环境可以到50万值得注意的有几个点。第一gamma别设成0.99或0.999。在稀疏奖励场景下高gamma会让Q值估计“延迟爆炸”目标网络更新跟不上训练初期loss波动极大。HER虽然增加了信号密度但仍建议gamma设低一些。第二actor网络别太深。我试过把actor换成4层512维的深网络结果在FetchPush上反而跑到第15万步还不收敛原因可能是高维参数空间让目标条件特征的嵌入变得更难学了。HER的核心在于数据层面的信号密度网络容量适度即可。第三normalization很重要。在目标条件场景下state和goal的量纲往往相差巨大位置坐标和速度混在一起强烈建议对输入做LayerNorm或把state和goal分通道做normalization后拼接。3.4 目标重标记与模型保存别漏掉“目标空间”的序列化工程落地时有个很容易被忽略的细节模型保存。你在训练HER时保存的模型权重实际上包含策略网络权重和目标编码方式两套信息。如果训练时对目标做了自定义的特征变换比如降维、PCA、MinMax推理阶段就必须保持完全一致。我在一个项目中把目标空间做过MinMax归一化结果保存模型时忘了保存归一化参数导致加载后的模型完全失智——目标向量输入分布变了策略预测的动作全是边缘值。后来我养成习惯把所有归一化参数和训练配置一并写进模型checkpoint里解锁一下省心很多。4. 训练HER过程中的典型问题与排查心得4.1 训练初期loss上升大概率是Q值回归目标混乱HER的loss曲线早期并不像普通监督学习那样平滑下降。我刚上手时看到一个诡异现象前几千步里critic loss不仅不降反而往上窜心想完了经验池里肯定污染严重。后来逐项排查发现原因其实是重标记样本与原始样本的比例失衡。在经验池容量1e6、k_future4的情况下每条原始轨迹会额外生成4条重标记样本累积下来重标记样本占比达到80%而这80%中大多数奖励是0。于是critic的回归目标大量是小值而在原始稀疏奖励下极少量正样本也会拉高平均Q造成loss震荡。解决办法是把“原始样本比例”手动提升。比如在采样时不是从buffer中均匀随机抽样而是分层采样30%的样本来自原始轨迹、70%来自HER重标记样本。这样做以后loss曲线马上平稳了。论文里没写这个细节属于纯工程经验。4.2 训练后期策略只往一个目标点钻多半是采样策略和归一化共同导致另一种常见故障是训练了很久成功率还是不达标但拿出来看策略表现发现它只会朝经验池里最常见的“伪目标”移动完全不理会新目标。这个现象我遇到过两次原因都不是算法本身而是目标空间采样不均匀。具体来说当目标空间很大而经验池里真实到达过的状态分布很偏比如集中在某个角落future策略重标记后的新目标也都会集中在这个角落。策略就只学会“到角落去”丧失了泛化能力。解法有两条路径一是在训练早期引入更多随机动作提高探索多样性让状态覆盖范围变大二是在重标记时混合episode策略即一部分新目标从整条轨迹随机采样一部分从未来状态采样比例可以调到50%:50%。这其实就是论文里几种采样策略的混合玩法工程上比单一策略更稳。4.3 效率对比HER到底能快多少我在自己的测试环境里做过一组粗略对比同一个Push任务用标准DDPG训练了30万步成功率一直在5%以下徘徊。改用HERDDPG后同样的模型结构到8万步时成功率已经跳到75%左右。这种数量级的差距在稀疏奖励任务里一点不夸张。不过话说回来如果任务本身已经有不错的塑形奖励HER的提升可能只有10%-20%这时性价比就不高了。判断是否用HER本质是看当前环境里的“信息信号密度”够不够。不够上HER够就不要折腾。4.4 经验池里要不要剔除“老弱病残”样本有人会问重标记样本是否有“过期”概念比如智能体已经学会某种策略后早期那些探索轨迹是否该淘汰我的观念是HER的经验池设计本质上就和普通经验回放不同它不追求样本的时效性反而追求覆盖范围。别急着对经验池做激进淘汰。HER样本的目的不是实时反应当前策略而是给Q函数提供“目标—状态”配对分布。你删掉旧样本可能就把目标空间的一部分覆盖给抹掉了。我试过在训练中定期清空部分旧经验池结果策略立刻出现回退之后就不再做清空操作了。5. HER的扩展思路与进阶技巧5.1 结合子目标生成从单层重标记到层级HERHER解决的是“目标不可达”的问题但有的时候目标本身太复杂即使重标记也很难给策略提供渐进信号。这时候可以考虑把HER放进层级框架高层策略负责生成子目标序列底层策略负责执行HER学习到的“到达子目标”的能力。比如把一个长距离导航任务拆成“到A点”“到A-B中点”“到B点”每个子目标都用HER训练一个底层策略高层策略在子目标空间里做决策。这个思路在机器人领域效果很好不过实现复杂度也高适合有一定工程基础的人去尝试。5.2 目标空间的自动筛选HER判别式模型HER的重标记策略在目标空间维度高、样本分布稀疏时随机采样效率很低。一个进阶思路是在重标记前先用一个判别器判断“哪些状态更适合作为目标”。例如用密度估计模型给轨迹中的每个状态打分——排除那些显著偏离常理的状态——然后只把高密度的状态作为候选目标。这个做法能有效减少低质量重标记样本对策略的干扰代价是需要额外训练一个模型。我在一个非标准抓取任务中用到了这种改进成功率从基线HER的63%提升到了81%代价是训练时间增加约30%。5.3 关于“hindsight”这个概念的迁移思考最后聊点个人的体会。HER虽然是强化学习领域的方法但它背后的思想其实可以迁移到很多工程场景里不要只盯着“成功”的数据学失败的数据里往往藏着更密实的经验结构。比如在系统故障排查时我们可以把“故障恢复”看作目标把“实际产生了什么变化”作为重标记目标再比如实验设计里一次预期未达标的实验只要重新定义观测指标往往也能成为有价值的对照样本。这个思想在自动驾驶决策、物流调度、风电功率预测等领域都有类似应用。做算法这事儿有趣的地方就在于一个看似“事后补救”的机制有时候比事前精心设计的奖励方案还要有用得多——因为它忠于真实发生过的事情不给环境强加虚构的偏好。
返回列表