2017-08-28 174 views
0

我试图修改和实现异步优势Actor Actor(A3C)模型的Google模式。网上有很多例子让我开始了,但我遇到了试图扩大样本的问题。强化学习a3c具有多个独立输出

我可以找到的所有例子都集中在pong上,例如它有一个基于状态的输出向左或向右或者保持不动。我试图扩展到的是一个系统,也有一个单独的关闭输出。在pong的情况下,这会提高你的速度。

我把代码放在我的代码上可以找到here。它正在玩厄运,但它仍然有相同的左右,但也是一个火按钮,而不是保持静止。我正在研究如何修改此代码,使得火灾是一种独立于运动的行为。

我知道我可以很容易地从模型中添加另一个单独的输出,这样的输出会是这个样子:

self.output = slim.fully_connected(rnn_out,a_size, 
    activation_fn=tf.nn.softmax, 
    weights_initializer=normalized_columns_initializer(0.01), 
    biases_initializer=None) 
self.output2 = slim.fully_connected(rnn_out,1, 
    activation_fn=tf.nn.sigmoid, 
    weights_initializer=normalized_columns_initializer(0.01), 
    biases_initializer=None) 

我挣扎的事情是我有多么然后做修改值输出并重新定义损失函数。价值仍然与两个产出的组合有关。或者是否有独立的输出值用于每个独立输出。我觉得它应该仍然只是一个输出值,但我不确定我如何使用这个值并修改损失函数来考虑这一点。

我想增加一个独立的术语损失函数,使得计算会是这个样子:

self.actions_1 = tf.placeholder(shape=[None],dtype=tf.int32) 
self.actions_2 = tf.placeholder(shape=[None],dtype=tf.float32) 
self.actions_onehot = tf.one_hot(self.actions_1,a_size,dtype=tf.float32) 
self.target_v = tf.placeholder(shape=[None],dtype=tf.float32) 
self.advantages = tf.placeholder(shape=[None],dtype=tf.float32) 

self.responsible_outputs = tf.reduce_sum(self.output1 * self.actions_onehot, [1]) 
self.responsible_outputs_2 = tf.reduce_sum(self.output2 * self.actions_2, [1]) 

#Loss functions 
self.value_loss = 0.5 * tf.reduce_sum(tf.square(self.target_v - tf.reshape(self.value,[-1]))) 
self.entropy = - tf.reduce_sum(self.policy * tf.log(self.policy)) 
self.policy_loss = -tf.reduce_sum(tf.log(self.responsible_outputs)*self.advantages) - 
    tf.reduce_sum(tf.log(self.responsible_outputs_2)*self.advantages) 
self.loss = 0.5 * self.value_loss + self.policy_loss - self.entropy * 0.01 

我期待知道如果我在正确的轨道上,或有是我可以扩展的资源或例子。

回答

1

首先,您提到的示例不需要两个输出节点。一个具有连续输出值的输出节点就足以解决问题。你也不应该使用占位符来获得优势,而应该使用折扣奖励。

self.discounted_reward = tf.placeholder(shape=[None],dtype=tf.float32) 
self.advantages = self.discounted_reward - self.value 

而且在计算政策性亏损,你必须使用tf.stop_gradient以防止政策学习value节点梯度反馈贡献。

self.policy_loss = -tf.reduce_sum(tf.log(self.responsible_outputs)*tf.stop_gradient(self.advantages)) 
+0

在这个例子中,有三个输出向左右燃烧。我想独立于运动开火,所以你可以同时做两个。你能告诉我一个这样的例子吗?感谢您的其他提示。 –

+0

在这里,您可以永远保持火力(使用一个输出向右/向左移动),无需使用额外的输出。 –