为什么要分层(Hierarchical RL)
普通强化学习在长时间跨度、稀疏奖励的任务(如机器人多阶段操作、迷宫导航)中学习困难。分层强化学习(Hierarchical Reinforcement Learning, HRL)的核心思想是:把复杂任务分解为可复用的子策略(sub-policy),高层负责选择子目标,低层负责执行。
常见 HRL 框架对比:
| 框架 |
高层决策粒度 |
典型表示 |
| Options |
选择子策略(option)并决定何时终止 |
(I, π, β) 三元组 |
| HAM |
部分可编程的有限状态机 |
机器状态 |
| MAXQ |
任务分解为子任务值函数 |
层次 MDP |
| FeUdal |
高层输出隐式目标(goal) |
状态抽象 |
Options 框架的三个要素
一个 Option 是一个三元组:
- 启动集 I(Initiation set):option 可以开始执行的状态集合。
- 内部策略 π(Policy):option 内部的策略。
- 终止条件 β(Termination condition):
β(s) 表示在状态 s 终止该 option 的概率。
高层策略每 k 步(或按 β)选择一次 option,低层 option 在其内部执行动作,形成时间抽象。
最小实现(PyTorch)
下面是一个双层 Options 的骨架代码,上层为「高层策略」,下层为「option 内部策略」:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| import torch import torch.nn as nn import torch.nn.functional as F
class OptionPolicy(nn.Module): """单个 option 的内部策略:状态 -> 动作分布"""
def __init__(self, obs_dim, act_dim, hidden=64): super().__init__() self.fc = nn.Sequential( nn.Linear(obs_dim, hidden), nn.ReLU(), nn.Linear(hidden, act_dim), )
def forward(self, obs): logits = self.fc(obs) return F.softmax(logits, dim=-1)
class HighLevelController(nn.Module): """高层策略:状态 -> option 分布,并输出终止概率"""
def __init__(self, obs_dim, n_options, hidden=64): super().__init__() self.fc_option = nn.Linear(obs_dim, n_options) self.fc_term = nn.Linear(obs_dim, n_options)
def forward(self, obs): option_logits = self.fc_option(obs) beta = torch.sigmoid(self.fc_term(obs)) return F.softmax(option_logits, dim=-1), beta
class OptionsAgent: """双层策略的简单封装"""
def __init__(self, obs_dim, act_dim, n_options=4): self.controller = HighLevelController(obs_dim, n_options) self.options = nn.ModuleList( [OptionPolicy(obs_dim, act_dim) for _ in range(n_options)] ) self.current_option = None
def act(self, obs): if self.current_option is None: option_probs, beta = self.controller(obs) self.current_option = int(option_probs.argmax().item()) self.beta = beta[self.current_option]
action_probs = self.options[self.current_option](obs) action = int(action_probs.argmax().item())
if torch.rand(1).item() < self.beta.item(): self.current_option = None
return action
|
训练要点
- 两套学习目标:高层学习「选择哪个 option + 何时终止」,低层学习「option 内部如何执行」。
- 伪奖励(intrinsic reward):常给低层 option 一个内部奖励,鼓励其到达高层指定的子目标。
- 策略梯度 vs 价值方法:Options 可与 PPO / DQN 等任意底层算法结合。
小结
Options 框架为「分层」提供了一套清晰的数学描述。实际工程中,HRL 的关键在于子任务的自动发现与高层目标的表示,这也是后续可以深入的方向(如 FeUdal 的目标空间抽象、基于语言指令的 HRL 等)。
参考
- Sutton, Precup & Singh. Between MDPs and semi-MDPs: A framework for temporal abstraction in reinforcement learning.
- Bacon, Harb & Precup. The Option-Critic Architecture.