3

我正在通过 TensorFlow 中的深度强化学习 (Mnih et al. 2015) 实现人类水平控制中所述的 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 操作并使用一个二进制掩码来指示我想要训练哪个动作并将其与网络的输出相乘。有效地产生一个向量,[0, 0, val_a3, 0, ...]如果有问题的动作是a3.

然后将新操作的结果提供给损失操作,然后 TF 正在最小化损失操作。

问题:

  1. 这是个好主意吗?或者有没有更好的方法来解决这个问题?

  2. TensorFlow如何解决这个问题?

    在类似的东西上有一个 SO 线程(在 Tensor - TensorFlow 中调整单个值),但我想借助tf.placeholder我可以在运行时提供给网络的 a 来选择列值。仅用占位符替换该示例中的静态列表时,它似乎不起作用。

4

1 回答 1

2

在 TensorFlow 中进行 DeepQ 学习的一些实现可能是有用的参考:

https://github.com/asrivat1/DeepLearningVideoGames

https://github.com/nivwusquorum/tensorflow-deepq

https://github.com/mrkulk/deepQN_tensorflow

如果不深入挖掘,我不确定最好的主意是什么,但您绝对可以通过几种不同的方式应用遮罩。

如果您将二进制掩码作为布尔向量,例如 [False, False, True, False] 已经设置,那么您可以执行以下操作:

val_array = ...
binary_mask = tf.constant([False, False, True, False])
result = tf.select(binary_mask, val_array, tf.zeros_like(val_array))

这会从 val_array 中选择 binary_mask 为 True 的条目,否则为零。

如果您的掩码不是布尔值,而是已经是与 val_array 相同类型的数字类型(例如,0.0s 和 1.0s),那么您可以执行 tf.mul(mask, val_array)。

于 2016-01-21T19:16:18.417 回答