使用切片的Q网络损失的Tensorflow实现

3
我正在使用TensorFlow实现一个Q网络,如《通过深度强化学习实现人类级别的控制》(Mnih等人,2015)所述。
为了近似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操作,并使用二进制掩码指示要训练的动作,并将其乘以网络的输出。如果问题中的动作是a3,则有效地生成一个向量[0, 0, val_a3, 0, ...]
然后将新操作的结果馈送到损失操作中,TF将对其进行最小化。
问题:
1.这是一个可行的想法吗?还是有更好的解决方法?
2.如何使用TensorFlow解决这个问题?
有一个类似的SO线程(调整张量中的单个值--TensorFlow),但我想使用可以在运行时将其馈送到网络中的tf.placeholder来选择列值。当仅替换该示例中的静态列表时,它似乎无法正常工作。
1个回答

2
这里有一些使用TensorFlow实现深度强化学习的例子,可能对您有所帮助:

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中选择二进制掩码为True的条目,并在其他情况下将其置零。如果您的掩码不是布尔类型,而是与val_array相同类型的数字类型(例如0.0和1.0),则可以使用tf.mul(mask,val_array)。

所以你提供的链接所做的就是为动作设置一个占位符,例如 action_mask = tf.placeholder("float", [None, num_actions])。然后他们执行 masked_action = tf.mul(network_output, action_mask),接着是 tf.reduce_sum(masked_action, reduction_index=[1,])。这似乎是个好主意。至少从我所看到的来看。 - Skeppet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接