我根本不熟悉强化学习,所以我可能错了。
我的问题是:
DQN中使用的Q-Learning公式(Q(s, a) = r + y * max(Q(s', a'))
)是否仅用于计算损失函数?
这个等式是否经常出现?假设我使用DQN,比如玩Atari Breakout,可能状态的数量非常大(假设状态是单个游戏的帧),因此创建所有Q的矩阵效率不高 - 值。等式应该更新给定[状态,动作]对的Q值,那么在DQN的情况下它会做什么?它会递归调用自己吗?如果可以的话,就不能计算出这个数字,因为重新定居不会停止。
我已经尝试过找到我想要的内容,而且我已经看过很多教程,但几乎每个人都没有显示背景,只是使用像Keras这样的Python库来实现它。
提前致谢,如果听起来很蠢,我道歉,我只是不明白。
答案 0 :(得分:2)
DQN中使用的Q-Learning等式
( Q(s, a) = r + y * max(Q(s', a')) )
仅用于计算损失函数吗?
是的,通常这个等式仅用于定义我们的损失。更具体地说,它重新排列了一下;这个等式是我们期望保持的,但它通常在训练期间并不准确。我们从左侧减去右侧以计算(时间 - 差异)误差,并且该误差用于损失函数。
这个等式是否经常出现?假设我使用DQN,比如玩Atari Breakout,可能状态的数量非常大(假设状态是单个游戏的帧),因此创建所有Q值的矩阵效率不高。等式应该更新给定[状态,动作]对的Q值,那么在DQN的情况下它会做什么?它会递归调用自己吗?如果愿意的话,就无法计算出这个数字,因为重新定位不会停止。
实际上,状态 - 动作对的空间太大而无法在矩阵/表中枚举它们。换句话说,我们不能使用 Tabular RL。这正是我们在DQN中使用神经网络的原因。您可以将Q(s, a)
视为一项功能。在表格的情况下,Q(s, a)
只是一个使用s
和a
索引到值/表格矩阵的函数。
在DQN和其他Deep RL方法的情况下,我们使用神经网络近似这样的“函数”。我们使用s
(可能a
(尽管不是DQN)来创建基于该状态(和操作)的功能。在DQN和Atari游戏的情况下,我们只需将一堆原始图像/像素作为特征。然后将它们用作神经网络的输入。在NN的另一端,DQN提供Q
- 值作为输出。在DQN的情况下,提供多个输出;每个动作a
一个。因此,总之,当您阅读Q(s, a)
时,当我们将a
的要素/图片/像素作为输入插入我们的网络时,您应该考虑“与s
对应的输出”。
评论中的进一步提问:
我想我仍然没有得到这个想法...假设我们通过状态为S的网络进行了一次迭代,我们得到了以下输出
[A = 0.8, B = 0.1, C = 0.1]
(其中A
,{{1} }和B
是可能的行动)。我们还获得了奖励C
并将y(a.k.a. gamma)设置为0.95。现在,我们如何将这些变量放入损失函数公式https://imgur.com/a/2wTj7Yn?如果DQN输出采取的行动,我不明白预测是什么?另外,目标Q是什么?你可以用放置的变量发布公式吗?
首先进行小的修正:DQN不输出要采取的动作。给定输入(状态R = 1
),它为每个操作s
提供一个输出值,可以将其解释为输入状态a
的{{1}}值的估计值与该特定输出对应的动作Q(s, a)
。通常在之后使用这些值来确定要采取的操作(例如,通过选择与最大s
值对应的操作),因此在某种意义上,操作可以从输出中派生 DQN,但DQN不直接提供采取行动的行动。
无论如何,让我们考虑一下示例情况。图像中的损失函数是:
a
请注意,图片中存在一个小错误,它在Q
而不是新状态loss = (r + gamma max_a' Q-hat(s', a') - Q(s, a))^2
中具有旧状态s
。 Q-hat
就是正确的。
在这个公式中:
s'
是观察到的奖励s'
(通常)是一个常数值r
是神经网络的输出值之一,当我们提供gamma
作为输入时,我们得到它们。具体来说,它是与我们已执行的操作Q(s, a)
对应的输出值。因此,在您的示例中,如果我们选择在州s
中执行操作a
,则我们会A
。s
是我们在州Q(s, A) = 0.8
执行行动s'
后最终落后的状态。a
(我们为每个可能的后续操作计算一次s
)同样是我们神经网络的输出值之一。这一次,当我们提供Q-hat(s', a')
作为输入(而不是a'
)时,它是我们得到的值,并且它将是与行动s'
对应的输出值。 s
代替a'
,因为在DQN中,我们通常使用两个不同的神经网络。 Q-hat
- 使用我们也通过训练修改的相同神经网络计算值。 Q
- 使用不同的“目标网络”计算值。此目标网络通常是第一个网络的“慢速移动”版本。它偶尔构建(例如每10K步骤一次)复制另一个网络,并将其权重冻结在这些复制操作之间。
答案 1 :(得分:0)
首先,Q函数既用于损失函数,也用于策略。 Q函数的实际输出和“理想”函数用于计算损失。将Q函数输出的最高值用于状态中的所有可能操作是您的策略。
其次,不,这不是经常性的。这个等式实际上与你发布的内容略有不同(也许数学家可以纠正我)。它实际上是Q(s, a) := r + y * max(Q(s', a'))
。注意等号前面的冒号。这称为赋值运算符,意味着我们更新等式的左侧,使其等于右侧一次(不是循环)。您可以将其视为与大多数编程语言中的赋值运算符相同(x = x + 1
不会导致任何问题)。
无论如何,Q值会在您继续执行更新时传播通过网络,但可能需要一段时间。