如何准确计算深度 Q 学习损失函数?

机器算法验证 最小二乘 深度学习 损失函数 强化学习 q学习
2022-02-12 12:28:54

我对深度 Q 学习网络的损失函数是如何训练的有疑问。我正在使用具有线性输出层和 relu 隐藏层的 2 层前馈网络。

  1. 假设我有 4 个可能的操作。因此,我的网络对当前状态的输出是为了更具体,我们假设stQ(st)R4Q(st)=[1.3,0.4,4.3,1.5]
  2. 现在我采取行动对应于值即第三个行动,并达到一个新的状态at=24.3st+1
  3. 接下来,我计算状态为的前向传递,假设我在输出层获得以下值还假设奖励st+1Q(st+1)=[9.1,2.4,0.1,0.3]rt=2γ=1.0
  4. 损失是否为:

    L=(11.14.3)2

    或者

    L=14i=03([11.1,11.1,11.1,11.1][1.3,0.4,4.3,1.5])2

    或者

    L=14i=03([11.1,4.4,2.1,2.3][1.3,0.4,4.3,1.5])2

谢谢,对不起,我不得不以非常基本的方式写出来……我对所有的符号感到困惑。(我认为正确的答案是第二个......)

2个回答

再复习几遍方程式后。我认为正确的损失如下:

L=(11.14.3)2

我的理由是,一般情况下的 q-learning 更新规则只是更新特定对的 q 值。state,action

Q(s,a)=r+γmaxaQ(s,a)

这个等式意味着更新只发生在一个特定的对和神经 q 网络上,这意味着只计算对应于特定的一个特定输出单元的损失。state,actionaction

在提供的示例中并且Q(s,a)=4.3targetr+γmaxaQ(s,a)=11.1

TLDR:

除非您有很大的行动空间,否则可能无关紧要。

如果您的损失函数是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那么第0th 值保持不变,因此取消,反之亦然。因此,除了当前执行的操作之外,所有项都取消了。但是,分母会根据动作空间不断增加。

对于 的动作空间n = 2

MSE(Q(s)) = 1/n * (squared error for Q(s,a))