Hindsight Experience Replay (HER)
AI 整理笔记: 本文由 AI 根据学习过程中的问题辅助整理,并非作者逐字手写。
30 秒结论
HER 的核心不是修改已经执行过的动作,而是修改观察这段轨迹时所使用的目标:即使 Agent 没有完成原目标,也可以把它实际达到的状态当作替代目标,重新计算奖励,从失败轨迹中构造出有学习信号的经验。
训练顺序可以概括为:
- 收集一个 episode: 固定原目标 $g$,执行 $T$ 步并记录真实轨迹。
- 重标注这一局的数据: 保存原目标版本,再从实际到达的状态中选择替代目标 $g'$,重新计算奖励并保存 HER 版本。
- 训练: 从整个 replay buffer 随机抽取 mini-batch,执行 $N$ 次离策略更新。一个 batch 可以混合不同 episode、不同目标的数据。

核心思想
一个直观例子
原任务是: 把方块推到 $g=(0.8,0.6)$。
实际轨迹中,方块的位置是:
$$ (0.2,0.2)\rightarrow(0.4,0.2)\rightarrow(0.5,0.3) $$没有到达原目标。
可以把最终位置作为额外目标:
$$ g'=(0.5,0.3) $$这段经历就可以用来学习“如何把方块推到 $(0.5,0.3)$”。这里的目标是坐标,不是二进制串,也不需要生成自然语言指令。
Multi-goal RL
目标与奖励
$f_g(s)$ 是一个检查函数:状态 $s$ 是否已经满足目标 $g$?
$$ f_g(s)= \begin{cases} 1,&\text{满足目标},\\ 0,&\text{不满足目标}. \end{cases} $$论文采用的奖励为:
$$ r= \begin{cases} 0,&\text{成功},\\ -1,&\text{未成功}. \end{cases} $$额外目标采样
环境记录了每个时间点的完整状态,其中包含方块的位置。
- Final:读取最后状态里的方块坐标,得到 $g'=(0.5,0.3)$。
- Future:对某条 transition,从它之后的状态中随机抽一个,再读取那个状态里的方块坐标。
随机抽取的是已经发生的状态,再用 $m(s)$ 提取物体坐标,而不是凭空生成一个位置。
重新计算奖励
比较动作执行后方块的位置与新目标的距离:
$$ r'_t= \begin{cases} 0,&\|\operatorname{pos}(s_{t+1})-g'\|\leq\varepsilon,\\ -1,&\text{否则}. \end{cases} $$假设允许误差 $\varepsilon=0.05$,新目标是 $(0.5,0.3)$:
| 动作后方块位置 | 到新目标的距离 | 新奖励 |
|---|---|---|
| $(0.4,0.2)$ | 约 $0.141$ | $-1$ |
| $(0.5,0.3)$ | $0$ | $0$ |
隐式课程
HER 是一种 implicit curriculum(隐式课程):它没有显式排好难度顺序,而是从 Agent 实际达到的状态生成训练目标;随着能力提升,能产生的目标也可能更复杂。
训练算法
Step 1. 初始化网络和经验池
准备四个网络:
- 在线 Actor $\pi_\theta(s,g)$:输出动作。
- 在线 Critic $Q_\phi(s,a,g)$:估计动作价值。
- 目标 Actor:在线 Actor 的缓慢更新副本。
- 目标 Critic:在线 Critic 的缓慢更新副本。
另外准备经验池 $R$,用于保存交互数据。
Step 2. 收集一条轨迹
假设原目标是把方块推到位置 A,最多执行 3 步:
$$ s_0\xrightarrow{a_0}s_1 \xrightarrow{a_1}s_2 \xrightarrow{a_2}s_3 $$每一步的动作来自:
$$ a_t=\pi_\theta(s_t,A)+\text{探索噪声} $$假设最后方块停在 B,没有到 A。这个阶段只记录实际发生的状态和动作,不更新参数。
$a_t$ 是夹爪的移动和开合指令,不是直接让方块跳到某个位置。
Step 3. 构造并存储原始数据与 HER 数据
假设方块只有最后一步进入 B 的容差范围,全程没有到 A。按照动作后的状态计算奖励:
| 数据来源 | 状态 | 实际动作 | 奖励 | 下一状态 | 目标 |
|---|---|---|---|---|---|
| 原始 | $s_0$ | $a_0$ | $-1$ | $s_1$ | A |
| 原始 | $s_1$ | $a_1$ | $-1$ | $s_2$ | A |
| 原始 | $s_2$ | $a_2$ | $-1$ | $s_3$ | A |
| HER | $s_0$ | $a_0$ | $-1$ | $s_1$ | B |
| HER | $s_1$ | $a_1$ | $-1$ | $s_2$ | B |
| HER | $s_2$ | $a_2$ | $0$ | $s_3$ | B |
最后一条 HER 数据的奖励来自:
$$ \boxed{ f_B(s_3)=1\ \text{(成功)} \quad\Longrightarrow\quad r_2=0\ \text{(奖励)} } $$这 6 条数据都存进经验池。到这里还没有做梯度更新,只是增加了数据;经验池也不必清空,之后仍然可以抽到以前 episode 的数据。
Step 4. 更新在线 Critic
从经验池随机抽取一个 mini-batch。假设其中包含一条 HER 经验:
$$ (s_2,a_2,0,s_3,B) $$先用两个目标网络计算训练目标。一般形式为:
$$ y_i=r_i+\gamma(1-d_i)Q_{\phi^-} \left(s'_i,\pi_{\theta^-}(s'_i,g_i),g_i\right), $$其中 $d_i$ 表示这一条经验的下一状态是否终止。对于示例中的 HER 经验:
$$ y=0+\gamma(1-d_2)Q_{\phi^-} \left(s_3,\pi_{\theta^-}(s_3,B),B\right). $$含义是:这次实际奖励是 $0$;如果 $s_3$ 不是终止状态,再加上“从 $s_3$ 继续追求 B”的后续价值估计。
在线 Critic 对真实执行过的动作打分:
$$ q=Q_\phi(s_2,a_2,B) $$用平方误差训练:
$$ L_{\text{critic}}=(q-y)^2 $$对整批样本取平均,再反向传播,更新 Critic 参数 $\phi$。
“到达目标、奖励为 $0$”不自动意味着后续项为 $0$;只有这条经验的终止标记 $d_i=1$ 时,才去掉后续项。
Step 5. 更新在线 Actor
取同一个状态和目标 $(s_2,B)$,让在线 Actor 重新输出一个动作:
$$ \hat a=\pi_\theta(s_2,B) $$这个 $\hat a$ 不一定等于经验中实际执行过的 $a_2$。让在线 Critic 评价它:
$$ Q_\phi(s_2,\hat a,B) $$Actor 的损失是:
$$ L_{\text{actor}} =-\frac{1}{|B_{\text{batch}}|} \sum_i Q_\phi(s_i,\pi_\theta(s_i,g_i),g_i) $$这一步固定 Critic 参数,让梯度经过 Critic 传到 Actor,调整 $\theta$,使 Actor 输出的动作获得更高评价。这不是把旧动作 $a_2$ 当作标准答案,让 Actor 照抄。
- Critic 用真实动作、奖励和下一状态来学习评价。
- Actor 根据 Critic 的梯度,学习怎样选择更好的动作。
HER 数据就是通过这两个环节影响策略的。
Step 6. 更新目标网络并重复训练
把两个目标网络向在线网络缓慢更新。然后再次从经验池抽取 batch,继续优化,总共执行 $N$ 次。完成后进入下一个 episode,用更新后的 Actor 与环境交互。
完整顺序是:
实际执行一条轨迹 → 保存原始和 HER 数据 → 抽取 batch,更新 Critic、Actor 和目标网络,重复 $N$ 次 → 执行下一条轨迹。
因此,“HER 相当于增加训练样本”是准确的:它改变了最后优化步骤会抽到的状态—动作—目标—奖励组合,但底层训练仍然是 DDPG。
最容易混淆的地方
“一个 episode 内目标固定”与“训练 batch 混合目标”并不冲突
固定的是与环境交互时的原目标。收集第 $k$ 个 episode 时,策略的每一步都以同一个 $g_k$ 为条件:
$$ a_t\sim\pi_b(a\mid s_t,g_k), \qquad t=0,\ldots,T-1. $$episode 结束后,HER 才把这条已经发生的轨迹复制成带有替代目标 $g'$ 的训练经验。不同 episode 产生的数据会一起留在 replay buffer 中,因此梯度更新时抽到的 batch 完全可以同时包含多个目标。前者描述的是 rollout 的条件,后者描述的是离线采样训练数据的方式。
HER 为什么需要离策略算法
动作 $a_t$ 是在原目标 $g$ 下由行为策略产生的,但重标注后的经验会把同一个动作解释为追求 $g'$ 时采取的动作。换句话说,训练样本中的目标已经改变,这条经验不再严格来自当前要学习的目标条件策略。DQN、DDPG 等离策略算法允许使用这类由其他行为策略产生的数据,因此可以直接配合 HER。
HER 没有把失败说成成功
HER 不会声称轨迹完成了原目标。它保留原始失败经验,同时额外提出一个与实际结果一致的新问题:“如果目标原本就是 $g'$,这一步的奖励应该是多少?”因此,改变的是训练条件和奖励标签,状态、动作与下一状态都保持不变。
来源
- Hindsight Experience Replay, Andrychowicz et al., 2017.