跳到正文
北京时间
原文
Hugging Face:Blog·· 2022-05-20精选AI 评分60

Hugging Face 深度强化学习课程 Unit 2 第二部分:Q-Learning 原理与从零实现

An Introduction to Q-Learning Part 2/2

AI 导读

Hugging Face 深度强化学习课程发布 Unit 2 第二部分,讲解 Q-Learning 算法、Q-Function 与 Q-Table,以及 Epsilon Greedy 策略和 TD 更新,并区分 off-policy 与 on-policy。

推荐理由

课程官方教程用迷宫示例逐步拆解 Q-Learning 算法和 Q 表更新,读者可跟着 Colab 从零实现第一个 RL 智能体。

正文 · AI 翻译

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

⚠️ 本文已有更新版本,请见此处 👉 https://huggingface.co/deep-rl-course/unit1/introduction

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

Thumbnail


⚠️ 本文已有更新版本,请见此处 👉 https://huggingface.co/deep-rl-course/unit1/introduction

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

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

因此,在第二部分中,我们将学习 Q-Learning,并从零开始实现我们的第一个强化学习智能体——一个 Q-Learning 智能体,并将在两个环境中训练它:

  1. Frozen Lake v1 ❄️:我们的智能体需要从起始状态(S)到达目标状态(G),只能走在冰冻的格子(F)上,并避开洞(H)。
  2. 自动驾驶出租车 🚕:智能体需要学会在城市中导航,将乘客从 A 点运送到 B 点。
Environments

如果你想能够学习深度 Q-Learning(第 3 单元),本单元是基础。

那么让我们开始吧!🚀

介绍 Q-Learning

什么是 Q-Learning?

Q-Learning 是一种基于价值的离策略方法,它使用时序差分方法来训练其动作价值函数:

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

Q-Learning 是我们用来训练 Q 函数的算法,Q 函数是一个动作价值函数,用于确定处于特定状态并在该状态下采取特定动作的价值。

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

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

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

如果我们以这个迷宫为例:

Maze example

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

Maze example

这里我们看到,初始状态并向上移动的状态-动作价值为 0:

Maze example

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

Q-function
给定一个状态和动作对,我们的 Q 函数会在其 Q 表中搜索,输出该状态-动作对的值(即 Q 值)。

如果我们回顾一下,Q-Learning 是这样一个 RL 算法:

  • 训练 Q 函数(一个动作价值函数),其内部是一个 Q 表,包含所有状态-动作对的值。
  • 给定一个状态和动作,我们的 Q 函数会在其 Q 表中搜索对应的值。
  • 当训练完成时,我们就得到了最优 Q 函数,这意味着我们有了最优 Q 表。
  • 如果我们有了最优 Q 函数,我们就有了最优策略,因为我们知道每个状态下的最佳动作是什么。
Link value policy

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

Q-learning
我们在这里看到,通过训练,我们的 Q 表变得更好了,因为多亏了它,我们可以知道每个状态-动作对的值。

现在我们已经理解了 Q-Learning、Q 函数和 Q 表是什么,让我们更深入地研究 Q-Learning 算法。

Q-Learning 算法

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

Q-learning

步骤 1:我们初始化 Q 表

Q-learning

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

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

Q-learning

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

其思路是我们定义 epsilon ɛ = 1.0:

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

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

Q-learning

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

Q-learning

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

请记住,在 TD 学习中,我们在交互一步之后更新我们的策略或价值函数(取决于我们选择的 RL 方法)。

为了生成我们的 TD 目标,我们使用了即时奖励 Rt+1R_{t+1} 加上下一个状态最佳状态-动作对的折扣价值(我们称之为 bootstrap)。

Q-learning

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

Q-learning

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

  • 我们需要 St,At,Rt+1,St+1S_t, A_t, R_{t+1}, S_{t+1}。
  • 为了在给定的状态-动作对上更新我们的 Q 值,我们使用 TD 目标。

我们如何构造 TD 目标?

  1. 我们在执行动作 Rt+1R_{t+1} 后获得奖励。
  2. 为了得到最佳下一状态-动作对价值,我们使用贪心策略来选择下一个最佳动作。注意这不是 epsilon 贪心策略,它会始终选择具有最高状态-动作价值的动作。

然后,当这个 Q 值的更新完成后。我们在 new_state 中开始,并再次使用我们的 epsilon-贪心策略来选择我们的动作。

