HER:失败轨迹也能当成功样本
Hindsight Experience Replay 把 episode 目标改成实际到达状态,稀疏 manipulation 里样本效率可数量级提升。

1. 没到达指定 goal,但到达了
FetchReach 类任务:agent 朝 伸手,实际到达 ,sparse reward 给 0——这条轨迹对原目标是无用负样本,占 replay 却学不到 reach。HER(Hindsight Experience Replay)把 transition 的目标从 改成 ,按新目标重算 reward,变成「成功到达 」的正样本存入 buffer。无 HER 时 million 步零 success 很常见,不是 SAC 弱,是 replay 里几乎没有正样本——HER 是 sparse manipulation 的 sample efficiency 杠杆,FetchReach 1e5 step 量级 success 是 sanity check。
HER 解决的是 reachability 与 sample 稀缺,不解决 dynamics 错误或 reward 不可 relabel 的 spec 问题——后者 HER 帮不了。
2. 采样策略
Future:从同一 episode 当前步之后随机选 achieved goal,多样性高,SB3 默认常用。Final:用 episode 末状态,偏差大但实现简单。Episode:混合。Relabel 比例 n_sampled_goal 控制——太大稀释 original task learning,太小 sample 增益不够。HER 与 sparse terminal reward 并存时,original goal 的 transition 仍重要,否则 policy 忘记指定 goal,只会 reach 任意点。
3. SB3 配置与 goal 表示
HerReplayBuffer 配合 SAC/TD3;需 n_sampled_goal、goal_selection_strategy="future"。Policy 须 goal-conditioned:MultiInputPolicy 或 obs 含 achieved/desired goal。Fetch 环境标准模式:obs["achieved_goal"] 与 obs["desired_goal"]——desired goal 在 obs 中的 slice 必须和 reward 计算用的一致。
我曾在 goal 索引写错时训了一整夜:loss 在降、success 永远零。Debug:打印 relabeled transition 的 goal 和 reward,看是否与 achieved state 一致。Goal slice 写错则 relabel 全错但 loss 仍降——最浪费算力的 silent bug 之一。
4. Reward 必须 goal-relabelable
目标必须 可重标注:reward 须是 goal 的函数(如 sparse 0/1 reach)。非 goal 条件任务不适用。Reward 依赖 time penalty 时,HER 重算可能不一致——设计 reward 时考虑 relabel 语义,否则 original 与 relabeled 的 penalty 逻辑冲突。只用 HER 不加 base task reward,学不到指定 goal。
Buffer 内存约为普通 replay 的 倍,OOM 时先降 k。Batch 里 achieved_goal 必须来自实际到达 state slice,不能填 desired goal——后者 relabel 语义错误。
5. Eval 与 multi-goal
Fetch 类 eval 用固定 20 goals 列表,train 随机 goal;列表文件版本化。Multi-goal 训练 eval 要在 held-out goal 集上测,不是只测训练采样的 goal 分布——只在训练 goal 上 success 高,可能是过拟合 goal 分布。Print relabeled 样本是 HER debug 标配,loss 降 success 零时十分钟内应能定位 slice 问题。SAC 配 HER 是 Fetch 系标准组合,1e5 step 量级 success 是 sanity check 门槛。HER 与 curriculum 可并用:curriculum 让 init 可达,HER 让失败变成功;eval 仍要在 hardest goal 上报告。
6. 失败模式
Goal 索引错,重标注无效。Relabel 比例太高,policy 忘记 desired goal。Reward 非 goal 函数,HER 重算无意义。Eval 只在训练 goal 分布上测,held-out 泛化未知。
7. 案例:goal slice 错一行训一夜
Obs 里 desired_goal 是 [7:10],reward 用 [10:13]——copy-paste 错一行。Relabel 改的是 obs slice,reward 仍读旧 slice,relabeled transition reward 全错。Loss 降(Q 在学错误目标),success 零。打印一条 relabeled 样本后 5 分钟定位——HER debug 必做 print,不能只看 loss。
8. 验收
- FetchReach 上 SAC+HER 1e5 步量级应 success;无 HER 同 budget 对比。
- Log success rate 与 relabeled 比例。
- Goal slice 与 reward 交叉验证(打印 relabeled 样本)。
- Held-out goal eval 与 train 分布分开报告。
n_sampled_goalablation:过高 dilute original task。
9. 与 sparse reward 设计的交点
HER 要求 reward 是 goal 的函数——time penalty、contact penalty 若与 goal 耦合,relabel 语义可能不一致,设计 reward 时预留 HER 路径。FetchReach 1e5 step 量级 success 是 HER+SAC 的 sanity check;无 HER 1e7 step 仍不行则先上 HER 再怀疑算法。Multi-goal eval 在 held-out goal 集上测,train goal 分布 success 高不等于 generalize。与 curriculum 并用:curriculum 改 init 让 agent 见到可达 goal,HER 改 relabel 增样本;eval 仍报 hardest goal。Goal slice 与 reward 函数交叉验证是 debug 第一步——loss 降 success 零时 print 一条 relabeled 样本,5 分钟定位 slice 错一行。
10. 录包与 Fetch 验收
FetchReach SAC+HER 1e5 step 量级 success 是 sanity check;无 HER 同 budget 对比。Eval 固定 20 goals 列表版本化;held-out goal 与 train 分布分开报告。Buffer 内存约 倍,OOM 先降 n_sampled_goal。Original goal transition 仍要进 batch,否则 policy 忘记指定 goal。Goal slice 与 reward 交叉验证是 debug 第一步——loss 降 success 零时 print relabeled 样本。非 goal 条件任务 HER 不适用;time penalty 与 goal 耦合时检查 relabel 语义是否一致。
11. 收束
HER 是 sparse manipulation 的 sample 杠杆,前提是 reward goal-relabelable、goal slice 与 reward 一致。FetchReach 1e5 step 量级是 sanity check;held-out goal eval 与 train 分布分开报告。Print relabeled 样本是 debug 第一步——loss 降 success 零时,十之八九是 slice 或 relabel 语义错了。Original goal 的 transition 仍要进 batch,否则 policy 只会 reach 任意点而非 desired goal。Future 策略多样性高,Final 实现简单;Fetch 系是 HER 标准试验场,先跑通再迁项目。Relabel 比例 n_sampled_goal 太高 dilute original task,太低 sample 增益不够,要做 ablation。HER 不解决 dynamics 错误或 reward 不可 relabel 的 spec 问题——后者要先修 spec 再谈 HER。Held-out goal eval 是 generalization 成绩单,只在 train goal 上 success 高可能是过拟合。
相关
也可以看看
johan's blog