DQN中,当experience buffer中的每条记录只对应一个action时,如何进行梯度下降?

In DQN, hwo to perform gradient descent when each record in experience buffer corresponds to only one action?

下面的DQN算法

Source

在梯度下降线上,有一点不太明白。

例如,如果我有 8 个动作,那么输出 Q 是一个包含 8 个分量的向量,对吧?

但是对于 D 中的每条记录,return y_i 只是相对于给定操作的标量。如何对 (y_i - Q)^2 执行梯度下降?我认为不能保证在一个小批量中我有一个状态的所有动作 returns。

你只需要在选择了它的动作的Q-value上计算损失。在您的示例中,假设对于 mini-batch 中的给定行,操作是 3。然后,你得到相应的目标,y_3,然后损失就是(Q(s,3) - y_3)^2,基本上你把其他动作的损失值设置为零。您可以通过在 tensorflow 中使用 gather_nd 或获取 one-hot-encode 版本的动作然后将该 one-hot-encode 向量乘以 Q-value 向量来实现此目的。使用 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

希望这能解决您的困惑。