为深度 Q 学习设置目标值

Setting up target values for Deep Q-Learning

对于标准的 Q-Learning 与神经网络的结合,事情或多或少很容易。 一个在与环境交互期间存储 (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 学习 papers/tutorials 改变了 Q 函数的结构。现在应该为状态 s[=32] 提供所有可能操作的 Q 值,而不是为 (s,a) 对提供单个 Q 值=],所以它是 Q(s) 而不是 Q(s,a)

我的问题来了。填充了 (s,a,r,s') 的数据库针对特定状态 s 不包含所有动作的奖励。只为某些人,也许只是一个动作。那么如何在没有数据库中状态 s 的所有奖励的情况下为网络 Q(s) = [Q(a_1), …. , Q(a_n) ] 设置目标值呢?我见过不同的损失 functions/target 值,但都包含奖励。

如你所见;我很困惑。有人帮助我吗?网络上有很多教程,但通常对这一步的描述很少,甚至没有动力去研究理论……

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

当你计算损失值时,你也只是 运行 现有动作的后退,而其他动作的梯度仅为零。 所以,你只需要现有行动的奖励。