物理动力学系统的强化学习:一种替代方法
原文towardsdatascience.com/rl-for-physical-dynamical-systems-an-alternative-approach-8e2269dc1e79?sourcecollection_archive---------1-----------------------#2024-07-28重新引入遗传算法并与神经网络进行比较https://medium.com/retter_42511?sourcepost_page---byline--8e2269dc1e79--------------------------------https://towardsdatascience.com/?sourcepost_page---byline--8e2269dc1e79-------------------------------- Robert Etter·发布于 Towards Data Science ·14 分钟阅读·2024 年 7 月 28 日–https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/03893c77eceb2ecc28ad297ed423a40e.png图片来自 Tra Nguyen 于 Unsplash物理与非线性动力学控制理论通过经典、鲁棒和最优方法支撑了现代文明。精炼、电信、现代制造等各个领域都依赖于它们。控制理论建立在物理方程提供的见解之上例如牛顿定律和麦克斯韦方程。这些方程描述了物理系统中的动态和不同力的相互作用。通过它们我们理解方程如何在不同状态之间转换其中“状态是足够描述系统的所有信息的集合”[1]通常是通过流体动力学中的压力或流体粒子的速度或者在电动力学中的电荷和电流状态来表达。通过推导系统方程我们可以预测状态如何随时间和空间变化并通过微分方程表达这种演化。通过这种理解我们可以采用控制手段即通过特别施加的力将这些系统维持在期望的状态或输出上。通常这种力是根据系统的输出计算的。以车辆巡航控制为例输入是期望的速度输出是实际的速度。系统是发动机。状态估计器观察速度并确定输出与输入速度之间的差异然后应用控制手段如调整燃油流量来减少误差。然而尽管控制理论取得了诸多成就它仍面临着显著的局限性。大多数控制理论是基于线性系统或是输入的比例变化导致输出的比例变化的系统。虽然这些系统可能非常复杂但我们对这些系统有着广泛的理解使我们能够实际控制从深海潜水器、矿山设备到航天器的各种设备。然而正如斯坦尼斯瓦夫·乌拉姆所言“使用‘非线性科学’这样的术语就像是把大部分动物学称为研究非大象动物。”到目前为止我们在控制复杂物理系统方面的进展大多通过找到限制它们线性行为的方法。这可能会在多个方面带来效率损失· 将复杂系统拆解为可单独控制的组件优化子系统而非整个系统· 在较简单但效率较低的操作模式下运行系统或未能充分利用复杂的物理学原理例如主动流动控制以减少飞机的阻力· 严格的操作条件限制一旦超过可能导致不可预测或灾难性的故障高级制造业、改进的空气动力学和复杂的电信系统都将受益于更好的非线性系统控制方法。非线性动力学系统的基本特征是它们对输入的复杂响应。即使在环境或状态发生小幅变化的情况下非线性系统也会剧烈变化。以控制流体流动的纳维-斯托克斯方程为例同一组方程既描述了一个平静、缓慢流动的小溪也描述了一个汹涌的洪流所有洪流中的漩涡和特征都包含在方程的动态变化之中。非线性系统带来了困难与线性系统不同我们通常无法轻松预测系统在从一个状态过渡到下一个状态时的行为。我们所能做到的最好方法是通过一般分析或广泛的仿真。因此在非线性系统中我们面临两个问题系统识别——即理解系统在给定状态下的行为以及系统控制——即系统在响应给定输入时的短期和长期变化以及如何选择输入以获得期望的结果。强化学习与物理学尽管非线性分析和控制不断取得进展但我们在利用这些系统方面仍然受到传统基于方程方法的限制。然而随着计算能力和传感器技术变得更加普及基于数据的方法提供了一种不同的途径。数据可用性的剧增催生了机器学习ML方法而强化学习RL提供了一种新的方法以更有效地应对控制非线性动态系统的挑战。RL 已经在从自动驾驶汽车到战略和计算机游戏的环境中取得了成功它是一个机器学习框架通过“试错”来训练算法或智能体使其“学会如何在不确定性下做出决策以最大化长期收益”[1]。换句话说RL 算法解决了系统识别和控制优化的问题而不是通过操控和分析控制方程来实现而是通过采样环境来预测哪些输入动作会导致期望的结果。RL 算法或智能体根据系统状态应用一套行动策略并随着对系统更多信息的分析而不断完善这一策略。许多强化学习RL算法基于使用神经网络来开发将状态映射到最佳行为的函数。RL 问题可以被构建为状态-行动-奖励三元组。对于给定的状态某个特定的行动会导致一个特定的奖励。神经网络作为通用函数逼近器可以进行调整以准确地逼近整个系统中的状态-行动-奖励三元组函数。为了做到这一点神经网络必须通过探索系统或环境来获取新知识然后通过利用额外获得的数据来精炼其策略。RL 算法通过它们如何应用数学来探索、利用和在两者之间平衡从而实现差异化。然而神经网络也带来了一些挑战· 资源需求。使用神经网络来估算一个能够为每个状态确定奖励和最佳行动的函数可能需要相当长的时间和大量的数据。· 可解释性。通常很难理解神经网络是如何得出其解决方案的这限制了它们在提供真正洞见方面的实用性并且可能使得预测或界定神经网络的行为变得困难。可解释性对于物理系统尤其重要因为它能够使得几百年来数学上开发出的强大分析工具得以应用从而为系统提供额外的洞见。尽管存在一些方法如迁移学习和拓扑分析来应对这些挑战但它们仍然是强化学习广泛应用的障碍。然而另一种替代方法可能在我们专注于物理系统时会有所帮助。回想一下我们讨论的物理系统是通过数学方程来定义的或者可以通过数学方程很好地描述。与其开发一个完全任意的函数我们可以集中精力寻找由常见数学运算符组成的表达式算术运算、代数运算以及超越函数如正弦函数、e^x 等。为此目的的一种方法是使用遗传算法。正如在[2]中所描述的遗传算法可以通过随机生成函数并通过变异和交叉繁殖有前途的候选者来探索函数空间并通过这些方式利用和优化解决方案。因此尽管神经网络在大多数强化学习问题中表现出色但在物理动态系统中出现了一位新的挑战者。接下来我们将更深入地研究遗传算法方法并查看它如何与领先的强化学习算法——软演员评论家SAC进行对比。为此我们将在基于物理的训练场中使用 AWW Sagemaker 实验来评估两者的表现。最后我们将通过评估结果、讨论结论并建议下一步的工作来结束本文。回想一下强化学习RL面临着两个挑战探索环境和利用已发现的信息。探索对于找到最佳策略是必要的考虑到处于任何状态的可能性。如果不进行探索就可能错过全局最优解而仅停留在局部最优且算法可能无法足够泛化从而在所有状态下都能成功。利用已知信息则是为了将当前解决方案优化到最优。然而当算法精细化一个特定的解决方案时它就牺牲了进一步探索系统的能力。Soft Actor CriticSAC是对强大 Actor-Critic 强化学习方法的改进。Actor-Critic 算法家族通过将状态值及其相关奖励的估计与优化特定输入策略分开来处理探索与利用之间的权衡。随着算法收集新信息它会更新每个估计器。Actor-Critic 在实现上有许多细节有兴趣的读者可以参考书籍或在线教程。SAC 通过优先探索那些奖励与估计的评价值差异显著的状态来优化评价器。OpenAI提供了 SAC 的详细描述。对于本实验我们使用了SAC 的 Coax 实现。我查看了几个强化学习库包括 Coach 和 Spinning Up但 Coax 是我找到的少数几个在当前 Python 版本中“开箱即用”的库之一。Coax 库包括广泛的强化学习算法包括 PPO、TD3 和 DDPG并且与 gymnasium 兼容良好。像 SAC 这样的演员-评论员方法通常通过神经网络作为函数近似器来实现。正如我们上次讨论的那样还有一种潜在的方法来探索系统并利用潜在的控制策略。遗传算法通过随机生成可能的解决方案来进行探索并通过变异或组合不同解决方案的元素繁殖来利用有前景的策略。在这种情况下我们将评估遗传算法的遗传编程变体作为函数近似的另一种手段具体来说我们将使用遗传方法随机生成并评估包含常量、状态变量和数学函数的函数树作为潜在的控制器。实现的遗传编程GP算法改编自[2]不同之处在于该文中使用的锦标赛被本实现替换为选择每代的前 64%Nn以下为 33%作为突变的候选并为剩余部分重新播种以便更好地探索解空间。为了在每一代中创建个体树生长函数随机调用算术函数-*/和超越函数例如 e^x, cos (x)来构建分支并将常量或状态变量作为叶子构成树的终端分支。递归调用用于根据波兰表示法[2]通过 LISP 实现我已将其改编为 Python构建表达式设有规则以避免如除以 0 等问题并确保数学一致性使每个分支最终正确地以常量或传感器值作为叶子。概念上一个方程树的形式如下https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/091d4561cf55ad9e6718afa9897fb8fa.png图 1. 示例函数树作者基于[2]提供这导致了一个控制器 b sin (s1) e^(s1*s2/3.23) - 0.12脚本中写作 — sin s1 e^ / * s1 s2 3.23 0.12其中 s 表示状态变量。刚开始可能会让人感到困惑但写出一些例子可以澄清这一方法。在构建完整代数的树后每棵树都会通过环境进行性能评估。然后基于获得的奖励按控制性能对树进行排名。如果未达到期望的性能则保留表现最好的树前 66% 的树通过交叉交换两棵树的元素、剪切与生长替换树的一个元素、收缩用常量替换树元素或重新参数化替换树中的所有常量进行变异参考文献[2]。这使得能够利用最有前景的解决方案。为了继续探索解空间表现较差的解决方案会被随机新树所替代。每一代之后新的代际将是随机新个体与顶级表现解决方案的复制或变异的结合。树会在环境中随机起始位置进行测试。为了防止“幸运”的起始状态影响结果类似于模型过拟合树会在一批不同的随机起始状态下进行测试。遗传编程的超参数包括https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/8f7382b6e0934b6d74ed6e925c3f70f3.png表 1. 遗传编程算法的超参数注释过的代码可以在github上找到。请注意我是一个业余编程者代码可能有些笨拙。希望即使存在不符合 Python 风格或普遍不良的编程实践代码至少足够可读能够理解我的方法。评估方法两种算法在两个不同的 gymnasium 环境中进行了评估。第一个是 gymnasium 基金会提供的简单摆锤环境。倒立摆是一个简单的非线性动力学问题。动作空间是可以施加于摆锤的连续扭矩。观察空间与状态相同是 x、y 坐标和角速度。目标是保持摆锤直立。第二个是相同的 gymnasium 环境但在观察中加入了随机噪声。噪声服从均值为 0方差为 0.1 的正态分布以模拟现实传感器测量值。强化学习开发中最重要的部分之一是设计一个合适的奖励函数。尽管有许多算法可以解决给定的强化学习问题但为这些算法定义一个合适的奖励以便优化是使某个算法在特定问题上成功的关键步骤。我们的奖励需要让我们能够比较两种不同强化学习方法的结果同时确保每种方法都能够朝着其目标前进。在这里对于每个轨迹我们跟踪累积奖励和平均奖励。为了简化这一过程我们让每个环境运行一个固定数量的时间步每个时间步根据代理距离目标状态的远近给予负奖励。Pendulum gym 就是这样工作的——在 200 个时间步后截断并根据钟摆的竖直程度给予负奖励最大奖励为 0并在每个时间步都进行强制执行。我们将使用平均奖励来比较这两种方法。我们的目标是评估每个强化学习RL框架的收敛速度。我们将使用 AWS Sagemaker 实验来实现这一目标它可以自动追踪度量指标如当前奖励和参数如活跃的超参数并按迭代或 CPU 时间跨运行进行记录。尽管这些监控可以通过 Python 工具实现但 Experiments 提供了简化的运行参数和性能跟踪、索引功能以及计算资源的复现。为了设置实验我参考了AWS提供的示例。SAC 和 GP 算法首先在本地 Jupyter 笔记本中进行评估然后上传到 git 仓库。每个算法都有自己的仓库和 Sagemaker 笔记本。运行参数被存储以帮助分类运行并跟踪不同实验设置的性能。我们的运行度量奖励和状态向量是我们希望用来比较两种算法的因变量。Experiments 自动记录 CPU 时间和迭代次数作为自变量。通过这些实验我们可以将冠军算法——像 SAC 这样的成熟且经过充分开发的强化学习算法——与挑战者算法进行比较后者是一种不为人知的方法由一位没有正式强化学习或 Python 培训的业余编码员编写。这个实验将为开发复杂非线性系统控制器的不同方法提供见解。在下一部分我们将回顾并讨论结果及潜在的后续工作。第一个实验是默认的 Pendulum gymnasium在这个实验中算法尝试确定正确的扭矩以保持钟摆倒立。它在固定时间后结束并根据钟摆距离竖直的程度给予负奖励。在 Sagemaker 实验运行之前SAC 和 GP 算法已经在我的本地机器上运行以验证收敛性。在 Experiments 中运行可以更好地追踪可比较的计算时间。以下是计算时间与每次迭代平均奖励的结果https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/2df0567b0b40db3641e835c194b25f03.png作者提供https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/d1d598103d8a6bbf64d158fd729d2f97.png作者提供我们看到尽管 GP 算法相对不够成熟但它在计算需求上远低于 SAC 算法。通过本地运行至完成SAC 似乎需要大约 40 万次迭代才能收敛耗时数小时。本地实例化被编程为在整个训练过程中记录 SAC 的进展有趣的是SAC 似乎先学会了如何让摆锤移动到顶端然后学会了如何保持摆锤静止最终将这两者结合起来这可以解释奖励的下降期即 SAC 学习保持摆锤稳定的阶段。通过 GP我们看到奖励以单调递增的方式逐步提升。这是因为最优的函数树始终被保留所以最好的奖励保持稳定直到计算出更好的控制器。第二个实验是将高斯噪声0, 0.1添加到状态测量中。我们看到的结果与无噪声的情况相似只是收敛时间较长。结果如下所示同样GP 优于 SAC。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/37c65ede7ac73ece0b7c6e9512a4e9b1.png作者提供https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/aba7ad80a4209ba235a59b35166022d7.png作者提供在这两种情况下我们看到 GP 比 SAC 表现得更快如前面的例子所示SAC 确实在本地收敛只是我不想为计算时间支付 AWS 费用。然而正如大家无疑已经注意到的这只是一个非常基础的比较既涉及机器学习也涉及物理系统。例如超参数调优可能会导致不同的结果。尽管如此这对于该候选算法来说是一个有前景的开始表明它值得进一步研究。从长远来看我认为 GP 可能比基于神经网络的方法如 SAC提供几个优势· 可解释性。尽管 GP 找到的方程可能很复杂但它是透明的。熟练者可以简化方程帮助提供对已确定解的物理理解这对于确定适用区域和增加控制信任度非常有帮助。尽管可解释性是一个活跃的研究领域但神经网络依然面临这一挑战。· 信息化机器学习Informed ML。遗传规划GP使得将系统分析的见解更容易应用。例如如果已知系统具有正弦波行为GP 算法可以调整以尝试更多的正弦解。或者如果已知一个类似或简化系统的解那么可以将该解预先植入算法中。· 稳定性。通过简单的保障措施如数学有效性和限制绝对值的增加GP 方法将保持稳定。只要每一代保留最优解解决方案就会收敛尽管收敛的时间界限无法保证。常见的强化学习中的神经网络方法并没有这样的保证。· 发展机会。遗传编程相对不成熟。这里使用的 SAC 实现是多种应用实现中的一种而神经网络已经受益于大量努力以提高性能。遗传编程没有享受这种优化我的实现是围绕函数构建的而非效率。尽管如此它在与 SAC 对比时表现良好来自更专业开发者的进一步改进可能会带来显著的效率提升。· 并行性和模块化。与神经网络相比单独的遗传编程方程较为简单计算成本来自于在环境中多次运行而不是环境运行和神经网络的反向传播。将不同的遗传编程方程树分配到不同的处理器上可以大大提高计算速度。然而神经网络方法因其众多优势被广泛使用· 范围。神经网络是通用函数逼近器遗传编程仅限于在函数树中定义的项。因此基于神经网络的方法能够涵盖更广泛和复杂的情况。我不愿意尝试用遗传编程来玩《星际争霸》或驾驶汽车。· 跟踪。遗传编程是随机搜索的精细版本正如实验中所见导致了改进的停滞。· 成熟度。由于大量不同神经网络算法的研究工作现有的经过优化的神经网络模型更容易应用于问题并具有较高的计算效率。从机器学习的角度来看我们仅仅触及了这些算法的表面。需要考虑的一些后续工作包括· 超参数调优。· 控制器简化例如惩罚遗传编程中控制输入项数的奖励。· 控制器效率例如从奖励中扣除控制输入的大小。· 如上所述遗传编程的监控与算法改进。从物理学角度来看本实验作为进入更真实场景的起点。更复杂的场景可能会显示出神经网络方法赶上或超过遗传编程GP。可能的后续工作包括· 更复杂的动力学例如范德波尔方程或更高维度。· 有限可观察性而非完全状态可观察性。· 偏微分方程系统以及优化控制器位置和输入。[1] E. Bilgin, 《掌握强化学习与 Python使用强化学习技术和最佳实践构建下一代自学习模型》2020Packit 出版社[2] T Duriez, S. Brunton, B. Noack, 《机器学习控制——驯服非线性动力学与湍流》2017Spring 国际出版公司
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2475236.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!