MAPPO 算法的深度解析与应用和实现
【论文研读】 The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
说明:
- 来源:36th Conference on Neural Information Processing Systems (NeurIPS 2022) Track on Datasets and Benchmarks. 是NIPS文章,质量有保障,放心食用。
- 第5章节, Factors Influential to PPO’s Performance,分析了各个参数对于多智能体系统的影响,其分析方法和消融实验的方法是值得学习的。
0. 摘要
PPO 属于 on-policy 的算法,所以被认为它的样本效率比较低。在多智能体的环境下,off-policy的策略被广泛使用。在这项工作中,我们仔细研究了PPO在合作多智能体设置下的性能。我们展示了基于ppo的多智能体算法在四种流行的多智能体测试平台(粒子世界环境、星际争霸多智能体挑战、Google Research Football和Hanabi挑战)中实现了惊人的强大性能,只需要最小的超参数调整,并且没有任何特定领域的算法修改或架构。重要的是,与竞争性的 off-policy 方法相比,PPO通常在最终回报和样本效率方面都具有竞争力或更好的结果。
1. Intro
我们进行了全面的实证研究,以检验PPO在四种流行的合作多智能体基准测试中的性能:多智能体粒子世界环境(MPE)[22]、星际争霸多智能体挑战(SMAC)[28]、谷歌研究足球(GRF)[19]和Hanabi挑战[3]。我们首先表明,与 off-policy 基线相比,PPO实现了强大的任务性能和具有竞争力的样本效率。
然后,我们确定了五个对PPO性能特别重要的实现因素和超参数,提供了关于这些配置因素的具体建议,并直观地说明了为什么这些建议成立。
我们在这项工作中的目的 不是提出一种新的MARL算法,而是通过经验证明,通过简单的修改,PPO可以在各种合作多智能体设置中获得强大的性能。 我们还相信,我们的建议将有助于从业者与PPO取得有竞争力的结果。
我们的贡献总结如下:
•我们证明,PPO在没有任何特定领域的算法更改或架构以及最小调优的情况下,在四个多智能体合作基准测试中实现了与off-policy 方法竞争的最终性能。(PPO 可用性的证明,实证研究)
•我们证明PPO在使用与许多off-policy 方法相当数量的样本时获得了这些强有力的结果。(推翻先前PPO样本效率不如off-policy 的普遍认知)
•我们确定并分析了在这些环境中控制PPO实际性能的五个实施和超参数因素,并就这些因素提供了最佳实践的具体建议。(消融实验对超参数的分析)
2. 相关工作
MARL算法通常分为两种框架:集中式和分散式学习。
- 集中式方法[6]直接学习单一策略,产生所有智能体的联合动作。
- 在分散学习中[21],每个智能体独立地优化其奖励; 这些方法可以处理一般和博弈,但即使在简单的矩阵博弈中也可能存在不稳定性[12]。
- 集中训练和分散执行(CTDE)算法介于这两种框架之间。过去的几种CTDE方法[22,11]采用行动者-评论家结构,并学习以全局信息为输入的集中式评论家。值分解(VD)方法是另一类CTDE算法,它将联合 q 函数表示为智能体局部q函数的函数[32,27,31],并在流行的MARL基准测试中建立了最先进的结果[37,36]。
在单智能体连续控制任务中[8],非策略方法(如SAC[13])的进步导致了一个共识,即尽管它们早期取得了成功,但策略梯度(PG)算法(如PPO)的样本效率低于非策略方法。在多智能体领域也得出了类似的结论:[25]报告称,在粒子世界环境[23]和《星际争霸》多智能体挑战[28]中,多智能体PG方法(如COMA)的表现 被 MADDPG和QMix 超越 [27]。
多个并行工作研究了 PPO 在多智能体域中的使用。 [7] 经验表明,去中心化、独立的 PPO(IPPO)可以在几个硬 SMAC 地图中取得很高的成功率 - 然而,报告的 IPPO 结果总体上仍差于 QMix,并且该研究仅限于 SMAC。 [25] 对各种 MARL 算法进行了广泛的基准测试,并注意到基于 PPO 的方法通常与其他方法相比具有竞争力。 另一方面,我们的工作重点是 PPO,并在一组更全面的合作多智能体基准上分析其性能。 我们展示了 PPO 在绝大多数任务中取得了良好的结果,并识别和分析了 PPO 的不同实现和超参数因素,这些因素对其多智能体领域的性能有影响; 据我们所知,在过去的工作中,特别是在多智能体环境中,尚未对这些因素进行如此深入的研究。
我们对多智能体环境中 PPO 的实现和超参数因素的实证分析与单智能体强化学习中的策略梯度方法的研究类似[34,17,9,1]。 我们发现其中一些建议很有用,并将它们纳入我们的实施中。 在我们的分析中,我们关注的是现有文献中很大程度上没有得到充分研究的因素,或者是多智能体环境中完全独特的因素。
3. 多智能体下的PPO 架构
3.1 预备知识
我们研究具有共享奖励的分散式部分可观察马尔可夫决策过程(DEC-POMDP)[24]。关于这种类型的马尔可夫决策过程的描述如下所示:

