深度解析OPENAI-MADDPG

深度解析OPENAI-MADDPG
Zee带你看RL代码系列
学习强化学习,码代码的能⼒必须要出众,要快速⼊门强化学习 搞清楚其中真正的原理,读源码是⼀个最简单的最直接的⽅式。最近创建了⼀系列该类型⽂章,希望对⼤家有多帮助。
另外,我会将所有的⽂章及所做的⼀些简单项⽬,放在
⽂章⽬录
深度解析MADDPG
MADDPG原理
OpenAI 2017论⽂
已经⽐较详细介绍了
本⽂主要分析该开源程序的架构。
该程序主要是对 ⽂章中的environment的实验进⾏房展
在试验中 存在 agent 和landmarks
实验⼀:speak 不能动 但是可以看,listener说⼀个颜⾊ listener 就到⼀个颜⾊的landmark上去
实验⼆:在这种经典的捕⾷者-⾷饵游戏变体中,N个较慢的Predator在Landmark阻碍下追赶速度更快的Prey
每⼀个Predator碰撞到prey,代理⼈得到奖励,⽽对⼿受到惩罚。
实验三 agent必须通过进⾏合作,以达到Landmark。必须躲避其他agent 到达相同的地标。
实验四:N个agent要到N个landmark上去,然⽽,⼀个adversary也希望到达⽬标地标,这个adversary不知道哪个地标是正确的。agent 根据adversary到正确地点的距离受到负reward。
算法
环境
程序架构
扬州寄语市长强化学习的主要两个部分即 环境 和 算法
环境 主要是通过 主函数中 make-env创建
def make_env(scenario_name, arglist, benchmark=False):
vironment import MultiAgentEnv
import multiagent.scenarios as scenarios
# load scenario from script
scenario = scenarios.load(scenario_name +".py").Scenario()
# create world
world = scenario.make_world()
# create multiagent environment
if benchmark:
env = MultiAgentEnv(world, set_world, ward, scenario.observation, scenario.benchmark_data)
else:
env = MultiAgentEnv(world, set_world, ward, scenario.observation)
return env
算法 主要是通过主函数中 get_trainers创建
def get_trainers(env, num_adversaries, obs_shape_n, arglist):
trainers =[]
model = mlp_model
trainer = MADDPGAgentTrainer
for i in range(num_adversaries):
trainers.append(trainer(
"agent_%d"% i, model, obs_shape_n, env.action_space, i, arglist,
local_q_func=(arglist.adv_policy=='ddpg')))
for i in range(num_adversaries, env.n):
trainers.append(trainer(
"agent_%d"% i, model, obs_shape_n, env.action_space, i, arglist,
local_q_func=(d_policy=='ddpg')))
return trainers
在每⼀次迭代中,都会计算所有agent的动作
然后将所有agent的动作送⼊ step ,并得到reward ,在这⾥reward对agent都是相同的。
每⼀个agent都拥有⾃⼰的经验池,并将所有的都进⾏更新。
同样每次都对所有的agent都运⾏⼀遍update
ENV 部分
[外链图⽚转存失败(img-Axl8rtat-1566778968182)(./image/Scenarios( Multiagent⽂件
夹).png)]
总体概况图
在ENV的部分调⽤过程中,都是通过调⽤具体环境,即Scenario下的⼦类环境,然后⽤该场景下的两个⽅法Make-world 和 reset-world。创建具体的环境。
总体流程是
1. 调⽤环境 make-env(train)
2. 具体环境建⽴
3. Make-world 创建 agent 初始化各个agent
4. reset-world初始化各个agent
5. 创建env
6. 为每个agent创建 状态-动作空间
7. step 和reward等环境mor
具体⼦环境
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 以创建
该函数的输⼊是
world=Scenario.make_world()
reset_set_world,
reward_ward,
observation_callback= scenario.observation,
info_callback=scenario.done
done_callback=None,
shared_viewer=True
该环境下存在 reset 和 step函数
该step也是调⽤ world 下的 step , 但是该处的step可以确定agent的动作顺序
for i, agent in enumerate(self.agents):
self._set_action(action_n[i], agent, self.action_space[i])
Trainer
在这⾥每⼀个agent都需要建⽴⼀个trainer ,然后添加在在trainer list中
trainer(name ="agent_%d"% i, model = model,
obs_shape_n =[env.observation_space[i].shape for i in range(env.n)]
# env.n 是agent的个数这个地⽅传进去⼀个list
env.action_space =  env.action_space,i = agent的序号,arglist=None
local_q_func =(arglist.adv_policy=='ddpg'))
其中最主要关注的是model,obs_shape_n, env.action_space
其中输⼊model是⼀个 ⽹络,这个⽹络即是critic ⼜是actor
def  mlp_model (input , num_outputs , scope , reuse =False , num_units =64, rnn_cell =None ):
with  tf .variable_scope (scope , reuse =reuse ):
out = input
out = layers .fully_connected (out , num_outputs =num_outputs , activation_fn =None )
return  out
**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
self .act , self .p_train , self .p_update , self .p_debug = p_train (scope =self .name ,
make_obs_ph_n = obs_ph_n ,  act_space_n = act_space_n ,
# 所有agent 的状态空间 ⼀个个tensor      所有agent 的动作空间(list )
p_index =agent_index ,
p_func = model ,    q_func = model ,
# 创建actor 和 critic
optimizer =tf .train .AdamOptimizer (learning_rate =args .lr ),        # 优化算法
grad_norm_clipping =0.5,
# 梯度修剪
local_q_func =local_q_func , num_units =args .num_units )
程序流程
将动作空间创建为概率分布。
为动作空间的概率分布和状态空间⽣成placeholder
⽣成actor  并得到$ P$ 可训练函数
p = p_func (p_input ,(状态的placeholder ),
int (act_pdtype_n [p_index ].param_shape ()[0]),
scope ="p_func", num_units =num_units )
p_func_vars = U .scope_vars (U .absolute_scope_name ("p_func"))
这个地⽅P 是⼀个 输出层的tensor
根据 输出的分布 采样 得到动作
并计算动作的均值 ⽣成P-reg
陕西金号网>热解焚烧炉act_pd 是把p这个function 传到其中,然后flatparam ⼜把这个地⽅取出来 然后 平⽅根 然后 求平均? 这个地⽅为什么要sample 两边??之后,将actor⽣成的action 与 状态 节课 送进去 ⽣成 Q critic 。
并将q的输出求均值 然后 得到总LOSS保皇派
loss = pg_loss + p_reg * 1e-3
然后得到了 critic 部分 即 训练函数 train ,该函数是 输⼊是 状态和 动作 输出是loss
train = U.function(inputs=obs_ph_n + act_ph_n, outputs=loss, updates=[optimize_expr])P P

本文发布于:2024-09-21 12:44:59,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/299379.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:动作   状态   学习
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议