DDQN 和 DQN 有什么区别?

数据挖掘 强化学习 dqn 深度学习 权重初始化
2021-10-01 14:33:19

我想我不明白 DQN 和 DDQN 在实现上有什么区别。我知道我们在运行 DDQN 期间更改了 traget 网络,但我不明白它是如何在这段代码中完成的。

我们self.target_model.set_weights(self.model.get_weights()) 在 DDQN 的实现中添加了这个,当 DQN 的操作完成时 https://github.com/keon/deep-q-learning self.target_model.set_weights(self.model.get_weights())添加到 DQN 中,以便将 DQN 更改为 DDQN!但这发生在我们休息时跑出去的时候!因为它们之间没有区别!

我脑子里有什么问题?(也许不同之处在于测试?这段代码是用于训练的吗?测试是通过设置探索率=0 来完成的,然后用我们找到的新权重只运行一集?对吗?

因此,此链接中呈现的DQNDDQN有什么区别。

2个回答

特别是,DQN 只是 Q-learning,它使用神经网络作为策略,使用经验回放、目标网络和奖励裁剪等“hacks”。

原始论文中,作者使用卷积网络,它获取您的图像像素,然后将其放入一组卷积层中。但是有几个统计问题:

  1. DQN 逼近一组非常相关的值(DDQN 解决它)
  2. DQN 往往过于乐观。它会过度欣赏处于这种状态,尽管这只是由于统计错误而发生的(双 DQN 解决了​​它)

(s,一个)=(s)+一个(s,一个)

通过解耦估计,我们的 DDQN 可以直观地了解哪些状态是(或不是)有价值的,而无需了解每个状态下每个动作的效果(因为它也在计算V(s))。

我们能够计算 V(s)。这对于其行为不会以相关方式影响环境的状态特别有用。在这种情况下,无需计算每个动作的价值。例如,向右或向左移动仅在有碰撞风险时才重要

正如@emilyfy 所说self.target_model.set_weights(self.model.get_weights())- 目标模型的更新。

据我了解,DQN 和 DDQN 之间的区别在于计算下一个状态的目标 Q 值。在 DQN 中,我们只是在所有可能的动作中取所有 Q 值的最大值。这可能会选择高估的值,因此 DDPG 建议改为估计所选动作的值。选择的操作是我们的策略模型选择的操作。

我查看了代码并且也感到困惑,因为这个位没有实现。然后我意识到他们被注释掉了。此处注释的行将使用当前模型为下一个状态选择动作,并使用目标模型来获取所选动作的 Q 值。他们前段时间在提交中更改了它,不知道为什么。

至于代码self.target_model.set_weights(self.model.get_weights()),则是目标模型的更新。目标模型应该与策略模型具有相同的功能,但 DQN 算法故意将它们分开并不时更新以稳定训练。可以每隔一定数量的步骤执行一次,或者在这种情况下,他们似乎每集都执行一次。