所谓部分可观测,就是说每个智能体只能看到它周围的环境。(和这个有点不一样的是,在广告算力系统下,每个智能体的观测是全局的)
3.2 MAPPO 和 IPPO
我们在多智能体环境中实现的PPO与单智能体环境中的PPO非常相似,它通过学习一个策略πθ和一个值函数Vφ(s)来进行训练;这些函数被表示为两个独立的神经网络。值函数Vφ(s)用于方差减少,并且仅在训练过程中使用;因此,它可以接收额外的全局信息作为输入,这些信息在智能体的局部观察中不存在,使得多智能体领域中的PPO可以遵循CTDE结构。为了明确起见,我们将具有集中值函数输入的PPO称为MAPPO(多智能体PPO),将策略和值函数都使用局部输入的PPO称为IPPO(独立PPO)。需要注意的是,MAPPO和IPPO都适用于智能体共享共同奖励的环境,因为我们只关注合作环境。
通过上文,认识 IPPO和MAPPO的区别。
3.3 实现的细节
• 参数共享:在具有同质智能体的基准环境中(即智能体具有相同的观察和动作空间),我们利用参数共享;以前的研究表明,这可以提高学习的效率[5, 33],这也与我们的实证结果一致。在这些设置中,智能体共享策略和值函数的参数。附录C.2中提供了使用参数共享设置和为每个智能体学习独立参数的比较。我们指出,除了MPE中的Comm设置外,所有基准测试中的智能体都是同质的。
• 常见的实施做法:我们还采用了实施PPO的常见做法,包括广义优势估计(GAE)[29]、优势归一化和值剪辑。关于超参数搜索设置、训练细节和实施细节的完整描述详见附录C。我们的实施代码可以在https://github.com/marlbenchmark/on-policy找到。
4. 主要实验结果
5. 影响PPO性能的因素
null
6. 结论
这项工作表明,PPO(一种on-policy的策略梯度 RL 算法)在最终回报和样本效率方面都取得了强劲的成果,可与各种合作多智能体挑战的最先进方法相媲美,这表明 正确配置的 PPO 可以成为合作 MARL 任务的竞争基准。 我们还确定并分析了在这些环境中影响 PPO 性能的五个关键实施和超参数因素。 根据我们的实证研究,我们针对这些因素给出了最佳实践的具体建议。 这项工作存在一些局限性,为未来的研究指明了方向。 首先,我们的基准环境都使用离散的动作空间,都是合作的,并且在绝大多数情况下都包含同质代理。
在未来的工作中,我们的目标是在更广泛的领域测试 PPO,例如具有连续动作空间和异构代理的竞争性游戏和 MARL 问题。 此外,我们的工作本质上主要是实证性的,并没有直接分析 PPO 的理论基础。 我们相信,对我们建议的实证分析可以作为进一步分析 PPO 在 MARL 中的特性的起点。
7. 附录
7.1 算法的详情

