2017-08-28 48 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

在這裏,您可以永遠保持火力(使用一個輸出向右/向左移動),無需使用額外的輸出。 –