第 10 章 MARL 基础——多智能体强化学习¶
性质:算法工程教学 | 难度跨度:⭐⭐ ~ ⭐⭐⭐⭐ | 预计精读:24-30 小时
一句话定位:从 1994 年 Littman 的 Markov Game 形式化,到 2017 年 MADDPG 奠基的 CTDE(集中训练分布执行)范式,再到 2018-2022 年 QMIX/MAPPO/HAPPO 三条主线的成熟——本章完整讲透合作型多智能体强化学习的数学骨架与工程实现:为什么多个智能体一起学习会让单智能体 RL 的收敛保证全部失效(非平稳性)、CTDE 如何用"训练时开天眼、执行时各自为政"绕开这个困难、值分解与多智能体策略梯度两条技术路线各自如何解决信用分配问题,以及它们与第 3 章离散任务分配、与
01_数学/70_强化学习数学单智能体理论之间的精确接口。
前置自测¶
开始前先回答下面 5 个问题。这是一篇建立在单智能体强化学习之上的章节——如果答不出 2 题以上,强烈建议先回 01_数学/70_强化学习数学 把单智能体的地基补齐,否则本章关于"为什么单智能体的保证会失效"的每一处对比你都会读得云里雾里。
-
马尔可夫决策过程(MDP)的五元组是什么? 贝尔曼最优方程为什么保证值迭代收敛?这个收敛证明依赖于转移核 \(P(s'|s,a)\) 的什么性质——它是固定的还是会变的? (答不出 → 回
01_数学/70_强化学习数学/10_MDP与动态规划基础.md) -
策略梯度定理(Policy Gradient Theorem)的最终形式是什么? 为什么梯度里会出现优势函数 \(A^\pi(s,a)\) 而不是直接用回报 \(G_t\)?基线(baseline)为什么能降方差却不引入偏差? (答不出 → 回
01_数学/70_强化学习数学/20_策略梯度与Actor_Critic.md§3-§5) -
PPO 的 clipped surrogate 目标长什么样? 重要性采样比 \(r(\theta)=\pi_\theta(a|s)/\pi_{\theta_\text{old}}(a|s)\) 的作用是什么?为什么 PPO 要求"新旧策略不能差太远"? (答不出 → 回
01_数学/70_强化学习数学/20_策略梯度与Actor_Critic.md§8-§9) -
部分可观测(POMDP)下,为什么"用当前观测 \(o_t\) 直接当状态"会出问题? 信念状态(belief state)是什么?为什么最优策略一般需要依赖历史而非单步观测? (答不出 → 回
01_数学/70_强化学习数学/10_MDP与动态规划基础.md的 POMDP 小节) -
(接第 3 章)任务分配回答"谁去做哪件任务"是一个离散的、一次性的决策。 如果"谁做什么"不是一次拍卖就定下来,而是每一步都要根据环境变化重新决定、而且每个机器人的动作会持续影响别人——这种"持续耦合的序贯决策"用任务分配的框架还能描述吗? (答不出 → 回第 3 章 §3.1,再带着这个问题读本章 §10.1)
参考答案要点(先自己答,再对照):
-
MDP 五元组 \((\mathcal{S}, \mathcal{A}, P, R, \gamma)\)。值迭代收敛靠贝尔曼算子是 \(\gamma\)-压缩映射(contraction),而压缩性的前提是**转移核 \(P\) 固定不变**——这是 Banach 不动点定理的要求。本章的核心困难恰恰是:多智能体环境中,从单个智能体视角看,"环境"包含了其他正在学习的智能体,于是有效转移核随别人策略改变而漂移,压缩性被破坏。
-
策略梯度定理:\(\nabla_\theta J(\theta) = \mathbb{E}_{s\sim d^\pi, a\sim\pi_\theta}[\nabla_\theta\log\pi_\theta(a|s)\, A^\pi(s,a)]\)。用优势 \(A=Q-V\) 而非 \(G_t\) 是因为减去只依赖状态的基线 \(V(s)\) 不改变梯度期望(基线项期望为零),却能大幅降低方差。
-
\(L^{\text{clip}}(\theta)=\mathbb{E}[\min(r(\theta)A,\ \text{clip}(r(\theta),1-\epsilon,1+\epsilon)A)]\)。重要性采样比让我们能用旧策略采的数据更新新策略;要求新旧策略接近是因为重要性采样的方差随策略差异指数增长,clip 把这种差异"截断"在信赖域内。
-
单步观测 \(o_t\) 一般不是马尔可夫的——不同的历史可能导致相同的 \(o_t\) 却需要不同的最优动作(状态混叠,state aliasing)。信念状态是给定历史下对真实状态的后验分布 \(b_t(s)=P(s|o_{1:t},a_{1:t-1})\),它是充分统计量,基于信念的策略才是最优的。实践中用 RNN 编码历史来近似信念。
-
不能。任务分配是离散、静态的匹配问题(指派问题);"持续耦合的序贯决策"需要的是**随机博弈/Dec-POMDP** 这套框架——状态会转移、奖励是序贯累积的、每个智能体的动作通过共享状态持续影响他人。这正是 MARL 要刻画的对象,也是本章 §10.1 的起点。第 3 章的离散分配是 MARL 的一个"被冻结成单步"的特例。
本章目标¶
学完本章后,你应该能够:
- **严格写出**合作型 MARL 的两套形式化——随机博弈(Markov Game / Stochastic Game)与去中心化部分可观测马尔可夫决策过程(Dec-POMDP)——说清楚它们各自的元组、目标函数,以及"团队奖励 vs 个体奖励""完全可观测 vs 部分可观测"两个维度如何把 MARL 切成合作/竞争/混合三大类。
- 从数学上论证**多智能体学习的核心困难——**非平稳性(non-stationarity):为什么从单个智能体视角看环境的有效转移核会漂移、为什么这会让单智能体 RL 的收敛证明(压缩映射、独立同分布回放)全部失效,以及它和"信用分配""维度爆炸""均衡选择"等其他困难的关系。
- 解释并实现 CTDE(Centralized Training, Decentralized Execution)范式——为什么"训练时让 critic 看全局、执行时让 actor 只看本地"能同时绕开非平稳性和部署时的通信约束,CTDE 与完全去中心化(independent learning)、完全集中式(joint learning)三者的谱系定位。
- 从零推导值分解(Value Decomposition)这条线——VDN 的可加分解、QMIX 的单调混合网络与超网络(hypernetwork)参数化、个体-全局最大一致性(Individual-Global-Max, IGM)原则,理解单调性约束如何保证"分布式 argmax 等于集中式 argmax"、以及它牺牲了什么表达能力(QTRAN/QPLEX 如何放松)。
- 从零推导多智能体策略梯度这条线——MADDPG 的集中式 critic 如何吸收非平稳性、COMA 的反事实基线(counterfactual baseline)如何解决信用分配、MAPPO 为什么"一个共享参数的 PPO 加全局 critic"就能成为合作 MARL 的最强基线、HAPPO 的多智能体优势分解引理如何把单调改进保证从单智能体推广到多智能体的顺序更新。
- 掌握信用分配(credit assignment)问题的统一视角——团队奖励下"谁的功劳"为什么是 MARL 的根本难题,差分奖励(difference rewards)、反事实基线、值分解三种解法的内在联系。
- 能用 PyTorch 从零搭建一个最小可运行的 MAPPO 训练循环,并能在 PettingZoo / Multi-Agent MuJoCo / SMAC 这类标准环境中配置训练,能对比 MAPPO、IPPO、QMIX 的收敛行为并解释差异。
本章知识导航¶
本章的知识结构是一棵以"如何让一群智能体通过强化学习学会协作"为根的树。树干是**一个问题(怎么形式化)+ 一个困难(非平稳性)+ 一个范式(CTDE)+ 两条技术路线(值分解 / 策略梯度)**,树枝是每条路线下的具体算法和工程实现。
怎么把"多智能体协作"写成可优化的数学问题? (§10.1 Markov Game / Dec-POMDP)
│
▼
为什么多智能体学习这么难? (§10.2 非平稳性与四大困难)
│
▼
一个统一的破局思路:CTDE (§10.3 集中训练分布执行)
│
├─→ 路线 A:值分解 (§10.4)
│ VDN → QMIX → IGM 原则 → QTRAN/QPLEX
│ (核心:分布式 argmax = 集中式 argmax)
│
├─→ 路线 B:多智能体策略梯度 (§10.5)
│ MADDPG (集中 critic) → COMA (反事实基线)
│ → MAPPO (共享 PPO + 全局 critic) → HAPPO (优势分解+顺序更新)
│
▼
贯穿两条路线的根本问题:信用分配 (§10.6)
│
▼
工程实现:从零搭 MAPPO + 环境配置 + 三算法对比 (§10.7)
│
▼
与单智能体 RL、与第 3 章、与前沿的关系 (§10.8)
| 小节 | 主题 | 难度 | 一句话 |
|---|---|---|---|
| §10.1 | 问题形式化 | ⭐⭐⭐ | Markov Game 与 Dec-POMDP:把协作写成可优化对象 |
| §10.2 | 非平稳性与核心困难 | ⭐⭐⭐ | 为什么单智能体 RL 的保证全部失效 |
| §10.3 | CTDE 范式 | ⭐⭐⭐ | 训练开天眼、执行各自为政——绕开非平稳性 |
| §10.4 | 值分解(VDN/QMIX) | ⭐⭐⭐⭐ | 单调混合让分布式 argmax 等于集中式 argmax |
| §10.5 | 多智能体策略梯度 | ⭐⭐⭐⭐ | MADDPG/COMA/MAPPO/HAPPO 四步演进 |
| §10.6 | 信用分配 | ⭐⭐⭐ | 团队奖励下"谁的功劳"的三种解法 |
| §10.7 | 工程实现与对比 | ⭐⭐⭐ | 从零搭 MAPPO + 标准环境 + 算法对比 |
| §10.8 | 关系网与前沿 | ⭐⭐ | 与单智能体、与第 3 章、与 Mean-Field 的接口 |
两条阅读线:
- 理论线(理解数学):§10.1→§10.2→§10.3→§10.4→§10.5→§10.6,重点是形式化、非平稳性证明、IGM 原则与优势分解引理的推导。适合要做 MARL 研究、读论文写论文的读者。
- 工程线(会用就行):§10.1(只读元组和直觉)→§10.3→§10.5(重点 MAPPO)→§10.7→§10.8,重点是 CTDE 的工程含义、MAPPO 的实现与调参、环境配置。适合要在机器人任务上跑通多智能体训练的读者。
无论哪条线,§10.1(形式化)和 §10.3(CTDE)都是必读——它们是理解后续所有算法的公共语言。§10.4 和 §10.5 是两个 ⭐⭐⭐⭐ 的硬核小节,值得花最多时间;如果时间有限、且目标是机器人控制,优先精读 §10.5 的 MAPPO 部分(机器人领域的事实标准),§10.4 的值分解可先读 QMIX 的思想、跳过 QTRAN/QPLEX 的细节。
前置知识桥接¶
本章是 01_数学/70_强化学习数学(单智能体 RL 理论)在多智能体场景的延伸,同时与本 Part 第 3 章(任务分配与路径规划)在"离散决策 vs 序贯学习"上形成对照。这里把最关键的前置点重新激活——你不必翻回去就能跟上:
-
回顾 MDP 与压缩映射(
01_数学/70_强化学习数学/10):单智能体 RL 的全部理论保证都挂在一个支点上——贝尔曼算子 \(\mathcal{T}\) 是 \(\gamma\)-压缩映射,因此值迭代/Q-learning 收敛到唯一不动点。压缩性的证明用到了**转移核 \(P(s'|s,a)\) 固定**这一条。把这一条记牢,因为本章 §10.2 的全部论证就是在说:多智能体让这一条失效了。 -
回顾策略梯度定理与 GAE(
01_数学/70_强化学习数学/20§3-§5):\(\nabla_\theta J=\mathbb{E}_{s\sim d^\pi,a\sim\pi_\theta}[\nabla_\theta\log\pi_\theta(a|s)A^\pi(s,a)]\)。优势函数 \(A^\pi=Q^\pi-V^\pi\) 通过减去状态基线 \(V^\pi\) 降方差。广义优势估计(GAE)用 \(\lambda\) 在偏差和方差间插值。本章 §10.5 的 MADDPG/COMA/MAPPO/HAPPO 全部是这个定理在多智能体下的"加料版本"——加的料就是"用什么 critic、用什么基线、按什么顺序更新"。 -
回顾 PPO 的 clip 机制(
01_数学/70_强化学习数学/20§8-§9):PPO 用 \(L^{\text{clip}}=\mathbb{E}[\min(rA,\text{clip}(r,1\pm\epsilon)A)]\) 把信赖域约束"软化"成裁剪。MAPPO 就是把这个一模一样的目标函数搬到每个智能体身上、再共享参数;HAPPO 则把 TRPO 的单调改进定理推广到多智能体。理解 PPO 的 clip 为什么有效,是理解 MAPPO 为什么是强基线的前提。 -
回顾第 3 章:离散任务分配(第 3 章 §3.1-§3.2):第 3 章把"谁干什么"建模成指派问题(匈牙利算法最优、CBBA 分布式 50% 界)。那是**一次性、离散、无状态转移**的决策。本章处理的是它的"动态化"——当分工不能一次定死、当每一步的动作通过共享状态持续影响他人时,问题从组合优化变成了随机博弈。一个有用的心智模型:MARL 是"被解冻成序贯过程"的任务分配,而任务分配是"被冻结成单步"的 MARL。
前向预告:本章只讲 MARL 的**基础**——形式化、非平稳性、CTDE、值分解、策略梯度四大块。把这些方法真正用到"多机器人运动协调"(编队、避障、协同搬运)的连续控制场景,是下一章(第 11 章 MARL 多机运动协调)的主题;把 MARL 和传统规控(MPC、人工势场)混合(学习高层、规控保底层)是第 12 章的主题。现在只需要知道:本章学的 MAPPO/QMIX 是"算法内核",后面两章是把这个内核装进机器人系统的"外壳"。
如果跳过本章会怎样¶
跳过第 10 章,你会卡在三个具体的地方。
场景一:"独立训练的智能体永远学不收敛"。 你有 4 个机器人要学协同覆盖一片区域。你图省事,把单智能体 PPO 复制 4 份,每个机器人独立训练(independent PPO, IPPO),把别人当环境的一部分。训练曲线剧烈震荡,奖励上不去,换了学习率、换了网络也没用。根本原因是非平稳性——每个智能体在优化时,其他三个智能体的策略也在变,于是它面对的"环境"一直在漂移,昨天学到的好策略今天就过时了。没有 §10.2 的非平稳性分析和 §10.3 的 CTDE,你不知道问题出在哪、也不知道"给 critic 喂全局信息"为什么能救命。
场景二:"团队拿了奖励,但不知道该夸谁"。 你的多机搬运任务只有一个团队奖励——货物送到了给 +100,没送到给 0。训练时所有智能体的策略梯度都用这同一个团队奖励,结果是:明明只有 1 号机器人干了活、2 号在原地打转,但因为团队成功了,2 号的"原地打转"也被当成好动作强化了。这就是信用分配(credit assignment)问题。没有 §10.6 的差分奖励 / 反事实基线 / 值分解,你的智能体会学出一堆"搭便车"(free-riding)的懒汉策略。
场景三:"QMIX 和 MAPPO 到底该用哪个?为什么我的离散动作任务 MAPPO 跑不过 QMIX?" 你在一个离散动作的 SMAC 任务上同时试了 QMIX 和 MAPPO,发现稀疏奖励下 QMIX 学不动、稠密奖励下 QMIX 又比 MAPPO 还稳,一头雾水。没有 §10.4 和 §10.5 对两条路线的机理对比(值分解吃稠密奖励、策略梯度对稀疏奖励更鲁棒、离散 vs 连续动作、同构 vs 异构),你只能盲目试,选型全靠运气。
预计阅读时间¶
| 模式 | 时长 | 适合 |
|---|---|---|
| 精读(跟着推完非平稳性的形式化论证、QMIX 的 IGM 单调性证明、HAPPO 的优势分解引理,亲手搭一遍 MAPPO 训练循环,做完每节练习) | 24-30 小时 | 第一次系统学 MARL、要做研究或在机器人上落地的工程师。建议分 5-6 次。 |
| 速读(读懂各算法的设计动机与适用边界、关键公式,跳过证明细节和代码逐行走读) | 7-9 小时 | 已有单智能体 RL 背景,想建立 MARL 全局图景、做选型 |
| 速查(CTDE 谱系图 + 值分解 vs 策略梯度对比表 + IGM 原则 + MAPPO 实现要点 + 信用分配三解法 + 故障排查) | 50-70 分钟 | 已学过、实现时回查特定机制 |
科研发展脉络¶
在钻进具体方法前,先把这条研究线的来龙去脉理清——知道每个方法"从哪来、解决了前人什么痛点、又留下什么给后人",比孤立地记名字有用得多。MARL 不是一条单线,而是"形式化奠基 → 非平稳性破局(CTDE)→ 两条技术路线并行成熟"的演化。
| 年份 | 工作 | Venue | 核心贡献 |
|---|---|---|---|
| 1994 | Littman, "Markov Games as a Framework for MARL" | ICML | 形式化奠基:用随机博弈(Markov Game)统一描述多智能体 RL,minimax-Q |
| 2000 | Boutilier;Bernstein 等 | — / Math. OR | Dec-POMDP 奠基:去中心化部分可观测模型;证明其求解为 NEXP-完全 |
| 2008 | Busoniu 等, "A Comprehensive Survey of MARL" | IEEE SMC | 第一代综述:系统梳理合作/竞争/混合三类与非平稳性困难 |
| 2016 | Foerster 等, "Learning to Communicate (RIAL/DIAL)" | NeurIPS | 可微通信 + 集中训练思想:训练时端到端反传通信梯度 |
| 2017 | Lowe 等, "MADDPG" | NeurIPS | CTDE 奠基:集中式 critic 吸收非平稳性,分布式 actor 部署 |
| 2018 | Foerster 等, "COMA" | AAAI | 反事实信用分配:counterfactual baseline 解决"谁的功劳" |
| 2018 | Sunehag 等, "VDN" | AAMAS | 值分解最简形式:\(Q_{\text{tot}}=\sum_i Q_i\),可加分解 |
| 2018 | Rashid 等, "QMIX" | ICML | 单调混合网络:\(Q_{\text{tot}}=f_{\text{mono}}(Q_1,...,Q_N;s)\),超网络参数化 |
| 2019 | Son 等, "QTRAN" | ICML | 放松 IGM 约束:无结构约束的因子分解 + 线性约束修正 |
| 2019 | Rashid 等, "MAVEN";Wang 等, "QPLEX" | NeurIPS / ICLR'21 | 表达力与探索:duplex dueling 把 IGM 完整刻画;隐变量探索 |
| 2020 | Papoudakis/Schroeder de Witt 等基准 | NeurIPS Datasets | 统一基准:在合作任务上系统对比 VDN/QMIX/MAPPO/IPPO |
| 2022 | Kuba 等, "HATRPO/HAPPO" | ICLR | 多智能体优势分解引理:顺序更新→单调改进保证→天然支持异构 |
| 2022 | Yu 等, "The Surprising Effectiveness of MAPPO" | NeurIPS | 强基线翻案:共享参数 PPO + 全局 critic 全面胜过 QMIX/MADDPG |
| 2023 | Zhong 等, "HARL(Heterogeneous-Agent RL)" | JMLR | 统一异构库:HAPPO/HATD3/HASAC 一致实现,序贯更新框架 |
关键脉络梳理:MARL 的历史可以读成"两次破局"。
第一次破局是 CTDE(2017, MADDPG)——在此之前,要么完全独立学习(independent learning,被非平稳性折磨),要么完全集中式(joint action learning,被联合动作空间的指数爆炸折磨)。CTDE 是中间道路:训练时集中(用全局信息消除非平稳性),执行时分布(用本地观测满足部署约束)。这个范式之后成了几乎所有合作 MARL 方法的公共骨架。
第二次破局是 两条路线在 CTDE 骨架上的成熟:
- 值分解路线(VDN→QMIX→QTRAN/QPLEX) 把"如何让分布式的局部贪婪 = 集中式的全局最优"形式化为 IGM 原则,主战场是离散动作、协作、SMAC 这类任务。
- 策略梯度路线(MADDPG→COMA→MAPPO→HAPPO) 把单智能体 actor-critic 的 critic 集中化,主战场是连续动作、机器人控制。其中 MAPPO(2022)的"翻案"——证明一个最朴素的共享 PPO 在调好超参后是最强基线——彻底改变了领域的方法选择默认值。
看这条线,有一条清晰的主线:决策从"每个人闭眼自学"(独立学习)走向"训练时共享全局、执行时各自独立"(CTDE),再走向"在 CTDE 内部把信用分配做得越来越精细"。本章讲的就是这条主线的全貌,重点落在 CTDE(§10.3)和两条路线的代表方法(§10.4、§10.5)。
本章符号约定¶
| 符号 | 含义 | 首见 |
|---|---|---|
| \(N\) | 智能体(agent)数量 | §10.1 |
| \(i, j\) | 智能体下标,\(i\in\{1,\dots,N\}\) | §10.1 |
| \(-i\) | "除 \(i\) 之外的所有智能体" | §10.1 |
| \(\mathcal{S}\) | 全局状态空间,状态 \(s\in\mathcal{S}\) | §10.1 |
| \(\mathcal{O}_i\) | 智能体 \(i\) 的观测空间,观测 \(o_i\) | §10.1 |
| \(\mathcal{A}_i\) | 智能体 \(i\) 的动作空间,动作 \(a_i\) | §10.1 |
| \(\mathbf{a}=(a_1,\dots,a_N)\) | 联合动作(joint action) | §10.1 |
| \(\boldsymbol{\pi}=(\pi_1,\dots,\pi_N)\) | 联合策略 | §10.1 |
| \(\pi_i(a_i\mid o_i)\) | 智能体 \(i\) 的(分布式)策略 | §10.1 |
| \(P(s'\mid s,\mathbf{a})\) | 联合转移核 | §10.1 |
| \(O_i(o_i\mid s)\) | 智能体 \(i\) 的观测函数 | §10.1 |
| \(r(s,\mathbf{a})\) | 团队(共享)奖励 | §10.1 |
| \(r_i(s,\mathbf{a})\) | 智能体 \(i\) 的个体奖励 | §10.1 |
| \(Q_i(o_i,a_i)\) | 智能体 \(i\) 的个体动作值(值分解中称 utility) | §10.4 |
| \(Q_{\text{tot}}(s,\mathbf{a})\) | 联合动作值 | §10.4 |
| \(V(s)\) / \(V_\phi(s)\) | (集中式)状态值函数 / 其参数化 | §10.5 |
| \(A(s,\mathbf{a})\) | 联合优势函数 | §10.5 |
| \(A_i\) | 智能体 \(i\) 的(反事实/分解)优势 | §10.5 |
| \(\tau_i\) | 智能体 \(i\) 的局部历史(action-observation history) | §10.1 |
| \(\theta_i, \phi\) | actor 参数 / critic 参数 | §10.5 |
术语统一约定:本章中"智能体"与"agent"互换使用(机器人语境下一个 agent 就是一个机器人或一个可控实体);"集中训练分布执行"统一缩写为 CTDE;"非平稳性"统一指 non-stationarity(不写"不稳定性"以免与数值稳定性混淆);"值分解"指 value decomposition / value factorisation(同义,统一用"值分解")。
§10.1 问题形式化:Markov Game 与 Dec-POMDP ⭐⭐⭐¶
这一节解决什么问题:在写任何算法之前,我们必须先回答一个看似抽象、实则决定一切的问题——"多个智能体协作"到底是个什么样的数学对象? 单智能体 RL 有 MDP 作为公共语言,多智能体也需要它的公共语言。这一节给出两套形式化:随机博弈(Markov Game)和去中心化部分可观测马尔可夫决策过程(Dec-POMDP)。搞清楚它们的元组、目标和适用边界,后面 §10.2 才能精确地说"非平稳性破坏了哪一条"、§10.3 才能精确地说"CTDE 利用了哪一条"。
动机:单智能体 MDP 为什么不够用¶
回顾一下单智能体 RL 的世界观。我们有一个智能体、一个环境。环境用 MDP \((\mathcal{S},\mathcal{A},P,R,\gamma)\) 描述:智能体在状态 \(s\) 选动作 \(a\),环境按 \(P(s'|s,a)\) 转移、给奖励 \(R(s,a)\)。智能体的目标是找一个策略 \(\pi(a|s)\) 最大化期望折扣回报 \(\mathbb{E}[\sum_t\gamma^t R_t]\)。这套世界观的核心假设是:环境是被动的、固定的——转移核 \(P\) 和奖励 \(R\) 不会因为智能体学到了什么而改变。正是这个假设,让贝尔曼算子成为压缩映射、让 Q-learning 收敛、让经验回放(experience replay)里的样本可以当独立同分布来用。
现在考虑一个真实的多机器人场景:仓库里有 4 台 AGV,要协同把货物从入口运到出口,互相之间不能相撞、还要尽量不堵塞通道。如果我们硬要套单智能体 MDP,会立刻遇到一个尴尬的问题:对 1 号 AGV 来说,"环境"是什么? 它的下一个状态不仅取决于自己的动作,还取决于另外 3 台 AGV 的动作——而那 3 台也在各自学习、各自改变策略。于是 1 号 AGV 眼中的"环境"是会变的:今天 2 号喜欢走左边通道,1 号学会了走右边;明天 2 号学会了走右边,1 号昨天的策略就失效了。
这就是单智能体 MDP 框架在多智能体世界里的根本不适配:它无法表达"环境里有其他正在学习的决策者"这件事。我们需要一个新的形式化,把"多个决策者同时在共享环境里行动、每个人的动作影响所有人"这件事显式地写进数学结构里。
如果硬用单智能体框架会怎样¶
在引入正确的形式化之前,先把"硬套单智能体"的两种做法和它们的失败方式看清楚——这能让你理解为什么必须升级框架,而不是修修补补。
做法一:独立学习(Independent Learning)。 给每个智能体配一个独立的单智能体 RL 算法(比如每人一份 DQN 或 PPO),把其他所有智能体都当成"环境的一部分"。这叫 Independent Q-Learning(IQL)或 Independent PPO(IPPO)。它的致命问题是:从 \(i\) 的视角,有效转移核
依赖于其他智能体的策略 \(\{\pi_j\}_{j\neq i}\)。当这些策略在训练中变化时,\(P_i^{\text{eff}}\) 随之漂移——对 \(i\) 而言环境不再是固定的 MDP,而是一个非平稳(non-stationary)过程。贝尔曼算子不再是相对于固定核的压缩映射,收敛保证荡然无存。(这是 §10.2 的主线,这里先埋下伏笔。)
做法二:联合学习(Joint Action Learning)。 既然问题是"看不到别人",那就把所有智能体捏成一个超级智能体:它的动作是联合动作 \(\mathbf{a}=(a_1,\dots,a_N)\),它的策略 \(\pi(\mathbf{a}|s)\) 直接在联合动作空间 \(\mathcal{A}_1\times\dots\times\mathcal{A}_N\) 上决策。这样确实回到了一个良定义的、平稳的 MDP——但代价是**联合动作空间随智能体数指数爆炸**:每个智能体有 \(|\mathcal{A}|\) 个动作,\(N\) 个智能体就是 \(|\mathcal{A}|^N\) 个联合动作。10 个智能体各 5 个动作,就是 \(5^{10}\approx 10^7\) 个联合动作——Q 表存不下、策略网络的输出层爆炸、探索也无从下手。更要命的是,部署时这个超级智能体需要同时拿到所有智能体的观测才能决策,而真实多机器人系统中每个机器人只能看到自己周围——联合策略在执行时不可分布式实现。
本质洞察:独立学习和联合学习是两个极端,各踩一个坑。独立学习保住了"分布式执行"(每人只看自己),却丢了"平稳性"(环境在漂移);联合学习保住了"平稳性"(回到良定义 MDP),却丢了"可扩展性"和"分布式执行"(指数爆炸 + 执行要全局信息)。MARL 的全部算法设计,本质上都是在这两个极端之间寻找一个**既保平稳性、又能分布式执行、还不指数爆炸**的中间地带——这个中间地带的名字叫 CTDE(§10.3)。但要精确描述这个中间地带,我们得先有能同时刻画"联合"与"分布式"的形式化语言。
历史:从博弈论到 Dec-POMDP¶
MARL 的形式化有两个源头,一个来自博弈论,一个来自运筹学/控制论。
博弈论源头(随机博弈)。 1953 年,Shapley 在研究随机环境下的博弈时提出了**随机博弈(Stochastic Game)——多个玩家在一个会随机转移的状态空间里反复博弈,每个玩家的收益取决于所有人的联合动作。1994 年,Littman 在 ICML 上把这个概念引入强化学习,提出用随机博弈(他称之为 **Markov Game)作为 MARL 的统一框架,并给出了零和两人博弈下的 minimax-Q 算法。这一支强调的是**博弈结构**——智能体可能合作、可能竞争、可能混合,关键是每个智能体有自己的奖励函数,要找的是某种**均衡(equilibrium)**而非单一最优。
运筹学/控制源头(Dec-POMDP)。 另一条线关心的是"一群协作的智能体,每个只能看到局部信息,如何协调"。2000 年前后,Bernstein 等人形式化了**去中心化部分可观测马尔可夫决策过程(Decentralized POMDP, Dec-POMDP)——所有智能体共享同一个奖励(纯合作),但每个智能体只能观测到全局状态的一部分,且执行时不能通信。他们证明了一个令人沮丧的结果:**有限时域 Dec-POMDP 的最优求解是 NEXP-完全的(比单智能体 POMDP 的 PSPACE 还难一个数量级)。这个复杂度结果解释了为什么 Dec-POMDP 极难精确求解,也正是为什么后来所有实用方法都转向"用集中信息辅助训练、再蒸馏成分布式策略"(即 CTDE)的近似路线。
这两个源头在合作 MARL 里汇合:合作型随机博弈 = 状态完全可观测的 Dec-POMDP。本章主要关心合作(cooperative)场景——多机器人协作、编队、协同搬运都是合作。所以我们的主力形式化是 Dec-POMDP(含其完全可观测特例)。竞争和混合场景(如对抗、市场)用一般随机博弈描述,我们会在末尾点到,但不展开。
理论一:随机博弈(Markov Game)¶
我们从最一般的形式化开始,然后逐步特化到合作场景。
随机博弈(Markov Game / Stochastic Game) 是一个元组 $$ \mathcal{G} = \langle N, \mathcal{S}, {\mathcal{A}i}^N, \gamma\rangle $$ 其中: - }^N, P, {r_i}_{i=1\(N\) 是智能体数量; - \(\mathcal{S}\) 是(全局)状态空间; - \(\mathcal{A}_i\) 是智能体 \(i\) 的动作空间,联合动作空间为 \(\boldsymbol{\mathcal{A}}=\mathcal{A}_1\times\dots\times\mathcal{A}_N\),联合动作记作 \(\mathbf{a}=(a_1,\dots,a_N)\); - \(P:\mathcal{S}\times\boldsymbol{\mathcal{A}}\to\Delta(\mathcal{S})\) 是**联合转移核**——下一状态取决于当前状态和**所有人的联合动作**; - \(r_i:\mathcal{S}\times\boldsymbol{\mathcal{A}}\to\mathbb{R}\) 是智能体 \(i\) 的奖励函数——注意它依赖联合动作,即**别人的动作会影响我的奖励**; - \(\gamma\in[0,1)\) 是折扣因子。
每个智能体 \(i\) 有自己的策略 \(\pi_i(a_i|s)\)(这里先假设完全可观测,策略依赖全局状态 \(s\))。联合策略 \(\boldsymbol{\pi}=(\pi_1,\dots,\pi_N)\)。在联合策略下,智能体 \(i\) 的值函数定义为
关键观察:\(V_i\) 带了上标 \(\boldsymbol{\pi}\) 而不只是 \(\pi_i\)。 这是随机博弈区别于 MDP 的根本之处——智能体 \(i\) 的回报不仅取决于自己的策略 \(\pi_i\),还取决于所有其他智能体的策略 \(\boldsymbol{\pi}_{-i}=(\pi_j)_{j\neq i}\)。所以"\(i\) 的最优策略"这个说法在博弈里是没有绝对意义的,只能说"给定别人的策略,\(i\) 的最优响应(best response)":
当所有智能体的策略互为最优响应——即没有任何一个智能体能通过单方面改变策略来提高自己的回报——这组策略就构成一个**纳什均衡(Nash Equilibrium)**:
跨领域类比:随机博弈之于 MDP,如同纳什均衡之于单变量最优化。单变量最优化找一个点让一个函数最大;纳什均衡找一组策略让 \(N\) 个函数**同时各自对自己的变量最优**。相似之处:都是"驻点"概念。但**关键不同**:单变量最优化的全局最优唯一且明确"更好";纳什均衡可能有多个,且不同均衡之间不一定可比(一个均衡对智能体 1 好、对智能体 2 差),甚至均衡的总收益可能远不如某个非均衡的协作点(囚徒困境)。不要把"找到纳什均衡"等同于"找到最优"——这是 MARL 初学者最常见的误解之一。
按奖励结构,随机博弈分成三类,这是 MARL 的顶层分类:
| 类别 | 奖励结构 | 数学条件 | 典型场景 |
|---|---|---|---|
| 合作(cooperative) | 所有智能体共享同一奖励 | \(r_1=r_2=\dots=r_N=r\) | 多机协同搬运、编队、覆盖 |
| 竞争(competitive) | 零和 | \(\sum_i r_i = 0\)(两人时 \(r_1=-r_2\)) | 对抗、博弈、围捕-逃逸 |
| 混合(mixed) | 一般和(general-sum) | 无约束 | 自动驾驶交汇、市场、社会困境 |
本章的主战场是**合作**——这也是绝大多数多机器人协作任务的结构。合作场景有一个巨大的简化:因为所有人共享奖励 \(r\),所有人的值函数相同 \(V_1^{\boldsymbol{\pi}}=\dots=V_N^{\boldsymbol{\pi}}=V^{\boldsymbol{\pi}}\),于是"找纳什均衡"退化为"找联合策略最大化共享回报"——这是一个**良定义的单目标优化**,没有了"我好你坏"的均衡选择难题。换句话说,合作 MARL 在目标层面回到了单目标优化,困难只剩下"信息分散"和"非平稳性"——这正是 CTDE 能发挥作用的根本原因。
理论二:Dec-POMDP(合作 + 部分可观测)¶
随机博弈假设每个智能体能看到全局状态 \(s\)。但真实多机器人系统里,每个机器人只能看到自己的传感器——局部、带噪声、视野受限。把"部分可观测"加进合作随机博弈,就得到本章最核心的形式化:Dec-POMDP。
去中心化部分可观测马尔可夫决策过程(Dec-POMDP) 是一个元组 $$ \mathcal{M} = \langle N, \mathcal{S}, {\mathcal{A}_i}, P, r, {\mathcal{O}_i}, {O_i}, \gamma\rangle $$ 在随机博弈基础上增加/修改: - 共享奖励 \(r:\mathcal{S}\times\boldsymbol{\mathcal{A}}\to\mathbb{R}\)(纯合作,只有一个团队奖励,下标 \(i\) 没了); - \(\mathcal{O}_i\) 是智能体 \(i\) 的**观测空间**; - \(O_i:\mathcal{S}\times\boldsymbol{\mathcal{A}}\to\Delta(\mathcal{O}_i)\) 是**观测函数**——智能体 \(i\) 在状态 \(s\)(动作执行后)以概率 \(O_i(o_i|s',\mathbf{a})\) 观测到 \(o_i\); - 关键约束:每个智能体的策略只能依赖自己的局部历史。
最后一条是 Dec-POMDP 的灵魂。因为部分可观测,单步观测 \(o_i\) 一般不是马尔可夫的(不同历史可能给出相同 \(o_i\) 却需要不同动作——状态混叠)。所以智能体 \(i\) 的策略不能只看当前观测,而要看**局部动作-观测历史(local action-observation history)**
策略写成 \(\pi_i(a_i\mid \tau_i)\)。注意:\(\tau_i\) 是智能体 \(i\) 自己的历史,不包含别人的观测或动作——这就是"去中心化(Decentralized)"的含义:执行时每个智能体只用自己的信息决策,不能依赖全局状态、也不能依赖别人的观测。
目标是找联合策略 \(\boldsymbol{\pi}=(\pi_1,\dots,\pi_N)\) 最大化共享期望回报:
让我们把这个目标函数和它的约束拆开看,每一部分对应一个工程含义:
- 目标里是共享奖励 \(r\)、求和不带 \(i\)——这是"合作",所有智能体为同一个团队目标服务。这就是为什么后面会出现信用分配问题(§10.6):团队拿了奖励,但梯度要分摊到每个智能体头上,"谁的功劳"无从直接得知。
- 约束 \(a_i^t\sim\pi_i(\cdot|\tau_i^t)\)——这是"去中心化执行",每个 \(\pi_i\) 只吃自己的历史 \(\tau_i\)。这就是为什么部署时不需要中央协调器、不需要智能体间通信(除非显式建模通信动作),每个机器人独立推理即可。这一条直接对应 CTDE 里的 "DE"(Decentralized Execution)。
- 求 \(\arg\max\) 是对联合策略 \(\boldsymbol{\pi}\)——优化是联合的,但解出来的是 \(N\) 个独立的 \(\pi_i\)。"联合优化、分布式执行"这个张力,正是整个 MARL 算法设计要处理的核心矛盾。
本质洞察:Dec-POMDP 把 MARL 的难度精确地定位成一句话——"用只能看局部的策略,去最大化一个全局的团队目标"。如果允许每个 \(\pi_i\) 看全局状态 \(s\),问题就退化成单智能体 MDP(把联合动作当成一个大动作);如果允许执行时自由通信、共享所有观测,问题也退化成集中式。Dec-POMDP 的全部难度,来自"优化是全局的、但执行必须用局部信息"这个不可调和的张力。NEXP-完全的复杂度,就是这个张力的代价。
为什么 Dec-POMDP 这么难(NEXP-完全的直觉)? 单智能体 POMDP 已经很难(PSPACE),因为要在信念空间里规划。Dec-POMDP 更难,因为每个智能体不仅要推断真实状态,还要推断**别人会怎么做**——而别人也在推断我会怎么做,形成无穷递归的"我以为你以为我以为……"。更糟的是,执行时不能通信,意味着智能体必须在训练阶段就把"如何协调"编码进各自的策略里,让它们在执行时即使不交流也能默契配合。这种"离线约定、在线默契"的要求,是 Dec-POMDP 难度的核心来源。
把三套框架放在一起看¶
到这里我们引入了三个形式化,初学者很容易混淆。用一张表把它们的关系钉死:
| 框架 | 智能体数 | 可观测性 | 奖励结构 | 退化关系 |
|---|---|---|---|---|
| MDP | 1 | 完全 | 单一 | 基准 |
| POMDP | 1 | 部分 | 单一 | MDP + 部分可观测 |
| Markov Game | \(N\) | 完全 | 一般和 | MDP + 多智能体(一般奖励) |
| Dec-POMDP | \(N\) | 部分 | 共享(合作) | Markov Game + 部分可观测 + 强制合作 |
读这张表的正确方式是把它当成一个"加料"的过程:从 MDP 出发,**加"部分可观测"**得到 POMDP,**加"多个智能体 + 各自奖励"**得到 Markov Game,**同时加"部分可观测 + 共享奖励"**得到 Dec-POMDP。本章后续的所有算法都活在 Dec-POMDP(或其完全可观测特例)这个格子里。
不是 X 而是 Y(澄清常见误解):很多人以为"MARL 就是把单智能体 RL 复制 \(N\) 份"。不是。如果真的只是复制 \(N\) 份独立运行,那叫独立学习(IQL/IPPO),它会被非平稳性击垮(§10.2)。MARL 的真正困难在于这 \(N\) 份必须**协调**——它们共享一个状态空间、动作互相影响、奖励互相耦合。MARL 不是"\(N\) 个单智能体 RL",而是"一个定义在联合空间上、但解必须能分解成 \(N\) 个局部策略的优化问题"。这个区别贯穿全章。
一个具体例子:把多机覆盖任务写成 Dec-POMDP¶
抽象元组讲完了,落到一个具体例子上,把每个符号填实。考虑 \(N=3\) 个无人机协同覆盖一片 \(10\times10\) 的网格区域,目标是让每个格子至少被某架无人机的相机覆盖过一次,且用时越短越好。
- 状态 \(s\):所有无人机的位置 \((x_i,y_i)\) + 每个格子的"已覆盖"标记位。这是全局真值,训练时仿真器知道,执行时无人机各自不知道全部。
- 观测 \(o_i\):无人机 \(i\) 自己的位置 + 它视野半径内的格子覆盖状态 + 视野内其他无人机的相对位置。注意 \(o_i\) 看不到视野外的格子,也看不到远处的队友——这就是部分可观测。
- 动作 \(a_i\):离散的 {上, 下, 左, 右, 悬停}(也可以是连续的速度指令,取决于建模粒度)。
- 联合转移 \(P\):无人机按各自动作移动,新覆盖的格子标记位翻转。若两架无人机想进入同一格子,按碰撞规则处理(比如都被弹回)——这就是动作的耦合。
- 共享奖励 \(r\):每新覆盖一个格子 +1,每步 -0.1(鼓励快),全部覆盖完成 +50。所有无人机拿同一个 \(r\)。
- 策略 \(\pi_i(a_i|\tau_i)\):无人机 \(i\) 根据自己的历史轨迹和看到的局部覆盖情况决定下一步去哪。
这个例子里,"协调"体现在哪?如果三架无人机都贪心地飞向最近的未覆盖格子,它们会扎堆在同一区域、重复覆盖、把远处区域漏掉——这正是 §10.6 信用分配和 §10.5 协调机制要解决的。带着这个例子读后面的算法,每个抽象机制都能找到对应的物理含义。
⚠️ 常见陷阱¶
⚠️ 概念误区:把"全局状态 \(s\)"和"智能体观测 \(o_i\) 的拼接"当成一回事。 错误描述:以为 \(s = (o_1, o_2, \dots, o_N)\),即全局状态就是把所有智能体的观测拼起来。 现象/后果:在实现 CTDE 的集中式 critic 时,直接把所有局部观测 concat 当成"全局状态"喂进去,然后困惑为什么有时候效果不好、为什么有的库(如 MAPPO)专门区分
obs和state两个接口。 根本原因:观测的拼接 \((o_1,\dots,o_N)\) 通常**不等于**全局状态 \(s\)——因为每个 \(o_i\) 都是部分的、可能有重叠、可能有盲区(没有任何智能体观测到的状态成分,比如尚未被任何无人机探索的区域)。\(s\) 是环境的完整真值,是仿真器能提供但智能体观测不到的"上帝视角"。两者只在"所有观测无重叠且并起来覆盖整个状态"这个特殊情况下才相等。 正确做法:训练时优先使用仿真器提供的真正全局状态 \(s\)(如所有实体的精确位姿)作为集中式 critic 的输入;若仿真器不提供,再退而用观测拼接 \((o_1,\dots,o_N)\) 作为近似。MAPPO 的代码里cent_obs(centralized observation)就是这个全局信息接口,与 actor 的obs严格分开。⚠️ 概念误区:以为"找到纳什均衡"就是"找到了最好的协作方案"。 错误描述:把求解 MARL 等同于求纳什均衡,并默认均衡就是最优。 现象/后果:在合作任务里纠结于"博弈论均衡",甚至引入不必要的博弈论求解器;或在混合场景里发现智能体收敛到了一个"大家都不满意"的均衡(社会困境)却不理解为什么。 根本原因:纳什均衡只保证"没人能单方面变好",不保证"集体最好"。囚徒困境就是经典反例——均衡是"双方都背叛",但"双方都合作"才是集体最优,后者不是均衡(因为单方面背叛能占便宜)。在**合作**场景(共享奖励),因为所有人目标一致,最优联合策略恰好也是均衡,此时两者重合;但在**混合/竞争**场景,均衡和集体最优可能差很远。 正确做法:先判断问题类型。合作(共享奖励)→ 目标是最大化团队回报,本章方法全适用,不用操心均衡选择。竞争/混合 → 才需要博弈论的均衡概念,且要小心均衡的"质量"和选择问题(超出本章范围)。
⚠️ 思维陷阱:用单步观测 \(o_i\) 当状态,忽略历史依赖。 错误描述:实现 actor 时直接 \(\pi_i(a_i|o_i)\),用当前单帧观测做决策,不引入任何记忆。 现象/后果:在真正部分可观测的任务(如视野受限的覆盖、需要记住"我刚才来过这里")上,策略表现出"金鱼记忆"——反复进入同一区域、无法完成需要历史信息的子任务,训练曲线卡在低位。 根本原因:部分可观测下 \(o_i\) 不是充分统计量,最优策略需要依赖历史 \(\tau_i\)(理论上是局部信念状态)。单帧 \(o_i\) 丢掉了历史,导致状态混叠——两个需要不同动作的真实状态被压缩成同一个观测。 正确做法:在 actor 网络里加入循环结构(GRU/LSTM)编码历史 \(\tau_i\),或用堆叠最近 \(k\) 帧观测(frame stacking)作为近似。许多 MARL 库(PyMARL、MAPPO)的 actor 默认带 RNN 选项,正是为此。仅当任务实际上是完全可观测(\(o_i=s\))时,才可以安全地用单帧。
练习¶
-
(形式化建模) 把第 3 章的"\(N\) 台 AGV 在仓库取送货、不能相撞"任务写成一个 Dec-POMDP,逐项给出 \(\mathcal{S},\{\mathcal{A}_i\},P,r,\{\mathcal{O}_i\},\{O_i\}\) 的具体定义。然后回答:(a) 如果允许 AGV 之间实时通信共享位置,这个 Dec-POMDP 会退化成什么框架?(b) 第 3 章的 MAPF(多机路径规划)可以看成这个 Dec-POMDP 的什么特例(提示:把奖励设成什么、把动力学设成什么,就变回了离散无碰撞路径搜索)?
-
(合作的简化) 证明:在共享奖励的合作随机博弈中,所有智能体的值函数相等 \(V_1^{\boldsymbol{\pi}}=\dots=V_N^{\boldsymbol{\pi}}\)。进而论证:为什么这使得"找纳什均衡"退化为"找联合策略最大化共享回报"这一单目标优化问题?给出一个两智能体的具体反例,说明在**非**共享奖励(一般和)下这个简化失效。
-
(部分可观测的代价) 设计一个最小的 \(2\times2\) 网格、2 智能体的合作任务,使得:用单帧观测 \(\pi_i(a_i|o_i)\) 的最优策略严格劣于用历史 \(\pi_i(a_i|\tau_i)\) 的最优策略。明确指出哪两个真实状态被单帧观测混叠了,以及历史信息如何区分它们。(这道题的目的是让你亲手构造一个"状态混叠"的实例,理解为什么 Dec-POMDP 的策略必须依赖历史。)
§10.2 非平稳性与 MARL 的四大核心困难 ⭐⭐⭐¶
这一节解决什么问题:上一节我们建立了 Dec-POMDP 的形式化,并埋下了一句话——"非平稳性破坏了单智能体 RL 的保证"。这一节把这句话**从直觉升级为数学论证**:精确地写出非平稳性是什么、它如何破坏压缩映射和经验回放、为什么这是 MARL 区别于单智能体 RL 的第一性困难。然后把 MARL 的困难系统地分成四类(非平稳性、信用分配、维度爆炸、均衡与协调),给你一个"诊断框架"——遇到一个 MARL 方法,能立刻说出它在攻击哪个困难。
动机:为什么"复制 \(N\) 份单智能体 RL"必然失败¶
最自然的 MARL 想法是独立学习:给每个智能体配一份成熟的单智能体 RL 算法(DQN/PPO),各自训练,互不干涉。这个想法如此自然,以至于几乎每个人入门 MARL 时都会先试一遍——然后撞墙。
实际现象是:训练曲线剧烈震荡、不收敛,或者收敛到一个很差的策略。换学习率没用、换网络结构没用、加大样本量也只是让震荡更"高清"。如果你之前在单智能体任务上把 PPO 调得很顺,这种"什么都对但就是不收敛"的体验会非常困惑。
问题的根源不是超参、不是实现 bug,而是**框架性的**——单智能体 RL 的全部理论保证建立在一个被多智能体悄悄违反的假设上。我们必须把这个假设和它的违反方式精确地写出来,才能理解为什么独立学习注定失败、以及后面所有方法到底在补救什么。
如果不理解非平稳性会怎样¶
这里先给一个反面后果的清单,说明"不理解非平稳性"会让你在工程上付出什么代价:
- 你会把不收敛归咎于超参,无止境地调学习率/网络/batch size,而真正的病根(环境漂移)一行超参都治不了。
- 你会盲目相信单智能体的经验回放(replay buffer)能照搬,结果 buffer 里存的旧经验是"别人用旧策略时"产生的,已经和当前环境分布不符——越大的 buffer 反而越拖后腿。
- 你会无法理解为什么 MADDPG 要给 critic 喂别人的动作、为什么 MAPPO 要全局 critic——这些设计全都是冲着非平稳性来的,不理解病,就看不懂药。
所以这一节的论证不是"理论洁癖",而是工程诊断能力的基础。
理论:非平稳性的精确定义与三重破坏¶
第一步:写出单个智能体看到的"有效环境"。 在 Dec-POMDP 里,真实的联合转移核 \(P(s'|s,\mathbf{a})\) 是固定的——这一点没变。但从智能体 \(i\) 的视角,它看不到也控制不了别人的动作 \(\mathbf{a}_{-i}=(a_j)_{j\neq i}\),别人的动作是按各自策略 \(\pi_j\) 采样的。所以 \(i\) 实际面对的"有效转移核"是把别人的动作积分掉之后的边缘化核:
同理,\(i\) 看到的有效奖励也被别人的策略平均掉:
第二步:看出问题所在。 这两个有效核里都带着 \(\boldsymbol{\pi}_{-i}\)——别人的策略。在训练过程中,别人也在学习,\(\boldsymbol{\pi}_{-i}\) 是随训练步 \(k\) 变化的,记作 \(\boldsymbol{\pi}_{-i}^{(k)}\)。于是 \(i\) 面对的不是一个固定的 MDP,而是一串随时间变化的 MDP:
非平稳性(non-stationarity):从单个智能体的视角,由于其他智能体的策略在学习过程中不断变化,该智能体所面对的有效转移核与奖励函数随时间漂移,使其环境不再是一个固定的 MDP,而是一个非平稳的决策过程。
这就是 MARL 的第一性困难。现在我们逐一看它破坏了单智能体 RL 的哪三根支柱。
破坏一:压缩映射失效(理论收敛保证崩塌)。
回顾单智能体 Q-learning 为什么收敛(01_数学/70_强化学习数学/10):贝尔曼最优算子
是 \(\gamma\)-压缩映射——对任意两个 Q 函数,\(\|\mathcal{T}Q_1-\mathcal{T}Q_2\|_\infty\leq\gamma\|Q_1-Q_2\|_\infty\)。由 Banach 不动点定理,迭代 \(Q\leftarrow\mathcal{T}Q\) 收敛到唯一不动点 \(Q^*\)。这个证明的**每一步都用到 \(P\) 和 \(R\) 固定**——压缩系数 \(\gamma\) 是常数、不动点 \(Q^*\) 是固定的目标。
现在把 \(P,R\) 换成随时间变的 \(P_i^{(k)},R_i^{(k)}\)。智能体 \(i\) 的贝尔曼算子变成 \(\mathcal{T}^{(k)}\)——一个**会变的算子**。即使每个 \(\mathcal{T}^{(k)}\) 单独看是压缩的,它们的不动点 \(Q_i^{*(k)}\) 也是个移动靶:\(i\) 朝着 \(Q_i^{*(0)}\) 努力到一半,目标已经漂移到 \(Q_i^{*(1)}\) 了。追逐一个移动靶,迭代不保证收敛。这就是独立 Q-learning(IQL)没有收敛保证的数学根源——不是它实现得不好,而是它要解的根本不是一个不动点问题。
一个手算的"移动靶"实例。 抽象论证不如一个具体数字直观。考虑两个智能体的单步博弈(无状态转移,纯重复博弈),每人两个动作 \(\{\)A, B\(\}\),团队奖励矩阵——这是一个有两个最优联合动作的"协调博弈":
两个智能体各自跑独立 Q-learning,从某个初始策略出发,轮流做"最优响应"(固定对方当前策略,选自己的最优动作)。注意每个智能体看到的是**对方策略平均后的有效奖励**——这正是上面公式里的 \(R_i^{\boldsymbol{\pi}_{-i}}\)。我们手算几轮,把"有效奖励"和"最优响应"逐步写出来:
- 第 0 轮:设智能体 2 当前以概率 0.9 选 B(偏好 B)。智能体 1 看到的有效奖励:选 A 得 \(0.1\times 3+0.9\times 0=0.3\);选 B 得 \(0.1\times 0+0.9\times 2=1.8\)。1 的最优响应是 B(\(1.8>0.3\))。
- 第 1 轮:现在 1 强烈偏好 B(设概率 0.9 选 B)。智能体 2 看到的有效奖励:选 A 得 \(0.1\times 3=0.3\);选 B 得 \(0.9\times 2=1.8\)。2 的最优响应仍是 B——两人都收敛到 B,得到 \((\text{B},\text{B})\) 的回报 2。
这个例子里两人"碰巧"协调到了 \((\text{B},\text{B})\),但它**不是团队最优**——团队最优是 \((\text{A},\text{A})\) 的回报 3。如果初始时 1 偏好 A、2 偏好 B,再算一遍最优响应你会发现:1 看 2 偏好 B 就改选 B,2 看 1 偏好 A 就改选 A……两人可能在 \((\text{B},\text{A})\) 和 \((\text{A},\text{B})\) 这两个零回报格之间来回振荡,谁也稳不下来。关键在于:每个智能体的"最优动作"取决于对方当前的策略,而对方的策略又在响应自己——有效奖励 \(R_i^{\boldsymbol{\pi}_{-i}}\) 随对方策略实时漂移,这就是"移动靶"的微观机制。 智能体 \(i\) 朝着"当前对方策略下的最优"努力,但还没到位,对方策略已经变了、靶已经移了。独立 Q-learning 既可能碰巧协调(但未必到最优均衡)、也可能陷入振荡,没有收敛保证——这就是非平稳性在最小例子上的完整体现。(§10.2 练习 1 让你换一个矩阵亲手把振荡跑出来。)
本质洞察:单智能体 RL 之所以能收敛,是因为它在和一个**死的**环境博弈——环境固定,智能体单方面优化,朝固定靶逼近。MARL 之所以难,是因为每个智能体都在和一群**活的、也在学习的**对手/队友博弈——靶随着所有人的学习一起动。非平稳性的本质,就是"固定靶"退化为"移动靶"。后面 CTDE 的全部精妙之处,在于它想办法把移动靶重新"钉住"——给 critic 喂别人的动作,相当于告诉它"靶现在在哪",从而局部恢复平稳性。
破坏二:经验回放失效(off-policy 数据过期)。
DQN 的样本效率靠经验回放——把历史转移 \((s,a,r,s')\) 存进 buffer,反复采样训练,打破时间相关性、近似独立同分布。这在单智能体下成立,因为环境固定:一条三年前的转移和今天的转移,描述的是同一个 \(P,R\),依然有效。
多智能体下,buffer 里一条旧转移 \((s,a_i,r,s')\) 是在"别人用旧策略 \(\boldsymbol{\pi}_{-i}^{(k_{\text{old}})}\)"时产生的。但现在别人的策略已经变成 \(\boldsymbol{\pi}_{-i}^{(k_{\text{now}})}\) 了,这条旧转移描述的有效核 \(P_i^{(k_{\text{old}})}\) 和当前的 \(P_i^{(k_{\text{now}})}\) 不是同一个分布。用过期的、来自不同环境的数据训练当前策略,会引入系统性偏差——而且越大的 buffer、越久的历史,过期程度越严重。这是 MARL 中"off-policy 比 on-policy 更难"的一个重要原因,也解释了为什么 on-policy 的 MAPPO(每次用最新数据、用完即弃)在 MARL 里出奇地稳——它根本不存 buffer,自然没有数据过期问题。
理论-工程桥接:正因为经验回放在多智能体下会过期,MADDPG(off-policy,要用 replay buffer)才必须做一个特殊设计——它的集中式 critic 把别人的动作 \(\mathbf{a}_{-i}\) 也存进 buffer、也作为 critic 的输入。这样一条旧转移就从 \((s,a_i,r,s')\) 扩展成 \((s,\mathbf{a},r,s')\),critic 学的是 \(Q_i(s,a_1,\dots,a_N)\)——一个**以所有人动作为条件**的值函数。条件给定了别人的动作,这个值函数就不依赖别人的策略了(别人策略的影响已经被"动作"这个条件吸收),于是即使别人策略变了,旧转移里记录的"在那个联合动作下的值"依然有效。这是 §10.5 MADDPG 设计的核心动机,现在你已经能从非平稳性推出它的必然性。
破坏三:探索-利用的耦合(移动靶上的探索更难)。
单智能体下,探索(试新动作)和利用(用已知好动作)的权衡已经够难。多智能体下还要叠加一层:你的探索性动作会改变别人看到的环境,触发别人改变策略,反过来又改变你的环境。两个智能体可能陷入"你变我变、互相追逐"的振荡,谁也稳定不下来——这在博弈论里对应"最优响应动力学不收敛"的情形。这一重破坏比前两重更微妙,本章不展开,但要知道它的存在:MARL 的探索不是 \(N\) 个独立探索的简单叠加,而是耦合的。
系统性分类:MARL 的四大困难¶
非平稳性是第一性困难,但不是唯一困难。把 MARL 的困难做一个穷举式的维度分类(而非随意罗列),你就有了一个诊断框架:拿到任何一个 MARL 方法,都能问"它在攻击四大困难中的哪一个、用什么手段"。
| 困难 | 一句话定义 | 数学表现 | 主要应对手段 | 本章对应 |
|---|---|---|---|---|
| ① 非平稳性 | 别人在学,我的环境在漂 | 有效核 \(P_i^{\boldsymbol{\pi}_{-i}}\) 随训练变化 | 集中式 critic(喂别人动作/全局状态)→ 局部恢复平稳 | §10.3 CTDE, §10.5 |
| ② 信用分配 | 团队拿了奖励,谁的功劳? | 共享奖励 \(r\) 无法直接归因到 \(a_i\) | 差分奖励、反事实基线、值分解 | §10.6, §10.4, §10.5 COMA |
| ③ 维度爆炸 | 联合动作空间随 \(N\) 指数增长 | $ | \boldsymbol{\mathcal{A}} | =\prod_i |
| ④ 均衡与协调 | 多个均衡,选哪个?如何不通信也默契? | 一般和博弈有多个纳什均衡 | 合作时退化为单目标;协调靠训练期对齐 | §10.1, §10.5 HAPPO 顺序更新 |
让我们逐一深入,因为后面每个算法都是在攻击其中一两个困难。
① 非平稳性——上面已详述。一句话记忆:"环境会变"。CTDE 的集中式 critic 是主力解药。
② 信用分配(credit assignment)——这是合作 MARL 特有的、和非平稳性并列的第二大困难。合作场景只有一个团队奖励 \(r\)。当团队成功拿到 +100,策略梯度要更新每个智能体——但这 +100 里,有多少是 1 号的贡献、多少是 2 号的?如果不区分,就会出现"搭便车":干活的和摸鱼的都被同等强化。
数学上,独立学习者 \(i\) 用团队奖励 \(r\) 做策略梯度:
问题是 \(r(s,\mathbf{a})\) 里含有 \(\mathbf{a}_{-i}\) 的贡献——这部分对 \(a_i\) 来说是纯噪声,但它不为零、且方差很大,会淹没 \(a_i\) 自己的微弱信号。智能体越多,"别人贡献的噪声"越大,\(i\) 自己动作的梯度信噪比越低。信用分配的本质,就是从团队奖励里把"我的那一份"剥离出来——这是 §10.6 的主题,差分奖励、反事实基线(COMA)、值分解(VDN/QMIX)都是它的解法。
不是 X 而是 Y:信用分配**不是**"把团队奖励平均分给每个人"那么简单(平分还是没区分功劳)。它是要回答反事实问题——"如果 \(i\) 换一个动作(或什么都不做),团队结果会差多少?" 这个差值才是 \(i\) 的真实贡献。COMA 的反事实基线、差分奖励,本质都是在估这个反事实差值。
③ 维度爆炸(combinatorial explosion)——联合动作空间 \(|\boldsymbol{\mathcal{A}}|=\prod_{i=1}^N|\mathcal{A}_i|\) 随 \(N\) 指数增长。这有两个层面的危害:
- 学习层面:联合 Q 函数 \(Q(s,\mathbf{a})\) 的输出空间是 \(|\boldsymbol{\mathcal{A}}|\) 维,10 个智能体各 5 动作就是 \(\sim 10^7\) 维输出,网络学不动、探索覆盖不到。
- 决策层面:即使学出了 \(Q(s,\mathbf{a})\),执行时要 \(\arg\max_{\mathbf{a}}Q(s,\mathbf{a})\)——在 \(10^7\) 个联合动作里搜最大值,每一步都做不现实,且需要全局信息(违反分布式执行)。
应对的核心思想是**分解 + 分布式**:不学一个大的联合 Q,而是学 \(N\) 个小的个体 utility \(Q_i(o_i,a_i)\),让每个智能体独立地 \(\arg\max_{a_i}Q_i\)(只在自己的 \(|\mathcal{A}_i|\) 个动作里搜,线性而非指数)。但这里有个陷阱——分布式的局部 argmax 凑起来,凭什么等于集中式的全局 argmax? 这正是 §10.4 IGM 原则要解决的核心问题,也是 QMIX 单调性约束的来由。
④ 均衡选择与协调(equilibrium selection & coordination)——这是博弈论层面的困难,主要出现在非合作场景。一般和博弈可能有多个纳什均衡,智能体们如何收敛到同一个、且收敛到"好"的那个,是个难题。
合作场景(本章主战场)在这一点上有巨大简化:因为共享奖励,最优联合策略唯一地对应"最大团队回报",不存在"我好你坏"的均衡冲突(§10.1 已证所有人值函数相等)。但**协调**问题依然存在——即使目标一致,\(N\) 个智能体在执行时不能通信,如何保证它们的局部决策能拼成一个协调的整体?比如两架无人机都该覆盖左半区或都该覆盖右半区,但不能一个去左一个去右地"想岔了"。这个协调问题,HAPPO 用"顺序更新"(一个一个改、改完告诉下一个)来缓解,MAPPO 用"参数共享 + 全局 critic"来隐式对齐。
把四大困难和后续章节钉在一起¶
为了让你读后面的算法时始终知道"它在解什么",把困难和方法的对应关系再用一句话钉死:
- CTDE(§10.3) 主攻 ① 非平稳性 和 ③ 维度爆炸(决策层面)——集中 critic 治非平稳,分布 actor 治决策爆炸。
- VDN/QMIX(§10.4) 主攻 ② 信用分配 和 ③ 维度爆炸(学习层面)——值分解既把团队 Q 拆成个体 utility(隐式信用分配),又用 IGM 让分布式 argmax 成立(治决策爆炸)。
- MADDPG(§10.5) 主攻 ① 非平稳性——集中 critic 吃别人动作,旧经验不过期。
- COMA(§10.5/§10.6) 主攻 ② 信用分配——反事实基线估"我的贡献"。
- MAPPO(§10.5) 主攻 ① + ③——全局 critic 治非平稳,参数共享治样本效率,on-policy 避开数据过期。
- HAPPO(§10.5) 主攻 ④ 协调 + 异构支持——顺序更新保证单调改进、对齐异构智能体。
阶段小结:到这里我们完成了 MARL 的"问题诊断"——形式化(§10.1)告诉我们对象是什么,非平稳性与四大困难(§10.2)告诉我们难在哪。接下来 §10.3 给出贯穿全章的破局范式 CTDE,§10.4-§10.5 是这个范式下的两条具体技术路线。读后面任何一个算法,都回到这张"四大困难表"问一句:它在攻击哪个困难?
⚠️ 常见陷阱¶
⚠️ 概念误区:以为非平稳性可以靠"调小学习率"解决。 错误描述:把独立学习不收敛归因于学习率太大,试图通过减小各智能体的学习率来稳定训练。 现象/后果:减小学习率确实让震荡看起来平缓些,但收敛速度急剧下降,且最终仍收敛不到好策略——本质问题没解决,只是把"快速震荡"变成了"缓慢漂移"。 根本原因:非平稳性是**框架性**问题(追逐移动靶),不是优化器步长问题。调小学习率只是让所有智能体都走得慢,移动靶和追逐者一起慢下来,相对运动没变。真正的解药是改变信息结构(CTDE 让 critic 看到别人的动作/全局状态,把移动靶钉住),而非改变优化超参。 正确做法:用 CTDE。给 critic 提供全局状态或他人动作作为条件输入,使值估计不再依赖(漂移的)他人策略,从而局部恢复平稳性。学习率调参是在 CTDE 框架内的二阶优化,不能替代框架本身。
⚠️ 编程陷阱:在多智能体 off-policy 训练中照搬单智能体的大 replay buffer。 错误描述:直接复用单智能体 DQN/SAC 的实现,用一个很大的(如 \(10^6\))replay buffer 存 \((s,a_i,r,s')\),且不存他人动作。 现象/后果:训练初期还行,越往后越差,甚至发散;增大 buffer 反而恶化。 根本原因:buffer 里的旧经验来自"他人用旧策略"时的有效环境 \(P_i^{(k_\text{old})}\),与当前 \(P_i^{(k_\text{now})}\) 分布不符(数据过期)。buffer 越大,过期数据占比越高,偏差越严重。而且因为没存他人动作 \(\mathbf{a}_{-i}\),critic 无法把这个分布漂移"条件掉"。 正确做法:(a) off-policy 路线(MADDPG/MASAC)必须把**联合动作** \(\mathbf{a}=(a_1,\dots,a_N)\) 存进 buffer、并作为集中式 critic 的输入,让 critic 以联合动作为条件、不依赖他人策略;(b) 或者改用 on-policy 路线(MAPPO),每次用最新策略采的数据、用完即弃,根本不存 buffer,从源头避开数据过期。机器人领域 MAPPO 的流行很大程度上就因为它绕开了这个坑。
⚠️ 思维陷阱:把"信用分配"和"奖励塑形(reward shaping)"混为一谈。 错误描述:以为给每个智能体手工设计一个个体奖励(reward shaping)就等于解决了信用分配。 现象/后果:花大量精力手调每个智能体的局部奖励,调出来的策略在训练环境过拟合、换个场景就崩;或者局部奖励之间互相打架,团队目标反而没达成。 根本原因:手工奖励塑形是把"信用分配"的责任甩给人类设计者,既不可扩展(智能体一多调不过来),又容易引入偏差(手设的局部奖励未必和真实贡献一致,甚至诱发非预期行为)。信用分配的正确含义是**从团队奖励里自动地、有原则地推断每个智能体的贡献**,而非人工预设。 正确做法:用有原则的自动信用分配——反事实基线(COMA,估"我换个动作团队会差多少")或值分解(QMIX,让团队 Q 的梯度自动按个体 utility 的边际贡献分摊)。手工奖励塑形可作为辅助(提供稠密信号),但不能替代有原则的信用分配机制。
练习¶
-
(非平稳性的形式化) 考虑两个智能体的矩阵博弈(无状态转移,即"重复博弈"),每个智能体两个动作。给定一个具体的 \(2\times2\) 团队奖励矩阵,让两个智能体各自跑独立 Q-learning。手动模拟 3-4 轮"最优响应":固定 B 的策略,写出 A 的有效奖励 \(R_A^{\pi_B}\) 并求 A 的最优动作;然后固定 A 的新策略,求 B 的最优动作……观察是否出现振荡(A 改了 B 想改、B 改了 A 又想改)。用这个手算例子,具体说明"移动靶"是怎么产生的。
-
(数据过期的量化) 设智能体 \(i\) 的 replay buffer 容量为 \(M\),每个训练步采集 1 条新转移、淘汰 1 条最旧的。假设他人策略每 \(T\) 步发生一次"显著变化"。请论证:buffer 里"来自当前有效环境"的转移比例约为 \(\min(1, T/M)\)。据此说明:为什么在他人策略快速变化(\(T\) 小)时应当用更小的 buffer,以及为什么 on-policy 方法(相当于 \(M\to\) 单批、用完即弃)天然规避这个问题。
-
(四大困难诊断) 阅读本章后续任意一个算法(如先跳读 §10.4 的 QMIX 或 §10.5 的 MAPPO),不看本节给出的对应表,自己判断:这个算法主要攻击四大困难中的哪一个或哪几个?用了什么具体机制?然后回来和本节的"困难-方法对应"表对照,看你的诊断是否准确。(这道题训练的是"拿到新方法能快速定位其攻击目标"的元能力,是读 MARL 论文的核心技能。)
§10.3 CTDE:集中训练,分布执行 ⭐⭐⭐¶
这一节解决什么问题:§10.2 把 MARL 的两个极端(独立学习 vs 联合学习)和它们各自的坑讲透了——独立学习死于非平稳性,联合学习死于维度爆炸和执行时的全局信息需求。这一节给出贯穿全章的破局范式 CTDE(Centralized Training, Decentralized Execution):它如何同时绕开两个坑、它的数学合理性、它的三种工程变体,以及它作为"公共骨架"如何统一后面的值分解和策略梯度两条路线。读懂这一节,后面所有算法都只是"CTDE 骨架上的不同填法"。
动机:在两个极端之间找中间道路¶
把 §10.2 的结论摆在一起,矛盾就很清楚了。我们想要一个 MARL 方案,它必须同时满足三个看似冲突的要求:
- 执行时分布式——部署到真实多机器人系统时,每个机器人只能用自己的局部观测 \(o_i\) 决策,不能依赖全局状态、不能假设实时通信(通信有延迟、会断、带宽有限)。这是 Dec-POMDP 的硬约束。
- 训练时不被非平稳性击垮——学习过程要稳定、有收敛迹象,不能让"别人在变"把训练搅黄。
- 可扩展——不能随智能体数指数爆炸。
独立学习满足 1、3,但违反 2(非平稳性)。联合学习满足 2,但违反 1(执行要全局信息)、3(指数爆炸)。有没有可能既要又要还要?
关键的洞察来自一个不对称——训练和执行是两个不同的阶段,它们的约束不一样:
- **执行阶段**在真实系统里,约束严格:只有局部信息、不能通信。
- 训练阶段**通常在**仿真器**里,约束宽松:仿真器是上帝视角,它知道所有智能体的精确状态、所有人的动作、甚至环境的全部真值。这些信息在训练时**唾手可得且免费。
既然训练时有免费的全局信息、执行时又必须只用局部信息,那为什么不**在训练时大方地用全局信息、在执行时只保留局部信息**?这就是 CTDE 的核心思想。
如果不利用训练-执行的不对称会怎样¶
反面看一下:如果坚持"训练时也只用局部信息"(即纯去中心化训练),你就退回了独立学习,被非平稳性击垮(§10.2)。如果坚持"执行时也用全局信息"(即纯集中式执行),你就退回了联合学习,部署时每个机器人都要实时拿到全场信息——这在真实系统里要么做不到(通信受限),要么代价高昂(中央服务器单点故障、延迟)。
CTDE 的全部价值,就在于它拒绝把训练和执行用同一套信息约束捆绑。 它说:训练时尽情用全局信息把策略教好,执行时把这套策略"压缩"成只依赖局部观测的形式。这就像考前可以查所有资料复习(集中训练),但考场上只能靠脑子(分布执行)——复习时用的资料,把知识内化进了脑子,考场上不需要再带资料。
理论:CTDE 的结构与数学合理性¶
CTDE(Centralized Training, Decentralized Execution,集中训练分布执行) 是一类 MARL 算法范式,其特征是: - 训练时,使用一个或多个**集中式组件**(critic、混合网络、联合值函数等),这些组件可以访问全局信息——全局状态 \(s\)、所有智能体的观测 \(\{o_i\}\)、所有智能体的动作 \(\{a_i\}\); - 执行时,只保留**分布式组件**(每个智能体的 actor / 个体值函数 \(\pi_i(a_i|o_i)\) 或 \(Q_i(o_i,a_i)\)),它们只依赖本地观测 \(o_i\)(或本地历史 \(\tau_i\)),不需要全局信息、不需要智能体间通信。
用一张图描述训练时的数据流(以 actor-critic 类为例):
┌─────────────── 仿真环境 ───────────────┐
│ 全局状态 s,联合转移 P(s'|s,a) │
└────┬──────────────────────────────┬────┘
局部观测 o₁,...,o_N 全局状态 s + 联合动作 a
│ │
┌──────▼──────┐ ┌──────▼───────────┐
│ 分布式 Actor │ a_i ~ π_i(·|o_i) │ 集中式 Critic │
│ π_1,...,π_N │ ───── 联合动作 a ────▶│ V(s) 或 Q(s,a) │
│ (执行时保留) │ │ (仅训练时存在) │
└──────┬──────┘ └──────┬───────────┘
│ │
│ 策略梯度(critic 提供基线/优势)│
└────────────◀────────────────────────┘
执行时:只剩左半边的 Actor,每个 π_i 独立吃 o_i 出动作,critic 整个丢弃。
为什么集中式 critic 能治非平稳性?数学上的解释。 回顾 §10.2:独立学习者 \(i\) 的值估计依赖他人策略 \(\boldsymbol{\pi}_{-i}\)(有效核 \(P_i^{\boldsymbol{\pi}_{-i}}\) 随之漂移)。CTDE 的集中式 critic 不再估"边缘化掉别人之后"的值,而是估**以全局状态/联合动作为条件**的值:
关键在于:一旦 critic 的输入里**显式包含了别人的动作 \(\mathbf{a}_{-i}\)(或全局状态 \(s\),它编码了别人的位形),别人策略变化的影响就被"条件"吸收了。具体地,对一个固定的 \((s,\mathbf{a})\),转移 \(P(s'|s,\mathbf{a})\) 是**真正固定的(这是 Dec-POMDP 里没变的那一条)。所以以联合动作为条件的 \(Q(s,\mathbf{a})\) 满足一个**良定义、固定的**贝尔曼方程:
这个 \(Q(s,\mathbf{a})\) 的贝尔曼算子相对于固定核 \(P\) 是压缩的——平稳性在"联合动作为条件"这个层面被恢复了。别人策略的变化只通过下一步动作分布 \(\boldsymbol{\pi}(\cdot|s')\) 进入(这是 on-policy 评估里本来就有的、可控的部分),而不再让转移核本身漂移。
本质洞察:CTDE 治非平稳性的机理可以用一句话概括——"把漂移的东西从'环境'里挪到'条件'里"。独立学习里,别人的动作藏在被边缘化掉的有效核里,看不见摸不着、随别人策略漂移;CTDE 里,别人的动作被显式拎出来当 critic 的输入条件,于是"以联合动作为条件"的那个值函数是相对固定核定义的、平稳的。漂移没有消失,但它从"破坏压缩性的环境漂移"降级为"评估目标里可控的策略项"。这是整个 MARL 能工作的数学支点。
为什么分布式 actor 不破坏这个好处? 因为 critic 只在**训练时**用来给 actor 提供梯度信号(优势/基线)。actor 自己始终是分布式的 \(\pi_i(a_i|o_i)\),它从集中式 critic 那里"借"全局视角来改进,但自己只学会用局部观测做决策。训练结束,critic 这个"脚手架"拆掉,留下的 actor 天然满足分布式执行。这就是"集中训练、分布执行"两个词的精确分工。
CTDE 的三种工程变体¶
CTDE 是一个范式,不是单一算法。它的"集中式组件"可以有不同形态,对应不同的算法家族。把这三种变体梳理清楚,你就有了 MARL 算法的"分类骨架":
| 变体 | 集中式组件是什么 | 代表算法 | 适用 |
|---|---|---|---|
| 集中式 critic | 一个看全局的 critic \(Q(s,\mathbf{a})\) 或 \(V(s)\),给分布式 actor 提供优势/基线 | MADDPG, COMA, MAPPO, HAPPO | 策略梯度路线;连续/离散动作均可 |
| 值分解 | 一个混合网络(mixing network)\(f\),把个体 utility \(Q_i\) 聚合成 \(Q_{\text{tot}}=f(Q_1,\dots,Q_N;s)\),只在训练时存在 | VDN, QMIX, QTRAN, QPLEX | 值函数路线;主要离散动作 |
| 可微通信/集中表征 | 训练时端到端反传的通信通道或共享表征 | RIAL/DIAL, CommNet, TarMAC | 需要学习通信协议的任务 |
前两种是本章的主线(§10.4 值分解、§10.5 集中式 critic)。第三种(学习通信)是一个相关但独立的方向——当任务本身需要智能体在执行时通过有限带宽通信协调时使用,本章只点到、不展开。
跨领域类比:CTDE 之于 MARL,如同"特权学习(privileged learning)/教师-学生蒸馏"之于机器人感知。在足式机器人 sim-to-real 里(参见工程实践方向),教师网络在仿真里能拿到特权信息(精确的地形高度、接触力),学生网络只能拿到真实传感器能给的(本体感觉、深度图)——训练时用教师的特权信息指导,部署时只用学生。相似之处:都是"训练时用执行时拿不到的特权信息来加速/稳定学习"。关键不同:特权学习是单智能体里"特权 obs → 普通 obs"的信息降级;CTDE 是多智能体里"全局 critic → 局部 actor"的**架构降级**——丢的不只是观测信息,更是"集中协调"这个架构能力。别把两者完全等同,但它们共享同一个哲学:训练可以开天眼,执行必须接地气。
CTDE 的边界与代价:它不是万能的¶
CTDE 极其成功,但要避免把它当银弹。它有明确的代价和失败模式,工程上必须心里有数:
- 它不能产生执行时的实时协调。 CTDE 的协调是"离线编译"进各自策略的——训练时通过全局 critic 对齐,执行时各自独立跑、不再沟通。如果任务要求执行时根据实时情况临场协商(比如动态分配谁去堵哪个缺口、且情况瞬息万变),纯 CTDE 做不到,需要叠加显式通信(第三种变体)或在线协调机制。
- 集中式 critic 的输入维度随 \(N\) 增长。 \(Q(s,a_1,\dots,a_N)\) 的输入随智能体数线性增长(不是指数,但也增长),\(N\) 很大时 critic 难训。这是 Mean-Field MARL(§10.8)等方法要进一步处理的。
- "全局状态 \(s\)"的获取假设。 CTDE 假设训练时能拿到真正的全局状态。在纯仿真里这没问题,但如果是在真实数据上离线训练、或仿真器本身不暴露完整状态,就只能用观测拼接近似(§10.1 陷阱已警示两者不等)。
- 训练-执行的分布偏移。 执行时 actor 独立决策产生的联合动作分布,可能和训练时(critic 见过的)分布不同,导致"训练时 critic 估得准、执行时策略走到 critic 没见过的区域"。这是所有"训练用集中信息、执行不用"方法的共性风险。
不是 X 而是 Y:CTDE 不是"训练时也分布式、只是共享了一下参数"。参数共享(§10.5 MAPPO 会用)和 CTDE 是**两件正交的事**——参数共享说的是"\(N\) 个 actor 用同一套权重"(省参数、提样本效率),CTDE 说的是"训练时有个看全局的集中组件"(治非平稳性)。一个算法可以只用 CTDE 不共享参数(如 MADDPG 每个 agent 独立 actor),也可以既 CTDE 又共享参数(如 MAPPO)。读论文时务必把这两个概念分开,否则会把 MAPPO 的两个独立设计(全局 critic + 参数共享)混成一个。
把 CTDE 作为后续两节的公共骨架¶
到这里,CTDE 的骨架立起来了。后面 §10.4 和 §10.5 就是往这个骨架上填两种不同的"集中式组件":
- §10.4 值分解 填的是"混合网络"——集中组件是一个把个体 \(Q_i\) 聚合成 \(Q_{\text{tot}}\) 的网络,训练时用全局 \(Q_{\text{tot}}\) 学、执行时每个智能体用自己的 \(Q_i\) 独立 argmax。核心难题:怎么聚合才能保证"局部 argmax = 全局 argmax"(IGM)。
- §10.5 集中式 critic 填的是"看全局的 critic"——集中组件是 \(Q(s,\mathbf{a})\) 或 \(V(s)\),训练时给分布式 actor 提供优势/基线,执行时丢弃 critic。核心难题:用什么 critic、什么基线、什么更新顺序,才能既治非平稳又解信用分配。
阶段小结:CTDE = 训练开天眼(集中组件用全局信息治非平稳性)+ 执行接地气(分布 actor/utility 只用局部观测满足部署约束)。它的数学支点是"把漂移从环境挪进条件"。它有三种变体(集中 critic、值分解、可微通信),本章主攻前两种。记住一个区分:CTDE(信息结构)≠ 参数共享(权重复用)。带着这个骨架,进入两条技术路线。
⚠️ 常见陷阱¶
⚠️ 概念误区:把 CTDE 理解成"执行时也要把 critic 带上"。 错误描述:以为训练好的集中式 critic 在部署时也要运行,于是担心"真实系统拿不到全局状态怎么办"。 现象/后果:误以为 CTDE 方法无法部署到通信受限的真实多机器人系统,错误地放弃 CTDE 而退回独立学习。 根本原因:没分清 critic 的作用。集中式 critic **只在训练时**用来计算优势/基线、给 actor 提供梯度方向,它是"教练"不是"运动员"。训练结束,critic 整个丢弃,部署时只跑分布式 actor \(\pi_i(a_i|o_i)\)——后者只需本地观测,完全满足分布式执行。 正确做法:明确两阶段的组件归属——执行时只保留 actor / 个体 utility,集中式组件(critic、混合网络)在训练后一律不参与执行。CTDE 方法天然可部署到通信受限系统,这正是它相对联合学习的核心优势。
⚠️ 思维陷阱:以为有了 CTDE 就自动解决了信用分配。 错误描述:认为"用了集中式 critic / CTDE,信用分配问题就自动消失了"。 现象/后果:用了 MAPPO(CTDE)却发现智能体仍有搭便车行为,困惑"不是说 CTDE 解决问题了吗"。 根本原因:CTDE 主要解决的是**非平稳性**和**维度爆炸(决策层面)**,信用分配是一个**正交的**困难(§10.2 四大困难表)。一个共享团队奖励、用普通 \(V(s)\) 当 critic 的 CTDE 方法(如最朴素的 MAPPO),其优势 \(A=r+\gamma V(s')-V(s)\) 对所有智能体是一样的,并没有区分各自贡献——信用分配靠的是额外机制(反事实基线 COMA、值分解 QMIX)。 正确做法:把"治非平稳性"和"解信用分配"当两件事分别处理。CTDE 是治非平稳性的骨架;在这个骨架内,若任务的信用分配困难突出(团队奖励稀疏、智能体贡献差异大),再叠加反事实基线(COMA)或值分解(QMIX)等专门机制。MAPPO 在很多任务上够用,是因为这些任务的信用分配困难不极端,或全局 critic 的优势估计已隐式提供了足够的协调信号。
练习¶
-
(CTDE 的信息结构设计) 对 §10.1 的"3 无人机覆盖"任务,分别设计:(a) 集中式 critic 的输入应该包含哪些信息(全局状态的哪些成分 + 是否需要联合动作)?(b) 分布式 actor 的输入是什么?(c) 如果仿真器只暴露各无人机的观测、不暴露真正的全局状态,你会如何近似构造 critic 的输入?这个近似会损失什么(回顾 §10.1 关于"观测拼接 ≠ 全局状态"的陷阱)?
-
(平稳性恢复的论证) 写出以联合动作为条件的 \(Q(s,\mathbf{a})\) 的贝尔曼方程,并论证:相对于固定的联合转移核 \(P(s'|s,\mathbf{a})\),定义这个 \(Q\) 的贝尔曼算子是 \(\gamma\)-压缩的。然后说明:为什么独立学习者的 \(Q_i(o_i,a_i)\)(不含他人动作)对应的算子**不是**相对固定核的压缩(提示:它对应的有效核 \(P_i^{\boldsymbol{\pi}_{-i}}\) 随训练漂移)。这道题让你从数学上确认"CTDE 把漂移挪进了条件"。
-
(区分 CTDE 与参数共享) 给出四个组合的各一个具体算法或设计:(a) CTDE + 参数共享;(b) CTDE + 不共享参数;(c) 非 CTDE(去中心化训练)+ 参数共享;(d) 非 CTDE + 不共享参数。对每个组合,说明它在"治非平稳性"和"样本效率"两个维度上各处于什么位置。(这道题强制你把两个常被混淆的概念彻底分开。)
§10.4 值分解:VDN、QMIX 与 IGM 原则 ⭐⭐⭐⭐¶
这一节解决什么问题:CTDE 给了骨架,现在填第一种"集中式组件"——值分解(value decomposition)。核心矛盾是:我们想让每个智能体执行时独立地 \(\arg\max_{a_i}Q_i(o_i,a_i)\)(治维度爆炸),但又想让这些局部贪婪凑起来恰好等于集中式的全局最优 \(\arg\max_{\mathbf{a}}Q_{\text{tot}}(s,\mathbf{a})\)。这一节从 VDN 的最简可加分解出发,经 IGM 原则(把"局部 argmax = 全局 argmax"写成数学条件),到 QMIX 的单调混合网络(用单调性满足 IGM),再到 QTRAN/QPLEX(放松约束换表达力)。这是 MARL 里最优美的一条理论线。
动机:分布式 argmax 凭什么等于集中式 argmax¶
回到维度爆炸(§10.2 困难③)。我们想避免学一个 \(|\mathcal{A}|^N\) 维输出的联合 \(Q(s,\mathbf{a})\)、也想避免在 \(|\mathcal{A}|^N\) 个联合动作里搜 \(\arg\max\)。最自然的想法是:给每个智能体 \(i\) 学一个**个体动作值函数 \(Q_i(o_i,a_i)\)**(在值分解文献里常称为 utility,效用,以区别于真正的 Q 值),执行时每个智能体独立地选
这样决策是分布式的(每人只在自己的 \(|\mathcal{A}_i|\) 个动作里搜,线性复杂度)、且天然满足 Dec-POMDP 的执行约束。
但马上有个尖锐的问题:这些独立选出来的 \(a_i^*\) 拼成的联合动作 \(\mathbf{a}^*=(a_1^*,\dots,a_N^*)\),凭什么是团队最优的? 我们真正想最大化的是团队回报,它对应某个联合值 \(Q_{\text{tot}}(s,\mathbf{a})\)。我们希望
左边是 \(N\) 个独立的、便宜的局部 argmax;右边是一个昂贵的、需要全局信息的联合 argmax。这个等式不会自动成立——它对 \(Q_i\) 和 \(Q_{\text{tot}}\) 之间的关系提出了一个很强的结构要求。值分解这条线的全部技术内容,就是回答"\(Q_i\) 和 \(Q_{\text{tot}}\) 之间满足什么结构,这个等式才成立、且 \(Q_{\text{tot}}\) 还能有足够的表达力"。
如果不要求这个等式会怎样¶
反面想一下:如果随便学 \(N\) 个 \(Q_i\)、不管它们和团队目标的关系,会怎样?那就退化成了独立 Q-learning(IQL)——每个智能体贪自己的 \(Q_i\),但这些 \(Q_i\) 和团队 \(Q_{\text{tot}}\) 没有任何结构联系,局部最优拼出来的联合动作可能是团队的灾难。
举个具体的"协调失败"例子:两个智能体,团队奖励矩阵是 $$ \begin{array}{c|cc} & a_2=\text{L} & a_2=\text{R}\\hline a_1=\text{L} & +10 & 0\ a_1=\text{R} & 0 & +10 \end{array} $$ 团队最优是"同 L"或"同 R"(都拿 +10),最差是"一个 L 一个 R"(拿 0)。如果两个智能体各自独立学 \(Q_i\),它们可能一个学会偏好 L、一个学会偏好 R,执行时各自贪心,拼出"一 L 一 R"的零回报灾难——明明各自都"选了自己认为最好的",团队却最差。这就是不约束 \(Q_i\) 与 \(Q_{\text{tot}}\) 关系的后果:局部理性,全局愚蠢。值分解要做的,就是给 \(Q_i\) 套上一个结构,让局部贪心自动导向全局协调。
理论一:VDN——最简的可加分解¶
VDN(Value-Decomposition Networks, Sunehag 等 2018)给出了最简单的答案:假设联合值就是个体 utility 的**直接相加**:
训练时,把这个求和当成联合 Q,用标准的(集中式)TD 误差训练:以团队奖励 \(r\) 为信号,
其中 \(\theta^-\) 是目标网络参数。注意梯度怎么流:\(Q_{\text{tot}}=\sum_i Q_i\),TD 误差对 \(Q_{\text{tot}}\) 的梯度会通过求和**自动分配**到每个 \(Q_i\) 上——这就是隐式的信用分配(§10.6 会回到这点)。每个 \(Q_i\) 网络(通常带 RNN 编码局部历史 \(\tau_i\))只吃自己的观测,但通过 \(Q_{\text{tot}}\) 的联合 TD 误差被联合地训练。
为什么可加分解能保证"局部 argmax = 全局 argmax"? 这是 VDN 成立的关键。因为求和是**可分离的**——\(Q_{\text{tot}}=\sum_i Q_i(o_i,a_i)\) 中,每个 \(a_i\) 只出现在自己那一项 \(Q_i\) 里,不同智能体的动作在 \(Q_{\text{tot}}\) 里没有交叉项。所以最大化整个和,等价于独立最大化每一项:
这个等式成立,正是因为求和把联合优化解耦成了 \(N\) 个独立的标量优化。于是执行时每个智能体独立贪心自己的 \(Q_i\),拼出来的就是全局最优——分布式 argmax 等于集中式 argmax。
VDN 的局限:可加性太强。 \(Q_{\text{tot}}=\sum_i Q_i\) 意味着团队价值是个体价值的简单线性叠加,没有任何交互项。但很多协作任务的价值本质上是非线性耦合的——比如"两个智能体必须同时到达某点才触发奖励"(协同),团队价值远不是各自价值之和(一个到了另一个没到,价值是 0,不是"半个奖励")。VDN 无法表达这种"\(1+1\neq 2\)"的协同价值。而且 VDN 完全没用上全局状态 \(s\)——求和里只有 \(o_i\),全局信息(如智能体间的相对位形)进不来。这两个局限催生了 QMIX。
理论二:IGM 原则——把"等式"抽象成统一条件¶
在讲 QMIX 之前,先把 VDN 满足的那个"局部 argmax = 全局 argmax"性质**抽象成一个一般原则**。这个抽象是值分解理论的核心,叫 IGM(Individual-Global-Max,个体-全局最大一致性):
IGM 原则:一组个体 utility \(\{Q_i(o_i,a_i)\}_{i=1}^N\) 与联合值 \(Q_{\text{tot}}(s,\mathbf{a})\) 满足 IGM,当且仅当对所有状态: $$ \boxed{ \arg\max_{\mathbf{a}} Q_{\text{tot}}(s,\mathbf{a}) = \Big(\arg\max_{a_1}Q_1(o_1,a_1), \dots, \arg\max_{a_N}Q_N(o_N,a_N)\Big). } $$ 即:联合值的全局最优联合动作,恰好等于各个体 utility 各自局部最优动作的拼接。
IGM 是值分解方法**正确性的充要条件**——只要满足 IGM,执行时分布式地各自贪心就保证选出全局最优联合动作;不满足,分布式执行就可能选出次优甚至灾难性的联合动作。所以值分解方法的设计目标就变成了:找一个 \(Q_{\text{tot}}\) 与 \(\{Q_i\}\) 的函数关系,使 IGM 成立、同时 \(Q_{\text{tot}}\) 的表达力尽可能大。
VDN 用"求和"满足 IGM(可分离 → IGM)。但求和只是满足 IGM 的**充分**条件之一,且表达力受限。能不能找到比求和更宽、但仍满足 IGM 的函数类?这就是 QMIX 的贡献——它发现了一个比"可加"宽得多、但仍充分保证 IGM 的条件:单调性。
本质洞察:IGM 是值分解的"宪法"——它定义了什么样的分解是"合法的"(分布式执行能选出全局最优)。VDN 和 QMIX 不是两个孤立的算法,而是 IGM 这部宪法下的两种"实现方案":VDN 用可加性、QMIX 用单调性来满足宪法。理解了 IGM,你就理解了整条值分解线——后面的 QTRAN、QPLEX 也都是在回答同一个问题"如何在满足 IGM 的前提下最大化表达力",只是答案越来越精巧(QPLEX 给出了 IGM 的完整充要刻画)。
理论三:QMIX——单调混合网络¶
QMIX(Rashid 等 2018)的核心洞察是:IGM 只关心 \(\arg\max\),不关心 \(Q_{\text{tot}}\) 的具体数值形状。 而一个比"可加"宽得多、仍能保证 \(\arg\max\) 可分解的条件是——\(Q_{\text{tot}}\) 对每个 \(Q_i\) 单调递增:
为什么单调性保证 IGM? 直觉是:如果 \(Q_{\text{tot}}\) 对每个 \(Q_i\) 都单调递增,那么增大任何一个 \(Q_i\) 都会(弱)增大 \(Q_{\text{tot}}\)。所以要最大化 \(Q_{\text{tot}}\),就让每个 \(Q_i\) 各自取到最大——而 \(Q_i\) 只依赖 \(a_i\),让 \(Q_i\) 最大就是 \(\arg\max_{a_i}Q_i\)。于是全局最优的 \(\mathbf{a}\) 恰好是各自局部最优的拼接,IGM 成立。严格地:
设 \(a_i^*=\arg\max_{a_i}Q_i(o_i,a_i)\),要证 \(\mathbf{a}^*=(a_1^*,\dots,a_N^*)\) 最大化 \(Q_{\text{tot}}\)。对任意联合动作 \(\mathbf{a}=(a_1,\dots,a_N)\),因为 \(Q_i(o_i,a_i^*)\geq Q_i(o_i,a_i)\) 对每个 \(i\),再由 \(Q_{\text{tot}}\) 对每个 \(Q_i\) 单调递增,逐个把 \(a_i\) 替换成 \(a_i^*\) 都不会减小 \(Q_{\text{tot}}\),故 \(Q_{\text{tot}}(s,\mathbf{a}^*)\geq Q_{\text{tot}}(s,\mathbf{a})\)。证毕。这个证明清晰地显示:单调性是比可加性弱得多的要求(可加是单调的特例:\(\partial(\sum Q_j)/\partial Q_i=1\geq 0\)),却足以保证 IGM。所以 QMIX 的表达力严格大于 VDN,又不丢失分布式执行的正确性。
怎么参数化一个"对每个 \(Q_i\) 单调递增、还能依赖全局状态 \(s\)"的混合网络? 这是 QMIX 的工程精髓——两个设计:
设计 1:非负权重的混合网络(mixing network)。 用一个前馈网络把 \((Q_1,\dots,Q_N)\) 映射到 \(Q_{\text{tot}}\)。要保证对每个输入 \(Q_i\) 单调递增,只需让网络的**所有权重非负**(外加单调递增的激活如 ELU/绝对值)。因为:复合函数的单调性——如果每一层都是"非负权重线性组合 + 单调激活",整个复合对每个输入就是单调递增的(链式法则下每个偏导都是非负数的乘积与和,恒非负)。
设计 2:用超网络(hypernetwork)注入全局状态 \(s\)。 但这里有个矛盾:我们想让 \(Q_{\text{tot}}\) 依赖全局状态 \(s\)(VDN 的缺陷正是用不上 \(s\)),可如果把 \(s\) 直接当混合网络的普通输入,又要保证对 \(Q_i\) 单调、对 \(s\) 不必单调,权重约束会很别扭。QMIX 的巧妙解法是:混合网络的权重不是固定参数,而是由另一个网络(超网络)以 \(s\) 为输入生成的。
全局状态 s
│
┌─────▼──────┐
│ 超网络 │ hypernetwork(普通网络,参数任意)
│ (生成权重) │ 输出经 |·| 或 ReLU → 保证非负
└─────┬──────┘
│ 生成混合网络的权重 W₁,W₂(非负) 和偏置 b₁,b₂(可任意)
▼
Q₁,...,Q_N ──▶ [混合网络: 非负权重 + 单调激活] ──▶ Q_tot
(权重来自超网络,故依赖 s)
关键分工: - 混合网络(mixing network)**的权重 \(W\) 被约束为**非负(超网络的输出过一个绝对值或 ReLU),保证 \(\partial Q_{\text{tot}}/\partial Q_i\geq 0\)(IGM)。 - 混合网络的偏置 \(b\) 不需要非负(偏置不影响对 \(Q_i\) 的单调性,因为 \(\partial(Wx+b)/\partial x=W\) 与 \(b\) 无关),所以可以由超网络自由生成,让全局状态 \(s\) 充分地、非线性地影响 \(Q_{\text{tot}}\) 的整体水平。 - **超网络本身**参数任意(不受非负约束),因为它的输入是 \(s\)、输出是混合网络的权重——它对 \(s\) 怎么依赖都行,只要保证吐出的权重非负即可。
这个设计精妙地分离了两个需求:对 \(Q_i\) 要单调(靠混合网络的非负权重)、对 \(s\) 要灵活(靠超网络自由地生成权重和偏置)。于是 \(Q_{\text{tot}}=f(Q_1,\dots,Q_N;s)\) 既满足 IGM、又能用全局状态表达复杂的、非可加的团队价值。
理论-工程桥接:QMIX 的非负权重约束在代码里就是一行
torch.abs(w)或F.relu(w)——把超网络输出的权重取绝对值/ReLU 再用。看起来微不足道的一行,背后是整个 IGM 正确性的保证:少了这行,\(Q_{\text{tot}}\) 不再对 \(Q_i\) 单调,分布式执行就不再选出全局最优,训练可能看起来在降 loss 但执行时智能体行为协调不起来。这是"一行代码承载一个定理"的典型例子——也是 §10.7 实现陷阱里会重点强调的。
一个具体例子:QMIX 表达出 VDN 表达不了的协调价值。 用 §10.4 开头那个协调博弈("同 L 或同 R 得 10、不一致得 0")看 QMIX 比 VDN 强在哪。设两个智能体的个体 utility 训练后是 \(Q_1(\text{L})=2, Q_1(\text{R})=1\) 和 \(Q_2(\text{L})=2, Q_2(\text{R})=1\)(都略偏好 L)。
- VDN 用 \(Q_{\text{tot}}=Q_1+Q_2\),于是四个联合动作的值是:\((\text{L},\text{L})=4\)、\((\text{L},\text{R})=3\)、\((\text{R},\text{L})=3\)、\((\text{R},\text{R})=2\)。注意 VDN 给"不一致"的 \((\text{L},\text{R})\) 打了 3 分——比"一致"的 \((\text{R},\text{R})=2\) 还高!这显然错了(真实回报里不一致是 0、一致是 10)。VDN 的可加结构**无法表达"一致比不一致好"这种非线性协调价值**——因为求和里 \(Q_1,Q_2\) 没有交叉项,"两人选一样"这个联合事件的额外价值无处安放。好在这个例子里 \((\text{L},\text{L})=4\) 仍是最高,分布式 argmax 碰巧选对;但若 utility 偏好稍有不同(如 \(Q_1\) 偏好 L、\(Q_2\) 偏好 R),VDN 就会选出不一致的灾难。
- QMIX 用 \(Q_{\text{tot}}=f_{\text{mono}}(Q_1,Q_2;s)\),混合网络可以是非线性的(如 \(Q_{\text{tot}}=w_1 Q_1+w_2 Q_2+\text{(二阶交互项,经单调激活)}+b(s)\),权重非负)。它能学出"当 \(Q_1,Q_2\) 都偏向同一动作时,\(Q_{\text{tot}}\) 额外加成"这种非可加的协调价值——只要这个非线性映射对每个 \(Q_i\) 仍单调递增(IGM 不破坏)。于是 QMIX 能正确地把"一致"的联合动作抬高、把"不一致"的压低,且因为对 \(Q_i\) 单调,分布式 argmax 依然成立。
这个对比精确显示了 QMIX 的增量价值:它用"单调但非线性"的混合,表达了可加分解(VDN)表达不了的协调价值,同时不丢失分布式执行的正确性(IGM)。 这就是 §10.4 开头"局部理性、全局愚蠢"问题在 QMIX 这里被结构性化解的方式——混合网络把"协调"的价值显式编码进 \(Q_{\text{tot}}\) 的非线性里。
理论四:QMIX 的局限与 QTRAN/QPLEX 的放松¶
QMIX 用单调性满足 IGM,表达力比 VDN 大很多,但单调性仍然是一个**充分而非必要**的条件——它能覆盖的 \(Q_{\text{tot}}\) 函数类仍有缺口。这个缺口有个经典的反例叫**非单调协调任务**。
QMIX 表达不了的情形:非单调收益。 考虑一个两智能体的单步博弈,团队奖励矩阵为 $$ \begin{array}{c|cc} & a_2=\text{A} & a_2=\text{B}\\hline a_1=\text{A} & +8 & -12\ a_1=\text{B} & -12 & +0 \end{array} $$ 最优联合动作是 \((\text{A},\text{A})\),回报 +8。但注意:当 \(a_2=\text{B}\) 时,智能体 1 选 A 反而**更差**(\(-12<0\))——即"\(a_1\) 选 A 好不好"取决于 \(a_2\) 选什么,这是一种**非单调的耦合**。QMIX 的单调性要求 \(Q_{\text{tot}}\) 对 \(Q_1\) 单调递增,这迫使"\(Q_1(\text{A})\) 大 \(\Rightarrow Q_{\text{tot}}\) 大"对所有 \(a_2\) 一致成立——但矩阵里 \(a_1=\text{A}\) 的好坏随 \(a_2\) 翻转,单调性结构无法拟合这种翻转。可以证明,QMIX 在这类矩阵上会系统性地把最优动作 \((\text{A},\text{A})\) 的联合值学偏,导致分布式执行选错。这是单调性约束的表达力代价。
QTRAN(Son 等 2019):放松到"只要最优一致即可"。 QTRAN 的思路是:IGM 只要求 \(\arg\max\) 一致,不要求 \(Q_{\text{tot}}\) 处处等于某个单调函数。于是它不强行让 \(Q_{\text{tot}}\) 是 \(\{Q_i\}\) 的单调函数,而是学一个**无结构约束**的联合 \(Q_{\text{tot}}\)(一个普通的、能表达任意耦合的网络),同时学一组 \(\{Q_i\}\),再通过**两个线性约束**把它们"对齐",使得在最优联合动作处两者一致、在非最优处 \(Q_{\text{tot}}\) 不低于个体和。这样 QTRAN 理论上能覆盖比 QMIX 更广的任务(包括上面的非单调例子)。代价是:那两个约束在实践中难以精确满足(要用罚项软化),训练更不稳定、调参更难——所以 QTRAN 理论漂亮但工程上常打不过 QMIX。
QPLEX(Wang 等 2021):给出 IGM 的完整充要刻画。 QPLEX 用 dueling 架构(把 \(Q\) 拆成 \(V+A\),优势 \(A\) 满足 \(\max_a A=0\))重新表述 IGM,证明了它的分解能**完整覆盖整个 IGM 函数类**(充要,而非 QMIX/VDN 的充分子集),同时保持训练的稳定性。直觉上,QPLEX 把 IGM 约束从"对 \(Q\) 单调"转化为"对优势 \(A\) 的某种结构",而优势的 \(\arg\max\) 性质天然契合 IGM,于是既无表达力损失、又好训。QPLEX 是目前值分解表达力与稳定性平衡得最好的方法之一。
把这条放松的脉络梳理成一张表——它本质上是"表达力 vs 可训练性"的权衡谱:
| 方法 | \(Q_{\text{tot}}\) 与 \(\{Q_i\}\) 的关系 | 满足 IGM 的方式 | 表达力 | 可训练性 |
|---|---|---|---|---|
| VDN | \(Q_{\text{tot}}=\sum_i Q_i\) | 可加(可分离 → IGM 充分) | 最弱(无交互、不用 \(s\)) | 最稳 |
| QMIX | \(Q_{\text{tot}}=f_{\text{mono}}(Q_1,\dots,Q_N;s)\) | 单调(IGM 充分,严格含可加) | 中(非线性、用 \(s\),但非单调拟合不了) | 稳 |
| QTRAN | 无结构 \(Q_{\text{tot}}\) + 两个线性约束对齐 \(\{Q_i\}\) | 直接逼近 IGM(充要,但靠软约束) | 强(理论覆盖 IGM 全类) | 不稳(约束难满足) |
| QPLEX | dueling 重述 + 优势分解 | IGM 的完整充要刻画 | 强(覆盖 IGM 全类) | 较稳 |
本质洞察:从 VDN 到 QPLEX,这条线的内在逻辑是一个**不断逼近 IGM 边界**的过程。VDN 用一个很保守的充分条件(可加),留下大量 IGM 合法但 VDN 表达不了的分解;QMIX 把充分条件放宽到单调,覆盖更多但仍有缺口(非单调任务);QTRAN/QPLEX 直接瞄准 IGM 的充要刻画,试图无损地覆盖整个合法函数类。理解这一点,你就不会把这四个方法当四个孤立的"招式"记,而是看成同一个优化问题——"在 IGM 约束的可行域里最大化表达力"——的逐步精确求解。
值分解线的工程定位:什么时候用、什么时候别用¶
把整条值分解线放回工程语境,给出选型边界:
- 适用:离散动作空间(值分解的 \(\arg\max\) 是离散动作上的)、协作(共享奖励)、奖励相对稠密(值分解需要足够的奖励信号来学会把团队值拆解到个体 utility——这是基准研究反复发现的:稀疏奖励下 VDN/QMIX 学不动)。SMAC(星际争霸多智能体挑战)是值分解的经典主战场。
- 不适用:连续动作(无法直接 \(\arg\max\),需改用策略梯度路线)、奖励极稀疏(值分解退化,策略梯度更鲁棒)、强异构且需要差异化角色(值分解的个体 utility 网络若共享参数则难分化角色)。
- 机器人领域的现实:大多数机器人控制任务是**连续动作**(关节力矩、速度指令),这天然把值分解排除在外——这也是为什么 §10.5 的策略梯度路线(尤其 MAPPO)才是机器人 MARL 的事实标准。值分解在机器人领域更多出现在**离散高层决策**(如离散的子任务选择、离散的运动基元切换)而非底层连续控制。
不是 X 而是 Y:值分解里的 \(Q_i\) 不是"智能体 \(i\) 真正的 Q 值"(即不是 \(i\) 在某个良定义 MDP 下的动作值),而是一个**utility(效用)**——一个仅为了让 \(\sum\) 或 \(f_{\text{mono}}\) 凑出正确的 \(Q_{\text{tot}}\) 而学出来的"分量"。它没有独立的语义(不满足任何单智能体贝尔曼方程),只在与混合网络组合后、整体满足联合贝尔曼方程时才有意义。把 \(Q_i\) 误读成"智能体 \(i\) 的独立价值"会导致错误的解读(比如以为可以单独拿 \(Q_i\) 来评估智能体 \(i\) 的好坏)——它只在"凑 \(Q_{\text{tot}}\) 并支持分布式 argmax"这个意义上有用。
⚠️ 常见陷阱¶
⚠️ 编程陷阱:忘记给 QMIX 混合网络的权重加非负约束。 错误描述:实现 QMIX 时,超网络直接输出混合网络的权重,不经过绝对值/ReLU 就用。 现象/后果:训练 loss 看起来在下降(联合 TD 误差能拟合),但执行时智能体行为协调不起来、回报上不去——因为分布式 argmax 不再等于全局 argmax(IGM 被破坏)。这种"训练指标好、执行结果差"的脱节极难 debug。 根本原因:IGM 靠的是 \(\partial Q_{\text{tot}}/\partial Q_i\geq 0\)(单调性),而单调性靠的是混合网络权重非负。少了非负约束,\(Q_{\text{tot}}\) 可能对某个 \(Q_i\) 单调递减,于是"增大 \(Q_i\)"反而减小 \(Q_{\text{tot}}\),局部 argmax 与全局 argmax 脱钩。 正确做法:超网络输出权重后**必须**过
torch.abs(·)或F.relu(·)再喂给混合网络(偏置 bias 不需要,只有权重 weight 需要)。这是 QMIX 正确性的硬性要求,对照原论文实现(PyMARL 的qmix.py)逐行核对。可在单元测试里数值检查 \(\partial Q_{\text{tot}}/\partial Q_i\) 的符号。⚠️ 概念误区:以为 QMIX 表达力够强,能拟合任意协作任务。 错误描述:认为 QMIX 的单调混合网络是"万能逼近器",能学任何团队价值函数。 现象/后果:在非单调协调任务(如前述 \(\pm 12\) 矩阵)上,QMIX 系统性地把最优联合动作学偏,却以为是超参没调好,无止境调参。 根本原因:单调性是对 \(Q_{\text{tot}}\) 函数类的**硬性结构限制**——它表达不了"\(a_1\) 的好坏随 \(a_2\) 翻转"这类非单调耦合,这是 QMIX 的固有表达力上限,不是超参问题。 正确做法:识别任务是否有非单调耦合(某智能体动作的好坏强烈依赖他人动作、且方向会翻转)。若有,换用 QTRAN/QPLEX(覆盖更广的 IGM 函数类)或策略梯度方法(MAPPO 不受 IGM 约束)。先用一个小规模矩阵博弈测试方法的表达力上限,再上大任务。
⚠️ 思维陷阱:把值分解的个体 utility \(Q_i\) 当作智能体 \(i\) 的"真实价值"来解读或复用。 错误描述:训练完 QMIX 后,单独拿出 \(Q_i\) 来评估"智能体 \(i\) 干得好不好",或试图把 \(Q_i\) 迁移到别的任务。 现象/后果:得到无意义甚至误导的结论——\(Q_i\) 的绝对数值没有独立含义,跨任务迁移更是无效。 根本原因:\(Q_i\) 是 utility 不是 Q 值(见上文"不是 X 而是 Y"),它只在与混合网络组合后整体满足联合贝尔曼方程时才有意义,单独看不满足任何单智能体贝尔曼方程,绝对尺度由混合网络的权重/偏置共同决定、可被任意重标定。 正确做法:只用 \(Q_i\) 做它该做的事——执行时的 \(\arg\max_{a_i}Q_i\)(选动作)。要评估单个智能体贡献,用专门的归因方法(反事实/Shapley 值,见 §10.6),而非直接读 \(Q_i\) 的数值。
练习¶
-
(IGM 与单调性的关系) (a) 证明:可加分解 \(Q_{\text{tot}}=\sum_i Q_i\) 是单调分解的特例(即可加 ⟹ 单调)。(b) 构造一个**单调但不可加**的 \(Q_{\text{tot}}(Q_1,Q_2;s)\) 的具体例子(两智能体即可),并验证它满足 IGM。(c) 用本节的 \(\pm 12\) 非单调矩阵,论证为什么不存在任何单调的 \(f\) 使 \(Q_{\text{tot}}=f(Q_1,Q_2)\) 能正确表达该矩阵的 \(\arg\max\) 结构。
-
(混合网络的单调性实现) 用 PyTorch 实现一个最小的 QMIX 混合网络:输入 \((Q_1,\dots,Q_N)\) 和全局状态 \(s\),超网络生成两层混合网络的权重(过绝对值保证非负)和偏置(不约束),输出 \(Q_{\text{tot}}\)。然后写一个数值测试:随机采样 \(Q_i\),对每个 \(i\) 用有限差分验证 \(\partial Q_{\text{tot}}/\partial Q_i\geq 0\)。再故意去掉绝对值约束,观察测试如何失败。
-
(跨章综合:值分解 vs 任务分配的信用归因) 第 3 章的 CBBA 通过"边际收益"给每个机器人分配任务(边际贡献 = 加入这个任务后总收益的增量);本章值分解通过联合 TD 误差对 \(\sum Q_i\) 求梯度,把团队信号"自动分摊"到每个 \(Q_i\)。请对比这两种"贡献归因":(a) CBBA 的边际收益和值分解的梯度分摊,在思想上有什么相通之处(都是某种"边际贡献")?(b) 关键区别是什么(一个是离散静态分配的显式边际、一个是序贯学习中的隐式梯度信用)?这道题帮你把第 3 章的离散分配和本章的学习式信用分配在"边际贡献"这个共同视角下打通。
§10.5 多智能体策略梯度:MADDPG → COMA → MAPPO → HAPPO ⭐⭐⭐⭐¶
这一节解决什么问题:CTDE 骨架的第二种填法——集中式 critic + 分布式 actor。这条路线是机器人 MARL 的事实标准(因为支持连续动作)。我们沿着四步演进讲透:MADDPG 用集中 critic 吸收非平稳性(解困难①),COMA 用反事实基线解信用分配(解困难②),MAPPO 用"共享 PPO + 全局 critic"成为最强基线(解①③),HAPPO 用多智能体优势分解引理实现异构智能体的单调改进(解④)。每一步都建立在
01_数学/70_强化学习数学的策略梯度定理之上——这条线就是策略梯度定理的"多智能体加料版"。
动机:值分解的天花板与策略梯度的必要性¶
§10.4 的值分解很优美,但有个硬伤——它要 \(\arg\max_{a_i}Q_i\),这只在**离散动作**上可行。机器人控制几乎都是**连续动作**(关节力矩 \(\tau\in\mathbb{R}^d\)、速度指令 \(v\in\mathbb{R}^3\)),在连续空间上 \(\arg\max\) 一个 \(Q\) 函数本身就是个非凸优化、做不动。所以机器人 MARL 必须走另一条路——策略梯度(policy gradient),直接参数化策略 \(\pi_i(a_i|o_i)\) 并对其参数做梯度上升,绕开 \(\arg\max\)。
回顾单智能体策略梯度定理(01_数学/70_强化学习数学/20):
现在的问题是:把这个定理搬到多智能体,每个智能体 \(i\) 有自己的策略 \(\pi_{\theta_i}(a_i|o_i)\),梯度长什么样?最朴素的写法是给每个 \(i\) 套一份单智能体公式(这就是 IPPO/独立 actor-critic):
但这里有两个空白要填:(1) \(A_i\) 怎么算——用什么 critic、用团队奖励还是个体贡献?(2) 直接独立做会撞上非平稳性(§10.2)。这条路线的四步演进,就是逐步把这两个空白填好。
第一步:MADDPG——集中式 critic 吸收非平稳性¶
MADDPG(Multi-Agent DDPG, Lowe 等 2017)是 CTDE 的奠基作。它的出发点是连续动作的确定性策略梯度(DDPG),核心创新是 critic 的集中化。
架构:每个智能体 \(i\) 有: - 一个**分布式 actor** \(\mu_{\theta_i}(o_i)\)——确定性策略,吃本地观测出连续动作,执行时只用它; - 一个**集中式 critic** \(Q_i^\mu(s, a_1, a_2, \dots, a_N)\)——吃**全局状态 \(s\) 和所有人的动作**,只在训练时用。
为什么 critic 要吃所有人的动作? 这正是 §10.2/§10.3 推过的——把别人的动作 \(\mathbf{a}_{-i}\) 显式作为条件,非平稳性被吸收:对固定的 \((s,\mathbf{a})\),转移核 \(P(s'|s,\mathbf{a})\) 真正固定,所以 \(Q_i(s,\mathbf{a})\) 满足良定义的贝尔曼方程、其 TD 学习是稳定的(相对固定核压缩)。如果 critic 只吃 \(a_i\)(独立 critic),就退化成 IQL 的非平稳困境。
注意 MADDPG 给每个 \(i\) 一个独立的 critic \(Q_i\)(而非共享一个)——这是为了支持**一般和博弈**(每个智能体可以有不同奖励 \(r_i\),故 \(Q_i\) 不同)。在纯合作(共享 \(r\))下,所有 \(Q_i\) 会趋同,可以共享一个;但 MADDPG 的通用形式保留了 \(N\) 个独立 critic,使它能处理合作/竞争/混合。
梯度(确定性策略梯度版):对智能体 \(i\) 的 actor,
直觉:固定别人的动作(从 replay buffer \(\mathcal{D}\) 里取),问"我把自己的动作 \(a_i\) 往哪个方向微调,能让集中式 critic 的 \(Q_i\) 升高",然后让 actor 朝那个方向更新。critic 通过标准 DDPG 的 TD 误差训练(用目标网络),因为它吃联合动作,旧 replay 数据不过期(§10.2 破坏二的解药)。
本质洞察:MADDPG 的全部精华在一句话——"actor 局部、critic 全局"。actor 必须局部(执行约束),critic 可以全局(训练时仿真器给得起全局信息)。这个不对称把非平稳性从 actor 的学习里剥离出来、塞进了 critic 的输入条件。MADDPG 之后所有的 CTDE actor-critic 方法(COMA、MAPPO、HAPPO)都继承这个核心,只在"critic 用什么形式、优势怎么算、怎么更新"上分化。
MADDPG 的局限:(a) 它的集中式 critic \(Q_i(s,a_1,\dots,a_N)\) 输入随 \(N\) 线性增长,\(N\) 大时难训;(b) 确定性策略 + off-policy replay 在多智能体下样本相关性强、调参敏感;(c) 它没有专门处理信用分配——\(Q_i\) 直接用智能体 \(i\) 的(或团队的)奖励学,没区分"团队奖励里谁的功劳"。第三点催生了 COMA。
第二步:COMA——反事实基线解信用分配¶
COMA(Counterfactual Multi-Agent Policy Gradients, Foerster 等 2018)专攻信用分配(困难②)。它是 on-policy actor-critic,用一个集中式 critic,但关键创新在**基线(baseline)的选择**。
问题重述:合作场景只有团队奖励 \(r\)。智能体 \(i\) 的随机策略梯度是
如果 \(A_i\) 用团队优势(对所有智能体一样),那 \(i\) 的梯度被"别人的贡献"污染(§10.2 信用分配)。COMA 要构造一个**只反映 \(i\) 自己贡献**的优势。
反事实基线(counterfactual baseline):回顾单智能体里基线的作用——减去一个不依赖动作 \(a_i\) 的项,降方差且不引入偏差(01_数学/70_强化学习数学/20 §4)。COMA 的天才之处是选一个特殊的、依赖全局信息的基线——把智能体 \(i\) 的动作边缘化掉、固定其他人动作时的期望 Q:
逐项拆解这个优势的含义: - \(Q(s,\mathbf{a})\):当前联合动作(包括 \(i\) 实际选的 \(a_i\))的联合值。 - 基线项:保持别人动作 \(\mathbf{a}_{-i}\) 不变,但把 \(i\) 的动作换成它的策略平均("如果 \(i\) 按当前策略随机选会怎样")。 - 两者之差 \(A_i\):回答反事实问题——"\(i\) 实际选的这个 \(a_i\),比 \(i\) 平均水平的动作好多少?" 这个差值剔除了别人的贡献(别人的动作在被减的两项里都一样、抵消了),纯粹反映 \(i\) 自己这步动作相对自己基准的优劣。这就是有原则的信用分配。
为什么这个基线不引入偏差? 因为基线项不依赖 \(i\) 实际采的动作 \(a_i\)(它是对 \(a_i\) 的期望,对 \(i\) 而言是个"常数基线"),由策略梯度的基线定理,减去它不改变梯度期望、只降方差。COMA 用一个集中式 critic \(Q(s,\mathbf{a})\) 同时算出 \(Q(s,\mathbf{a})\) 和所有 \(a_i'\) 的反事实值(critic 的输出层一次性给出 \(i\) 所有动作的 Q,故反事实基线只需一次前向),高效。
不是 X 而是 Y:COMA 的反事实基线**不是**"把团队奖励除以 \(N\) 平分",也**不是**手工给每个智能体设计局部奖励。它是用集中式 critic 估计一个**反事实量**——"如果 \(i\) 换个动作、别人不变,团队会差多少"。这是差分奖励(difference rewards, §10.6)的思想用 critic 实现的版本:差分奖励要重置仿真器算反事实(昂贵、需要可重置仿真器),COMA 用一次 critic 前向就近似出反事实,无需仿真器重置。关键边界:COMA 的反事实基线只对离散动作直接可算(要对 \(a_i'\) 求和),连续动作要积分、难做——这是 COMA 主要用于离散动作的原因。
COMA 的定位:它把信用分配做得很漂亮,但实践中(Yu 2022 的基准)发现它常打不过更简单的 MAPPO——反事实 critic \(Q(s,\mathbf{a})\) 难训、方差仍大。COMA 的价值更多在**思想**(反事实基线是信用分配的范式),而非作为首选算法。它启发了后续大量信用分配研究。
第三步:MAPPO——共享 PPO + 全局 critic,最强基线¶
MAPPO(Multi-Agent PPO, Yu 等 2022)是当前合作 MARL(尤其机器人领域)的事实标准基线。它的故事有点"反高潮"——它几乎没有新的理论,就是把单智能体 PPO 几乎原封不动地搬到多智能体,加两个朴素设计,结果在 SMAC、Multi-Agent MuJoCo、Hanabi 上**全面胜过**精心设计的 QMIX、MADDPG、COMA。Yu 等论文的标题就叫"PPO 的惊人有效性"。
两个朴素设计:
设计 1:全局 critic(CTDE 的 critic 部分)。 critic 是一个**状态值函数** \(V_\phi(s)\),吃**全局状态 \(s\)**(CTDE 的集中信息),输出标量值。注意 MAPPO 的 critic 是 \(V(s)\) 而非 \(Q(s,\mathbf{a})\)——它不吃动作,只吃全局状态。优势用 GAE 算(01_数学/70_强化学习数学/20 §5):
全局 critic \(V_\phi(s)\) 用全局状态降低了值估计的方差、缓解了非平稳性(值的目标相对稳定)。
设计 2:参数共享(parameter sharing)。 所有智能体共享同一个 actor 网络 \(\pi_\theta\) 和同一个 critic 网络 \(V_\phi\)。actor 吃本地观测 \(\pi_\theta(a_i|o_i)\),因为参数共享,所有智能体的经验都用来更新这同一套参数——样本效率 \(N\) 倍提升(\(N\) 个智能体每步产生 \(N\) 条经验,全喂给一个网络)。
actor 目标(就是 PPO 的 clip,逐智能体):
这和单智能体 PPO 的 clip 目标**逐字一样**,只是期望多了一个对智能体 \(i\) 的平均(参数共享下,所有智能体的样本合并算这个期望)。critic 用 MSE 拟合 GAE 回报。整个 MAPPO 训练循环 = 单智能体 PPO 循环 + "用全局 state 喂 critic" + "把 \(N\) 个智能体的数据合并训练"——简单到几乎是"PPO 的多智能体封装"。
为什么这么简单的方法这么强? 几个原因:
- on-policy 避开数据过期(§10.2 破坏二)。PPO 是 on-policy,每次用最新策略采的数据、用完即弃,不存 replay buffer,从源头规避了多智能体 off-policy 的数据过期问题。这是 MAPPO 比 off-policy 的 MADDPG/QMIX 在多智能体下更稳的重要原因。
- 全局 critic 治非平稳 + 降方差。\(V_\phi(s)\) 用全局状态,值估计稳定,优势的基线扎实。
- 参数共享提样本效率。\(N\) 倍数据喂一个网络,对同构智能体极其高效。
- PPO 的 clip 本身就鲁棒。信赖域裁剪让更新保守、不容易因为一次坏的优势估计崩掉——这种鲁棒性在更不稳定的多智能体环境里更值钱。
本质洞察:MAPPO 的"惊人有效"传递了一个深刻的方法论信号——在多智能体里,简单 + 鲁棒常常胜过精巧 + 脆弱。QMIX/COMA 用精巧的结构(单调混合、反事实基线)针对性地解某个困难,但这些结构本身引入了新的训练不稳定性和调参负担;MAPPO 用最朴素的"共享 PPO + 全局 critic",每个部件都久经单智能体考验、极其鲁棒,组合起来反而最稳最强。这不是说精巧方法没价值(它们贡献思想、在特定任务上更优),而是说**当你不确定用什么时,MAPPO 是正确的默认起点**——尤其在机器人连续控制上。
关键工程细节(决定 MAPPO 成败的"超参"):Yu 2022 的贡献一半在算法、一半在**系统性消融出几个关键实现技巧**:
- value normalization(值归一化):用 running mean/std 归一化 critic 的回报目标,对不同量级的奖励至关重要。
- 全局 state 的构造:用真正的全局状态(agent-specific global state 常更好——给每个智能体的 critic 输入"以它为中心的全局状态"),而非简单 concat 所有观测(§10.1 陷阱)。
- PPO clip 系数、GAE \(\lambda\)、并行环境数:这些和单智能体 PPO 一样需要调,但 MAPPO 对它们的敏感度被良好实现缓解。
- 训练 epoch 数与 mini-batch:多智能体下 over-fitting 一个 batch 的风险更高,epoch 数通常比单智能体小。
MAPPO 的边界:它依赖**参数共享 → 要求同构**(所有智能体观测/动作空间相同、角色可互换)。异构智能体(不同的传感器、不同的动作空间、不可互换的角色)下参数共享不适用——这正是 HAPPO 要解决的。
跨领域类比:MAPPO 之于 MARL,如同 ResNet 之于深度视觉、Adam 之于优化器——一个"看起来不该这么好"的简单强基线,最终成了领域的默认选择。相似之处:都靠"简单 + 鲁棒 + 良好工程"而非理论上的优雅取胜,都改变了后来者"先试什么"的默认。关键不同:ResNet/Adam 的有效性后来有了较扎实的理论解释,而 MAPPO 为什么这么强至今部分是经验性的("全局 critic 究竟提供了多少"等问题仍在研究)。别把"MAPPO 是强基线"误读成"MARL 已经解决了"——它只是一个好的起点。
第四步:HAPPO——多智能体优势分解引理与异构单调改进¶
HAPPO(Heterogeneous-Agent PPO, Kuba 等 2022)解决 MAPPO 的两个遗留问题:(a) 参数共享要求同构,异构智能体怎么办?(b) MAPPO 没有单调改进的理论保证(PPO 单智能体有近似单调改进保证,但多智能体同时更新所有 actor 时这个保证失效)。HAPPO 的核心是一个漂亮的引理。
问题:为什么不能所有 actor 同时更新? 单智能体 PPO 的单调改进保证(来自 TRPO,01_数学/70_强化学习数学/20 §8)说:在信赖域内更新一个策略,性能单调不降。但多智能体里,如果所有 \(N\) 个 actor 同时各自在自己的信赖域内更新,它们的联合变化可能跳出联合信赖域——每个人单独看是小步,合起来是大步,单调改进保证失效(这其实又是非平稳性的一个化身:你更新时假设别人不变,但别人也在同时变)。
多智能体优势分解引理(Multi-Agent Advantage Decomposition Lemma):HAPPO 的理论基石。它把联合优势函数精确地分解成一串"逐个智能体的条件优势"之和。先定义多智能体优势:对一个智能体子集,给定前面智能体的动作,后一个智能体的优势是
其中 \(Q^{i_{1:k}}(s,a^{i_{1:k}})\) 是固定前 \(k\) 个智能体动作、其余按当前策略平均的联合 Q。引理断言:对任意智能体排列 \(i_1,\dots,i_N\),联合优势可精确分解为
这个引理在说什么? 它说联合优势可以**无损地**写成一个"逐个加入智能体"的累积:第一个智能体贡献 \(A^{i_1}\)(它单独行动相对平均的优势),第二个智能体贡献 \(A^{i_1 i_2}\)(在第一个动作已定的前提下、它的边际优势),以此类推。这是一个**精确等式**(不是近似),且对任意更新顺序成立。其结构和概率链式法则 \(P(x_1,\dots,x_N)=\prod_k P(x_k|x_{1:k-1})\) 完全同构——只是把乘积换成求和、把概率换成优势。
跨领域类比:多智能体优势分解引理之于联合优势,如同链式法则之于联合概率、如同泰勒展开的逐项累加。相似之处:都把一个"联合的、纠缠的量"无损地拆成一串"逐个条件的、可顺序处理的增量"。关键不同:链式法则的条件顺序不影响最终乘积,优势分解的顺序也不影响最终的联合优势(精确等式),但**顺序会影响中间各项的具体数值**和顺序更新的实际效果——HAPPO 正是利用这个分解,按一个(随机)顺序逐个更新智能体。
HAPPO 的顺序更新(sequential update):有了分解引理,HAPPO 不再同时更新所有 actor,而是**按一个随机顺序逐个更新**:
- 随机排列智能体顺序 \(i_1,\dots,i_N\)。
- 更新第一个智能体 \(i_1\)(用它的条件优势 \(A^{i_1}\) 做 PPO 更新),固定其余所有智能体。
- 更新第二个智能体 \(i_2\),此时 \(i_1\) 已经是新策略(把 \(i_1\) 的更新"告诉" \(i_2\)),用条件优势 \(A^{i_1 i_2}\) 更新,固定其余。
- ……依次更新到 \(i_N\)。
为什么顺序更新能保证单调改进? 因为每一步只更新一个智能体、固定其余——这就回到了"单智能体在固定环境里更新"的情形,单智能体 PPO/TRPO 的单调改进保证适用:这一步不会降低联合性能 \(V\)。而分解引理保证了把这些"逐个的改进"加起来,恰好等于联合优势的改进。于是一整轮(所有智能体各更新一次)下来,联合性能**单调不降**——这是 MAPPO 没有的理论保证。其逻辑结构和坐标下降(coordinate descent)一模一样:一次只优化一个坐标(智能体),固定其余,每步不增(这里是不降),整体收敛。
本质洞察:HAPPO 用"顺序"换"保证"。MAPPO 同时更新所有 actor(并行、快),但放弃了单调改进保证(实践中靠 PPO 的 clip 凑合);HAPPO 顺序更新(串行、慢一点),换来了严格的单调改进保证 + 天然的异构支持(每个智能体独立 actor/critic,不要求同构)。这是"并行无保证 vs 串行有保证"的经典权衡。坐标下降的智慧在这里再次显现:把一个难的联合优化,拆成一串容易的、有保证的单变量优化。
HAPPO vs MAPPO 的选型:
| 维度 | MAPPO | HAPPO |
|---|---|---|
| 参数 | 共享(同一套 actor/critic) | 每个智能体独立 actor/critic |
| 同构要求 | 要求同构(观测/动作空间相同) | 天然支持异构 |
| 更新方式 | 所有 actor 同时更新(并行) | 顺序逐个更新(串行) |
| 理论保证 | 无单调改进保证 | 有单调改进保证(分解引理) |
| 样本效率 | 高(参数共享,\(N\) 倍数据) | 较低(独立网络,数据不共享) |
| 适用 | 同构协作(编队、同型机群) | 异构协作(领航-跟随、不同机型、人形不同肢体) |
一句话选型:同构用 MAPPO(简单高效),异构用 HAPPO(有保证、支持差异化角色)。HARL 库(Zhong 等 2023, PKU-MARL/HARL)统一实现了 HAPPO/HATD3/HASAC 等异构方法,是异构 MARL 的标准代码库。
理论-工程桥接:分解引理的"顺序更新"在代码里就是一个
for i in random_permutation(agents)循环——每轮迭代更新一个智能体、且在更新下一个之前**重新计算重要性采样比**(因为前面智能体已经变了,后面智能体看到的"联合策略"变了,比值要更新)。这个"更新后重算比值"的细节是 HAPPO 区别于"简单地循环更新"的关键——少了它,分解引理的保证不成立。骨架伪代码见 §10.7。
把策略梯度这条线串起来¶
四步演进,每步攻克一个困难,最终汇成机器人 MARL 的工具箱:
单智能体策略梯度定理 (01_数学/70_强化学习数学)
│ 加"集中式 critic 吃联合动作"
▼
MADDPG (2017): 集中 critic 吸收非平稳性 [攻困难①] ── 连续动作、off-policy
│ 加"反事实基线"
▼
COMA (2018): 反事实基线解信用分配 [攻困难②] ── 离散动作、on-policy
│ 退一步:用最朴素的 PPO + 全局 V(s) + 参数共享
▼
MAPPO (2022): 共享 PPO + 全局 critic,最强基线 [攻困难①③] ── 同构、机器人事实标准
│ 加"优势分解引理 + 顺序更新"
▼
HAPPO (2022): 异构单调改进 [攻困难④ + 异构] ── 异构、有理论保证
阶段小结:策略梯度路线是机器人 MARL 的主干(连续动作)。记住四个"加料":MADDPG 加集中 critic(治非平稳)、COMA 加反事实基线(解信用分配)、MAPPO 加全局 V + 参数共享(简单强基线)、HAPPO 加分解引理 + 顺序更新(异构 + 保证)。机器人控制的默认选择:同构→MAPPO,异构→HAPPO。下一节把信用分配单独拎出来做统一视角,然后 §10.7 把 MAPPO 真正写成代码。
两条路线总对比与选型决策¶
到这里,§10.4 的值分解和 §10.5 的策略梯度两条 CTDE 路线都讲完了。把它们做一个头对头的总对比,这是你做 MARL 选型时最常回查的一张表:
| 维度 | 值分解(VDN/QMIX/QPLEX) | 策略梯度(MADDPG/MAPPO/HAPPO) |
|---|---|---|
| CTDE 的集中组件 | 混合网络(聚合 \(Q_i\to Q_{\text{tot}}\)) | 集中 critic(\(V(s)\) 或 \(Q(s,\mathbf{a})\)) |
| 学的是什么 | 个体 utility \(Q_i\)(值) | 策略 \(\pi_i\)(策略) + critic(值) |
| 动作空间 | 仅离散(依赖 \(\arg\max_{a_i}\)) | 离散 + 连续(机器人控制必需) |
| 执行时如何决策 | 各自 \(\arg\max_{a_i}Q_i\) | 各自从 \(\pi_i(a_i\mid o_i)\) 采样 |
| 正确性依赖 | IGM 原则(单调性约束) | 策略梯度定理(无 IGM 约束) |
| 信用分配 | 隐式(联合 TD 误差梯度分摊) | 显式(团队优势 / 反事实基线) |
| on/off-policy | off-policy(用 replay,要处理过期) | MAPPO/COMA on-policy(无过期);MADDPG off-policy |
| 奖励稠密度 | 需稠密奖励(稀疏下学不动) | 对稀疏奖励更鲁棒 |
| 同构/异构 | 共享 utility 网络→偏同构 | MAPPO 同构、HAPPO 异构 |
| 典型主战场 | SMAC、离散微操协作 | 机器人连续控制、Multi-Agent MuJoCo |
| 代表"最强"方法 | QMIX(稠密离散)/ QPLEX(表达力) | MAPPO(同构)/ HAPPO(异构) |
一个三步的选型决策流程(拿到新任务时这样问):
第一刀:动作空间是连续还是离散?
连续 ──────────────────────────▶ 策略梯度路线(值分解出局)
离散 ──┐
│ 第二刀:同构还是异构?奖励稠密还是稀疏?
├─ 同构 + 稠密 ──▶ QMIX 或 MAPPO 都行,先试 MAPPO(更简单稳)
├─ 同构 + 稀疏 ──▶ MAPPO(策略梯度对稀疏更鲁棒)
└─ 异构 ────────▶ HAPPO(独立 actor,支持差异化角色)
第三刀(连续路线内部):同构还是异构?
同构 ──▶ MAPPO(参数共享,样本效率高,事实标准)
异构 ──▶ HAPPO / HASAC(独立网络 + 单调改进保证)
本质洞察:两条路线不是"谁取代谁",而是**各占一个生态位**——值分解占"离散 + 稠密 + 需要值函数"的生态位(SMAC 是它的家),策略梯度占"连续 + 机器人控制"的生态位(这是更大的、机器人最关心的生态位)。它们共享同一个 CTDE 骨架(§10.3),区别只在"集中组件是混合网络还是 critic、学的是值还是策略"。理解这一点,你就不会问"QMIX 和 MAPPO 到底谁好"这种没有绝对答案的问题,而会问"我的任务落在哪个生态位"——这才是正确的选型思维。对机器人工程师:默认从 MAPPO 起步,因为机器人控制几乎都是连续动作,值分解从第一刀就出局了。
⚠️ 常见陷阱¶
⚠️ 概念误区:把 MAPPO 的 critic 当成吃联合动作的 \(Q(s,\mathbf{a})\)。 错误描述:实现 MAPPO 时,给 critic 喂全局状态 + 所有人的动作,仿照 MADDPG 的集中 critic。 现象/后果:实现复杂化、且偏离 MAPPO 原设计,性能未必更好,还增加了 critic 输入维度(随 \(N\) 增长更难训)。 根本原因:MAPPO 的 critic 是**状态值函数 \(V_\phi(s)\)**,只吃全局状态、不吃动作。优势用 GAE 从 \(V\) 算(\(\delta=r+\gamma V(s')-V(s)\))。这与 MADDPG 的动作值 critic \(Q(s,\mathbf{a})\) 是不同设计——MAPPO 走的是 A2C/PPO 的"V + GAE"路线,不是 DDPG 的"Q + 确定性梯度"路线。 正确做法:MAPPO 的 critic 严格用 \(V_\phi(s)\)(输入全局 state、输出标量),优势 = GAE。要吃联合动作的 Q critic 是 MADDPG/COMA 的设计,不要混到 MAPPO 里。对照官方实现(
marlbenchmark/on-policy的r_mappo.py)确认 critic 接口。⚠️ 编程陷阱:MAPPO 参数共享时,actor 输入忘记区分智能体身份。 错误描述:参数共享让所有智能体用同一个 actor,但输入只给本地观测 \(o_i\)、不给任何身份标识,期望它们能分化角色。 现象/后果:在需要角色分工的任务(如领航-跟随)里,所有智能体行为完全相同(因为同样的网络、若观测也对称则输出必然相同),无法分化,任务失败。 根本原因:参数共享 + 对称观测 ⟹ 对称策略。若任务需要角色分化,必须让智能体能通过输入区分自己是谁——要么观测本身不对称(每个智能体看到的局部信息天然不同),要么显式在观测里拼接 agent ID(one-hot 身份编码)。 正确做法:(a) 若局部观测已天然包含足以区分角色的信息(如"我是队列中第几个"),可不加 ID;(b) 若观测对称、但需要角色分化,在 actor 输入里拼接 agent 的 one-hot ID 或可学习的 agent embedding,打破对称性。MAPPO 实现通常提供
use_agent_id选项正是为此。⚠️ 思维陷阱:以为 HAPPO 的顺序更新只是"循环更新每个智能体"那么简单。 错误描述:实现 HAPPO 时,简单地
for i in agents: update(i),但每个智能体用的还是同一批一开始算好的优势、不重算重要性采样比。 现象/后果:失去单调改进保证,训练可能不如预期稳定,HAPPO 相对 MAPPO 的理论优势体现不出来。 根本原因:分解引理的顺序更新要求——更新智能体 \(i_k\) 时,前面 \(i_1,\dots,i_{k-1}\) 已经变成新策略,\(i_k\) 看到的"其余智能体联合策略"变了,所以 \(i_k\) 的重要性采样比 \(\rho_{i_k}\) 必须**基于已更新的前序策略重新计算**。少了这个"逐步重算",就不是真正的 HAPPO,分解引理的保证不成立。 正确做法:严格按引理实现——随机排列后,逐个更新;每更新完一个智能体,在更新下一个之前,用最新的(含已更新前序的)联合策略重算后续智能体的重要性比和优势。对照 HARL 库的happo.py核对这个"顺序 + 重算"的细节。
练习¶
-
(从单智能体到 MAPPO 的最小改动) 拿一份你熟悉的单智能体 PPO 实现,列出把它改成 MAPPO 需要的**最小改动清单**:(a) critic 输入从 \(s\)(单智能体状态)改成什么?(b) 数据收集如何从 1 个智能体扩展到 \(N\) 个?(c) 优势计算、loss 计算需要改吗?(d) actor 是否需要 agent ID?逐条说明每个改动对应解决 §10.2 的哪个困难。这道题让你具体感受"MAPPO = PPO 的薄封装"。
-
(反事实基线的无偏性) 证明 COMA 的反事实基线 \(b_i(s,\mathbf{a}_{-i})=\sum_{a_i'}\pi_i(a_i'|\tau_i)Q(s,(a_i',\mathbf{a}_{-i}))\) 满足"基线无偏性"——即 \(\mathbb{E}_{a_i\sim\pi_i}[\nabla_{\theta_i}\log\pi_i(a_i|\tau_i)\,b_i(s,\mathbf{a}_{-i})]=0\),因此把它从优势里减去不改变策略梯度的期望、只降方差。(提示:基线 \(b_i\) 不依赖 \(a_i\),套用单智能体基线定理的证明,对 \(\sum_{a_i}\pi_i\nabla\log\pi_i=\nabla\sum_{a_i}\pi_i=\nabla 1=0\)。)
-
(优势分解引理的验证) 取 \(N=2\) 的合作单步博弈,自定一个 \(Q(s,a_1,a_2)\) 和两个智能体的策略 \(\pi_1,\pi_2\)。按引理计算 \(A^{1}(s,a_1)\) 和 \(A^{12}(s,a_1,a_2)\)(用给定顺序 \(1\to 2\)),验证 \(A^{1}+A^{12}=A(s,a_1,a_2)\)(联合优势 = \(Q(s,a_1,a_2)-V(s)\))。然后换顺序 \(2\to 1\) 再算一遍,确认最终的联合优势相同、但中间各项不同。这道题让你亲手确认分解引理是"精确等式、顺序无关总和、顺序相关分项"。
§10.6 信用分配:团队奖励下"谁的功劳" ⭐⭐⭐¶
这一节解决什么问题:信用分配(credit assignment)在前面几节里反复出现——VDN/QMIX 的梯度分摊、COMA 的反事实基线都在做它。这一节把它单独拎出来,做一个**统一视角**:把信用分配形式化为一个反事实归因问题,揭示差分奖励、反事实基线、值分解三种解法其实是同一思想的三种实现,并引入 Shapley 值作为"理论上正确的归因"的标尺。读懂这一节,你就理解了贯穿值分解和策略梯度两条路线的那个共同灵魂。
动机:搭便车问题¶
回到 §10.2 困难②的那个场景:多机搬运只有一个团队奖励——货送到给 +100。三个机器人,1 号干了 90% 的活、2 号干了 10%、3 号全程摸鱼。团队成功了,团队奖励 +100。现在策略梯度要更新每个机器人——如果三个都用同一个 +100 当信号,那 3 号的"摸鱼"动作也被 +100 强化了。下次 3 号会更倾向摸鱼(因为摸鱼也"得到了好结果")。这就是**搭便车(free-riding)**:在团队奖励下,不干活的智能体也分享成功的信用,于是学会偷懒。
更微妙的反面也存在——懒惰智能体问题(lazy agent problem,QMIX 论文专门讨论):如果一个智能体一旦行动就容易把事情搞砸(高方差),团队可能学出"让它别动"的策略,于是它永远学不到有用的行为,退化成废物。两个现象都是信用分配失败的症状:团队奖励没有正确地反映每个智能体的真实边际贡献。
信用分配问题的核心,就是回答:给定团队拿到的总奖励,每个智能体真正贡献了多少? 答对了,干活的被强化、摸鱼的被惩罚、废物被激活;答错了,就是搭便车和懒惰智能体。
如果用最朴素的办法会怎样¶
最朴素的两种办法都有致命缺陷。
办法一:团队奖励平分。 每个智能体拿 \(r/N\)。问题:平分**完全没有区分贡献**——干活的和摸鱼的拿一样多,搭便车问题原封不动。平分只是改变了奖励的尺度,没改变它的归因结构。
办法二:手工设计个体奖励(reward shaping)。 给每个智能体单独设计局部奖励(比如"1 号搬了多少箱给多少分")。问题:(a) 不可扩展——智能体一多、任务一复杂,手工设计的工作量爆炸;(b) 容易引入偏差——手设的局部奖励未必和真实团队贡献一致,可能诱发非预期行为(智能体优化局部奖励却损害团队目标,即"奖励黑客"reward hacking);(c) 把本该自动解决的问题甩给了人类。
问题的关键在于:贡献是一个反事实概念——"\(i\) 的贡献"= "有 \(i\) 参与时的团队结果" 减去 "没有 \(i\)(或 \(i\) 换个动作)时的团队结果"。平分和手工奖励都没有触及这个反事实本质。正确的信用分配必须估计这个反事实差值。这正是差分奖励、反事实基线、值分解三种方法的共同出发点。
理论一:差分奖励(difference rewards)——信用分配的"金标准"思想¶
差分奖励(difference rewards,Wolpert & Tumer 提出)给出了信用分配最干净的定义。智能体 \(i\) 的差分奖励是:
其中 \(c_i\) 是智能体 \(i\) 的一个"默认动作"(default action,比如"什么都不做"或某个基准动作),\(\mathbf{a}_{-i}\) 是其他人的实际动作。
逐项理解: - \(r(s,\mathbf{a})\):所有人按实际动作时的团队奖励。 - \(r(s,(c_i,\mathbf{a}_{-i}))\):把 \(i\) 的动作换成默认动作 \(c_i\)、别人不变**时的团队奖励——即"\(i\) 没真正参与(只做默认动作)时团队拿多少"。 - 两者之差 \(D_i\):\(i\) 的实际动作相对默认动作,给团队带来的增量**。这就是 \(i\) 的边际贡献。
为什么差分奖励解决搭便车? 因为摸鱼的 3 号,它的实际动作(摸鱼)和默认动作(什么都不做)几乎一样,所以 \(D_3=r(\mathbf{a})-r(c_3,\mathbf{a}_{-3})\approx 0\)——摸鱼拿到的信用接近零,不会被强化。而干活的 1 号,把它的动作换成默认会让团队结果大幅下降,所以 \(D_1\) 很大——干活被正确强化。差分奖励天然剔除了别人的贡献(被减的两项里别人动作都一样、抵消),只留 \(i\) 自己的边际。
把搬运例子的数字代进去更直观。团队奖励 \(r(\mathbf{a})=+100\)(货送到了),三个机器人 1 号干 90%、2 号干 10%、3 号摸鱼。默认动作 \(c_i\) = "什么都不做"。算每个的差分奖励:
- 1 号:把 1 号换成"什么都不做",没人扛主要的活,货送不到,\(r(c_1,\mathbf{a}_{-1})=0\)。故 \(D_1=100-0=100\)——1 号拿到全部信用,干活被强化。
- 2 号:把 2 号换成"什么都不做",1 号扛了 90%,货大概率还是能送到(也许慢一点),设 \(r(c_2,\mathbf{a}_{-2})=90\)。故 \(D_2=100-90=10\)——2 号拿到 10 分,与它的 10% 贡献吻合。
- 3 号:把 3 号换成"什么都不做",和它本来摸鱼没区别,\(r(c_3,\mathbf{a}_{-3})=100\)。故 \(D_3=100-100=0\)——摸鱼拿到零信用,不被强化。
对比一下:如果用团队奖励 \(r=100\) 平分或不分,三个机器人都拿 100(或 33.3),3 号的摸鱼被错误地正向强化、下次更想摸鱼;而差分奖励给出 \((100, 10, 0)\)——精确反映了各自的真实边际贡献,搭便车被结构性消除。这组数字就是差分奖励"反事实归因"的力量。
本质洞察:差分奖励揭示了信用分配的第一性原理——贡献 = 反事实差值。"我的功劳"不是"团队总分的某个份额",而是"有我和没我之间团队的差别"。这个反事实视角是整个信用分配领域的灵魂,后面 COMA 的反事实基线、值分解的梯度分摊都是它的不同实现。一旦你用反事实视角看信用分配,搭便车和懒惰智能体都迎刃而解——摸鱼者的反事实差值为零、被边缘化;真正有用者的反事实差值大、被强化。
差分奖励的工程难点:它需要计算 \(r(s,(c_i,\mathbf{a}_{-i}))\)——"把 \(i\) 换成默认动作"时的团队奖励。这通常要么**重置仿真器**重新跑一遍(昂贵、且要求仿真器可重置到任意状态),要么**有奖励函数的解析形式**能直接代入。两者在真实任务里常常做不到——你未必有可重置的仿真器、也未必有解析奖励。这个工程难点,正是 COMA 的反事实基线要绕开的。
理论二:三种解法的统一视角¶
把前面散落在各节的信用分配机制收拢,会发现它们都是"反事实差值"思想的不同实现,只是在"反事实怎么算"上分化:
| 解法 | 反事实差值怎么估 | 优点 | 缺点 | 出处 |
|---|---|---|---|---|
| 差分奖励 | 重置仿真器/解析奖励,算"\(i\) 换默认动作"的团队奖励 | 概念最干净、归因最准 | 需可重置仿真器或解析奖励,常不可行 | §10.6 |
| 反事实基线(COMA) | 用集中 critic \(Q(s,\mathbf{a})\) 估"\(i\) 换动作"的值,对 \(a_i\) 求期望当基线 | 无需重置仿真器,一次 critic 前向 | critic 难训、离散动作为主 | §10.5 COMA |
| 值分解(VDN/QMIX) | 联合 TD 误差对 \(Q_{\text{tot}}\) 求梯度,自动按 \(\partial Q_{\text{tot}}/\partial Q_i\) 分摊到个体 | 隐式、无需显式反事实、和值学习一体 | 受 IGM 结构约束、离散动作、吃稠密奖励 | §10.4 |
让我们看清它们的内在统一:
- **差分奖励**直接、显式地算反事实差值 \(r(\mathbf{a})-r(c_i,\mathbf{a}_{-i})\)——但代价是要真的去"执行反事实"(重置仿真器)。
- **COMA 的反事实基线**用 critic **预测**反事实,而非真的执行——\(Q(s,\mathbf{a})-\sum_{a_i'}\pi_i Q(s,(a_i',\mathbf{a}_{-i}))\) 用 critic 估出"换动作后的值",绕开仿真器重置。它是差分奖励的"可微、可学习"版本(默认动作换成了"策略平均动作")。
- **值分解**更隐式——它不显式构造反事实,而是让团队 TD 误差的梯度**自动**按每个 \(Q_i\) 对 \(Q_{\text{tot}}\) 的边际影响(\(\partial Q_{\text{tot}}/\partial Q_i\))分摊。在 VDN(\(Q_{\text{tot}}=\sum Q_i\))里,\(\partial Q_{\text{tot}}/\partial Q_i=1\),团队 TD 误差平均地流向每个 \(Q_i\),但因为每个 \(Q_i\) 只吃自己的观测、且要拟合联合回报,梯度会把"哪个智能体的状态-动作和团队回报更相关"自动学进对应的 \(Q_i\)——这是一种隐式的、基于梯度的边际归因。
不是 X 而是 Y:值分解的信用分配**不是**"显式地给每个智能体算一个奖励",而是**通过联合值的梯度结构隐式地把团队信号分摊到个体 utility**。这就是为什么值分解不需要可重置仿真器(不像差分奖励)、也不需要额外的反事实前向(不像 COMA)——信用分配"免费"地内嵌在值学习的反向传播里。代价是这种隐式分摊受 \(Q_{\text{tot}}\) 与 \(\{Q_i\}\) 的结构(IGM/单调性)约束,不如显式反事实灵活。
理论三:Shapley 值——归因的理论标尺¶
如果要问"什么是理论上唯一正确的贡献归因",答案来自合作博弈论的 Shapley 值。它考虑智能体以**所有可能的顺序**加入团队,\(i\) 的 Shapley 值是它在所有顺序下边际贡献的平均:
其中 \(v(\mathcal{C})\) 是子集 \(\mathcal{C}\) 的智能体合作能达成的团队价值,方括号里是 \(i\) 加入子集 \(\mathcal{C}\) 的边际贡献。Shapley 值是**唯一**同时满足"效率、对称、虚拟玩家、可加"四条公理的归因方案——在这个意义上它是"公平归因"的金标准。
Shapley 值和前面三种解法的关系:差分奖励只用了**一个**默认动作下的边际贡献(相当于只考虑一种"加入顺序/基准"),而 Shapley 值平均了**所有**子集(所有加入顺序)的边际贡献——所以差分奖励可看成 Shapley 值的一个粗糙近似(用单一基准代替全平均)。HAPPO 的优势分解引理(§10.5)按某个顺序逐个算边际优势,其结构也和 Shapley 的"按顺序加入算边际"同源——只是 HAPPO 用单一随机顺序、Shapley 用全顺序平均。
为什么实践中不直接用 Shapley 值? 因为它要对 \(2^{N}\) 个子集求和——指数复杂度,\(N\) 稍大就算不动。所以实践中用各种近似(蒙特卡罗采样子集、差分奖励的单基准近似、值分解的梯度隐式分摊)。Shapley 值的价值在于它给出了"正确归因"的理论标尺,让我们能评判各种近似离"公平"有多远。
跨领域类比:MARL 的信用分配之于团队,如同可解释 AI 里的特征归因(feature attribution)之于模型预测。SHAP(Shapley Additive Explanations)在机器学习可解释性里用 Shapley 值归因"每个特征对预测贡献多少",和 MARL 用 Shapley 值归因"每个智能体对团队回报贡献多少"是**同一个数学工具的两个应用**。相似之处:都是"把一个联合结果公平地分摊给多个参与者/特征"。关键不同:可解释 AI 里参与者(特征)是被动的、归因只为解释;MARL 里参与者(智能体)是主动学习的、归因直接进入梯度去改变策略——归因错了不只是解释错,而是会把策略带偏(搭便车、懒惰智能体)。
信用分配在两条路线里的体现¶
最后把信用分配和本章两条主线钉在一起,形成完整的认知闭环:
- 值分解路线(§10.4) 的信用分配是**隐式的、嵌在值的梯度里**——团队 TD 误差通过 \(Q_{\text{tot}}\) 的结构(\(\partial Q_{\text{tot}}/\partial Q_i\))自动分摊。它和值学习一体,不需要额外机制,但受 IGM 约束。
- 策略梯度路线(§10.5) 的信用分配是**显式的、在优势里做**——最朴素的 MAPPO 用团队优势(信用分配最弱,靠全局 critic 的优势估计隐式提供一点协调信号);COMA 用反事实基线(信用分配最强)。机器人实践中 MAPPO 够用,是因为很多任务的信用分配困难不极端、或全局 critic 已隐式缓解。
阶段小结:信用分配 = 估计每个智能体的反事实边际贡献。差分奖励(显式、需仿真器)、反事实基线(critic 预测、COMA)、值分解(梯度隐式、VDN/QMIX)是同一反事实思想的三种实现,Shapley 值是它们共同逼近的理论标尺。理解了这条主线,你就把前面几节的"梯度分摊""反事实基线"等散点收成了一个统一框架。下一节进入工程实现,把这些思想变成可运行的代码。
⚠️ 常见陷阱¶
⚠️ 概念误区:以为给每个智能体单独的奖励信号就解决了信用分配。 错误描述:把团队奖励手工拆成每个智能体的局部奖励(reward shaping),认为这就是信用分配。 现象/后果:手设的局部奖励诱发奖励黑客(智能体优化局部奖励却损害团队目标)、或局部奖励互相打架,团队目标反而达不成;换任务就得重调,不可扩展。 根本原因:信用分配的本质是**反事实边际贡献**(有我 vs 没我的团队差别),手工局部奖励既不保证反映真实边际贡献、又把责任甩给了人类设计者。它是"假装解决"——改变了奖励形式,没触及反事实本质。 正确做法:用有原则的反事实归因——差分奖励(若有可重置仿真器/解析奖励)、反事实基线(COMA,用 critic 估反事实)、或值分解(QMIX,梯度隐式分摊)。手工局部奖励可作为稠密信号的辅助,但不能替代有原则的信用分配。
⚠️ 思维陷阱:忽视"懒惰智能体"——信用分配失败的另一面。 错误描述:只关注"摸鱼者被错误强化"(搭便车),忽视了反方向的失败——有用智能体因高方差被团队学会"让它别动"。 现象/后果:某个本该有用的智能体在训练后退化成"什么都不做",团队靠其余智能体硬撑,整体次优;或多智能体任务里总有一两个"废物"智能体。 根本原因:当一个智能体一旦行动就容易(暂时)拉低团队回报(探索期高方差),团队级的信用分配可能把"它行动"和"团队变差"错误关联,于是学出"抑制它"的策略,它便永远得不到正向信用、学不到有用行为——这是 QMIX 论文专门讨论的"lazy agent"现象。 正确做法:(a) 用能正确归因边际贡献的信用分配(反事实/值分解),让有用智能体即使短期高方差也能获得正确的长期信用;(b) 保证充分探索(如给每个智能体独立的探索噪声),避免某智能体过早被"按住";(c) 监控每个智能体的行为熵和贡献,及早发现退化为废物的智能体。
练习¶
-
(搭便车的量化) 设计一个 3 智能体的单步任务:团队奖励 = 至少 2 个智能体选"合作"动作时 +10,否则 0;每个智能体选"合作"有 -1 的个人成本(但成本不计入团队奖励,只影响真实意图)。(a) 若三个智能体都用团队奖励做策略梯度,论证为什么会涌现搭便车(有人想让别人合作、自己省成本)。(b) 计算每个智能体的差分奖励 \(D_i\)(默认动作 = "不合作"),说明差分奖励如何让"真正促成团队达标"的智能体获得正确信用。
-
(三种解法对同一任务) 对上题的 3 智能体任务,分别写出:(a) 差分奖励 \(D_i\) 的显式表达式;(b) COMA 反事实基线下智能体 \(i\) 的优势 \(A_i\)(假设你有一个准确的 \(Q(s,\mathbf{a})\));(c) 若用 VDN,团队 TD 误差如何通过 \(Q_{\text{tot}}=\sum Q_i\) 分摊到每个 \(Q_i\)。对比三者得到的"信用"是否一致、在什么假设下一致。
-
(Shapley 值计算) 对一个 3 智能体的合作博弈,给定所有 \(2^3=8\) 个子集的价值 \(v(\mathcal{C})\)(自己设一组数),手算每个智能体的 Shapley 值 \(\phi_i\)。验证效率公理(\(\sum_i\phi_i=v(\{1,2,3\})\))。然后用"单一加入顺序的边际贡献"(差分奖励式近似)算一遍,对比它和 Shapley 值的差距,体会"单基准近似"损失了什么。
§10.7 工程实现:从零搭 MAPPO 与算法对比 ⭐⭐⭐¶
这一节解决什么问题:前面五节是理论,这一节落地。我们从零搭一个最小可运行的 MAPPO 训练循环(机器人 MARL 的事实标准),按"为什么这样写→正确写法→错误写法→对比"的工程教学模式逐部件讲透;然后给 HAPPO 顺序更新的骨架、标准环境(PettingZoo / Multi-Agent MuJoCo / SMAC)的配置要点、以及 MAPPO/IPPO/QMIX 三算法的对比实验设计。代码以教学清晰为先,工程级实现见 §项目精读清单。
整体架构:MAPPO = PPO 的薄封装¶
先把 MAPPO 训练循环的骨架画出来,它和单智能体 PPO 几乎一样,差异用注释标出:
MAPPO 训练循环(每个 iteration):
1. collect rollout:
reset env → 拿到 N 个智能体的 obs[i] 和全局 state
每步:每个智能体用【共享 actor】吃 obs[i] 出 a[i] # 差异1:N 个智能体共享一个 actor
env.step(joint_action) → next_obs, rewards, dones
存入 buffer(每个智能体的经验 + 全局 state) # 差异2:critic 要全局 state
2. compute advantages:
用【全局 critic V(state)】算 GAE # 差异3:critic 吃全局 state,不是 obs
3. update(PPO,和单智能体逐字相同):
合并 N 个智能体的数据 → # 差异4:参数共享,数据合并训练
PPO clip loss(actor)+ MSE(critic),多个 epoch
四个差异点对应前面的理论:差异 1、4 是**参数共享**(§10.5 设计 2,提样本效率);差异 2、3 是**全局 critic**(§10.5 设计 1 + §10.3 CTDE,治非平稳)。除此之外,它就是 PPO。下面逐部件实现。
部件一:Actor 与 Critic 网络¶
为什么 actor 吃 \(o_i\)、critic 吃 \(s\)? 这是 CTDE 的硬性分工(§10.3):actor 执行时要分布式,只能吃本地观测 \(o_i\);critic 只在训练时用,吃全局状态 \(s\) 治非平稳、降方差。两个网络的输入维度不同(obs_dim vs state_dim),这是 MAPPO 区别于单智能体的最明显结构特征。
import torch
import torch.nn as nn
import torch.nn.functional as F
class Actor(nn.Module):
"""分布式 actor:吃本地观测 o_i,输出动作分布。执行时只用它。"""
def __init__(self, obs_dim, act_dim, hidden=64, continuous=False):
super().__init__()
self.continuous = continuous
self.body = nn.Sequential(
nn.Linear(obs_dim, hidden), nn.Tanh(),
nn.Linear(hidden, hidden), nn.Tanh(),
)
if continuous:
self.mu = nn.Linear(hidden, act_dim)
self.log_std = nn.Parameter(torch.zeros(act_dim)) # 状态无关的 log std
else:
self.logits = nn.Linear(hidden, act_dim)
def forward(self, obs):
h = self.body(obs)
if self.continuous:
mu = self.mu(h)
std = self.log_std.exp().expand_as(mu)
return torch.distributions.Normal(mu, std)
else:
return torch.distributions.Categorical(logits=self.logits(h))
class Critic(nn.Module):
"""集中式 critic:吃全局状态 s,输出标量值 V(s)。仅训练时用。"""
def __init__(self, state_dim, hidden=64):
super().__init__()
self.net = nn.Sequential(
nn.Linear(state_dim, hidden), nn.Tanh(),
nn.Linear(hidden, hidden), nn.Tanh(),
nn.Linear(hidden, 1),
)
def forward(self, state):
return self.net(state).squeeze(-1) # (B,) 标量值
为什么 critic 是 \(V(s)\) 而不是 \(Q(s,\mathbf{a})\)?(呼应 §10.5 陷阱)MAPPO 走 A2C/PPO 的"V + GAE"路线:用状态值 \(V(s)\) 做基线,优势靠 GAE 从 \(V\) 算。这与 MADDPG 的"\(Q(s,\mathbf{a})\) + 确定性梯度"是两条不同路线,别混。\(V(s)\) 输入只随状态维度走、不随智能体数 \(\times\) 动作维度爆炸,更易训。
部件二:Rollout 收集(多智能体经验采集)¶
为什么要存全局 state? GAE 要用 \(V(s)\),所以每个 transition 除了智能体自己的 \((o_i, a_i, r_i, \log\pi_i)\),还要存当时的全局 state(critic 的输入)。
Step 2.1:正确写法。
def collect_rollout(env, actor, critic, n_steps, n_agents):
"""采集多智能体 on-policy 经验。actor 共享,critic 吃全局 state。"""
buf = {k: [] for k in ['obs','state','act','logp','rew','done','val']}
obs = env.reset() # obs: (n_agents, obs_dim)
state = env.get_state() # state: (state_dim,) —— 全局真值,仿真器提供
for _ in range(n_steps):
obs_t = torch.as_tensor(obs, dtype=torch.float32)
with torch.no_grad():
dist = actor(obs_t) # 参数共享:一次前向处理全部 n_agents
act = dist.sample() # (n_agents, act_dim) 或 (n_agents,)
logp = dist.log_prob(act)
if act.dim() > 1: # 连续动作:对动作维度求和
logp = logp.sum(-1)
val = critic(torch.as_tensor(state, dtype=torch.float32)) # V(s),全体共享同一个值
next_obs, rew, done, _ = env.step(act.numpy())
next_state = env.get_state()
buf['obs'].append(obs); buf['state'].append(state)
buf['act'].append(act.numpy()); buf['logp'].append(logp.numpy())
buf['rew'].append(rew); buf['done'].append(done)
buf['val'].append(val.item())
obs, state = next_obs, next_state
if done.all():
obs = env.reset(); state = env.get_state()
return buf
Step 2.2:错误写法及为什么错。
# ❌ 错误 1:critic 吃 obs 拼接而非全局 state
val = critic(torch.cat([torch.as_tensor(o) for o in obs])) # 把 N 个 obs concat 当 state
# 问题:观测拼接 ≠ 全局状态(§10.1 陷阱)。有盲区(没被任何智能体观测到的状态成分)、
# 有冗余(重叠观测),critic 估值偏差大。应优先用 env.get_state() 的真全局状态。
# ❌ 错误 2:忘记 no_grad,rollout 时建了计算图
dist = actor(obs_t) # 没有 with torch.no_grad()
# 问题:采集阶段不需要梯度,建图白白占显存、还可能误把采集和更新的图连起来导致 bug。
# 采集用 no_grad,梯度只在 update 阶段算。
# ❌ 错误 3:连续动作的 log_prob 没对动作维度求和
logp = dist.log_prob(act) # 形状 (n_agents, act_dim),没 sum(-1)
# 问题:多维连续动作的联合 log 概率是各维之和。不求和会让后面的 ratio 维度错乱、
# 或把每一维当独立样本,优势加权完全错误。
Step 2.3:不同实现方式对比。
# === 全局 state 的三种构造方式 ===
# 方式 A:仿真器直接提供(最优,推荐)
state = env.get_state() # 真全局真值,如所有实体精确位姿
# 方式 B:观测拼接(退而求其次,仿真器不给 state 时)
state = np.concatenate(obs) # (N*obs_dim,),有盲区/冗余,但总比没有强
# 方式 C:agent-specific 全局状态(MAPPO 论文发现常最优)
# 给每个智能体的 critic 输入"以它为中心的全局状态"——全局信息 + 它自己的身份/视角
state_i = build_agent_centric_state(global_info, agent_id=i)
# 对比:
# | 方式 | 信息完整性 | 实现成本 | 何时用 |
# |------|-----------|---------|--------|
# | A | 完整 | 低(仿真器给) | 纯仿真训练,首选 |
# | B | 有盲区 | 低 | 仿真器不暴露 state |
# | C | 完整+对齐 | 中 | 追求最佳性能、智能体角色不同 |
部件三:GAE 与 PPO 更新¶
为什么用 GAE? GAE(01_数学/70_强化学习数学/20 §5)用 \(\lambda\) 在偏差-方差间插值,给出比单步 TD 更稳、比蒙特卡罗回报方差更小的优势估计。MAPPO 的 GAE 和单智能体逐字相同——只是 \(V\) 来自全局 critic。
def compute_gae(buf, gamma=0.99, lam=0.95, last_val=0.0):
"""标准 GAE。注意 buf['val'] 是 V(state),对所有智能体共享。"""
rew = np.array(buf['rew']) # (T, n_agents)
val = np.array(buf['val']) # (T,) —— V(s) 每步一个标量
done = np.array(buf['done']) # (T, n_agents)
T, N = rew.shape
adv = np.zeros((T, N), dtype=np.float32)
# 团队/个体奖励:合作场景 rew[:,i] 通常都是同一个团队奖励 r
gae = np.zeros(N)
next_val = np.full(N, last_val)
for t in reversed(range(T)):
mask = 1.0 - done[t]
delta = rew[t] + gamma * next_val * mask - val[t] # val[t] 广播到 N 个智能体
gae = delta + gamma * lam * mask * gae
adv[t] = gae
next_val = np.full(N, val[t])
ret = adv + val[:, None] # returns = advantage + value(critic 的回归目标)
return adv, ret
为什么 MAPPO 的 update 要把 N 个智能体的数据合并?(呼应 §10.5 设计 2)参数共享下,所有智能体用同一个 actor,所以它们的经验都是这个 actor 的训练数据——合并起来 = \(N\) 倍样本,这是样本效率 \(N\) 倍提升的来源。
def update(actor, critic, opt_a, opt_c, buf, adv, ret,
clip=0.2, epochs=10, vnorm=None):
"""PPO 更新。与单智能体 PPO 的唯一区别:数据来自 N 个智能体、已合并展平。"""
# 把 (T, N, ...) 展平成 (T*N, ...) —— 参数共享的关键:所有智能体数据当成一个大 batch
obs = torch.as_tensor(np.array(buf['obs']).reshape(-1, OBS_DIM), dtype=torch.float32)
act = torch.as_tensor(np.array(buf['act']).reshape(-1, *ACT_SHAPE))
logp_old = torch.as_tensor(np.array(buf['logp']).reshape(-1), dtype=torch.float32)
state = torch.as_tensor(np.array(buf['state']).reshape(-1, STATE_DIM), dtype=torch.float32)
adv_t = torch.as_tensor(adv.reshape(-1), dtype=torch.float32)
ret_t = torch.as_tensor(ret.reshape(-1), dtype=torch.float32)
adv_t = (adv_t - adv_t.mean()) / (adv_t.std() + 1e-8) # 优势归一化(重要)
for _ in range(epochs):
dist = actor(obs)
logp = dist.log_prob(act)
if logp.dim() > 1: logp = logp.sum(-1)
ratio = torch.exp(logp - logp_old) # 重要性采样比 ρ
# PPO clip —— 和单智能体逐字相同
surr1 = ratio * adv_t
surr2 = torch.clamp(ratio, 1 - clip, 1 + clip) * adv_t
actor_loss = -torch.min(surr1, surr2).mean()
entropy = dist.entropy().mean()
actor_loss = actor_loss - 0.01 * entropy # 熵正则鼓励探索
opt_a.zero_grad(); actor_loss.backward()
nn.utils.clip_grad_norm_(actor.parameters(), 0.5) # 梯度裁剪
opt_a.step()
# Critic:MSE 拟合 GAE 回报。注意 state 去重——同一步 N 个智能体共享一个 state
v_pred = critic(state)
target = ret_t if vnorm is None else vnorm.normalize(ret_t) # value normalization
critic_loss = F.mse_loss(v_pred, target)
opt_c.zero_grad(); critic_loss.backward()
nn.utils.clip_grad_norm_(critic.parameters(), 0.5)
opt_c.step()
几个决定成败的实现细节(Yu 2022 系统消融出来的):
- 优势归一化
(adv - mean) / (std + 1e-8):跨智能体、跨 batch 归一化优势,稳定梯度尺度。缺它训练常发散。 - value normalization:用 running mean/std 归一化 critic 的回归目标,对奖励量级变化大的任务关键。
- 梯度裁剪
clip_grad_norm_(·, 0.5):防止偶发的大梯度毁掉训练。 - 熵正则:鼓励探索,防止过早收敛到次优。
- 较小的 epoch 数:多智能体下 over-fit 一个 batch 风险更高,epoch 通常比单智能体少(5-15)。
本质洞察:看完这份实现,你会发现 MAPPO 的"魔法"不在某个精巧的数学结构,而在**"一堆久经考验的工程技巧 + CTDE 的全局 critic + 参数共享"的踏实组合**。每一个部件(PPO clip、GAE、优势归一化、梯度裁剪)都是单智能体 RL 里反复验证过的"老兵",组合起来就异常鲁棒。这印证了 §10.5 的判断:在多智能体里,简单可靠 > 精巧脆弱。这也是为什么 MAPPO 的代码这么短、却这么强。
部件四:HAPPO 顺序更新骨架¶
MAPPO 同时更新所有 actor;HAPPO 按随机顺序逐个更新,每步重算重要性比(§10.5 第四步 + 陷阱)。骨架如下,重点标出"顺序 + 重算":
def happo_update(agents, critics, buf, adv_joint, clip=0.2, epochs=5):
"""HAPPO 顺序更新。agents 是 N 个独立 actor(异构,不共享参数)。
关键:按随机顺序逐个更新,每个 agent 更新后,后续 agent 的重要性比要重算。"""
order = np.random.permutation(len(agents)) # 随机排列(引理对任意顺序成立)
M = np.ones(buf.batch_size) # 累积重要性修正因子,初始为 1
for i in order:
# 当前 agent i 的优势 = 联合优势 × 前序 agent 已更新带来的累积修正 M
adv_i = adv_joint * M # M 编码了"前面 agent 改了策略"的影响
for _ in range(epochs):
dist_i = agents[i](buf.obs[:, i])
logp_i = dist_i.log_prob(buf.act[:, i])
if logp_i.dim() > 1: logp_i = logp_i.sum(-1)
ratio_i = torch.exp(logp_i - buf.logp_old[:, i])
surr1 = ratio_i * adv_i
surr2 = torch.clamp(ratio_i, 1 - clip, 1 + clip) * adv_i
loss_i = -torch.min(surr1, surr2).mean() - 0.01 * dist_i.entropy().mean()
agents[i].opt.zero_grad(); loss_i.backward()
nn.utils.clip_grad_norm_(agents[i].parameters(), 0.5)
agents[i].opt.step()
# 关键:更新 M —— 把 agent i 的"新策略/旧策略"比值乘进累积因子,
# 传给顺序中后面的 agent。这是分解引理"逐步条件"的代码体现。
with torch.no_grad():
new_logp_i = agents[i](buf.obs[:, i]).log_prob(buf.act[:, i])
if new_logp_i.dim() > 1: new_logp_i = new_logp_i.sum(-1)
M = M * torch.exp(new_logp_i - buf.logp_old[:, i]) # 累积重要性修正
# 一轮下来,联合性能单调不降(分解引理保证)
为什么 M 是 HAPPO 的灵魂? M 编码了"顺序中已更新的智能体改变了联合策略"这一信息——后面的智能体看到的"其余智能体策略"已经变了,它的优势必须按这个变化修正(乘 M)。没有 M 的逐步累积,就退化成"独立地循环更新每个 agent",分解引理的单调改进保证不成立(§10.5 陷阱)。M 正是分解引理 \(A=\sum_k A^{i_{1:k}}\) 里"条件于前序动作"的代码实现。
理论-工程桥接:对比 MAPPO 的
update(一个大 batch、所有智能体一起、无顺序)和 HAPPO 的happo_update(for 循环、逐个、带M累积),你能直接读出两种方法的设计哲学差异——MAPPO 用参数共享把 \(N\) 个智能体"压成一个"(并行、高效、要同构),HAPPO 用顺序更新把联合优化"拆成 \(N\) 个单变量优化"(串行、有保证、支持异构)。代码结构忠实反映了 §10.5 表格里的每一条权衡。
标准环境配置¶
MARL 的实验环境是另一个工程关键。三个最常用的标准环境,各自的定位和配置要点:
| 环境 | 动作 | 定位 | 典型用法 |
|---|---|---|---|
| PettingZoo(MPE) | 离散/连续 | 轻量、入门、快速验证算法 | Simple Spread(合作覆盖)、Simple Tag(追逃) |
| Multi-Agent MuJoCo(MAMuJoCo) | 连续 | 机器人连续控制、异构分割 | 把一个 MuJoCo 机器人的关节分给多个 agent(如 2-agent Ant,每 agent 控两条腿) |
| SMAC / SMACv2 | 离散 | 值分解的经典基准、微操协作 | 星际争霸单位微操,QMIX 的主战场 |
PettingZoo 配置要点(最适合入门):
from pettingzoo.mpe import simple_spread_v3
env = simple_spread_v3.parallel_env(N=3, local_ratio=0.5,
max_cycles=25, continuous_actions=False)
# parallel_env:所有 agent 同步出动作(适配 MAPPO 的同步采集)
# N=3:3 个 agent 协同覆盖 3 个地标
# 关键:MPE 默认不直接给"全局 state",需要自己拼(方式 B)或用环境的 state() 若提供
obs, _ = env.reset()
# obs 是 dict {agent_name: observation},注意 MAPPO 实现要处理 dict ↔ array 转换
MAMuJoCo 的"异构分割"是测 HAPPO 的关键:把一个机器人(如 Ant,8 个关节)的关节集合**划分**给多个 agent(如 agent 0 控前两条腿、agent 1 控后两条腿)。这种分割是天然异构的(不同 agent 控制不同身体部位、观测不同),正是 HAPPO 相对 MAPPO 体现优势的场景——也对应未来机器人方向"人形不同肢体分别控制""多足分布式控制"的真实需求。
跨章预告:本章在这些抽象环境(MPE/SMAC)上训练,是为了**隔离 MARL 算法本身**、排除机器人动力学的干扰。把 MAPPO/HAPPO 真正接到 IsaacLab/MuJoCo 的物理机器人编队、避障、协同搬运任务上,是第 11 章(MARL 多机运动协调)的内容——那里要处理连续高维状态、sim-to-real、奖励设计等机器人特有的挑战。本章打好"算法内核"的基础,第 11 章装"机器人外壳"。
配置环境时的一个关键开关:团队奖励还是个体奖励。 很多 MARL 环境(如 PettingZoo MPE)提供一个 local_ratio 参数,控制每个智能体的奖励是"纯团队奖励"还是"团队 + 个体局部奖励"的混合:local_ratio=0 是纯团队奖励(最难、信用分配困难最突出),local_ratio=1 是纯个体奖励(最容易、但失去了"协作"的意义)。这个开关直接关联 §10.1 的奖励结构和 §10.6 的信用分配——纯团队奖励下搭便车问题最严重、最考验算法的信用分配能力;混入个体局部奖励相当于给了一部分"手工信用分配",降低难度但也可能掩盖算法的真实协作能力。做算法对比时应固定这个比例(否则不同算法在不同难度上比,不公平),且若想真正考验协作与信用分配,应偏向纯团队奖励(local_ratio 较小)。这是一个看似不起眼、却能让实验结论完全不同的配置项。
算法对比实验设计¶
理解 MARL 不能只读公式,要亲手对比。设计一个最小但有说服力的对比实验:在 PettingZoo Simple Spread(3 agent 合作覆盖)上跑三个算法,看它们的机理差异如何体现在曲线上。
| 算法 | 关键配置 | 预期观察 | 对应机理 |
|---|---|---|---|
| IPPO | 独立 PPO,无全局 critic(critic 吃 \(o_i\))、不共享参数 | 收敛慢、震荡、最终次优 | 非平稳性未治理(§10.2)+ 无样本共享 |
| MAPPO | 全局 critic(吃 state)+ 参数共享 | 收敛快、稳、最终最优 | CTDE 治非平稳 + 参数共享提效率(§10.3/§10.5) |
| QMIX | 值分解、离散动作、单调混合 | 稠密奖励下稳、稀疏奖励下慢 | 值分解吃稠密奖励(§10.4) |
实验要点:(a) 控制变量——三个算法用相同的环境、相同的总环境步数、相同的网络规模;(b) 多种子——每个算法跑 3-5 个随机种子,画均值 ± 标准差的曲线(MARL 方差大,单种子不可信);(c) 关键对比——IPPO vs MAPPO 直接显示"全局 critic + 参数共享"的增益(隔离 CTDE 的作用),MAPPO vs QMIX 显示"策略梯度 vs 值分解"在该任务上的优劣。
预期结论(和文献一致):MAPPO 在这类同构、连续/离散合作任务上通常收敛最快最稳;IPPO 因非平稳性明显更差,直接证明 CTDE 的价值;QMIX 在离散稠密奖励任务上可与 MAPPO 竞争,但稀疏奖励或连续动作下劣势明显。这个对比让你亲眼看到前面所有理论的工程后果。
⚠️ 常见陷阱¶
⚠️ 编程陷阱:MAPPO 的 critic 回归目标和 advantage 用了不一致的 value。 错误描述:算 GAE 时用旧 critic 的 \(V\),但 critic 的回归目标
returns = adv + val里的val在多个 epoch 更新后已经变了,导致目标漂移。 现象/后果:critic loss 不收敛、或优势估计和值估计互相打架,训练不稳定。 根本原因:on-policy PPO 的标准做法是——在 update 开始前,用**当前(更新前)**的 critic 一次性算好所有 GAE 优势和 returns,然后在多个 epoch 里**固定**这些 targets 不变。如果在 epoch 内重算 GAE/returns,目标会随 critic 更新漂移。 正确做法:update 前用更新前的 critic 算好adv和ret,整个 update 的所有 epoch 都用这组固定的 targets。critic 只是去拟合这个固定的ret,不在 epoch 内重算。这是 PPO 的标准模式,多智能体下同样适用。⚠️ 编程陷阱:critic 的 state 在 N 个智能体间重复计数,导致 critic loss 被放大 N 倍。 错误描述:把
(T, N)的数据展平成(T*N,)训 critic 时,同一步的全局 state 被复制了 N 份(每个智能体一份),critic 对同一个 \((s, \text{target})\) 重复回归 N 次。 现象/后果:critic 的有效学习率被放大 N 倍(同一样本重复 N 次)、可能过拟合或不稳定;且浪费计算。 根本原因:全局 state \(s\) 每步只有一个,但展平时跟着 N 个智能体复制了 N 份。actor 的展平是对的(N 个智能体确实有 N 条不同的 \((o_i,a_i)\)),但 critic 的 state 不该复制。 正确做法:critic 训练时对 state 去重——每步只用一份 \((s, \text{return})\) 训 critic,而非 N 份。实现上可以分开处理:actor 用展平的(T*N,)数据,critic 用去重的(T,)数据(每步一个 state 一个 return)。或在 critic loss 上除以 N 抵消重复。⚠️ 概念误区:在连续动作任务上套用 QMIX。 错误描述:看到 QMIX 是强方法,想在机器人连续控制(关节力矩)任务上用它。 现象/后果:无法实现——QMIX 要 \(\arg\max_{a_i}Q_i\),连续动作空间上这个 argmax 做不动;强行离散化连续动作会维度爆炸或损失控制精度。 根本原因:值分解(VDN/QMIX/QTRAN/QPLEX)整条线都依赖离散动作上的 \(\arg\max\)(§10.4)。连续动作没有可枚举的 argmax,值分解路线整体不适用。 正确做法:连续动作(机器人控制的常态)用策略梯度路线——MAPPO(同构)或 HAPPO/HASAC(异构)。值分解只在离散动作任务(SMAC、离散高层决策)上用。选型第一刀就是"动作连续还是离散":连续→策略梯度,离散→两条路线都可,再按稠密/稀疏奖励、同构/异构细分。
练习¶
-
(补全 MAPPO,跑通对比) 基于本节骨架,补全一个完整可运行的 MAPPO(自己实现 buffer、main loop),在 PettingZoo
simple_spread_v3(3 agent)上训练。然后实现 IPPO(去掉全局 critic、critic 改吃 \(o_i\)、去掉参数共享),用相同步数、3 个种子对比两者的收敛曲线。报告:MAPPO 相对 IPPO 的收敛速度和最终性能提升了多少?把这个差距归因到"全局 critic"和"参数共享"两个因素(提示:做一个消融——只加全局 critic 不共享参数,看增益来自哪)。 -
(调试挑战) 下面这段 MAPPO 更新代码有**三个** bug,定位并修复,说明每个 bug 会导致什么现象:
(提示:bug A 重要性比的算法错了;bug B 目标的符号/min-max 错了;bug C 漏了什么导致梯度累积。)def buggy_update(actor, critic, buf, adv, ret, clip=0.2, epochs=10): obs = torch.tensor(buf['obs']).reshape(-1, OBS_DIM) act = torch.tensor(buf['act']).reshape(-1) logp_old = torch.tensor(buf['logp']).reshape(-1) for _ in range(epochs): dist = actor(obs) logp = dist.log_prob(act) ratio = logp / logp_old # bug A surr1 = ratio * adv surr2 = torch.clamp(ratio, 1-clip, 1+clip) * adv loss = torch.max(surr1, surr2).mean() # bug B loss.backward() actor.opt.step() # bug C -
(设计扩展题:异构分割实验) 在 Multi-Agent MuJoCo 的 Ant 上,设计两种 agent 分割:(a) 同构分割(对称地把 8 关节分成两组对称的 4 关节);(b) 异构分割(非对称地分,如 agent 0 控 6 关节、agent 1 控 2 关节)。预测:在哪种分割下 HAPPO 相对 MAPPO 的优势更明显?为什么(提示:参数共享在对称分割下是否还合理)?如果有条件,实际跑一下验证你的预测。
§10.8 关系网与前沿:与单智能体、与第 3 章、与 Mean-Field ⭐⭐¶
这一节解决什么问题:把本章学的 MARL 放回整个知识网络——它和单智能体 RL(
01_数学/70_强化学习数学)是什么关系、和第 3 章离散任务分配是什么关系、和后续章节怎么衔接、领域前沿(Mean-Field、offline MARL、sim-to-real)在攻什么。这一节是"收口",帮你把 MARL 这棵树挂回森林。
关系一:MARL 与单智能体 RL——退化与推广¶
MARL 不是和单智能体 RL 平行的另一套理论,而是它的**严格推广**。把这个关系钉清楚,能让你随时用单智能体的直觉来锚定 MARL 的概念:
单智能体(01_数学/70_强化学习数学) |
多智能体(本章) | 推广方式 |
|---|---|---|
| MDP | Markov Game / Dec-POMDP | 加多个决策者、各自动作影响联合转移 |
| 固定环境 → 压缩映射收敛 | 非平稳环境 → 收敛保证失效(§10.2) | 别人在学,有效核漂移 |
| 策略梯度定理 | MADDPG/COMA/MAPPO/HAPPO(§10.5) | critic 集中化 + 信用分配 + 顺序更新 |
| PPO clip | MAPPO(逐字相同的 clip)(§10.5) | 加全局 critic + 参数共享 |
| TRPO 单调改进 | HAPPO 优势分解引理(§10.5) | 顺序更新 + 链式分解 → 多智能体单调改进 |
| 单智能体信用分配(时间维度,靠 GAE) | 多智能体信用分配(智能体维度,靠反事实/值分解)(§10.6) | 从"哪一步的功劳"到"哪个智能体的功劳" |
| DQN / 值迭代 | VDN/QMIX(§10.4) | 联合 Q 分解成个体 utility + IGM |
反过来——令 \(N=1\),所有 MARL 退化为单智能体。 一个智能体时:Dec-POMDP 退化成 POMDP、Markov Game 退化成 MDP;非平稳性消失(没有"别人");MAPPO 退化成 PPO(一个 actor、critic 吃状态);信用分配消失(只有一个智能体,团队奖励就是它的奖励)。这个退化关系是检验你理解的好工具——任何 MARL 方法,问一句"\(N=1\) 时它变成什么单智能体方法",答得出来说明你抓住了它的本质。
本质洞察:MARL 相对单智能体 RL 多出来的全部难度,可以浓缩成两个"维度"的增加——一个是"智能体维度"上的信用分配(团队奖励要分摊到 \(N\) 个智能体,对应单智能体里时间维度上 GAE 把回报分摊到各时间步),一个是"非平稳维度"(别人在学导致环境漂移,单智能体里没有)。单智能体 RL 已经处理了"时间维度的信用分配"(GAE/TD),MARL 在它之上加了"智能体维度的信用分配"和"非平稳性"两个新轴。理解了这两个新轴,MARL 就不再神秘——它是单智能体 RL 沿两个新方向的延拓。
关系二:MARL 与第 3 章——序贯化与冻结¶
本章开头(前置桥接)就埋了这条线,现在收口。第 3 章(任务分配与路径规划)和本章是**同一问题的两个时间尺度**:
| 维度 | 第 3 章(任务分配/MAPF) | 本章(MARL) |
|---|---|---|
| 决策性质 | 离散、一次性(或重规划) | 序贯、每步决策 |
| 数学对象 | 指派问题 / 图搜索(组合优化) | 随机博弈 / Dec-POMDP(序贯决策) |
| 状态转移 | 无(分配是静态匹配)/ 确定(路径) | 随机转移 $P(s' |
| 求解 | 匈牙利、CBBA、CBS(精确/有界) | RL(近似、学习) |
| 信用分配 | CBBA 的边际收益(显式、离散) | 反事实/值分解(隐式、学习)(§10.6) |
| 何时用 | 任务/路径可建模、要最优性保证 | 动力学复杂/难建模、要端到端学习 |
两个方向的转化:
- 把 MARL"冻结"成第 3 章:如果去掉状态转移(决策是一次性的)、把动作空间离散化(选哪个任务)、奖励变成静态的分配收益,随机博弈就退化成第 3 章的指派问题。第 3 章是 MARL 的"单步、离散、可精确求解"特例。
- 把第 3 章"解冻"成 MARL:如果分工不能一次定死、每步要根据环境变化重新协调、且动作通过共享状态持续影响他人(如动态环境下的持续任务再分配),就需要本章的序贯学习框架。
实践中的混合——这恰是第 12 章(MARL 与传统规控混合)的主题:用第 3 章的方法做"高层离散决策"(谁去哪个区域、走哪条路),用本章的 MARL 做"底层连续协调"(具体怎么走、怎么避障、怎么协同发力)。两者不是竞争而是分层互补——离散规划保证全局最优性和可解释性,MARL 处理底层难建模的连续协调。
不是 X 而是 Y:MARL 不是**要取代第 3 章的任务分配/MAPF,而是处理它们处理不了的"序贯、连续、难建模"那一层。一个成熟的多机器人系统通常**两者都用——上层 CBS/CBBA 做离散路径/任务规划(有保证、可解释),下层 MAPPO 做连续运动协调(学习、适应)。把它们对立起来是初学者常见的误区;正确的视角是"分层协同"。
关系三:本章在 Part 中的位置与后续衔接¶
本章(第 10 章)是本 Part"MARL 三章"的第一章——打基础。后续两章把这个基础用到机器人系统:
- 第 11 章(MARL 多机运动协调):把 MAPPO/HAPPO 接到真实机器人编队、避障、协同覆盖的连续控制任务,处理 IsaacLab 仿真、奖励设计、sim-to-real——本章的"算法内核"装进"机器人外壳"。
- 第 12 章(MARL 与传统规控混合):MARL + MPC/势场的分层架构,学习高层、规控保底层安全——本章的 MARL 与第 3 章的规划、与前面 Part 的 MPC 融合。
- 第 13 章(Mini-MultiBot 综合实战):综合调度复用第 3 章的
planning/模块 + 本章的 MARL 协调,是整个 Part 的集大成。
前沿与开放问题¶
最后,把 MARL 当前的活跃前沿和开放问题做一个系统分类(穷举式维度,而非随意罗列),让你知道"基础之上还有什么":
| 前沿方向 | 攻什么困难 | 代表思路 |
|---|---|---|
| Mean-Field MARL | \(N\to\infty\) 时的可扩展性 | 把"其他 \(N-1\) 个智能体"近似成一个"平均场",单智能体只对平均场最优响应;\(N\) 很大(蜂群)时降复杂度 |
| Offline MARL | 真实数据训练(无在线交互) | 从固定数据集学,处理分布偏移 + 多智能体的"联合分布外动作"问题 |
| MARL sim-to-real | 多智能体的现实差距 | 多智能体交互的 domain randomization 比单智能体更难(要随机化"别人的行为") |
| 通信学习(learnable communication) | 执行时的实时协调 | DIAL/CommNet/TarMAC:训练时端到端学通信协议,执行时有限带宽通信 |
| 角色与技能涌现 | 异构分工、可扩展 | 让同构智能体涌现差异化角色(ROMA/RODE),或学可组合技能 |
| 大规模/开放系统 | 智能体数动态变化 | 处理智能体加入/退出、图结构变化(GNN-based MARL) |
几个值得记住的开放问题:
- MARL 的 sim-to-real gap 比单智能体更大——单智能体只需弥合"机器人-环境"的差距,多智能体还要弥合"机器人-机器人交互"的差距(真实队友的行为和仿真里训练的队友不同)。如何高效 domain randomize 多智能体交互是开放的。
- MAPPO 为什么这么强仍部分是经验性的——全局 critic 究竟提供了多少、参数共享和全局 critic 各贡献多少,理论解释还不完整。
- 可扩展性的根本张力——CTDE 的集中 critic 输入随 \(N\) 增长,真正上千智能体(蜂群)时需要 Mean-Field 或分解,但近似会损失协调精度。
一个边界澄清:本章只讲了合作,竞争/混合是另一片天地。 本章主战场是合作(共享奖励,§10.1),因为多机器人协作绝大多数是合作。但完整的 MARL 版图还有竞争(零和,如对抗、围捕-逃逸)和混合(一般和,如自动驾驶交汇、多方博弈)两大类,它们的方法论很不一样:竞争场景常用**自博弈(self-play)(智能体和自己的历史版本对打,AlphaGo/AlphaStar 的核心)、**种群训练(population-based training)(维护一个策略种群避免被单一对手克制)、以及博弈论的**均衡求解**(minimax-Q、纳什 Q-learning、CFR 反事实遗憾最小化)。这些方法关心的是"如何不被对手利用、如何收敛到好的均衡",而非"如何协作把团队目标做大"。对机器人方向,合作是主线(编队、搬运、覆盖),但对抗场景(如机器人足球的攻防、无人机的围捕)会用到竞争/混合方法——它们超出本章范围,但你应知道它们存在,且和本章共享"随机博弈"的形式化根基(§10.1)。一句话定位:本章 = 合作 MARL 的基础;竞争/混合 MARL(self-play、种群、均衡求解)是并列的另一支,留待专门学习。
阶段小结:MARL 是单智能体 RL 沿"智能体维度信用分配"和"非平稳性"两轴的延拓(关系一),是第 3 章离散决策的"序贯化"(关系二),三者构成多机器人智能的完整栈。本章打基础(且聚焦合作;竞争/混合是并列另一支),第 11-13 章落地,前沿在攻可扩展性(Mean-Field)、现实差距(sim-to-real)、实时协调(通信学习)。带着这张关系网,你能把任何一篇新的 MARL 论文准确地挂到这棵树的某根枝上。
练习¶
-
(退化检验) 对本章每个主要算法(MADDPG、COMA、QMIX、MAPPO、HAPPO),写出它在 \(N=1\) 时退化成的单智能体方法,并说明退化过程中哪些组件"消失"了(如非平稳性处理、信用分配、混合网络)。这道题用退化关系检验你对每个方法"多出来的部分"的理解。
-
(分层设计) 为一个"10 台无人机搜救灾区"的真实任务设计分层方案:(a) 哪一层用第 3 章的方法(什么方法、决策什么)?(b) 哪一层用本章的 MARL(什么方法、协调什么)?(c) 两层如何接口(上层的输出如何成为下层的输入/目标)?说明为什么分层比"纯 MARL 端到端"或"纯规划"更可取。
-
(前沿定位) 选一个你感兴趣的多机器人场景(蜂群、仓库、编队、协同操作),判断:(a) 它最可能撞上上表中哪个前沿挑战(可扩展性?sim-to-real?实时通信?)?(b) 现有的哪个前沿方向最对症?(c) 如果让你做研究,你会从本章的哪个基础方法出发去扩展?这道题训练"把真实需求映射到研究前沿"的能力。
综合练习(跨节、跨章)¶
这些题目需要综合本章多节、甚至跨第 3 章和单智能体 RL,目的是把知识连成网络。
综合题 1(贯穿本章:从形式化到实现的一条龙)。 给定一个 4 智能体的合作覆盖任务(连续动作):(a) 写出它的 Dec-POMDP 元组(§10.1);(b) 论证为什么独立学习会失败、CTDE 为什么能救(§10.2/§10.3);(c) 选 MAPPO 还是 HAPPO,说明理由(§10.5);(d) 列出从单智能体 PPO 改到你选的方法的最小代码改动(§10.7);(e) 设计一个对比实验验证你的方法优于 IPPO(§10.7)。要求每一步引用对应小节的具体结论。
综合题 2(跨章:第 3 章 + 本章的分层系统)。 设计一个完整的"\(N\) 台 AGV 仓库取送货"系统:上层用第 3 章的 CBBA(分布式任务分配)决定"哪台 AGV 取哪个货”、用 CBS 或优先级规划做无碰撞路径;下层用本章的 MAPPO 做"沿规划路径的连续运动协调 + 局部动态避障"。(a) 画出两层的数据流和接口;(b) 说明上层的离散决策如何成为下层 MARL 的目标/奖励;(c) 论证为什么这个分层架构比"纯 MAPPO 端到端学一切"更鲁棒、更可解释(提示:最优性保证、样本效率、安全性各从哪层来)。
综合题 3(跨单智能体 RL:信用分配的两个维度)。 单智能体 RL 用 GAE 解决"时间维度的信用分配"(一条轨迹的总回报,哪一步的功劳,01_数学/70_强化学习数学/20 §5);本章用反事实/值分解解决"智能体维度的信用分配"(团队奖励,哪个智能体的功劳,§10.6)。(a) 把这两个维度的信用分配并排写出它们的数学形式,指出结构上的相似(都是"边际/差分");(b) MAPPO 同时面对这两个维度——它怎么处理时间维度(用什么)、怎么处理智能体维度(用什么)?(c) 设想一个"时间长 + 智能体多 + 团队奖励稀疏"的任务,这两个维度的信用分配困难如何叠加放大?你会怎么缓解?
本章常见误解汇总¶
| 误解 | 正确理解 | 出处 |
|---|---|---|
| MARL 就是把单智能体 RL 复制 \(N\) 份 | 那是独立学习,会被非平稳性击垮;MARL 是"联合优化、分布式执行"的协调问题 | §10.1 |
| 全局状态 \(s\) = 所有观测的拼接 \((o_1,\dots,o_N)\) | 观测拼接通常有盲区和冗余,\(\neq\) 全局真值;MAPPO 区分 obs 和 state 正为此 |
§10.1 |
| 找到纳什均衡 = 找到最优协作 | 均衡只保证"没人单方面变好",合作场景才与最优重合,混合场景可能差很远 | §10.1 |
| 非平稳性可以靠调小学习率解决 | 非平稳是框架性问题(追移动靶),调学习率只是一起变慢;解药是 CTDE | §10.2 |
| 有了 CTDE 就自动解决信用分配 | CTDE 治非平稳和维度爆炸,信用分配是正交困难,需额外机制(反事实/值分解) | §10.3 |
| CTDE 执行时要把 critic 带上 | critic 只在训练时用,执行时丢弃,只跑分布式 actor | §10.3 |
| CTDE = 参数共享 | 两件正交的事:CTDE 是信息结构(全局 critic),参数共享是权重复用 | §10.3 |
| QMIX 表达力够强,能拟合任意协作任务 | 单调性约束表达不了非单调耦合,是固有上限,非超参问题 | §10.4 |
| 值分解的 \(Q_i\) 是智能体 \(i\) 的真实 Q 值 | \(Q_i\) 是 utility,没有独立语义,只为凑 \(Q_{\text{tot}}\) 并支持分布式 argmax | §10.4 |
| MAPPO 的 critic 吃联合动作 \(Q(s,\mathbf{a})\) | MAPPO 的 critic 是 \(V(s)\),只吃全局状态,优势用 GAE;吃动作的是 MADDPG | §10.5 |
| 信用分配 = 给每人单独设计奖励(reward shaping) | 信用分配是反事实边际贡献的自动归因,手工奖励是甩锅、易诱发奖励黑客 | §10.6 |
| HAPPO 顺序更新就是简单循环更新每个 agent | 必须每步重算重要性比(累积因子 \(M\)),否则分解引理保证不成立 | §10.5/§10.7 |
| 连续动作任务可以用 QMIX | 值分解依赖离散 argmax,连续动作必须用策略梯度(MAPPO/HAPPO) | §10.7 |
| MARL 要取代第 3 章的任务分配 | 两者是分层互补:离散规划保最优/可解释,MARL 处理连续/难建模协调 | §10.8 |
本章小结¶
本章建立了合作型多智能体强化学习的完整基础框架。一句话总纲:MARL = 单智能体 RL + 非平稳性处理(CTDE)+ 智能体维度的信用分配。
把全章浓缩成一条逻辑链:
- 问题(§10.1):合作 MARL 是 Dec-POMDP——"用只能看局部的策略,最大化全局团队目标"。它是 MDP 沿"多决策者 + 部分可观测"的推广,合作时目标退化为单目标优化。
- 困难(§10.2):第一性困难是**非平稳性**——别人在学,单个智能体的有效环境漂移,单智能体 RL 的压缩映射、经验回放保证全部失效。加上信用分配、维度爆炸、协调,构成四大困难。
- 范式(§10.3):CTDE——训练时用集中组件(全局信息)治非平稳,执行时分布式 actor 满足部署约束。机理是"把漂移从环境挪进条件"。
- 路线 A(§10.4):值分解——VDN(可加)→ QMIX(单调)→ QTRAN/QPLEX(逼近 IGM 全类),核心是 **IGM 原则**让分布式 argmax = 集中式 argmax。主战场离散动作。
- 路线 B(§10.5):策略梯度——MADDPG(集中 critic 治非平稳)→ COMA(反事实基线解信用分配)→ MAPPO(共享 PPO + 全局 critic,最强基线)→ HAPPO(优势分解引理 + 顺序更新,异构 + 保证)。主战场连续动作、机器人。
- 信用分配(§10.6):贯穿两路线的灵魂——贡献 = 反事实边际差值,差分奖励/反事实基线/值分解是同一思想的三种实现,Shapley 值是理论标尺。
- 关系网(§10.8):MARL 是单智能体 RL 的推广、第 3 章离散决策的序贯化,三者分层互补构成多机器人智能栈。
术语速查表¶
| 术语 | 英文 | 一句话定义 |
|---|---|---|
| 随机博弈 | Markov Game / Stochastic Game | 多决策者在随机转移状态空间反复博弈,各自有奖励,找均衡 |
| Dec-POMDP | Decentralized POMDP | 合作 + 部分可观测 + 去中心化执行的多智能体模型,求解 NEXP-完全 |
| 非平稳性 | non-stationarity | 别人在学导致单智能体的有效转移核/奖励随训练漂移 |
| CTDE | Centralized Training, Decentralized Execution | 训练用集中组件(全局信息)、执行用分布式 actor(本地观测) |
| 独立学习 | Independent Learning (IQL/IPPO) | 每个智能体跑独立单智能体 RL,把别人当环境,受非平稳性折磨 |
| 联合学习 | Joint Action Learning | 把所有智能体当一个超级智能体,平稳但指数爆炸、执行需全局信息 |
| 值分解 | Value Decomposition/Factorisation | 把联合 Q 分解成个体 utility \(Q_i\),执行时各自 argmax |
| utility(效用) | utility | 值分解里的个体值分量,无独立语义,只为凑 \(Q_{\text{tot}}\) |
| IGM 原则 | Individual-Global-Max | 分布式局部 argmax = 集中式全局 argmax 的充要条件 |
| 混合网络 | mixing network | QMIX 里把 \(Q_i\) 聚合成 \(Q_{\text{tot}}\) 的网络,权重非负保单调 |
| 超网络 | hypernetwork | 以全局状态 \(s\) 为输入、生成混合网络权重的网络 |
| 单调性约束 | monotonicity constraint | \(\partial Q_{\text{tot}}/\partial Q_i\geq 0\),QMIX 满足 IGM 的方式 |
| 集中式 critic | centralized critic | 训练时吃全局状态/联合动作的 critic,治非平稳 |
| 反事实基线 | counterfactual baseline | COMA 里固定别人、平均掉 \(i\) 自己动作的基线,解信用分配 |
| 信用分配 | credit assignment | 从团队奖励里推断每个智能体的反事实边际贡献 |
| 差分奖励 | difference rewards | \(r(\mathbf{a})-r(c_i,\mathbf{a}_{-i})\),\(i\) 相对默认动作的边际贡献 |
| 参数共享 | parameter sharing | 所有智能体用同一套网络权重,提样本效率,要求同构 |
| 优势分解引理 | advantage decomposition lemma | 联合优势 = 逐个智能体条件优势之和(HAPPO 基石) |
| 顺序更新 | sequential update | HAPPO 按随机顺序逐个更新智能体、每步重算重要性比 |
| Shapley 值 | Shapley value | 合作博弈中唯一满足四公理的公平贡献归因,归因理论标尺 |
| 平均场 MARL | Mean-Field MARL | \(N\to\infty\) 时把其他智能体近似成平均场,降复杂度 |
知识点总表¶
| 编号 | 知识点 | 核心要点 | 对应节 | 难度 |
|---|---|---|---|---|
| 1 | Markov Game | 多决策者随机博弈,三类:合作/竞争/混合 | §10.1 | ⭐⭐⭐ |
| 2 | Dec-POMDP | 合作+部分可观测+去中心化,目标 \(\max_{\boldsymbol\pi}\mathbb{E}[\sum\gamma^t r]\) | §10.1 | ⭐⭐⭐ |
| 3 | 纳什均衡 vs 团队最优 | 合作时重合,混合时可能差很远 | §10.1 | ⭐⭐⭐ |
| 4 | 非平稳性 | 有效核 \(P_i^{\boldsymbol\pi_{-i}}\) 随训练漂移,破坏压缩映射 | §10.2 | ⭐⭐⭐ |
| 5 | 四大困难 | 非平稳/信用分配/维度爆炸/协调 | §10.2 | ⭐⭐⭐ |
| 6 | CTDE 范式 | 训练集中(治非平稳)+ 执行分布(满足部署) | §10.3 | ⭐⭐⭐ |
| 7 | CTDE 三变体 | 集中 critic / 值分解 / 可微通信 | §10.3 | ⭐⭐⭐ |
| 8 | VDN | \(Q_{\text{tot}}=\sum_i Q_i\),可加 → IGM | §10.4 | ⭐⭐⭐ |
| 9 | IGM 原则 | 分布式 argmax = 集中式 argmax 的充要条件 | §10.4 | ⭐⭐⭐⭐ |
| 10 | QMIX | 单调混合网络 + 超网络,\(\partial Q_{\text{tot}}/\partial Q_i\geq 0\) | §10.4 | ⭐⭐⭐⭐ |
| 11 | QTRAN/QPLEX | 放松/完整刻画 IGM,换表达力 | §10.4 | ⭐⭐⭐⭐ |
| 12 | MADDPG | 集中 critic 吃联合动作,吸收非平稳性 | §10.5 | ⭐⭐⭐ |
| 13 | COMA | 反事实基线 \(Q-\sum_{a_i'}\pi_i Q\),解信用分配 | §10.5 | ⭐⭐⭐⭐ |
| 14 | MAPPO | 共享 PPO + 全局 \(V(s)\) critic,最强基线 | §10.5 | ⭐⭐⭐ |
| 15 | HAPPO | 优势分解引理 + 顺序更新,异构 + 单调改进 | §10.5 | ⭐⭐⭐⭐ |
| 16 | 信用分配统一视角 | 贡献 = 反事实边际,三解法同源,Shapley 标尺 | §10.6 | ⭐⭐⭐ |
| 17 | MARL ↔ 单智能体 | \(N=1\) 退化,多两轴:智能体信用分配 + 非平稳 | §10.8 | ⭐⭐ |
| 18 | MARL ↔ 第 3 章 | 序贯化/冻结,分层互补 | §10.8 | ⭐⭐ |
累积项目:本章新增模块¶
本章给 Mini-MultiBot 加入**学习式协调层**——MARL,这是后续第 11 章多机运动协调、第 12 章 MARL 与传统规控混合的算法内核。前面章节的 planning/(第 3 章离散决策)解决"谁去哪、走哪条路",本章的 marl/ 解决"沿路径如何连续协调、如何处理难以建模的交互"——两层互补(§10.8 关系二)。
本章新增 marl/ 目录,含 CTDE 算法内核与环境适配:
mini-multibot/
├── communication/
│ ├── consensus.py # Ch2:共识——被 cbba 复用
├── controllers/
│ └── distributed_mpc/ # Ch2
├── planning/ # Ch3:离散决策层
│ ├── cbba.py cbs.py lns.py pipeline.py
├── execution/ # Ch3
│ └── adg.py
├── marl/ # 本章新增:学习式协调层
│ ├── networks.py # 本章:Actor(吃 o_i) / Critic(吃 state) 网络
│ ├── mappo.py # 本章:MAPPO 训练循环(共享 PPO + 全局 critic)
│ ├── happo.py # 本章:HAPPO 顺序更新(异构,优势分解引理)
│ ├── buffer.py # 本章:多智能体 on-policy buffer(存 obs+state+联合动作)
│ ├── gae.py # 本章:GAE 优势估计(复用单智能体逻辑)
│ └── env_wrapper.py # 本章:Dec-POMDP 环境适配(暴露 obs[i] 与全局 state)
├── envs/ # Ch4/Ch8 起
└── evaluation/ # Ch13
设计要点:networks.py 严格分离 Actor(输入 obs_dim,执行时用)和 Critic(输入 state_dim,仅训练时用),落实 CTDE 的信息结构(§10.3/§10.7)。mappo.py 把 §10.7 的训练循环工程化——参数共享、全局 critic、优势归一化、value normalization、梯度裁剪一应俱全;happo.py 实现顺序更新与累积重要性因子 M(§10.5/§10.7),供异构机型(第 6 章的不同机型、第 11 章的领航-跟随)使用。env_wrapper.py 是关键接口——它把任意多机环境包装成暴露 get_obs()→[o_1,...,o_N] 和 get_state()→s 两个方法的 Dec-POMDP 接口,让上层算法与具体环境解耦(既可接 PettingZoo 做算法验证,又可接第 11 章的 IsaacLab 机器人环境)。buffer.py 区分"每智能体经验"(actor 用,展平成 \(T\times N\))和"全局 state"(critic 用,去重成 \(T\)),避免 §10.7 陷阱里的 state 重复计数。
# marl/env_wrapper.py —— Dec-POMDP 接口适配(本章版;第 11 章接 IsaacLab 物理环境)
import numpy as np
class DecPOMDPWrapper:
"""把任意多机环境包装成统一的 Dec-POMDP 接口:
暴露分布式观测 get_obs() 与集中式全局状态 get_state()——CTDE 的两个信息通道。
上层 MAPPO/HAPPO 只依赖这个接口,与具体环境(PettingZoo / IsaacLab)解耦。"""
def __init__(self, env, n_agents, build_state=None):
self.env = env
self.n_agents = n_agents
# build_state: 全局状态构造策略(§10.7 三方式之一)
# None → 优先用环境自带 state(); 否则退回观测拼接(方式 B)
self.build_state = build_state
def reset(self):
obs = self.env.reset()
return self._to_array(obs)
def step(self, joint_action):
next_obs, rew, done, info = self.env.step(joint_action)
return self._to_array(next_obs), np.asarray(rew), np.asarray(done), info
def get_state(self):
# 方式 A:环境直接提供全局真值(首选)
if hasattr(self.env, "state"):
return np.asarray(self.env.state())
# 方式 C:自定义 agent-centric 全局状态
if self.build_state is not None:
return self.build_state(self.env)
# 方式 B:观测拼接(退而求其次;注意有盲区/冗余,§10.1 陷阱)
return np.concatenate(self.get_obs())
def get_obs(self):
return self._to_array(self.env.get_obs() if hasattr(self.env, "get_obs")
else self.env.observe_all())
def _to_array(self, obs):
# 统一 dict / list → (n_agents, obs_dim) 数组
if isinstance(obs, dict):
return np.stack([obs[k] for k in sorted(obs.keys())])
return np.asarray(obs)
到本章末,Mini-MultiBot 已具备"通信底座(Ch1)+ 共识/ADMM 协调内核(Ch2)+ 任务分配/路径规划(Ch3)+ MARL 学习式协调(Ch10)"。第 11 章会把 marl/mappo.py 接到 IsaacLab 的物理多机器人编队/避障任务,第 12 章把 MARL 协调与第 3 章的离散规划、与 MPC 做分层融合(§10.8 关系三),第 13 章综合调度复用 planning/ + marl/ 两层。
延伸阅读¶
奠基论文(按本章脉络):
- Littman, "Markov Games as a Framework for Multi-Agent Reinforcement Learning", ICML 1994(⭐⭐⭐):MARL 形式化的源头,随机博弈框架 + minimax-Q。读它理解"为什么用博弈论看 MARL"。
- Lowe, Wu, Tamar, Harb, Abbeel, Mordatch, "Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments (MADDPG)", NeurIPS 2017(⭐⭐⭐⭐):CTDE 奠基作,集中 critic 吸收非平稳性。§10.5 第一步的原始出处,必读。
- Foerster, Farquhar, Afouras, Nardelli, Whiteson, "Counterfactual Multi-Agent Policy Gradients (COMA)", AAAI 2018(⭐⭐⭐⭐):反事实基线解信用分配。§10.5/§10.6 的核心,读它理解信用分配的反事实本质。
- Sunehag 等, "Value-Decomposition Networks (VDN)", AAMAS 2018(⭐⭐⭐):值分解最简形式 \(Q_{\text{tot}}=\sum Q_i\)。§10.4 的起点。
- Rashid, Samvelyan, Schroeder de Witt, Farquhar, Foerster, Whiteson, "QMIX: Monotonic Value Function Factorisation", ICML 2018(⭐⭐⭐⭐):单调混合网络 + 超网络。§10.4 的核心,值分解必读。
- Son, Kim, Kang, Hostallero, Yi, "QTRAN", ICML 2019;Wang 等, "QPLEX", ICLR 2021(⭐⭐⭐⭐):放松/完整刻画 IGM。深入值分解表达力时读。
- Yu, Velu, Vinitsky, Gao, Wang, Bayen, Wu, "The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games (MAPPO)", NeurIPS 2022(⭐⭐⭐⭐):MAPPO 强基线翻案 + 关键实现技巧消融。机器人 MARL 必读,§10.5/§10.7 的主要依据。
- Kuba, Chen, Wen, Wen, Sun, Wang, Yang, "Trust Region Policy Optimisation in Multi-Agent Reinforcement Learning (HATRPO/HAPPO)", ICLR 2022(⭐⭐⭐⭐):多智能体优势分解引理 + 顺序更新。§10.5 第四步的原始出处。
- Zhong, Kuba, Feng, Liu, Wen, Yang, "Heterogeneous-Agent Reinforcement Learning (HARL)", JMLR 2023(⭐⭐⭐):统一异构 MARL 库与理论。异构方向必读,HARL 库的论文。
综述与教材:
- Albrecht, Christianos, Schäfer, Multi-Agent Reinforcement Learning: Foundations and Modern Approaches, MIT Press, 2024(⭐⭐⭐):当前最系统的 MARL 教材,免费在线。本章的形式化、CTDE、值分解、策略梯度都能在此找到更详尽的展开。
- Amato, "A First Introduction to Cooperative Multi-Agent Reinforcement Learning", 2024(⭐⭐⭐):合作 MARL 的精炼引论,Dec-POMDP 与 CTDE 讲得很清楚。
- Bernstein, Givan, Immerman, Zilberstein, "The Complexity of Decentralized Control of Markov Decision Processes", Math. of OR, 2002(⭐⭐⭐⭐):Dec-POMDP 的 NEXP-完全证明。理解"为什么 Dec-POMDP 这么难"的理论根源。
- Papoudakis, Christianos, Schäfer, Albrecht, "Benchmarking Multi-Agent Deep RL in Cooperative Tasks", NeurIPS Datasets 2021(⭐⭐⭐):VDN/QMIX/MAPPO/IPPO 在合作任务上的系统对比。§10.7 对比实验的参考。
代码库(项目精读清单):
- MAPPO 官方(
marlbenchmark/on-policy,~1.8k★):onpolicy/algorithms/r_mappo/是 MAPPO 核心。精读r_mappo.py(trainer)和r_actor_critic.py,标注:全局 state 如何输入 critic、参数共享如何实现、value normalization 在哪。 - HARL(
PKU-MARL/HARL,~700★):harl/algorithms/actors/happo.py是 HAPPO 核心。精读顺序更新循环,标注重要性因子factor(即本章的M)如何累积传递。 - PyMARL / PyMARL2(
oxwhirl/pymarl,~1.8k★):src/modules/mixers/qmix.py是 QMIX 混合网络。精读超网络如何生成非负权重(torch.abs),对照 §10.4 的单调性约束。 - EPyMARL(
uoe-agents/epymarl):扩展 PyMARL,统一了 IPPO/MAPPO/QMIX/VDN 等,适合做 §10.7 的算法对比实验。
本章与后续章节的关系¶
| 后续章节 | 关系 | 本章铺垫的知识点 |
|---|---|---|
| 第 11 章 MARL 多机运动协调 | 直接应用 | MAPPO/HAPPO(§10.5)接 IsaacLab 物理环境做编队/避障/覆盖的连续控制;env_wrapper 接口、CTDE 信息结构 |
| 第 12 章 MARL 与传统规控混合 | 分层融合 | MARL(本章)做高层协调 + MPC/势场(前面 Part)保底层安全;与第 3 章离散规划的分层(§10.8 关系二/三) |
| 第 13 章 Mini-MultiBot 综合实战 | 综合复用 | marl/ 模块(本章累积项目)+ planning/(第 3 章)联合调度 |
| 第 6 章 异构多机协同 | 互为支撑 | HAPPO 的异构支持(§10.5)对应异构机型的差异化角色;得分函数注入 |
| 前置章节 | 关系 | 复用的知识点 |
|---|---|---|
01_数学/70_强化学习数学/10 MDP/DP |
地基 | 压缩映射(§10.2 非平稳性论证的反衬)、POMDP/信念状态(§10.1) |
01_数学/70_强化学习数学/20 策略梯度/AC |
地基 | 策略梯度定理、GAE、TRPO/PPO(§10.5 所有方法的母体) |
| 第 1 章 多机系统全景 | 同 Part 前置 | 通信图、集中/分布式架构(CTDE 的执行约束来源) |
| 第 2 章 共识与分布式优化 | 同 Part 前置 | 分布式协调的数学语言(与 MARL 的分布式执行呼应) |
| 第 3 章 任务分配与路径规划 | 同 Part 对照 | 离散决策 vs 序贯学习(§10.8 关系二)、累积项目 planning/ |
🔧 故障排查手册¶
| 症状 | 可能原因 | 排查步骤 | 相关节 |
|---|---|---|---|
| 训练曲线剧烈震荡、不收敛 | 非平稳性未治理(用了独立学习/IPPO,无全局 critic) | ① 确认 critic 吃的是全局 state 而非 \(o_i\);② 改用 MAPPO(全局 critic + 参数共享);③ 检查是否误用了大 replay buffer(on-policy 不该有);④ 若仍震荡,降学习率只是治标,根因在信息结构 | §10.2, §10.3 |
| 智能体出现搭便车/懒惰智能体(有人摸鱼或退化成废物) | 信用分配失败,团队奖励未正确归因 | ① 检查是否所有智能体共用同一团队优势(无信用分配机制);② 引入反事实基线(COMA)或值分解(QMIX);③ 检查探索是否充分(懒惰智能体常因过早被"按住");④ 监控每个智能体的行为熵和贡献 | §10.6 |
| QMIX 训练 loss 下降但执行时智能体不协调 | 混合网络权重未加非负约束,IGM 被破坏 | ① 检查超网络输出的权重是否过了 torch.abs/F.relu;② 数值验证 \(\partial Q_{\text{tot}}/\partial Q_i\geq 0\);③ 确认只对 weight 加约束、bias 不加;④ 对照 PyMARL 的 qmix.py |
§10.4 |
| MAPPO critic loss 不收敛 / 优势和值打架 | GAE/returns 在 epoch 内重算导致目标漂移,或 state 重复计数 | ① 确认 update 前一次性算好 adv/ret,多 epoch 固定不变;② 检查 critic 训练的 state 是否被 N 个智能体重复计数(应去重);③ 加 value normalization;④ 检查优势归一化 | §10.7 |
| 连续动作任务无法用 QMIX | 值分解依赖离散 argmax,连续动作不适用 | ① 确认动作空间类型;② 连续动作改用策略梯度(MAPPO/HAPPO/HASAC);③ 若坚持值分解,需把连续动作离散化(损失精度、可能维度爆炸,一般不推荐) | §10.4, §10.7 |
| 参数共享的 MAPPO 智能体行为完全相同、无法分化角色 | 对称观测 + 参数共享 → 对称策略,缺身份区分 | ① 检查局部观测是否天然区分角色;② 在 actor 输入拼接 agent one-hot ID 或 embedding;③ 若需强异构角色,换 HAPPO(独立 actor);④ 启用实现的 use_agent_id 选项 |
§10.5, §10.7 |
| HAPPO 不如 MAPPO 稳 / 体现不出异构优势 | 顺序更新未重算重要性比(退化成简单循环) | ① 确认每更新完一个 agent,后续 agent 的重要性比/优势按已更新前序重算(累积因子 M);② 确认是随机顺序而非固定顺序;③ 对照 HARL 的 happo.py 的 factor 累积逻辑 |
§10.5, §10.7 |
| 全局 state 用观测拼接后 critic 估值差 | 观测拼接 ≠ 全局真值(有盲区/冗余) | ① 优先用仿真器的真全局 state(env.state());② 若不可得,尝试 agent-centric state(方式 C);③ 确认 state 包含了关键的全局信息(如未被任何智能体观测的状态成分) |
§10.1, §10.7 |
API 速查表¶
本章涉及的核心接口与"签名 + 说明"(以教学实现和主流库为准):
| 接口 / 概念 | 签名 / 形式 | 说明 |
|---|---|---|
| Dec-POMDP 元组 | \(\langle N,\mathcal{S},\{\mathcal{A}_i\},P,r,\{\mathcal{O}_i\},\{O_i\},\gamma\rangle\) | 合作 MARL 的标准形式化(§10.1) |
| 联合优势 | \(A(s,\mathbf{a})=Q(s,\mathbf{a})-V(s)\) | 策略梯度路线的优势(§10.5) |
| IGM 条件 | \(\arg\max_{\mathbf{a}}Q_{\text{tot}}=(\arg\max_{a_i}Q_i)_i\) | 值分解正确性的充要条件(§10.4) |
| QMIX 单调约束 | \(\partial Q_{\text{tot}}/\partial Q_i\geq 0\),代码 w = torch.abs(hyper_w(s)) |
混合网络权重非负保单调(§10.4) |
| MAPPO actor loss | \(\min(\rho A,\text{clip}(\rho,1\pm\epsilon)A)\),torch.min(surr1, surr2) |
与单智能体 PPO 逐字相同(§10.5/§10.7) |
| MAPPO critic | \(V_\phi(s)\),Critic(state_dim)→标量 |
吃全局 state、输出标量值,非 \(Q(s,\mathbf{a})\)(§10.5) |
| GAE | \(A_t=\sum_l(\gamma\lambda)^l\delta_{t+l}\),compute_gae(buf,γ,λ) |
\(V\) 来自全局 critic(§10.7) |
| COMA 反事实基线 | \(b_i=\sum_{a_i'}\pi_i(a_i')Q(s,(a_i',\mathbf{a}_{-i}))\) | 固定别人、平均 \(i\) 自己动作(§10.5/§10.6) |
| 差分奖励 | \(D_i=r(\mathbf{a})-r(c_i,\mathbf{a}_{-i})\) | \(i\) 相对默认动作 \(c_i\) 的边际贡献(§10.6) |
| HAPPO 重要性因子 | \(M\leftarrow M\cdot\exp(\log\pi_i^{\text{new}}-\log\pi_i^{\text{old}})\) | 顺序更新的累积修正(§10.5/§10.7) |
| PettingZoo 环境 | simple_spread_v3.parallel_env(N=3,...) |
入门级 MARL 环境,parallel 同步出动作(§10.7) |
| 全局 state 接口 | env.state() / env.get_state() |
CTDE critic 的全局信息来源(§10.7) |
研究实践建议¶
分层次的实践路径(按读者目标):
入门级(建立直觉、跑通第一个 MARL):
1. 先在 PettingZoo simple_spread_v3(3 agent 合作覆盖)跑通 MAPPO——这是 MARL 的"Hello World"。亲手感受"全局 critic + 参数共享"。
2. 实现 IPPO 做对比,亲眼看到非平稳性导致的性能差距——这比读十遍 §10.2 都直观。
3. 把 §10.7 的代码骨架补全跑通,做一遍 MAPPO vs IPPO vs QMIX 三算法对比。
进阶级(理解机理、能做选型): 1. 在一个小矩阵博弈上测 QMIX 的表达力上限(用 §10.4 的非单调 \(\pm 12\) 矩阵),亲手验证单调性约束的代价。 2. 实现 QMIX 的混合网络 + 超网络,数值验证单调性(\(\partial Q_{\text{tot}}/\partial Q_i\geq 0\)),故意去掉非负约束看它如何失败。 3. 在 Multi-Agent MuJoCo 的异构分割上对比 MAPPO vs HAPPO,验证"异构用 HAPPO"的判断。
研究级(做新工作):
1. 精读 MAPPO 官方代码(marlbenchmark/on-policy),搞清楚那些"实现技巧"(value norm、agent-specific state)各贡献多少——这是 Yu 2022 论文一半的价值所在。
2. 复现 HAPPO 的优势分解引理,理解顺序更新的单调改进证明,这是异构 MARL 研究的理论基础。
3. 选一个前沿方向(§10.8)深入:Mean-Field(可扩展性)、offline MARL(真实数据)、MARL sim-to-real(现实差距)——这些是当前 MARL 在机器人落地的主要瓶颈。
通用建议: - MARL 方差极大,永远跑多种子(≥3-5)画均值±方差,单种子结果不可信——这是 MARL 实验的铁律。 - 先用 MAPPO 作为默认基线,再考虑是否需要更复杂的方法(§10.5 本质洞察:简单可靠 > 精巧脆弱)。 - 选型第一刀看动作空间:连续→策略梯度(MAPPO/HAPPO),离散→两条路线都可,再按稠密/稀疏奖励、同构/异构细分。 - 把 MARL 当工具而非银弹:能用第 3 章离散规划保证最优性/可解释性的部分就别硬上 MARL,分层架构(§10.8)通常比纯端到端更鲁棒。
版本信息速查¶
| 项目 | 版本 / 说明 |
|---|---|
| 本章定位 | 第 10 章 MARL 基础,算法工程教学,全方向共享 |
| 核心算法 | MADDPG(2017), COMA(2018), VDN(2018), QMIX(2018), QTRAN(2019), QPLEX(2021), MAPPO(2022), HAPPO(2022) |
| 主要代码库 | marlbenchmark/on-policy(MAPPO), PKU-MARL/HARL(HAPPO/异构), oxwhirl/pymarl(QMIX/值分解), uoe-agents/epymarl(统一对比) |
| 标准环境 | PettingZoo(MPE), Multi-Agent MuJoCo, SMAC/SMACv2 |
| 前置依赖 | 单智能体 RL(PPO/SAC/DDPG,01_数学/70_强化学习数学)、第 1-3 章多机基础 |
| 后续衔接 | 第 11 章(运动协调)、第 12 章(规控混合)、第 13 章(综合实战) |
说明:论文的作者、年份、会议以正文引用与延伸阅读为准;代码库的星标数和接口随上游更新,复现时以官方仓库与发行说明为准;MARL 领域发展快,Mean-Field、offline MARL、MARL sim-to-real 等前沿方向的具体方法以最新文献为准。