当前位置: 首页 > news >正文

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

文章目录

  • 前言
  • IPPO 算法原理
  • 代码实践
    • 1\. 环境与依赖库导入
    • 2\. 工具函数:计算优势函数 (GAE)
    • 3\. 智能体定义:策略与价值网络
    • 4\. PPO 算法核心实现
    • 5\. IPPO 训练函数
    • 6\. 算法调用与训练
  • 总结


前言

单智能体强化学习(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)
# 策略网络定义
http://www.dtcms.com/a/351732.html

相关文章:

  • pytorch_grad_cam 库学习笔记——基类ActivationsAndGradient
  • vue2 和 vue3 生命周期的区别
  • 【Android】不同系统API版本_如何进行兼容性配置
  • 2014-2024高教社杯全国大学生数学建模竞赛赛题汇总预览分析
  • VMDK 文件
  • 软考-系统架构设计师 计算机系统基础知识详细讲解二
  • springcloud篇5-微服务保护(Sentinel)
  • Spring Boot mybatis-plus 多数据源配置
  • 【CVE-2025-5419】(内附EXP) Google Chrome 越界读写漏洞【内附EXP】
  • Kafka面试精讲 Day 1:Kafka核心概念与分布式架构
  • Elasticsearch中的协调节点
  • 详解kafka基础(一)
  • JavaScript常用的算法详解
  • Cherry-pick冲突与Git回滚
  • Oracle跟踪及分析方法
  • 力扣100+补充大完结
  • MySql 事务 锁
  • 推荐系统学习笔记(十四)-粗排三塔模型
  • 庖丁解牛:深入解析Oracle SQL语言的四大分类——DML、DDL、DCL、TCL
  • KubeBlocks for Oracle 容器化之路
  • 高校党建系统设计与实现(代码+数据库+LW)
  • 从零开始的 Docker 之旅
  • HIVE的高频面试UDTF函数
  • 【软考论文】论面向对象建模方法(动态、静态)
  • 无人机倾斜摄影农田航线规划
  • HTML应用指南:利用GET请求获取中国银行人民币存款利率数据
  • SciPy科学计算与应用:SciPy线性代数模块入门-矩阵运算与应用
  • 精确位置定位,AR交互助力高效作业流程​
  • 余承东:鸿蒙智行累计交付突破90万辆
  • 机器人视频感知架构深度解析:7条技术法则,打造低延迟实时感知与交互