下面的DQN算法
在梯度下降线上,有些事情我不太了解。
例如,如果我有8个动作,则输出Q是8个分量的向量,对吗?
但是对于D中的每个记录,返回y_i只是给定动作的标量。如何在(y_i-Q)^ 2上执行梯度下降?我认为不能保证在一次小批量生产中,我会获得某个状态的所有动作的回报。
答案 0 :(得分:1)
您只需要根据已选择其作用的Q值来计算损失。在您的示例中,假设您的迷你批处理中的给定行的操作为3
。然后,获得相应的目标y_3
,然后损失为(Q(s,3) - y_3)^2
,基本上,您将其他操作的损失值设置为零。您可以通过在gather_nd
中使用tensorflow
或通过获取one-hot-encode
版本的操作,然后将该one-hot-encode
向量乘以Q值向量来实现此目的。使用one-hot-encode
向量,您可以编写:
action_input = tf.placeholder("float",[None,action_len])
QValue_batch = tf.reduce_sum(tf.multiply(T_Q_value,action_input), reduction_indices = 1)
其中action_input = np.eye(nb_classes)[your_action (e.g. 3)]
。 gather_nd
可以遵循相同的过程:
https://www.tensorflow.org/api_docs/python/tf/gather_nd
我希望这能解决您的困惑。