返回专辑
·Johan·5 分钟阅读

分层 RL:子目标与 options

长 horizon 任务拆高层选子目标、低层执行;options 或 goal-conditioned 分层缓解 credit assignment,层次设计错了比 flat 更糟。

分层 RL:子目标与 options

1. 2000 步 pick-place,flat policy 传不动 credit

Flat policy 直接输出 motor command,2000 步后才知道 grasp 成败——reward 信号稀释到几乎无效,credit assignment 是 flat RL 在长 horizon 上的结构性难题。Hierarchical RL 拆两层:high-level 每 K 步选 subgoal (或 option),low-level 执行到达成或超时。Options framework 把 option 定义为 (init set, policy, termination),在 semi-MDP 上抽象时间尺度,让 high-level 在更粗的时间粒度上做决策。

但层次设计错了比 flat 更糟:high-level 每步改 goal,low-level 永远追不上;subgoal 不可达仍被采样,两层同时学崩。Hierarchical 不是长任务的默认解,是 flat 失败后的结构化尝试。维护两套 policy、两套 hyperparam、两套 checkpoint,工程成本是 flat 的数倍——若没有 measurable gain,就是负 ROI。

2. 机制:HIRO 与 goal-conditioned low-level

HIRO / HAC:subgoal 空间是 state 子空间(相对坐标),low-level 用 HER 训 reach 到任意 ,high-level 在 abstract space 选 。Low-level 技能可复用——同一个 reach policy 服务不同 high-level 任务,有时比 end-to-end 分层 end-to-end 训更稳。HER 让 sparse reward 的 reach 任务可学,是 goal-conditioned low-level 的标准配套。

Option 终止:option 执行直到 termination 或 timeout;high-level 每 K 步选一次,K 太大 credit assignment 仍难,太小则接近 flat。Semi-MDP discount 语义与 flat 不同—— 作用于 subgoal 间隔,设计 reward 时 high/low 时间尺度必须对齐,否则两层 optimize 不同目标。

python
action = pi_low(obs, subgoal)  # π(a|s,g)
if step % K == 0:
    subgoal = pi_high(obs, task_context)

3. 何时值得分层

Horizon > 几百步、且有自然 subgoal(到达 waypoint、打开抽屉)时考虑。任务本身 50 步能做完,flat PPO 更简单——分层必须 beat flat 同 compute 才值得维护两套 policy。Flat PPO 10M step 仍失败再考虑 hierarchical,而非默认上分层。Pick-place 若 200 步内可完成且 flat 已 80% success,分层带来的 marginal gain 往往不值得双倍维护成本。

Pretrain schedule:先 pretrain low-level reach random subgoal,random subgoal reach rate >70% 再训 high-level;或 freeze low-level 训 high-level,最后 joint fine-tune。固定 high-level 随机 goal,先验证 low-level reach 能力——random subgoal reach 不过关,high-level 学的是噪声,success rate 长期贴地。

Document subgoal space bounds 与 low-level action bounds 关系;subgoal 超出 reach 则 hierarchical 必 fail。

4. 失败模式

High-level 频繁改 goal → low-level 永远追不上。Subgoal 不可达仍采样 → low-level 学噪声。High/low reward 不对齐 → 两层 optimize 不同目标。Error propagation:两层都错时 debug 比 flat 难一个数量级。High-level 和 low-level 时间尺度、reward 对齐失败是常见根因——分层项目要有 flat baseline 并行对比,不能只有 hierarchical 一条线。

5. Pretrain 与 flat baseline

Hierarchical 项目先 deliver flat baseline 同 compute——分层必须 beat flat 才值得维护两套 policy,否则是纯工程成本。先 pretrain low-level reach random subgoal,再 freeze low-level 训 high-level,最后 joint fine-tune 有时比 end-to-end 稳。Goal-conditioned low-level: 用 HER 训 reach 到任意 g,high-level 只选 g。

6. 验收

  • 固定 random high-level goal,验证 low-level reach rate >70%。
  • 对比 flat PPO 同 task wall-clock 和 success rate。
  • Ablate K(subgoal 间隔):K=1 接近 flat,K 过大 credit 仍难。
  • Subgoal space bounds 与 low-level reach 范围文档化。
  • Hierarchical beat flat 同 compute 才上线。

7. 案例:high-level 每步改 goal 导致 low-level 学不动

某 long-horizon navigation 项目 high-level 每步输出新 subgoal,low-level reach policy 永远追不上移动目标——success rate 长期低于 5%。修复:high-level 每 K=20 步才更新 subgoal,low-level 有充足时间 reach;random subgoal reach rate 从 20% 升到 78% 后再训 high-level,整体 success 才超过 flat PPO baseline。

8. Subgoal 空间设计

Subgoal 太大学不动——high-level 在巨大空间随机采样,low-level 大部分 goal 不可达。Subgoal 太小没意义——等价于 flat,只是多了层 indirection。实用做法:subgoal 设为相对 end-effector 的位移(如 ±0.2m),维数 3,low-level 用 HER 训 reach。Bounds 和 low-level workspace 交集必须非空,否则 hierarchical 架构性不可行。

Semi-MDP 的 discount 语义:high-level 每 K 步决策一次,等价于 discount 作用于 subgoal 间隔——reward 设计时 high-level 的 sparse reward 和 low-level 的 dense reward 尺度要对齐,否则 low-level 为 high-level 的噪声打工。

9. 与 options 的关系

Option 比 subgoal 多 termination 条件——执行直到谓词成立或超时,适合「打开抽屉直到开度>90%」这类有明确终止的任务。Subgoal 更适合「到达某坐标」类 reach 任务。选型看任务是否有自然 termination;有则用 option,无则用 subgoal + timeout。无论哪种,low-level 能力必须先 standalone 验证,再接入 high-level。Hierarchical 项目文档应含 subgoal bounds、K 值、reach rate 阈值——缺文档则下一任维护者无法判断该继续训还是回退 flat。Beat flat 同 compute 是上线门槛,不是 nice-to-have。Flat baseline 和 hierarchical 应共享同一 env、wrapper、seed 集,否则对比无效。Reach rate >70% 是 high-level 开训的硬门槛。Hierarchical beat flat 同 compute 才值得双倍维护成本。

分层是长 horizon 的 credit assignment 工具,不是默认架构。Low-level reach 能力先验验证,beat flat 才上线——否则维护两套 policy 是纯成本,debug 难度还翻倍。

相关

也可以看看

← 全部文章

johan's blog