一个关于Q-Learning的介绍 第1部分
An Introduction to Q-Learning Part 1
Hugging Face深度强化学习课程第2单元第1部分 🤗
⚠️ 这篇文章有更新版本可在此处查看 👉 https://huggingface.co/deep-rl-course/unit1/introduction
本文章是深度强化学习课程的一部分。这是一门从入门到专家级别的免费课程。请查看课程大纲。
⚠️ 这篇文章有更新版本可在此处查看 👉 https://huggingface.co/deep-rl-course/unit1/introduction
本文章是深度强化学习课程的一部分。这是一门从入门到专家级别的免费课程。请查看课程大纲。
在本课程的第一章中,我们学习了强化学习(RL),RL的过程以及解决RL问题的不同方法。我们还训练了我们的第一个登月器代理,使其能够正确着陆在月球上 🌕,并将其上传到Hugging Face Hub。
因此,今天我们将更深入地探讨强化学习方法之一:基于价值的方法,并学习我们的第一个RL算法:Q-Learning。
我们还将从头开始实现我们的第一个RL代理:一个Q-Learning代理,并将其在两个环境中进行训练:
- Frozen-Lake-v1(非滑动版本):在这个环境中,我们的代理需要通过只行走在冰冻的瓷砖(F)上并避开洞(H)的方式,从起始状态(S)到达目标状态(G)。
- 一辆自动出租车需要学会导航城市,将乘客从A点运送到B点。
本单元分为两个部分:
在第一部分中,我们将学习基于价值的方法以及蒙特卡洛和时序差分学习之间的区别。
在第二部分中,我们将学习我们的第一个RL算法:Q-Learning,并实现我们的第一个RL代理。
如果您想要能够进行深度Q-Learning(单元3)的工作,本单元是基础:这是第一个能够玩Atari游戏并在某些游戏中超越人类水平(打砖块,太空侵略者等)的深度RL算法。
那么,让我们开始吧!
- 什么是RL?简要回顾
- 两种基于价值的方法
- 状态-值函数
- 动作-值函数
- Bellman方程:简化我们的价值估计
- 蒙特卡洛与时序差分学习
- 蒙特卡洛:在回合结束时学习
- 时序差分学习:在每一步学习
什么是RL?简要回顾
在RL中,我们构建一个能够做出智能决策的代理。例如,一个学会玩视频游戏的代理,或者一个通过智能决策来最大化利益的交易代理,即决定买入何种股票以及何时卖出。
然而,为了做出智能决策,我们的代理将通过与环境进行试错交互并接收奖励(正面或负面)作为唯一的反馈来从环境中学习。
其目标是最大化其预期的累积奖励(由于奖励假设)。
代理的决策过程称为策略π:给定一个状态,策略将输出一个动作或一个动作的概率分布。也就是说,给定对环境的观察,策略将提供一个代理应该采取的动作(或每个动作的多个概率)。
我们的目标是找到一个最优策略π *,也就是一个导致最佳累积奖励的策略。
为了找到这个最优策略(从而解决RL问题),有两种主要的RL方法:
- 基于策略的方法:直接训练策略,学习在给定状态下应该采取哪个动作。
- 基于价值的方法:训练价值函数,学习哪个状态更有价值,并使用这个价值函数来采取导致该状态的动作。
在这一章中,我们将深入探讨基于价值的方法。
基于价值的两种方法
在基于价值的方法中,我们学习一个价值函数,它将一个状态映射到该状态的预期价值。
状态的价值是代理在该状态开始并根据我们的策略行动时可以获得的预期折扣回报。
如果你忘记了折扣是什么意思,可以阅读这个部分。
根据我们的策略行动是什么意思呢?毕竟,在基于价值的方法中,我们没有策略,因为我们训练的是价值函数而不是策略。
请记住,RL代理的目标是具有最优策略π。
为了找到它,我们了解到有两种不同的方法:
- 基于策略的方法:直接训练策略以选择在给定状态下采取什么动作(或者在该状态的动作上的概率分布)。在这种情况下,我们没有价值函数。
策略以状态作为输入,并输出在该状态下采取的动作(确定性策略)。
因此,我们不会手动定义策略的行为;它是通过训练来定义的。
- 基于价值的方法:通过训练一个输出状态或状态-动作对的价值的价值函数,间接地确定策略采取的动作。
但是,由于我们没有训练我们的策略,我们需要指定其行为。例如,如果我们希望一个策略根据价值函数始终采取导致最大奖励的动作,我们将创建一个贪婪策略。

