Q-Learning 方程( Q(s, a) = r + y * max(Q(s', a')) ) 在 DQN 中是否仅用于计算损失函数?
是的,通常该等式仅用于定义我们的损失。更具体地说,它被重新排列了一点;该等式是我们期望保持的,但它通常在训练期间还不能准确成立。我们从左侧减去右侧来计算(时间差)误差,并将该误差用于损失函数中。
这个方程是循环的吗?假设我将 DQN 用于玩 Atari Breakout,可能的状态数量非常多(假设状态是单个游戏的帧),因此创建所有 Q 值的矩阵效率不高。方程应该更新给定 [state, action] 对的 Q 值,那么在 DQN 的情况下它会做什么?它会递归调用自己吗?如果是这样,则无法计算方程,因为循环永远不会停止。
确实,状态-动作对的空间太大,无法在矩阵/表格中枚举它们。换句话说,我们不能使用 Tabular RL。这正是我们在 DQN 中使用神经网络的原因。您可以将Q(s, a) 视为一个函数。在表格的情况下,Q(s, a) 只是一个函数,它使用s 和a 来索引值的表/矩阵。
在 DQN 和其他深度强化学习方法的情况下,我们使用神经网络来近似这样的“函数”。我们使用s(可能还有a,尽管在DQN 的情况下并非如此)来创建基于该状态(和动作)的特征。对于 DQN 和 Atari 游戏,我们只需将一堆原始图像/像素作为特征。然后将它们用作神经网络的输入。在 NN 的另一端,DQN 提供Q-values 作为输出。在 DQN 的情况下,提供了多个输出;每个动作一个a。因此,总而言之,当您阅读Q(s, a) 时,您应该认为“当我们将s 的特征/图像/像素作为输入插入我们的网络时,对应于a 的输出”。
来自 cmets 的另一个问题:
我想我还是不明白...假设我们在状态为 S 的网络中进行了一次迭代,我们得到了以下输出 [A = 0.8, B = 0.1, C = 0.1](其中 A、B 和 C 是可能的行动)。我们还获得了奖励 R = 1 并将 y(又名 gamma)设置为 0.95 。现在,我们如何将这些变量放入损失函数公式https://imgur.com/a/2wTj7Yn?如果 DQN 输出要采取的行动,我不明白预测是什么?另外,目标Q是多少?请您发布带有放置变量的公式吗?
首先做一个小修正:DQN 没有输出要采取的行动。给定输入(状态s),它为每个动作a 提供一个输出值,这可以解释为输入状态s 的Q(s, a) 值的估计值和对应的动作a特定的输出。这些值通常在之后用于确定要采取的操作(例如,通过选择与最大 Q 值对应的操作),因此在某种意义上,该操作可以从 DQN 的输出派生 ,但 DQN 不直接提供要作为输出的操作。
无论如何,让我们考虑一下示例情况。图像的损失函数为:
loss = (r + gamma max_a' Q-hat(s', a') - Q(s, a))^2
请注意,图像中有一个小错误,它在Q-hat 中有旧状态s,而不是新状态s'。 s' 里面是正确的。
在这个公式中:
-
r 是观察到的奖励
-
gamma (通常)是一个常数值
-
Q(s, a) 是我们的神经网络的输出值之一,当我们提供 s 作为输入时,我们得到它。具体来说,就是我们已经执行的动作a对应的输出值。因此,在您的示例中,如果我们选择在状态 s 中执行操作 A,我们就有 Q(s, A) = 0.8。
-
s' 是我们在状态 s 中执行操作 a 后碰巧最终进入的状态。
-
Q-hat(s', a')(我们为每个可能的后续操作计算一次 a')同样是我们神经网络的输出值之一。这一次,它是当我们提供s' 作为输入(而不是s)时我们得到的值,它同样是对应于动作a' 的输出值。
Q-hat 代替 Q 是因为在 DQN 中,我们通常实际上使用两个不同的神经网络。 Q-values 是使用我们也通过训练修改的相同神经网络计算的。 Q-hat-values 是使用不同的“目标网络”计算的。此目标网络通常是第一个网络的“移动缓慢”版本。它是通过偶尔(例如每 10K 步一次)复制另一个网络并在这些复制操作之间冻结其权重来构建的。