MADDPG论文、项目学习记录

 

论文地址:Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments
项目地址:OPENAI-MADDPG    文文大神的项目地址

学习链接:OpenAI-MADDPG 工程简单解析及个人想法    论文解读1  论文翻译

2020.3.15更新

总是有人问关于agent跑飞的问题,我采用的方法是设置边界,超出边界就reset。怎么知道边界和agent的位置?仔细看env的reset和step函数,看怎么初始化agent位置、返回的什么state。参考2020.2.24更新 的MADDPG的总结第五条

超出边界的代码:

 over=False
 for i in range(1000000):

        if over:
            o_n = env.reset()
        if i % 500 == 0:
            o_n = env.reset()
########其他#####
        o_n_next, r_n, d_n, i_n = env.step(a)
        over=False
        for agent_index in range(3):#共三个agent
            agent_state[agent_index]=[o_n_next[agent_index][2],o_n_next[agent_index][3]]
            if min(agent_state[agent_index])<-1 or max(agent_state[agent_index])>1:
                over=True####超出边界,下一次reset

2020.2.24更新

又跑了几遍文文的项目(之前为了训练快一点把迭代次数和replay_buffer都缩小了10倍,共迭代100000次),跑到几万次还reward总是0,agengt总是跑飞了。所以请教了师兄们,终于看到了还不错的结果。实验是论文中的第二种环境simple_tag,做了部分修改后跑到100000次左右就差不多三个红球会围堵一个绿球了,绿球是随机走的。

MADDPG论文、项目学习记录_第1张图片

关于maddpg训练总结:

1、由于agent数量多,如果神经网络单元数太多,训练时间会成倍增加;(代码中是 64 64 2)

2、repaly_buffer尽量大,100000左右;

3、如果环境一直不能得到done的状态,尽量几百步就重新reset,要不然可能会陷在某个状态出不来。(意思就是每次episode不用跑太多step,否则只会增加训练时间。代码中设为500)

4、记得对action增加噪声,让它能够探索从而避免陷在区域;(代码中是0.15的rate)

5、原来的代码版本中没有对agents位置进行限制,导致我第一次训练到几万steps都是一reset就跑飞了。柳师兄说:要设置超过一定边界,就终止然后进入下一轮,不然你replay buffer里面的数据都是离中心点很远的数据,它很难调回来

受到点拨的我豁然开朗,研究env的返回,发现一个 observation 是:

np.concatenate([agent.state.p_vel] + [agent.state.p_pos] + entity_pos + other_pos + other_vel)


#agent.state.p_vel[,]是agent速度(方向?)
#agent.state.p_pos[,]是agent位置,并且初始化的时候在(-1,1)
#entity_pos是与landmark的相对坐标
#other_pos  vel  是其他agent位置、速度。

所以agent i的位置是 (obs[i][2],obs[i][3]),当超出(-1,1),就reset重新开始一次episode。

 

训练的前段数据 和 后段数据记录如下,reward是每隔1000steps的平均奖励:

 

train_step: 6000
reward: [0.22, 0.22, 0.22]
actor_loss: [-2.0437274  -2.87900758 -2.62259293] critic_loss: [0.12340749 2.8190968  0.12756361]
save

train_step: 7000
reward: [0.23, 0.23, 0.23]
actor_loss: [-5.05465889 -8.23776436 -6.32513809] critic_loss: [2.44336033 2.24487686 0.20890047]
save

train_step: 8000
reward: [0.26, 0.26, 0.26]
actor_loss: [ -8.11320496 -17.08517265 -10.99785805] critic_loss: [3.53545403 3.92680407 0.2669549 ]
save

train_step: 9000
reward: [0.29, 0.29, 0.29]
actor_loss: [-10.64159966 -22.43616486 -14.61209869] critic_loss: [2.56931496 0.45125425 3.35923815]
save

train_step: 10000
reward: [0.22, 0.22, 0.22]
actor_loss: [-12.94918251 -24.39775658 -16.53483963] critic_loss: [0.68266761 0.86924815 2.57032204]
save

......

train_step: 159000
reward: [0.43, 0.43, 0.43]
actor_loss: [ -981.07806396 -1000.43408203  -980.44219971] critic_loss: [11.12201786  8.88183784  8.74964428]
save

train_step: 160000
reward: [0.48, 0.48, 0.48]
actor_loss: [ -989.66674805 -1005.87414551  -985.21484375] critic_loss: [ 9.50117397  6.35181093 12.63538933]
save

train_step: 161000
reward: [0.56, 0.56, 0.56]
actor_loss: [ -996.3536377  -1017.53631592  -991.89099121] critic_loss: [ 7.29203272  4.2633419  10.44333839]
save

train_step: 162000
reward: [0.4, 0.4, 0.4]
actor_loss: [ -999.52947998 -1020.84686279 -1001.92944336] critic_loss: [ 4.85817528  2.6355114  10.08203697]
save

