在DQN中,当体验缓冲区中的每条记录仅对应一个动作时,如何执行梯度下降?

时间:2019-05-23 07:43:44

标签: reinforcement-learning

下面的DQN算法

enter image description here

Source

在梯度下降线上,有些事情我不太了解。

例如,如果我有8个动作,则输出Q是8个分量的向量,对吗?

但是对于D中的每个记录,返回y_i只是给定动作的标量。如何在(y_i-Q)^ 2上执行梯度下降?我认为不能保证在一次小批量生产中,我会获得某个状态的所有动作的回报。

1 个答案:

答案 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

我希望这能解决您的困惑。