使用 Python TorchRL 进行多代理强化学习

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时计算 Flink 版,5000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: 本文详细介绍了如何使用TorchRL库解决多代理强化学习(MARL)问题,重点讨论了在多代理环境中应用近端策略优化(PPO)。通过使用VMAS模拟器,该文展示了如何在GPU上并行训练多机器人系统,使其在避免碰撞的同时到达目标。文章涵盖了依赖项安装、PPO原理、策略与评论家网络设计、数据收集及训练循环,并强调了TorchRL在简化开发流程、提升计算效率方面的优势。无论是集中式还是分布式评论家配置,TorchRL均能有效支持复杂的MARL研究与实践。

随着多代理系统的出现,强化学习的复杂性不断增加。为了管理这种复杂性,像 TorchRL 这样的专门工具提供了一个强大的框架,可以开发和实验多代理强化学习(MARL)算法。本文将深入探讨如何使用 TorchRL 解决 MARL 问题,重点关注多代理环境中的近端策略优化(PPO)。

我们将使用 VMAS 模拟器,这是一个多机器人模拟器并且可以在 GPU 上进行并行训练。他的主要目标多个机器人必须导航到各自的目标,同时避免碰撞。

依赖

在开始之前,请确保安装以下依赖项:

 !pip3 install torchrl  
 !pip3 install vmas  
 !pip3 install tqdm

理解近端策略优化 (PPO)

PPO 是一种策略梯度算法,它迭代地从环境中采样数据,并直接使用这些数据来优化策略。这个过程包括采样和训练两个阶段,数据在收集后立即进行训练更新。这种在线方法确保策略根据与环境最近的交互持续改进。

在线学习

在 PPO 中,学习过程依赖于一个评论家(critic),它评估策略所采取行动的质量。评论家估计给定状态的价值,通过比较预期回报与实际结果来指导策略优化。

在多代理设置中,我们部署多个策略,每个代理一个,通常以分散的方式运作。每个代理的策略仅根据其局部观察来决定其行动。但是评论家可以是集中的或分散的:

  • MAPPO : 评论家是集中的,以全局观察或连接的代理观察作为输入。这种方法在可获得全局状态信息的集中式训练场景中有益。
  • IPPO : 评论家是分散的,仅依赖于局部观察。这种设置支持分散式训练,代理只需要局部信息。

集中式评论家有助于缓解多个代理同时学习时出现的非平稳性问题,但可能因输入的高维度性而面临挑战。

TorchRL

TorchRL是一个基于PyTorch的强化学习(Reinforcement Learning, RL)库,专为研究人员和开发者设计,旨在提供一个灵活、高效的框架来实现和实验各种RL算法。

  1. 与PyTorch深度集成:TorchRL充分利用了PyTorch的生态系统,使用户能够无缝地将RL算法与深度学习模型结合。
  2. 模块化设计:库提供了可组合的组件,允许用户轻松构建和定制RL算法。
  3. 高性能:TorchRL注重效率,支持GPU加速和并行化,以加快训练和推理速度。
  4. 多环境支持:兼容多种RL环境,包括OpenAI Gym、DeepMind Control Suite等。
  5. 丰富的算法实现:内置多种流行的RL算法,如DQN、PPO、SAC等。
  6. 扩展性:易于扩展和添加新的算法、环境和功能。

下面代码我们将使用TorchRL来完成我们的目标

1、设置超参数

我们从定义 MARL 设置的超参数开始。这些参数控制模拟和训练过程的各个方面,如设备类型、批量大小、学习率和 PPO 特定设置。

 importtorch  
 fromtorchimportmultiprocessing  

 # 设置设备  
 is_fork=multiprocessing.get_start_method() =="fork"  
 device=torch.device(0) iftorch.cuda.is_available() andnotis_forkelsetorch.device("cpu")  
 vmas_device=device  # 运行 VMAS 模拟器的设备  
 # 采样和训练参数  
 frames_per_batch=6000    
 n_iters=10    
 total_frames=frames_per_batch*n_iters  
 # 训练细节  
 num_epochs=30    
 minibatch_size=400    
 lr=3e-4    
 max_grad_norm=1.0    
 # PPO 参数  
 clip_epsilon=0.2    
 gamma=0.99    
 lmbda=0.9    
 entropy_eps=1e-4

2、创建环境

