从代码学习深度强化学习 - 多智能体强化学习 IPPO PyTorch版


前言

单智能体强化学习(Single-Agent Reinforcement Learning)假设环境是静态的,即状态转移概率和奖励函数是固定的。然而,当我们进入多智能体(Multi-Agent)的世界时,情况变得复杂起来。在多智能体系统中,多个智能体在共享环境中同时进行实时交互和学习,每个智能体的策略更新都会影响环境的动态,从而对其他智能体产生影响。

从每个独立智能体的视角来看,环境是非静态的(non-stationary)。即使在相同的状态下采取相同的动作,得到的下一个状态和奖励信号也可能因为其他智能体的行为而不断变化。这给模型的训练带来了巨大挑战,因为强化学习算法的收敛性通常依赖于环境的马尔可夫性质。

为了应对这些挑战,研究者提出了多种方法。最直接的思路是基于我们熟悉的单智能体算法进行扩展,主要分为两种范式:

  1. 完全中心化 (Fully Centralized):将所有智能体视为一个“超级智能体”,聚合所有智能体的状态和动作用于决策。这种方法可以保证环境的稳定性,但随着智能体数量的增加,会面临维度爆炸的问题,导致训练复杂度急剧上升。
  2. 完全去中心化 (Fully Decentralized):每个智能体独立地在环境中学习,不考虑其他智能体的存在。这种方法的扩展性很好,但由于忽略了环境的非静态问题,算法的收敛性无法得到保证。

本文将介绍一种介于两者之间且更偏向于去中心化思想的算法——独立近端策略优化 (Independent Proximal Policy Optimization, IPPO)。IPPO 是一种简单而有效的多智能体强化学习算法,它为每个智能体配备独立的 Actor 和 Critic 网络,并使用 PPO 算法进行独立训练。

在本文中,我们将通过一个具体的 PyTorch 代码实例,深入探讨 IPPO 的实现细节。我们将使用 ma-gym 库中的 Combat 环境,这是一个多智能体战斗场景,非常适合用来演示 IPPO 的训练过程。

完整代码:下载链接


IPPO 算法原理

IPPO 算法属于完全去中心化的方法,它让每个智能体都基于自身的观测独立进行学习。其核心思想是,系统中的 N 个智能体分别拥有自己的策略和价值函数,并在训练过程中独立优化。

算法流程如下

  • 对于系统中的 N 个智能体,为每个智能体初始化各自的策略以及价值函数。
  • 开始训练循环(for k = 0, 1, 2…):
    • 所有智能体在环境中交互,分别获得各自的一条轨迹数据。
    • 对每个智能体,基于当前价值函数用 GAE (Generalized Advantage Estimation) 计算优势函数的估计。
    • 对每个智能体,通过最大化 PPO-截断的目标来更新其策略。
    • 对每个智能体,通过均方误差损失函数优化其价值函数。
  • 结束循环。

在我们的代码实践中,为了提高数据利用率和训练稳定性,我们还会引入一个关键技巧:参数共享 (Parameter Sharing)。即所有智能体共享同一套策略和价值网络参数。这种做法的前提是所有智能体都是同质的(Homogeneous),意味着它们拥有相同的状态和动作空间以及优化目标。

接下来,让我们深入代码,看看 IPPO 是如何实现的。


代码实践

1. 环境与依赖库导入

首先,我们需要导入必要的库,并设置 ma-gym 环境。ma-gym 是一个基于 OpenAI Gym 的多智能体环境库。我们选择其中的 Combat 环境,这是一个在二维格子世界里进行的对战模拟游戏。

Combat 环境简介

  • 世界:一个二维网格世界。
  • 队伍:两个队伍进行对抗。
  • 动作:每个智能体的动作集包括向四周移动一格、攻击周围 3x3 范围内的其他敌对智能体,或者不采取任何行动。
  • 生命值:初始时,每个智能体有 3 点生命值。如果智能体在敌人的攻击范围内被攻击到,则会扣掉 1 点生命值,生命值掉为 0 则死亡。
  • 胜利条件:存活的队伍获胜。
  • 冷却机制:每个智能体的攻击有一轮的冷却时间。
import torch  # PyTorch深度学习框架
import torch.nn as nn  # 神经网络模块
import torch.optim as optim  # 优化器模块
import torch.nn.functional as F  # 神经网络函数模块,包含激活函数、损失函数等
import numpy as np  # 数值计算库
from tqdm import tqdm  # 进度条库,用于显示训练进度
import matplotlib.pyplot as plt  # 绘图库
import random  # 随机数生成库
import collections  # 集合数据类型库,用于deque等
import sys  # 系统相关功能库
import os  # 操作系统接口库
import pickle  # 序列化库,用于保存和加载模型
from collections import deque, namedtuple  # 双端队列和命名元组
import warnings  # 警告处理库
warnings.filterwarnings('ignore')  # 忽略警告信息

# 添加ma-gym环境路径到系统路径
sys.path.append("./ma-gym")

# 导入Combat多智能体战斗环境
from ma_gym.envs.combat.combat import Combat

