我对深度 Q 学习网络的损失函数是如何训练的有疑问。我正在使用具有线性输出层和 relu 隐藏层的 2 层前馈网络。
- 假设我有 4 个可能的操作。因此,我的网络对当前状态的输出是。为了更具体,我们假设
- 现在我采取行动对应于值即第三个行动,并达到一个新的状态。
- 接下来,我计算状态为的前向传递,假设我在输出层获得以下值。还假设奖励和。
损失是否为:
或者
或者
谢谢,对不起,我不得不以非常基本的方式写出来……我对所有的符号感到困惑。(我认为正确的答案是第二个......)
我对深度 Q 学习网络的损失函数是如何训练的有疑问。我正在使用具有线性输出层和 relu 隐藏层的 2 层前馈网络。
损失是否为:
或者
或者
谢谢,对不起,我不得不以非常基本的方式写出来……我对所有的符号感到困惑。(我认为正确的答案是第二个......)
再复习几遍方程式后。我认为正确的损失如下:
我的理由是,一般情况下的 q-learning 更新规则只是更新特定对的 q 值。
这个等式意味着更新只发生在一个特定的对和神经 q 网络上,这意味着只计算对应于特定的一个特定输出单元的损失。
在提供的示例中并且是。
除非您有很大的行动空间,否则可能无关紧要。
如果您的损失函数是MSE,那么计算的损失是术语特定损失的一半(如果动作空间 = 2)。如果您的动作空间很大并且可能会减慢训练速度,这可能很重要,因为损失函数的斜率减少了等于问题的动作空间的因子。
next_q = self.model.predict(next_obss)
next_q[np.where(dones)] = np.zeros([self.action_shape])
qs = self.model.predict(obss)
qs[range(len(qs)), actions] = rewards + GAMMA * np.max(next_q, axis=1)
h = self.model.fit(obss, qs, verbose=0)
正如您所提到的,仅更新与当前执行的操作相对应的 q 值。因此,损失分子保持不变。
假设动作空间为 2(可能值:{0,1})。
L = 1/2[ Q - Q_old ]^2 # Capital implying Vector
L = 1/2[ (q_0 - q_old_0)^2 + (q_1 - q_old_1)^2]
如果选择的动作是,1
那么第0
th 值保持不变,因此取消,反之亦然。因此,除了当前执行的操作之外,所有项都取消了。但是,分母会根据动作空间不断增加。
对于 的动作空间n = 2
,
MSE(Q(s)) = 1/n * (squared error for Q(s,a))