|
发表于 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阿
[看完了代码,整理以下,感觉和预期差不多,代码还在跑有点慢是怎么回事?](桃子君:多智能体强化学习调代码有感(二)-- 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次。(每个智能体都有四个网络,然后每次还要初始化隐层参数,这要改的不少。) |
|