Press "Enter" to skip to content

深度 Q 学习与太空入侵者

深度强化学习课程第三单元,与Hugging Face共同学习 🤗

⚠️ 这篇文章的新版本已经发布,请点击链接查看 👉 https://huggingface.co/deep-rl-course/unit1/introduction

本文是深度强化学习课程的一部分,从入门到专家级的免费课程。请在此处查看课程大纲。

深度 Q 学习与太空入侵者 四海 第1张


⚠️ 这篇文章的新版本已经发布,请点击链接查看 👉 https://huggingface.co/deep-rl-course/unit1/introduction

本文是深度强化学习课程的一部分,从入门到专家级的免费课程。请在此处查看课程大纲。

在上一单元中,我们学习了我们的第一个强化学习算法:Q-Learning,并且从头开始实现了它,并在两个环境中进行了训练,FrozenLake-v1 ☃️ 和 Taxi-v3 🚕。

我们在这个简单的算法中取得了出色的结果。但是这些环境相对简单,因为状态空间是离散且较小的(FrozenLake-v1有14个不同的状态,Taxi-v3有500个状态)。

但正如我们将看到的,对于状态空间较大的环境,产生和更新Q表可能会变得无效。

因此,今天,我们将学习我们的第一个深度强化学习代理:Deep Q-Learning。Deep Q-Learning不使用Q表,而是使用神经网络,根据状态来近似计算每个动作的Q值。

而且我们将使用RL-Zoo来训练它玩Space Invaders和其他Atari环境,RL-Zoo是一个使用Stable-Baselines进行RL训练的训练框架,提供了训练、评估代理、调整超参数、绘制结果和录制视频的脚本。

深度 Q 学习与太空入侵者 四海 第2张

那么,让我们开始吧!🚀

为了能够理解本单元的内容,您需要先了解Q-Learning。

  • 从Q-Learning到Deep Q-Learning
  • 深度Q网络
    • 输入预处理和时间限制
  • 深度Q-Learning算法
    • 经验回放以更有效地利用经验
    • 固定的Q-Target以稳定训练
    • 双重DQN

从Q-Learning到Deep Q-Learning

我们了解到Q-Learning是一种用于训练Q函数的算法,它是一个动作值函数,用于确定在特定状态下采取特定动作的价值。

给定状态和动作,我们的Q函数输出状态-动作值(也称为Q值)

Q代表该状态下该动作的”质量”。

在内部,我们的Q函数有一个Q表,其中每个单元格对应于状态-动作对值。将这个Q表看作是我们Q函数的记忆或备忘录。

问题是Q-Learning是一种表格法。也就是说,它是一种状态和动作空间足够小,可以将值函数近似表示为数组和表格的问题。而这种方法不具有可扩展性

Q-Learning在小状态空间的环境中表现良好,例如:

  • FrozenLake,我们有14个状态。
  • Taxi-v3,我们有500个状态。

但是想想今天我们要做什么:我们将训练一个代理来学习使用帧作为输入来玩Space Invaders。

正如Nikita Melkozerov提到的,Atari环境的观测空间的形状是(210, 160, 3),其中的值范围是0到255,因此我们有256^(210x160x3) = 256^100800(相比之下,可观测宇宙中大约有10^80个原子)。

深度 Q 学习与太空入侵者 四海 第4张

因此,状态空间是巨大的;因此为该环境创建和更新Q表将不高效。在这种情况下,最好的方法是使用参数化的Q函数Qθ(s,a)来近似Q值,而不是使用Q表。

这个神经网络将在给定一个状态的情况下,近似出每个可能动作的不同Q值。这正是深度Q学习所做的。

深度 Q 学习与太空入侵者 四海 第5张

现在我们了解了深度Q学习,让我们深入了解深度Q网络。

深度Q网络(DQN)

这是我们的深度Q学习网络的架构:

深度 Q 学习与太空入侵者 四海 第6张

作为输入,我们采用一个通过网络的4个帧的堆栈作为状态,并输出一个在该状态下每个可能动作的Q值向量。然后,就像Q学习一样,我们只需要使用ε-贪婪策略来选择要采取的动作。

当神经网络初始化时,Q值的估计是糟糕的。但是在训练过程中,我们的深度Q网络代理将将情境与适当的动作关联起来,并学会玩好游戏。

输入预处理和时间限制

我们提到了对输入进行预处理。这是一个关键的步骤,因为我们希望降低状态的复杂性,以减少训练所需的计算时间。

所以我们做的是将状态空间减小到84×84并将其变为灰度(因为Atari环境中的颜色不添加重要信息)。这是一个重要的节省,因为我们将三个颜色通道(RGB)减少到一个通道。

如果某些游戏屏幕不包含重要信息,我们还可以对其进行裁剪。然后我们将四个帧堆叠在一起。

深度 Q 学习与太空入侵者 四海 第7张

为什么要将四个帧堆叠在一起?我们将帧堆叠在一起是因为它帮助我们处理时间限制的问题。让我们以乒乓球游戏为例。当你看到这个帧时:

深度 Q 学习与太空入侵者 四海 第8张

你能告诉我球往哪里去吗?不可以,因为一个帧不足以获得运动的感觉!但是如果我再加上三个帧呢?这样你就可以看到球往右边去了。

深度 Q 学习与太空入侵者 四海 第9张这就是为什么我们要将四个帧堆叠在一起来捕捉时间信息。

然后,堆叠的帧通过三个卷积层进行处理。这些层允许我们捕获和利用图像中的空间关系。而且,由于帧被堆叠在一起,你可以利用那些帧之间的一些空间属性。

最后,我们有几个全连接层,输出在给定状态下每个可能动作的Q值。

深度 Q 学习与太空入侵者 四海 第6张

