我正在通過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將其最小化。
問題:
這是一個完善的想法?或者有更好的解決方法嗎?
如何用TensorFlow解決這個問題?
在類似的東西上有一個SO線程(Adjust Single Value within Tensor -- TensorFlow),但我想在
tf.placeholder
的幫助下選擇列值,我可以在運行時將它們提供給網絡。當用佔位符替換那些示例中的靜態列表時,它似乎不工作。
那麼你提供的鏈接是做一個像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