MAPPO 训练两个独立的神经网络:参数为 θ 的行动者网络和参数为 φ 的值函数网络(称为批评家)。 如果代理是同质的,这些网络可以在所有代理之间共享,但每个代理也可以拥有自己的一对演员和评论家网络。 为了符号方便,我们在这里假设所有代理共享评论家和参与者网络。 具体来说,批评者网络(表示为 Vφ)执行以下映射:S → R。全局状态可以是特定于代理的或与代理无关的。
actor网络表示为 πθ,将代理观察 o(a) t 映射到离散动作空间中动作的分类分布,或者映射到多元高斯分布的均值和标准差向量,从中连续采样动作 行动空间。 actor 网络经过训练以最大化下面的目标:

上面目标的第一部分,目的是最大化优势,让actor朝着批评家指引的方向去走。第二部分,目的是让策略的熵最大化,也就是尽可能的分散一些,避免输出的动作分布过于集中。
这里需要注意,actor网络的输出不是一个特定的动作,而是一个分布!!!
所以接着还有从分布中抽样动作的一步。
批评家网络的目标是啥呢?
让估计的未来的回报最大化。

在上面的损失函数中,B 指的是批量大小,n 指的是代理的数量。
如果批评者和行动者网络是 RNN,则损失函数会随着时间的推移而求和,并且网络通过时间反向传播 (BPTT) 进行训练。
8. 个人思考后余留问题
Compute advantage estimate A via GAE on τ , using PopArt。这句话中GAE方法计算优势函数的原理和技术是什么。
RNN 计算的隐藏状态是如何被使用的?
原文地址:
https://arxiv.org/pdf/2103.01955.pdf
https://bair.berkeley.edu/blog/2021/07/14/mappo/
相关文章:
MAPPO 算法的深度解析与应用和实现
【论文研读】 The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games 说明: 来源:36th Conference on Neural Information Processing Systems (NeurIPS 2022) Track on Datasets and Benchmarks. 是NIPS文章,质量有保障&…...
API接口的涉及思路以及部分代码
在现代软件开发中,API(Application Programming Interface)接口扮演了一个至关重要的角色。通过API接口,不同的应用程序、系统或服务之间可以进行数据交换和相互调用,实现功能的扩展和集成。本文将探讨API接口的设计思…...
Stable Diffusion无需代码连接QQ邮箱的方法
Stable Diffusion用户使用场景: 电商商家在产品测试阶段,通过微信社群日常收集用户对产品设计的反馈,包括对产品的修改建议或外观设计等,并将这些反馈上传至集简云小程序。然后,他们使用Stable Diffusion AI工具生成图…...
Excel表格(一)
1.单一栏的宽度和高度设置 2.大标题的跨栏居中 3.让单元格内的文字------自动适应 4.序号递增 5.货币符号 6.日期格式的选择 选到单元格,选中对应的日期格式 7.自动求和的计算 然后在按住回车键即可求出当前行的金额 点击自动求和 8.冻结表格栏 9.排序 1.单栏排序 …...
详细介绍渗透测试与漏洞扫描
一、概念 渗透测试: 渗透测试并没有一个标准的定义,国外一些安全组织达成共识的通用说法;通过模拟恶意黑客的攻击方法,来评估计算机网络系统安全的一种评估方法。这个过程包括对系统的任何弱点、技术缺陷或漏洞的主动的主动分析…...
Scikit-learn聚类方法代码批注及相关练习
一、代码批注 代码来自:https://scikit-learn.org/stable/auto_examples/cluster/plot_dbscan.html#sphx-glr-auto-examples-cluster-plot-dbscan-py import numpy as np from sklearn.cluster import DBSCAN from sklearn import metrics from sklearn.datasets …...
C#程序的启动显示方案(无窗口进程发送消息) - 开源研究系列文章
今天继续研究C#的WinForm的实例显示效果。 我们上次介绍了Winform窗体的唯一实例运行代码(见博文:基于C#的应用程序单例唯一运行的完美解决方案 - 开源研究系列文章 )。这就有一个问题,程序已经打开了,这时候再次运行该应用程序,…...
java泛型和通配符的使用
泛型机制 本质是参数化类型(与方法的形式参数比较,方法是参数化对象)。 优势:将类型检查由运行期提前到编译期。减少了很多错误。 泛型是jdk5.0的新特性。 集合中使用泛型 总结: ① 集合接口或集合类在jdk5.0时都修改为带泛型的结构② 在实例化集合类时…...
【网络】自定义协议 | 序列化和反序列化 | 以tcpServer为例
本文首发于 慕雪的寒舍 以tcpServer的计算器服务为例,实现一个自定义协议 阅读本文之前,请先阅读 tcpServer 本文完整代码详见 Gitee 1.重谈tcp 注意,当下所对tcp的描述都是以简单、方便理解起见,后续会对tcp协议进行深入解读 …...
06-3_Qt 5.9 C++开发指南_多窗体应用程序的设计(主要的窗体类及其用途;窗体类重要特性设置;多窗口应用程序设计)
文章目录 1. 主要的窗体类及其用途2. 窗体类重要特性的设置2.1 setAttribute()函数2.2 setWindowFlags()函数2.3 setWindowState()函数2.4 setWindowModality()函数2.5 setWindowOpacity()函数 3. 多窗口应用程序设计3.1 主窗口设计3.2 QFormDoc类的设计3.3 QFormDoc类的使用3.…...
(力扣)用两个栈实现队列
这里是栈的源代码:栈和队列的实现 当然,自己也可以写一个栈来用,对题目来说不影响,只要符合栈的特点就行。 题目: 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、pe…...
【自动化测试框架】关于unitttest你需要知道的事
一、UnitTest单元测试框架提供了那些功能 1.提供用例组织和执行 如何定义一条“测试用例”? 如何灵活地控制这些“测试用例”的执行? 2.提供丰定的断言方法 当测试用例的执行结果与预期结果不一致时,判定测试用例失败。在自动化测试中,通过“断言”…...
手机便签中可以打勾的圆圈或小方块怎么弄?
在日常的生活和工作中,很多网友除了使用手机便签来记录灵感想法、读书笔记、各种琐事、工作事项外,还会用它来记录一些清单,例如待办事项清单、读书清单、购物清单、旅行必备物品清单等。 在按照记录的清单内容来执行的时候,为了…...
【Linux】gdb 的使用
目录 1. 使用 gdb 的前置工作 2. 如何使用 gdb 进行调试 1、如何看到我的代码 2、如何打断点 3、怎么运行程序 4、如何进行逐过程调试 5、如何进行逐语句调试 6、如何监视变量值 7、如何跳到指定位置 8、运行完一个函数 9、怎么跳到下一个断点 10、如何禁用/开启…...
C++11之右值引用
C11之右值引用 传统的C语法中就有引用的语法,而C11中新增了的 右值引用(rvalue reference)语法特性,所以从现在开始我们之前学习的引用就叫做左值引用(lvalue reference)。无论左值引用还是右值引用&#…...
【PHP的设计模式】
PHP的设计模式 一、策略模式二、工厂模式三、单例模式四、注册模式五、适配器模式六、观察者模式 一、策略模式 策略模式是对象的行为模式,用意是对一组算法的封装。动态的选择需要的算法并使用。 策略模式指的是程序中涉及决策控制的一种模式。策略模式功能非常强…...
React 之 Redux - 状态管理
一、前言 1. 纯函数 函数式编程中有一个非常重要的概念叫纯函数,JavaScript符合函数式编程的范式,所以也有纯函数的概念 确定的输入,一定会产生确定的输出 函数在执行过程中,不能产生副作用 2. 副作用 表示在执行一个函数时&a…...
集合转数组
首先,我们在看到集合转数组的时候可能第一个想到的就是toArray(),但是我们在调用 toArray()的时候,可能会遇到异常 java.lang.ClassCastException;这是因为 toArray()方法返回的类型是 Obejct[],如果我们将其转换成其他类型&#…...
使用Python将Word文档转换为PDF的方法
摘要: 文介绍了如何使用Python编程语言将Word文档转换为PDF格式的方法。我们将使用python-docx和pywin32库来实现这个功能,这些库提供了与Microsoft Word应用程序的交互能力。 正文: 在现实生活和工作中,我们可能会遇到将Word文…...
Java 判断一个字符串在另一个字符串中出现的次数
1.split实现 package com.jiayou.peis.official.account.biz.utils;public class Test {public static void main(String[] args) {String k"0110110100100010101111100101011001101110111111000101101001100010101" "011101100101011010100011111010111001001…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