因此,我们看到深度Q学习使用神经网络来近似在给定状态下每个可能动作的不同Q值。现在让我们研究深度Q学习算法。

深度Q学习算法

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

不同的是,在训练阶段,我们不直接更新状态-动作对的Q值,而是创建一个我们的Q值预测和Q目标之间的损失函数,并使用梯度下降来更新我们的深度Q网络的权重,以更好地近似我们的Q值。

深度 Q 学习与太空入侵者 四海 第11张

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

  • 采样:我们执行动作并将观察到的经验元组存储在回放内存中
  • 训练:随机选择一小批元组并使用梯度下降更新步骤进行学习

深度 Q 学习与太空入侵者 四海 第12张

然而,与Q学习相比,这不是唯一的变化。深度Q学习训练可能会遇到不稳定性的问题,主要是因为将非线性Q值函数(神经网络)与引导(使用现有估计而不是实际完整回报更新目标)相结合。

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

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

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

为什么我们要创建回放内存?

在深度Q学习中,经验回放有两个功能:

  1. 在训练过程中更有效地利用经验
  • 经验回放帮助我们在训练过程中更有效地利用经验。通常,在在线强化学习中,我们与环境交互,获取经验(状态、动作、奖励和下一个状态),从中学习(更新神经网络)并丢弃它们。
  • 但是通过经验回放,我们创建一个回放缓冲区,保存我们可以在训练过程中重复使用的经验样本

深度 Q 学习与太空入侵者 四海 第13张

⇒ 这使我们能够多次从个别经验中学习

  1. 避免忘记先前的经验并减少经验之间的相关性
  • 如果我们将经验的顺序样本提供给神经网络,我们会遇到的问题是随着新经验的覆盖,它往往会忘记先前的经验。例如,如果我们在第一关卡和第二关卡之间切换,我们的代理可能会忘记如何在第一关卡中行动和玩耍。

解决方案是创建一个回放缓冲区,当与环境交互时存储经验元组,然后对其进行随机采样。这样可以防止网络只学习自己立即的行动。

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

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

深度 Q 学习与太空入侵者 四海 第14张

固定Q目标以稳定训练

当我们想计算TD误差(也称为损失)时,我们计算TD目标(Q-Target)和当前Q值(Q的估计)之间的差异

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

深度 Q 学习与太空入侵者 四海 第11张

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

因此,这意味着在训练的每一步中,我们的Q值会发生变化,目标值也会发生变化。所以,我们越来越接近目标,但目标也在移动。就像追逐一个移动的目标!这导致了训练中的显著振荡。

就像你是一个牛仔(Q估计),你想要抓住牛(Q目标),你必须靠近(减小误差)。

深度 Q 学习与太空入侵者 四海 第16张

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

深度 Q 学习与太空入侵者 四海 第17张 深度 Q 学习与太空入侵者 四海 第18张 这导致了一个奇怪的追逐路径(训练中的显著振荡)。 深度 Q 学习与太空入侵者 四海 第19张

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

  • 使用一个具有固定参数的单独网络来估计TD目标
  • 每隔C步骤将参数从我们的Deep Q-Network复制到目标网络以更新目标网络。

深度 Q 学习与太空入侵者 四海 第20张

双DQN

双DQN,或双重学习,由Hado van Hasselt引入。这种方法解决了Q值过高估计的问题。

为了理解这个问题,记住我们如何计算TD目标:

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

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

因此,在训练开始时,我们对最佳动作的选择没有足够的信息。因此,将最大Q值(噪声较大)作为最佳动作可能会导致错误的判断。如果非最优动作经常获得比最佳动作更高的Q值,学习将变得复杂。

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

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

因此,双DQN帮助我们减少Q值的过高估计,从而帮助我们训练更快、学习更稳定。

自从深度Q学习出现以来,已经添加了许多改进,如优先经验回放、对抗深度Q学习等。这些超出了本课程的范围,但如果你有兴趣,可以查看我们在阅读列表中提供的链接。👉 https://github.com/huggingface/deep-rl-class/blob/main/unit3/README.md

现在你已经学习了深度Q学习的理论,你可以训练你的深度Q学习智能体来玩雅达利游戏。我们将从太空侵略者开始,但你可以使用任何你想玩的雅达利游戏🔥

我们使用RL-Baselines-3 Zoo集成,这是一个纯粹的深度Q学习版本,没有使用Double-DQN、Dueling-DQN和优先经验回放等扩展功能。

从这里开始教程👉 https://colab.research.google.com/github/huggingface/deep-rl-class/blob/main/unit3/unit3.ipynb

与你的同学比较成绩的排行榜🏆👉 https://huggingface.co/spaces/chrisjay/Deep-Reinforcement-Learning-Leaderboard

深度 Q 学习与太空入侵者 四海 第2张


恭喜你完成了本章!内容很多。恭喜你完成了教程。你刚刚训练了你的第一个深度Q学习智能体,并在Hub上分享了它🥳。

如果你对所有这些元素感到困惑,那是正常的。对我和所有学习强化学习的人来说都是这样。

在继续之前,花些时间真正理解这些内容。

不要犹豫在其他环境中训练你的智能体(乒乓球,海底探险,QBert,Ms Pac Man)。最好的学习方法就是自己去尝试!

如果你想更深入了解,我们在教学大纲中发布了一些额外阅读材料👉 https://github.com/huggingface/deep-rl-class/blob/main/unit3/README.md

在下一个单元,我们将学习关于策略梯度方法。

别忘了与想要学习的朋友分享🤗!

最后,我们希望根据你们的反馈不断改进和更新课程。如果你有任何意见,请填写这个表格👉 https://forms.gle/3HgA7bEHwAmmLfwh9

继续学习,保持优秀,

Leave a Reply

Your email address will not be published. Required fields are marked *