MARL笔记3-Qmix(vdn改进)

本文介绍了QMIX模型,一种针对VDN在多智能体强化学习中局限性的改进方法。QMIX通过考虑个体和全局状态,设计了混合网络和超网络结构,确保Qtot与每个智能体的Q值正相关,从而提升决策质量。实验结果展示了QMIX在StarCraftII环境中的协作性能提升。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

论文链接:QMIX: Monotonic Value Function Factorisation for Deep Multi-Agent Reinforcement Learning (mlr.press)

代码参考:Welcome to XuanCe’s documentation! — XuanCe v1.0 documentation

动机

主要是面对VDN的几个缺陷:

1.通过简单地将各智能体的个体价值函数相加来近似总体动作价值函数,这种方法限制了它能表示的动作价值函数的复杂度。

2.VDN没有利用训练时可用的额外全局状态信息s,这可能导致在需要这些信息以提高决策质量的环境中性能受限。

VDN的全局Q值只是线性相加:Q((h^1,h^2,...,h^d),(a^1,a^2,...,a^d))\approx\sum_{i=1}^d\tilde{Q}_i(h^i,a^i)

简单的线性组合并不能很好的拟合Qtot,可能需要复杂的非线性组合智能体的价值函数来扩展可表示的动作价值函数的类别。Qmix的设计理念基于这个式子:

\underset{\mathbf{u}}{\operatorname*{argmax}}Q_{tot}(\tau,\mathbf{u})=\begin{pmatrix}\operatorname{argmax}_{u^1}Q_1(\tau^1,u^1)\\\vdots\\\operatorname{argmax}_{u^n}Q_n(\tau^n,u^n)\end{pmatrix}

τ是个体观测轨迹,ui是个体动作。Qmix假设如果每个智能体都选择使得自己个体Q最大的动作,那么这些动作的组合将会是使得整个系统的Qtot最大的动作组合。

这个假设只用满足这个前提即可,那就是Qtot和每个智能体的Q正相关:

\frac{\partial Q_{tot}}{\partial Q_a}\geq0,\forall a\in A.这样的情况下,个体Q同时最大时一定有Qtot最大。

模型结构

基于上面的假设,Qmix最后的网络结构:

总共有三种网络:

1.智能体网络:采用MLP-GRU-MLP的结构,GRU用于处理时间序列。

2.混合网络:用于将输入的Q值混合成Qtot

3.超网络:用于学习混合网络的权重和偏置

这是混合网络的结构:

class QMIX_mixer(nn.Module):
    def __init__(self, dim_state, dim_hidden, dim_hypernet_hidden, n_agents, device):
        super(QMIX_mixer, self).__init__()
        self.device = device
        self.dim_state = dim_state
        self.dim_hidden = dim_hidden
        self.dim_hypernet_hidden = dim_hypernet_hidden
        self.n_agents = n_agents
        self.hyper_w_1 = nn.Sequential(nn.Linear(self.dim_state, self.dim_hypernet_hidden),
                                       nn.ReLU(),
                                       nn.Linear(self.dim_hypernet_hidden, self.dim_hidden * self.n_agents)).to(device)#第一层权重超网
        self.hyper_w_2 = nn.Sequential(nn.Linear(self.dim_state, self.dim_hypernet_hidden),
                                       nn.ReLU(),
                                       nn.Linear(self.dim_hypernet_hidden, self.dim_hidden)).to(device)#第二层权重超网

        self.hyper_b_1 = nn.Linear(self.dim_state, self.dim_hidden).to(device)#第一层偏置超网
        self.hyper_b_2 = nn.Sequential(nn.Linear(self.dim_state, self.dim_hypernet_hidden),
                                       nn.ReLU(),
                                       nn.Linear(self.dim_hypernet_hidden, 1)).to(device)
#第二层偏置超网
    def forward(self, values_n, states):
        states = torch.as_tensor(states, dtype=torch.float32, device=self.device)
        states = states.reshape(-1, self.dim_state)
        agent_qs = values_n.reshape(-1, 1, self.n_agents)
        # First layer
        w_1 = torch.abs(self.hyper_w_1(states))
        w_1 = w_1.view(-1, self.n_agents, self.dim_hidden)
        b_1 = self.hyper_b_1(states)
        b_1 = b_1.view(-1, 1, self.dim_hidden)
        hidden = F.elu(torch.bmm(agent_qs, w_1) + b_1)#批量矩阵乘法
        # Second layer
        w_2 = torch.abs(self.hyper_w_2(states))
        w_2 = w_2.view(-1, self.dim_hidden, 1)
        b_2 = self.hyper_b_2(states)
        b_2 = b_2.view(-1, 1, 1)
        # Compute final output
        y = torch.bmm(hidden, w_2) + b_2
        # Reshape and return
        q_tot = y.view(-1, 1)
        return q_tot

算权重的时候的第二层加了一个ReLU函数,把定义域为负的部分修正了。使得Qtot关于每个Q总是正相关的

Q_{tot}(\boldsymbol{\tau},\boldsymbol{u})=W_2^\top\operatorname{Elu}(W_1^\top\boldsymbol{Q}+B_1)+B_2

由链式法则有:

\frac{\partial Q_{tat}}{\partial Q}=\left(\frac{\partial\text{Elu}(W_1^\top Q+B_1)}{\partial Q}\right)^\top W_2=\left(\frac{\partial\text{Elu}(W_1^\top Q+B_1)}{\partial(W_1^\top Q+B_1)}\cdot W_1\right)^\top W_2

由ReLU的导数有:0<\frac{\partial\mathrm{Elu}(x)}{\partial x}\leq1.,而且W1和W2的计算都经过了abs层,所以此处W1>0,W2>0,该式严格大于0,所以Qtot和Q值正相关成立。

以上推导参考大佬文章:从 VDN 到 QMIX: Monotonic Value Function Factorisation for Deep Multi-Agent Reinforcement Learning - 知乎 (zhihu.com)

网络训练:

智能体网络,混合网络,超网络的参数都采用该式:

\mathcal{L}(\theta)=\sum\limits_{i=1}^b\left[\left(y_i^{tot}-Q_{tot}(\tau,\mathbf{u},s;\theta)\right)^2\right]

训练过程除了加的超网以及混合网络,其余和VDN基本相同。

实验:

找到xuance库的examples文件夹,找到qmix,想跑环境的yaml里改参数,parallel是并行环境数量,内存大的可以多设,不然设成2到4就好不然容易爆内存。benchmark模式是训练-测试-训练-测试-训练...模式,run则是只训练或者只测试。想看运行video的话,benchmark模式下把render改成True,或run模式下render和test_mode均设为True。最后运行qmix_sc2.py就好了。

跑的starcraft2的环境。这个游戏有这样几种角色:

c:Colossus(巨像) m:Marines(海军陆战队员) s: Stalkers(追猎者) z:Zealots(狂热者)他们需要协作击败敌人。

实验的结果:(如3m就是3个海军陆战队员)

自上而下为3m环境下训练0step,50000step,100000step的表现,可以看到经过训练,友军已经可以在无伤亡的情况下击败敌军了。

### QMIX算法介绍及原理 #### 3.1 算法概述 QMIX是一种用于合作型多智能体系统的分布式训练集中执行框架的强化学习方法[^2]。该算法旨在解决传统独立行动者-评论家架构难以处理的合作任务中的信用分配问题。 #### 3.2 关键概念 在QMIX中,每个代理都维护着自己局部的动作价值函数\(Q_i\),这些个体级别的评估被用来指导各自的策略优化过程。然而不同于简单的累加各个成员贡献的方式(VDN)QMIX引入了一个称为混合网络(mixing network) 的组件来构建全局奖励预测模型 \(Q_{tot}\)[^4]。此结构允许更灵活地表示团队整体性能与各组成部分之间的关系,从而提高了表达能力并适应更为复杂的环境动态变化需求。 #### 3.3 混合机制设计 为了确保所提出的总效用估计器能够合理反映实际收益情况,同时也便于后续的学习收敛分析,研究者们特别强调了两个重要性质: - **单调性**:随着任一参与者采取更好行为而导致其个人得分增加时,整个集体获得的好处也应该随之增长; \[ \frac{\partial Q_{\text {total}}}{\partial Q_j}(s, u)=w_j(s)>0,\forall j \] 这意味着当某个特定主体的表现有所提升,则总体评价也会相应提高;反之亦然。 - **中心化 vs 去中心化**:虽然最终的目标是让所有单元能够在无外界干预下协同工作(去中心化的运行模式),但在训练阶段却可以利用额外的信息源——比如完整的观测空间或者历史记录等辅助手段来进行监督式调整(即所谓的“中心化”)。这种做法不仅有助于加速探索进程而且还能有效缓解因缺乏足够的交互样本而造成的过拟合风险。 #### 3.4 实验验证 通过一系列对比测试表明,在面对不同类型的挑战场景时(包括但不限于资源收集、对抗竞赛等领域),基于上述原则开发出来的QMIX方案均能展现出优于其他同类技术的效果。特别是针对那些存在高度不确定性和频繁变动因素的任务设定里,其所具备的优势尤为明显[^3]。 ```python import torch.nn as nn class MixingNet(nn.Module): def __init__(self, state_dim, n_agents): super(MixingNet, self).__init__() # 定义超网参数生成部分... def forward(self, agent_qs, states): # 使用状态信息作为条件输入到超网中, # 动态产生权重矩阵W, # 并据此计算出总的Q值. pass ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值