TorchRL 与 VMAS 的集成允许我们高效地创建和管理多代理环境。在我们环境中多个代理必须在 LIDAR 传感器的引导下导航到各自的目标,同时避免碰撞。

 fromtorchrl.envs.libs.vmasimportVmasEnv  

 max_steps=100    
 num_vmas_envs=frames_per_batch//max_steps    
 scenario_name="navigation"  
 n_agents=3  
 env=VmasEnv(  
     scenario=scenario_name,  
     num_envs=num_vmas_envs,  
     continuous_actions=True,  
     max_steps=max_steps,  
     device=vmas_device,  
     n_agents=n_agents,  
 )

3、策略设计

策略网络在 PPO 中至关重要,它负责根据代理观察生成动作。鉴于环境中的连续动作空间,我们将使用 Tanh-Normal 分布来模拟动作,这样还可以决定是否在代理之间共享参数,在计算效率和行为多样性之间权衡。

 fromtorch.nnimportSequential, Tanh  
 fromtensordict.nnimportTensorDictModule  
 fromtorchrl.modulesimportMultiAgentMLP, ProbabilisticActor, TanhNormal  
 fromtensordict.nn.distributionsimportNormalParamExtractor  

 share_parameters_policy=True  
 # 定义策略网络  
 policy_net=Sequential(  
     MultiAgentMLP(  
         n_agent_inputs=env.observation_spec["agents", "observation"].shape[-1],  
         n_agent_outputs=2*env.action_spec.shape[-1],  
         n_agents=env.n_agents,  
         centralised=False,  
         share_params=share_parameters_policy,  
         device=device,  
         depth=2,  
         num_cells=256,  
         activation_class=Tanh,  
     ),  
     NormalParamExtractor(),  
 )  
 # 将网络包装在 TensorDictModule 中  
 policy_module=TensorDictModule(  
     policy_net,  
     in_keys=[("agents", "observation")],  
     out_keys=[("agents", "loc"), ("agents", "scale")],  
 )  
 # 创建概率性行动者  
 policy=ProbabilisticActor(  
     module=policy_module,  
     spec=env.unbatched_action_spec,  
     in_keys=[("agents", "loc"), ("agents", "scale")],  
     out_keys=[env.action_key],  
     distribution_class=TanhNormal,  
     distribution_kwargs={  
         "low": env.unbatched_action_spec[env.action_key].space.low,  
         "high": env.unbatched_action_spec[env.action_key].space.high,  
     },  
     return_log_prob=True,  
     log_prob_key=("agents", "sample_log_prob"),  
 )

4、评论家网络设计

评论家网络评估状态值,指导策略更新。可以根据使用 MAPPO 还是 IPPO 来选择集中式或分散式评论家。在代理之间共享参数可以加速训练,但是可能导致同质化策略。

 share_parameters_critic=True  
 mappo=True  # 设置为 False 以使用 IPPO  

 critic_net=MultiAgentMLP(  
     n_agent_inputs=env.observation_spec["agents", "observation"].shape[-1],  
     n_agent_outputs=1,    
     n_agents=env.n_agents,  
     centralised=mappo,  
     share_params=share_parameters_critic,  
     device=device,  
     depth=2,  
     num_cells=256,  
     activation_class=Tanh,  
 )  
 critic=TensorDictModule(  
     module=critic_net,  
     in_keys=[("agents", "observation")],  
     out_keys=[("agents", "state_value")],  
 )

5、数据收集

TorchRL 中的数据收集通过设计用于自动处理环境重置、动作计算和环境步进的类得到简化。所以我们可以直接使用

SyncDataCollector

来收集训练数据。

 fromtorchrl.collectorsimportSyncDataCollector  

 collector=SyncDataCollector(  
     env,  
     policy,  
     device=vmas_device,  
     storing_device=device,  
     frames_per_batch=frames_per_batch,  
     total_frames=total_frames,  
 )

6、训练循环

训练循环将环境、策略、评论家和数据收集器结合在一起,通过采样和训练阶段的迭代来优化代理的性能。

 fromtorchrl.data.replay_buffersimportReplayBuffer  
 fromtorchrl.data.replay_buffers.samplersimportSamplerWithoutReplacement  
 fromtorchrl.data.replay_buffers.storagesimportLazyTensorStorage  
 fromtorchrl.objectivesimportClipPPOLoss, ValueEstimators  
 fromtqdmimporttqdm  

 # 重放缓冲区设置  
 replay_buffer=ReplayBuffer(  
     storage=LazyTensorStorage(  
         size=frames_per_batch,  
         device=device,  
     ),  
     sampler=SamplerWithoutReplacement(),  
 )  
 # PPO 损失设置  
 ppo_loss=ClipPPOLoss(  
     actor=policy,  
     critic=critic,  
     clip_epsilon=clip_epsilon,  
     entropy_bonus=entropy_eps,  
     value_loss_coef=0.5,  
     gamma=gamma,  
     lam=lmbda,  
     advantage_normalization=True,  
 )  
 # 训练循环  
 foriintqdm(range(n_iters)):  
     batch=collector.next()  
     replay_buffer.extend(batch)  
     for_inrange(num_epochs):  
         forminibatchinreplay_buffer.sample(minibatch_size):  
             loss=ppo_loss(minibatch)  
             loss.backward()  
             torch.nn.utils.clip_grad_norm_(ppo_loss.parameters(), max_grad_norm)  
             optimizer.step()  
             optimizer.zero_grad()

