多智能体强化学习调代码有感(一)-- MADDPG

2

主题

5

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2022-9-20 07:33:15 | 显示全部楼层
MADDPG

based idea: Q + policy
可以同时用于合作和竞争任务。本文采取的仍然是the framework of centralized training with decentralized execution。(这里我有一个小疑问,为啥竞争和合作同时存在还可以只优化一个函数呢?
答: 其实不是。这里每个智能体都有自己单独的策略网络和值网络。
只是每个智能体在优化的过程中,都用了对他人的观测。)
参考

[先要了解DDPG](张斯俊:一文带你理清DDPG算法(附代码及代码解释))、
[参考博客](ECKai:多智能体强化学习入门(四)——MADDPG算法)、
[解决离散问题的DDPG,如何用到离散多智能体任务上](单字卓:Gumbel-Softmax Trick)
观代码有感

[tenserflow版代码(最初)](https://github.com/openai/maddpg.git);
[pytorch,这个版本我看着很舒服,推荐](https://github.com/shariqiqbal2810/maddpg-pytorch.git)

下面主要针对pytorch版本代码解读:
环境配置

maddpg主要在MPE下的三个环境中进行了实验,环境不是依赖了pettingzoo中的mpe包,而是将maddpg论文中的缩减版环境代码复制过来了。除此之外,由于有些时候需要智能体与环境交互而快速得到数据,我们希望开启多进程,由此我们需要openai开发的强化学习的[baseline](https://github.com/openai/baselines)关于多进程调用的基类。
代码部署


  • 超参数(环境选择,随机种子选择,进程数目,buffer大小,回合数,每个回合的步长,batch_size大小,模型保存的间隔,算法优化的参数,网络结构的参数)
  • 运行开始

    • 初始化保存参数、结果、图片的一些路径
    • 初始化环境
    • 初始化maddpg模型
    • 初始化buffer
    • 开始迭代

      • reset环境
      • 初始化探索参数、噪声

        • 开始运行一个episode
        • 所有与环境交互的过程产生的数据都在cpu上面
        • 采集观测数据
        • 根据观测数据,智能体分别作出行为
        • 环境状态改变,获得新的数据(下一时刻的观测、奖励、done)
        • 保存这一个step的数据
        • 当buffer中的数据大于训练所需的batch_szie就可以开始训练了

          • 每个智能体都会训练一次critic和actor(训练在gpu上面)
          • critic就用所有人的观测结合所有人的行为数据,采用td-error结合bellman方程的方式优化。
          • Actor就用自己的观测,返回输出行为,并且估计他人的行为,把所有的观测和所有的行为cat在一起,作为critic的输入。
          • 希望通过actor找到state对应最大的Q,由于是要保证全局最优,所以将actor选择的行为带入到全局critic中,希望全局critic最大,所以采用梯度上升的方法优化。 actor优化的loss还增加了另外一项,就算actor直接输出的值。(我这里好像没太理解,另外一项的作用?)






  • 如何定义代码的文件?

    • 保存交互信息:reply_buffer
    • 与环境交互过程:直接放在main中,或者放在叫rollout
    • 算法、学习过程(算法更新) : 算法名称命名就好,可以放在policy文件夹下面
    • 支撑智能体运动的算法调用,网络结构的调用,每个智能体的初始化,动作选择:agent
    • 网络结构:nerwork

数据的标准化

[代码中用`nn.BatchNorm1d`对输入数据进行标准化操作。这个操作的含义可以参考这个连接。](曾伊言:强化学习需要批归一化(Batch Norm) 或归一化吗?)
Q network


  • input:`tf.concat(obs_ph_n + act_ph_n, 1)`(包括行为和观测。全观测的话就是所有智能体的值,部分的话就是自己的值)
  • 网络:三层的感知机
  • output:值(常数不是矩阵)
policy network


  • input:`obs_ph_n[p_index]` (某个智能体(p_index)的观测)(obs[agent_i])
  • 网络:三层的感知机
  • output:每个行为的概率
  • 在离散控制中,采用gumbel_softmax带有随机性的选择动作。(这里不用argmax的原因就是,保证在用PG
更新的时候,保证处处可导。)
策略更新


  • 从每个智能体的buffer中分别抽取batch_size的样本。
  • 用这些batch计算p和q。
  • 确定性策略梯度。
Q更新


  • input:所有智能体的观测以及所有智能体的行为(vf_in、trgt_vf_in)
  • 用全局信息学习。
  • TD-error
估计其他智能体的策略

MADDPG的一个启发就是,如果我们知道所有的智能体的动作,那么环境就是稳定的,就算策略在不断更新环境也是恒定的,因为模型动力学使稳定的。


这里借鉴的是DDPG的思想,只不过出发点不一样,DDPG用actor网络将输出连续的行为,而MADDPG则用actor网络模拟他人行为。

(这里的代码待实现。 代码中直接将他人的策略函数拿过来直接得到了行为。(我们可以获得他人的行为,但不可以知道对手的策略))
maddpg_rnn

打算看一下这个,还没看呢,自己重写的RNN不work阿![Recurrent MADDPG for Partially Observable and Limited Communication Settings](https://github.com/rosewang2008/rmaddpg)
[看完了代码,整理以下,感觉和预期差不多,代码还在跑有点慢是怎么回事?](桃子君:多智能体强化学习调代码有感(二)-- R-MADDPG)
其实多智能体好多时候都会采取用rnn的网络结构。这是因为智能体是部分可观测的。部分可观测想是一个值函数对应多个自变量的感觉。采用rnn就是增加编码的复杂度,这样可以区分出更多不同的自变量。虽然这可能有点不符合马尔科夫过程的定义,但是毕竟我们生活不是在理想情况。
(目前代码没跑出来,祈祷有好结果!结果不幸阿,等我在调一下)

加入rnn之后对原代码有哪些影响?
网络结构

很直观的想法。对rnn总是不理解的我,就用最简单的GNU来构建模型。
从代码角度来说,RNN需要定义隐变量。相比于非RNN的结构将一个batch_size的 <s,a,r,s`> 作为网络的训练数据,RNN采用一个batch_size的episode产生的 <s,a,r,s`> 作为网络的训练数据,为了保证网络的一致性,每次episode的刚开始,隐层变量需要重置一下。
buffer
存的不再是独立的<s,a,r,s`>, 而是独立的episode产生的<s,a,r,s`> (好家伙直接升维度了)
update
原来是直接将batch放入网络里面,计算一次就行。但是现在需要每个episode的每个step都要算一遍,所以就要把batch按照episode的维度分别放如到网络里,计算len_ep次。(每个智能体都有四个网络,然后每次还要初始化隐层参数,这要改的不少。)

上一篇: 为什么大家习惯设定多个闹钟

下一篇: 没有了

回复

举报 使用道具

0

主题

4

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 10 小时前 | 显示全部楼层
LZ帖子不给力,勉强给回复下吧
回复

举报 使用道具

您需要登录后才可以回帖 登录 | 立即注册
快速回复 返回顶部 返回列表