2017-08-28 8 views
0

非同期Advantage Actor Critic(A3C)モデルのgooglesパターンを修正して実装しようとしています。そこには私が始めたたくさんの例がありますが、私はサンプルを拡張しようとする問題にぶち当たっています。複数の独立した出力を持つ強化学習a3c

すべての例私は、左または右の状態ベースの出力を持つか、または静止している例として、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) 

私は苦労しています事は、私は値出力を変更しなければならないのか、その後で損失関数を再定義します。値は2つの出力の組み合わせに依然として結び付けられています。または、独立した出力のそれぞれに別々の値出力があります。値として1つの出力にしかならないような気がしますが、私はそれらの1つの値をどのように使用しているのか不明ですし、これを考慮に入れて損失関数を変更します。

計算は次のようなものになりますように、私は損失関数に別の用語を追加することを考えていた:私は、または場合は、ここに正しい軌道に乗っていますかどうかを知るために探しています

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

最初に言及している例では、2つの出力ノードは必要ありません。連続出力値を持つ1つの出力ノードで十分です。また、プレースホルダを使用するべきではありませんが、代わりに値引きされた報酬のために使用してください。

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

は、ポリシーの損失を計算しながら、あなたは、政策学習のためのvalueノード勾配フィードバック寄与を防ぐためにtf.stop_gradientを使用する必要があります。

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

この例では、右に3つの出力が残っています。私はあなたが一度に両方を行うことができるように、動きから独立して火を作りたいです。私にもこれの例を示すことができますか?他のヒントもありがとう。 –

+0

ここでは、永遠に火をつけておくことができます(1つの出力を左右に動かす)。余分な出力を使う必要はありません。 –

関連する問題