我正在通过 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 正在最小化损失操作。
问题:
这是个好主意吗?或者有没有更好的方法来解决这个问题?
TensorFlow如何解决这个问题?
在类似的东西上有一个 SO 线程(在 Tensor - TensorFlow 中调整单个值),但我想借助
tf.placeholder
我可以在运行时提供给网络的 a 来选择列值。仅用占位符替换该示例中的静态列表时,它似乎不起作用。