学习强化学习,码代码的能力必须要出众,要快速入门强化学习 搞清楚其中真正的原理,读源码是一个最简单的最直接的方式。最近创建了一系列该类型文章,希望对大家有多帮助。
另外,我会将所有的文章及所做的一些简单项目,放在
OpenAI 2017论文《Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments》
知乎已经比较详细介绍了
本文主要分析该开源程序的架构。
该程序主要是对 文章中的environment的实验进行房展
在试验中 存在 agent 和landmarks
实验一:speak 不能动 但是可以看,listener说一个颜色 listener 就到一个颜色的landmark上去
实验二:在这种经典的捕食者-食饵游戏变体中,N个较慢的Predator在Landmark阻碍下追赶速度更快的Prey
每一个Predator碰撞到prey,代理人得到奖励,而对手受到惩罚。
环境github
强化学习的主要两个部分即 环境 和 算法
环境 主要是通过 主函数中 make-env创建
算法 主要是通过主函数中 get_trainers创建
在每一次迭代中,都会计算所有agent的动作
然后将所有agent的动作送入 step ,并得到reward ,在这里reward对agent都是相同的。
每一个agent都拥有自己的经验池,并将所有的都进行更新。
同样每次都对所有的agent都运行一遍update
在ENV的部分调用过程中,都是通过调用具体环境,即Scenario下的子类环境,然后用该场景下的两个方法
Make-world 和 reset-world。创建具体的环境。
总体流程是
- 调用环境 make-env(train)
- 具体环境建立
- Make-world 创建 agent 初始化各个agent
- reset-world初始化各个agent
- 创建env
- 为每个agent创建 状态-动作空间
- step 和reward等环境
具体子环境
Make_World
创建过程中
1、循环调用core中的agent 向 world 中增加 agent 和 landmark
agent 包含以下参数
- movable: True or Flase 可以不可以移动
- silent :True or Flase 可以不可以交流
- Bline :True or Flase 可以不可以观察
- Unoise、Cnoise :True or Flase U动作噪声 C 交流噪声
- state 状态
- action 动作
2、world 中定义了 agent运动的基本方式,主要利用两个函数
- apply_action_force: 将动作加上噪声
- apply_environment_force :将agent的 运动 加在状态上,需要通过get_collision_force判断是不是碰撞
- integrate_state : 求积分 更改 将速度增加在 P上
- update_agent_state:将交流动作加上噪声
reset world
利用循环将各个agent 的动作 通信动作 初始化
此外此函数中定义奖励 和 观察
Environment
将world 输入到 MultiagentEnv或者BatchMultiAgentEnv 以创建
该函数的输入是
该环境下存在 reset 和 step函数
该step也是调用 world 下的 step , 但是该处的step可以确定agent的动作顺序
在这里每一个agent都需要建立一个trainer ,然后添加在在trainer list中
其中最主要关注的是model,obs_shape_n, env.action_space
其中输入model是一个 网络,这个网络即是critic 又是actor
**Trainer **主要包含
一个类:MADDPGAgentTrainer 在该类中调用P—train,Q—trian,利用function来建立所利用的函数。
四个子函数:
- P—train
- Q—trian
- discount_with_dones
- make_update_exp
主要是依赖于tensorflow的function建立的
P_train 主要是为了建立actor
总体思路流程是 建立actor 建立 critic 然后将critic 的输出 和 actor输出 当做loss 来训练actor
程序流程
将动作空间创建为概率分布。
为动作空间的概率分布和状态空间生成placeholder
生成actor 并得到$ P$ 可训练函数
这个地方P 是一个 输出层的tensor
根据 输出的分布 采样 得到动作
并计算动作的均值 生成P-reg
act_pd 是把p这个function 传到其中,然后flatparam 又把这个地方取出来 然后 平方根 然后 求平均? 这个地方为什么要sample 两边??
之后,将actor生成的action 与 状态 节课 送进去 生成 Q critic 。
并将q的输出求均值 然后 得到总LOSS
然后得到了 critic 部分 即 训练函数 train ,该函数是 输入是 状态和 动作 输出是loss
同时也得到了act部分 即 训练函数 act
在该函数下 同样生成target 网络 ,生成方式与 p的生成方式是一样的都是利用model
更新target网络用的是
所以最终生成3个函数 act(actor)、train(critic) 、update_target_p(更新actor)
Q_train 建立critic
形式与P_trian一样 建立 critic 然后建立 traget critic 其Loss 表示为
如果用本地Q函数的时候 loss 利用本地数据
建立train的时候,不论是不是输入的 是不是 local 但是都是利用 全局数据
Train 也输出的是Loss 而不是Q值 .
其他与之前类似。
主体部分 MADDPGAgentTrainer
利用p-train 创建actor 利用Q train 创建critic 调用replay buffer 创建经验回放池
利用经验回放来收集数据
update
在更新的时候先计算每一个样本的target q 然后输入 Q和P的train 训练。
子函数必须有的函数
-
sample_placeholder
为创建图中的placeholder
-
param_placeholder