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

5

主题

9

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2022-9-21 15:33:27 | 显示全部楼层
[只有tensorflow版本,代码地址](https://github.com/rosewang2008/rmaddpg)
[这个代码看起来是根据maddpg改进的](https://github.com/openai/maddpg.git)
[原文](https://arxiv.org/pdf/2002.06684.pdf)
[原文解读](heu御林军:用于局部观测和通信受限场景下的R-MADDPG)
智能体的配置

一般把装有强化学习算法(rmaddp算法的构建,网络更新过程)看作智能体。

  • 每个智能体都有自己的rmaddpg
  现在看rmaddpg这个代码,他是基于maddpg的。每个智能体都有自己的actor和critic网络。  网络结构如果是
    LSTM的循环结构。每一次一个episode结束之后,lstm的隐藏层都会重置为零。
  代码中,在train.py中,用get_trainers()函数来构建每个智能体的trainer,而这个trainer就是基于rmaddpg的。

  • 每个智能体有自己的buffer
  通过agent.experience添加到buffer
  当网络结构是全连接时:
obs_n, action_n, rew_n, new_obs_n, done_n, new_episode
  当网络结构是循环的时:
obs_n, action_n, rew_n, new_obs_n, done_n, new_episode
p_in_c_n[0], p_in_h_n[0], p_out_c_n[0], p_out_h_n[0],(actor网络)
q_in_c_n[0], q_in_h_n[0], q_out_c_n[0], q_out_h_n[0],(critic网络)
    (c和h分别代表lstm隐层的细胞状态和隐状态)
    (循环结构的buffer中竟然要保存隐藏层的中间结果,这是我没想到的)

  •   update
    我开始自己写过一次在maddpg中加rnn,我最初的想法是一个episode的数据需要step by step这样训练。
    但是这个代码是把batch_size个episode的数据,一起训练,原因就是buffer中保存了隐藏层变量。

  • 行为选择
  根据actor网络进行选择。
  input:当前智能体自己的观测、因层输入变量(self.p_c, self.p_h)隐层的值由上一时刻输出。
  output:每个行为的概率,以及隐藏层的两个参数。
rmaddpg解析


  • RNN网络独有的隐藏层
  隐藏层的创建(create_init_state),初始化为0矩阵。

(写在前面的话,习惯了pytorch,偶尔看tensorflow有点不适应很正常,这里需要注意的是_q_train,_p_train返回的是函数,不是实值。里面的`U.function`主要就是建立函数的映射。)

  • critic网络的构建与更新方式:def _q_train:
  critic网络,采用全局信息训练,不会区分智能体的id。
采用tensorflow的一个特点,就是网络没有输入之前会有一对占位符的初始化:
obs_ph_n,act_ph_n (这俩是输入) target_ph (这个是输出目标,是根据bellman方程计算的。)
q_func : q_model(lstm_model:lstm_fc_model,一个包含lstm的网络/mlp_model:mlp_model,一个三层全连接网络)
根据scope指定的名字区分出eval网络("q_func")和target网络("target_q_func")
input:tf.concat(obs_ph_n + act_ph_n + q_c_ph_n + q_h_ph_n, -1)观测、行为、隐藏层的值
output:q, q_state_out / target_q, target_q_state_out : Q值,隐藏层返回值
rnn需要提前定义隐层变量:p_c_ph_n, p_h_ph_n, q_c_ph_n, q_h_ph_n (所有智能体的)
q_func_vars/target_q_func_vars: q_func(eval网络("q_func")和target网络("target_q_func"))的参数
q_loss: q_func的loss
在loss优化的过程中用到了梯度剪裁(clip)的方法。
(看到一半,我只能说在强化学习领域tensorflow逐渐被pytorch代替是有原因的,这个结构看起来不清晰)
U.function:建立一种函数的映射关系。[可以参考](theano学习--theano.function_阿卡蒂奥的博客-CSDN博客_theano.function)
由这个函数衍生了一些映射:q_values、target_q_values(q_func输入与输出的映射)、train(优化的映射)、update_target_q(用eval更新target的映射)
这个函数就最终返回这四个映射。

  • actor网络的构建与更新方式:def _p_train:
actor网络,采用当前agent的信息,利用agent_id。
p_func : p_model(lstm_model:lstm_fc_model,一个包含lstm的网络/`mlp_model:`mlp_model,一个三层全连接网络)
根据scope指定的名字区分出eval网络("p_func")和target网络("target_p_func")
input:tf.concat(obs_ph_n[p_index] + q_c_ph_n + q_h_ph_n, -1)观测(只有自己的哦!!!p_index代表当前智能体)、隐藏层的值
output:p, p_state_out / target_p, target_p_state_out : Q值,隐藏层返回值
rnn需要提前定义隐层变量:p_c_ph_n, p_h_ph_n, q_c_ph_n, q_h_ph_n (所有智能体的)
p_func_vars/target_p_func_vars: p_func(eval网络("p_func")和target网络("target_p_func"))的参数
act_pd:当前智能体的每个行为的概率
act_sample:得到的行为(onehot)
p_reg:对act_pd取平均值,降维(这个其实是待优化的一项,希望通过actor找到state对应最大的Q)
把当前智能体计算的最好的行为带入到critic(即q_func)中,通过策略梯度的方法,要保证critic最大,采取梯度上升的方法,
但是优化loss梯度下降,这里取负号。

[maddpg代码调试感悟](桃子君:多智能体强化学习调代码有感(一)-- MADDPG)
回复

举报 使用道具

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