多智能体强化学习(Multi-Agent Reinforcement Learning, MARL)和单智能体最大的不同在于:环境里同时存在多个会学习、会改变策略的实体。当每个Agent都把自己的决策网络独立更新时,从任意一个Agent的视角看,环境转移概率不再固定,这直接破坏了Q-learning依赖的马尔可夫性质。独立Q-learning正是在这种设定下把所有其他Agent视为环境动态的一部分,用单智能体算法扩展实现。它虽然不是完整的MARL解法,却常被当作第一个基线。而MADDPG则从演员-评论家框架出发,重新设计了评论家的输入,让策略更新在一个更稳定的全局信号下进行。

非平稳性如何让独立Q-learning失效
独立Q-learning(Independent Q-Learning, IQL)的核心做法非常直观:给每个Agent分配一个独立的Q网络或Q表,训练时不共享参数,也不使用其他Agent的策略信息。比如在一个两个Agent互相追逐的环境中,Agent A的状态空间包含自己的位置和速度,也可能包含Agent B的位置;动作空间是离散的四个方向。Agent A按照单智能体Q-learning的规则更新:在看到状态s、执行动作a、得到奖励r、进入状态s一撇后,用贝尔曼最优方程计算目标值。公式中的最大Q值来自Agent A自己的Q表。
问题在于,Agent A更新Q表的同时,Agent B也在更新自己的策略。Agent A下一次进入相似状态时,Agent B可能已经选择了完全不同的动作,这导致相同的状态-动作对会产生不同的奖励和下一个状态分布。换句话说,环境转移概率随着其他Agent的策略变化而变化。Q-learning假设环境是平稳的,Q表才能逐步逼近最优值。非平稳性会让Q目标像移动靶一样不断漂移,Agent A可能永远无法收敛到一个稳定策略,甚至出现循环追逐、震荡动作。
另一个被忽视的影响是经验回放失效。单智能体DQN中,回放缓冲区里的旧样本仍然来自同一个环境动态,因此可以反复采样。IQL如果使用经验回放,旧样本中其他Agent的行为可能已经过时,不再是当前策略下的真实转移。这会导致策略更新被陈旧数据干扰。实践中,有些实现干脆关闭经验回放,或者只使用非常近期的样本,但这又降低了样本效率。因此IQL虽然实现简单,但通常只适合小规模、低耦合的环境,比如多个互不干扰的机器人导航,或者作为快速验证问题的基线。
# 独立Q-learning伪代码:每个Agent维护自己的Q表
# 状态s为离散索引,动作a为离散方向
alpha = 0.1
gamma = 0.95
q_table = {} # key: (state, action)
def update_iql(agent, state, action, reward, next_state, done):
old_value = agent.q_table.get((state, action), 0.0)
if done:
target = reward
else:
next_values = [agent.q_table.get((next_state, a), 0.0)
for a in range(agent.action_dim)]
target = reward + gamma * max(next_values)
agent.q_table[(state, action)] = old_value + alpha * (target - old_value)
上面的代码展示了IQL更新规则,和普通Q-learning没有区别。关键差异不在代码本身,而在训练过程中每个Agent都同时更新。当多个Agent用这份代码并行训练时,环境从个体视角看就是非平稳的。为了稍微缓解这个问题,可以让所有Agent使用统一的学习率衰减和探索率衰减,避免某个Agent过早收敛后其他Agent还在剧烈改变策略。也可以延迟更新频率,让一部分Agent保持固定,其他Agent学习一段时间后交换角色,但这些都是工程层面的折中,并不能从根本上消除非平稳性。
MADDPG如何用中心化评论者稳定策略梯度
MADDPG(Multi-Agent Deep Deterministic Policy Gradient)把DDPG扩展到多智能体场景。DDPG本身是一种适用于连续动作空间的确定性策略梯度算法,包含Actor网络和Critic网络。Actor根据状态输出确定性动作,Critic估计状态-动作对的Q值。在单智能体中,Critic只接收单个Agent的状态和动作。到了多智能体环境,如果仍然让每个Agent的Critic只接收自己的信息,就会退化回独立学习,非平稳性照样存在。
MADDPG的关键设计是中心化训练、去中心化执行。训练阶段,每个Agent的Critic可以访问所有Agent的观测和动作。例如Agent i的Critic输入为所有智能体的状态拼接向量以及所有智能体的动作拼接向量,输出Q值。这样Critic能够感知全局动态,即使其他Agent策略变化,也能通过学习全局状态-动作到Q值的映射来逼近当前联合策略下的价值。执行阶段,每个Agent只用本地观测通过自己的Actor输出动作,不依赖全局信息,这保证了部署时不需要中心通信。
策略梯度更新时,Agent i的Actor按照确定性策略梯度公式调整参数,目标是最大化自身Critic给出的Q值。由于Critic输入包含其他Agent的动作,而这些动作由其他Agent的Actor产生,因此更新Agent i的Actor时需要固定其他Agent的Actor参数,通过链式法则让梯度从Critic传到自己的Actor。下面是一段简化的更新代码,展示Critic和Actor的训练结构。
# MADDPG简化更新:以两个Agent为例
# 假设所有观测和动作都是一维向量,方便拼接
import torch
import torch.nn as nn
class MADDPGAgent(nn.Module):
def __init__(self, obs_dim, act_dim):
super().__init__()
self.actor = nn.Sequential(
nn.Linear(obs_dim, 64),
nn.ReLU(),
nn.Linear(64, act_dim),
nn.Tanh()
)
self.critic = nn.Sequential(
nn.Linear(obs_dim * 2 + act_dim * 2, 64),
nn.ReLU(),
nn.Linear(64, 1)
)
def forward(self, joint_obs, joint_act):
# 训练时Critic使用所有Agent的观测和动作
return self.critic(torch.cat([joint_obs, joint_act], dim=-1))
# 更新Agent i的Critic:输入为全局状态和全局动作
# target_q = reward + gamma * critic_target(next_joint_obs, next_joint_act)
# critic_loss = (target_q - critic(current_joint_obs, current_joint_act)).pow(2).mean()
# 更新Agent i的Actor:
# actor_loss = -critic(current_joint_obs,
# torch.cat([actor_i(obs_i), actor_j(obs_j)], dim=-1)).mean()
# 实际实现时需要让其他Agent的Actor使用target网络或固定参数
MADDPG的命名有时会让人误解为必须使用深度网络,实际上核心是策略梯度框架。它既能处理连续动作,也能在离散动作上通过Gumbel-Softmax等技巧实现,但最自然的是连续控制任务。相比IQL,MADDPG的样本效率和稳定性通常更好,代价是训练时通信成本更高,因为Critic需要全局信息。如果环境中Agent数量很多,Critic输入维度会随Agent数量线性或平方增长,需要更大的网络和更多训练步数。
经验回放、目标网络与调参差异
经验回放在这两种算法中的使用方式差异明显。IQL通常每个Agent独立维护回放缓冲区,样本格式为(自己的观测、动作、奖励、下一观测、终止标志)。由于非平稳性,长期保留样本可能对训练有害,所以IQL往往使用小容量缓冲区或增加旧样本丢弃概率。MADDPG则为所有Agent维护一个共享回放缓冲区,或让每个Agent的缓冲区中样本额外记录所有Agent的观测和动作。这样Critic训练时可以采样完整的全局转移,避免从不同来源拼凑数据造成的失配。
目标网络方面,MADDPG继承DDPG的软更新策略,使用目标Actor和目标Critic计算TD目标,参数按比例缓慢向在线网络移动。目标网络可以缓解自举带来的过估计和训练震荡。IQL如果采用深度Q网络也可以使用目标网络,但目标网络并不能解决非平稳性本身,只是让单智能体Q学习的TD目标更稳定。MADDPG还常配合目标策略平滑正则化,在目标Actor输出动作上加入少量噪声并裁剪,让Critic在动作附近更平滑,避免过度拟合尖锐的Q值峰值。
动作噪声和探索策略也需要区分。DDPG类算法通常在训练时给Actor输出添加OU噪声或高斯噪声,鼓励探索连续动作空间。多个Agent同时添加噪声会让环境变得更加随机,但MADDPG的Critic可以学习这种联合噪声下的价值。IQL如果使用离散动作,一般用epsilon-greedy策略;如果使用连续动作,则面临和单智能体DDPG类似的探索挑战。多个Agent的探索互相叠加后,环境噪声会成倍增加,训练初期可能出现大量失败样本。
下表从几个关键维度对比独立Q-learning和MADDPG:
| 对比项 | 独立Q-learning | MADDPG |
|---|---|---|
| 训练信息 | 仅本地观测和奖励 | 训练时全局观测和全局动作 |
| 非平稳性处理 | 直接忽略,容易震荡 | 通过中心化Critic建模联合动态 |
| 动作空间 | 离散为主,连续需扩展 | 连续动作更自然,离散需技巧 |
| 经验回放 | 旧样本可能有害 | 全局样本可长期复用 |
| 实现复杂度 | 低,适合快速基线 | 较高,需要全局拼接和目标网络 |
| 扩展性 | Agent数量可较多,但效果受限 | Critic输入维度随Agent数量增长,扩展性下降 |
选择算法时,先把问题建模成多智能体任务,再评估Agent之间是否存在强耦合。如果Agent之间几乎独立,或者只需要一个可对比的下界,独立Q-learning足够。如果环境要求多个Agent合作完成同一目标,或者存在竞争关系需要预测对手策略,MADDPG的中心化评论者能提供更可靠的全局价值信号。实际项目中也可以先跑IQL拿到基线分数,再切换到MADDPG观察是否有显著提升。
从代码实现看两种思路的边界
独立Q-learning的代码量通常在几十行内,不涉及多网络交互,也不需要在训练时交换其他Agent的信息。这让它成为验证环境奖励设计是否合理的快捷工具。如果奖励信号本身有缺陷,比如稀疏奖励导致所有Agent都学不到有效行为,IQL的表现会很快暴露出问题。此时不必急于调试MADDPG,先修正环境反馈、增加中间奖励或改变终止条件,能节省大量时间。
MADDPG的实现难点不在于网络结构,而在于训练循环中多个网络的参数同步和梯度流控制。每次更新某个Agent的Critic时,需要把所有Agent的观测和动作按固定顺序拼接,顺序必须与网络输入定义一致。更新Actor时,还需要构造联合动作向量:自己的动作来自当前Actor,其他Agent的动作可以来自经验回放中存储的历史动作,或者来自其他Agent当前Actor的输出。前者实现简单但可能有分布偏移,后者更符合策略梯度推导但计算量更大。
另一个容易出错的地方是终止状态处理。当任一Agent达到终止条件时,整个episode结束,还是每个Agent有独立的终止标志?如果是前者,所有Agent的目标网络都应该使用相同done信号;如果是后者,每个Agent需要单独掩码自己的TD目标。MADDPG中Critic关注联合状态,终止信号设计会影响Q值估计的准确性。建议在环境接口层明确返回联合终止标志,避免不同Agent的done不一致导致目标值计算错误。
从算法边界看,IQL牺牲了理论收敛保证换取了简单性,它在Agent数量少且交互不频繁时表现尚可。MADDPG通过引入全局Critic缓解非平稳性,但假设训练时可以获取全局信息,这在真实分布式系统中不一定成立。如果只能本地观测且通信受限,IQL这类去中心化方法是更现实的起点。反过来,如果中心训练平台可用,部署时只需本地Actor,MADDPG的集中训练分布执行模式非常适合机器人集群、交通信号控制等场景。
最终结论并不是哪个算法一定更好,而是需要根据环境耦合程度、通信条件、动作空间和工程预算来判断。先理解非平稳性的来源,再决定用哪种框架,比盲目切换到看似更高级的MADDPG更有效。很多时候,一个调好的IQL基线配合适当的训练技巧,已经能解决不少轻量级多智能体问题。

