本文介绍Deep Q Network的一种改进形式dueling DQN的设计与实现过程:
Dueling DQN将DQN中神经网络的中间层拆分成两个网络,一个为Value
,一个为Advantage
,然后将两个网络的值相加得到最终的网络的输出。
网络结构如下图所示:
在Dueling DQN中,神经网络的输出由下面的公式确定:
$$
Q(s,a;\theta,\alpha,\beta) = V(s;\theta,\beta)+A(s,a;\theta,\alpha)
$$
下面介绍Dueling DQN的具体实现过程:
用到的库如下:
Python:3.5.3
TensorFlow:1.0.1
gym:0.8.1
本文依旧用到gym
中的CartPole-v0
来完成算法。
代码大部分与DQN的代码相似,只是建立网络模型的部分不同,神将网络结构设计的代码部分如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| def _build_net(self): def build_layers(s, c_names, n_l1, w_initializer, b_initializer): with tf.variable_scope('l1'): w1 = tf.get_variable('w1', [self.n_features, n_l1], initializer=w_initializer, collections=c_names) b1 = tf.get_variable('b1', [1, n_l1], initializer=b_initializer, collections=c_names) l1 = tf.nn.relu(tf.matmul(s, w1) + b1) with tf.variable_scope('Value'): w2 = tf.get_variable('w2', [n_l1, 1], initializer=w_initializer, collections=c_names) b2 = tf.get_variable('b2', [1, 1], initializer=b_initializer, collections=c_names) self.V = tf.matmul(l1, w2) + b2 with tf.variable_scope('Advantage'): w2 = tf.get_variable('w2', [n_l1, self.n_actions], initializer=w_initializer, collections=c_names) b2 = tf.get_variable('b2', [1, self.n_actions], initializer=b_initializer, collections=c_names) self.A = tf.matmul(l1, w2) + b2 with tf.variable_scope('Q'): out = self.V + (self.A - tf.reduce_mean(self.A, axis=1, keep_dims=True)) return out
|
其他部分的代码与DQN中的代码基本相似。
最终运行程序可以得到如下的损失函数:
Dueling DQN的网络结构如下图:
从结构图中可以看到,Dueling DQN中将DQN中的l2
节点改变成了Advantage
,Value
和Q
三个结构。
参考资料: