组合优化的强化学习
使用深度强化学习和图形神经网络解决困难优化问题的学习策略。
为什么优化很重要?
早在几百万年前人类诞生之初,每一项技术创新和每一项发明都是由聪明人的聪明才智设计出来的,它们改善了我们的生活,提高了我们在地球上生存和发展的能力。从火到轮子,从电学到量子力学,我们对世界的理解和周围事物的复杂性已经增加到我们常常难以直观地把握它们的程度。
今天,飞机、汽车、船舶、卫星、复杂结构的设计者和许多其他努力都严重依赖算法的能力来使它们变得更好,通常是以人类永远无法实现的微妙方式。除了设计,优化在网络路由(互联网和移动)、物流、广告、社交网络甚至医学等日常事务中也起着至关重要的作用。未来,随着我们的技术不断改进和复杂化,解决巨大规模难题的能力可能会有更高的需求,并将需要优化算法的突破。
组合优化问题
广义地说,组合优化问题是涉及从有限的对象集合中找到“最佳”对象的问题。在这种情况下,“最佳”由给定的评估函数来衡量,该评估函数将对象映射到某个分数或成本,目标是找到值得最低成本的对象。大多数实际上感兴趣的组合优化问题(从现在开始称为 COPs)也非常困难,因为即使问题规模很小,集合中的对象数量也会快速增加,使得穷举搜索不切实际。
为了使事情更清楚,我们将把重点放在一个具体的问题上,即众所周知的旅行商问题(TSP)。在这个问题中,我们有 N 个城市,我们的销售人员必须访问所有的城市。然而,城市之间的旅行会产生一些费用,我们必须找到一个旅行,使旅行到所有城市并返回起始城市的总累积费用最小化。例如,下图显示了美国所有首都城市的最佳游览:
这个问题自然出现在许多重要的应用中,例如规划、递送服务、制造、DNA 测序和许多其他应用。寻找更好的旅游有时会产生严重的财务影响,促使科学界和企业投入大量精力寻找解决此类问题的更好方法。
在为包含 K 个城市的 TSP 实例构建旅程时,我们在旅程构建过程的每个阶段都要删除一个城市,直到没有城市了。在第一阶段,我们有 K 个城市可以选择开始旅行,在第二阶段,我们有 K-1 个选项,然后 K-2 个选项,等等。我们可以构建的可能旅程的数量是我们在每个阶段拥有的选项数量的乘积,因此这个问题的复杂性表现为 O(K!)。对于少数人来说,这似乎还不算太糟。假设我们有一个 5 个城市的问题,可能的旅游次数是 5!=120.但对于 7 个城市,它增加到 5040,对于 10 个城市,它已经是 3628800,对于 100 个城市,它是一个巨大的 9.332622e+157,这比宇宙中的原子数量多很多个数量级。现实世界中出现的 TSP 的实际实例通常有数千个城市,并且需要在大量文献中已经开发了几十年的高度复杂的搜索算法和试探法,以便在合理的时间(可能是几个小时)内解决。不幸的是,现实应用中出现的许多复杂问题都有独特的细微差别和限制,这使得我们无法使用最先进的解决方案来解决已知的问题,例如 TSP,而需要我们开发针对该问题的方法和启发式算法。这个过程可能是漫长而艰巨的,并且可能需要领域专家的工作来检测特定问题的组合搜索空间中的一些结构。
由于近年来深度学习在许多领域取得了巨大成功,让机器学习如何自己解决我们的问题的可能性听起来非常有希望。将为困难的 COP 设计算法的过程自动化可以节省大量的金钱和时间,并且可能产生比人类设计的方法更好的解决方案(正如我们在 AlphaGo 等成就中看到的那样,alpha go 击败了人类数千年的经验)。
用图形表示法学习
对这个问题的早期尝试出现在 2016 年,一篇名为**通过图学习组合优化算法的论文。在本文中,作者训练了一种称为 structure2vec 的图神经网络(我在另一篇文章中讨论了图神经网络)来贪婪地构造几个硬 COP 的解决方案,并获得了非常好的近似比率(生产成本和最优成本之间的比率)。**
基本思想是这样的:问题的状态可以表示为图形,神经网络在图形上构建解决方案。在解决方案构建过程的每次迭代中,我们的网络观察当前的图,并选择一个节点添加到解决方案中,之后根据该选择更新图,并重复该过程,直到获得完整的解决方案。
作者使用 DQN 算法训练他们的神经网络,并展示了学习模型归纳到比训练时大得多的问题实例的能力。他们的模型甚至可以很好地推广到 1200 个节点的实例(同时在大约 100 个节点的实例上进行训练),并且可以在 12 秒内产生解决方案,有时比商业求解器在 1 小时内找到的解决方案更好。他们方法的一个很大的缺点是他们使用了一个“助手”函数,来帮助神经网络找到更好的解决方案。这个助手功能是人为设计的,并且是特定于问题的,这是我们想要避免的。
这种基于图的状态表示的使用很有意义,因为许多 COP 可以非常自然地以这种方式表达,如 TSP 图的这个示例所示:
节点代表城市,边包含城市间的距离。可以在没有边属性的情况下构建一个非常相似的图(如果我们出于某种原因不知道距离)。近年来,对图形进行操作的神经网络模型的流行程度令人难以置信地上升(无论是否假设知道结构),最显著的是在自然语言处理领域,其中变压器风格的模型已经成为许多任务的最先进技术。
有很多优秀的文章详细解释了 Transformer 架构,所以我不会过多地钻研它,而是给出一个非常简要的概述。谷歌研究人员在一篇名为“ 注意力是你所需要的全部 ”的著名论文中介绍了 transformer 架构,并用于处理 NLP 中出现的序列问题。不同之处在于,与 LSTMs 之类的递归神经网络(明确地输入一系列输入向量)不同,变换器将输入作为一组对象输入,并且必须采取特殊手段来帮助它看到“序列”中的顺序。转换器使用几个层,由多头自关注子层和全连接子层组成。
与图的关系在关注层中变得很明显,这实际上是输入“节点”之间的一种消息传递机制。每个节点观察其他节点,并关注那些看起来对它更“有意义”的节点。这与 图注意力网络 中发生的过程非常相似,事实上,如果我们使用一个掩码来阻止节点向非相邻节点传递消息,我们会得到一个等效的过程。
学会在没有人类知识的情况下解决问题
他们在发注意!学会解决路由问题 ”,作者解决了几个涉及图上路由代理的组合优化问题,包括我们现在熟悉的旅行推销员问题。他们将输入视为一个图,并将其提供给一个修改过的 Transformer 架构,该架构嵌入了图的节点,然后依次选择节点添加到旅程中,直到构建了一个完整的旅程。将输入视为一个图表是比输入一系列节点更“正确”的方法,因为它消除了对输入中给出的城市顺序的依赖性,只要它们的坐标不变。这意味着,无论我们如何排列城市,给定图形神经网络的输出将保持不变,这与序列方法不同。
在本文介绍的体系结构中,图是由 transformer 风格的编码器嵌入的,它为所有节点生成嵌入,并为整个图生成单个嵌入向量。为了产生解决方案,每次给定一个单独的解码器网络一个特殊的上下文向量,该向量由图嵌入、最后一个和第一个城市的嵌入以及未访问城市的嵌入组成,并且它输出未访问城市的概率分布,该概率分布被采样以产生下一个要访问的城市。解码器按顺序产生城市,直到旅程完成,然后根据旅程的长度给予奖励。
作者使用称为增强的增强学习算法来训练他们的模型,这是一种基于策略梯度的算法。他们版本的伪代码可以在这里看到:
它们使用展开网络来确定性地评估实例的难度,并定期用策略网络的参数更新展开网络。使用这种方法,作者在几个问题上取得了很好的结果,超过了我在前面提到的其他方法。然而,他们仍然在多达 100 个节点的小实例上训练和评估他们的方法。虽然这些结果很有希望,但与现实世界相比,这种情况微不足道。
扩展到非常大的问题
最近,论文“ 通过深度强化学习 在大型图上学习启发式算法”向现实世界规模的问题迈出了重要的一步。在本文中,作者训练了一个图卷积网络来解决诸如最小顶点覆盖(MVC)和最大覆盖问题(MCP)之类的大规模问题。他们针对这些问题使用了一种流行的贪婪算法来训练神经网络嵌入图并预测每个阶段要选择的下一个节点,然后使用 DQN 算法对其进行进一步训练。
他们在有百万节点的图上评估了他们的方法,并取得了比当前标准算法更好更快的结果。虽然他们确实使用了手工制作的启发式方法来帮助训练他们的模型,但未来的工作可能会消除这种限制,并学会从头开始解决巨大的问题。
总的来说,我认为在具有巨大搜索空间的问题中寻找结构是强化学习的一个重要而实用的研究方向。许多 RL 的批评者声称,到目前为止,它只被用于解决游戏和简单的控制问题,将它转移到现实世界的问题仍然非常遥远。虽然这些说法可能是真的,但我认为我在这篇文章中概述的方法代表了非常真实的用途,可以在不久的将来使 RL 受益,很遗憾它们没有像视频游戏的方法那样吸引那么多的关注。
我实现了一个相对简单的算法,使用图卷积网络来学习解决最小顶点覆盖问题的实例。随意查看。
手机游戏的强化学习
使用最先进的强化学习来学习大规模玩 Android 游戏
Image Source: pixabay.com
介绍
自从 5 年前随着最初的 DQN 论文被引入以来,深度强化学习已经引起了很大的轰动,该论文显示了强化学习如何结合神经网络进行函数逼近,可以用来学习如何从视觉输入中玩雅达利游戏。
从那以后,算法有了许多改进,不断超越以前的基准。研究和测试新算法通常使用快速稳定的 Atari 基准,以及定制的环境,如在 OpenAI Gym 和 DMLab 中发现的那些环境。此外,我们可以使用模拟器运行数百个使用 Gym Retro 库的经典主机游戏。
对于现代游戏来说,最近的主要焦点是最难的竞技游戏,特别是 Dota2 和 Starcraft2。两者都从 OpenAI 和 DeepMind 中取得了令人印象深刻的成果,在一个巨大的分布式集群中进行训练,达到了数千年游戏经验的总和。在这两种情况下,观察/输入都是数字特征,而不是视觉帧,绕过了 AI 学习如何提取这些特征的需要,就像通常对 Atari 游戏所做的那样。所需的计算资源也不是大多数研究人员或小公司所能提供的。
在这里,我试图将 RL 应用到一些现代的移动 android 游戏中,仅使用视觉输入作为观察,并使用合理的预算量的计算资源,与学习玩 Atari 游戏时通常被认为是“样本高效”的一样。
Android 环境
我使用可配置数量的 Android 模拟器作为 RL 代理学习游戏的环境。每个仿真器由异步驱动程序控制,该异步驱动程序通过抓取视觉帧、使用 RL 策略选择动作、将该动作发送回仿真器以及将转换数据发送回用于训练来收集训练经验。
不是真正的仿真
就其核心而言,android 仿真器是一个“真正的仿真器”,能够仿真 ARM 指令集,并可能能够用作完全仿真的 RL 环境,类似于 ALE 或 gym-retro 环境,其中当需要下一个动作/观察步骤时,可以根据需要暂停/恢复仿真。然而在现实中,Android 模拟器上的模拟速度非常慢,尤其是对于游戏,对于我们的任务来说是不可行的。
唯一的选择是使用 CPU 的硬件加速来运行仿真器(在 windows/linux 上使用 HAXM/KVM)。在这种情况下,使用 x86 android 映像,android 指令使用虚拟化直接在主机 CPU 上实时运行。这让我们达到了我们需要的稳定的 android 性能,但也有一些缺点:
- 这意味着仿真器实时运行。这意味着我们需要一致地抓取帧、选择动作并以最小的延迟发送这些动作。例如,代理不能暂停并等待训练步骤完成,因此每个环境实例必须异步运行
- 这也意味着我们受限于“实际游戏时间”,例如 60FPS,相比之下,模拟环境如 ALE 可以将模拟游戏时间加快几个数量级,从而加快训练速度
- 因为 android 模拟器现在运行的是 CPU 虚拟化,所以在流行的云提供商的 VM 实例上运行模拟器是有问题的。其中一些提供者为此支持“嵌套虚拟化”,但实际上,我无法很好地实现这一点。模拟器要么无法启动,要么成功启动但运行速度比在非 VM 服务器上慢得多。这限制了我们在定制服务器版本或“裸机”云服务器上运行这些环境,而这种情况很少见。
帧抓取
环境驱动程序以固定的可配置速率从仿真器获取可视帧,并跟踪由于代理中的延迟而导致的“丢帧”数量。主要目标是确保最少的丢帧,这可能对游戏不利。这需要限制在一台机器上运行的模拟器的数量,特别是当训练也在同一台机器上进行时,以确保有足够的 CPU 带宽用于表演和训练。每个模拟器需要 2 个专用 CPU 内核(4 个 vcpu)才能获得稳定的游戏体验。
我将帧抓取配置为 30FPS,跳帧为 2 或 4(相比之下,Atari 培训中通常使用 60FPS 的跳帧为 4)。
android 模拟器以 320x480(纵向)分辨率运行,以最小化渲染开销。这是游戏仍能正常运行的最低分辨率。这为我们提供了大小为 320x480x3 的原始观察值,然后将其缩小到 80x120x3,用于作为策略输入的最终观察值(与大多数 Atari 研究中使用的 84x84x1 灰度观察值相比)
行动延迟
我遇到的另一个问题是,从我发送动作到游戏实际接收/执行动作,Android 模拟器存在固有的延迟。延迟大约为 60-90 毫秒,这似乎可以忽略不计,学习应该能够解释这一点(甚至 DeepMind 最近的星际争霸 2 作品也提到了大约 250 毫秒的延迟),但实际上,我发现这些会损害最佳学习如何玩的能力。
为了证实这一点,我为 OpenAI gym 的 Atari 环境创建了一个定制的包装器,其中插入了一个人工的可配置的延迟,从代理发送一个动作开始,直到它被发送到实际环境。即使有 60-90 毫秒的延迟,与没有延迟相比,当训练有延迟的调谐 RL 算法时,我看到最终性能有不可忽略的下降。
这并不是说我们不应该学习如何处理这种延迟,因为在将 RL 应用于机器人或无人机等实时任务时,这些延迟可能是常见的情况。但是,在测试和比较 RL 算法时,可能值得考虑将这种延迟插入到常用的基准任务中,以确保算法对它们是健壮的。
检测和跳过屏幕
为了提供可用于 RL 的环境,我们需要通过不相关的屏幕处理检测和点击:
- 点击正确的位置开始新游戏
- 检测表示游戏结束的屏幕,点击适当的位置开始新的游戏
- 检测各种弹出屏幕并关闭它们(消息、新角色解锁、新项目等)…)
以上可能会以某种方式自动化,甚至可能使用某种人工智能/学习,但这是一个完全不同的主题,我没有处理。目前,我只是手动配置了每个游戏的相关屏幕以及遇到这样的屏幕时在哪里点击。
奖励
我使用了基于“分数变化”的奖励信号。这使得每次分数变化时都有+1 的奖励。我发现,在这种情况下,不需要处理实际得分值的 OCR,只需检测得分值的变化并给出+1 就足够了,而且也更容易。对于大多数游戏,这转化为实际分数(除了一些偶然的错误检测)。此外,由于许多 RL 算法将奖励限制为-1/+1,因此在这种情况下检测实际分数就不那么重要了。
示例高效可扩展 RL
由于在 Android 模拟器上训练的缓慢和高资源成本,我去寻找一个样本有效的 RL 算法,它可以很好地扩展到多种环境。
我尝试了各种 RL 算法,但最终专注于 q-learning 变体,特别是由于我试图学习的游戏具有离散的动作空间,对错误的容忍度接近零(即,选择单个错误的动作经常会导致游戏结束)。这使得 q-learning 等基于价值的方法比 actor-critic 变量等随机算法更合适(尽管随机算法仍有可能收敛到一个好的策略,但我最初使用 PPO 获得了相当好的结果,但使用 DQN 变量总体上更稳定、更好)。
当前用于离散动作的去样本高效 RL 算法是彩虹。Rainbow 采用了原始的 DQN 算法,并将 6 种独立的改进结合到一个代理中,在 Atari 基准测试中达到了 200M 总帧数阈值(约 38 天的“播放时间”)的最先进结果。
IQN 是 DQN 的改进分布式版本,超越了之前的 C51 和 QR-DQN ,能够几乎匹配彩虹的性能,没有彩虹使用的任何其他改进。
不过,彩虹和 IQN 都是“单代理”算法,在单个环境实例上运行,需要 7-10 天的时间来训练。以 60fps 的速度对 200M 帧实时运行一个 android 模拟器代理需要 38 天。
对于多角色/分布式 q 学习,最先进的是 R2D2。R2D2 是一种分布式多角色算法,在之前发布的 APEX 的基础上进行改进,增加了额外的改进,特别是使用了 DQN 模型的“递归”版本,在中间添加了 LSTM 层,以帮助代理保持到目前为止发生的事情的“记忆”,并对其行动进行更好的长期规划。
LSTM 被证明是一个很大的帮助,即使在雅达利上,大多数游戏都是完全可见的(即游戏的完整状态可以在屏幕上看到),这似乎不会受益于 LSTM 记忆。没有太多关于它为什么有帮助的研究,但一个可能的解释是它允许策略“遵循计划”,这允许它更有效地学习和玩耍。
R2D2 在几乎所有的 Atari 游戏上都获得了极高的分数,几乎没有改进的空间,然而,这是以样本效率为代价的,需要看到比样本效率算法多 50 倍的环境帧。尽管如此,由于其高度分布式架构在使用 256 个 CPU 的高速 Atari 模拟器上运行 256 个异步角色,它能够在比 Rainbow/IQN 更短的时间(5 天)内实现这一目标。这对于我的 android 系统来说是不可行的,环境运行速度慢了 10 倍,每个实例需要 2 个 CPU。
为了最大化我的资源利用率和最小化训练时间,我致力于将 IQN/彩虹/R2D2 的特征结合到一个“递归 IQN”训练算法中(完整细节在此),该算法在 Atari 基准测试中实现了改进的样本效率结果,并可以选择并行运行多个参与者,使我能够在合理的时间内(最多几天)在缓慢的 android 环境中有效地进行训练。
培训设置
为了进行培训,我使用了一个带有 32 个 CPU 和一个 NVIDIA 1080ti GPU 的定制(非 VM)服务器。我在每个培训课程中运行了 12 个 Android 实例,每个实例使用主策略的共享内存副本在不同的进程中异步收集经验,以避免其中一个参与者不得不暂停时的延迟(例如在游戏结束后重新开始)。从训练步骤之间的过程中检索经验,以填充训练重放缓冲器。
我使用了与 Atari 基准测试相同的超参数和’递归 IQN’ 算法,并做了一些修改:
- 从 12 ENVs 减少到 12 ENVs
- env 异步运行,而不是矢量化运行,共享内存策略每 1000 步更新一次,权重来自训练策略
- 固定的衰减探索率,每个演员从 1.0 到 0.001(需要极低的探索率,因为我正在使用的游戏对“错误动作”非常敏感,所以常见的 0.01 率会使训练演员很难达到更长的剧集)
- 视觉游戏帧从 320x480x3 分辨率缩放到 80x120x3 RGB 观察值(与 Atari 中常用的 84x84x1 灰度观察值相比)
- 以 30FPS 的速度从模拟器中抓取帧,根据游戏的不同,跳帧次数为 2 或 4,没有“最大合并”(即代理转换为每秒 15 或 7.5 步,而 Atari learning 通常为每秒 15 步)。在一些游戏中需要较低的速率,否则这些动作会比步进时间更长(例如滑动动作)
游戏和结果
我使用以下 3 个游戏来集中测试:
- 对于人类玩家来说,这是一个非常困难和令人沮丧的游戏,需要非常快速和精确的反应时间,但是有非常简单的机制和恒定的视觉效果,所以总体的学习策略应该是相对简单的
- 地铁冲浪者:流行的无尽街机游戏,通过在 3 条车道之间滑动来躲避火车,跳跃或蹲在障碍物上方和下方,并试图收集沿途的硬币
- Crossy Road :臭名昭著的斗鸡游戏要求代理人提前计划,并在正确的时间开始行动,同时考虑迎面而来的交通和汽车轨迹,漂浮的积水和快速通过的火车
所有比赛都使用最终训练政策进行评估,没有随机行动。
拍打鸟
A high score for Flappy Bird. Reached the 30-minute time limit without dying
Flappy Bird 以 30FPS 的速度训练,跳帧为 2(每秒 15 步),总共 25M 步(相当于样本高效 Atari 训练中使用的总“游戏时间”的一半)。使用 12 个模拟器训练大约需要 40 个小时。
动作空间有一个单独的动作(点击)和一个附加的“无操作动作”。每次分数改变时(即每次小鸟通过一个管道时),奖励为+1
Training chart for Flappy Bird, average reward of last 100 episodes
这个游戏因需要时间开始学习而臭名昭著,因为最初的奖励只有在通过第一个管道后才能收到,这对于使用随机探索的未经训练的代理来说可能是极其困难和随机的。0 奖励的初始步骤有几十万,也就是说代理根本没有反馈,没有办法学习。只有在我们获得了一些通过第一个管道的经验(这完全是随机的)之后,代理才最终开始弄清楚它,从那一点开始,它相当稳定地改进,但是它需要经过 2M 步骤才能到达那一点。
这个游戏对错误的动作非常敏感,例如,用 0.001 的随机动作 epsilon 进行评估会产生 143 的平均奖励,而不是 420,这也可以在训练图表最终结果中看到(训练也使用 0.001 作为最终探索率)
评估分数:平均 420,最高 1363 (10 集评估)
地铁冲浪者
2 high scoring Subway Surfer games
对于这个游戏,我使用了硬币收集计数作为奖励,以鼓励代理收集硬币,这本身并不是为了进步所必需的,而是一种重要的学习能力。我还在游戏结束时增加了一个负(-1)奖励,以鼓励代理学会不要输,不管收集了多少硬币。
该游戏以 30FPS 的速度训练,跳帧为 4(每秒 7.5 步,而雅达利通常使用的是 15 步,因为滑动手势需要的时间超过 66 毫秒),共 25 米步(总游戏时间相当于使用 200 米帧、60FPS 的普通样本高效雅达利训练)。使用 12 个模拟器训练大约需要 90 个小时。
这里的动作空间有 4 个动作(上/下/左/右滑动)和“noop 动作”。
有趣的是,代理人几乎从不选择 noop 动作,而总是喜欢跳或滑下,即使它并不真的需要。这有点道理,因为这样做没有坏处,而且只在某些情况下有帮助(不是所有的训练都是这样,有些有更多的 noop 动作)。我们也许可以通过对每一个行动增加一个小的负奖励(例如-0.1)来减轻这一点。
Training chart for Subway Surfers, average reward of last 100 episodes
评估分数:平均 142,最高 434 (30 集评估)
十字路口
3 high scoring Crossy Road games
克罗斯路与地铁冲浪者以相同的帧/步速率进行训练。每一次分数变化的奖励是+1(也就是鸡每向前移动一步)。
代理显然倾向于只向前移动,但它知道向左/向右移动,甚至在需要时向后移动。
Training chart for Crossy Road, average reward of last 100 episodes
评估分数:平均 41,最高 139 (30 集评估)
结论
到目前为止,结果看起来很有希望,尽管仍然不是我们认为的“超人”(除了 Flappy Bird)。尽管如此,看到 RL 能够在合理的时间、框架和资源范围内,使用与 Atari 相同的超参数,从视觉输入中实时学习现代休闲游戏,还是很有希望的。
从图表中也可以很清楚地看到,学习并没有停滞不前,看看我们在 50 米甚至 100 米甚至更远的步数上,通过一些超参数调整可以得到什么结果,这将是很有趣的。
[## 基于递归 IQN 的快速样本高效 Q 学习
一篇关于用于这些结果的“递归 IQN”训练算法的文章
opherlieber.github.io](https://opherlieber.github.io/rl/2019/09/22/recurrent_iqn) [## 奥菲利贝尔/rltime
RLtime 是一个强化学习库,专注于最先进的 q 学习算法和功能
github.com](https://github.com/opherlieber/rltime)
现实世界机器人的强化学习
来自现实世界机器人控制的 RL 文献的想法
机器人——承诺
机器人在现代工业中无处不在。与上个世纪的大多数科幻作品不同,人形机器人仍然没有洗我们的脏盘子和倒垃圾,也没有施瓦辛格式的终结者在战场上战斗(至少目前如此……)。但是,几乎在每一个制造工厂里,机器人都在做着几十年前人类工人曾经做过的那种单调乏味、要求苛刻的工作。任何需要在可以仔细控制和监控的环境中重复和精确工作的东西都是机器人取代人类的良好候选对象,今天的前沿研究正在快速接近自动化任务的可能性,这些任务非常困难,即使我们可能认为它们很乏味(如驾驶)。
我们迷恋机器人背后的动机显而易见;对许多人来说,一个人类从艰苦无聊的体力劳动中解放出来的未来似乎是非常令人向往的。此外,机器特有的精确性和一致性可以减少由于人为错误而发生的灾难,如车祸和手术中的医疗事故。我们开始在生产线之外看到这场革命的第一个先兆;在亚马逊这样的大型仓库中,机器人正被用来代替人工运输板条箱。
虽然我们仍然没有在战场上使用杀人的人形机器人,但我们确实有在世界各地执行侦察和战斗任务的半自动无人机。军事高级研究机构正在努力使士兵远离危险,让机器进行实际战斗,我希望在未来的几十年里我们确实会看到这样的发展。
机器人强化学习
为什么几十年前的科幻小说几乎总是认为我们不久的将来包括智能人形机器人做一切事情,而我们似乎离它很远?为什么我们的制造工厂到处都是机器人,而我们的街道和家庭却没有?对于一个在给定环境中成功操作的机器人来说,它必须以某种方式理解它,计划它的行动并使用某种驱动手段执行这些计划,同时使用反馈来确保一切按照计划进行。
事实证明,这些组成部分中的每一个都是一个非常困难的问题,而我们人类容易做到的事情(如识别视觉场景中的物体并在某种程度上预测人们的意图)对计算机来说往往具有难以置信的挑战性。近年来,深度学习在计算机视觉的各种任务中占据了突出地位,但理解典型步行街场景所需的广泛技能仍不在当前技术的掌握范围内。
事实证明,在流水线上工作和在街上工作有着天壤之别。在装配线上,环境中的一切通常都可以精确控制,机器人需要执行的任务往往非常具体和狭窄。尽管有这些优势,为制造机器人设计运动规划和控制算法是一个漫长而乏味的过程,需要许多领域专家的共同努力。这使得这一过程非常昂贵和漫长,凸显了我们目前的能力与需要在更广泛的环境中操作并执行一系列任务的机器人所需的能力之间的巨大差距。如果我们在为那些狭窄的任务设计算法时有困难,我们怎么能把机器人扩展到我们的家庭呢?这些机器人将不得不在城市空间通常复杂的景观中导航,处理混乱的现实世界(比较一下洗碗池中随意留下的盘子和油漆汽车外部,在装配线上精确放置和定时),并在确保安全的情况下与人类互动。
近年来,深度学习和强化学习的成功使得许多研究人员开发了使用强化学习控制机器人的方法。动机很明显,我们能否通过让机器人自主学习来自动化设计传感、规划和控制算法的过程?如果可以,我们会立刻解决我们的两个问题;节省我们花费在为我们知道如何解决的问题(工业机器人)设计算法上的时间和精力,并为那些我们目前没有解决方案的更困难的问题获得解决方案。
深度强化学习是在各种视频游戏和棋盘游戏,或者相对简单的模拟控制问题中取得惊人成功后才引起公众注意的。在这些任务中,代理学习的环境和它必须操作的环境是相同的,我们可以有效地使用模拟来允许代理在学习解决任务之前进行多次尝试。深度强化学习算法是出了名的数据低效,在学习解决一个任务(如玩 Atari 游戏)之前,通常需要进行数百万次尝试。如果我们试图在现实世界中应用同样的方法来训练我们的机器人,这将花费不切实际的时间,并且很可能在这个过程中摧毁机器人。或者,我们可能天真地试图使用模拟来训练我们的代理,然后在真实的机器人上部署训练好的策略。但是模拟真实世界的复杂性是非常困难的,并且这种策略在物理机器人上通常表现不佳。
将 RL 应用于机器人技术存在许多挑战,在我看来,其中许多挑战可以粗略地分为以下四类:
样本效率(Sample efficiency):如果我们希望使用物理机器人来训练我们的政策,我们必须开发出只需要少量尝试就能学会的算法,这样训练才是可行的,不像我们今天拥有的许多算法。
Sim2Real :如果我们希望在模拟环境中训练我们的策略,然后部署它们
奖励规格:下象棋或者星际争霸 2 的时候目标非常明确,容易量化;无论输赢。然而,在洗碗这样的事情上,你如何量化成功的程度呢?还是叠衣服?
安全:我们的机器人政策必须是安全的(在机器人训练和部署到现实世界期间),以确保机器人本身的完整性以及环境中人员和财产的安全。
我将主要讨论前两个类别,简单谈一下第三个类别,避开最后一个。
样品效率
传统上,当希望 RL 中的样本复杂度极低时,首选方法是基于模型的 RL。在基于模型的 RL 中,代理试图学习环境的模型并使用它来计划和改进它的策略,从而大大减少它需要与环境交互的次数,而不是仅基于通过与环境交互获得的奖励来学习策略。然而,与无模型算法相比,这种方法通常导致较低的渐近性能,并且有时由于学习模型中的误差而遭受灾难性的失败。
基于模型的 RL 在动力学可以由简单模型(例如线性模型)充分表示的问题中表现出巨大的成功,但是在需要非线性模型(例如深度神经网络)的更复杂的环境中还没有取得巨大的成功。2018 年,来自伯克利的研究人员就该主题发表了一篇论文,其中他们确定了不稳定问题的一个可疑原因,并提出了一个解决方案。
在他们的论文中,他们声称,在学习和规划期间,该策略倾向于利用状态空间中学习模型表现不佳的那些区域,这使得代理“偏离路线”,从使用学习模型可以可靠地提前规划的区域转向完全盲目的区域,使其无效。他们的解决方案相对简单;学习几种不同的环境模型,并在规划期间从这些不同的模型中统一取样,有效地规范学习过程。这使得基于模型的 RL 能够应用于比以前更复杂的任务,以更少的数量级尝试实现与无模型算法相当的渐近性能。
有趣的是,最近的一个无模型算法已经展示了出色的样本复杂性,以至于有可能在相对较短的时间内在一个真实的机器人上训练一个策略。2019 年,来自伯克利和谷歌大脑的研究人员发表了一篇论文,其中他们描述了一种称为软演员评论家(SAC)的非政策演员评论家算法。他们在几个传统的 RL 控制基准上证明了这种算法在低样本复杂度的情况下表现非常好,然后继续训练机器人在仅 4 小时的环境交互中行走。
该机器人被训练在平坦的表面上行走,然后在不同障碍的表面上成功测试,显示了所学策略的鲁棒性。
另一个不错的论文走了一条不同的道路来采样效率;通过抛弃策略必须从零开始学习的概念,并且应该利用现有的不完善的控制算法来提供一个“框架”,在该框架上发展策略。通过利用现有控制算法对于该问题表现良好的事实,该策略可以学习微调控制系统,而不是像大多数 RL 算法那样从随机行为开始。他们使用这种方法来训练机器人完成涉及复杂动力学的真实积木组装任务。
模拟现实
在过去的几年中,许多研究论文已经证明了他们学习的 RL 策略在物理机器人平台上操作的能力,但是这些策略通常局限于狭窄的任务,并且通常需要大量的手动调整才能正常工作。特别是对于使用视觉传感的机器人来说,逼真地模拟机器人可能遇到的图像是极其困难的,这就产生了著名的 Sim2Real gap。
在动力学可以通过模拟充分捕获的问题中,RL 实际上可以很好地工作,正如在这篇论文中可以看到的那样,在这篇论文中,一个策略被训练为使用模拟来学习四足机器人的恢复策略,并且它很好地转移到真实的机器人,具有令人印象深刻的 97%的成功率。然而,在这个问题中,状态是相对低维的,不像视觉表现。
为了解决处理视觉输入的问题,OpenAI 和 Berkeley 在 2017 年发表的一篇很好的论文提供了一个非常简洁的解决方案;将环境提供的视觉输入随机化,并训练策略对这些变化非常稳健,希望真实世界会喜欢模拟的另一种变体。
这非常有效,他们能够在真实的机器人抓取系统中使用仅在模拟中训练过的物体检测器。
这项工作的一个非常酷的延续发表在 2019 年的一篇论文。在这篇论文中,研究人员使用了类似的随机化模拟来帮助训练策略变得鲁棒,但同时训练了一个条件 GAN (cGAN)来将随机化图像转换回原始模拟的规范形式。在测试期间,cGAN 将真实图像转换为策略熟悉的标准图像形式,从而有助于减少模拟真实图像的差距。使用这种方法,他们在模拟中训练了一个代理,并将其用于一个机器人上,成功率为 70%。在真实的机器人上使用一些微调,他们能够达到 91%甚至 99%的成功率。
奖励规格
假设你想让你的机器人学会把书放在书架上,并且你有一个样本复杂度非常低的算法。如何为此设计一个奖励函数呢?在一篇非常酷的 2019 年论文中,来自伯克利的研究人员正是这么做的。他们没有指定奖励函数,而是为算法提供了一个目标状态的几个图像(排列好的书架),并允许它询问用户(非常少的次数)当前状态是否是一个目标状态。使用之前提到的 Soft Actor Critic 算法和其他几种算法,他们在几个小时内就在一个真实的机器人上训练了他们的策略。他们针对不同的任务训练不同的策略,比如把书放在书架上,在盒子上盖一块布。
结论
将 RL 应用于现实世界机器人问题的挑战还远远没有被宣布解决,但已经取得了很大进展,希望我们将继续看到这一令人兴奋的领域的进一步突破。
强化学习框架和工具包(Gym 和 Unity)
介绍强化学习框架,以及环境 Cart-pole(健身房)和 Banana collector(Unity)
强化学习为学习策略提供了一个框架,该学习策略将状态映射为行动,目标是最大化累积回报。在这篇文章中,我们提出了这个框架是如何数学公式,以及哪些算法可以用来解决 RL 问题。我们还将讨论(1) Gym 和(2) Unity 的使用,这两个工具包用于开发和比较强化学习算法。
Gym — classic control environments https://gym.openai.com/envs/#classic_control
强化学习框架
强化学习是基于迭代学习思想的机器学习的一个领域。学习者,或者决策者,被称为代理,它与环境互动,接收被称为奖励的反馈。代理的目标是通过与环境的迭代来最大化回报。在强化学习问题中,我们认为时间步长是离散的。在第一时间步,代理观察环境的状态,选择动作作为响应。随后,环境向代理呈现一个新的状态和一个奖励,显示它的动作是多么恰当。这个过程在下面的时间步骤中继续,获得一系列的状态、动作和奖励。在反复试验之后,代理人学会执行适当的行动,以最大化预期累积报酬。
Sequence of states, actions, and rewards
建立奖励,以便当代理试图最大化它时,也学习特定的行为(例如,玩视频游戏或驾驶汽车)。智能体的设计不是为了最大化即时报酬,即时报酬是执行一个动作后环境提供的报酬,而是期望的累积报酬。预期累积奖励是从下一个时间步开始的奖励总和,用 Gt 表示;我们使用预期这个术语,因为代理人不能确定地预测未来的回报是什么。
Expected cumulative reward at time step t
为了强调比未来奖励来得更早的奖励,我们计算了折现奖励,代表γ折现率。折扣率是介于 0 和 1 之间的数字,由开发者在定义强化学习任务时设置。
Discounted reward at time step t
折现率γ=1 代表未折现的奖励,而γ=0 代表最直接的奖励,这意味着γ越大,代理人考虑的未来奖励就越多。
使用马尔可夫决策过程来描述强化学习的环境。这个过程定义为:(1)一组状态 S ,(2)一组动作 A ,(3)一组奖励 R ,(4)环境的一步动力学p(S′,r|s,a) ,(5)一个贴现率 γ 。环境在时间步长 t+1 做出响应,仅考虑前一时间步长的状态和动作。单步动态和奖励描述了环境如何工作;因此,代理不知道它们,它通过与环境迭代来学习如何采取适当的行动。
一个策略描述了代理的行为,是从一组状态到一组动作的映射。该策略可以是(1)确定性的,或者(2)随机的。一个确定性策略将状态映射到动作 π:S→A ,将一个状态作为输入,提供一个动作作为输出。相反,一个随机策略***π:SxA→【0,1】*取一个状态和一个动作,输出在那个状态下采取那个动作的概率。
代理的目标是学习最优策略**。如果预期收益大于或等于所有州的所有其他策略的预期收益,则认为策略是最优的。在我们深入了解最优性的概念之前,我们先介绍两个在强化学习中经常会遇到的函数:(1)状态值函数和(2)动作值函数。状态值函数是从状态 s 开始并遵循策略 π 时所有时间步长的预期收益,用小写的 v. 表示******
State-value function
有一个公式可以简化状态值函数的计算,称为贝尔曼期望公式。根据这个等式,可以使用下一个状态的期望值和期望的即时报酬来计算任意状态 s 处的状态值函数。
Bellman expectation equation
另一个有趣的函数是用小写字母 q 表示的动作值函数。该函数不仅依赖于环境的状态,还依赖于代理的动作,表示期望的回报,如果代理在状态 s 开始,采取动作 a ,然后对于所有未来的时间步骤遵循策略【π**。****
Action-value function
智能体的目标是通过与环境的迭代获得最优动作值函数q∫**,然后使用这个动作值函数获得最优策略π∫。我们可以通过选择动作 a 来轻松实现,该动作为每个状态提供最大q∫******
Optimal policy
强化任务的目标是获得代表最优代理行为的最优策略。为此,我们可以采用多种多样的算法,这些算法通常分为两组:(1) 基于值的方法,以及(2) 基于策略的方法。基于价值的方法通过学习最优行动价值函数Q∫(s,a)** 间接计算最优策略。然后,我们可以通过为每个状态选择最大化 Q 的动作来获得最优策略。相反,基于策略的方法直接找到最优策略,而不必计算动作值函数估计。下表显示了最著名的算法。****
Reinforcement learning algorithms
所采用的算法取决于状态和动作空间的类型:(1)离散的,或(2)连续的。离散的空间呈现有限的一组状态和动作。在离散空间中,我们可以将 Q 表(动作值函数估计)表示为字典或查找表。前述算法 Q-Learning 和 Sarsa 只能在离散空间中运行。然而,大多数强化学习应用需要连续的状态和动作空间。例如,在机器人学中,通常使用速度、位置和扭矩等连续变量。连续空间不呈现有限的可能性集合;它们可以取一系列的值。为了处理连续空间,我们可以采用两种策略:(1) 离散化,以及(2) 函数逼近。离散化允许我们使用算法 Q-Learning 和 Sarsa,只需很少或不需要修改。当需要的离散空间数量非常大时,离散化是不可行的,函数逼近成为唯一的选择。深度神经网络成为处理连续空间的最有吸引力的替代方案,可以轻松捕捉状态和动作之间的非线性关系。深度 Q 学习算法可以应用于呈现连续状态空间的强化学习问题,但是动作空间仍然必须是离散的。为了与连续状态和动作空间一起工作,必须使用基于策略的算法,例如增强或近似策略优化。另一种选择是使用行动者-批评家方法(基于价值的方法和基于政策的方法的结合),例如深度确定性政策梯度。
在以后的文章中,我们将解释如何使用 Pytorch 编写这些算法来训练代理。然而,本文主要关注于理解强化学习框架和工具包(Gym 和 Unity)。这两个库都提供了用于训练的代理,这意味着我们可以将上述算法之一应用于这些代理,以便它们学习特定的任务。
强化学习工具包——健身房
Gym 是开发强化学习算法的开源库。该工具包提供了从 Atari 游戏到机器人的各种环境。用户可以很容易地与代理交互,目的是应用一种算法来教会他们一个特定的任务(例如,在游戏中最大化得分,训练机器人行走,或平衡汽车上的杆子)。
第一步是在你的电脑上安装 Gym。要做到这一点,我们可以查阅官方网页,
****[## Gym:开发和比较强化学习算法的工具包
健身房图书馆是一个测试问题——环境——的集合,你可以用它来制定你的强化…
gym.openai.com](https://gym.openai.com/docs/#installation)****
或者,我们可以阅读 Genevieve Hayes 在《走向数据科学》上发表的以下文章。
**** [## 如何在 Windows 环境下安装 OpenAI Gym
一步一步的指导如何建立和运行 OpenAI 健身房
towardsdatascience.com](/how-to-install-openai-gym-in-a-windows-environment-338969e24d30)
为了了解库是如何工作的,我们将解释 Gym 提供的 CartPole-v1 环境。我们开始吧💪!
CartPole-v1 环境
小车-V1 环境由一根通过非驱动关节连接到小车上的杆组成,小车沿无摩擦轨道运动。代理可以向推车施加-1 到 1 之间的力,目的是尽可能长时间地保持杆的平衡。柱子保持直立的每一步都获得+1 的奖励。当柱子偏离垂直方向超过 15 度,或者手推车偏离中心超过 2.4 个单位时,该集结束。
CartPole-v1 Environment
第一步是导入库 gym ,使用 gym.make 函数加载 CartPole-v1 环境。一旦环境被创建,我们需要一个初步的观察。第一个状态通过调用复位函数获得,由一个(4)维 numpy 数组组成,包含以下信息:(1)小车位置,(2)小车速度,(3)电极角度,以及(4)尖端的电极速度。
状态空间指的是我们的代理可能遇到的所有可能情况的集合。类似地,动作空间是我们的代理在特定状态下可以采取的所有可能动作的集合。两个空间的类型和大小可以通过使用环境观察 _ 空间和环境动作 _ 空间方法来查询。
健身房空间可以是:(1)离散的,(2)多离散的,(3)盒子,和(4)元组。在 CartPole-v1 环境中,动作空间是离散的,这意味着该空间包含从 0 到 n-1 的 n 个离散点。我们可以通过键入 env.action_space.n 来获得动作的总数。相反,状态空间是一个多维连续空间(箱式),其中每个变量都位于区间[low,high]内,通过使用env . observation _ space . low和env . observation _ space . high获得两个边界。
我们可以通过使用**env . action _ space . sample()**获得一个随机动作。然而,强化学习问题的目标不是随机选择一个动作,而是找到要采取的最佳动作,这意味着我们使用一种算法来输出我们的代理应该采取的动作,以使其报酬最大化。
选择动作后,环境向代理呈现一个新的状态和一个奖励,显示这个动作是多么合适。为了获得下一步和奖励,我们使用了 env.step() 方法。此方法使环境步进一个时间步长,并返回:
- 观察→代表环境的下一个状态。
- 奖励→采取行动后获得的奖励。
- 完成→表示剧集是否已经结束。
- 信息→用于调试目的的诊断信息。
下面可以看到 step 方法返回的对象的值和类型。
现在是时候把所有的放在一起了!:)我们创建一个代理,它采取随机的行动,直到剧集结束,返回该剧集中获得的总分数(奖励的总和)。请注意,当我们训练代理时,操作将通过策略(训练的算法)获得,而不是像这里一样随机获得。
车杆环境具有连续的状态空间,但是动作空间是离散的。为了训练这个代理,可以采用基于值的方法,例如深度 Q 学习。该算法为给定状态选择最佳动作;因此,使用该方法获得的策略是确定性的。为了获得随机策略,可以应用基于策略的方法,例如近似策略优化。
强化学习工具包— Unity
**Unity Machine Learning Agents(ML-Agents)**是一个开源的 Unity 插件,使游戏和模拟成为训练智能代理的环境。
为了了解图书馆是如何工作的,我们将解释香蕉收集器的环境。在这种环境下,代理可以拿黄色或蓝色的香蕉,目标是收集尽可能多的黄色香蕉,避免蓝色的。
首先,我们克隆存储库,然后导入 Unity 并加载Banana collector环境。
Unity 使用了大脑的概念。学习环境中的每个代理都与一个大脑相连,这个大脑负责为所有相连的代理做出决策。
Unity Learning Environment
我们可以检查可用的大脑,并将其中一个设置为我们要用 Python 控制的大脑,如下所示。
在香蕉收集器环境中,状态空间是连续的,有 37 个维度,包含代理的线速度和代理前进方向上基于光线的物体感知。动作空间是离散的,具有 4 个维度:(1)向前移动,(2)向后移动,(3)向左转,以及(4)向右转。收集一个黄色香蕉的奖励为+1,收集一个蓝色香蕉的奖励为-1。
我们可以通过使用以下函数来检查状态和动作空间(大小和类型):
Unity 提供了一个类似健身房的界面来培训代理。为了得到一个初步的观察结果,我们需要调用 env.reset() 函数,就像我们之前对 gym 所做的那样。类似地,为了向环境发送一个动作,我们使用了 env.step() 函数。
正如我们之前在健身房推车杆示例中所做的那样,我们创建了一个代理,它采取随机行动,直到该集结束,返回该集的总得分(奖励的总和)。请注意,当我们训练代理时,操作将由策略(训练的算法)获得,而不是像这里一样随机获得。
正如我们所观察到的,获得的奖励是-1,这意味着代理人比黄色的香蕉摘得更多。训练后,代理人区分两者,获得的总回报更高。
与车杆环境一样,状态空间是连续的,但动作空间是离散的。因此,为了训练这个代理,我们可以使用基于值的方法,例如深度 Q 学习,或者基于策略的方法,例如近似策略优化。
在以后的文章中,我们将解释如何训练这两者:推车杆和香蕉收集代理。所以,敬请期待!😊
文学
- Udaciy 课程深度强化学习https://www . uda city . com/course/Deep-Reinforcement-Learning-nano degree-nd 893
- https://gym.openai.com/envs/CartPole-v0/
- https://unity3d.com/machine-learning
有趣的读物
- https://towards data science . com/introduction-to-variable-reinforcement-learning-algorithms-I-q-learning-sarsa-dqn-ddpg-72 a5 E0 CB 6287
- https://towards data science . com/the-complete-reinforcement-learning-dictionary-e 16230 b 7d 24 e
感谢阅读🍀 😃****
强化学习:从网格世界到自动驾驶汽车
0.代理、环境和奖励
在过去几年中,人工智能研究人员的许多重大声明背后是一个被称为强化学习(RL)的学科。最近的突破主要是由经典 RL 想法的微小转变推动的,这是由强大的计算硬件和利用该硬件的软件实现的。
为了了解现代深度 RL 模型对计算的渴望程度,下表收集了最近的 RL 进展和完成每项任务所需的计算资源的估计,但并不详尽。
请注意,上表中的任务都是在模拟中训练的(即使是灵巧的机器人手),在大多数情况下,这是所需训练时间易于处理的唯一方式。对于像自动驾驶汽车这样的现实世界应用来说,这可能会变得特别棘手——稍后会有更多关于这个主题的内容。
当 RL 代理在日益复杂的环境中解决任务时,他们陷入了维度诅咒。这种复杂性的组合爆炸解释了为什么像 Dota Five 这样的团队游戏机器人需要在非常强大的硬件上每天训练 900 年,以击败顶级人类玩家。即使拥有像 OpenAI 为 Dota Five 所使用的那些可笑的计算资源,deep RL 尤其有许多棘手的症结,在最好的情况下,这会使训练非常低效,在最坏的情况下,会使许多问题变得基本上难以解决。
值得注意的是,在击败 99.5%的前职业选手后,OpenAI 的 Dota Five 在 2018 国际输了两场与顶级职业选手的比赛。学习曲线只会在接近精通时变得更加陡峭,对于 RL 代理来说,这是双倍的。对于 Dota Five 来说,要从顶级玩家的 99.5%提高到 99.99%,可能需要代理人迄今为止完成的自我游戏训练时间,以及暂时满足移动目标的时间。想要体验一下 RL 特工学习游戏有多难,试试玩有假面前科的雅达利游戏。
现代 RL 产生于最优控制和行为的心理社会研究领域,后者主要包括对动物学习过程的观察。虽然 RL 的动物行为主义起源至少可以追溯到 19 世纪 50 年代亚历山大·贝恩(Alexander Bain)通过“摸索和实验”进行学习的概念,但也许更令人难忘的例子是 J.F .斯金纳(J.F. Skinner)的同名斯金纳盒子,又称操作性条件反射室。这些小室提供了一个 RL 问题的所有主要组成部分:一个具有某种变化状态的环境,一个主体,以及一个主体可以采取的潜在选择的行动空间。在动物行为中,奖励可能是由像按下杠杆以获得食物奖励这样的事情触发的,但对于 RL 问题,奖励通常可以是任何东西,精心设计一个好的奖励函数可能意味着有效代理和行为不端代理之间的差异。
1.Gridworld 中的质量和价值函数
到目前为止,我们已经讨论了越来越多的强化学习突破和运行 RL 模型的高性能计算需求的同时增长,以及 RL 在动物行为研究中的根源。
最优控制和动态规划是另一个重要领域,有助于我们对 RL 的现代理解。特别是,这些领域为我们提供了贝尔曼方程,用于理解给定环境状态下的最大回报(价值函数)和从给定状态下获得最高潜在回报的最佳可用行动(质量函数)。
下图是一个常见的例子,你几乎肯定会在任何 RL 课程的第一堂课上看到。
在一个简化的“网格世界”中,代理可以上下移动或左右移动。代理不能离开网格,某些网格可能会被阻止。这个环境中的状态是网格位置,而绿色笑脸表示积极的奖励,红色方框表示消极的奖励。积极和消极的奖励都伴随着退出游戏。在这个例子中,价值函数(对于给定状态的最大潜在回报)由每个方块的绿色饱和度表示,而箭头的大小和颜色对应于质量函数(对于在给定状态中采取的行动的最大潜在回报)。因为代理人对未来的奖励打折扣,而倾向于眼前的奖励,对于需要更多移动来达到目标的状态来说,价值和质量函数被削弱了。
在网格世界这样一个简单的例子中,价值和质量函数可以有效地存储在查找表中,以确保代理在给定的环境中总是做出最佳决策。对于更现实的场景,这些函数事先是未知的,并且必须探索环境以生成质量函数的估计,之后代理可以通过利用其对环境及其回报的理解来贪婪地寻求最大化回报。探索和利用 RL 环境的一种有效方式是使用深度神经网络来估计质量函数。
2.深度 Q 学习网络和政策梯度:端到端深度学习者
在 2013 年的一篇开创性论文中,Deepmind 的研究人员发表了一个通用强化学习器,它能够在 49 个经典雅达利视频游戏中的 29 个游戏中达到或超过人类水平。这篇论文的主要成就是,与可能特别访问游戏机制信息的更简单的强化学习问题不同,这篇论文中演示的模型仅使用游戏的像素作为输入,就像人类玩家一样。此外,同一个模型能够学习各种不同类型的游戏,从拳击到海上探险。这种方法被称为端到端深度学习,在这种方法中,输入由一端的神经网络读取,所需的行为直接学习,而无需手动编码模块将代理的不同方面粘合在一起。在 Deepmind 的 DQN 模型中,输入是视频游戏的最后几帧,输出是质量函数,描述了代理对不同行为的预期回报。
几年后,先进的深度强化学习代理变得更加简单。政策梯度代理不是学习预测每个行动的预期回报,而是训练在给定当前环境状态的情况下直接选择一个行动。这实质上是通过将强化学习问题转化为监督学习问题来实现的:
- 智能体根据一组将智能体定义为神经网络的参数θ执行一些任务(例如,玩游戏、从 A 点开车到 B 点、操纵一个积木)。
- 多次任务执行构成一个批次,每次任务执行的最终回报形成损失函数。
- 代理使用梯度下降来最小化损失函数,增加了为正奖励运行做出的每个决策的概率,反之亦然。
- 重复步骤 1 到 3,直到代理性能收敛和/或达到某个基准。
增加每一次行动(包括错误)最终产生积极回报的概率的功效似乎令人惊讶,但实际上,在许多次运行中平均下来,获胜的表现将包括更多正确的行动,而较低回报的表现将包括更多错误。这是 RL 代理学习跑酷式运动、机器人足球技能,以及自动驾驶的简单基础,使用策略梯度进行端到端深度学习。Wayve 的一个视频演示了一个 RL 代理在大约 20 分钟内学会在一条孤立的乡村道路上驾驶一辆实体汽车,人类操作员干预之间的距离作为奖励信号。
这是一个非常引人注目的演示,尽管非常简单。还记得前面提到的维数灾难吗?现实世界的驾驶比单车道有更多的变数。对于 RL 来说,每一个新的方面都需要指数级的训练要求。鉴于目前的技术水平,完全自动驾驶汽车不可避免地需要在模拟环境中进行 soem 程度的学习,大量的手工编码模块将功能联系在一起并处理边缘情况,或者两者兼而有之。
3.像深度学习吃掉自动驾驶一样走向现实世界
机器学习的现代复兴承诺的最明显的应用之一是自动驾驶汽车。汽车可能是最危险的现代技术,因为世界卫生组织估计全球每年有 125 万人死于道路交通事故。确定自动驾驶汽车的经济影响很困难,但保守估计仅在美国每年就有 190 亿美元(T2)到 6420 亿美元(T4)不等。
现代自动驾驶起源于 20 世纪 80 年代和 90 年代的项目,如控制卡内基梅隆自动驾驶试验台的 ALVINN 和德国联邦国防军大学的 Ernst Dickmann 的工作。现代自动驾驶开发人员可能对这些项目的许多组件很熟悉:ALVINN 利用神经网络从 30×32 视频馈送和激光测距仪输入中预测转弯曲率。为了绕过计算瓶颈,Dickmann 的动态视觉系统根据预期重要性将计算集中在图像的预定义区域,这一概念与现代网络中的神经注意力非常相似。
上世纪 80 年代和 90 年代自动驾驶汽车的许多创新都是克服数据吞吐量或处理瓶颈所必需的。最近,计算能力的可用性不再是瓶颈,克服完全汽车自动驾驶的最后 10%左右的挑战的主要挑战与确保训练数据的可靠性和有效处理不寻常的边缘情况有关。
4.结论:你什么时候能期待你的车来接你?
几十年前的自动驾驶汽车领先于他们的时代,受到处理时间和数据吞吐量的计算限制的约束。那时和现在的主要区别在于强大计算资源的可用性。许多研究人员指出,2012 年在图形处理单元(GPU)上训练的卷积神经网络在 ImageNet 大规模视觉识别挑战赛中的惊人表现点燃了机器学习的现代复兴,其特点是在大数据集上训练大模型,并利用GPU的并行处理能力。这已经形成了一个良性循环,吸引了更多的兴趣和资金,导致了进一步的成就和更广泛的实用领域,并最终推动了旧思想的新突破。要实现我们可以信任的完全自动驾驶汽车,仍有大量挑战需要克服,随着计算资源的不断改善,肯定会有更多令人兴奋和未知的机会来解决有趣的问题。
鉴于混乱的现实世界条件的组合爆炸的后果和涉及的高风险,RL 可能需要根本性的突破才能使完全自动驾驶成为现实。学习如何处理看不见的边缘情况,或者训练像“道路的基本规则是在不造成伤害的情况下绕过”这样的高级规则,都不是 RL 擅长的事情。例如,专注于正确识别磨损或涂错的车道标志,远不如教会驾驶代理人预测并避免骑自行车的人避开自行车道以避开坑洞重要。从车道保持和识别明显和已知的障碍到零干预驾驶的学习曲线很陡,正确地爬坡是收获全自动驾驶汽车等技术的回报和推迟未来(也许是无限期地)的灾难性后果之间的区别。
从零开始的强化学习:应用无模型方法和详细评估参数
这个项目是作为在 Python 笔记本中独立学习强化学习(RL)的一种手段而创建的。无需与复杂的虚拟环境交互即可应用 RL。通过完全定义概率环境,我们能够简化学习过程,并清楚地展示改变参数对结果的影响。这在任何机器学习任务中都是有价值的,但在强化学习中尤其如此,在强化学习中,如果没有清晰明确的示例,很难理解影响变化的参数。
Initial TD(0) Output Example
介绍
目的是在扔或移动到更好的位置之间找到最佳动作,以便将纸放入垃圾箱(垃圾桶)。在这个问题中,我们可以从房间的任何位置投掷,但它的概率与当前距离垃圾箱的距离和纸张投掷的方向有关。因此,可以采取的行动是将纸向任何 360 度方向扔,或者移动到一个新的位置,尝试增加扔进垃圾箱的概率。
在前面的第 1 部分中,我们介绍了这样一个问题,即箱子的位置是已知的,可以用值迭代法直接求解。
在第 2 部分中,我们现在展示了如果使用无模型方法(如 Q 学习、蒙特卡罗等)隐藏概率,如何类似地使用 RL 来寻找最优策略。
[## RL 从头开始第 2 部分:了解 RL 参数| Kaggle
编辑描述
www.kaggle.com](https://www.kaggle.com/osbornep/rl-from-scratch-part-2-understanding-rl-paramters)
**此外,我们以此为契机,引入一种新的可视化方法来检查参数。**当我们改变强化学习中的参数时,我们通过多次尝试(或片段)来观察结果,我们希望显示稳定性和收敛性。这是一个二维比较(x =事件,y =输出),当我们想要观察结果时,如果我们改变一个参数,这就变成了三维比较(x =事件,y =输出,z =参数)。最简单和最常用的解决方案是为每个参数选择生成多个图。另一种更复杂的视觉选择是三维绘图。
相反,我们介绍了一种新的交互式动画方法,通过这种方法可以显示参数随时间的变化。
这种可视化的目的是改善你比较参数选择的方式。然而,由于参数选择通常是一个需要快速执行的过程,我们承认这一要求必须易于实现。最终的参数选择可以被适当地格式化,但是决策过程中的视觉美感可能不太严格。
因此,尽管这是一个我们在之前已经介绍过的方法,但我们后来进一步将它正式定义为一个无需大量了解 Plot.ly 库就可以轻松下载和使用的包(Github 正在发布)。
我们将在本笔记本中演示如何使用绘图功能。下面显示了一个可以使用的交互式动画的快速示例,我们可以看到前面讨论过的尺寸。
最后,模型可解释性的最新研究强调了清晰一致地用图解法概述方法的需求。
来自谷歌的研究人员引入了模型卡作为一种在训练算法中提供透明度的手段。
经过训练的机器学习模型越来越多地用于执行执法、医学、教育和就业等领域的高影响力任务。为了阐明机器学习模型的预期用例,并尽量减少它们在不太适合的环境中的使用,我们建议发布的模型应附有详细描述其性能特征的文档。
Model Cards Spec
此外,我的一位同事正在介绍一个框架,用于将图表方法正式化,以便熟练的研究人员共享他们的工作;称为拨。这项研究试图识别人工智能系统的重复出现的原语和构建模块,并提出一种示意性符号来尝试和促进关于人工智能系统研究的改进的交流。
目前,还没有一致的模型来可视化或形式化地表示人工智能系统的架构。这种表示的缺乏给现有模型和系统的描述带来了可解释性、正确性和完整性的挑战。DIAL(图形化的人工智能语言)是为了成为人工智能系统的“工程示意图”而创建的。它在这里被作为一个面向 AI 系统的公共图形语言的社区对话的起点。
因此,我们创建了一个视觉效果来展示和总结整个工作流程,以生成最终输出:
Complete RL Process Diagram
预处理:介绍概率环境
根据之前定义的环境(参见元笔记本),我们还发现了通过价值迭代计算出的最优策略。
最佳策略可以从数据文件中导入,并且是固定的,假定条柱在(0,0)处,概率的计算如下面的函数所示。
RL 环境定义
一个策略是当前为所有给定状态推荐的动作。状态( s 和s′)是房间中的位置,而动作( a ) 要么在 8 个方向(北、东北、东、…西北)中的一个方向上移动,要么从正北向任何 360 度方向(0、1、2、3、4、…、359、360 度)投掷(参见导航方位。
在我们的概率环境中,我们已经定义了移动具有被正确跟随的保证结果(即,你不会错过步伐),但是向一个方向投掷不能保证进入箱子。投掷成功进入箱子的概率与当前位置到箱子的距离和从真实方向投掷的方向有关。
这定义了我们的概率环境和转移函数:
P(s,s′)= P(s _ { t+1 } = s′| s _ t = s,a_t=a)
是在动作 a(https://en.wikipedia.org/wiki/Reinforcement_learning)下从状态 s 转移到状态 s’的概率。
(注:bin 是垃圾桶/垃圾箱/垃圾桶/垃圾筐/垃圾桶/垃圾桶/垃圾桶/废纸篓的英文说法)
概率函数
该函数定义了从任何给定状态成功投掷的概率,并通过以下公式计算:
首先,如果位置与箱相同(即人已经直接在箱内),则概率固定为 100%。
接下来,我们必须在两种情况下重新定义投掷方向,以适应 360 度与 0 度相同的事实。例如,如果我们在箱子的西南方,并投掷 350 度,这将与-10 度相同,然后将正确地与从人到箱子的小于 90 度的方位相关联。
然后计算欧几里得距离,接着是人可能离箱子的最大距离。
然后,我们按照前面的图计算从人到容器的方位,并计算限制在+/- 45 度窗口内的分数。最接近真实方位的投掷得分较高,而较远的投掷得分较低,任何大于 45 度(或小于-45 度)的投掷都是负的,然后被设置为零概率。
最后,给定当前位置,总概率与距离和方向都相关。
初始化状态-动作对
在应用算法之前,我们将每个状态-动作值初始化到一个表中。首先,我们为所有投掷动作形成这个,然后是所有移动动作。
我们可以向任何方向投掷,因此每度有 360 个动作,从北 0 顺时针到 359 度。
虽然运动看起来很简单,因为有 8 种可能的动作(北、东北、东等),但不像从任何位置向任何方向投掷,有些运动是不可能的。例如,如果我们在房间的边缘,我们不能移动超出边界,这需要考虑。虽然这可以编码得更好,但我已经用 if/elif 语句手动完成了,如果位置和移动是不可能的,就跳过这一行。
Initialised Q Table
定义无模型强化学习方法
我们介绍了三种无模型方法,它们被认为是最容易应用的,并比较了它们的优缺点。然而,在我们这样做之前,我们考虑无模型方法和我们以前使用的基于价值迭代模型的方法之间的差异。简而言之,基于模型的方法使用概率环境的知识作为指导,并相应地计划最佳行动。在无模型方法中,算法不知道这个概率,它只是尝试动作并观察结果。
在本例中,我们已经计算了概率,并将使用这些概率来查找操作的结果,但它们不会直接用于算法的学习中。
此外,在基于模型的方法中,我们在大的“扫描”中更新所有动作,其中所有状态的值在一次通过中被更新。在无模型方法中,我们使用情节,其中仅更新被访问的状态。片段是从开始状态到结束状态的路径;在我们的例子中,终端状态是当算法抛出试卷时,结果可能是成功或失败。
形成情节并定义行动选择过程
如果我们定义起始位置,一集就是从那个位置一直到扔纸为止所采取的动作。如果它到达垃圾桶,那么我们有一个正的目标奖励+1。然而,如果我们错过了 bin,那么我们的目标奖励为-1。
动作选择
我们可以继续这个选择过程,但是这是一个非常低效的选择行动的方法。当我们实施我们的学习过程时,我们将开始学习哪些行动会导致积极的目标,所以如果我们继续随机选择,我们就浪费了所有的努力。
因此,我们引入一种考虑到这一点的方法,称为ε贪婪。
试验的比例 1−ϵ 选择最佳杠杆,比例 ϵ 随机(等概率)选择一个杠杆。典型的参数值可能是ε= 0.1*,但这可能会根据环境和偏好而有很大变化。* ( 维基)
换句话说,我们用概率ϵϵ随机选择一个动作,否则将选择最佳动作。如果我们有多个“最佳行动”,我们会从列表中随机选择。
那么,我们为什么不每次都选择最佳行动呢?如果我们有一个有效的行动,但不一定是最好的,这可能会导致一个问题。这在其他机器学习问题中经常被认为是局部最小值/最大值。如果我们一直使用一个似乎有效的行动,我们可能会错过尝试更好行动的机会,因为我们从未尝试过,这可能会导致结果的不稳定。
下面的动画演示了我们降低ε时的结果。ε值较高时,我们会随机选择行动,因此可能会选择不好的行动。随着我们减少ε,我们会越来越贪婪地选择行动来改善结果,同时仍然确保我们可以探索新的行动来最小化我们处于局部最大值而不是全局最大值的风险。
我们因此选择一个小的ε值 ϵ=0.1
RL 算法简介
我们已经介绍了情节和如何选择动作,但我们还没有演示算法如何使用它来学习最佳动作。因此,我们将正式定义我们的第一个 RL 算法,时间差异 0 。
时间差—零
时间差异λ是取决于λ的选择的一系列算法。最简单的方法是将其设置为零,此时更新规则如下:
定义:TD(0)更新规则: Wiki
其中:
- V(s)是状态 s 的值,
- α是学习率参数,
- r 是奖励,
- γ是贴现因子参数,
- v(s′)是下一个状态的值。
*那么这个等式是什么意思呢?*简而言之,我们基于当前状态的值是什么和采取行动到情节中定义的下一个状态的结果的组合,更新我们对当前状态的质量的知识,表示为 V(s)。
例如,假设我们开始学习过程,我们的第一个动作是从状态[-5,-5]投掷,并且它成功地击中了垃圾箱,那么我们因为达到目标而获得了+1 的正奖励。因此,我们有以下更新:
这似乎是一个微不足道的计算,但重要的是要记住,成功是不能保证的。因此,如果我们考虑所有可能的行动,第一次投掷的结果意味着我们相信这次投掷行动是当前的最佳选择。这个投掷动作的值为 0.5,相比之下,所有其他尚未测试的动作的值为 0。
因此,根据ϵ−greedy 的遴选程序,我们将再次尝试。然而,这一次,纸张没有进入垃圾箱,而是未命中,因此我们得到了负的终端奖励 1 1:
所以我们看到,这个状态的值现在稍微减少了,因为第二次投掷。
强化学习的核心概念是,我们通过重复采样来测试动作;我们需要重复样本的数量,直到结果收敛到真实概率结果的估计。
例如,如果我们考虑扔硬币两次,我们很可能两个结果都是正面,但如果我们扔 100 次,我们可能会看到正面和反面各占一半。在我们的例子中,如果从状态[-5,-5]投掷是一个好的动作,那么总的来说,重复尝试应该会产生积极的结果。起初这可能很难理解,但简单来说,我们正在通过反复试验来测试动作,并让我们的算法完成所有工作,所以我们不必这样做。
注:目前,我们将把起始状态固定为[-5,-5],参数固定为 ϵ=0.1 、 α=0.5 和 γ=0.5 ,直到我们稍后演示参数变化。
在 100 集之后,我们看到固定起始点周围的状态已经更新,但是如果我们将下面的热图与前面的线图并排比较,我们会发现在 100 集之后,它还没有完全收敛,并且仍在更新。
Initial TD(0) Output
因此,我们将剧集数量从 100 集大幅增加到 1000 集
由于我们开始发现这需要越来越长的时间,一个好主意是引入一种方法来跟踪循环的进程。为了做到这一点,我应用了这篇文章中介绍的方法。
Increase to 1,000 episodes
不同的奖励
我们注意到,这样的结果表明状态的值非常负,并且它们是发散的(即不稳定)。
我们可以采取一些措施来改善这一点,首先,我们将对其他行为进行奖励。目前,我们仅有的奖励是当算法投出正球并获得+1 或负球获得-1 时。
这是强化学习过程的一部分,它让我们控制算法优化的内容。例如,假设我们想阻止算法投掷,我们可以为每个移动动作引入一个小的正奖励(比如 0.1),如下所示。
Add reward for moving: r_move = 0.1
虽然这一开始看起来更糟,但状态振荡的值表明它试图找到一个值,但我们对参数的选择导致它发散。但是,我们至少可以看到它越来越接近收敛。
我们可以开始改变参数,但部分问题是我们总结了大量动作(360°投掷方向和 8 个移动方向)的状态值。因此,与其将此归纳为一个值,不如单独考虑每个状态-动作对的质量。
为此,我们可以介绍我们的第二种无模型方法: Q-learning 。
q 学习
与 TD(0)非常相似,Q-learning 在我们采取每一个动作的同时进行学习,而是通过搜索可能的后续动作来学习得更快。
定义:Q-学习更新规则: Wiki
其中:
- Q(s_t,a_t)是状态-动作对 s 的值,
- α是学习率参数,
- r 是奖励,
- γ是贴现因子参数,
- Q(s_t+1,a)是下一个状态中动作对的值。
和以前一样,我们将参数固定为ϵ=0.1,α=0.5,γ=0.5。
Q-Learning Initial Run
变化参数
我们有三个要改变的主要参数,学习率αα,折扣因子γγ和我们的ϵ−greedyϵ−greedy 动作选择值。
下面的解释直接来自维基百科并且已经详细介绍了ϵϵ参数。
探索与利用
学习速率或步长决定了新获得的信息覆盖旧信息的程度。因子 0 使代理什么也学不到(专门利用先前的知识),而因子 1 使代理只考虑最近的信息(忽略先前的知识来探索可能性)。在完全确定的环境中, αt=1 的学习率是最佳的。当问题是随机的时,算法在某些技术条件下收敛于学习率,这要求它下降到零。在实践中,经常使用恒定的学习速率,例如对于所有的 t ,αt=0.1 。[3]
折扣系数
贴现因子 γγ 决定了未来奖励的重要性。因子 0 会使代理人只考虑当前的奖励而“近视”(或短视),即 rt (在上面的更新规则中),而接近 1 的因子会使其争取长期的高奖励。如果折扣因子达到或超过 1,行动值可能会出现分歧。对于 γ=1 ,没有终端状态,或者如果代理从未达到一个终端状态,所有环境历史变得无限长,并且具有附加的、未折扣的回报的效用通常变得无限长。[4]即使贴现因子仅略低于 1,当用人工神经网络近似价值函数时,Q 函数学习也会导致误差传播和不稳定性。[5]在这种情况下,从一个较低的折扣系数开始,并将其提高到最终值,可以加速学习。【6】
那么这些意味着什么,更重要的是,我们选择参数的目的是什么?
总的目标是,我们试图为任何给定的状态找到最佳的行动,同时以合理的努力次数(以情节次数、所需的计算或时间来衡量)实现这一目标。对学习率的一个很好的解释是,高值意味着我们更重视在每个动作中获得的信息,因此学习更快,但可能会发现很难完全收敛,而小值将需要更长时间,但会稳定地收敛。
一个很好的类比是把它想象成我们只用一根球杆打高尔夫球;高α值对应于使用大击球杆,而小α值类似于使用小击球杆。击球大的球杆最初会让我们更接近果岭,但一旦我们接近,就很难准确地击球入洞。然而,一个小击球的俱乐部将需要更多的尝试来达到果岭,但一旦它做到了,我们就有更多的控制,可以更容易地到达球洞。
我们已经在我们早期的应用中观察到大α参数的影响,其中值在每一集之间振荡。因此,我们需要使用较小的值,但这带来了收敛所需的集数方面的挑战。我们已经需要数以千计的剧集来聚合一个固定的开始状态,并且我们有 100 集来考虑整个环境。
这是我们必须考虑的权衡,最佳决策可能是在需要时一次只学习一个固定的起始状态,而不是试图找到所有状态的最佳策略。
当我们在下面的动画中观察变化 alpha 的趋势时,我们看到,如果我们固定开始状态,我们能够使用一个小的 alpha 值,而不需要不可能的大量剧集。如果我们要考虑所有的状态,我们可能需要使用稍微大一点的 alpha 值来及时得到合适的结果。
因此,我们回到考虑[-5,-5]的单一固定起始状态,并选择α值 α=0.1 。
有了这些设定,我们再来评估 γ 的选择。根据维基百科的解释,我们知道这个值对应于我们是否认为未来的回报重要。当我们考虑这一点时,提醒我们自己 Q-learning 的更新规则是有帮助的。
在 Q-learning 更新规则中,我们看到γ缩放了从下一个状态获得最佳动作的 Q 值。这与作为同一等级的一部分的行为本身的奖励有关,因此,如果我们通过使用较小的 gamma 值来减少这一点,那么奖励就具有更大的权重。相反,如果我们取一个高的伽马值,我们认为从下一个状态获得的信息更重要。
因此,我们将理想地选择一个增加未来奖励价值的值,这样我们的决策将导致最佳的 bin,并选择值 γ=0.9 。
阿尔法分析
阿尔法= 0.9
阿尔法= 0.1
伽马分析
伽马= 0.9
最终参数输出
- alpha = 0.1
- gamma = 0.9
- epsilon = 0.1
- 10,000 episodes
- Fixed start state: [-5,-5]
输出:
The optimal action from the start state is to MOVE in direction: 2
结论
我们看到起始状态的最终输出是向东移动。如前所述,我们可能要考虑改变奖励,这样移动会稍微受到阻碍,因为我们的算法似乎是在收集移动的奖励,而不是达到最终目标。
剧集覆盖的所有州的结果都集中在 10,000 集内,尽管看起来许多还没有被完全探索并且不是最佳的。但是如果我们只关心起始状态,那么这些就无关紧要了。
我希望这篇笔记/文章对演示每个参数对学习的影响和一个独立例子中 RL 的整个过程是有用的。
谢谢
强化学习从零开始,无需复杂的虚拟环境包
这个项目是作为在 Python 笔记本中独立学习强化学习(RL)的一种手段而创建的。无需与复杂的虚拟环境交互即可应用 RL。通过完全定义概率环境,我们能够简化学习过程,并清楚地展示改变参数对结果的影响。这在任何机器学习任务中都是有价值的,但在强化学习中尤其如此,在强化学习中,如果没有清晰明确的示例,很难理解影响变化的参数。
Model-Based vs Model-Free Learning
介绍
目的是在扔或移动到更好的位置之间找到最佳动作,以便将纸放入垃圾箱(垃圾桶)。在这个问题中,我们可以从房间的任何位置投掷,但它的概率与当前距离垃圾箱的距离和纸张投掷的方向有关。因此,可以采取的行动是将纸向任何 360 度方向扔,或者移动到一个新的位置,尝试增加扔进垃圾箱的概率。
在前面的第 1 部分中,我们介绍了这样一个问题,即箱子的位置是已知的,可以用值迭代法直接求解。
在第 2 部分中,我们现在展示了如果使用无模型方法(如 Q 学习、蒙特卡罗等)隐藏概率,如何类似地使用 RL 来寻找最优策略。
[## RL 从头开始第 2 部分:了解 RL 参数| Kaggle
编辑描述
www.kaggle.com](https://www.kaggle.com/osbornep/rl-from-scratch-part-2-understanding-rl-paramters)
**此外,我们以此为契机,引入一种新的可视化方法来检查参数。**当我们改变强化学习中的参数时,我们通过多次尝试(或片段)来观察结果,我们希望显示稳定性和收敛性。这是一个二维比较(x =事件,y =输出),当我们想要观察结果时,如果我们改变一个参数,这就变成了三维比较(x =事件,y =输出,z =参数)。最简单和最常用的解决方案是为每个参数选择生成多个图。另一种更复杂的视觉选择是三维绘图。
相反,我们介绍了一种新的交互式动画方法,通过这种方法可以显示参数随时间的变化。
这种可视化的目的是改善你比较参数选择的方式。然而,由于参数选择通常是一个需要快速执行的过程,我们承认这一要求必须易于实现。最终的参数选择可以被适当地格式化,但是决策过程中的视觉美感可能不太严格。
因此,尽管这是一个我们在之前已经介绍过的方法,但我们后来进一步将它正式定义为一个无需大量了解 Plot.ly 库就可以轻松下载和使用的包(Github 正在发布)。
我们将在本笔记本中演示如何使用绘图功能。下面显示了一个可以使用的交互式动画的快速示例,我们可以看到前面讨论过的尺寸。
最后,模型可解释性的最新研究强调了清晰一致地用图解法概述方法的需求。
来自谷歌的研究人员引入了模型卡作为一种在训练算法中提供透明度的手段。
经过训练的机器学习模型越来越多地用于执行执法、医学、教育和就业等领域的高影响力任务。为了阐明机器学习模型的预期用例,并尽量减少它们在不太适合的环境中的使用,我们建议发布的模型应附有详细描述其性能特征的文档。
Model Cards Spec
此外,我的一位同事正在介绍一个框架,用于将图表方法正式化,以便熟练的研究人员共享他们的工作;称为拨。这项研究试图识别人工智能系统的重复出现的原语和构建模块,并提出一种示意性符号来尝试和促进关于人工智能系统研究的改进的交流。
目前,还没有一致的模型来可视化或形式化地表示人工智能系统的架构。这种表示的缺乏给现有模型和系统的描述带来了可解释性、正确性和完整性的挑战。DIAL(图形化的人工智能语言)是为了成为人工智能系统的“工程示意图”而创建的。它在这里被作为一个面向 AI 系统的公共图形语言的社区对话的起点。
因此,我们创建了一个视觉效果来展示和总结整个工作流程,以生成最终输出:
Complete RL Process Diagram
预处理:介绍概率环境
根据之前定义的环境(参见元笔记本),我们还发现了通过价值迭代计算出的最优策略。
最佳策略可以从数据文件中导入,并且是固定的,假定条柱在(0,0)处,概率的计算如下面的函数所示。
RL 环境定义
一个策略是当前为所有给定状态推荐的动作。状态( s 和s′)是房间中的位置,而动作( a ) 要么在 8 个方向(北、东北、东、…西北)中的一个方向上移动,要么从正北向任何 360 度方向(0、1、2、3、4、…、359、360 度)投掷(参见导航方位。
在我们的概率环境中,我们已经定义了移动具有被正确跟随的保证结果(即,你不会错过步伐),但是向一个方向投掷不能保证进入箱子。投掷成功进入箱子的概率与当前位置到箱子的距离和从真实方向投掷的方向有关。
这定义了我们的概率环境和转移函数:
P(s,s′)= P(s _ { t+1 } = s′| s _ t = s,a_t=a)
是在动作 a(https://en.wikipedia.org/wiki/Reinforcement_learning)下从状态 s 转移到状态 s’的概率。
(注:bin 是垃圾桶/垃圾箱/垃圾桶/垃圾筐/垃圾桶/垃圾桶/垃圾桶/废纸篓的英文说法)
概率函数
该函数定义了从任何给定状态成功投掷的概率,并通过以下公式计算:
首先,如果位置与箱相同(即人已经直接在箱内),则概率固定为 100%。
接下来,我们必须在两种情况下重新定义投掷方向,以适应 360 度与 0 度相同的事实。例如,如果我们在箱子的西南方,并投掷 350 度,这将与-10 度相同,然后将正确地与从人到箱子的小于 90 度的方位相关联。
然后计算欧几里得距离,接着是人可能离箱子的最大距离。
然后,我们按照前面的图计算从人到容器的方位,并计算限制在+/- 45 度窗口内的分数。最接近真实方位的投掷得分较高,而较远的投掷得分较低,任何大于 45 度(或小于-45 度)的投掷都是负的,然后被设置为零概率。
最后,给定当前位置,总概率与距离和方向都相关。
初始化状态-动作对
在应用算法之前,我们将每个状态-动作值初始化到一个表中。首先,我们为所有投掷动作形成这个,然后是所有移动动作。
我们可以向任何方向投掷,因此每度有 360 个动作,从北 0 顺时针到 359 度。
虽然运动看起来很简单,因为有 8 种可能的动作(北、东北、东等),但不像从任何位置向任何方向投掷,有些运动是不可能的。例如,如果我们在房间的边缘,我们不能移动超出边界,这需要考虑。虽然这可以编码得更好,但我已经用 if/elif 语句手动完成了,如果位置和移动是不可能的,就跳过这一行。
Initialised Q Table
定义无模型强化学习方法
我们介绍了三种无模型方法,它们被认为是最容易应用的,并比较了它们的优缺点。然而,在我们这样做之前,我们考虑无模型方法和我们以前使用的基于价值迭代模型的方法之间的差异。简而言之,基于模型的方法使用概率环境的知识作为指导,并相应地计划最佳行动。在无模型方法中,算法不知道这个概率,它只是尝试动作并观察结果。
在本例中,我们已经计算了概率,并将使用这些概率来查找操作的结果,但它们不会直接用于算法的学习中。
此外,在基于模型的方法中,我们在大的“扫描”中更新所有动作,其中所有状态的值在一次通过中被更新。在无模型方法中,我们使用情节,其中仅更新被访问的状态。片段是从开始状态到结束状态的路径;在我们的例子中,终端状态是当算法抛出试卷时,结果可能是成功或失败。
形成情节并定义行动选择过程
如果我们定义起始位置,一集就是从那个位置一直到扔纸为止所采取的动作。如果它到达垃圾桶,那么我们有一个正的目标奖励+1。然而,如果我们错过了 bin,那么我们的目标奖励为-1。
动作选择
我们可以继续这个选择过程,但是这是一个非常低效的选择行动的方法。当我们实施我们的学习过程时,我们将开始学习哪些行动会导致积极的目标,所以如果我们继续随机选择,我们就浪费了所有的努力。
因此,我们引入一种考虑到这一点的方法,称为ε贪婪。
试验的比例 1−ϵ 选择最佳杠杆,比例 ϵ 随机(等概率)选择一个杠杆。典型的参数值可能是ε= 0.1*,但这可能会根据环境和偏好而有很大变化。* ( 维基)
换句话说,我们用概率ϵϵ随机选择一个动作,否则将选择最佳动作。如果我们有多个“最佳行动”,我们会从列表中随机选择。
那么,我们为什么不每次都选择最佳行动呢?如果我们有一个有效的行动,但不一定是最好的,这可能会导致一个问题。这在其他机器学习问题中经常被认为是局部最小值/最大值。如果我们一直使用一个似乎有效的行动,我们可能会错过尝试更好行动的机会,因为我们从未尝试过,这可能会导致结果的不稳定。
下面的动画演示了我们降低ε时的结果。ε值较高时,我们会随机选择行动,因此可能会选择不好的行动。随着我们减少ε,我们会越来越贪婪地选择行动来改善结果,同时仍然确保我们可以探索新的行动来最小化我们处于局部最大值而不是全局最大值的风险。
我们因此选择一个小的ε值 ϵ=0.1
RL 算法简介
我们已经介绍了情节和如何选择动作,但我们还没有演示算法如何使用它来学习最佳动作。因此,我们将正式定义我们的第一个 RL 算法,时间差异 0 。
时间差—零
时间差异λ是取决于λ的选择的一系列算法。最简单的方法是将其设置为零,此时更新规则如下:
定义:TD(0)更新规则: Wiki
其中:
- V(s)是状态 s 的值,
- α是学习率参数,
- r 是奖励,
- γ是贴现因子参数,
- v(s′)是下一个状态的值。
*那么这个等式是什么意思呢?*简而言之,我们基于当前状态的值是什么和采取行动到情节中定义的下一个状态的结果的组合,更新我们对当前状态的质量的知识,表示为 V(s)。
例如,假设我们开始学习过程,我们的第一个动作是从状态[-5,-5]投掷,并且它成功地击中了垃圾箱,那么我们因为达到目标而获得了+1 的正奖励。因此,我们有以下更新:
这似乎是一个微不足道的计算,但重要的是要记住,成功是不能保证的。因此,如果我们考虑所有可能的行动,第一次投掷的结果意味着我们相信这次投掷行动是当前的最佳选择。这个投掷动作的值为 0.5,相比之下,所有其他尚未测试的动作的值为 0。
因此,根据ϵ−greedy 的遴选程序,我们将再次尝试。然而,这一次,纸张没有进入垃圾箱,而是未命中,因此我们得到了负的终端奖励 1 1:
所以我们看到,这个状态的值现在稍微减少了,因为第二次投掷。
强化学习的核心概念是,我们通过重复采样来测试动作;我们需要重复样本的数量,直到结果收敛到真实概率结果的估计。
例如,如果我们考虑扔硬币两次,我们很可能两个结果都是正面,但如果我们扔 100 次,我们可能会看到正面和反面各占一半。在我们的例子中,如果从状态[-5,-5]投掷是一个好的动作,那么总的来说,重复尝试应该会产生积极的结果。起初这可能很难理解,但简单来说,我们正在通过反复试验来测试动作,并让我们的算法完成所有工作,所以我们不必这样做。
注:目前,我们将把起始状态固定为[-5,-5],参数固定为 ϵ=0.1 、 α=0.5 和 γ=0.5 ,直到我们稍后演示参数变化。
在 100 集之后,我们看到固定起始点周围的状态已经更新,但是如果我们将下面的热图与前面的线图并排比较,我们会发现在 100 集之后,它还没有完全收敛,并且仍在更新。
Initial TD(0) Output
因此,我们将剧集数量从 100 集大幅增加到 1000 集
由于我们开始发现这需要越来越长的时间,一个好主意是引入一种方法来跟踪循环的进程。为了做到这一点,我应用了这篇文章中介绍的方法。
Increase to 1,000 episodes
不同的奖励
我们注意到,这样的结果表明状态的值非常负,并且它们是发散的(即不稳定)。
我们可以采取一些措施来改善这一点,首先,我们将对其他行为进行奖励。目前,我们仅有的奖励是当算法投出正球并获得+1 或负球获得-1 时。
这是强化学习过程的一部分,它让我们控制算法优化的内容。例如,假设我们想阻止算法投掷,我们可以为每个移动动作引入一个小的正奖励(比如 0.1),如下所示。
Add reward for moving: r_move = 0.1
虽然这一开始看起来更糟,但状态振荡的值表明它试图找到一个值,但我们对参数的选择导致它发散。但是,我们至少可以看到它越来越接近收敛。
我们可以开始改变参数,但部分问题是我们总结了大量动作(360°投掷方向和 8 个移动方向)的状态值。因此,与其将此归纳为一个值,不如单独考虑每个状态-动作对的质量。
为此,我们可以介绍我们的第二种无模型方法: Q-learning 。
q 学习
与 TD(0)非常相似,Q-learning 在我们采取每一个动作的同时进行学习,而是通过搜索可能的后续动作来学习得更快。
定义:Q-学习更新规则: Wiki
其中:
- Q(s_t,a_t)是状态-动作对 s 的值,
- α是学习率参数,
- r 是奖励,
- γ是贴现因子参数,
- Q(s_t+1,a)是下一个状态中动作对的值。
和以前一样,我们将参数固定为ϵ=0.1,α=0.5,γ=0.5。
Q-Learning Initial Run
变化参数
我们有三个要改变的主要参数,学习率αα,折扣因子γγ和我们的ϵ−greedyϵ−greedy 动作选择值。
下面的解释直接来自维基百科并且已经详细介绍了ϵϵ参数。
探索与利用
学习速率或步长决定了新获得的信息覆盖旧信息的程度。因子 0 使代理什么也学不到(专门利用先前的知识),而因子 1 使代理只考虑最近的信息(忽略先前的知识来探索可能性)。在完全确定的环境中, αt=1 的学习率是最佳的。当问题是随机的时,算法在某些技术条件下收敛于学习率,这要求它下降到零。在实践中,经常使用恒定的学习速率,例如对于所有的 t ,αt=0.1 。[3]
折扣系数
贴现因子 γγ 决定了未来奖励的重要性。因子 0 会使代理人只考虑当前的奖励而“近视”(或短视),即 rt (在上面的更新规则中),而接近 1 的因子会使其争取长期的高奖励。如果折扣因子达到或超过 1,行动值可能会出现分歧。对于 γ=1 ,没有终端状态,或者如果代理从未达到一个终端状态,所有环境历史变得无限长,并且具有附加的、未折扣的回报的效用通常变得无限长。[4]即使贴现因子仅略低于 1,当用人工神经网络近似价值函数时,Q 函数学习也会导致误差传播和不稳定性。[5]在这种情况下,从一个较低的折扣系数开始,并将其提高到最终值,可以加速学习。【6】
那么这些意味着什么,更重要的是,我们选择参数的目的是什么?
总的目标是,我们试图为任何给定的状态找到最佳的行动,同时以合理的努力次数(以情节次数、所需的计算或时间来衡量)实现这一目标。对学习率的一个很好的解释是,高值意味着我们更重视在每个动作中获得的信息,因此学习更快,但可能会发现很难完全收敛,而小值将需要更长时间,但会稳定地收敛。
一个很好的类比是把它想象成我们只用一根球杆打高尔夫球;高α值对应于使用大击球杆,而小α值类似于使用小击球杆。击球大的球杆最初会让我们更接近果岭,但一旦我们接近,就很难准确地击球入洞。然而,一个小击球的俱乐部将需要更多的尝试来达到果岭,但一旦它做到了,我们就有更多的控制,可以更容易地到达球洞。
我们已经在我们早期的应用中观察到大α参数的影响,其中值在每一集之间振荡。因此,我们需要使用较小的值,但这带来了收敛所需的集数方面的挑战。我们已经需要数以千计的剧集来聚合一个固定的开始状态,并且我们有 100 集来考虑整个环境。
这是我们必须考虑的权衡,最佳决策可能是在需要时一次只学习一个固定的起始状态,而不是试图找到所有状态的最佳策略。
当我们在下面的动画中观察变化 alpha 的趋势时,我们看到,如果我们固定开始状态,我们能够使用一个小的 alpha 值,而不需要不可能的大量剧集。如果我们要考虑所有的状态,我们可能需要使用稍微大一点的 alpha 值来及时得到合适的结果。
因此,我们回到考虑[-5,-5]的单一固定起始状态,并选择α值 α=0.1 。
有了这些设定,我们再来评估 γ 的选择。根据维基百科的解释,我们知道这个值对应于我们是否认为未来的回报重要。当我们考虑这一点时,提醒我们自己 Q-learning 的更新规则是有帮助的。
在 Q-learning 更新规则中,我们看到γ缩放了从下一个状态获得最佳动作的 Q 值。这与作为同一等级的一部分的行为本身的奖励有关,因此,如果我们通过使用较小的 gamma 值来减少这一点,那么奖励就具有更大的权重。相反,如果我们取一个高的伽马值,我们认为从下一个状态获得的信息更重要。
因此,我们将理想地选择一个增加未来奖励价值的值,这样我们的决策将导致最佳的 bin,并选择值 γ=0.9 。
阿尔法分析
阿尔法= 0.9
阿尔法= 0.1
伽马分析
伽马= 0.9
最终参数输出
- alpha = 0.1
- gamma = 0.9
- epsilon = 0.1
- 10,000 episodes
- Fixed start state: [-5,-5]
输出:
The optimal action from the start state is to MOVE in direction: 2
结论
我们看到起始状态的最终输出是向东移动。如前所述,我们可能要考虑改变奖励,这样移动会稍微受到阻碍,因为我们的算法似乎是在收集移动的奖励,而不是达到最终目标。
剧集覆盖的所有州的结果都集中在 10,000 集内,尽管看起来许多还没有被完全探索并且不是最佳的。但是如果我们只关心起始状态,那么这些就无关紧要了。
我希望这篇笔记/文章对演示每个参数对学习的影响和一个独立例子中 RL 的整个过程是有用的。
谢谢
强化学习——连续状态空间中的推广
随机游走例子的函数逼近
到目前为止,我已经介绍了离散状态、动作设置的强化学习的最基本的思想和算法。回想一下我们到目前为止已经实现的例子,网格世界,井字游戏,多臂强盗,悬崖漫步,二十一点…等等,其中大多数都有一个棋盘或网格的基本设置,以便使状态空间可数。然而,强化学习的力量并不止于此,在现实世界的情况下,状态空间大多是连续的,有不可计数的状态和动作组合供代理探索。在本文中,我将把我们以前学到的概念扩展到连续空间,并通过应用函数逼近实现一个更一般的随机行走例子。
从这篇文章中,我将介绍:
- 如何使用参数方法逼近值函数
- 半梯度 TD 方法(是 n 步 TD 方法的扩展)
- 用于近似的一些通用函数
- 在随机漫步例子中应用函数
一般化的想法
对于离散的状态空间,理论上一个智能体能够经历每一个状态并探索每一个状态的回报。当情况被扩展到连续状态空间时,为了概括价值函数,我们将需要状态的表示。
函数逼近
考虑一个监督学习问题,无论应用什么算法,被训练的模型都能够对它从未见过的数据进行预测,神奇的是,它学习了y = f(x)
的表示,其中x
是输入特征,y
是目标。这种近似或概括的思想可以准确地复制到强化学习问题中,(事实上,机器学习中的大多数算法都可以应用于强化学习设置中的函数近似),其中我们尝试近似值函数v = v(s, w)
(其中s
是状态,w
是模型权重),并将状态、值作为训练示例。例如,在其最简单的形式中,我们可以定义价值函数v = w_0*s + w_1
,使用一阶线性近似。
更新权重
现在问题来了,我们有了一个价值函数的表示,那么我们如何能够更新参数的权重,以使值接近实际值呢?事实上,权重更新遵循随机梯度下降(SGD) 中的规则:
weight update
其中v(S_t)
表示步骤t
的实际值,v(S_t, w_t)
表示带有权重参数w_t
的近似函数。请注意,实际值和估计值之间的平方差衡量近似函数的误差,通过对w_t
求导,砝码会稍微向正确的方向调整。
随机梯度下降(SGD)方法通过在每个示例之后在最能减少该示例的误差的方向上少量调整权重向量来做到这一点。
对于具有多个权重参数近似函数,应该通过分别求导来更新每个权重:
n 步半梯度 TD 方法
现在让我们来看看在连续状态空间中应用的算法:
TD Method in Continuous Space
看起来有很多步骤,但是如果你仔细看,你会发现它和我们在这里学的 n 步 TD 方法超级相似。看看离散空间中的 n 步 TD 方法:
TD Method in Discrete Space
这里的 Q 函数可以用价值函数来代替。通过比较连续空间和离散空间的 TD 方法,可以看出唯一的区别在于价值函数的更新,而在离散空间,价值函数(或 Q 函数)是直接更新的,在连续空间,价值函数是通过权重更新隐式更新的,因为这里的价值函数用权重 w
表示。你需要注意的另一件事是,在连续空间中,目标值取为*G*
*,*在 1 步 TD 法中是前一步的累积值,在蒙特卡罗模拟(本质上是我们之前讲过的无限 TD 法)中是直到一集结束的累积值。
一般近似函数
正如我们上面提到的,在连续空间设置中,值函数是状态(V = V(S, w)
)的表示,大多数机器学习算法都可以在这里应用。在这篇文章中,我将介绍一些最基本的近似函数,它们很容易实现,并帮助你了解如何在强化学习问题中应用它们。
状态聚合
函数逼近的最简单形式。比如,假设空间中有 10 个状态(1,2,3,…,10),我们设 1 到 5 有相同的值,6 到 10 有另一个值,那么这就叫状态聚合。数学表示可以是:
V(S) = w_0 if 1≤S≤5
V(S) = w_1 if 5<S≤10
函数很简单,但非常重要,因为这个想法在 Tile 编码中非常关键,Tile 编码是一种函数泛化技术,在强化学习问题中被大量使用。状态聚合的优点是每个聚合会话中状态的导数为 1,该状态的值为相应的权重。
多项式
我们将在此应用的多项式函数可以写成:
V(S) = w_0*S^0 + w_1*S^1 + ...
在这种情况下,权重参数的导数总是其对应于状态的幂的值。
傅里叶
与多项式情况类似,这里应用的傅立叶函数为:
V(S) = w_0*cos(0*πs) + w_1*cos(1*πs) + ...
重量 w_i 的导数为 cos(iπs)。*
请注意,这里介绍的多项式和傅里叶在权重参数方面都是线性的,因为这保证了收敛性。此外,这里我只介绍了一个国家的情况,更普遍的形式,请参阅萨顿的书。
1000 态随机行走
对于定理来说已经足够了,让我们应用我们所学的,并得到一个实际的案例。
规则
考虑一个 1000 状态版本的随机行走任务。这些状态从左到右从 1 到 1000 编号,并且所有情节都在状态 500 中的中心附近开始。状态转换是从当前状态到其左侧的 100 个相邻状态之一,或者到其右侧的 100 个相邻状态之一,所有这些都具有相等的概率。当然,如果当前状态接近一个边,那么在它的那一边可能有不到 100 个邻居。在这种情况下,那些丢失的邻居的所有概率都变成了在该侧终止的概率(因此,状态 1 有 0.5 的机会在左侧终止,而状态 950 有 0.25 的机会在右侧终止)。像往常一样,左边的终止产生-1 的回报,右边的终止产生+1 的回报。所有其他转换的奖励为零。
还记得我们在另一篇文章中谈到的 100 态随机漫步吗,这里的规则基本相同。不同之处在于
- 每一步的范围从 1 到 100
- 当代理闯入边界时,它在那里结束
Python 实现
我之前实现了离散状态空间上的随机行走,你可以在这里查看。下面的实现中,我将重点介绍两者的区别。
近似函数
连续状态空间中强化学习的灵魂。价值函数应该能够做到
- 获取给定状态的值
- 给定状态和时间差异,更新权重
聚集状态函数
对于状态聚合,1000 个状态被分成 10 组,每组 100 个状态(即状态 1-100 为一组,状态 101-200 为另一组,依此类推)
1000 个状态被分成 10 组,每组都有一个值存储在self.values
中。value
函数仅返回存储在相应组中的值,而update
函数通过添加delta*dev
来更新该值,如上所述,这里导数为 1,delta
为*G-V(S, w)*
。(注意,这里的value
实际上是权重参数)
多项式&傅立叶函数
LinearValueFunction
包括多项式函数和傅立叶函数。在value
函数中,features
是值函数表示的组件列表,在update
函数中,导数等于组件值,如上所述。
采取行动
与之前的随机行走不同,这里代理可以走得更快(从 1 步到 100 步),当它的位置到达边界外时,该集结束,奖励将为-1 或 1。
玩游戏
有了以上所有的准备工作,播放功能就容易实现了。该结构与我们之前的实现非常相似:
如果你一直在跟进我以前的帖子,你一定见过这个结构很多次了。这里唯一的区别是价值函数被valueFunction
代替了。
学习结果
应用了三个不同的值函数,让我们比较一下学习结果。(全面实施)
Aggregate State
对于具有 1 个步骤的聚集状态函数,1000 个状态被聚集成 10 个组,每个组有 100 个状态,这就是为什么您会看到类似楼梯的图形。
Polynomial Function
这是具有 5 阶和 1 阶多项式函数的学习图,从中我们看到在较低状态的发散和在较高状态的收敛。这是因为对于多项式函数近似,总是存在截距,从而使得状态 0 的值是非零的(通常,多项式函数不被识别)。
Fourier Function
这是目前最好的近似,通常傅里叶函数比多项式函数具有更好的性能。
结论
我们在这里学习了连续空间中强化学习的基本理论,并实现了一些基本的近似函数。当然,这个想法不仅仅局限于这些功能。在更高级的设置中,可以利用神经网络功能,这产生了深度强化学习问题。
在下一篇的中,我将介绍 tile 编码,并将其应用于连续状态空间中的 Q 函数学习,这比随机游走例子更具一般性。
参考:
- 【http://incompleteideas.net/book/the-book-2nd.html
- https://github . com/JaeDukSeo/reinforcement-learning-an-introduction
强化学习——非策略学习的概括
贝尔德反例
到目前为止,我们已经将我们的强化学习主题从离散状态扩展到连续状态,并详细阐述了将瓦片编码应用于基于策略的学习,即学习过程遵循代理所采取的轨迹。现在让我们来谈谈在连续环境下的非政策学习。虽然在离散的设置中,基于策略的学习可以很容易地推广到非策略的学习(比如,从 Sarsa 到 Q-learning),但在连续的设置中,这种推广可能有点麻烦,在某些情况下可能会导致分歧问题。在本文中,我将:
- 介绍由政策外学习的延伸所引起的问题
- 举贝尔德反例来说明这个问题
- 介绍解决问题的潜在方法
政策外学习的问题
偏离政策学习最突出的结果是,它可能不一定在连续的环境中收敛。主要原因是由于*非策略情况下的更新分布不符合策略分布,*即状态,用于更新的动作可能不是代理采取的状态、动作。下面进入更新公式,进一步说问题。在偏离策略学习的连续状态下,1 步更新流程如下:
注意,与政策上的概括相比,多了一个术语ρ
,称为重要性抽样比率。ρ
由目标策略π
除以行为策略b
,计算。在控制中,目标策略通常是相对于动作值函数的当前估计的确定性贪婪策略。该策略成为确定性的最优策略,而行为策略保持随机且更具探索性,例如,ϵ-greedy 策略。回想一下,在 Q 学习的离散状态空间中,时间差异是max{Q(S', A')} — Q(S, A)
(不考虑奖励),因此在每次状态更新时,最大 Q 值(来自贪婪策略)用于更新,而不是实际状态的值,即代理采取的动作(行为策略)。在连续空间中,使用行为策略利用重要性抽样来接近目标策略值。关于ρ
的更多解释,可以参考这里的和这里的(关于重要性抽样的更多解释,可以参考这里的)。
公式的其余部分与 on-policy learning 相同,其中w
是权重向量,δ
是时间差异(注意,根据问题是否是情节性的,δ略有差异,对于非情节性的情况,请参考此处的)。
根据萨顿在书中的描述,政策外学习的差异是由以下原因造成的:
一个转换重复发生,而
w
不会在其他转换中更新。这在非策略训练下是可能的,因为行为策略可能选择目标策略永远不会选择的那些其它转变上的动作。
不要担心,如果你有一点困惑,让我们继续一个例子,看看权重如何发散。
贝尔德反例
这是一个著名而简洁的例子,说明了偏离政策学习的发散特征。
问题描述
Baird Example
虚线动作以相等的概率将系统带到六个上状态之一,而实线动作将系统带到第七个状态。 *behaviour policy b*
选择概率为*6/7*
*1/7*
的虚线和实线动作,使其下的下一状态分布均匀(所有非终结状态相同),这也是每集的起始分布。目标策略 *π*
总是采取稳健的行动,所以策略上的分布(对于 *π*
)集中在第七个状态。所有转场的奖励是 *0*
。折现率为 *γ = 0.99*
。(仅出于简单和说明的原因,目标策略设置为固定)
请注意,每个圆圈内是使用权重向量的每个状态的表示。
在下面的实现中,步长α = 0.01
和初始权重是w = (1, 1, 1, 1, 1, 1, 10, 1)
。
履行
检查完整的实现
初始化
尽管有一些常规设置,注意self.features
是每个状态的表示,而self.weights
是权重向量(初始值是特意设置的)。权重和特征的乘积是每个状态的值。
行动
行动的选择和采取遵循规则。
价值函数
如上所述,值函数通过将特征和权重相乘来返回状态的值。
违反政策运行
有了上面的准备,我们就可以让代理学习了。在每一轮中,代理重复状态、动作、下一个状态、下一个动作……的过程,因为我们设置目标策略总是选择solid
行,当代理采取动作dash
时,重要性抽样比率将为 0,当它采取solid
动作时,重要性抽样比率为1/self.prob
。sarsa
参数用于控制是否使用基于策略的学习(在基于策略的学习中,目标策略总是行为策略,因此ρ = 1
),这仅用于结果比较。
学习结果
看到在偏离策略的学习中,权重发散到无穷大,而在策略上的方法(在这种情况下是 Sarsa)收敛。现在我们再来看一下图像,解释一下原因:
例如,当代理从最左边的状态(2w1+w8)到底部的状态(w7+2w8)采取一个固体动作时,如果 w8 通过上面的公式增加它的值,这将导致两个状态的值增加,因为它们共享权重 w8。然而,从底部状态开始,通过采取 dash 动作不会有助于偏离策略学习,因为在这种情况下ρ
为 0,这导致 w8 的值总是增加但从不减少。萨顿是这样说的:
一个转换重复发生,而
*w*
不会在其他转换中更新。这在非策略训练下是可能的,因为行为策略可能选择目标策略永远不会选择的那些其它转变上的动作。
解决方法
就解决方案而言,第一个是在连续空间设置上不使用偏离策略的学习,而总是使用符合策略的学习。另一种方法是改变目标误差函数。到目前为止,所有的函数逼近更新都是基于(true_value — current_value)^2
的目标误差,但是为了使训练过程收敛,萨顿在他的书中建议最小化投影贝尔曼误差(PBE)。详细解释请参考他的书这里,第 11 章。
这里我给出了这种方法的一个简单实现,并将其与经典的偏离策略学习进行了比较。通过最小化 PBE,可以得到一个更新公式:
其中β
是另一个步长参数,而vt*xt
(xt 是特征向量)是ρ*δ
的近似值。这种方法被称为带梯度修正的时延估计(TDC)
贸发局的实施
唯一的区别在于run
功能:
这个过程完全遵循上面的公式,使用 TDC,我们得到一个学习过程:
Learning Process of TDC
请注意,权重会慢慢收敛到最佳值。还有其他介绍的解决问题的方法,有兴趣的可以自己了解一下(查看完整实现)。
最后,提到萨顿的书的结尾部分:
政策外学习的整个领域相对较新且不稳定。哪种方法是最好的,甚至是合适的,现在还不清楚。本章末尾介绍的新方法的复杂性真的有必要吗?其中哪些可以和方差缩减法有效结合?政策外学习的潜力仍然诱人,实现它的最佳方式仍然是个谜。
参考:
- *【http://incompleteideas.net/book/the-book-2nd.html *
- https://github . com/Shang tongzhang/reinforcement-learning-an-introduction
强化学习——连续任务的概括
服务器访问示例实现
到目前为止,我们已经经历了许多强化学习的例子,从基于策略到不基于策略,从离散状态空间到连续状态空间。所有这些例子在某些方面都有所不同,但你可能已经注意到它们至少有一个共同的特点——情节性,即所有这些都有一个明确的起点和终点,每当代理达到目标时,它就会一次又一次地重新开始,直到达到一定数量的循环。在本文中,我们将把这一思想扩展到非情节任务,即没有明确终点的任务,并且主体在环境设置中永远继续下去。在本文中,我们将
- 学习应用于非情节任务的思想和算法
- 实现服务器访问示例(瓦片编码是必需的)
平均报酬
应用于非偶发性任务的主要概念是平均报酬。*平均奖励设置也适用于持续问题,即代理和环境之间的交互永远持续下去而没有终止或开始状态的问题。然而,与这种设置不同,这里没有折扣——代理人对延迟奖励的关心和对即时奖励的关心一样多。*所以关键是
- 在此设置下没有折扣系数
- 平均奖励将被引入算法
让我们直接进入算法,我会解释为什么会这样。
差分半梯度 Sarsa
首先,该算法适用于连续状态空间,实际上,智能体的探索过程和权重更新过程与我们之前谈到的其他算法是相同的,不同之处在于这里引入的平均奖励项。
关键区别在于δ的定义,在继续任务中,奖励定义为R(S, A) — R(average)
,即当前状态下收到的奖励与直到当前状态的平均奖励之差。我给大家直观的解释一下为什么这里要引入平均奖励,回想一下R(S, A) + Q(S', A')
的定义,它是对Q(S, A)
的价值的估计,等于代理人一路走到游戏结束要收集的奖励。然而,在一个连续的任务中,游戏永远不会结束,因此收集的奖励可能趋于无穷大,它需要一个项来约束估计值,然后得到平均奖励!
随着步骤的进行,平均奖励也需要更新(注意,β是奖励更新专用的学习率)。对于平均奖励设置,就像为代理设置了一个基线,只有当代理进行一个给出高于平均奖励的行为时,权重才能被正向更新,否则为负向(不考虑下一个状态的 q 值)。如果你仍然不相信这个解释,并且怀疑如果没有平均奖励项会发生什么,我会在帖子的最后给你看没有平均奖励的服务器访问示例的学习结果。
服务器访问实现
现在让我们将该算法应用于一个具体的连续任务示例,该示例引自 Sutton 的书,名为访问控制排队任务。
问题描述
这是一个决策任务,涉及到对一组 10 台服务器 的访问控制。 四个不同优先级 的客户到达一个队列。如果被给予访问服务器的权限,客户向服务器支付 奖励 1、2、4 或 8 ,这取决于他们的优先级,优先级越高的客户支付的越多。在每个时间步中,队列最前面的客户要么被接受(分配给其中一个服务器),要么被拒绝(从队列中删除,奖励为零)。在这两种情况下,在下一个时间步,考虑队列中的下一个客户。队列永远不会清空,队列中客户的优先级是平均随机分布的。当然 如果没有免费的服务器 顾客就无法得到服务;在这种情况下,顾客总是被拒绝。 每个繁忙的服务器在每个时间步长上以概率 *p = 0.06*
空闲。 任务是在每一步决定是否接受或拒绝下一个顾客,依据他的优先级和免费服务员的数量,从而最大化长期报酬而不打折扣。
概括地说,我们的代理需要根据客户的优先级和当前的免费服务器数量来决定是否接受客户,以便获得最大的长期回报。这个游戏设置肯定是一个持续的任务,因为这个过程永远不会结束,因为等待队列永远不会是空的。状态为(numberOfFreeServers, customerPriority)
,行动为拒绝或接受,根据客户的优先级,奖励为 1、2、4、8。如果你清楚这些规则,让我们开始执行吧。(全面实现)
价值函数
这是一个离散状态任务,但是由于我们已经集中讨论了在连续状态上应用瓦片编码,我们将在状态空间的表示中再次应用它,即使它是离散的(我们在这里应用的瓦片编码函数在这里讨论)。
这实际上是一个 Q 值类,我们在里面设置了 8 个 tilings,总共 2048 个网格。动作 1 代表接受,0 代表拒绝。value
函数根据当前状态(n_server,priority)和动作给出值,update
函数相应地更新权重。stateValue
函数返回状态的最大值(这个函数只会用在可视化部分),注意当空闲服务器数为 0 时,它返回动作 0 的值(总是拒绝)。
现在让我们进入主类:
初始化
所有这些初始化都是不言而喻的,并且对于每个服务器,免费概率是 0.06。
动作选择
numFreeServers
函数根据当前状态给出当前空闲服务器的数量。chooseAction
函数基于当前状态和我们上面讨论的值函数选择动作,动作选择方法也是ϵ-greedy.
下一个状态和奖励
在代理采取行动之后,我们需要判断下一个状态,如果行动被接受,空闲服务器的数量将减 1,如果行动被拒绝,空闲服务器的数量保持不变。下一个客户的优先级是随机生成的。
giveReward
函数只是根据客户的优先级给出奖励。在拒绝动作的情况下,奖励总是 0。
滚动游戏
最后的run
函数,我们会把整个过程组装起来,让代理学习。
该函数非常简单,因为一切都完全按照算法中的步骤进行。(全面实施)
结果
现在让我们看看我们的代理表现如何:
这是 50,000 轮后的结果,其中α=0.01,β=0.01,exp_rate=0.1。图表右侧的下降可能是由于数据不足;这些状态中有许多是从未经历过的。
最后,让我告诉你如果没有平均回报期限会发生什么。
状态值比实际值大得多,事实上,我们运行的轮数越多,状态值就越大,因为δ没有被很好地限制。
参考:
- http://incompleteideas.net/book/the-book-2nd.html
- https://github . com/Shang tong Zhang/reinforcement-learning-an-introduction
强化学习——实现网格世界
引入值迭代
当你试图着手强化学习时,很可能网格世界游戏是你遇到的第一个问题。这是强化学习中最基本也是最经典的问题,我相信,通过自己实现它,是理解强化学习基础的最好方法。与此同时,实现你自己的游戏,看看一个机器人如何自己学习也是非常有趣的!
规则
Grid Board
规则很简单。你的代理人/机器人从左下角(“开始”符号)开始,并以相应的奖励+1 或-1 结束。在每一步,代理人有 4 个可能的动作,包括上、下、左、右,而黑色的方块是一堵墙,代理人无法穿过。为了使它更直接,我们的第一个实现假设每个动作都是确定性的,也就是说,代理将去它打算去的地方。例如,当代理决定在(2,0)采取行动时,它将在(1,0)而不是(2,1)或其他地方着陆。(我们将在我们的第二个实现中增加不确定性)然而,如果代理碰到墙,它将保持在相同的位置。
板
所以让我们开始破解代码吧!首先,让我们建立一些董事会的全局规则。(全码)
而作为一个网格游戏,它需要一个状态来为我们代理人的每个状态(位置)正名,根据其状态给予奖励。
当我们的代理人采取行动时,国家应该有一个功能来接受行动并返回下一个国家的法律地位。
代理人
这是人工智能部分,因为我们的代理应该能够从过程中学习,并像人类一样思考。魔术的关键是价值迭代。
值迭代
我们的代理最终将学习的是一个策略,而策略是从状态到动作的映射,简单地指示代理在每个状态下应该做什么。在我们的例子中,不是学习从状态到行动的映射,我们将利用价值迭代来首先学习状态到价值的映射(这是估计的回报),并且基于该估计,在每个状态,我们的代理将选择给出最高估计回报的最佳行动。
不会有任何古怪、令人挠头的数学问题,因为价值迭代的核心非常简洁。
value iteration
这就是价值迭代的精髓,超级利落吧?这个公式几乎适用于所有的强化学习问题,让我解释一下我们的智能体是如何基于这个公式从一个婴儿进化成专家的。价值迭代,顾名思义,在每次迭代(游戏结束)时更新其价值(预估奖励)。
起初,我们的代理对网格世界(环境)一无所知,所以它会简单地将所有奖励初始化为 0。然后,它开始通过随意走动来探索世界,当然它一开始会经历很多失败,但这完全没关系。一旦它到达游戏结束,奖励+1 或奖励-1,整个游戏重置,并且奖励以向后的方式传播,最终沿途所有状态的估计值将基于上面的公式更新。****
让我们仔细看看这个公式。左边的 V(St) 是该状态的更新值,右边的是当前未更新值, α **是学习率。**该公式简单地说,状态的更新值等于当前值加上一个时间差,这是代理从玩游戏的迭代中学习到的减去先前的估计。例如,假设有两个状态,S1
和S2
,它们都有一个估计值 0,在这一轮游戏中,我们的代理从S1
移动到S2
并获得奖励 1,然后是S1 = S1 + α(S2 - S1)
的新估计值,即0 + 0.1(1-0) = 0
(假设α为 0.1,在S1
的奖励为 0)
我们记录代理的所有状态,在游戏结束时,我们将以reversed
的方式更新评估。
勘探&开采
我们还有最后一件事要谈。一旦我们的代理发现了一条获得+1 奖励的路径,它应该坚持下去并永远沿着这条路径走下去(剥削)还是应该给其他路径一个机会(探索)并期待一条更短的路径?实际上,我们将平衡探索和开发,以避免我们的代理陷入局部最优。在这里,我们的代理将基于某些exploration_rate
选择操作
玩
就是这样!这些都是我们玩网格世界游戏所需要的。我们可以开始,让我们的代理人玩游戏!
50 round of playing
这是每个州打完 50 轮游戏后的预估。由于我们的行动是确定性的,我们可以通过遵循最高的估计在每个状态下获得最佳行动!完整的代码是这里,去玩吧,如果你发现有什么需要更新的,欢迎投稿!
目前,我们都在关注价值迭代和确定性游戏世界。然而,在实际情况中,代理并不总是到达它希望到达的位置。让我们更深入地探索非确定性游戏和 Q-learning 。
参考文献
[1]https://www . cs . Swarthmore . edu/~ bryce/cs63/s16/slides/3-21 _ value _ iteration . pdf
[2]https://github . com/JaeDukSeo/reinforcement-learning-an-introduction
强化学习—实施 TicTacToe
两个代理人游戏介绍
我们通过迭代更新 Q 值函数,即(state, action)
对的估计值,实现了网格世界游戏。这一次,我们来看看如何在对抗性游戏中利用强化学习——井字游戏,其中有更多的状态和动作,最重要的是,有一个对手与我们的代理人对抗。(查看之前的帖子)
强化学习的优势
然而,在一般的博弈论方法中,比如最小-最大算法,算法总是假设一个完美的对手是如此理性,以至于它采取的每一步都是为了最大化它的回报和最小化我们的代理人回报,在强化学习中,它甚至没有假设对手的模型,结果可能会出乎意料地好。
通过将对手视为智能体可以与之交互的环境的一部分,在一定数量的迭代之后,智能体能够在没有智能体或环境的任何模型的情况下提前计划,或者对可能的未来动作或状态进行任何搜索。优点是显而易见的,因为该方法省去了复杂的数学推导或探索大量搜索空间的努力,但是它能够通过简单的尝试和学习来达到最先进的技能。
在接下来的会议中,我们将:
- 首先,训练两个代理相互对战并保存他们的策略
- 第二,加载策略,让代理人扮演人类
状态设置
首先,我们需要一个州级机构来充当董事会和法官。它具有记录双方玩家棋盘状态的功能,并在任何一方玩家采取行动时更新状态。同时,它能够判断游戏的结束,并相应地给予玩家奖励。(点击 查看 代码)
tic-tac-toe board
为了阐明这个强化学习问题,最重要的是要清楚 3 个主要组成部分——状态**,行动,和奖励**。这个游戏的状态是代理人和它的对手的棋盘状态,所以我们将初始化一个 3×3 的棋盘,用 0 表示可用的位置,如果玩家 1 移动,用 1 更新位置,如果玩家 2 移动,用-1 更新位置。动作是玩家根据当前棋盘状态可以选择的位置。奖励在 0 到 1 之间,只在游戏结束时给出。
初始化
在init
功能中,我们初始化一个空棋盘和两个玩家p1
和p2
(我们初始化p1
以先玩)。每个玩家都有一个playSymbol
,当玩家采取一个动作时,它的playerSymbol
会被填入棋盘并更新棋盘状态。
董事会状态
getHash
函数对当前电路板状态进行哈希运算,以便将其存储在状态值字典中。
当玩家采取行动时,其对应的符号将被填入棋盘。并且在状态被更新后,棋盘还会更新当前棋盘上的空位,并依次反馈给下一个玩家。
检查赢家
在玩家采取每一个动作后,我们需要一个函数来持续检查游戏是否已经结束,如果结束,判断游戏的赢家,并给予双方玩家奖励。
winner
函数检查行、列和对角线的总和,如果p1
赢则返回 1,如果p2
赢则返回-1,如果平局则返回 0,如果游戏尚未结束则返回None
。在游戏结束时,1 奖励给赢家,0 奖励给输家。需要注意的一点是,我们认为平局也是一个糟糕的结局,所以我们给我们的代理人p1
0.1 的奖励,即使游戏是平局(可以尝试不同的奖励,看看代理人如何行动)。
播放器设置
我们需要一个代表我们代理的玩家类,玩家能够:
- 基于状态的当前估计选择动作
- 记录游戏的所有状态
- 每场比赛后更新状态值估计
- 保存并加载策略
初始化
我们将初始化一个dict
存储状态值对,并在每局游戏结束时更新估计值。
在init
函数中,我们在列表self.states
中记录玩家在每场比赛中的所有位置,并在self.states_value
dict 中更新相应的状态。在行动选择方面,我们使用ϵ-greedy 方法来平衡探索和开发。这里我们设置了exp_rate=0.3
,意思是ϵ=0.3
,所以 70%的时间我们的代理将采取贪婪的行动,这是基于状态值的当前估计选择行动,30%的时间我们的代理将采取随机行动。
选择操作
我们将板状态的散列存储到状态值字典中,并且在利用时,我们散列下一个板状态并选择返回下一个状态的最大值的动作。
状态值更新
为了更新状态的值估计,我们将应用基于以下公式更新的值迭代
Value Iteration(From Reinforcement Learning an Introduction)
公式简单的告诉我们 状态 t 的更新值等于状态 t 的当前值加上下一个状态的值和当前状态的值之差,再乘以一个学习率α(假设中间状态的奖励为 0) 。
逻辑是我们基于我们最新的观察慢慢更新当前值。
正如我上面提到的,每场比赛的位置存储在self.states
中,当代理到达比赛结束时,估计值以reversed
的方式更新。
培养
既然我们的代理能够通过更新价值评估来学习,并且我们的板都设置好了,那么是时候让两个玩家互相对战了(这个部分放在 State 类中)。
在训练期间,每个球员的过程是:
- 寻找空缺职位
- 选择操作
- 更新棋盘状态并将动作添加到玩家状态
- 判断游戏是否结束,并给予相应的奖励
保存和加载策略
在训练结束时(在一定数量的回合之后玩),我们的代理能够学习它的策略,它存储在状态值字典中。我们需要保存这个策略来对抗人类玩家。
人类 VS 计算机
现在我们的代理已经设置好了,在最后一步,我们需要一个人类类来管理与代理的游戏。
这个类只包含了一个可用的函数chooseAction
,它要求我们输入我们想要的棋盘位置。
而且我们还需要修改一下play
函数内部的状态:
大致相同,我们让 1 号玩家(也就是我们的代理人)先玩,每走一步,棋盘就印好了。
玩得开心!
Play against human
play2
功能我们显示棋盘状态,并要求你在游戏过程中输入你的位置。
自己去试试,玩得开心!(点击 查看 代码)
参考:
- http://incompleteideas.net/book/the-book-2nd.html
- https://github . com/JaeDukSeo/enforcement-learning-an-introduction
作业调度中的强化学习
In October 2015, AlphaGo, an AI-powered system, beat Mr Fan Hui, the reigning 3-times European Champion of the complex board game Go, by 5 points to 0. It was the first time an AI conquered a human in such a sophisticated game.
写我的第一篇媒体文章的想法引起了我的兴趣,因为我相信这可以给我一个平台来分享和贡献我想从社区成员那里读到的东西。一个外行人很难理解科学出版物和研究论文,以至于他/她要花几天甚至几周的时间才能彻底理解术语和院士工作的新颖性细节。因此,我以此为媒介(这是一个巧合的双关语)开始撰写和解释一个特定的科学贡献,尽我所知,鼓励其他作家以类似的方式做出贡献。
我想以基于出版物的第一篇文章开始我的系列文章,标题为“使用深度强化学习的多资源管理和突发时间预测”。
从技术细节开始,有必要向读者介绍我们生活中各种科技方面普遍存在的资源分配问题。我们可以谈论任何领域的资源,比如无线电网络、无线通信网络、云计算、软件网络等等。无论系统出现在哪里,只要它将一组任务/作业作为输入,就总是涉及到为这些任务/作业组分配资源的概念。
谈到资源需求,我们会想到资源集群和集群调度的概念。考虑一个在线多资源分配问题,它包括 CPU、I/O 单元、内存等资源。(参见下图)。
这样一组聚集在一起的不同资源可以被称为资源集群,并且到达的每个任务/作业将需要属于该集群的每个资源的一定数量的单元。我们的目标必须是最大限度地减少任何资源的浪费,也就是说,这些资源不应该长时间闲置,特别是如果未来的工作需要它们来完成。因此,集群利用率和效率被视为适当的资源管理和调度决策的重要指标。
为了解决手头的问题,作者提出了 SchedQRM,这是一个在线多资源调度器,它接受一组作业及其作业签名作为输入(这里,作业签名指的是 BSS、ROdata 等值。对于一组编程应用程序/代码来说,使用一些基本的 Linux 命令就可以很容易地实现这一点。调度程序使用两层方法来执行上述任务:
- 根据签名对作业的突发时间进行分类
SchedQRM takes job signature as an input and predicts the burst time for the job using a Deep Neural Network (DNN).
2.采用强化学习算法来寻找最优调度策略
The second section consists of the reinforcement learning model, which outputs a scheduling policy for a given job set.
目标:优化平均工作减速或工作完成时间。
我想我在这里介绍了一些非常不同的术语。从突发时间开始,它被定义为过程完成所需的时间。作业减速被定义为作业完成时间与其突发时间之比。(注意——作业完成时间包括突发时间以及自调度程序收到作业后的其他等待时间。)
面临的最困难的挑战之一是最终确定特定的状态表示,其中给定的状态将包含关于要调度的作业的所有期望信息、正在使用的资源单元的数量以及在特定时间步长可用于即将到来的作业的资源单元的数量。下图显示了所使用的状态表示。(请参考 原创研究论文文章 以便更好地理解同一。)
Pictorial representation of a sample state.
这项工作背后的一个基本假设是,不允许工作被抢占,也不允许任何工作被优先分配。这展示了一个看似合理的未来机会,可以深入研究这个问题陈述,并处理一个更真实的场景,在这个场景中,这些假设是不存在的。
谈到本文和研究出版物的核心概念,简单地说,强化学习指的是一种学习,其中代理存在于给定的环境中,并能够根据它在做出特定决策时获得的奖励类型(正面或负面)自行做出合适的决策。这个问题陈述的形成和自动化端到端调度过程的想法仅仅基于这个概念,因此,我们相信,尽管强化学习已经成为许多研究人员关注的中心,但它确实可以成为解决各种问题陈述的有前途的方法。
我希望我已经能够以简单易懂的方式总结了上面讨论的研究文章。最后,我会进一步鼓励感兴趣的读者阅读研究论文以及研究机构对这一问题陈述做出的其他相关贡献,以获得更深入的见解。
关于这篇文章以及研究出版物的任何反馈都是最受欢迎的。如果有人愿意伸出手来分享他们对这一特定问题陈述的看法,我将不胜感激。
强化学习充满了操纵性的顾问
当用于训练强化学习算法的环境存在方差差异时,奇怪的事情就会发生。不管回报如何,价值评估网络更喜欢低方差的领域,这使他们成为一个善于操纵的顾问。Q-learning 算法陷入了“无聊区域陷阱”,并且由于低方差而无法摆脱。奖励噪音可以有所帮助,但必须小心谨慎。本文基于我的论文“用于强化学习的自适应对称奖励噪声
操纵顾问
我想象一下你去找一个投资顾问,你先问他如何收费。是根据你将获得的利润吗?“不,”他说。“我对你回报的预测越准确,你给我的报酬就越高。但我将只在你选择的投资上接受考验。”
这有点可疑,你开始四处寻找其他使用这个顾问的人。结果,他只向他们推荐了低回报、低波动的政府债券。他甚至告诉他们这是最高的平均回报!他们都相信他,买了债券,当然他对回报的预测非常准确,误差很小。所以他们不得不付给他最高的费用。
Source: South Park
你觉得这个人怎么样?我觉得他是一种**“操纵型顾问”。**
而强化学习中的每一个人都在用的正是这个家伙。
目前,在强化学习(RL)中有两个主要的算法家族:深度 Q 网络(DQN)和 Actor Critic。两者都使用顾问功能或“价值评估”功能——一种深度神经网络(DNN ),用于评估状态和/或行动的价值。在 DQN,这是 Q 网络,在演员评论家这是评论家网络。这基本上是一个好的决定:价值评估功能可以学习偏离政策,这意味着他们可以通过观看别人比赛来学习,即使他不太好。这使他们能够从过去已经放弃的政策中吸取经验。
然而,有一个问题:我们根据这个顾问的准确性“支付”他:用于优化网络的损失函数是基于网络的预测误差。并且网络在它选择的行动上被测试:政策将做网络建议的最好的,并且这将是经验的唯一未来来源。
现在,每个人都抱怨说 RL 还不能工作并且 Deep 几乎不能帮助。理应如此。训练 RL 算法是脆弱的:它强烈依赖于网络和参数的初始化,所以你必须一次又一次地重复相同的实验,每次都有不同的初始化。你看你的算法进步了,然后退步了。你感到困惑,因为它这样做的同时,损失函数继续显示改善的性能。你可以选择一路上最好的临时网络,然后就到此为止,但是你无法通过 RL 来进一步改善结果。
所以我们在这里声明的是,你只是选错了顾问。或者至少——选择了错误的支付方式。他选择了低回报的行动,并告诉你所有其他选择都更糟。他会更准确,因为他推荐的行动的回报是可以预测的。你永远不会发现他在操纵你,因为你一直在测试他的选择。
首先,让我们证明这些亏损缺口确实存在。拿一个简单的游戏来说:两台老虎机(RL 里叫“多臂土匪”),右边的一台给 1 奖励但方差高,左边的一台坏了,所以给 0 奖励方差 0。我们称之为断臂强盗。
现在,你必须决定在游戏的每一集使用哪一个。似乎很容易?不是为了 Q-learning。
请看下图中的两条细线。它们显示了当前选择右手柄(细线,绿色)和当前选择左手柄(细线,红色)的代理的 Q 表的更新项。在 DQN,这个更新术语将是功能丧失。从图中可以明显看出,选择左边的人做得更好,损失也更小:
现在,每一个好的 RL 算法都有它的探索方案。这里我们使用ε-贪婪方案,ε是衰减的。事实上,100%探索测试了顾问没有推荐的东西,并且得到了基本相同的损失。但这只是在训练开始的时候。随着ε衰变,探索减少,红色细线不断衰减。现在,如果你在一次真正的训练中看到那句话,你会不会认为一切都很好,因为损失正在下降?实际上,你看到的是一个懒惰的网络,它摆脱了艰苦的探索测试。
我们看到的是失败的差距,无聊的决定会赢。当我们通过最小化这种损失来优化深层网络时,有时它会偏向于最小化其损失的无聊决策。但是如果我们根本不用 DNN 呢?如果我们使用好的 Q 学习,用 Q 表呢?还有一个问题,叫做“无聊区域陷阱”。
无聊区域陷阱
想象一下,你有一辆自行车,有人在离你家一英里远的地方给你一份免费的比萨饼。你有两个选择:你可以放弃去那里,你会得到一个均值为 0 方差为 0 的披萨。另一方面,你可以决定骑到那里,然后你平均得到 1 个比萨饼,但差异很大:以非常小的概率,你可能会发生事故,你将在石膏中度过 6 个月,在极度痛苦中,为你毁坏的自行车赔钱,没有比萨饼。
Source: Lego Grad Student
通常,这是一个简单的决定:你以前从未发生过车祸,你估计现在发生车祸的可能性很低,你更喜欢较高的比萨饼平均值。所以你去那里买披萨。
但是如果你运气不好,仅仅骑了 100 次就出了事故怎么办?现在你估计事故发生的几率比真实的概率要高得多。开车去吃免费披萨的平均回报估计为负,你决定待在家里。
现在问题来了:你再也不能骑马了,因此也永远不会改变你骑马的想法。你会一直相信它有负的平均回报,你呆在家里的经历会验证你关于呆在家里的平均回报的信念,什么都不会改变。
无论如何,你为什么要离开家?嗯,必须发生的是一个互补错误。比如你呆在家里,一个架子掉在你头上。又一次,极度的痛苦。现在,你只能怪你的架子。你对呆在家里的评价也变得消极了。而如果低于你对离家的估计,你还会再出去吃那个披萨。
注意,这里没有优化:你有一个状态的 Q 表:饥饿状态,和两个动作:去或不去比萨饼。你直接从得到的奖励算出了手段。这是你能做的最好的事情,但是你最终被困在家里,饿着肚子,直到这个架子把你弄出来。
这个现象可以用上面的同一个断臂大盗来模拟。但是现在我们可以尝试使用 Q-learning 来解决这个问题。
让我们来看看 10 名代理就此任务接受的培训:
我们可以看到,他们所有人,在某个时候,都去获得零回报,这意味着他们选择拉故障的手臂。想象一下,他们站成一排,拉着死去的机器手臂,无视右边所有灯都亮着的工作着的机器。他们看起来不傻吗?好吧,笑话是关于我们利用他们作为我们的专家。注意:为了加快速度,我们选择了 0.1 的高学习率,所以通常经过几百万次迭代后发生的事情会发生得非常快。现在,让我们找 100 个代理,看看有多少人选择了左边不工作的手臂。他们在红线上:
再次,这需要一些时间,但他们最终都选择左臂作为他们的最佳选择。
为了了解发生了什么,我们将查看一个代理的内部参数——其 Q 表中 Q_left 和 Q_right 的值。我们删除了所有的探索,看看到底发生了什么,并初始化参数为最佳,所以这是一个训练有素的代理,至少在开始。右臂像以前一样有很高的方差。这里我们也给了左臂一个小的方差,所以这是一个具有方差差异的常规双臂土匪问题:
右臂方差大。因此,它的估计 Q_right 也有很高的方差,尽管由于它是与过去的回报相加而低得多。Q_right 因为几个集中的坏奖励,在第 40 集就变得比 Q_left 低了。
从那以后,代理只选择左边的手柄。所以它进入了“无聊区域陷阱”。现在 Q_right 改不了,由于缺乏实例。Q_left 由于方差较小,几乎没有变化。女士们先生们,这就是为什么我们称之为陷阱!
在第 320 集,出现互补错误。Q_left 变得比假低的 Q_right 低。这是当我们走出陷阱,并开始拉右臂,获得更好的 Q_right 估计。
什么方差差异导致了这个问题?这里我们可以看到不同σ_l 和σ_r 值的评分图,显示在 10,000 集后,50 个代理中有多少选择了右臂:
在右下角有一个黑色区域,由于方差差异较大,所有代理都失败了。由于较低的方差差异,在中心有另一个区域,代理在该区域进出陷阱。只有当方差差异很低时,Q-learning 才起作用。较低的学习率会使黑暗区域进一步向右移动,但是会降低学习率,所以训练会非常慢。
奖励噪音
提出的解决方案来自人类认知的一个实验。一些科学家进行了一项名为“行进中的农业”的实验,该实验与双臂土匪相同,但每个动作都移动了两台机器的方式。他们发现,给奖励增加一点噪音自相矛盾地帮助了人们*【排除简单假设】和鼓励【选择抽样】*,实际上帮助他们获得了更多的奖励!我们也可以这样做。我们可以给奖励增加一个对称的噪声,这样它就不会影响平均奖励。
但如果我们把噪音平均加到所有奖励上,还是会有有利于左机的损失差距。所以我们希望它是自适应的,这意味着我们将只给低方差动作添加噪声。
如果我们这样做,就会得到我们已经看到的图表中的粗线:
这表明我们在所有奖励中添加了大量噪声,但现在两台机器中的噪声量大致相同。这就是 ASRN 或自适应对称奖励噪声所做的:它估计哪些状态/动作具有低方差,并主要向它们添加噪声。它是如何估算的?使用 Q_table 的更新。更新越大,奖励越惊喜,得到的噪音也就越少。
你可以在这里看到它是如何实现的。当然,ASRN 有它自己的训练期,所以在上面的例子中,变化只在 1000 集之后开始。
当我们检查上面断臂强盗的 ASRN 时,我们看到它帮助特工们走出无聊区域陷阱。以下是上面的 10 个代理:
他们中的一些人到达了无聊区域陷阱,但是利用我们添加的噪音设法逃脱了。
噪声驾驶
现在,所有这些用在强盗身上很好,但是用在真正的东西上呢?
嗯,开车就是一个很合适的例子。就像上面的比萨饼一样,有一个策略会给你低方差的低回报,比如“向左直到你崩溃”。另一方面,还有实际驾驶的策略,由于“达到目标”大奖,它可以有很高的平均奖励,但它伴随着很高的方差——沿途有许多危险等待着。我们使用 AirSim 邻域驾驶模拟训练了一个代理。这是一个非常逼真的驾驶模拟器:
他们已经实现了一个 DQN 代理。因此,剩下要做的就是查看插入 ASRN(绿色)后的平均驾驶时间,与没有 ASRN(红色)和具有统一奖励噪声(青色)的平均驾驶时间进行比较:
这样肯定更好,不是吗?这里可以看到修改后的代码。
这里的是试驾的上策。这不是一个很好的司机。然而,这对于只参加 2750 场比赛的训练来说是一个相当大的成就。
综上所述:我们看到了方差差异给 RL 带来的问题。有些是全球性的,如无聊区域陷阱,有些是深度强化学习(DRL)特有的,如 M 被动顾问。我们还看到,奖励噪声可以有所帮助,特别是如果噪声是对称的,并适应实际的行动差异。我们探索了 Q-learning 和 DQN,但它很可能也适用于演员评论和其他算法。显然,奖励降噪并不是一个完整的解决方案。许多复杂的探索需要并行进行,还有其他 RL 技巧,如剪辑等。操纵性顾问和无聊区域陷阱问题提出的问题至少和它们回答的问题一样多。但是当我们坐下来计划我们的 RL 策略时,记住这些问题是很重要的。思考这一点至关重要:在这种环境中有任何方差差异吗?它们如何影响所选择的算法?也许这将导致一个更稳定的 RL。
感谢:什洛莫·科恩、塔利亚·索尔伯格、奥娜·科恩、吉利·伯克和吉尔·索德·御名方守矢
强化学习正在成为主流。这是可以期待的。
在游戏中击败世界冠军的相同技术将很快彻底改变任何可以模拟的东西(因为一切的核心都是物理——随着时间的推移,这就是一切)
我把这篇文章变成了一个 20 分钟的演讲,所以如果你喜欢看,你可以看:
我上周在拉斯维加斯参加了 AWS re:MARS 会议,本周的主题是机器学习、自动化和机器人(有时在太空中)的结合将如何塑造未来。许多人可能认为这个节目的明星是小罗伯特·唐尼,但在我看来是模拟和强化学习,它出现在会议的几乎每个主题演讲中:
第 1 天:通过强化学习,波士顿动力公司的机器人学会了后空翻、跳上壁架和举起数据。迪士尼幻想工程将这一点推向了一个新的高度,人形机器人表演了挑战死亡的特技。
第二天:亚马逊在他们的 Go 商店使用模拟来训练模型应对困难场景。亚马逊履行中心的机器人被训练使用强化学习来分拣包裹。Alexa 使用模拟交互来自动学习对话的流程。亚马逊无人机送货利用模拟数据训练模型,用于探测无人机下方的人。像 Insitro 这样的公司已经开始使用 RL 通过生成生物交互数据来解决生物医学问题。
第三天:吴恩达称元学习为人工智能的“下一件大事”,在元学习中,数百个不同的模拟器被用来构建更通用的强化学习代理。自动驾驶汽车公司 Zoox 和 Aurora 使用 RL & meta-leraning 来解决在城市环境中驾驶的复杂性。DexNet 正试图建立一个大规模的 3D 模型数据集来帮助利用模拟解决问题。杰夫·贝索斯同意达芙妮·柯勒的观点,RL 生物工程将在 10 年内发展壮大。
综上所述:
如果一个领域中的任务可以被精确模拟,强化学习将在未来几年内极大地提高该领域的技术水平。
物理学有什么用处?
如果你读了我之前的帖子,你会知道我的第一个女儿已经四岁了。这使她坚定地进入了人生的“为什么”阶段,在这个阶段,她的大脑从简单的学习任务转变为想要了解世界的一切。作为一个超级书呆子,我总是开玩笑说,每当她问“为什么”时,我会很乐意带她一路下兔子洞去学物理。事实证明,我的父母错了,甚至一个四岁的孩子也会厌烦地问“为什么?”然后去做一些更有趣的事情,比如涂颜色或者假装在看书。下面是一个典型的交换:
Created using http://cmx.io
这些和数据科学有什么关系?
我最近看了杰夫·迪恩在今年谷歌 I/O 大会上关于深度学习状态的演讲。他提到,神经网络已经被训练为逼近物理模拟器的结果,并以 30 万倍的速度得出结果,研究人员有可能在午餐时测试 1 亿个分子。
Image Source: Jeff Dean presentation at Google I/O 2019
这是一个巨大的进步,因为它应该允许我们使用与 re:MARS 中的明星相同的强化学习技术来解决一系列新的问题。在这些进步之前,为每个潜在的奖励运行一个完整的物理模拟器的周期时间对于 RL 来说太长了,以至于不能达到奖励状态。现在,RL 应该能够了解分子的物理性质,这将优化化学工程师的预期属性。
鉴于一切都可以归结为物理,我开始想象一个世界,在这个世界里,有可能从第一原理构建更多的解决方案。在参加会议时,我曾以为生物学多年来都无法用于模拟,但我刚刚得知,今天已经有像 Insitro 这样的公司开始解决这个问题。
其他最近的发展只会加速我们进入未来状态,在这种状态下,RL 可以用于“更高水平”的科学,如心理学:
- 原始计算能力:谷歌还发布了 T3 TPU 吊舱的私人测试版,其处理能力超过 100 Petaflops ,为运行神经网络训练架构而定制。有了这种能力,像材料分析这样的任务可以很快学会。此外,谷歌已经开始使用 RL 来设计芯片本身,随着时间的推移,这应该会导致额外的改进。
- 更好的可重用性 : DeepMind 正在研究多层网络架构,其中初始 RL 代理为给定任务选择合适的下游网络。这种类型的 RL 代理可以被训练成将高级任务分解成组件,并使用迁移学习解决多个任务。
- 更好的推广:前面提到的元学习技术正在提高 RL 代理适应他们以前没有见过的场景的能力。
- 更好的优化:麻省理工学院的彩票假说论文表明,通过找到“中奖彩票”路径,然后仅使用这些路径进行重新训练,可以进一步压缩神经网络。
- 更好的训练数据生成:像 AutoCad 的创成式设计这样的接口可以帮助设计师/工程师发现需要提供的规范,以便 RL 代理向正确的方向移动。每当有人必须接管时,自动驾驶汽车公司都会产生新的培训场景。
你该怎么办?
首先,你应该去了解强化学习:有许多 伟大的 教程和课程可以教你 RL 的直觉和内部工作方式,所以我们在这里将保持简短:RL 代理获得他们环境的解释状态,选择影响环境的行动,观察新的环境状态,并重复这个过程。如果行动产生了积极的结果,代理人会得到奖励,并且在未来类似的状态下更有可能选择同样的行动。
这种情况会重复很多集,最终,代理变得非常擅长获得奖励(因此也非常擅长我们训练它的任务)。用一些实际操作来补充这种体验的最佳方式之一是使用 AWS Deep Racer ,这是一辆按比例缩小的赛车,它提供了一个模拟环境、一个 RL 训练设置和一个与模拟相对应的物理硬件。你只需玩奖励功能来训练你的赛车代理。从那里你可以
其次,你应该开始积极地寻找方法来模拟你的企业中可以优化的系统。任何现有的模拟器都是一个很好的起点,但新的模拟器可能会产生巨大的影响。同样,AWS 在这一领域有一个名为 RoboMaker 的服务,但有许多替代方案,其中大部分基于开放 API Gym 。如果你想得到一个环境设置,你可以使用英特尔的蔻驰。它将代理、网络和内存结合在一起,让你在几十个不同的预配置代理中进行选择,这些代理针对各种任务进行了优化,然后轻松地将它们连接到 OpenAI 健身房环境。
最后,你应该留意那些乘着这股技术浪潮的新公司。我预计,最终将会有一系列开源模拟器开发出来,以彼此为基础,用深度神经网络来压缩每一层可以学习的关键信息。在此之前,很可能会有专利解决方案,在许多领域超越最先进的技术。随着时间的推移,这将在制药、材料科学、医药、下游石油和天然气等许多科学领域带来巨大收益。
如果你对快速入门感兴趣,我的同事 Ryan Keiper 做了一个演讲,详细讲述了他如何快速入门强化学习来构建一个下棋代理。
强化学习:让我们教出租车司机如何驾驶
强化学习是机器学习的一个子领域,其任务不同于“标准”的学习方式。事实上,你希望你的强化算法从周围环境中从头开始学习,而不是获得历史数据并根据这些数据做出预测或推断。基本上,你希望它像你在类似情况下所做的那样(如果你想了解更多关于 RL 的结构,点击这里阅读我以前的文章)。
在本文中,我将向您展示如何使用 Python 及其库 gym-OpenAI 实现 RL 解决方案,您可以通过在 Jupyter 控制台上运行 pip install gym 来轻松安装它。我要向你提出的问题如下:
您的环境由一个 5x5 矩阵组成,其中每个单元都是您的出租车可以停留的位置。然后,你有 4 个坐标,分别代表上下车地点,分别是(0,0),(0,4),(4,0),(4,3)(为了和 Python 语言的连贯性,第一个索引是 0 而不是 1)。我们将它们称为 R,G,Y,B,并分别用 0,1,2,3 来表示它们的位置。最后,有一名乘客既可以上车,也可以下车,还可以被运送(因此要花时间在出租车上)。具体来说,这个乘客想要到达 b 点。
现在,如果我们导入我们的健身房模块并初始化出租车环境,我们可以看到它复制了我们到目前为止所说的内容:
import gym
env = gym.make("Taxi-v2").env
env.render()
如您所见,我们的 5x5 空间有 4 个位置,其中蓝色字母代表当前乘客的位置,紫色字母代表下车位置。我们在那个空间中也有我们的出租车/代理,它是黄色的矩形,还有一些墙,用符号“|”表示。
现在有两个因素需要我们注意:国家和行动。
让我们首先检查我们的行动。根据导入的模块,代理可以采取 6 种方式:
- 0:向下(南)
- 1:向上(北)
- 2:向右(东)走
- 3:向左(西)走
- 4:拿起
- 5:下车
第二,我们有多少个州?嗯,至少 25 个:事实上,有一个 5x5 的空间,我们知道驾驶室可以简单地占用这些单元。此外,出租车也可以处于搭载或放下乘客的状态(不管它实际上是否在那里:记住出租车将通过尝试前进),因此我们还有 4 种状态。最后,我们必须计算乘客实际上车、下车的状态(+ 4 个状态,因为乘客可能在的位置是 4 个)或只是被运送的状态(+ 1 个状态)。因此,总共有 5x5x4x5=500 个状态。
我们的代理的每个状态由一个向量值*【出租车的行,出租车的列,乘客索引,目的地索引】*表示,因此用 0 到 499 之间的值进行编码。也就是说,我们可以像这样复制上一张图片的位置:
state = env.encode(4, 2, 3, 2)
print("State:", state)env.s = state
env.render()
如您所见,已知我们的出租车位于位置(4,2),乘客索引=3,下车位置=2,我们可以推导出编码状态为 454。在接下来的实验中,我们将使用这个起点,但在深入之前,我们需要介绍最后一个要素:奖励系统。
奖励系统是强化学习背后的主要思想:代理人在任何表现良好的时候都会得到奖励,否则就会受到负面奖励的“惩罚”。在这个特定的例子中,一旦创建了 env,就会创建一个嵌入式奖励表 P 。逻辑如下:
- 如果出租车正确接送乘客,奖励+20 分
- 如果出租车非法上落客,将被扣-10 分
- 不包括上述情况的每一步,减 1 分
让我们看看我们的状态 454 是什么样子的:
env.P[454]
首先要注意的是,我们的 P 表的每个条目都是一个字典,其结构为{action: [(probability, nextstate, reward, done)]}
- 动作:范围从 0 到 5
- 概率:在这种情况下,总是为 1
- Nextstate:这是动作完成时出现的状态
- 奖励:与该行为相关的奖励/惩罚
- done:如果为真,说明这一集结束了,否则不是。
让我们试着读一下我们的结果:第一行告诉我们,如果我们往下走(动作 0 =南),我们将保持在相同的位置,因为我们有一个边界,因此奖励是-1,情节没有结束;第二行,对应于 action=north,会把我们的滑行带向位置 354,但是奖励永远是-1,剧集没有结束。所有动作的推理都是一样的。注意,如果动作是上车或下车,由于出租车不在正确的位置(R,Y,G,B ),如在最后两行(对应于动作 4 和 5 ),它收到-10 的惩罚。
现在是时候训练我们的算法了。我们要用的算法叫做 Q-learning。我已经在这篇文章中解释了背后的思想,因此在这里我不再深入探讨。
以下代码解释了该过程:
import random# setting yperparameters
lr = 0.1 #learning rate
gamma = 0.6 #discount factor
epsilon = 0.1 #trade-off between exploration and exploitationfor i in range(1, 1000): #we will see 1000 episodes
state = env.reset() #let's reset our envepochs, penalties, reward, = 0, 0, 0
done = False
while not done:
if random.uniform(0, 1) < epsilon:
action = env.action_space.sample() # explore action space
else:
action = np.argmax(q_table[state]) # exploit learned valuesnext_state, reward, done, info = env.step(action)
old_value = q_table[state, action]
next_max = np.max(q_table[next_state])
new_value = (1 - alpha) * old_value + lr * (reward + gamma * next_max)
q_table[state, action] = new_valueif reward == -10:
penalties += 1state = next_state
epochs += 1
现在,想象一下,你必须决定哪一个动作能最大化你的效用(翻译过来,这导致对位置 3 的乘客的最佳可能方式)。你的答案可能是北,因此行动 1:事实上,这将是到达你的乘客所在位置(4,3)的最快方式。我们的算法会怎么说?
np.argmax(q_table[454]) #argmax function return the position of the
#maximum value among those in the vector examined
1
如您所见, argmax 函数返回位置 1,这对应于动作“北”。因此,对于每一个位置,我们的 q 表会告诉我们哪一个动作可以最大化当前和未来的回报。
强化学习:贝尔曼方程和最优性(下)
#优化 RL
这个故事是上一个故事的延续, 强化学习:马尔可夫决策过程(第一部分) 故事中,我们谈到了如何为给定的环境定义 MDP。我们还谈到了贝尔曼方程,以及如何找到一个国家的价值函数和政策函数。在这个故事中,我们将更深入一步并了解贝尔曼期望方程,我们如何找到给定状态的最优值和最优策略函数,然后我们将定义贝尔曼最优方程。
Google’s Parkour using Reinforcement Learning
让我们快速浏览一下这个故事:
- 贝尔曼期望方程
- 最优策略
- 状态值函数的贝尔曼最优性方程
- 状态-行为价值函数的贝尔曼最优性方程
所以,一如既往地拿起你的咖啡,直到你感到自豪才停下来。🤓
先说,什么是贝尔曼期望方程?
贝尔曼期望方程
快速回顾一下我们在前面的故事中谈到的贝尔曼方程:
Bellman Equation for Value Function (State-Value Function)
从上面的等式可以看出,一个状态的值可以分解为即时奖励(r【t+1】)加上后继状态的值(v【s(t+1)】)加上一个贴现因子( 𝛾 )。这仍然代表贝尔曼期望方程。但是现在我们正在做的是找到一个特定状态服从某种策略( π )的值。这就是贝尔曼方程和贝尔曼期望方程的区别。
数学上,我们可以将贝尔曼期望方程定义为:
Bellman Expectation Equation for Value Function (State-Value Function)
让我们称之为等式 1。上面的等式告诉我们,当我们在遵循某个政策( π ) 时,特定状态的值是由眼前的回报加上后继状态的值决定的。
类似地,我们可以将我们的状态-动作值函数(Q-函数)表达如下:
Bellman Expectation Equation for State-Action Value Function (Q-Function)
让我们称这个为等式 2。从上面的等式中,我们可以看到,一个状态的状态-动作值可以分解为我们在状态( s 执行某个动作并移动到另一个状态(s’)时获得的即时奖励,加上状态(s’)的状态-动作值相对于的贴现值,我们的代理人将从该状态向前采取某个动作( a )。
深入贝尔曼期望方程:
首先,让我们借助备用图来理解状态-值函数的贝尔曼期望方程:
Backup Diagram for State-Value Function
这个备份图描述了处于特定状态的价值。从状态 s 来看,我们有可能采取这两种行动。每个动作都有一个 Q 值(状态-动作值函数)。我们平均 Q 值,它告诉我们在一个特定的状态下有多好。基本上它定义了 V π(s)。【看等式 1】
数学上,我们可以定义如下:
Value of Being in a state
这个等式也告诉我们状态-值函数和状态-动作值函数之间的联系。
现在,让我们看看状态-动作值函数的备份图:
Backup Diagram for State-action Value Function
这张备份图表明,假设我们从采取一些行动(a)开始。因此,由于动作(a ),代理可能被环境吹到这些状态中的任何一个。因此,我们在问这个问题, 采取行动有多好(a)?
我们再次对两种状态的状态值进行平均,加上即时奖励,这告诉我们采取特定的行动(a)有多好。这就定义了我们的 q π(s,a)。
数学上,我们可以这样定义:
Equation defining how good it is to take a particular action a in state s
其中 P 是转移概率。
现在,让我们将这些备份图拼接在一起,以定义状态值函数 V π(s) :
Backup Diagram for State-Value Function
根据上图,如果我们的代理处于某个状态,并且从该状态假设我们的代理可以采取两个动作,由于哪个环境可能将我们的代理带到任何状态。请注意,我们的代理可能从状态 s 采取行动的概率由我们的策略加权,并且在采取该行动后,我们到达任何状态(s’)的概率由环境加权。
现在我们的问题是,在采取一些行动并降落在另一个州(s ')之后,在另一个州(s)并遵循我们的政策( π )有多好?
这与我们之前所做的类似,我们将对后续状态的值(s’)进行平均,并使用我们的策略对一些转移概率§进行加权。
数学上,我们可以定义如下:
State-Value function for being in state S in Backup Diagram
现在,让我们对状态-动作值函数 q π(s,a) 做同样的处理:
Backup Diagram for State-Action Value Function
这与我们在状态值函数中所做的非常相似,只是它是相反的,所以这个图基本上说我们的代理采取一些行动( a ),因为环境可能会将我们带到任何状态( s ),然后从那个状态我们可以选择采取任何行动(a’),用我们策略的概率( π )加权。同样,我们将它们平均在一起,这让我们知道始终遵循特定策略( π )采取特定行动有多好。
数学上,这可以表示为:
State-Action Value Function from the Backup Diagram
所以,这就是我们如何为一个给定的 MDP 制定贝尔曼期望方程,找到它的状态-价值函数和状态-行为价值函数。 但是,它并没有告诉我们 MDP 的最佳行为方式 。为此,让我们来谈谈什么是最优值和最优政策函数 T21。
最优值函数
定义最佳状态值函数
在 MDP 环境中,根据不同的政策,有许多不同的价值函数。 最佳价值函数是与所有其他价值函数 相比产生最大值的函数。当我们说我们正在求解一个 MDP 时,实际上意味着我们正在寻找最优值函数。
因此,数学上最优的状态值函数可以表示为:
Optimal State-Value Function
上式中,v∫(s)告诉我们,我们能从系统中得到的最大回报是什么。
定义最佳状态-动作值函数(Q-Function)
类似地,最优状态-行动价值函数告诉我们,如果我们处于状态 s 并从那里开始采取行动 a,我们将获得的最大回报。
数学上,它可以定义为:
Optimal State-Action Value Function
最优状态值函数:所有策略的最大值函数。
最优状态-动作值函数:是所有策略的最大动作值函数。
现在,让我们看看,什么是最优政策?
最优策略
在我们定义最优策略之前,让我们先了解一下, 一种策略比另一种策略更好是什么意思?
我们知道,对于任何一个 MDP 来说,都有一个政策(【π】)比其他任何政策(【π】)都要好。但是怎么做呢?
如果针对所有状态的策略 π 的价值函数大于针对所有状态的策略**π’**的价值函数,则我们说一个策略( π) 优于其他策略(π’)。直观上,它可以表示为:
现在,让我们定义 最优策略:
最优策略是产生最优价值函数的策略。
请注意,在一个 MDP 中可以有多个最优策略。但是, 所有的最优政策都实现相同的最优价值函数和最优状态-行动价值函数(Q-function) 。
现在,问题来了,我们如何找到最佳政策。
寻找最佳策略:
我们通过最大化超过 q *** (s,a)即我们的最优状态-行为价值函数来找到最优策略。我们求解 q(s,a),然后选择给出最佳状态-动作值函数(q(s,a))的动作。
上面的陈述可以表达为:
Finding Optimal Policy
这里说的是,对于状态 s,我们选择概率为 1 的动作 a,如果它给我们最大的 q*(s,a)。所以,如果我们知道 q*(s,a),我们可以从中得到一个最优策略。
我们用一个例子来理解一下:
Example for Optimal Policy
在这个例子中,红色弧线是最优策略,这意味着如果我们的代理遵循这条路径,它将从这个 MDP 中获得最大的回报。同样,通过查看每个状态的 q* 值,我们可以说我们的代理将采取的行动产生了最大的回报。因此,最优策略总是采取 q值较高的行动(状态-行动值函数)。例如,在值为 8 的状态中,有值为 0 和 8 的 q。我们的代理选择具有更大的 q* 值的那个,即 8。
现在问题来了, 我们怎么求这些 q(s,a)值?*
这就是贝尔曼最优方程发挥作用的地方。
贝尔曼最优方程
最优值函数与贝尔曼最优方程递归相关。
贝尔曼最优方程和贝尔曼期望方程是一样的,但是唯一的区别是,我们不是取我们的代理可以采取的行动的平均值,而是取最大值的行动。
让我们借助备份图来理解这一点:
Backup diagram for State-Value Function
假设我们的代理处于状态 S,从该状态它可以采取两个动作(a)。因此,我们查看每个动作的动作值,并且不同于、贝尔曼期望方程、而不是取平均值,我们的代理采取具有更大 q*值的动作。这给了我们处于状态 s 的价值。
数学上,这可以表示为:
Bellman Optimality Equation for State-value Function
同样,我们来定义状态-作用值函数(Q-Function) 的贝尔曼最优性方程。
让我们看看状态-动作值函数(Q 函数)的备份图:
Backup Diagram for State-Action Value Function
假设,我们的代理人在一些州 s 采取了行动 a。现在,它取决于环境,它可能会把我们吹到这些州中的任何一个(s’)。我们仍然取两个状态的平均值,但是唯一的差异是在贝尔曼最优方程中,我们知道每个状态的最优值**。不像在贝尔曼期望方程中,我们只知道状态的值。**
数学上,这可以表示为:
Bellman Optimality Equation for State-Action Value Function
让我们再次缝合这些状态值函数的备份图:
Backup Diagram for State-Value Function
假设我们的代理处于状态 s,并从该状态采取了一些行动(a ),其中采取该行动的概率由策略加权**。并且由于动作(a),代理可能被吹到概率由环境加权的任何状态(s’)。为了找到状态 S 的值,我们简单地对状态(S’)的最优值进行平均。这给了我们处于状态 s 的价值。**
数学上,这可以表示为:
Bellman Optimality Equation for State-Value Function from the Backup Diagram
等式中的最大值是因为我们最大化了代理在上弧中可以采取的行动。这个方程也显示了我们如何把 V*函数和它本身联系起来。
现在,让我们看看状态-动作值函数 q(s,a)的贝尔曼最优方程:*
Backup Diagram for State-Action Value Function
假设,我们的代理处于状态 s ,它采取了一些动作( a )。由于该动作,环境可能会将我们的代理带到任何状态(s’),并且从这些状态我们可以最大化我们的代理将采取的动作,即选择具有最大 q*值的动作。我们回到顶点,这告诉我们动作 a 的值。
数学上,这可以表示为:
Bellman Optimality Equation for State-Action Value Function from the Backup Diagram
让我们看一个例子来更好地理解它:
Example for Bellman Optimality Equation
请看红色箭头,假设我们希望找到值为 6 的 state 的值**(红色的**),我们可以看到,如果我们的代理选择脸书,我们将获得-1 的奖励,如果我们的代理选择学习,我们将获得-2 的奖励。为了找到红色状态的值,我们将使用状态值函数的贝尔曼最优方程,即*,考虑到其他两个状态具有最优值,我们将对两个动作取平均值并最大化(选择给出最大值的一个)。因此,从图中我们可以看到,对于我们的红色州来说,去脸书得到的值是 5,去学习得到的值是 6,然后我们将这两个值最大化,得到的答案是 6。***
现在,我们如何求解大型 MDP 的贝尔曼最优方程。为了做到这一点,我们使用动态编程算法,如策略迭代和值迭代,我们将在下一个故事中介绍,以及其他方法,如 Q-Learning 和 SARSA ,它们用于时间差异学习,我们将在未来的故事中介绍。
太棒了!
恭喜你走到这一步!👍
希望这个故事能增加你对 MDP 的了解。很乐意在 insta gram上与您联系。
谢谢你与我分享你的时间!
如果你喜欢这个,请点击让我知道👏。它帮助我写更多!
关于马尔可夫决策过程的第 1 部分、第 2 部分和第 3 部分:
- 强化学习:马尔可夫决策过程(第一部分)
- 强化学习:贝尔曼方程和最优性(下)
- 强化学习:使用动态规划解决马尔可夫决策过程(第三部分)
- 强化学习:蒙特卡罗学习
参考资料:
- https://web . Stanford . edu/class/psych 209/Readings/suttonbartoiprlbook 2 nded . pdf
- 使用 Python 进行强化学习
- 大卫·西尔弗的 DeepMind 强化学习课程
待得深
强化学习——基于模型的规划方法
学习环境模型的例子
在以前的文章中,我们已经谈到了基于无模型方法的强化学习方法,这也是 RL 学习的关键优势之一,因为在大多数情况下,学习环境的模型可能是棘手和艰难的。但是,如果我们想学习一个环境模型,或者如果我们已经有了一个环境模型,我们如何利用它来帮助学习过程呢?在这篇文章中,我们将一起探讨以环境为模型的 RL 方法。以下内容的结构如下:
- 从如何建模环境的基本概念开始
- 用我们刚刚学到的理论用 Python 实现一个例子
- 将理论扩展到更一般情况的进一步想法
模拟环境
一个代理从一个状态开始,通过在那个状态采取一个可用的动作,环境给它反馈,相应地代理进入下一个状态并接收奖励(如果有的话)。在这个一般的设定中,环境给了一个代理两个信号,一个是它在设定中的下一个状态,另一个是奖励。因此,当我们说对环境建模时,我们是在对从(state, action)
到(nextState, reward)
的函数映射建模。例如,考虑一个网格世界设定中的情况,一个代理用头撞墙,作为回应,代理呆在原地,获得奖励 0,那么最简单的格式,模型函数会是(state, action)-->(state, 0)
,表示这个特定状态和动作的代理,代理会呆在原地,获得奖励 0。
算法
现在让我们来看看一个环境模型是如何帮助改善 Q-learning 过程的。我们首先介绍一种最简单的算法,叫做 Dyna-Q :
Q-learning 利用模型来备份策略的方式简单而直接。首先,a, b, c, d
步骤与一般 Q-learning 步骤完全相同(如果你不熟悉 Q-learning,请查看我这里的例子)。唯一的区别在于步骤e
和f
,在步骤e
中,基于确定性环境的假设记录环境的模型(对于非确定性和更复杂的环境,可以根据具体情况制定更一般的模型)。步骤 **f**
可以简单概括为应用正在学习的模型并更新 Q 函数 n
乘以,其中n
是预定义的参数。步骤f
中的备份与步骤d
中的备份完全相同,并且您可能认为这是重复代理已经经历过几次的事情,以便强化学习过程。
典型地,如在 Dyna-Q 中,相同的强化学习方法既用于从真实经验中学习,也用于从模拟经验中规划。因此,强化学习方法是学习和规划的“最终共同路径”。
The general Dyna Architecture
上图更直接地显示了 Dyna 方法的一般结构。请注意Policy/value functons
中的两个向上的箭头,在大多数情况下是我们之前讨论过的 Q 函数,其中一个箭头来自direct RL update
到real experience
,在这种情况下,它相当于代理在环境中探索,另一个来自planning update
到simulated experience
,在这种情况下,它重复代理从real experience
学习的模型。因此,在每次采取行动时,通过更新来自实际行动和模型模拟的 Q 函数来加强学习过程。
实施 Dyna Maze
我认为理解算法的最好方法是实现一个实际的例子。我将从强化学习 an introduction 中取例子,用 Python 实现并与一般的没有规划步骤的 Q 学习(模型模拟)进行比较。
游戏设置
Dyna Maze Board
考虑图中插图所示的简单迷宫。在 47 个状态中的每一个状态中都有四个动作,up
、down
、right
和left
,它们将代理确定性地带到相应的邻近状态,除非当移动被障碍物或迷宫的边缘阻挡时,在这种情况下代理保持在它原来的位置。在所有转换中,奖励为零,除了那些进入目标状态的转换,它是+1
。在到达目标状态(G)
后,代理返回到开始状态(S)
以开始新的一集。
该实现的整个结构有两个类,第一个类代表电路板,也是环境,它能够
- 接受一个动作并输出代理的下一个状态(或位置)
- 给予相应的奖励
第二类代表代理,它能够
- 在棋盘上探索
- 跟踪环境的模型
- 一路更新 Q 函数。
董事会实施
第一类的棋盘设置与我们之前谈过的许多棋盘游戏相似,你可以在这里查看完整的实现。我将在这里删除我的解释(您可以查看我以前的文章以查看更多示例),因此,我们将有一个类似于以下内容的板:
Board Implementation
棋盘用一个 numpy 数组表示,其中z
表示块,*
表示代理的当前位置,0
表示空的和可用的位置。
代理实现
初始化
首先,在init
函数中,我们将初始化算法所需的所有参数。
除了那些通用的 Q-learning 设置(learning rate,state_actions,…)之外,(state, action) -> (reward, state)
的一个模型也被初始化为 python 字典,该模型只会随着 agent 在环境中的探索而更新。self.steps
是模型在每一个动作采取中用于更新 Q 函数的次数,self.steps_per_episode
用于记录每一集的步数(在下面的算法比较中我们会把它作为一个关键的度量)。
选择操作
在chooseAction
函数中,代理仍将采取ϵ-greedy 行动,其中它有self.exp_rate
概率采取随机行动,有1 — self.exp_rate
概率采取贪婪行动。
模型学习和策略更新
现在,让我们使用随着代理的探索而学习的模型来了解策略更新的关键点。
这个实现完全遵循我们上面列出的算法。在每一集(玩游戏)中,第一轮 Q 函数更新后,模型也会用self.model[self.state][action]=(reward, nxtState)
更新,之后 Q 函数会重复更新self.steps
的次数。注意,在循环中,state
和action
都是从之前的观察中随机选择的。
尝试不同的步骤
当步数设置为 0 时,Dyna-Q 方法本质上是 Q 学习。我们来对比一下 0、5、50 步的学习过程。
Dyna-Q with different steps
x 轴是集数,y 轴是达到目标的步数。任务是尽可能快地达到目标。从学习曲线中,我们观察到规划代理人(具有模拟模型)的学习曲线比非规划代理人稳定得更快。提到萨顿书中的话:
在没有计划的情况下(n = 0),每一集只向策略添加一个额外的步骤,因此到目前为止只学习了一个步骤(最后一个)。有了计划,在第一集期间也只学习了一个步骤,但是在第二集期间已经开发了一个广泛的策略,在该集结束时将几乎回到开始状态
额外的模型模拟和备份进一步增强了代理的体验,从而导致更快和更稳定的学习过程。(结帐完全实现)
如何概括这个想法?
我们在这里探索的例子肯定有有限的用途,因为状态是离散的,而动作是确定的。但是模拟环境以加速学习过程的想法有着无限的用途。
对于具有非确定性动作的离散状态
可以学习概率模型,而不是我们上面介绍的直接的一对一映射。概率模型应该在学习过程中不断更新,并且在备份阶段,可以用概率分布非确定性地选择(reward, nextState)
。
对于连续状态
Q 函数的更新将略有不同(我将在以后的文章中介绍),关键是学习一个更复杂和通用的环境参数模型。这个过程可以包括一般的监督学习算法,其中当前状态、动作作为输入,下一个状态和奖励作为输出。
在接下来的帖子中,我们将进一步学习改进 Dyna 方法的想法,并讨论模型错误时的情况!
最后,请在这里查看完整的代码。欢迎您投稿,如果您有任何问题或建议,请在下面发表评论!
参考: