放歌云起 發表於 2022-10-27 21:34:00

多智能体强化学习算法【三】【QMIX、MADDPG、MAPPO】

<p>相关文章:</p>
<p>常见多智能体强化学习仿真环境介绍【一】{推荐收藏,真的牛}</p>
<p>多智能体强化学习算法【一】【MAPPO、MADDPG、QMIX】</p>
<p>多智能体强化学习算法【二】【MADDPG、QMIX、MAPPO】</p>
<p>多智能体强化学习算法【三】【QMIX、MADDPG、MAPPO】</p>
<h1>1.QMIX算法简述</h1>
<p>QMIX是一个多智能体强化学习算法,具有如下特点:</p>
<p>1. 学习得到分布式策略。</p>
<p>2. 本质是一个值函数逼近算法。</p>
<p>3. 由于对一个联合动作-状态只有一个总奖励值,而不是每个智能体得到一个自己的奖励值,因此只能用于合作环境,而不能用于竞争对抗环境。</p>
<p>4. QMIX算法采用集中式学习,分布式执行应用的框架。通过集中式的信息学习,得到每个智能体的分布式策略。</p>
<p>5. 训练时借用全局状态信息来提高算法效果。是后文提到的VDN方法的改进。</p>
<p>6. 接上一条,QMIX设计一个神经网络来整合每个智能体的局部值函数而得到联合动作值函数,VDN是直接求和。</p>
<p>7. 每个智能体的局部值函数只需要自己的局部观测,因此整个系统在执行时是一个分布式的,通过局部值函数,选出累积期望奖励最大的动作执行。</p>
<p>8. 算法使联合动作值函数与每个局部值函数的单调性相同,因此对局部值函数取最大动作也就是使联合动作值函数最大。</p>
<p>9. 算法针对的模型是一个分布式多智能体部分可观马尔可夫决策过程(Dec-POMDP)。</p>
<h2>1. 1 多智能体强化学习核心问题</h2>
<p>在多智能体强化学习中一个关键的问题就是如何学习联合动作值函数,因为该函数的参数会随着智能体数量的增多而成指数增长,如果动作值函数的输入空间过大,则很难拟合出一个合适函数来表示真实的联合动作值函数。另一个问题就是学得了联合动作值函数后,如何通过联合值函数提取出一个优秀的分布式的策略。这其实是单智能体强化学习拓展到MARL的<strong>核心问题</strong>。</p>
<h3><strong>&nbsp;1)Dec-POMDP</strong></h3>
<p>Dec-POMDP是将POMDP拓展到多智能体系统。每个智能体的局部观测信息<img src="https://latex.codecogs.com/gif.latex?o_%7Bi%2Ct%7D">,动作<img alt="a_{i,t}" class="mathcode lazyload" data-src="https://latex.codecogs.com/gif.latex?a_%7Bi%2Ct%7D">,系统状态为&nbsp;<img alt="s_t" class="mathcode lazyload" data-src="https://latex.codecogs.com/gif.latex?s_t">。其主要新定义了几个概念,简要介绍几个主要的。每个智能体的动作-观测历史可表示为<img alt="\tau_{i}=\left(a_{i, 0}, o_{i, 1}, \cdots, a_{i, t-1}, o_{i, t}\right)" class="mathcode lazyload" data-src="https://latex.codecogs.com/gif.latex?%5Ctau_%7Bi%7D%3D%5Cleft%28a_%7Bi%2C%200%7D%2C%20o_%7Bi%2C%201%7D%2C%20%5Ccdots%2C%20a_%7Bi%2C%20t-1%7D%2C%20o_%7Bi%2C%20t%7D%5Cright%29">&nbsp;表示从初始状态开始,该智能体的时序动作-观测记录,联合动作-观测历史<img alt="\tau=\left(\tau_{1}, \cdots, \tau_{n}\right)" class="mathcode lazyload" data-src="https://latex.codecogs.com/gif.latex?%5Ctau%3D%5Cleft%28%5Ctau_%7B1%7D%2C%20%5Ccdots%2C%20%5Ctau_%7Bn%7D%5Cright%29">表示从初始状态开始,所有智能体的时序动作-观测记录。则每个智能体的分布式策略为&nbsp;<img alt="\pi_{i}\left(\tau_{i}\right)" class="mathcode lazyload" data-src="https://latex.codecogs.com/gif.latex?%5Cpi_%7Bi%7D%5Cleft%28%5Ctau_%7Bi%7D%5Cright%29">,其值函数为<img alt="Q_{i}\left(\tau_{i}, a_{i} ; \theta_{i}\right)" class="mathcode lazyload" data-src="https://latex.codecogs.com/gif.latex?Q_%7Bi%7D%5Cleft%28%5Ctau_%7Bi%7D%2C%20a_%7Bi%7D%20%3B%20%5Ctheta_%7Bi%7D%5Cright%29">都是跟动作-观测历史<img alt="\tau _i" class="mathcode lazyload" data-src="https://latex.codecogs.com/gif.latex?%5Ctau%20_i">有关,而不是跟状态有关了。</p>
<p style="text-align: center"><img alt="" height="341" width="600" data-src="https://img-blog.csdnimg.cn/20210609085931838.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzM5NjIwMjE3,size_16,color_FFFFFF,t_70"></p>
<h3>2) IQL</h3>
<p>IQL(independent Q-learning)就是非常暴力的给每个智能体执行一个Q-learning算法,因为共享环境,并且环境随着每个智能体策略、状态发生改变,对每个智能体来说,环境是动态不稳定的,因此这个算法也无法收敛,但是在部分应用中也具有较好的效果。</p>
<p style="text-align: center"><img src="https://img-blog.csdnimg.cn/20210609090206790.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzM5NjIwMjE3,size_16,color_FFFFFF,t_70"></p>
<h3>3) VDN</h3>
<p>VDN(value decomposition networks)也是采用对每个智能体的值函数进行整合,得到一个联合动作值函数。令<img src="https://latex.codecogs.com/gif.latex?%5Ctau%3D%5Cleft%28%5Ctau_%7B1%7D%2C%20%5Ccdots%2C%20%5Ctau_%7Bn%7D%5Cright%29">表示联合动作-观测历史,其中<img alt="\tau_{i}=\left(a_{i, 0}, o_{i, 1}, \cdots, a_{i, t-1}, o_{i, t}\right)" class="mathcode lazyload" data-src="https://latex.codecogs.com/gif.latex?%5Ctau_%7Bi%7D%3D%5Cleft%28a_%7Bi%2C%200%7D%2C%20o_%7Bi%2C%201%7D%2C%20%5Ccdots%2C%20a_%7Bi%2C%20t-1%7D%2C%20o_%7Bi%2C%20t%7D%5Cright%29">为动作-观测历史,&nbsp;&nbsp;<img alt="Q_{tot}" class="mathcode lazyload" data-src="https://latex.codecogs.com/gif.latex?Q_%7Btot%7D">表示联合动作。<img alt="a=\left(a_{1}, \cdots, a_{n}\right)" class="mathcode lazyload" data-src="https://latex.codecogs.com/gif.latex?a%3D%5Cleft%28a_%7B1%7D%2C%20%5Ccdots%2C%20a_%7Bn%7D%5Cright%29">为联合动作值函数,<img alt="Q_{i}\left(\tau_{i}, a_{i} ; \theta_{i}\right)" class="mathcode lazyload" data-src="https://latex.codecogs.com/gif.latex?Q_%7Bi%7D%5Cleft%28%5Ctau_%7Bi%7D%2C%20a_%7Bi%7D%20%3B%20%5Ctheta_%7Bi%7D%5Cright%29">为智能体i的局部动作值函数,局部值函数只依赖于每个智能体的局部观测。VDN采用的方法就是直接相加求和的方式</p>
<p style="text-align: center"><img alt="Q_{t o t}=\sum_{i=1}^{n} Q_{i}\left(\tau_{i}, a_{i}, ; \theta_{i}\right)" class="mathcode lazyload" data-src="https://latex.codecogs.com/gif.latex?Q_%7Bt%20o%20t%7D%3D%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%20Q_%7Bi%7D%5Cleft%28%5Ctau_%7Bi%7D%2C%20a_%7Bi%7D%2C%20%3B%20%5Ctheta_%7Bi%7D%5Cright%29"></p>
<p>&nbsp;</p>
<p>虽然<img alt="Q_{i}\left(\tau_{i}, a_{i} ; \theta_{i}\right)" class="mathcode lazyload" data-src="https://latex.codecogs.com/gif.latex?Q_%7Bi%7D%5Cleft%28%5Ctau_%7Bi%7D%2C%20a_%7Bi%7D%20%3B%20%5Ctheta_%7Bi%7D%5Cright%29">不是用来估计累积期望回报的,但是这里依然叫它为值函数。分布式的策略可以通过对每个<img alt="Q_{i}\left(\tau_{i}, a_{i} ; \theta_{i}\right)" class="mathcode lazyload" data-src="https://latex.codecogs.com/gif.latex?Q_%7Bi%7D%5Cleft%28%5Ctau_%7Bi%7D%2C%20a_%7Bi%7D%20%3B%20%5Ctheta_%7Bi%7D%5Cright%29">取max得到。</p>
<p style="text-align: center"><img alt="" height="350" width="600" data-src="https://img-blog.csdnimg.cn/20210609090247405.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzM5NjIwMjE3,size_16,color_FFFFFF,t_70"></p>
<h3>&nbsp;4) DRQN</h3>
<p>DRQN是一个用来处理POMDP(部分可观马尔可夫决策过程)的一个算法,其采用LSTM替换DQN卷基层后的一个全连接层,来达到能够记忆历史状态的作用,因此可以在部分可观的情况下提高算法性能。具体讲解可以看强化学习——DRQN分析详解。由于QMIX解决的是多智能体的POMDP问题,因此每个智能体采用的是DRQN算法。</p>
<p style="text-align: center"><img src="https://img-blog.csdnimg.cn/20210609090646889.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzM5NjIwMjE3,size_16,color_FFFFFF,t_70"></p>
<h2>1.2 QMIX</h2>
<p>上文“多智能体强化学习核心问题”提到的就是QMIX解决的最核心问题。其是在VDN上的一种拓展,由于VDN只是将每个智能体的局部动作值函数求和相加得到联合动作值函数,虽然满足联合值函数与局部值函数单调性相同的可以进行分布化策略的条件,但是其没有在学习时利用状态信息以及没有采用非线性方式对单智能体局部值函数进行整合,使得VDN算法还有很大的提升空间。</p>
<p>QMIX就是采用一个混合网络对单智能体局部值函数进行合并,并在训练学习过程中加入全局状态信息辅助,来提高算法性能。</p>
<p>为了能够沿用VDN的优势,利用集中式的学习,得到分布式的策略。主要是因为对联合动作值函数取<img src="https://latex.codecogs.com/gif.latex?argmax">等价于对每个局部动作值函数取<img alt="argmax" class="mathcode lazyload" data-src="https://latex.codecogs.com/gif.latex?argmax">&nbsp;&nbsp;,其单调性相同,如下所示</p>
<p style="text-align: center"><img alt="\operatorname{argmax}_{u} Q_{t o t}(\tau, u)=\left(\begin{array}{c} \operatorname{argmax}_{u_{1}} Q_{1}\left(\tau_{1}, u_{1}\right) \\ \vdots \\ \operatorname{argmax}_{u_{n}} Q_{n}\left(\tau_{n}, u_{n}\right) \end{array}\right)" class="mathcode lazyload" data-src="https://latex.codecogs.com/gif.latex?%5Coperatorname%7Bargmax%7D_%7Bu%7D%20Q_%7Bt%20o%20t%7D%28%5Ctau%2C%20u%29%3D%5Cleft%28%5Cbegin%7Barray%7D%7Bc%7D%20%5Coperatorname%7Bargmax%7D_%7Bu_%7B1%7D%7D%20Q_%7B1%7D%5Cleft%28%5Ctau_%7B1%7D%2C%20u_%7B1%7D%5Cright%29%20%5C%5C%20%5Cvdots%20%5C%5C%20%5Coperatorname%7Bargmax%7D_%7Bu_%7Bn%7D%7D%20Q_%7Bn%7D%5Cleft%28%5Ctau_%7Bn%7D%2C%20u_%7Bn%7D%5Cright%29%20%5Cend%7Barray%7D%5Cright%29"></p>
<p>因此分布式策略就是贪心的通过局部<img alt="Q_i" class="mathcode lazyload" data-src="https://latex.codecogs.com/gif.latex?Q_i">获取最优动作。QMIX将(1)转化为一种单调性约束,如下所示</p>
<p style="text-align: center"><img alt="\frac{\partial Q_{t o t}}{\partial Q_{i}} \geq 0, \forall i \in\{1,2, \cdots, n\}" class="mathcode lazyload" data-src="https://latex.codecogs.com/gif.latex?%5Cfrac%7B%5Cpartial%20Q_%7Bt%20o%20t%7D%7D%7B%5Cpartial%20Q_%7Bi%7D%7D%20%5Cgeq%200%2C%20%5Cforall%20i%20%5Cin%5C%7B1%2C2%2C%20%5Ccdots%2C%20n%5C%7D"></p>
<p>若满足以上单调性,则(1)成立,为了实现上述约束,QMIX采用混合网络(mixing network)来实现,其具体结构如下所示</p>
<p style="text-align: center"><img alt="" height="253" width="600" data-src="https://img-blog.csdnimg.cn/2021060909032771.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzM5NjIwMjE3,size_16,color_FFFFFF,t_70"></p>
<p>图(c)表示每个智能体采用一个DRQN来拟合自身的Q值函数的到&nbsp;&nbsp;<img src="https://latex.codecogs.com/gif.latex?Q_%7Bi%7D%5Cleft%28%5Ctau_%7Bi%7D%2C%20a_%7Bi%7D%20%3B%20%5Ctheta_%7Bi%7D%5Cright%29">,DRQN循环输入当前的观测<img alt="o_{i,t}" class="mathcode lazyload" data-src="https://latex.codecogs.com/gif.latex?o_%7Bi%2Ct%7D">以及上一时刻的动作<img alt="a_{i,t-1}" class="mathcode lazyload" data-src="https://latex.codecogs.com/gif.latex?a_%7Bi%2Ct-1%7D">来得到Q值。</p>
<p>图(b)表示混合网络的结构。其输入为每个DRQN网络的输出。为了满足上述的单调性约束,混合网络的所有权值都是非负数,对偏移量不做限制,这样就可以确保满足单调性约束。</p>
<p>为了能够更多的利用到系统的状态信息&nbsp;&nbsp;<img alt="s_t" class="mathcode lazyload" data-src="https://latex.codecogs.com/gif.latex?s_t">,采用一种超网络(hypernetwork),将状态<img alt="s_t" class="mathcode lazyload" data-src="https://latex.codecogs.com/gif.latex?s_t">作为输入,输出为混合网络的权值及偏移量。为了保证权值的非负性,采用一个线性网络以及绝对值激活函数保证输出不为负数。对偏移量采用同样方式但没有非负性的约束,混合网络最后一层的偏移量通过两层网络以及ReLU激活函数得到非线性映射网络。由于状态信息<img alt="s_t" class="mathcode lazyload" data-src="https://latex.codecogs.com/gif.latex?s_t">是通过超网络混合到<img alt="Q_{tot}" class="mathcode lazyload" data-src="https://latex.codecogs.com/gif.latex?Q_%7Btot%7D">中的,而不是仅仅作为混合网络的输入项,这样带来的一个好处是,如果作为输入项则<img alt="s_t" class="mathcode lazyload" data-src="https://latex.codecogs.com/gif.latex?s_t">的系数均为正,这样则无法充分利用状态信息来提高系统性能,相当于舍弃了一半的信息量。</p>
<p>QMIX最终的代价函数为</p>
<p><img alt="L(\theta)=\sum_{i=1}^{b}\left[\left(y_{i}^{t o t}-Q_{t o t}(\tau, a, s ; \theta)\right)^{2}\right]" class="mathcode lazyload" data-src="https://latex.codecogs.com/gif.latex?L%28%5Ctheta%29%3D%5Csum_%7Bi%3D1%7D%5E%7Bb%7D%5Cleft%5B%5Cleft%28y_%7Bi%7D%5E%7Bt%20o%20t%7D-Q_%7Bt%20o%20t%7D%28%5Ctau%2C%20a%2C%20s%20%3B%20%5Ctheta%29%5Cright%29%5E%7B2%7D%5Cright%5D"></p>
<p>&nbsp;</p>
<p>更新用到了传统的DQN的思想,其中b表示从经验记忆中采样的样本数量</p>
<p>&nbsp;&nbsp;<img alt="y^{\text {tot }}=r+\gamma \max _{a^{\prime}} \bar{Q}\left(\tau^{\prime}, a^{\prime}, s^{\prime} ; \bar{\theta}\right), \quad \bar{Q}\left(\tau^{\prime}, a^{\prime}, s^{\prime} ; \bar{\theta}\right)" class="mathcode lazyload" data-src="https://latex.codecogs.com/gif.latex?y%5E%7B%5Ctext%20%7Btot%20%7D%7D%3Dr&amp;plus;%5Cgamma%20%5Cmax%20_%7Ba%5E%7B%5Cprime%7D%7D%20%5Cbar%7BQ%7D%5Cleft%28%5Ctau%5E%7B%5Cprime%7D%2C%20a%5E%7B%5Cprime%7D%2C%20s%5E%7B%5Cprime%7D%20%3B%20%5Cbar%7B%5Ctheta%7D%5Cright%29%2C%20%5Cquad%20%5Cbar%7BQ%7D%5Cleft%28%5Ctau%5E%7B%5Cprime%7D%2C%20a%5E%7B%5Cprime%7D%2C%20s%5E%7B%5Cprime%7D%20%3B%20%5Cbar%7B%5Ctheta%7D%5Cright%29"></p>
<p>表示目标网络。</p>
<p>由于满足上文的单调性约束,对&nbsp;&nbsp;<img alt="Q_{tot}" class="mathcode lazyload" data-src="https://latex.codecogs.com/gif.latex?Q_%7Btot%7D">进行&nbsp;&nbsp;<img alt="argmax" class="mathcode lazyload" data-src="https://latex.codecogs.com/gif.latex?argmax">操作的计算量就不在是随智能体数量呈指数增长了,而是随智能体数量线性增长,极大的提高了算法效率。</p>
<h2>1.3 demo</h2>
<p>原文中给了一个小示例来说明QMIX与VND的效果差异,虽然QMIX也不能完全拟合出真实的联合动作值函数,但是相较于VDN已经有了很大的提高。</p>
<p>如下图为一个两步合作矩阵博弈的价值矩阵</p>
<p style="text-align: center"><img alt="" height="220" width="563" data-src="https://img-blog.csdnimg.cn/2021060515444666.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzM5NjIwMjE3,size_16,color_FFFFFF,t_70"></p>
<p>在第一阶段,只有智能体1的动作能决定第二阶段的状态。在第一阶段,如果智能体1采用动作A&nbsp;则跳转到上图state2A状态,如果智能体1采用动作B则跳转到上图state2B状态,第二阶段的每个状态的价值矩阵如上两图所示。</p>
<p>现在分别用VDN与QMIX学习上述矩阵博弈各个状态的值函数矩阵,得到结果如下图所示</p>
<p><img src="https://img-blog.csdnimg.cn/2021060515450758.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzM5NjIwMjE3,size_16,color_FFFFFF,t_70"></p>
<p>(a)为VDN拟合结果,(b)为QMIX拟合结果。可以从上图,VDN的结果是智能体1&nbsp;在第一阶段采用动作A&nbsp;&nbsp;,显然这不是最佳状态,而QMIX是智能体1在第一阶段采用动作B,得到了最大的累积期望奖励。由上可得QMIX的逼近能力比VDN更强,QMIX算法的效果更好</p><br><br>
来源:https://www.cnblogs.com/ting1/p/16833988.html
頁: [1]
查看完整版本: 多智能体强化学习算法【三】【QMIX、MADDPG、MAPPO】