这样我们完整的代码就完成了,可以看到通过TorchRL,可以减少我们很多的代码开发工作。

总结

本文提供了使用 TorchRL 和 PPO 实现 MARL 解决方案的全面指南。通过这些步骤,可以在多代理环境中训练代理以导航复杂任务,同时利用 GPU 加速模拟和并行计算的力量。无论选择集中式还是分散式评论家,TorchRL 都提供了设计和实验不同 MARL 架构,可以帮助你解决多代理强化学习的复杂性。

https://avoid.overfit.cn/post/37999439e6a4405f9f6d1f1f796af572

作者:Abish Pius

目录
相关文章
|
3月前
|
机器学习/深度学习 存储 算法
使用Python实现深度学习模型:强化学习与深度Q网络(DQN)
使用Python实现深度学习模型:强化学习与深度Q网络(DQN)
180 2
|
16天前
|
机器学习/深度学习 存储 定位技术
强化学习Agent系列(一)——PyGame游戏编程,Python 贪吃蛇制作实战教学
本文是关于使用Pygame库开发Python贪吃蛇游戏的实战教学,介绍了Pygame的基本使用、窗口初始化、事件处理、键盘控制移动、以及实现游戏逻辑和对象交互的方法。
|
2月前
|
数据采集 API 网络安全
Python Requests代理使用入门指南
《Python Requests 代理使用入门指南》将带你深入了解如何使用Python Requests库来配置HTTP代理,并灵活处理各种权限和服务器响应问题。从代理服务器的基础知识,到代理认证与授权设置,本指南为初学者提供了全面的教学内容。
Python Requests代理使用入门指南
|
1月前
|
数据采集 XML 前端开发
Python爬虫实战:利用代理IP爬取百度翻译
Python 爬虫实战:利用代理 IP 爬取百度翻译
102 2
|
2月前
|
数据安全/隐私保护 Python
【Python】已解决:urllib模块设置代理ip
【Python】已解决:urllib模块设置代理ip
27 2
【Python】已解决:urllib模块设置代理ip
|
1月前
|
机器学习/深度学习 存储 算法
【Python】 基于Q-learning 强化学习的贪吃蛇游戏(源码+论文)【独一无二】
【Python】 基于Q-learning 强化学习的贪吃蛇游戏(源码+论文)【独一无二】
|
2月前
|
机器学习/深度学习 算法 数据挖掘
Python强化学习应用于数据分析决策策略:** - 强化学习让智能体通过环境互动学习决策。
【7月更文挑战第5天】**Python强化学习应用于数据分析决策策略:** - 强化学习让智能体通过环境互动学习决策。 - Python因丰富库(如TensorFlow, PyTorch, Keras, Pandas, NumPy)和生态而受青睐。 - 使用OpenAI Gym构建环境,如`gym.make('CartPole-v0')`。 - 选择模型,例如神经网络,定义策略如Q-Learning。 - 训练模型,调整智能体行为,如Q-Learning更新Q表。 - 最后评估模型性能,实现数据驱动决策。
38 3
|
3月前
|
机器学习/深度学习 人工智能 算法
Python与强化学习:AlphaGo背后的编程逻辑
本文介绍了使用Python实现Q-learning算法,以模仿AlphaGo在围棋中的决策过程。强化学习涉及环境、智能体和状态,Q-learning是无模型的学习算法,通过优化Q函数来预测状态动作的预期收益。AlphaGo结合Policy Network和Value Network进行强化学习,而简单的实现可借助OpenAI Gym创建围棋环境,使用Tensorforce库实现Q-learning。不过,要达到AlphaGo的水平,还需深入研究和优化。
|
4月前
|
机器学习/深度学习 算法 Python
使用Python实现强化学习算法
使用Python实现强化学习算法
52 1
使用Python实现强化学习算法
|
3月前
|
JSON API 数据安全/隐私保护
Python基础-使用代理
Python基础-使用代理