DQN中,当experience buffer中的每条记录只对应一个action时,如何进行梯度下降?
In DQN, hwo to perform gradient descent when each record in experience buffer corresponds to only one action?
下面的DQN算法
在梯度下降线上,有一点不太明白。
例如,如果我有 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
希望这能解决您的困惑。
下面的DQN算法
在梯度下降线上,有一点不太明白。
例如,如果我有 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
希望这能解决您的困惑。