设置深度Q学习的目标值

时间:2019-10-25 13:23:42

标签: machine-learning deep-learning reinforcement-learning

对于将标准Q学习与神经网络结合起来,事情或多或少容易。 一个在与环境互动期间存储(s,a,r,s’)并使用

target = Qnew(s,a) = (1 - alpha) * Qold(s,a) + alpha * ( r + gamma * max_{a’} Qold(s’, a’) )

作为神经网络目标值的

近似于Q函数。因此,ANN的输入为(s,a),输出为标量 Qnew(s,a)。深入的Q学习论文/教程改变了Q函数的结构。现在应该为状态 s 提供所有可能动作的Q值,而不是为对(s,a)提供单个Q值。 Q(s),而不是 Q(s,a)

这是我的问题。充满(s,a,r,s’)的数据库针对特定状态 s 进行操作,但并不包含所有操作的奖励。仅适用于某些操作,可能只是一项操作。因此,如何在网络中没有设置状态 s 的所有奖励的情况下为网络Q(s) = [Q(a_1), …. , Q(a_n) ]设置目标值呢?我看到了不同的损失函数/目标值,但都包含奖励。

如您所见;我很困惑。有人帮我吗?网络上有很多教程,但是通常对这一步骤的描述不佳,对理论的了解甚至没有动力……

1 个答案:

答案 0 :(得分:2)

您只需获得与观察值s,a,r,s'上存在的动作相对应的目标值。基本上,您将获得所有操作的目标值,然后在编写自己的操作时选择最大的操作值:max_{a'} Qold(s', a')。然后,将其添加到r(s,a),结果是目标值。例如,假设您有10个动作,观察值为(s_0, a=5, r(s_0,a=5)=123, s_1)。然后,目标值为r(s_0,a=5)+ \gamma* \max_{a'} Q_target(s_1,a')。例如,使用tensorflow可能类似于:

Q_Action = tf.reduce_sum(tf.multiply(Q_values,tf.one_hot(action,output_dim)), axis = 1) # dim: [batchSize , ]

其中Q_values的大小为batchSize, output_dim。因此,输出是batchSize大小的向量,然后存在与目标值大小相同的向量。损失是它们之间差异的平方。

当计算损失值时,也只对现有操作进行向后运行,而其他操作的梯度仅为零。 因此,您只需要现有操作的奖励即可。