深度强化学习课程文档

Q-Learning 简介

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

Q-Learning 简介

什么是 Q-Learning?

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

  • 离策略:我们将在本单元的末尾讨论它。
  • 基于价值的方法:通过训练价值函数或动作价值函数来间接找到最优策略,该函数将告诉我们每个状态或每个状态-动作对的价值。
  • TD 方法: 在每一步而不是在 эпизод 结束时更新其动作价值函数。

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

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

Q 来自于“Quality”(质量),即在该状态下该动作的价值。

让我们回顾一下价值和奖励之间的区别

  • 状态的价值状态-动作对的价值是我们的智能体从该状态(或状态-动作对)开始,然后根据其策略行动所获得的预期累积奖励。
  • 奖励我在状态下执行动作后从环境获得的反馈

在内部,我们的 Q 函数由 Q 表编码,该表中的每个单元格对应于一个状态-动作对值。 将此 Q 表视为 我们 Q 函数的内存或备忘单。

让我们看一个迷宫的例子。

Maze example

Q 表已初始化。这就是为什么所有值都 = 0。此表包含每个状态和动作对应的状态-动作值。 对于这个简单的例子,状态仅由鼠标的位置定义。因此,我们的 Q 表中有 2*3 行,鼠标的每个可能位置对应一行。在更复杂的情况下,状态可能包含比参与者的位置更多的信息。

Maze example

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

Maze example

因此:Q 函数使用 Q 表,该表具有每个状态-动作对的值。 给定一个状态和动作,我们的 Q 函数将在其 Q 表中搜索以输出该值。

Q-function

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

  • 训练 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:使用 ε-贪心策略选择动作

Q-learning

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

其思想是,初始值 ɛ = 1.0

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

在训练开始时,进行探索的概率将非常大,因为 ɛ 非常高,因此大多数时候,我们将进行探索。 但是随着训练的进行,以及我们的 Q 表在其估计中变得越来越好,我们逐渐降低 ε 值,因为我们将需要越来越少的探索和更多的利用。

Q-learning

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

Q-learning

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

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

为了生成我们的 TD 目标,我们使用了即时奖励Rt+1R_{t+1} 加上下一个状态的折扣价值,该价值通过找到在下一个状态最大化当前 Q 函数的动作来计算。(我们称之为自举)。

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}在采取动作后AtA_t.
  2. 为了获得下一个状态的最佳状态-动作对值,我们使用贪心策略来选择下一个最佳动作。请注意,这不是 ε-贪心策略,它将始终选择具有最高状态-动作值的动作。

然后,当完成此 Q 值的更新后,我们从新状态开始,再次使用 ε-贪心策略选择我们的动作。

这就是我们说 Q-Learning 是一种离策略算法的原因。

离策略 vs 同策略

区别在于细微之处

  • 离策略:使用不同的策略进行行动(推理)和更新(训练)。

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

Off-on policy
行动策略

与我们在训练部分中使用的策略不同

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

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

Off-on policy
Sarsa
Off-on policy
< > 在 GitHub 上更新