深度强化学习课程文档

深度 Q 学习算法

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

深度 Q 学习算法

我们了解到深度 Q 学习使用深度神经网络来近似状态中每个可能动作的不同 Q 值(价值函数估计)。

不同之处在于,在训练阶段,我们不是像在 Q 学习中那样直接更新状态-动作对的 Q 值

Q Loss

在深度 Q 学习中,我们创建一个损失函数,该函数比较我们的 Q 值预测和 Q 目标,并使用梯度下降来更新深度 Q 网络的权重,以更好地近似我们的 Q 值

Q-target

深度 Q 学习训练算法有两个阶段

  • 采样:我们执行动作并将观察到的经验元组存储在回放记忆中
  • 训练:随机选择一个小批量的元组,并使用梯度下降更新步骤从此批次中学习
Sampling Training

这并不是与 Q 学习相比唯一的区别。深度 Q 学习训练可能会受到不稳定性的影响,主要是因为结合了非线性 Q 值函数(神经网络)和自举(当我们使用现有估计值而不是实际完整回报来更新目标时)。

为了帮助我们稳定训练,我们实施了三种不同的解决方案

  1. 经验回放,以更有效地利用经验
  2. 固定 Q 目标以稳定训练
  3. 双重深度 Q 学习,以处理 Q 值过高估计的问题

让我们逐一了解它们!

经验回放以更有效地利用经验

我们为什么要创建回放记忆?

深度 Q 学习中的经验回放有两个功能

  1. 在训练期间更有效地利用经验。通常,在在线强化学习中,智能体与环境交互,获得经验(状态、动作、奖励和下一个状态),从中学习(更新神经网络),然后丢弃它们。这效率不高。

经验回放通过更有效地使用训练经验来提供帮助。我们使用回放缓冲区来保存经验样本,我们可以在训练期间重复使用这些样本。

Experience Replay

⇒ 这使得智能体可以从相同的经验中学习多次

  1. 避免忘记以前的经验(又名灾难性干扰或灾难性遗忘)并减少经验之间的相关性.
  • 灾难性遗忘:如果我们向神经网络提供顺序的经验样本,我们遇到的问题是它倾向于忘记之前的经验,因为它获得了新的经验。例如,如果智能体在第一关,然后在第二关,而第二关是不同的,它可能会忘记如何在第一关中表现和玩耍。

解决方案是创建一个回放缓冲区,在与环境交互时存储经验元组,然后采样一小批元组。这防止了网络仅学习它之前立即做过的事情。

经验回放还有其他好处。通过随机采样经验,我们消除了观察序列中的相关性,并避免了动作值发生灾难性振荡或发散。

在深度 Q 学习伪代码中,我们初始化一个容量为 N 的回放记忆缓冲区 D(N 是您可以定义的超参数)。然后,我们将经验存储在内存中,并采样一批经验,以在训练阶段馈送到深度 Q 网络。

Experience Replay Pseudocode

固定 Q 目标以稳定训练

当我们想要计算 TD 误差(又名损失)时,我们计算 TD 目标(Q 目标)和当前 Q 值(Q 的估计值)之间的差异

但是,我们 对真实的 TD 目标没有任何概念。我们需要估计它。使用贝尔曼方程,我们看到 TD 目标只是在该状态下采取该动作的奖励,加上下一个状态的折扣最高 Q 值。

Q-target

然而,问题是我们使用相同的参数(权重)来估计 TD 目标 Q 值。因此,TD 目标和我们正在更改的参数之间存在显着的相关性。

因此,在训练的每一步,我们的 Q 值和目标值都会发生偏移。我们正在接近我们的目标,但目标也在移动。这就像追逐移动的目标!这可能会导致训练中出现明显的振荡。

这就像你是一个牛仔(Q 估计),你想抓住一头牛(Q 目标)。你的目标是更接近(减少误差)。

Q-target

在每个时间步,你都在试图接近牛,牛也在每个时间步移动(因为你使用相同的参数)。

Q-target Q-target 这导致了奇异的追逐路径(训练中明显的振荡)。 Q-target

相反,我们在伪代码中看到的是,我们

  • 使用 具有固定参数的单独网络 来估计 TD 目标
  • 每 C 步从我们的深度 Q 网络复制参数 以更新目标网络。
Fixed Q-target Pseudocode

双重 DQN

双重 DQN 或双重深度 Q 学习神经网络是由 Hado van Hasselt 提出的。这种方法解决了 Q 值过高估计的问题。

要理解这个问题,请记住我们如何计算 TD 目标

TD target

通过计算 TD 目标,我们面临一个简单的问题:我们如何确定下一个状态的最佳动作是具有最高 Q 值的动作?

我们知道 Q 值的准确性取决于我们尝试了哪些动作 以及 我们探索了哪些相邻状态。

因此,在训练开始时,我们没有关于要采取的最佳动作的足够信息。因此,将最大 Q 值(这是有噪声的)作为要采取的最佳动作可能会导致误报。如果非最优动作经常被赋予比最优最佳动作更高的 Q 值,那么学习将变得复杂。

解决方案是:当我们计算 Q 目标时,我们使用两个网络将动作选择与目标 Q 值生成解耦。我们

  • 使用我们的 DQN 网络 来选择下一个状态要采取的最佳动作(具有最高 Q 值的动作)。
  • 使用我们的 目标网络 来计算在该状态下采取该动作的目标 Q 值。

因此,双重 DQN 帮助我们减少 Q 值的过高估计,并因此帮助我们更快、更稳定地进行训练。

自从深度 Q 学习中的这三项改进以来,又添加了许多改进,例如优先经验回放和 Dueling Deep Q-Learning。它们超出了本课程的范围,但如果您有兴趣,请查看我们在阅读列表中提供的链接。

< > 在 GitHub 上更新