Q学习简介 第2/2部分

Q学习简介 第2/2部分

深度强化学习课程第2单元第2部分 – Hugging Face 🤗

⚠️ 这篇文章有一个更新版本,请点击这里查看 👉 https://huggingface.co/deep-rl-course/unit1/introduction

这篇文章是深度强化学习课程的一部分,从初学者到专家都适用的免费课程。查看课程大纲请点击这里。


⚠️ 这篇文章有一个更新版本,请点击这里查看 👉 https://huggingface.co/deep-rl-course/unit1/introduction

这篇文章是深度强化学习课程的一部分,从初学者到专家都适用的免费课程。查看课程大纲请点击这里。

在本单元的第一部分中,我们学习了基于值的方法以及蒙特卡洛和时序差分学习之间的区别

所以,在第二部分中,我们将学习Q学习,并且从头开始实现我们的第一个强化学习代理,一个Q学习代理,并在两个环境中对其进行训练:

  1. Frozen Lake v1 ❄️:在这个环境中,我们的代理需要通过只能在冰冻的瓷砖上行走(F)并避开洞(H)的方式,从起始状态(S)到达目标状态(G)。
  2. 一个自动出租车 🚕:在这个环境中,代理需要学习在城市中导航,将乘客从A点运送到B点。

如果您想要能够在深度Q学习(第3单元)上工作,本单元是基础。

那么,让我们开始吧!🚀

  • 介绍Q学习
    • 什么是Q学习?
    • Q学习算法
    • 离策略 vs. 在策略
  • 一个Q学习示例

介绍Q学习

什么是Q学习?

Q学习是一种离策略的基于值的方法,使用TD方法来训练其动作值函数:

  • 离策略:我们将在本章末尾讨论这个。
  • 基于值的方法:通过训练一个值函数或动作值函数间接地找到最优策略,该函数告诉我们每个状态或每个状态-动作对的值。
  • 使用TD方法:在每一步更新动作值函数,而不是在每个回合结束时更新。

Q学习是我们用来训练Q函数的算法,一个决定处于特定状态并采取特定动作时的价值的动作值函数

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

Q来自于该状态下该动作的“质量”。

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

如果我们以迷宫为例:

Q表被初始化。这就是为什么所有的值都是0。这个表格包含每个状态的四个状态-动作值。

在这里,我们可以看到初始状态向上的状态-动作值为0:

因此,Q函数包含一个Q表,其中包含每个状态动作对的值。给定一个状态和动作,我们的Q函数将在其Q表中搜索并输出该值。

给定一个状态和动作对,我们的Q函数将在其Q表中搜索并输出状态动作对的值(Q值)

如果我们回顾一下,Q学习是强化学习算法,它:

  • 训练Q函数(一个动作值函数),它内部是一个Q表,包含所有的状态动作对值。
  • 给定一个状态和动作,我们的Q函数将在其Q表中搜索相应的值。
  • 训练完成后,我们将拥有一个最优的Q函数,这意味着我们拥有一个最优的Q表。
  • 如果我们拥有一个最优的Q函数,我们将拥有一个最优的策略,因为我们知道每个状态下最佳的动作。

但是,在开始时,我们的Q表是无用的,因为它为每个状态动作对提供任意的值(大多数情况下,我们将Q表初始化为0值)。但是,当我们探索环境并更新我们的Q表时,它将提供给我们越来越好的近似值。

我们可以看到,在训练过程中,我们的Q表变得更好,因为通过它,我们可以知道每个状态动作对的值。

现在我们已经了解了Q学习、Q函数和Q表,让我们更深入地研究Q学习算法。

Q学习算法

这是Q学习的伪代码;让我们研究每个部分并在实现之前通过一个简单的例子看看它是如何工作的。不要被它吓到,它比看起来简单!我们将逐步介绍每个步骤。

第一步:初始化Q表

我们需要为每个状态动作对初始化Q表。大多数情况下,我们使用0值进行初始化。

第二步:使用ε贪婪策略选择动作

ε贪婪策略是一种处理探索/利用权衡的策略。

其思想是我们定义ε = 1.0:

  • 以概率1-ε进行利用(即我们的智能体选择具有最高状态动作对值的动作)。
  • 以概率ε进行探索(尝试随机动作)。

在训练开始时,由于ε非常高,进行探索的概率将非常大,因此我们将经常进行探索。但随着训练的进行,因此我们的Q表在估计方面变得越来越好,我们逐渐减小ε值,因为我们将需要越来越少的探索和更多的利用。

步骤3:执行行动At,获得奖励Rt+1和下一个状态St+1

步骤4:更新Q(St, At)

在TD学习中,我们在与环境互动的一步之后更新我们的策略或值函数(取决于我们选择的强化学习方法)

为了产生我们的TD目标,我们使用了即时奖励Rt+1加上下一个状态最佳状态-行动对的折扣值(我们称之为自举)。

因此,我们的Q(St, At) 更新公式如下:

