当前位置: 首页 > news >正文

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

随着多代理系统的出现,强化学习的复杂性不断增加。为了管理这种复杂性,像 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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【AI大模型】提示词(Prompt)全面解析
  • 前端数据爬虫之puppeteer
  • 如何监控Spring Boot 项目运行情况?
  • Hive SQL 练习
  • 网络版本控制:协同进化的基石
  • 开学季有什么必买的好物?提升学习效率的好物来啦!学生党必看!
  • 从零开始带你玩转 AI 变现公开课
  • 【JVM】垃圾收集器与GC日志(一)
  • Top命令在linux中查看系统“任务管理”单词缩写解释
  • MySQL 模糊匹配邮件正文和主题,怎么写性能好
  • 年度精选热门骨传导耳机分享,让你分分钟避免踩雷的风险
  • 使用vueuse在组件内复用模板
  • Unity实现经验条动态自适应
  • 用Python实现时间序列模型实战——Day 3: 时间序列数据预处理
  • Windows 禁用tls 1.0 1.1
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • Android框架之Volley
  • Apache Zeppelin在Apache Trafodion上的可视化
  • AWS实战 - 利用IAM对S3做访问控制
  • JS函数式编程 数组部分风格 ES6版
  • js如何打印object对象
  • magento 货币换算
  • MYSQL 的 IF 函数
  • Python 反序列化安全问题(二)
  • Python学习之路13-记分
  • Python语法速览与机器学习开发环境搭建
  • Vue官网教程学习过程中值得记录的一些事情
  • XML已死 ?
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • #define,static,const,三种常量的区别
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • (备份) esp32 GPIO
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (剑指Offer)面试题34:丑数
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (三)Honghu Cloud云架构一定时调度平台
  • (十)T检验-第一部分
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • ******IT公司面试题汇总+优秀技术博客汇总
  • ***监测系统的构建(chkrootkit )
  • .Net Remoting常用部署结构
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET企业级应用架构设计系列之技术选型
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • @开发者,一文搞懂什么是 C# 计时器!
  • [ 转载 ] SharePoint 资料
  • [AIGC] SpringBoot的自动配置解析
  • [Assignment] C++1
  • [BSGS算法]纯水斐波那契数列
  • [BZOJ1089][SCOI2003]严格n元树(递推+高精度)
  • [C#基础知识系列]专题十七:深入理解动态类型
  • [CISCN2021 Quals]upload(PNG-IDAT块嵌入马)