深度强化学习课程文档

介绍 Q 学习

Hugging Face's logo
加入 Hugging Face 社区

并获得增强型文档体验

开始使用

介绍 Q 学习

什么是 Q 学习?

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

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

**Q 学习是用于训练我们的 Q 函数的算法**,一个**动作价值函数**,它确定在特定状态下采取特定动作的价值。

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

**Q 来自“质量”(价值)在该状态下采取该动作的程度**。

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

  • 状态的价值,或状态-动作对的价值,是我们代理从该状态(或状态-动作对)开始,然后按照其策略采取行动所获得的预期累计奖励。
  • 奖励是我们在特定状态下执行动作后**从环境中获得的反馈**。

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

让我们以迷宫为例。

Maze example

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

Maze example

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

Maze example

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

Q-function

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

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

在开始时,**我们的 Q 表毫无用处,因为它为每个状态-动作对提供了任意值**(大多数情况下,我们将 Q 表初始化为 0)。随着代理**探索环境并更新 Q 表,它将为我们提供越来越接近最优策略的近似值**。

Q-learning
在这里我们看到,通过训练,我们的 Q 表得到了改进,因为我们可以通过它来了解每个状态-动作对的值。

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

Q 学习算法

这是 Q 学习伪代码;让我们研究每个部分,并在**实现它之前用一个简单的示例看看它是如何工作的**。不要被它吓倒,它比看起来简单得多!我们将逐个步骤进行。

Q-learning

步骤 1:我们初始化 Q 表

Q-learning

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

步骤 2:使用 ε-贪婪策略选择一个动作

Q-learning

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

这个想法是,初始值为 ɛ = 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} 加上下一个状态的折现价值,计算方法是找到在下一个状态下使当前 Q 函数最大化的动作。(我们称之为 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}在执行动作AtA_t.
  2. 为了获得下一个状态的最佳状态-动作对值,我们使用贪婪策略来选择下一个最佳动作。请注意,这不是 epsilon-greedy 策略,它始终会采取具有最高状态-动作值的动作。

然后,当完成此 Q 值的更新后,我们从一个新的状态开始,并使用 epsilon-greedy 策略再次 选择我们的动作。

这就是我们说 Q 学习是一种非策略算法的原因。

非策略 vs 策略

区别很微妙

  • 非策略: 使用 不同的策略来执行动作(推理)和更新(训练)。

例如,在 Q 学习中,epsilon-greedy 策略(执行策略)与用来 选择最佳下一状态动作值以更新我们的 Q 值(更新策略) 的贪婪策略不同。

Off-on policy
执行策略

与我们在训练过程中使用的策略不同

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

例如,在 Sarsa 中,另一种基于值的算法, epsilon-greedy 策略选择下一个状态-动作对,而不是贪婪策略。

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