我正在通过TensorFlow中的深度强化学习(Mnih等人,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解决这个问题?
在类似的东西(Adjust Single Value within Tensor -- TensorFlow)上有一个SO线程,但我想在tf.placeholder
的帮助下选择列值,我可以在运行时将其提供给网络。当用占位符替换该示例中的静态列表时,它似乎不起作用。
答案 0 :(得分: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)。