# 2、DDPG算法的简单回顾

DDPG的网络结构 盗用莫烦老师的一张图片来形象的表示DDPG的网络结构，同图片里一样，我们称Actor里面的两个网络分别是动作估计网络和动作现实网络，我们称Critic中的两个网络分别是状态现实网络和状态估计网络：

DDPG学习中的小trick

DDPG的完整流程

# 4、模型实验

`pip install -e .`

DDPG-Actor实现 我们首先来实现单个的DDPG结构 Actor的输入是一个具体的状态，经过两层的全链接网络输出选择的Action。

```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```

DDPG-Critic实现

Critic的输入是state，以及所有Agent当前的action信息：

```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```

Actor的训练目标是Q值的最大化，而Critic的训练目标是最小化Q估计值和Q实际值之间的差距：

```self.actor_optimizer = tf.train.AdamOptimizer(1e-4)

# 最大化Q值
self.actor_loss = -tf.reduce_mean(
critic_network(name + '_critic', action_input=tf.concat([self.action_output, other_action_input], axis=1),
reuse=True))
self.actor_train = self.actor_optimizer.minimize(self.actor_loss)

self.target_Q = tf.placeholder(shape=[None, 1], dtype=tf.float32)
self.critic_loss = tf.reduce_mean(tf.square(self.target_Q - self.critic_output))
self.critic_train = self.critic_optimizer.minimize(self.critic_loss)```

```agent1_ddpg = MADDPG('agent1')

```agent1_action, agent2_action, agent3_action = get_agents_action(o_n, sess, noise_rate=0.2)

#三个agent的行动
a = [[0, i[0][0], 0, i[0][1], 0] for i in [agent1_action, agent2_action, agent3_action]]
#绿球的行动
a.append([0, np.random.rand() * 2 - 1, 0, np.random.rand() * 2 - 1, 0])

o_n_next, r_n, d_n, i_n = env.step(a)```

```agent1_memory.add(np.vstack([o_n[0], o_n[1], o_n[2]]),
np.vstack([agent1_action[0], agent2_action[0], agent3_action[0]]),
r_n[0], np.vstack([o_n_next[0], o_n_next[1], o_n_next[2]]), False)

np.vstack([agent2_action[0], agent3_action[0], agent1_action[0]]),
r_n[1], np.vstack([o_n_next[1], o_n_next[2], o_n_next[0]]), False)

np.vstack([agent3_action[0], agent1_action[0], agent2_action[0]]),
r_n[2], np.vstack([o_n_next[2], o_n_next[0], o_n_next[1]]), False)```

```train_agent(agent1_ddpg, agent1_ddpg_target, agent1_memory, agent1_actor_target_update,
agent1_critic_target_update, sess, [agent2_ddpg_target, agent3_ddpg_target])

train_agent(agent2_ddpg, agent2_ddpg_target, agent2_memory, agent2_actor_target_update,
agent2_critic_target_update, sess, [agent3_ddpg_target, agent1_ddpg_target])

train_agent(agent3_ddpg, agent3_ddpg_target, agent3_memory, agent3_actor_target_update,
agent3_critic_target_update, sess, [agent1_ddpg_target, agent2_ddpg_target])```

# 参考文献：

1、https://blog.csdn.net/qiusuoxiaozi/article/details/79066612 2、https://arxiv.org/pdf/1706.02275.pdf

DQN三大改进(一)-Double DQN

DQN三大改进(二)-Prioritised replay

DQN三大改进(三)-Dueling Network

0 条评论

## 相关文章

### 深度 | 英伟达深度学习Tensor Core全面解析

AI 科技评论消息，不久前，NVIDIA在SIGGRAPH 2018上正式发布了新一代GPU架构——Turing（图灵），黄仁勋称Turing架构是自2006年...

81610

10100

27990

17020

### NAACL2016年度论文：无监督神经网络理解虚构人物关系

【新智元导读】非监督式学习如何确定小说中动态的人物角色关系？本论文提出了一种新的神经网络架构的RMN，通过结合词典学习来对关系描述符进行学习，是深度循环自编码器...

39380

13610

1.9K70

33960

44140

### 深度解密换脸应用 Deepfake

Deepfake 就是前一阵很火的换脸 App，从技术的角度而言，这是深度图像生成模型的一次非常成功的应用，这两年虽然涌现出了很多图像生成模型方面的论文，但大都...

1.1K60