因此,无论您使用哪种方法解决问题,您都将拥有一个策略,但在基于价值的方法中,您不会训练它,您的策略只是一个您指定的简单函数(例如贪婪策略),而此策略使用价值函数给出的值来选择其动作。
所以区别在于:
- 在基于策略的方法中,通过直接训练策略找到最优策略。
- 在基于价值的方法中,找到最优价值函数会导致最优策略。
实际上,在基于价值的方法中,大多数情况下,您将使用处理探索/利用权衡的ε-贪婪策略;我们将在本单元的第二部分讨论Q-Learning时详细介绍。
所以,我们有两种类型的基于值的函数:
状态值函数
我们将状态值函数在策略 π 下表示为:
对于每个状态,状态值函数输出的是代理从该状态开始并按照策略永远执行后的预期回报(如果您更喜欢,可以是未来所有时间步骤的回报)。

动作值函数
在动作值函数中,对于每个状态和动作对,动作值函数输出的是代理从该状态开始采取行动并按照策略永远执行后的预期回报。
在策略 π 下,在状态 s 采取动作 a 的值是:
我们可以看到区别在于:
- 在状态值函数中,我们计算的是状态 S t 的值
- 在动作值函数中,我们计算的是状态-动作对(S t ,A t )的值,因此是在该状态下采取该动作的值。

无论我们选择哪种值函数(状态值函数还是动作值函数),值都是预期回报。
然而,问题在于这意味着要计算每个状态或状态-动作对的值,我们需要对代理在该状态下可能获得的所有回报进行求和。
这可能是一个繁琐的过程,这时贝尔曼方程就派上用场了。
贝尔曼方程:简化我们的值估计
贝尔曼方程简化了我们的状态值或状态-动作值计算。
根据我们现在所学,我们知道如果计算 V(S t )(状态的值),我们需要计算从该状态开始并按照策略永远执行后的回报。(我们在下面的示例中定义的策略是贪婪策略,并且为简化起见,我们不打折扣)。
所以要计算 V(S t ),我们需要对预期回报求和。因此:

然后,要计算 V(S t+1 ),我们需要计算从状态 S t+1 开始的回报。

所以你看,如果需要为每个状态值或状态-动作值进行计算,这是一个相当繁琐的过程。
我们可以使用贝尔曼方程,而不是为每个状态或每个状态-动作对计算期望回报。
贝尔曼方程是一个递归方程,工作原理如下:我们不必从头开始计算每个状态的回报,而是可以将任何状态的值考虑为:
即时奖励 R t + 1 R_{t+1} R t + 1 + 后续状态的折扣值 ( g a m m a ∗ V ( S t + 1 ) )。

