深度强化学习课程文档

深度 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 学习的改进之外,还添加了许多其他改进,例如优先经验回放和双重深度 Q 学习。它们超出了本课程的范围,如果您感兴趣,请查看我们放在阅读清单中的链接。

< > 更新 在 GitHub 上