混合型博弈:当合作遇上竞争 (Mixed Cooperative-Competitive)

摘要
现实世界很少是纯粹的“你好我好大家好”(完全合作),也很少是纯粹的 1v1 单挑(完全竞争)。最常见的形态是团队对抗 (Team-based Adversarial):例如王者荣耀/Dota2 的 5v5,或者机器人足球世界杯。在这种混合型 (Mixed) 场景下,智能体面临双重人格分裂:对内,它是无私的队友;对外,它是冷酷的杀手。本文将深入剖析混合型 MARL 的数学模型,详解 MADDPG 算法如何通过“中心化 Critic”一统江湖,并介绍 Population-Based Training (PBT) 如何解决复杂的 Meta-Game 进化。


目录 (Table of Contents)

  1. 什么是混合型 MARL?
    • 定义:一般和博弈 (General-Sum Game)
    • 典型场景:团队零和 (Team Zero-Sum)
  2. 双重困境:内忧外患
    • 内忧:信誉分配与协作
    • 外患:非平稳性与策略克制
  3. 核心算法:MADDPG (Multi-Agent DDPG)
    • CTDE 的完美落地
    • “我知道你知道我知道”:全知全能的 Critic
    • 算法推导与 Loss 设计
  4. 进阶技巧:种群训练 (Population-Based Training, PBT)
    • 为什么梯度下降不够用了?
    • 从“炼丹”到“进化论”
    • OpenAI Five 的成功秘诀
  5. 实战考量:Reward Shaping
    • 个人英雄主义 vs 团队精神
  6. 总结

1. 什么是混合型 MARL?

1.1 定义:一般和博弈 (General-Sum Game)

在混合型环境中,智能体之间的关系既不是完全一致( R 1 = R 2 R^1=R^2 R1=R2),也不是完全对立( R 1 = − R 2 R^1=-R^2 R1=R2)。
任意智能体 i i i j j j 的奖励 R i , R j R^i, R^j Ri,Rj 之间没有固定的数学约束。

1.2 典型场景:团队零和 (Team Zero-Sum)

这是混合型 MARL 中研究最多的子集。
假设有两支队伍:红队 N A \mathcal{N}_A NA 和 蓝队 N B \mathcal{N}_B NB

  • 队内合作 ∀ i , j ∈ N A , R i = R j = R A \forall i, j \in \mathcal{N}_A, R^i = R^j = R_A i,jNA,Ri=Rj=RA
  • 队间竞争 R A = − R B R_A = -R_B RA=RB

例子

  • 机器人足球 (RoboCup):你要传球给队友(合作),同时晃过对方后卫(竞争)。
  • 无人机群战:红蓝双方无人机集群对抗。

2. 双重困境:内忧外患

混合型 MARL 之所以难,是因为它同时继承了前两类问题的难点,并且还发生了“化学反应”。

2.1 内忧:信誉分配 (Credit Assignment)

在团队内部,我们依然面临 Lazy Agent 问题。如果赢了比赛,是每个人都打得好,还是 4 个大神带 1 个坑货?如果 Reward 仅仅是“赢/输”,梯度信号会非常稀疏且充满噪声。

2.2 外患:非平稳性 (Non-Stationarity)

对于红队的一个 Agent 来说,环境变得极度不可预测:

  • 队友在变(他在学习配合我)。
  • 对手在变(他在学习针对我)。

