【问题标题】:Q-Learning equation in Deep Q NetworkDeep Q Network 中的 Q-Learning 方程
【发布时间】:2018-11-07 22:11:31
【问题描述】:

我对强化学习完全不熟悉,所以我可能错了。

我的问题是:

  • DQN 中的 Q-Learning 方程 (Q(s, a) = r + y * max(Q(s', a'))) 是否仅用于计算损失函数?

  • 这个方程是循环的吗?假设我将 DQN 用于玩 Atari Breakout,可能的状态数量非常多(假设状态是单个游戏的帧),因此创建所有 Q 值的矩阵效率不高。方程应该更新给定 [state, action] 对的 Q 值,那么在 DQN 的情况下它会做什么?它会递归调用自己吗?如果会,则无法计算方程,因为循环永远不会停止。

我已经尝试找到我想要的,也看过很多教程,但几乎每个人都没有展示背景,只是使用 Keras 之类的 Python 库来实现。

在此先感谢您,如果有些事情听起来很愚蠢,我深表歉意,我就是不明白。

【问题讨论】:

    标签: neural-network deep-learning artificial-intelligence reinforcement-learning q-learning


    【解决方案1】:

    首先,Q 函数用于损失函数和策略。 Q 函数的实际输出和“理想”函数用于计算损失。你的策略是为一个状态中所有可能的动作取 Q 函数的输出的最大值。

    其次,不,它不是经常性的。该方程式实际上与您发布的内容略有不同(也许数学家可以纠正我)。它实际上是Q(s, a) := r + y * max(Q(s', a'))。注意等号前的冒号。这称为赋值运算符,意味着我们更新等式的左侧,使其等于右侧一次(不是循环)。你可以认为它与大多数编程语言中的赋值运算符相同(x = x + 1 不会造成任何问题)。

    当您继续执行更新时,Q 值将通过网络传播,但这可能需要一段时间。

    【讨论】:

      【解决方案2】:

      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 步一次)复制另一个网络并在这些复制操作之间冻结其权重来构建的。

      【讨论】:

      • 非常感谢您的回复!不过,我仍然无法理解一件事:如果函数看起来像 Q(x) = Q(x')(“简而言之”等式),那么这是否意味着将调用 Q(x) 来获取自身?
      • @anx199 Q(s, a) 函数看起来不是那样的。 函数 看起来像一个(非递归)神经网络。然而,我们知道理论上递归方程应该成立。在实践中,这个等式在训练期间还不会成立。在 DQN 中,我们确实尝试以这样一种方式训练我们的网络,即只要我们分别计算 Q(s, a) 和 Q(s', a')(每个都以非递归方式,只需使用我们的神经网络)
      • 我想我还是不明白...假设我们在状态为 S 的网络中进行了一次迭代,我们得到了以下输出 [A = 0.8, B = 0.1, C = 0.1](其中 A,B和C 是可能的操作)。我们还获得了奖励R = 1,并将y(又名gamma)设置为0.95 。现在,我们如何将这些变量放入损失函数公式imgur.com/a/2wTj7Yn?如果 DQN 输出要采取的行动,我不明白 prediction 是什么?另外,target Q 是什么?请您发布带有放置变量的公式吗?在此先感谢,我很抱歉仍然问..
      • 非常感谢!最后,我明白了。非常感谢您的帮助和耐心:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-28
      • 2016-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-29
      相关资源
      最近更新 更多