2

我正在通過TensorFlow中的深層強化學習(Mnih et al。2015)在人類控制中實現Q網絡。Tensorflow通過切片丟失Q網的實現

爲了近似他們使用神經網絡的Q函數。 Q函數將狀態和動作映射爲標量值,稱爲Q值。即它是一個函數,如Q(s,a)= qvalue。

但是,不是將狀態和動作都作爲輸入,而只是將狀態作爲輸入,並以給定的順序輸出每個法律行爲具有一個元素的向量。因此Q(s,a)變成Q'(s)= array([val_a1, val_a2, val_a3,...]),其中val_a1是Q(s,a1)。

這引發瞭如何修改損失函數的問題。損失函數是根據目標(y)和Q(s,a)的差異計算出的L2損失函數。

我的想法是創建一個新的TF操作,並使用一個二進制掩碼來指示我想要訓練哪個動作並將其與網絡輸出相乘。如果有問題的動作是a3,則有效生成像[0, 0, val_a3, 0, ...]這樣的載體。

然後將新操作的結果輸入到損失操作中,然後TF將其最小化。

問題:

  1. 這是一個完善的想法?或者有更好的解決方法嗎?

  2. 如何用TensorFlow解決這個問題?

    在類似的東西上有一個SO線程(Adjust Single Value within Tensor -- TensorFlow),但我想在tf.placeholder的幫助下選擇列值,我可以在運行時將它們提供給網絡。當用佔位符替換那些示例中的靜態列表時,它似乎不工作。

回答

2

有幾個實現在那裏做DeepQ在TensorFlow可能是有用的參考資料,以檢查學習:

https://github.com/asrivat1/DeepLearningVideoGames

https://github.com/nivwusquorum/tensorflow-deepq

https://github.com/mrkulk/deepQN_tensorflow

我如果沒有深入挖掘,我不確定最好的想法是什麼,但你肯定可以應用通過幾種不同的方式使用面膜。

如果你有你的二進制掩碼爲一個布爾向量例如,[假,假,真,假]成立已,那麼你可以做:

val_array = ... 
binary_mask = tf.constant([False, False, True, False]) 
result = tf.select(binary_mask, val_array, tf.zeros_like(val_array)) 

這將選擇從val_array入口徘徊無論binary_mask是否則爲真,零。

如果您的掩碼不是布爾值,但已經是與val_array相同類型的數字類型(例如,0.0s和1.0s),那麼您可以執行tf.mul(mask,val_array)。

+0

那麼你提供的鏈接是做一個像action_mask = tf.placeholder(「float」,[None,num_actions])這樣的動作的佔位符。然後他們'masked_action = tf.mul(network_output,action_mask)',然後是'tf.reduce_sum(masked_action,reduction_index = [1,])''。這似乎是一個好主意。至少從我所知道的。 – Skeppet