原文:
www.kdnuggets.com/2022/01/handson-reinforcement-learning-course-part-3-sarsa.html
欢迎来到我的强化学习课程❤️
1. 谷歌网络安全证书 - 快速进入网络安全职业生涯。
2. 谷歌数据分析专业证书 - 提升你的数据分析能力
3. 谷歌 IT 支持专业证书 - 支持你的组织在 IT 方面
这是我实践强化学习课程的第三部分,该课程将你从零带到 HERO ????♂️。今天我们将学习 SARSA,这是一种强大的 RL 算法。
我们仍然处于旅程的起点,解决相对简单的问题。
在 第二部分 中,我们实现了离散 Q 学习来训练Taxi-v3
环境中的一个代理。
今天,我们将更进一步,使用 SARSA 算法解决MountainCar
环境????。
让我们帮助这辆可怜的车赢得与重力的战斗!
本课的所有代码都在 这个 Github 仓库。 克隆它以跟随今天的问题。
Mountain Car 问题是一个存在重力的环境(多么惊人),目标是帮助一辆可怜的车赢得这场与重力的战斗。
这辆车需要逃离被困的山谷。车的引擎没有足够的动力一次性爬上山,因此唯一的方法就是来回驾驶,积累足够的动量。
让我们看看实际效果:
Sarsa Agent 实际效果!
你刚才看到的视频对应于我们今天将要构建的SarsaAgent
。
有趣,不是吗?
你可能在想。
这看起来很酷,但你为什么最初选择这个问题呢?
为什么是这个问题?
这个课程的哲学是逐步增加复杂性。一步一步来。
今天的环境相比第二部分的Taxi-v3
环境代表了一个小但相关的复杂性增加。
但是,这里到底难在哪里呢?
正如我们在**第二部分**中看到的,强化学习问题的难度与
-
动作空间:智能体在每一步可以选择多少种动作?
-
状态空间:智能体可以在多少种不同的环境配置中找到自己?
对于小环境,其动作和状态数量有限且较少,我们有很强的保证,像 Q-learning 这样的算法会表现良好。这些环境被称为表格或离散环境。
Q 函数本质上是一个矩阵,行数等于状态数,列数等于动作数。在这些小世界中,我们的智能体可以轻松探索状态并构建有效的策略。随着状态空间和(特别是)动作空间的增大,RL 问题变得更难解决。
今天的环境不是表格型的。然而,我们将使用离散化“技巧”将其转换为表格型环境,然后解决它。
让我们首先熟悉环境!
???????? notebooks/00_environment.ipynb
让我们加载环境:
并绘制一个帧:
两个数字决定了汽车的状态:
-
它的位置范围是**-1.2** 到 0.6
-
它的速度范围是**-0.07** 到 0.07。
状态由 2 个连续数字给出。这与 第二部分 的 Taxi-v3
环境有显著不同。我们稍后将看到如何处理这个问题。
什么是动作?
有 3 种可能的动作:
-
0
向左加速 -
1
什么都不做 -
2
向右加速
那奖励呢?
-
如果汽车的位置小于 0.5,则奖励为 -1。
-
一旦汽车的位置高于 0.5 或达到最大步骤数时,剧集结束:
n_steps >= env._max_episode_steps
默认负奖励 -1 鼓励汽车尽快脱离山谷。
一般来说,我建议你直接在 Open AI Gym environments’ GitHub 上查看实现,以了解状态、动作和奖励。
代码文档齐全,可以帮助你快速理解开始使用 RL 代理所需的一切。例如,MountainCar
的实现可以在 这里 找到。
好的,我们对环境有了了解。
让我们为这个问题构建一个基线代理!
???????? notebooks/01_random_agent_baseline.ipynb
强化学习问题可能很容易变得复杂。结构良好的代码是你保持复杂性受控的最佳盟友。
今天我们将提升我们的 Python 技能,并为所有代理使用 BaseAgent
类。从这个 BaseAgent
类,我们将派生出 RandomAgent
和 SarsaAgent
类。
BaseAgent
是我们在 [src/base_agent.py](https://github.com/Paulescu/hands-on-rl/blob/main/02_mountain_car/src/base_agent.py)
中定义的抽象类。
它有 4 个方法。
它的两个方法是抽象的,这意味着我们在从 BaseAgent
派生 RandomAgent
和 SarsaAgent
时被迫实现它们:
-
get_action(self, state)
→ 根据状态返回要执行的动作。 -
update_parameters(self, state, action, reward, next_state)
→ 使用经验来调整代理参数。在这里,我们将实现 SARSA 公式。
另外两个方法让我们能够将训练好的代理保存到磁盘或从磁盘加载。
-
save_to_disk(self, path)
-
load_from_disk(cls, path)
随着我们开始实现更复杂的模型和训练时间的增加,在训练过程中保存检查点将是一个很好的主意。
这是我们 BaseAgent
类的完整代码:
从这个 BaseAgent
类,我们可以定义 RandomAgent
如下:
让我们对这个 RandomAgent
进行 n_episodes = 100
次评估,看看它的表现如何:
而我们 RandomAgent
的成功率是…
0% ????…
我们可以通过以下直方图查看代理在每个回合中的表现:
在这 100
次运行中,我们的 RandomAgent
没有突破0.5的标记。一时间都没有。
当你在本地机器上运行这段代码时,你会得到略微不同的结果,但完成率超过 0.5 的百分比在任何情况下都远未达到 100%。
你可以使用漂亮的 show_video
函数观看我们痛苦的 RandomAgent
的操作,函数位于 [**src/viz.py**](https://github.com/Paulescu/hands-on-rl/blob/37fbac23d580a44d46d4187525191b324afa5722/02_mountain_car/src/viz.py#L52-L61)
一个随机代理不足以解决这个环境。
让我们尝试一些更聪明的东西 ????…
???????? notebooks/02_sarsa_agent.ipynb
SARSA(由 Rummery 和 Niranjan 提出)是一种通过学习最优 q 值函数来训练强化学习代理的算法。
它在 1994 年发布,比 Q-learning(由 Chris Watkins 和 Peter Dayan 提出)晚两年。
SARSA 代表 State Action Reward State Action。
SARSA 和 Q-learning 都利用贝尔曼方程来迭代地寻找更好的最优 q 值函数 Q(s, a)*
如果你记得第二部分,Q-learning 的更新公式是
这个公式是一种计算新的 q 值估计的方法,它更接近于
这个量是一个 目标 ???? 我们想要将旧估计值校正到这个目标。这是我们应该瞄准的最优 q 值的 估计,它会随着我们训练代理和 q 值矩阵的更新而变化。
强化学习问题通常看起来像带有 移动目标 的监督学习问题 ???? ????
SARSA 有一个类似的更新公式,但目标不同
SARSA 的目标
还取决于代理在下一个状态 s’ 中将采取的动作 a’。这就是 SARSA’ 名称中的最终 A。
如果你足够探索状态空间并使用 SARSA 更新你的 q 矩阵,你将得到一个最优策略。太棒了!
你可能在想……
Q-learning 和 SARSA 看起来几乎一样。有什么不同? ????
在线策略与离线策略算法
SARSA 和 Q-learning 之间有一个关键的区别:
???? SARSA 的更新依赖于下一个动作 a’,因此依赖于当前策略。随着训练的进行,q 值(及相关策略)得到更新,新策略可能会对同一状态 s’ 产生不同的下一个动作 a’’。
你不能使用过去的经验 (s, a, r, s’, a’) 来改进你的估计。相反,你需要利用每个经验来更新 q 值,然后将其丢弃。
正因为如此,SARSA 被称为在线策略方法。
???? 在 Q 学习中,更新公式不依赖于下一个动作a’,而仅依赖于**(s, a, r, s’)。你可以重用以前的经验(s, a, r, s’),这些经验是用旧版本策略收集的,以改进当前策略的 q 值。Q 学习是一种离策略**方法。
离策略方法比在线策略方法需要更少的经验进行学习,因为你可以多次重用过去的经验来改进你的估计。它们更样本高效。
然而,离策略方法在状态和动作空间扩展时,收敛到最优 q 值函数 Q*(s, a) 可能会出现问题。它们可能很棘手且不稳定。
我们将在课程后面遇到这些权衡问题,当我们进入深度强化学习领域 ???? 时。
回到我们的问题……
在 MountainCar
环境中,状态不是离散的,而是一对连续值(位置 s1
,速度 s2
)。
连续在这个背景下基本上意味着无限可能的值。如果有无限可能的状态,就不可能访问所有状态来保证 SARSA 会收敛。
为了解决这个问题,我们可以使用一个技巧。
让我们将状态向量离散化为有限的值集合。本质上,我们没有改变环境,而是改变了代理用来选择动作的状态表示。
我们的 SarsaAgent
将状态 (s1, s2)
从连续转换为离散,通过将位置 [-1.2 … 0.6]
四舍五入到最接近的 0.1
标记,将速度 [-0.07 … 0.07]
四舍五入到最接近的 0.01
标记。
这个函数正是这样做的,将连续状态转换为离散状态:
一旦代理使用离散化的状态,我们可以使用上述的 SARSA 更新公式,随着迭代的进行,我们会越来越接近最优 q 值。
这是 SarsaAgent
的完整实现。
注意 ???? q 值函数是一个三维矩阵:2 个用于状态(位置、速度),1 个用于动作。
让我们选择合理的超参数,并将这个 SarsaAgent
训练 n_episodes = 10,000
次。
让我们绘制 rewards
和 max_positions
(蓝色线条)以及它们的 50 次迭代移动平均线(橙色线条)。
太棒了!看起来我们的 SarsaAgent
正在学习。
你可以看到它的实际应用:
如果你观察上面的max_position
图表,你会发现汽车偶尔会失败爬山。
这发生的频率是多少?让我们在1,000
个随机回合中评估一下智能体:
并计算成功率:
**95.2%**的表现相当不错,但仍然不完美。记住这一点,我们将在课程后面再回来讨论。
注意: 当你在本地运行此代码时,你将得到略微不同的结果,但我敢打赌你不会得到 100%的表现。
做得好!我们实现了一个SarsaAgent
,它能够学习????
现在是一个很好的时机来暂停一下……
???????? notebooks/03_momentum_agent_baseline.ipynb
如果我告诉你MountainCar
环境有一个更简单的解决方案呢……
这辆车 100%的时间都能正常工作? ????
最好的策略是简单的。
只需跟随动量:
-
当汽车向右移动时,
velocity > 0
加速向右 -
当汽车向左移动时,
velocity <= 0
加速向左
从视觉上看,这种策略如下:
这是如何在 Python 中编写MomentumAgent
:
你可以再次检查它是否完成了每一集。100%的成功率。
如果你绘制训练后的SarsaAgent
的策略,你会看到如下图:
这与完美的MomentumAgent
策略有 50%的重叠
这意味着我们的SarsaAgent
的正确率仅为50%。
这很有趣……
为什么SarsaAgent
错误这么频繁但仍能取得良好表现?
这是因为MountainCar
仍然是一个较小的环境,因此在 50%的时间里做出错误决定并不那么关键。对于更大的问题,频繁的错误不足以建立智能体。
你会买一辆 95%时间正确的自动驾驶汽车吗? ????
另外,你还记得我们用来应用 SARSA 的离散化技巧吗?那是一个对我们帮助很大的技巧,但也给我们的解决方案带来了误差/偏差。
为什么我们不提高状态和速度的离散化分辨率,以获得更好的解决方案?
做到这一点的问题在于状态数量的指数增长,也称为维度诅咒。随着每个状态组件分辨率的提高,总状态数量呈指数增长。状态空间增长速度太快,SARSA 智能体无法在合理时间内收敛到最优策略。
好的,但是否有其他强化学习算法可以完美解决这个问题?
是的,有的。我们将在接下来的讲座中介绍这些。在强化学习算法方面,没有一种适合所有问题的通用方案,因此你需要尝试几种算法来找到最适合你问题的方案。
在 MountainCar
环境中,完美的策略看起来非常简单,我们可以尝试直接学习它,而无需计算复杂的 q 值矩阵。策略优化 方法可能会效果最佳。
但我们今天不会做这个。如果你想用强化学习完美解决这个环境,请跟随课程学习。
享受你今天所取得的成就。
哇!我们今天覆盖了很多内容。
这些是 5 个要点:
-
SARSA 是一种你可以在表格环境中使用的策略算法。
-
小型连续环境可以视为表格形式,通过离散化状态,然后使用表格 SARSA 或表格 Q 学习解决。
-
较大的环境由于维度诅咒无法被离散化和解决。
-
对于比
MountainCar
更复杂的环境,我们将需要更先进的强化学习解决方案。 -
有时候强化学习不是最好的解决方案。当你尝试解决你关心的问题时,请记住这一点。不要过于依赖你的工具(在这种情况下是强化学习),而是专注于找到一个好的解决方案。不要因为树木而看不到森林 ????????????。
???????? notebooks/04_homework.ipynb
这是我希望你做的:
-
Git 克隆 该库到本地计算机。
-
设置 本课程的环境
02_mountain_car
-
打开
[02_mountain_car/notebooks/04_homework.ipynb](http://02_mountain_car/notebooks/04_homework.ipynb)
并尝试完成两个挑战。
在第一个挑战中,我要求你调整 SARSA 超参数 alpha
(学习率)和 gamma
(折扣因子)以加快训练速度。你可以从 part 2 中获得灵感。
在第二个挑战中,尝试提高离散化的分辨率,并使用表格 SARSA 学习 q 值函数。就像我们今天做的那样。
如果你构建了一个达到 99% 性能的智能体,请告诉我。
在下一课中,我们将进入一个强化学习与监督机器学习交汇的领域 ????。
这将会非常酷,我保证。
在此之前,
享受在这个神奇的地球上的一天 ????
爱 ❤️
继续学习 ????
如果你喜欢这个课程,请与朋友和同事分享。
你可以通过[email protected]
联系我。我很乐意与您交流。
很快见!
个人简介:Pau Labarta Bajo (@paulabartabajo_) 是一名数学家和 AI/ML 自由职业者及演讲者,拥有超过 10 年的经验,处理各种问题的数字和模型,包括金融交易、移动游戏、在线购物和医疗保健。
原文。经授权转载。