在 Ray RLlib 中实现分层环境(Hierarchical Environments):以多智能体强化学习构建两级策略协作

发布时间:2026/9/20 14:03:23
在 Ray RLlib 中实现分层环境(Hierarchical Environments):以多智能体强化学习构建两级策略协作 在 Ray RLlib 中实现分层环境Hierarchical Environments以多智能体强化学习构建两级策略协作【免费下载链接】rayRay is an AI compute engine. Ray consists of a core distributed runtime and a set of AI Libraries for accelerating ML workloads.项目地址: https://gitcode.com/gh_mirrors/ra/ray导读分层强化学习Hierarchical Reinforcement LearningHRL通过将复杂任务拆解为不同抽象层级来应对长时程决策问题。本文基于 Ray 官方文档 Hierarchical environments 的核心思路展开分层训练本质上可以建模为多智能体强化学习Multi-Agent RL的特例——顶层策略high-level policy在粗时间尺度上发布高层任务一个或多个底层策略low-level policy在细时间尺度上执行这些任务。读完本文你将掌握如何在 RLlib 中通过MultiAgentEnv与PPOConfig.multi_agent()搭建两级分层训练理解策略映射policy mapping、分层奖励设计的关键点并能够直接运行仓库中的SixRoomEnv分层示例进行验证。一、分层训练的本质多智能体问题的特例在 RLlib 中实现分层强化学习不需要专门的 HRL 算法框架而是把层级翻译成不同类型的智能体。文档给出的核心判断是只要正确设置了 agent 到 policy 的映射函数agent-to-module mappingRLlib 看到的就是一个包含不同类型策略的独立多智能体问题。以两层策略为例顶层策略发出一个高层动作对应的底层策略在更细的时间尺度上执行多次。两种常见的时间对齐模式如下模式一交替并行推进top-level: action_0 ------------------------------------- action_1 - low-level: action_0 - action_1 - action_2 - action_3 - action_4 -顶层策略每执行一次动作如action_0底层策略在这段时间窗口内执行四次原始动作action_0到action_3随后顶层策略才发出下一个动作action_1。模式二串行交接控制权top-level: action_0 ----------------------------------- action_1 - low-level: --------- action_0 - action_1 - action_2 ------------底层智能体先等待顶层智能体发出动作然后连续行动n次再将控制权交还给顶层智能体。仓库中的HierarchicalSixRoomEnv采用的就是这种串行交接模式见 six_room_env.py。无论哪种模式都可以用高层智能体 低层智能体的多智能体环境来表达。关键约定在于环境负责在智能体之间路由控制权每一时刻只让某类智能体行动环境负责在合适的层级发放奖励高层目标goal需要作为低层智能体观测observation的一部分传递下去。关于目标传递这一机制仓库示例给出了最直观的实现低层智能体的观测空间是一个元组(当前位置, 目标位置)目标位置正是由高层策略的上一个动作指定的详见下文环境源码分析。二、最小配置骨架用PPOConfig.multi_agent()搭建两级策略原文档给出的配置骨架如下完整可运行版本请直接使用仓库示例 hierarchical_training.pyfrom ray.rllib.algorithms.ppo import PPOConfig config ( PPOConfig() .multi_agent( policies{top_level, low_level}, policy_mapping_fn( lambda aid, eps, **kw: low_level if aid.startswith(low_level) else top_level ), policies_to_train[top_level], ) )其中三个参数的含义需要结合 AlgorithmConfig.multi_agent() 的源码说明来准确理解参数类型作用policies集合 / 列表 / 字典声明环境中出现的所有策略 ID。若传入集合或列表RLlib 会自动将其转换为{pid: PolicySpec()}字典形式见 algorithm_config.py每个策略默认使用相同的算法配置、观测空间与动作空间如需为不同层级指定不同的观测/动作空间或网络结构则应改为传入PolicySpec字典。policy_mapping_fnCallable[[AgentID, Episode], PolicyID]把每个 agent ID 映射到某个策略 ID 的函数签名是(agent_id, episode, **kwargs) - PolicyID。它是分层语义的核心载体通过 agent 命名前缀如low_level_0区分层级并让多个同层智能体共享同一个策略。policies_to_trainNone/ 集合 / 可调用对象决定哪些策略参与梯度更新。None表示训练所有策略传入策略 ID 集合则只更新这些策略也可传入以(policy_id, batch)为参数返回布尔值的可调用对象实现条件训练。分层场景中常用它来冻结某一层例如只训练高层、让底层策略保持专家行为不变或混合学习型 非学习型策略参见 multi-agent-envs.md 中policies_to_train[learning_policy]的示例。从源码看multi_agent()在传入policies时还会对每个策略 ID 调用validate_module_id做合法性校验并将(set/tuple/list)形式的策略集合统一转成PolicySpec字典algorithm_config.py因此上面的简写是安全的。需要特别说明原文档骨架中的policies_to_train[top_level]是一种合法用法表示只训练顶层策略但在大多数分层实验里包括仓库自带的 SixRoom 示例通常希望高低层策略同时学习此时应将该参数设为None默认值或仅省略该参数。三、分层环境的环境侧职责路由、目标传递与分层奖励文档明确指出在这种设置下多智能体环境的实现应当在任何层级提供合适的奖励。环境类还负责在智能体之间进行路由。例如它把高层智能体的目标goal作为低层智能体观测的一部分传递给低层智能体。这句话对应的正是 MultiAgentEnv 的约定每个智能体用字符串AgentID标识环境通过observation_spaces/action_spaces两个字典为不同 agent 提供各自的空间reset()返回当前就绪ready智能体的观测字典step(action_dict)接收{agent_id: action}字典返回五元组(obs_dict, rewards_dict, terminateds_dict, truncateds_dict, infos_dict)其中terminateds必须包含特殊的__all__键来表示整局结束见 multi_agent_env.py。路由的实质就是每一步只把动作/观测返回给当前应该行动的那一类智能体从而在时间轴上实现分层交替。3.1 仓库实例HierarchicalSixRoomEnv如何实现分层仓库中的可运行示例是 hierarchical_training.py它基于 six_room_env.py 中的SixRoomEnv平面环境与HierarchicalSixRoomEnv分层环境构建。该示例非常松散地基于《Hierarchical RL Based on Subgoal Discovery and Subpolicy Specialization》Bakker Schmidhuber, 2003这篇论文。SixRoomEnv是一个 2×3 排列、房间之间由门连通的网格世界智能体从左上角出发需要用上下左右四个原始动作到达标有G的目标格每步得到-0.01的小惩罚到达目标得到10.0six_room_env.py。HierarchicalSixRoomEnv则把任务拆成两级six_room_env.py智能体集合agents [high_level_agent] [flow_level_agent_{i} for i in range(num_low_level_agents)]默认 1 个高层智能体 3 个低层智能体。空间设计分层的关键高层智能体的动作空间是元组(目标格子的离散坐标, 选择哪个低层策略)即一次动作同时决定去哪和派谁去低层智能体的观测空间是元组(当前位置, 目标位置)目标位置正是高层动作中指定的坐标——这就是文档所说把 goal 作为低层观测的一部分低层智能体的动作空间仍是原始四方向Discrete(4)six_room_env.py。时间轴路由step()的分支逻辑若动作字典里出现high_level_agent高层智能体不移动只设定下一个目标与要接管的低层策略然后返回该低层智能体的观测当前位置 目标控制权交给低层否则由当前被选中的低层智能体执行原始移动若到达目标格高层 10.0、低层 1.0且结束本局若到达了高层指定的目标高低层各 1.0控制权交还高层若既没到达目标又耗尽了max_steps_low_level步数预算低层得到-0.01步罚、高层得到-0.01控制权交还高层six_room_env.py。这套奖励设计印证了文档的原则奖励必须按层级发放——高层关心子目标选择离目标越近的候选目标惩罚越小见step中基于欧氏距离归一化的惩罚项低层关心原始动作执行步罚与到达子目标的奖励。3.2 配套的多智能体配置示例中与上述环境配套的策略映射函数为hierarchical_training.pydef policy_mapping_fn(agent_id, episode, **kwargs): # 每个低层 agent 映射到专属的低层策略 if agent_id.startswith(low_level_): return flow_level_policy_{agent_id[-1]} # 高层 agent 映射到高层策略 else: return high_level_policy base_config.multi_agent( policy_mapping_fnpolicy_mapping_fn, policies{high_level_policy} | {flow_level_policy_{i} for i in range(args.num_low_level_agents)}, )这里注意一个与文档骨架的不同点仓库示例为每个低层智能体各分配一个专属策略low_level_policy_0/1/2从而让不同低层策略专门化于不同子目标——这正是示例注释中所说的利用低层策略在到达特定子目标上专业化的可能性hierarchical_training.py。而原文档骨架中的写法所有low_level_*agent 共享一个low_level策略则对应参数共享parameter sharing式分层。两种都是合法的分层建模可按需选择。3.3 完整训练配置与运行参数hierarchical_training.py在PPOConfig上的完整配置hierarchical_training.pybase_config ( PPOConfig() .environment( env, env_config{ map: args.map, # small / medium / large max_steps_low_level: args.max_steps_low_level, # 低层策略被选中后可走的原始步数上限 time_limit: args.time_limit, # 每个 episode 的最大原始时间步 num_low_level_agents: args.num_low_level_agents, # 低层智能体/策略数量 }, ) .env_runners( env_to_module_connector( lambda env, spaces, device: ( FlattenObservations(multi_agentnot args.flat) ) ), ) .training( train_batch_size_per_learner4000, minibatch_size512, lr0.0003, num_epochs20, entropy_coeff0.025, ) )命令行参数一览python rllib/examples/hierarchical/hierarchical_training.py参数默认值说明--mapmedium内置地图可选small/medium/large--time-limit100每个 episode 的最大原始时间步数--max-steps-low-level15低层策略被高层选中后可连续执行的原始步数上限超出后控制权交还高层--num-low-level-agents3低层智能体对应低层策略的数量--flatFalse开启后不使用分层环境改用单智能体的平面SixRoomEnv用于对比实验运行方式与调试技巧示例文档注释hierarchical_training.py# 标准分层训练 python rllib/examples/hierarchical/hierarchical_training.py --maplarge --time-limit50 # 平面对比实验应观察到明显更难到达全局目标 python rllib/examples/hierarchical/hierarchical_training.py --flat # 调试模式关闭 tune 与分布式环境可在 RLlib 代码中打断点 python rllib/examples/hierarchical/hierarchical_training.py --no-tune --num-env-runners0示例还支持可选的 WandB 日志--wandb-key、--wandb-project、--wandb-run-name。3.4 预期实验结果示例注释给出了用--maplarge --time-limit500 --max-steps-low-level40 --num-low-level-agents3训练 100 轮后的结果hierarchical_training.py4 个策略的分层设置1 个高层 manager 3 个低层 expert下PPO 可以学会任务控制台会分别报告combined return总回报以及high_level_policy、各low_level_policy_i各自的回报例如combined return -8.4、high_level -5.2、low_level_policy_0 -1.19关键结论只有使用分层训练不设置--flat时 PPO 才能在此参数组合下学会而平面单策略方案很难到达全局目标——这直观展示了分层分解在长时程、子目标化任务上的优势。四、分层环境的实用建议与边界结合原文档与仓库实现总结以下几点工程经验时间轴由环境控制而非算法控制。RLlib 的多智能体 API 本身不感知层级交替节奏谁在何时行动、行动几次完全由环境step()的路由逻辑决定因此文档中的两种时间模式都可以直接实现无需改动算法。目标传递是低层观测的一部分。低层策略必须能看到高层下达的目标否则分层失去意义仓库用Tuple(当前位置, 目标位置)观测空间实现实践中也可改用向量拼接或 goal-conditioned 的网络输入。奖励要在正确的层级发放。高层奖励应当反映子目标选择的优劣仓库示例用归一化欧氏距离惩罚远目标低层奖励应当反映原始动作的执行质量步罚 到达子目标奖励切忌把奖励全发给单一层级。策略集合与映射函数要保持一致。policies中声明的策略 ID 必须与policy_mapping_fn的所有返回值一一对应policies_to_train可用来冻结某一层如训练高层、冻结低层专家策略。多智能体环境暂不可向量化。RLlib 目前对多智能体环境不支持向量化批量运行参见 multi-agent-envs.md 中的说明大规模分层训练时需评估环境步进的开销。五、深入阅读指引原文档hierarchical-envs.md可运行分层示例hierarchical_training.py分层环境实现six_room_env.py多智能体环境基类multi_agent_env.py多智能体配置 APIalgorithm_config.py多智能体通用指南multi-agent-envs.md【免费下载链接】rayRay is an AI compute engine. Ray consists of a core distributed runtime and a set of AI Libraries for accelerating ML workloads.项目地址: https://gitcode.com/gh_mirrors/ra/ray创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考