对于结合了神经网络的标准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确实不包含所有动作的奖励。仅适用于某些操作,也许只是一项操作。那么,如何为网络Q(s) = [Q(a_1), …. , Q(a_n) ]设置目标值,而又不对数据库中的状态进行所有奖励?我看到了不同的损失函数/目标值,但都包含奖励。

如你所见;我很困惑。有人帮我吗?网络上有很多教程,但是一般来讲,对这一步骤的描述不佳,对理论的了解甚至更少。

最佳答案

您仅获得与观察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的向量,然后存在一个大小与目标值相同的向量。损失是它们之间差异的平方。

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

关于machine-learning - 设置深度Q学习的目标值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58559415/

10-12 18:10