train_step: 163000
reward: [0.53, 0.53, 0.53]
actor_loss: [-1007.95214844 -1032.25512695 -1002.4465332 ] critic_loss: [7.88367748 8.31751442 8.78133297]
save

train_step: 164000
reward: [0.32, 0.32, 0.32]
actor_loss: [-1016.01757812 -1039.49230957 -1018.02307129] critic_loss: [10.90445518  2.56790113  8.94460678]
save

 

 

 

2020.2.23  更新

进程:跑了一遍文文大神的three_agent_maddpg项目,对算法有了进一步认识;

目标:修改这个代码,跑自己的环境:MADDPG学习记录--mapping

文文大神的项目介绍:探秘多智能体强化学习-MADDPG算法原理及简单实现  

但是跑了一晚上了,还没跑完-^-。

总结一下,maddpg与普通ddpg主要有两点不同:

1、训练的时候,是每个agent自己训练的,所以N个agent,应该有N*4个网络,分别对应 actor、actor_target、critic、critic_target,四个网络的作用及输出内容和普通ddpg一样,分别得到a、a'、Q、Q‘。其中,target网络是从当前网络每隔一段时间复制过来的。参考俩网络的初始化:

        def actor_network(name):
            with tf.variable_scope(name) as scope:
                x = state_input
                x = tf.layers.dense(x, 64)
                if self.layer_norm:
                    x = tc.layers.layer_norm(x, center=True, scale=True)
                x = tf.nn.relu(x)

                x = tf.layers.dense(x, 64)
                if self.layer_norm:
                    x = tc.layers.layer_norm(x, center=True, scale=True)
                x = tf.nn.relu(x)

                x = tf.layers.dense(x, self.nb_actions,
                                    kernel_initializer=tf.random_uniform_initializer(minval=-3e-3, maxval=3e-3))
                x = tf.nn.tanh(x)
            return x


        def critic_network(name, action_input, reuse=False):
            with tf.variable_scope(name) as scope:
                if reuse:
                    scope.reuse_variables()

                x = state_input
                x = tf.layers.dense(x, 64)
                if self.layer_norm:
                    x = tc.layers.layer_norm(x, center=True, scale=True)
                x = tf.nn.relu(x)

                x = tf.concat([x, action_input], axis=-1)
                x = tf.layers.dense(x, 64)
                if self.layer_norm:
                    x = tc.layers.layer_norm(x, center=True, scale=True)
                x = tf.nn.relu(x)

                x = tf.layers.dense(x, 1, kernel_initializer=tf.random_uniform_initializer(minval=-3e-3, maxval=3e-3))
            return x

2、actor的输入与普通ddpg一样是自己的state;critic的输入就不一样了,除了自己的state和action,还要别人的action。经验池中放了所有agent的s,s',action,reward,done,在train不同的网络时各取所需。参考俩网络的输入输出:

  self.action_output = actor_network(name + "actor")
  self.critic_output = critic_network(name + '_critic',
                 action_input=tf.concat([action_input, other_action_input], axis=1))

在本项目中,对每个agent的训练如下:

MADDPG论文、项目学习记录_第2张图片

 项目的主要训练步骤和变量内容记录在下面,方便以后修改到自己的环境中:(( ⊙ o ⊙ )啊!我的字好丑呀)

 

 

2020.2.20 进程:搞明白算法流程,解决问题

 

1 为什么中心化训练就让环境变得稳定了?怎么解释环境稳定?

师兄的回答:在单智能体马尔科夫决策过程中的转移过程,从state采取action转移到state'是满足一个概率的,这个概率关系无论policy如何变化都不会影响。但是在多智能体环境中,其他智能体的policy改变了,会导致概率变化(因为其他智能体也成为了环境的一部分)。MADDPG中,通过对其他智能体策略的估计,相当于知道了其他智能体下一步动作,来缓解这件事。

2 为什么要对其他agent的策略进行近似预估?具体是如何实现的,能保证收敛嘛?

在没有通信的情况下,智能体互相之间不知道action,所以要预测。那如果可以进行通信,就不需要预测了是吗?

 

2020.2.18  进程:看了论文和工程介绍,明天理清算法流程

存在的疑问:

1 为什么中心化训练就让环境变得稳定了?怎么解释环境稳定?

2 为什么要对其他agent的策略进行近似预估?具体是如何实现的,能保证收敛嘛?

3 看了上面的论文解读1,有了新的问题:根据MADDPG论文和伪代码,观测状态用的是x表示,这个状态包含了自己和队友(或敌人)的所有信息。我的理解是:进入critic和actor的状态信息都是x。但是他文中的意思是,状态信息又分成s1...sn,自己的状态才进入自己的actor。

 

 

你可能感兴趣的:(强化学习)