# 设置随机种子以确保实验的可重复性
def set_seed(seed=42):
    """
    设置所有随机数生成器的种子
    参数:
        seed (int): 随机种子值,默认为42
    """
    torch.manual_seed(seed)  # 设置PyTorch CPU随机种子
    torch.cuda.manual_seed_all(seed)  # 设置PyTorch GPU随机种子
    np.random.seed(seed)  # 设置NumPy随机种子
    random.seed(seed)  # 设置Python内置random模块种子

2. 工具函数:计算优势函数 (GAE)

在 PPO 算法中,我们需要估计优势函数 A ( s , a ) A(s, a) A(s,a),它表示在状态 s s s 下采取动作 a a a 相对于平均水平的好坏程度。我们使用泛化优势估计 (GAE) 来计算,它通过参数 l a m b d a \\lambda lambda 在偏差和方差之间进行权衡。

A ^ t G A E ( γ , λ ) = ∑ l = 0 ∞ ( γ λ ) l δ t + l \hat{A}_t^{GAE}(\gamma, \lambda) = \sum_{l=0}^{\infty}(\gamma\lambda)^l \delta_{t+l} A^tGAE(γ,λ)=l=0(γλ)lδt+l

其中 d e l t a _ t = r _ t + g a m m a V ( s _ t + 1 ) − V ( s _ t ) \\delta\_t = r\_t + \\gamma V(s\_{t+1}) - V(s\_t) delta_t=r_t+gammaV(s_t+1)V(s_t) 是时序差分误差 (TD error)。

# 工具函数
def compute_advantage(gamma, lmbda, td_delta):
    """
    使用GAE(Generalized Advantage Estimation)计算优势函数
    参数:
        gamma (float): 折扣因子,用于未来奖励的折扣
        lmbda (float): GAE参数,控制偏差-方差权衡
        td_delta (torch.Tensor): TD误差,维度为 [episode_length]
    返回:
        torch.Tensor: 优势值,维度为 [episode_length]
    """
    td_delta = td_delta.detach().numpy()  # 转换为numpy数组,维度为 [episode_length]
    advantage_list = []  # 存储优势值的列表
    advantage = 0.0  # 初始化优势值
    
    # 从后向前计算优势值(反向遍历)
    for delta in td_delta[::-1]:  # delta为标量,表示单步TD误差
        advantage = gamma * lmbda * advantage + delta  # GAE公式计算
        advantage_list.append(advantage)  # 添加到列表,advantage为标量
    
    advantage_list.reverse()  # 恢复正确的时间顺序
    return torch.tensor(np.array(advantage_list), dtype=torch.float)  # 返回维度 [episode_length]

3. 智能体定义:策略与价值网络

我们采用 Actor-Critic 架构。

  • 策略网络 (PolicyNet):Actor 部分,输入状态,输出一个动作的概率分布。
  • 价值网络 (ValueNet):Critic 部分,输入状态,输出该状态的价值估计 V ( s ) V(s) V(s)
# 策略网络定义
### 多智能体强化学习的复现教程与代码实现 多智能体强化学习(Multi-Agent Reinforcement Learning, MARL)是一种研究多个智能体在共享环境中协同或竞争的领域。为了便于研究人员和开发者复现相关实验,以下提供了一个基于 MARLlib 和 TensorFlow 的代码实现示例[^5]。 #### 1. 环境安装 首先需要确保安装了必要的依赖库。MARLlib 提供了对 OpenAI Gym 兼容的支持,并基于 TensorFlow 构建[^1]。以下是环境设置的代码示例: ```bash pip install tensorflow gym marllib ``` #### 2. 示例代码:基于 MARLlib 的多智能体强化学习 以下是一个简单的 MARL 实现示例,演示如何使用 MARLlib 训练两个智能体在一个合作环境中完成任务。 ```python import marllib from marllib import marl # 初始化环境 env_config = { "map_name": "3m", # 使用一个简单的小型地图 "use_available_actions": False, } env = marl.make_env(environment_name="smac", map_name="3m") # 定义算法配置 algo_args = marl.default_config.copy() algo_args["use_state"] = True algo_args["use_recurrent"] = False algo_args["batch_episode"] = 4 # 创建训练器 trainer = marl.algos.get Trainer("ippo")(policy=marl.policy.cc_policy, env=env, config=algo_args) # 开始训练 for epoch in range(100): trainer.train() if epoch % 10 == 0: print(f"Epoch {epoch}, Reward: {trainer.buffer.info['train_reward']}") ``` 上述代码展示了如何使用 MARLlib 中的 `ippo` 算法进行训练。`ippo` 是一种经典的独立策略优化方法,适用于多智能体合作场景。 #### 3. 关键特性与优势 MARLlib 提供了灵活且可定制的参数共享策略,允许用户针对不同任务和环境优化其算法。此外,它支持所有任务模式,包括合作、协作、竞争和混合模式[^5]。这些特性使得 MARLlib 成为复现和扩展多智能体强化学习研究的理想工具。 #### 4. 注意事项 - 在实际应用中,可能需要根据具体问题调整环境配置和算法超参数。 - MARLlib 支持多种算法管道,如 `ippo`, `qmix`, 和 `vdn` 等,用户可以根据需求选择合适的算法[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值