这就是为什么我们说这是一个 off-policy 算法。

Off-policy 与 On-policy

区别很微妙:

  • Off-policy:在行动和更新时使用不同的策略。

例如,在 Q-Learning 中,Epsilon 贪心策略(行动策略)不同于用于选择最佳下一状态动作价值以更新我们的 Q 值的贪心策略(更新策略)。

Off-on policy
行动策略

不同于我们在训练部分使用的策略:

Off-on policy
更新策略
  • On-policy: 在行动和更新时使用相同的策略。

例如,在 Sarsa 这个另一个基于价值的算法中,Epsilon-贪心策略选择下一状态-动作对,而不是贪心策略。

Off-on policy
Sarsa
Off-on policy

一个 Q-Learning 示例

为了更好地理解 Q-Learning,让我们举一个简单的例子:

Maze-Example
  • 你是这个微型迷宫中的一只老鼠。你总是从同一个起点出发。
  • 目标是吃掉右下角的一大堆奶酪并避开毒药。毕竟,谁不喜欢奶酪呢?
  • 如果我们吃掉毒药、吃掉一大堆奶酪,或者花费超过五步,该回合就会结束。
  • 学习率为 0.1
  • gamma(折扣率)为 0.99
Maze-Example

奖励函数如下:

  • +0: 前往一个没有奶酪的状态。
  • +1: 前往一个有小块奶酪的状态。
  • +10: 前往有一大堆奶酪的状态。
  • -10: 前往有毒药的状态,因此死亡。
  • +0 如果我们花费超过五步。
Maze-Example

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

第 1 步:我们初始化 Q 表

Maze-Example

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

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

训练时间步 1:

第 2 步:使用 Epsilon 贪心策略选择动作

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

Maze-Example

第 3 步:执行动作 At,获得 Rt+1 和 St+1

通过向右走,我得到了一小块奶酪,所以 Rt+1=1R_{t+1} = 1,并且我处于一个新状态。

Maze-Example

第 4 步:更新 Q(St,At)Q(S_t, A_t)

我们现在可以使用我们的公式更新 Q(St,At)Q(S_t, A_t)。

Maze-Example
Maze-Example

训练时间步 2:

第 2 步:使用 Epsilon 贪心策略选择动作

由于 epsilon 是很大的 0.99,我再次采取随机动作 (因为随着训练进展,我们希望探索越来越少,所以我们会让它稍微衰减)。

我采取了向下动作。这不是一个好动作,因为它会把我引向毒药。

Maze-Example

第 3 步:执行动作 At,得到 Rt+1R_{t+1} 和 St+1

因为我进入了毒药状态,我得到 Rt+1=−10R_{t+1} = -10,然后我死了。

Maze-Example

第 4 步:更新 Q(St,At)Q(S_t, A_t)

Maze-Example

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

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


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

  1. Frozen-Lake-v1 ❄️(非滑溜版本):我们的智能体需要从起始状态(S)走到目标状态(G),只能走在冰冻格子(F)上,并避开洞(H)。
  2. 一辆自动驾驶出租车 🚕 将需要学会导航一座城市,以将乘客从 A 点运送到 B 点。
Environments

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

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


恭喜你完成本章! 信息量很大。也恭喜你完成教程。你刚刚从零开始实现了你的第一个 RL 智能体,并在 Hub 上分享了它 🥳。

当你学习一种新架构时,从零开始实现对于理解其工作原理很重要。

如果你对这些内容仍然感到困惑,这是正常的。 对我来说,以及所有学习过 RL 的人来说,都是如此。

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

而学习和避免能力错觉的最佳方式是测试自己。我们写了一个测验,帮助你找到需要加强学习的地方。 在这里检查你的知识 👉 https://github.com/huggingface/deep-rl-class/blob/main/unit2/quiz2.md

在进入有趣的部分之前,掌握这些要素并拥有坚实的基础是至关重要的。 不要犹豫,修改实现,尝试改进它并更改环境,最好的学习方式就是自己尝试!

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

在下一单元中,我们将学习 Deep-Q-Learning。

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

最后,我们希望根据你的反馈迭代改进和更新课程。如果你有反馈,请填写此表单 👉 https://forms.gle/3HgA7bEHwAmmLfwh9

继续学习,保持出色,

来源:Hugging Face:Blog · huggingface.co