这意味着要更新我们的Q(St, At):

  • 我们需要St, At, Rt+1, St+1。
  • 为了更新给定状态-行动对的Q值,我们使用TD目标。

我们如何形成TD目标?

  1. 我们获得采取行动后的奖励Rt+1。
  2. 为了获得最佳的下一个状态-行动对值,我们使用贪婪策略选择下一个最佳行动。请注意,这不是ε-贪婪策略,它总是选择具有最高状态-行动值的行动。

然后当这个Q值的更新完成后,我们从新状态开始并再次使用我们的ε-贪婪策略选择行动。

这就是为什么我们说这是一个离线策略算法。

离线策略 vs 在线策略

这两者的区别是微妙的:

  • 离线策略:在行动和更新时使用不同的策略。

例如,对于Q学习,ε-贪婪策略(行动策略)与贪婪策略不同,后者用于选择最佳的下一个状态-行动值来更新我们的Q值(更新策略)。

行动策略

与训练过程中使用的策略不同:

更新策略
  • 在线策略:在行动和更新时使用相同的策略。

例如,对于另一个基于值的算法Sarsa,ε-贪婪策略选择下一个状态-行动对,而不是贪婪策略。

Sarsa

Q学习示例

为了更好地理解Q学习,让我们来看一个简单的例子:

  • 你是迷宫中的一只老鼠。你总是从同一个起点开始。
  • 目标是吃掉右下角的一堆大奶酪并避开毒药。毕竟,谁不喜欢奶酪呢?
  • 如果吃到毒药、吃掉大堆奶酪或者超过五步,则结束该回合。
  • 学习率为0.1
  • γ(折扣率)为0.99

奖励函数如下:

  • +0:进入一个没有奶酪的状态。
  • +1:进入一个有一小块奶酪的状态。
  • +10:进入一个有一大堆奶酪的状态。
  • -10:进入一个有毒物并因此死亡的状态。
  • +0:如果我们花费超过五个步骤。

为了训练我们的智能体获得最优策略(即向右、向右、向下的策略),我们将使用Q-Learning算法。

步骤1:初始化Q表

所以,目前为止,我们的Q表是没有用的,我们需要使用Q-Learning算法来训练我们的Q函数。

让我们进行两个训练时间步骤:

训练时间步骤1:

步骤2:使用Epsilon Greedy策略选择动作

因为epsilon很大=1.0,我随机选择一个动作,这种情况下我向右走。

步骤3:执行动作At,得到Rt+1和St+1

通过向右走,我得到了一小块奶酪,所以Rt+1 = 1,并且我进入了一个新的状态。

步骤4:更新Q(S t , A t )

现在我们可以使用我们的公式更新Q(S t , A t )。

训练时间步骤2:

步骤2:使用Epsilon Greedy策略选择动作

我再次随机选择一个动作,因为epsilon很大0.99(随着训练的进行,我们希望探索越来越少,因此我们稍微将其衰减)。

我选择了向下的动作。这不是一个好的动作,因为它导致我中毒。

步骤3:执行动作At,得到Rt+1和St+1

因为我走到了毒物状态,我得到Rt+1 = -10,并且我死了。

步骤4:更新Q(S t , A t )

因为我们已经死了,我们开始一个新的回合。但是我们在这里看到的是,通过两个探索步骤,我的智能体变得更聪明了。

随着我们继续探索和利用环境,并使用TD目标更新Q值,Q表会给我们更好和更好的近似值。因此,在训练结束时,我们将得到对最优Q函数的估计。


现在,我们已经学习了Q-Learning的理论,让我们从头开始实现它。我们将在两个环境中训练一个Q-Learning智能体:

  1. Frozen-Lake-v1 ❄️(非滑动版本):我们的智能体需要通过仅在冰面上行走并避开洞(H)的冻结瓷砖(F),从起始状态(S)到达目标状态(G)。
  2. 一辆自动出租车🚕需要学会在城市中导航,将乘客从A点运送到B点。

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

排行榜👉 https://huggingface.co/spaces/chrisjay/Deep-Reinforcement-Learning-Leaderboard


恭喜您完成本章!这里有很多信息。还有恭喜您完成教程。您刚刚从头开始实现了您的第一个强化学习智能体,并在Hub上分享了它🥳。

在学习新的架构时,从头开始实现是理解其工作原理的重要方法。

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

在继续之前,花时间真正掌握这些材料。

由于学习和避免自以为是的最佳方法是进行自我测试。我们编写了一个测验,帮助您找到需要加强学习的地方。在这里检查您的知识👉 https://github.com/huggingface/deep-rl-class/blob/main/unit2/quiz2.md

在进入有趣的部分之前,掌握这些要素并建立坚实的基础非常重要。不要犹豫修改实现,尝试改进它并更改环境,最好的学习方法是尝试自己的事情!

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

在下一单元中,我们将学习关于深度Q学习。

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

最后,我们希望通过您的反馈逐步改进和更新课程。如果您有任何意见,请填写此表👉 https://forms.gle/3HgA7bEHwAmmLfwh9

继续学习,保持精彩,