这种动态耦合导致环境的状态转移概率 P ( s ′ ∣ s , a i ) P(s'|s, a^i) P(ss,ai) 剧烈抖动。如果只用普通的 DQN/PPO,Agent 甚至无法判断 Reward 变低是因为自己变菜了,还是因为对手变强了。


3. 核心算法:MADDPG

2017 年,OpenAI 发表了 MADDPG (Multi-Agent Deep Deterministic Policy Gradient),这是解决混合型 MARL 的里程碑式算法。它将 CTDE (中心化训练,去中心化执行) 框架发挥到了极致。

3.1 核心思想

  • 执行 (Actor):每个 Agent i i i 有自己的策略网络 μ i ( o i ) \mu_i(o_i) μi(oi)只看局部观测
  • 训练 (Critic):每个 Agent i i i 还有一个价值网络 Q i ( x , a 1 , … , a N ) Q_i(\mathbf{x}, a_1, \dots, a_N) Qi(x,a1,,aN)。注意,这个 Critic 能看到所有人的观测 x \mathbf{x} x 和所有人的动作 a \mathbf{a} a(包括队友和对手)。

为什么这么做有效?
通过把“对手的动作” a o p p o n e n t a_{opponent} aopponent 作为输入喂给 Critic,环境对于 Critic 来说就变成了平稳的(Stationary)。
P ( s ′ ∣ s , a m e , a o p p o n e n t ) P(s' | s, a_{me}, a_{opponent}) P(ss,ame,aopponent)
因为 a o p p o n e n t a_{opponent} aopponent 已经是已知条件,状态转移不再像黑盒一样随机变化。

3.2 梯度公式

对于 Agent i i i,其 Actor 的更新梯度为:

∇ θ i J ≈ 1 K ∑ k ∇ θ i μ i ( o i ( k ) ) ⋅ ∇ a i Q i μ ( x ( k ) , a 1 ( k ) , … , a i , … , a N ( k ) ) ∣ a i = μ i ( o i ( k ) ) \nabla_{\theta_i} J \approx \frac{1}{K} \sum_k \nabla_{\theta_i} \mu_i(o_i^{(k)}) \cdot \nabla_{a_i} Q_i^{\mu}(\mathbf{x}^{(k)}, a_1^{(k)}, \dots, a_i, \dots, a_N^{(k)})|_{a_i=\mu_i(o_i^{(k)})} θiJK1kθiμi(oi(k))aiQiμ(x(k),a1(k),,ai,,aN(k))ai=μi(oi(k))

解读

  1. Critic 告诉 Actor:“在当前大家都在乱战的情况下( x , a − i \mathbf{x}, \mathbf{a}^{-i} x,ai),你的动作 a i a_i ai 往哪个方向改,我的 Q 值能变大?”
  2. 即使对手是竞争关系,Critic 也能学会预测对手的威胁,从而指导 Actor 做出规避或反击动作。

3.3 代码逻辑 (PyTorch 伪代码)

# 混合型环境:Critic 输入必须包含所有人的信息
class CentralizedCritic(nn.Module):
    def __init__(self, n_agents, obs_dim, act_dim):
        super().__init__()
        # 输入维度 = (单个观测 + 单个动作) * 智能体数量
        total_input = (obs_dim + act_dim) * n_agents
        self.net = nn.Sequential(
            nn.Linear(total_input, 64),
            nn.ReLU(),
            nn.Linear(64, 1)
        )

    def forward(self, all_obs, all_acts):
        # all_obs: [batch, n_agents * obs_dim]
        # all_acts: [batch, n_agents * act_dim]
        x = torch.cat([all_obs, all_acts], dim=1)
        return self.net(x)

注:训练时,我们需要拿到对手的策略来计算 Target Q 值。如果对手策略未知,通常需要训练一个额外的网络来拟合对手策略。


4. 进阶技巧:种群训练 (Population-Based Training, PBT)

在混合型博弈中,仅靠 MADDPG 这种基于梯度的优化往往不够。

  • 问题:梯度下降容易陷入局部最优。Agent 可能学会了一套“欺负新手”的策略,但一旦遇到从未见过的高手策略,瞬间崩溃(不够 Robust)。
  • 解决:结合进化算法。

4.1 核心逻辑

像 OpenAI Five (Dota 2) 或 AlphaStar (StarCraft II) 这种神级 AI,其背后不仅仅是 RL,还有一个巨大的进化系统

  1. 种群初始化:同时训练 100 个不同的 Agent 队伍。
  2. 锦标赛 (League):让这 100 个队伍互相打(或者打历史版本)。
  3. 优胜劣汰:每隔一段时间,把胜率最低的 20% 队伍杀掉。
  4. 进化 (Mutation):复制胜率最高的 20% 队伍,并随机修改它们的超参数(学习率、Reward 权重等),填补空缺。

这被称为 Auto-Curriculum (自动课程学习)。Agent 的对手永远是最适合它当前水平的“磨刀石”。


5. 实战考量:Reward Shaping

在混合型任务中,如何定义 Reward 是成败关键。

5.1 个人 vs 团队

假设是一个 MOBA 游戏:
R t o t a l = w 1 ⋅ R k i l l + w 2 ⋅ R a s s i s t + w 3 ⋅ R w i n R_{total} = w_1 \cdot R_{kill} + w_2 \cdot R_{assist} + w_3 \cdot R_{win} Rtotal=w1Rkill+w2Rassist+w3Rwin

  • 如果 w 1 w_1 w1 太大:Agent 变成“人头狗”,抢队友资源,最终输掉比赛。
  • 如果 w 3 w_3 w3 太大:早期梯度太稀疏,Agent 学不会基本操作。

OpenAI Five 的做法
引入一个动态系数 ϕ \phi ϕ (Team Spirit)。
R i = ( 1 − ϕ ) ⋅ R i n d i v i d u a l + ϕ ⋅ R ˉ t e a m R_i = (1 - \phi) \cdot R_{individual} + \phi \cdot \bar{R}_{team} Ri=(1ϕ)Rindividual+ϕRˉteam

  • 训练初期, ϕ \phi ϕ 较低,鼓励 Agent 先学会怎么补刀、怎么走位(个人技能)。
  • 训练后期, ϕ → 1 \phi \to 1 ϕ1,强迫 Agent 关注比赛胜负,牺牲小我。

6. 总结

混合型 MARL 是通向通用人工智能(AGI)的必经之路,因为它模拟了人类社会的复杂性。

  • 模型:一般和博弈 / 团队零和博弈。
  • 基石算法MADDPG。通过中心化 Critic 解决非平稳性,允许 Actor 仅利用局部信息执行。
  • 训练架构CTDE + Self-Play + PBT。没有 PBT 的混合型 MARL 很难在复杂游戏中达到职业人类水平。
  • 哲学:在混合环境中,“适应”比“优化”更重要

炼丹师建议
如果你的项目是多对多的对抗(如无人机混战),不要犹豫,起手 MAPPO (MADDPG 的 On-Policy 升级版) + Shared Critic,如果算力允许,一定要加上 League Training 机制。


至此,MARL 的三大板块(合作、竞争、混合)已全部解析完毕。希望这一系列博文能助你在多智能体的世界里乘风破浪!🚀

复现“Multi - Agent Actor - Critic for Mixed Cooperative - Competitive Environments”相关研究内容可按以下步骤进行: ### 理解研究背景与问题 Multi - Agent Actor - Critic适用于混合合作 - 竞争环境,其应用场景包括多机器人控制、通信和语言发现、多人游戏、社会困境分析以及分层强化学习等。在多智能体场景下,传统算法存在诸多困难,如Q学习受环境非平稳性挑战,Policy Gradient受主体数量增长带来的方差影响。随着智能体数量增加,估计的策略梯度与正确的策略梯度偏差增大,智能体越多熵越大,越难收敛 [^2][^3][^4]。 ### 掌握核心方法 该研究基于actor - critic方法进行扩展,critic增加有关其他智能体策略的额外信息,actor只能访问本地信息。训练完成后,执行阶段仅使用local actor以分散方式行动。同时,引入了通过使用每个智能体的策略集合进行训练的方法,以提高多智能体策略的稳定性 [^1][^3]。 ### 代码实现 可使用Python和深度学习框架(如TensorFlow或PyTorch)来实现算法。以下是一个简单的示例框架: ```python import torch import torch.nn as nn import torch.optim as optim # 定义Actor网络 class Actor(nn.Module): def __init__(self, input_dim, output_dim): super(Actor, self).__init__() self.fc1 = nn.Linear(input_dim, 128) self.fc2 = nn.Linear(128, output_dim) def forward(self, x): x = torch.relu(self.fc1(x)) x = torch.tanh(self.fc2(x)) return x # 定义Critic网络 class Critic(nn.Module): def __init__(self, input_dim): super(Critic, self).__init__() self.fc1 = nn.Linear(input_dim, 128) self.fc2 = nn.Linear(128, 1) def forward(self, x): x = torch.relu(self.fc1(x)) x = self.fc2(x) return x # 初始化智能体 num_agents = 2 input_dim_actor = 10 input_dim_critic = input_dim_actor * num_agents output_dim = 2 actors = [Actor(input_dim_actor, output_dim) for _ in range(num_agents)] critics = [Critic(input_dim_critic) for _ in range(num_agents)] actor_optimizers = [optim.Adam(actor.parameters(), lr=0.001) for actor in actors] critic_optimizers = [optim.Adam(critic.parameters(), lr=0.001) for critic in critics] # 训练循环示例 for episode in range(1000): # 与环境交互,获取状态等信息 states = [torch.randn(input_dim_actor) for _ in range(num_agents)] actions = [actor(state) for actor, state in zip(actors, states)] # 这里省略环境交互和奖励获取的详细代码 rewards = [torch.randn(1) for _ in range(num_agents)] # 更新Critic for i in range(num_agents): critic_optimizers[i].zero_grad() # 构建Critic输入,这里简单拼接所有状态和动作 critic_input = torch.cat(states + actions) q_value = critics[i](critic_input) # 计算Critic损失,这里省略目标Q值的计算 critic_loss = torch.mean((q_value - rewards[i])**2) critic_loss.backward() critic_optimizers[i].step() # 更新Actor for i in range(num_agents): actor_optimizers[i].zero_grad() action = actors[i](states[i]) # 这里省略Actor损失的计算,需要使用Critic的输出 actor_loss = -critics[i](torch.cat(states + [action] + actions[:i] + actions[i+1:])) actor_loss.backward() actor_optimizers[i].step() ``` ### 实验与评估 在合作竞争场景中进行实验,对比该方法与现有方法的性能。使用针对每个智能体的策略集合进行训练,以验证是否能得到更强大的多智能体策略,观察智能体群体是否能发现各种物理和信息协调策略 [^1][^2]。 ### 结果分析 分析实验结果,查看该方法在不同场景下相对于现有方法的优势,如策略收敛情况、智能体之间的协调效果等。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值