如果我们回到我们的例子,状态1的值=如果我们从该状态开始,则预期累积回报。
计算状态1的值:如果代理从该状态1开始,并遵循策略进行所有时间步,则奖励的总和。
这相当于 V ( S t ) = 即时奖励 R t + 1 R_{t+1} R t + 1 + 下一个状态的折扣值 ( g a m m a ∗ V ( S t + 1 ) )。
为简化起见,我们不进行折扣,因此 gamma = 1。
- V ( S t + 1 ) 的值 = 即时奖励 R t + 2 R_{t+2} R t + 2 + 下一个状态的折扣值 ( g a m m a ∗ V ( S t + 2 ) )。
- 依此类推。
总结一下,贝尔曼方程的思想是,不必计算每个值作为预期回报的总和,这是一个漫长的过程,而是等价于即时奖励的总和 + 后续状态的折扣值。
蒙特卡洛与时序差分学习
在深入了解Q学习之前,我们需要讨论的最后一件事是两种学习方式。
请记住,强化学习代理通过与环境进行交互来学习。其思想是使用采取的经验,根据获得的奖励来更新其值或策略。
蒙特卡洛和时序差分学习是两种不同的策略,用于训练我们的值函数或策略函数。它们都使用经验来解决强化学习问题。
蒙特卡洛使用在学习之前的整个经验序列,而时序差分仅使用一个步骤( S t , A t , R t + 1 , S t + 1 )来进行学习。
我们将使用基于值的方法示例来解释它们。
蒙特卡洛:在回合结束时学习
蒙特卡洛会等到回合结束后,计算 G t G_t G t (回报),并将其用作更新 V ( S t ) V(S_t) V ( S t ) 的目标。
因此,在更新我们的值函数之前,它需要完整的一整回合的交互。
如果我们举个例子:
-
我们总是从相同的起始点开始回合。
-
智能体使用策略来采取行动。例如,使用 Epsilon Greedy 策略,该策略在探索(随机行动)和利用之间交替。
-
我们获得奖励和下一个状态。
-
如果猫吃掉了老鼠或老鼠移动了超过 10 步,我们终止回合。
-
在回合结束时,我们有一系列的状态、行动、奖励和下一个状态。
-
智能体将累加总奖励 G t G_t G t (以查看其表现如何)。
-
然后根据公式更新 V ( s t ) V(s_t) V ( s t )。
- 然后使用这个新知识开始新的游戏
通过运行更多的回合,智能体将学会越来越好地玩游戏。
例如,如果我们使用蒙特卡洛训练状态值函数:
- 我们刚开始训练我们的值函数,因此对每个状态返回 0 值。
- 我们的学习率(lr)为 0.1,折扣率为 1(没有折扣)。
- 我们的老鼠探索环境并采取随机行动。
- 老鼠移动超过 10 步,回合结束。
- 我们有一系列的状态、行动、奖励、下一个状态,我们需要计算回报 G t G{t} G t 。
- G t = R t + 1 + R t + 2 + R t + 3 …
- G t = 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 0 + 0
- G t = 3
- 现在我们可以更新 V ( S 0 ) V(S_0) V ( S 0 ) :
- New V ( S 0 ) = V ( S 0 ) + l r ∗ [ G t — V ( S 0 ) ] V(S_0) = V(S_0) + lr * [G_t — V(S_0)] V ( S 0 ) = V ( S 0 ) + l r ∗ [ G t — V ( S 0 ) ]
- New V ( S 0 ) = 0 + 0.1 ∗ [ 3 – 0 ] V(S_0) = 0 + 0.1 * [3 – 0] V ( S 0 ) = 0 + 0 . 1 ∗ [ 3 – 0 ]
- New V ( S 0 ) = 0.3 V(S_0) = 0.3 V ( S 0 ) = 0 . 3
时间差分学习:每一步都进行学习
- 而时间差分则只等待一个交互(一步)S t + 1 S_{t+1} S t + 1
- 形成一个TD目标,使用 R t + 1 R_{t+1} R t + 1 和 γ ∗ V ( S t + 1 ) gamma * V(S_{t+1}) γ ∗ V ( S t + 1 ) 更新 V ( S t ) V(S_t) V ( S t )。
TD的思想是在每一步更新 V ( S t ) V(S_t) V ( S t )。
但是因为我们没有进行完整的一集游戏,我们没有 G t G_t G t (预期回报)。相反,我们通过添加 R t + 1 R_{t+1} R t + 1 和下一个状态的折扣值来估计 G t G_t G t 。
这被称为自助法。之所以这么称呼,是因为TD的更新部分是基于现有的估计值 V ( S t + 1 ) V(S_{t+1}) V ( S t + 1 ) 而不是完整的样本 G t G_t G t 。
这种方法被称为TD(0)或一步TD(在任何个体步骤之后更新值函数)。
如果我们以相同的例子为例,
- 我们刚开始训练我们的值函数,所以对于每个状态它返回0值。
- 我们的学习率(lr)是0.1,折扣率是1(没有折扣)。
- 我们的鼠标探索环境并随机采取一个行动:向左移动
- 它获得奖励 R t + 1 = 1 R_{t+1} = 1 R t + 1 = 1,因为它吃到了一块奶酪
现在我们可以更新 V ( S 0 ) V(S_0) V ( S 0 ) :
New V ( S 0 ) = V ( S 0 ) + l r ∗ [ R 1 + γ ∗ V ( S 1 ) − V ( S 0 ) ] V(S_0) = V(S_0) + lr * [R_1 + γ * V(S_1) – V(S_0)] V ( S 0 ) = V ( S 0 ) + l r ∗ [ R 1 + γ ∗ V ( S 1 ) − V ( S 0 ) ]
New V(S0)= 0 + 0.1 * [1 + 1 * 0–0] V(S0)= 0 + 0.1 * [1 + 1 * 0–0] V(S0)= 0 + 0 . 1 * [1 + 1 * 0–0]
New V(S0)= 0.1 V(S0)= 0.1 V(S0)= 0 . 1
所以我们刚刚更新了状态0的值函数。
现在我们继续与更新后的值函数互动。
总结一下:
- 使用蒙特卡洛方法时,我们从一个完整的回合更新值函数,因此我们使用这个回合的实际准确的折扣回报。
- 使用TD学习时,我们从一步更新值函数,所以我们用一个估计的回报替代我们没有的Gt,这个估计的回报称为TD目标。
现在,在深入研究Q-Learning之前,让我们总结一下我们刚刚学到的内容:
我们有两种类型的基于值的函数:
- 状态值函数:如果代理从一个给定的状态开始,并根据策略永远行动,它输出预期回报。
- 动作值函数:如果代理从一个给定的状态开始,在该状态下采取一个给定的动作,然后根据策略永远行动,它输出预期回报。
- 在基于值的方法中,我们手动定义策略,因为我们不训练它,我们训练一个值函数。这个想法是,如果我们有一个最优值函数,我们就会有一个最优策略。
有两种方法可以为值函数学习策略:
- 使用蒙特卡洛方法时,我们从一个完整的回合更新值函数,因此我们使用这个回合的实际准确的折扣回报。
- 使用TD学习方法时,我们从一步更新值函数,所以我们用一个估计的回报替代我们没有的Gt,这个估计的回报称为TD目标。
今天的内容就到这里了。恭喜你完成了本章的第一部分!这里有很多信息。
如果你对所有这些元素感到困惑,那是正常的。我和所有学习强化学习的人都有同样的感受。
在继续之前,请花时间真正理解这些内容。
由于学习和避免自以为是的最佳方法就是测试自己。我们编写了一个测验,帮助你找出需要加强学习的地方。在这里检查你的知识 👉 https://github.com/huggingface/deep-rl-class/blob/main/unit2/quiz1.md
在第二部分中,我们将学习我们的第一个强化学习算法:Q-Learning,并在两个环境中实现我们的第一个强化学习代理:
- Frozen-Lake-v1(非滑动版本):在这个环境中,我们的代理需要通过只在冰冻的方块(F)上行走并避免掉入洞(H)的方式,从起始状态(S)到目标状态(G)。
- 一个自主出租车需要学习在城市中导航,从A点将乘客运送到B点。
别忘了与想学习的朋友分享!
最后,我们希望根据你的反馈不断改进和更新课程。如果你有任何意见,请填写这个表格 👉 https://forms.gle/3HgA7bEHwAmmLfwh9