我正在使用TensorFlow实现一个Q网络,如《通过深度强化学习实现人类级别的控制》(Mnih等人,2015)所述。
为了近似Q函数,他们使用神经网络。Q函数将状态和动作映射到标量值,称为Q值。即它是一个函数,如Q(s,a)=qvalue。
但是,他们只将状态作为输入,输出一个按给定顺序排列的每个合法动作的元素数量的向量。因此,Q(s,a)变成了Q'(s)=
这引发了如何修改损失函数的问题。损失函数是在目标(y)和Q(s,a)之间的差异上计算的L2损失函数。
我的想法是创建一个新的TF操作,并使用二进制掩码指示要训练的动作,并将其乘以网络的输出。如果问题中的动作是
然后将新操作的结果馈送到损失操作中,TF将对其进行最小化。
问题:
1.这是一个可行的想法吗?还是有更好的解决方法?
2.如何使用TensorFlow解决这个问题?
有一个类似的SO线程(调整张量中的单个值--TensorFlow),但我想使用可以在运行时将其馈送到网络中的
为了近似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
来选择列值。当仅替换该示例中的静态列表时,它似乎无法正常工作。
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