【MARL】深入理解多智能体近端策略优化(MAPPO)算法与调参
📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在👉强化学习专栏:
【强化学习】(47)---《深入理解多智能体近端策略优化(MAPPO)算法与调参》
深入理解多智能体近端策略优化(MAPPO)算法与调参
目录
[Python] On-Policy 和 Off-Policy 实现
0 前言
MAPPO 是一种多智能体强化学习算法,基于单智能体的 PPO (Proximal Policy Optimization) 算法进行了扩展,专门设计用于解决多智能体协作和竞争环境中的决策问题。
如果对于MAPPO算法不了解,可以查看这篇文章(代码):
1 MAPPO核心特点
-
集中价值网络(Centralized Critic)
- MAPPO 使用一个 centralized critic,将多个智能体的状态、动作信息整合在一起,用于计算价值函数。
- 政策(policy)仍然是每个智能体独立的(decentralized),适合分布式执行。
-
分布式执行与集中式学习
- 在训练时,所有智能体共享全局信息,进行集中式学习。
- 在执行时,每个智能体仅依赖自己的局部观察,保持分布式决策的能力。
-
对 PPO 的优化
- PPO 的核心是通过 clip range 限制策略更新的幅度,确保训练稳定。MAPPO 在多智能体环境中保留了这一优点。
- 针对多智能体场景,对网络结构、数据处理等进行了调整,优化了 PPO 在该场景下的性能。
2 On-Policy 和 Off-Policy
要想更好的理解MAPPO算法的原理机制,得先从On-Policy 和 Off-Policy 两种算法类型出发。在强化学习中,on-policy 和 off-policy 算法根据策略更新时是否依赖当前策略的经验来区分。
以下是两类算法的定义和常见算法列表:
2.1. On-Policy 算法
定义:
- On-policy 算法依赖于当前策略生成的经验进行更新。
- 每次策略更新需要使用最新的采样数据,不能直接利用历史经验。
- 强调策略与数据分布的一致性。
常见的 On-Policy 算法
-
Policy Gradient (PG)
- 基本策略梯度方法。
-
Trust Region Policy Optimization (TRPO)
- 提高策略更新的稳定性,限制更新幅度。
-
Proximal Policy Optimization (PPO)
- TRPO 的改进版本,具有更简单的实现。
- 两种变体:clip-PPO 和 adaptive KL-PPO。
-
Actor-Critic 系列
- A2C (Advantage Actor-Critic):同步更新的 Actor-Critic。
- A3C (Asynchronous Advantage Actor-Critic):异步更新版本。
-
MAPPO (Multi-Agent PPO)
- 专为多智能体场景设计的 PPO 变种。
优点
- 理论收敛性强。
- 更新稳定,适合复杂策略。
缺点
- 样本利用率低(每条数据通常只用一次)。
- 对环境交互的需求较高。
2.2 Off-Policy 算法
定义:
- Off-policy 算法利用历史经验进行策略更新,数据采样可以来自不同策略。
- 借助经验回放(replay buffer)提高样本利用率。
常见的 Off-Policy 算法
-
Q-Learning 系列
- DQN (Deep Q-Network):结合神经网络的 Q-learning。
- Double DQN:解决 DQN 过估计问题。
- Dueling DQN:分离状态价值和动作优势。
-
Deterministic Policy Gradient (DPG)
- 专为连续动作空间设计。
-
Deep Deterministic Policy Gradient (DDPG)
- DPG 的深度强化学习版本,结合 replay buffer 和目标网络。
-
Twin Delayed Deep Deterministic Policy Gradient (TD3)
- DDPG 的改进版,缓解过估计问题。
-
Soft Actor-Critic (SAC)
- 基于最大熵的策略,适用于连续动作空间。
-
Q-Learning with Function Approximation
- Fitted Q、Neural Fitted Q 等。
优点
- 样本利用率高(数据可多次利用)。
- 更适合数据采样成本高的任务(如真实机器人交互)。
缺点
- 更新的稳定性较差(需要经验回放和目标网络)。
- 训练复杂度较高。
对比总结
特性 | On-Policy | Off-Policy |
---|---|---|
样本利用率 | 低(一次性使用) | 高(可重复利用) |
缓冲区 | 无长期缓冲区 | 使用 replay buffer |
策略一致性 | 必须与当前策略一致 | 可利用任意策略生成的数据 |
学习效率 | 依赖高频环境交互 | 适合数据采样成本高的场景 |
收敛性 | 理论收敛性强 | 收敛性依赖数据分布 |
应用场景 | 实时决策、多智能体 | 复杂连续动作、高成本环境 |
形象比喻
on-policy有点像个调皮的小孩子,被打了/奖励了,当场就长记性的那种。而off-policy这种小孩子,被打了/奖励了,它还得回味下,这是一次偶然的惩罚还是这样做就是不好的,他还会去调皮的捣蛋,直到被打怕了(学习到了)。
On-Policy 的小孩
- “被打了/奖励了,当场就长记性”
贴合 on-policy 的特点:- on-policy 是即时性学习,完全依赖于当前策略的反馈进行调整。
- 它专注于当前的策略表现,而不会回头复盘过去的错误或奖励。
- 优点:即时调整,学习过程直接且明确。
- 缺点:缺乏对历史的反思和利用,样本效率低。
Off-Policy 的小孩
-
“回味一下,这是一场偶然的惩罚还是这样做就是不好的”
- 描述了 off-policy 的核心机制:利用经验回放。off-policy 会保存大量的历史经验,在反复回顾和分析中找到优化策略的方法。
- 这种行为类似一个喜欢“钻牛角尖”的小孩,经过无数次试验才明白真正的规律。
-
“调皮地捣蛋,直到被打怕了”
- off-policy 算法在学习时确实会反复尝试甚至冒险探索(如 DQN 的 ϵϵ-greedy 策略),不断调整对环境的理解。
- 它的学习过程可能显得缓慢,但通过深入分析历史数据,它最终会学得更全面和稳定。
它们的关键区别:
- 即时性 vs 历史性:on-policy 专注于当前,而 off-policy 反思过去。
- 效率 vs 深度:on-policy 快速适应环境,而 off-policy 更深刻地理解长期规律。
3 MAPPO 是 On-Policy,如何学习历史经验?
有了上面的基础,MAPPO 是 on-policy。它的缓冲区(buffer)在每次新的 episode 开始时会被清空,而不像 off-policy 算法那样长期保留数据。这主要体现在以下几点:
为什么会清空缓冲区?
On-Policy 的约束
On-policy 算法(如 PPO 和 MAPPO)的策略更新只能依赖最新策略采样的数据,历史数据与当前策略分布不一致,因此被舍弃。这确保了策略更新的稳定性。
如何应对这个问题?
尽管无法直接使用历史经验,仍然可以通过以下方法弥补:
-
加大采样量(buffer size)
增加单次采样的episode_length
或batch_size
,让模型在每次采样时接触更多样本。 -
使用 advantage 标准化
通过标准化 GAE 或 Q 值来减小不同 episode 数据间的方差,从而稳定更新。 -
调整训练步数
MAPPO 的一个优势是,它通常以 centralized critic 方式加速策略学习。通过适当增加训练步数,可以弥补无法利用历史经验的缺陷。 -
环境重置机制
对于训练环境,确保多样性,例如引入 domain randomization 或多种初始化状态,间接增加训练数据的广度。
4 MAPPO 算法的调参建议
MAPPO 的核心参数调节分为以下几类:
超参数相关
-
学习率(learning rate)
适当调低学习率可以提高稳定性,尤其在多智能体环境中噪声较大的情况下。通常建议从 1e−4或 5e−4开始测试。 -
折扣因子(gamma)
γγ 控制长期回报的权重,推荐从 0.95 或 0.99开始,根据任务的时间跨度调整。 -
GAE λ(lambda for Generalized Advantage Estimation)
通常设置为 0.95 左右,平衡偏差与方差的影响。 -
clip range(裁剪范围)
PPO 的核心超参数,通常设置为 0.1 到 0.3 之间,越小代表对策略更新的限制越强。
网络结构相关
-
隐藏层大小(hidden size)
可以调试网络的层数和每层的单元数。典型设置为两层,每层 64 到 256 个单元,视环境复杂度而定。 -
共享网络与独立网络
MAPPO 支持共享网络(centralized critic)或独立网络(decentralized critic)。如果任务需要高效协作,建议使用共享网络。
环境相关
-
batch size
批量大小对训练效率有很大影响,推荐设置为每次采样 2048 到 4096 个 time steps,或者按环境规模调整。 -
episode length
对于 MAPPO,episode_length
确实非常关键,因为它决定了每次采样的数据量。可以根据环境复杂度和任务长度动态调整,通常从 200 到 1000 步之间。
更新频率
- policy update iterations
每次采样后,建议进行 4 到 10 次梯度更新(epochs),以保证策略能够充分利用每批数据。
[Python] On-Policy 和 Off-Policy 实现
以 Proximal Policy Optimization (PPO) 为例:
🔥若是下面代码复现困难或者有问题,欢迎评论区留言;需要以整个项目形式的代码,请在评论区留下您的邮箱📌,以便于及时分享给您(私信难以及时回复)。
"""《on-Policy》
时间:2024.11
作者:不去幼儿园
"""
Initialize policy network πθ with parameters θ
Initialize value network Vϕ with parameters ϕ
for iteration = 1, 2, ..., N do
# Collect trajectories (states, actions, rewards) using current policy πθ
trajectories = []
for episode = 1, ..., M do
state = environment.reset()
episode_trajectory = []
for t = 1, ..., T do
action = πθ(state) # Sample action from current policy
next_state, reward, done = environment.step(action)
episode_trajectory.append((state, action, reward))
if done:
break
state = next_state
trajectories.append(episode_trajectory)
# Compute advantages using GAE or Monte Carlo returns
advantages, returns = compute_advantages(trajectories, Vϕ)
# Update policy πθ using clipped surrogate objective
for _ in range(policy_update_epochs):
policy_loss = compute_policy_loss(πθ, advantages)
θ = θ - α_policy * ∇(policy_loss)
# Update value network Vϕ
for _ in range(value_update_epochs):
value_loss = compute_value_loss(Vϕ, returns)
ϕ = ϕ - α_value * ∇(value_loss)
以 Deep Q-Learning (DQN) 为例:
"""《off-Policy》
时间:2024.11
作者:不去幼儿园
"""
Initialize Q-network Qθ with parameters θ
Initialize target network Qθ' with parameters θ' = θ
Initialize replay buffer D
for iteration = 1, 2, ..., N do
state = environment.reset()
for t = 1, ..., T do
# ε-greedy policy for exploration
if random() < ε:
action = random_action()
else:
action = argmax(Qθ(state))
next_state, reward, done = environment.step(action)
# Store transition in replay buffer
D.append((state, action, reward, next_state, done))
# Sample minibatch from replay buffer
minibatch = random_sample(D, batch_size)
# Compute target values
target_values = []
for (s, a, r, s_, done) in minibatch:
if done:
target = r
else:
target = r + γ * max(Qθ'(s'))
target_values.append(target)
# Update Q-network Qθ
loss = compute_loss(Qθ, minibatch, target_values)
θ = θ - α * ∇(loss)
# Update state
if done:
break
state = next_state
# Periodically update target network
if iteration % target_update_freq == 0:
θ' = θ
[Notice] 注意事项
on-policy 关键点:
- 数据从环境实时采样,不存储历史数据。
- 更新策略和价值网络时仅使用当前采样的数据。
- 每次策略更新后,之前的数据会被丢弃。
off-policy 关键点:
- 使用 replay buffer 保存历史数据,重复利用经验。
- 策略与目标网络更新分离,数据可以来自不同的策略。
- 数据利用率高,但需要经验回放和目标网络来稳定训练。
由于博文主要为了介绍相关算法的原理和应用的方法,缺乏对于实际效果的关注,算法可能在上述环境中的效果不佳或者无法运行,一是算法不适配上述环境,二是算法未调参和优化,三是没有呈现完整的代码,四是等等。上述代码用于了解和学习算法足够了,但若是想直接将上面代码应用于实际项目中,还需要进行修改。
5 总结
MAPPO 是一个高效、稳定且适应性强的多智能体强化学习算法,通过结合 PPO 的稳定性和多智能体环境的需求,为协作与竞争场景提供了强有力的解决方案。
博客都是给自己看的笔记,如有误导深表抱歉。文章若有不当和不正确之处,还望理解与指出。由于部分文字、图片等来源于互联网,无法核实真实出处,如涉及相关争议,请联系博主删除。如有错误、疑问和侵权,欢迎评论留言联系作者,或者添加VX:Rainbook_2,联系作者。✨
原文地址:https://blog.csdn.net/qq_51399582/article/details/143919962
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!