使用降阶模型的动态系统迁移学习

改进复杂物理的强化学习后动态系统迁移学习与降阶模型首先出现在走向数据科学上。

来源:走向数据科学

我之前已经讨论过应用强化学习 (RL) 来分析和控制复杂物理系统的潜在效用。开发 RL 算法来分析或控制复杂的动力系统面临着许多其他 RL 问题的主要挑战之一——训练时间过长。 由于模拟复杂物理动力学的高计算成本,这个问题变得更加复杂。 将大型状态空间和非线性系统所需的数千次(也许数百万次)强化学习训练迭代与每次迭代可能长达数小时(甚至只是几分钟)的模拟时间相结合,可能会使问题变得棘手。 迁移学习已被用来减少强化学习问题的训练时间,在这里我们将探索迁移学习在动态系统强化学习中的应用。

迁移学习依赖于使用针对类似问题进行训练的模型来减少训练时间,并假设问题足够相似,模型只需进行很小的更改。 例如,使用经过训练来驾驶小型遥控汽车的强化学习算法可能比从头开始学习如何驾驶拖拉机拖车更快,尽管两者之间存在很大差异。

降阶模型

对于物理模拟,我们需要一个问题环境来训练 RL 算法,该环境与原始环境足够相似,但模拟速度要快得多。 降阶模型 (ROM) 提供了一种生成此类环境的方法。 最简单的 ROM 是一个简化的模型,旨在降低复杂性,同时尽可能保持准确性。 生成 ROM 的方法有很多种。任何人工智能都可以被视为一个 ROM,从监督学习到甚至作为人类语言 ROM 的大型语言模型。 在这里,我们将应用基于 Brunton 和 Kutz 的《数据驱动科学与工程》一书中概述的方法的无监督学习,来开发物理动力系统的数据驱动 ROM,仅基于系统测量数据集,而对底层系统知之甚少。

作为简要介绍,动力系统可以被描述为随时间演变的系统。 它们通常被总结为

其中 x 是状态向量(描述系统的变量集),d x/dt 是状态随时间变化的变化,F(x) 是状态变量的某个函数(有时包括它们的历史)。状态向量 x 可以是一个变量或数千个变量,特别是当需要状态历史时。 F(x) 可以是线性或非线性系统。线性系统对输入具有可预测的响应——输入加倍,响应加倍。 非线性系统在现实世界中更为常见和具有代表性,但它不会在所有可能的状态中表现出这种行为。加倍输入可能会使输出加倍、将输出乘以 100 或将输出驱动为 0,并且此行为可能会根据您在状态空间中的位置(变量可以采用的所有可能值的区域)而改变。

Brunton 和 Kutz 的文本讨论了利用增强的测量、存储和分析功能来处理动力系统的新技术。 他们的方法基于无监督学习,即寻找潜在模式,而无需先验了解这些模式应该是什么。这些技术使用随时间变化的系统状态测量来导出可用于描述、分析和预测行为的动态模型。 我们在这里使用的特定方法是 SINDy(非线性动力学的稀疏识别)。

非线性动力学的稀疏辨识 (SINDy)

dx/dt=θ(x)Ξd\mathbf{x}/dt = \theta(\mathbf{x})\Xidx/dt=θ(x)Ξ

涡轮喷气发动机建模

飞机动力学

5.0

现实世界的物理系统表现出非线性,使其难以表征。 最重要的是,现实的物理和工程系统通常缺乏可解的、直接的、全面的控制方程来支持对其行为的分析。 我们可以获得的方程,更不用说求解,通常需要简化,从而将其效用限制在状态空间的子区域或失去对高阶动力学的跟踪。 考虑涡轮喷气发动机动力学(这将是我们的示例问题):我们将使用的模拟基于一系列必须迭代求解的耦合方程,而不是直接求解动态方程组。 即便如此,它仍然包含工作中耦合流体、结构、热力学和化学过程的许多简化。 随着分析系统的复杂性和范围的增加,典型的方法,例如围绕已知解决方案的线性化和坐标系的创造性使用,已经变得不太有用。 然而,由于系统复杂性已经超过了传统的分析方法,我们收集、存储、聚合和分析GB、TB甚至PB级别测量数据的能力已经提高。

SINDy 算法的目标是使用系统测量数据(特别是可用于计算状态变量随时间变化的时间导数数组的状态数据的时间序列)以数学方程的形式发现系统模型。 本质上,它采用可能的方程项(例如状态的乘积、商和导数)的候选库,并确定一个最能描述状态随时间变化的简约方程(即使用最少项数的方程)。 描述 SINDy 的基本方程为:

其中 θ(x) 是可能的方程项的数组,Ξ 是这些项的系数矩阵。例如,如果方程表现出很强的二次行为但没有正弦曲线,那么 Ξ 中对应于 θ(x) 的二次向量的值将具有很大的绝对值,并且对应于正弦曲线的值将接近 0。有关更多详细信息,请参阅原始 SINDy 论文:https://arxiv.org/abs/1509.03580 或教程视频:https://www.youtube.com/watch?v=gSCa78TIldg。 SINDy 算法已经能够仅根据时间序列数据识别复杂的流体流动模型。 在这里,我们将看到它如何很好地发现描述涡轮喷气发动机的动态方程(或者至少描述我们正在使用的模拟)。

这里的具体问题是为涡轮喷气发动机创建自动油门。 我们希望我们的 RL 算法能够调整涡轮喷气发动机的油门,以在给定高度实现 10% 的速度变化,从而平衡达到新速度的时间与燃料使用。 这不是一个通常需要强化学习的问题;基于经典控制、增益调度或其他技术的自动油门系统已经存在了几十年。 此外,这些其他方法具有确定性的优点,因此更容易验证飞行操作。因此,我并不是建议将其作为强化学习的实际应用,而是为了方便说明以下原则:(1) 在复杂的物理系统上使用强化学习;(2) 生成复杂物理的 ROM 作为迁移学习的来源。

米(质量)

10000 公斤

Cd0(寄生阻力系数)

0.0148

AR(长宽比)

S(润湿表面积)

22.2 m^2

e(奥斯瓦尔德效率)

0.85

开发 RL 算法

基于 SINDy 的 ROM

dv=−3.022+1.973*Throttle−0.132*Throttle3dv=-3.022+1.973*Throttle-0.132*Throttle^3dv=−3.022+1.973*Throttle−0.132*Throttle3

结论

发动机是飞机上最复杂的部件;一般来说,发动机的设计难度与飞机的其他部分一样难。 求解发动机性能涉及空气动力学和热力学方程,两者都具有丰富而复杂的非线性行为。我选择涡轮喷气发动机问题是因为其复杂的物理原理以及 Python 中相当高保真度模型的可用性。 涡轮喷气发动机的运行特点是空气和燃料质量流量的平衡、节能、压力比、非恒定气体动力学和其他因素。 确定喷气发动机性能需要迭代——假设一组气体特性,如密度、压力、温度、速度——在发动机的 6 个或更多阶段中的每一个阶段,确定每个阶段的质量流量和热力学,然后通过调整入口质量流量、燃料流量等假设进行迭代,直到解决方案针对特定操作参数(马赫数速度、高度和油门设置)收敛。

飞行测试工程 Github 提供了一个喷气发动机模拟器(以及随附的 YouTube 教程系列),可以定义喷气发动机,然后在一系列操作参数下模拟其性能。 为了考虑高度和空气压缩性的变化,该模拟使用 ISA 工具 Python 库,其中包含基于标准大气转换高度、温度、密度、速度和马赫数的函数。 我们将使用此模拟作为基线(非迁移)强化学习算法训练环境的基础,并为 ROM 提供基础。 即使这里使用的“完整”模拟也被大大简化。即使对喷气发动机的一小部分进行完整的计算流体动力学模型也需要数万个计算小时(甚至这将包含有关小规模流体动力学和湍流的大量简化和假设)。

为了使油门设置与速度变化相匹配,我们需要开发一个基本的飞机模型。我们将使用基本的空气动力学原理来设计我们的发动机所驱动的假设飞机。强化学习算法必须“学习”飞机的阻力行为,以正确设置油门,而阻力又由飞机空气动力学定义。 将选择定义飞机和发动机的空气动力学参数以提供真实的结果。 首先,我们定义引擎。涡轮喷气发动机模拟器可以在给定基本几何参数和设计点的情况下设计压缩机、燃烧室和涡轮等发动机参数。我们将围绕为 B-47 Stratojet 轰炸机提供动力的 J-47 的性能来定义我们的发动机。 B-47 有六个发动机,因此我们选择 B-47 的 1/6 比例的空气动力学参数,并根据实际性能进行调整,提供以下参数

接下来我们需要根据这些参数定义飞机动力学。 我们将对系统进行离散化,并根据发动机推力和阻力每 0.1 秒评估一次当前加速度。 我们从牛顿第二定律开始,将力与速度的变化联系起来。 力由推力(由发动机模拟或 ROM 提供)和阻力(根据基本空气动力学计算)确定。

密度 ρ 是使用 ISA 库根据州海拔高度确定的。 V(速度)是使用 ISA 库根据状态马赫数确定的。 在每个时间步长 dt = 0.1,我们计算当前的推力和阻力,并将所得加速度添加到当前速度,以确定一阶近似的新速度。

迁移学习 RL 算法

Stable Baselines 提供RL算法;在这种情况下,我们将使用 PPO,因为它是一种流行的、准确的、稳定的算法,适用于连续动作空间。有关 PPO 的信息可在 Stable Baselines 的文档中找到。 稳定基线算法旨在与体育馆界面配合使用,因此我创建了一个基于涡轮喷气发动机模拟的体育馆。 大部分涡轮喷气发动机脚本被压缩到一个名为“TJ”定制体育馆环境的本地库中。 Github 上提供了培训每个模型和 SINDy ROM 开发的 Jupyter Notebook 演练。

RL 算法将高度、马赫数和目标马赫数的状态(代理位置)作为输入,并返回油门设置的动作。 在步骤函数中,体育馆使用油门设置动作来运行涡轮喷气发动机模拟并确定新的推力和燃油流量。体育馆的注释阶跃函数如下所示; Github 上提供了体育馆的完整代码。

def step(self,action):#飞机是“1/6 B-47”,因为 B-47 有 6 架具有相似推力的涡轮喷气发动机done = Falsetruncated = Falsedt = 0.1 #time stepm = 10000 #kgCd0 = 0.0148 #寄生阻力系数AR = 5.0 #Aspect RatioS = 133/6。 #m^2 湿表面积e= 0.85 #机翼效率#观测空间提供入口马赫数(Mi)、高度、M_target#action为油门设置[0,1]#根据高度确定的空气密度(rho)M_i = self._agent_location[0] * 1.1+0.3alt = self._agent_location[1] * 30000M_target = self._agent_location[2] * 1.1+0.3throttle_pos = action.item(0)rho = ISA.rho(alt)#dV/dt = 加速度 = 力/质量 = 1/m * (推力 - 阻力)#阻力 = 1/2 * rho * V^2 * S * (CD0 + Cdi)#Cdi (诱导阻力) = CL^2/(pi * e* AR)V = ISA.M2Ve(M_i, alt) #ktsV = V * 0.5144 #转换为 m/sCl = m/(0.5*S*rho*V*V)Cdi = Cl*Cl/(3.14159265 * AR * e)D = 0.5*rho*V*V*S*(Cdi+Cd0)#从给定发动机设计、节气门位置、高度、马赫数的运行涡轮喷气发动机模拟器获取输出#返回燃油流量并且推力输出= tj.calc_thrust(self.eng_param,self.eng_perf,throttle_pos,alt,M_i,verbose = False)推力= 1000。*输出[“T”]FF =输出[“mdot_fuel”]#dV/dt =(1/dt)*(Vnew-Vold)#Vnew = dt*dV/dt + VVnew = (1.*dt/m)*(Thrust - D) + Vif Vnew < 10: #如果速度接近 0,则截断以避免负值 VelocityVnew = 10truncated = True #截断,因为 RL 使飞机坠毁#根据标准大气中的速度和高度获取新的马赫数M_new = ISA.Ve2M(Vnew, alt)#标准化状态空间的马赫数 self._agent_location[0] = M_new / 1.5done = Falseif abs(M_new - M_target) < 0.01: #如果 m_new 足够接近 m_target,完成并停止使用燃料#reward = 1000done = Trueobservation=self._get_obs()state=self.state#reward=(M_new-M_target)**2reward=-10.* FF #math.sqrt(np.sum(reward)) + FFif truncated:#对飞机坠毁的强烈惩罚reward = -50000return self._agent_location,reward,done,truncated,{}

它使用新的推力和当前状态来计算 0.1 秒时间步长内的阻力和新速度。 ISA 库将速度转换回马赫数,阶跃函数与目标马赫数进行比较,并根据燃料流量给出(负)奖励。 如果达到的马赫数接近目标马赫数,则运行完成并且算法停止减少燃料流量的奖励。 如果速度接近非物理(负)值,则运行会因大量负奖励而被截断。我们使用稳定基线接口训练 PPO 算法 5000 个总时间步长,并观察随着总时间流逝获得的奖励。

ROM 体育馆的训练采用与完整模拟相同的 PPO 算法,但总时间步长为 10000 个。 保存生成的模型,然后在完整模拟中使用 5000 个总时间步长。

如上所述,ROM 基于 SINDy。 动力系统如上所述 - dv/dt = 1/m (T-D),其中非线性动力学包含在推力函数 T 内。为了提供 SINDy 所需的数据数组,我们使用涡轮喷气发动机仿真代码生成马赫高度-油门设置推力数据数组。 我们根据上面的飞机动力学添加对应于每个状态的 dv/dt 数据。 这提供了 SINDy 算法所需的数据。 我们可以只使用查找表来将油门设置与推力相匹配,但可以采用这种方法来演示基于 SINDy 的 ROM 在动力系统中的使用。

为了应用 SINDy,我们使用 python SINDy 库 (https://pysindy.readthedocs.io/en/latest/index.html),其中包括多项式、正弦曲线和指数项的候选函数项生成器。 该库需要一个包含系统状态动态的输入数据表,并将根据选定的候选项套件生成模型。 有趣的是,得出的方程:

不包括高度或马赫数。 在当前的模拟和飞机模型下,SINDy 认为它们不是 ROM 中的因素。 缺乏高度并不是一个大问题,因为高度会降低推力,也会降低阻力,而且涡轮喷气发动机比涡轮风扇发动机或活塞发动机更能抵抗密度损失。 马赫数的缺失更令人担忧;涡轮喷气发动机通常产生随速度大致恒定的推力,但阻力随速度增加。 迁移学习算法在完整模拟上的性能将告诉我们这是否是一个合理的假设。

迁移学习方法需要首先在 ROM 上训练算法,这需要将 ROM 嵌入到体育馆中:TJ_Rom。 该体育馆与完整涡轮喷气发动机模拟的体育馆具有相同的状态和动作空间。 然而,它不是涡轮喷气发动机模拟元件,而是基于阶跃函数中的节气门设置,由 SINDy 导出的 dv 方程。此外,在假设燃料流量将与节气门设置密切相关的情况下,使用缩放的节气门设置作为(负)奖励,而不是建立燃料流量模型。 下面给出注释的步骤函数代码;完整的体育馆可以在 Github 上找到。

为了评估迁移学习的成功(或失败),我们比较不同总时间的奖励。为了计算非迁移学习的运行时间,我们直接从模型输出中获取运行时间,而对于迁移学习,我们将 ROM 训练时间添加到完整模拟运行的运行时间中。 我们不需要完成高精度的训练来比较基线学习与迁移学习的性能。 为了节省 CPU 时间(以及我的 5 年中线笔记本电脑因内存限制而令人沮丧的崩溃),我限制迭代以比较两者之间的早期奖励进度。 ROM 训练比完整模拟快得多:10000 个时间步长需要 13 秒,而完整模拟则需要 4000 个时间步长约 2500 秒。 经过 2596 秒的计算,基线 ROM 获得了 -2080 的奖励,而在 2232 秒时,迁移学习 ROM 获得了 -1170。 我们看到 ROM 可以有效地减少整个问题的训练时间。

def step(self,action):#目标是最小化燃油流量,想要最大化奖励,所以燃油流量计数为负#飞机是“1/6 B-47”,因为B-47有6架推力相似的涡轮喷气发动机#飞机参数和dV计算被收集到ROM方程done = Falsetruncated = Falsedt = 0.1 #时间步长#观察空间提供入口马赫数(Mi),高度,M_target#action是油门设置[0,1]#空气密度(rho)根据海拔确定M_i = self._agent_location[0] * 1.1+0.3alt = self._agent_location[1] * 30000M_target = self._agent_location[2] * 1.1+0.3Throttle = action.item(0)rho = ISA.rho(alt)V = ISA.M2Ve(M_i, alt) #ktsV = V * 0.5144 #转换为m/s#ROM方程将发动机和空气动力学因素压缩成一个简单的方程dV = - 3.022 + 1.973 * Throttle - .132 * Throttle**3#而不是为燃油流量映射到油门/马赫/速度/高度#假设油门设置对燃油流量影响最大#最低燃油流量将从最低油门FF = 20*ThrottleVnew = dV*dt + Vif Vnew < 10: #如果速度接近0,则截断以避免负值 VelocityVnew = 10truncated = TrueM_new = ISA.Ve2M(Vnew, alt)self._agent_location[0] = M_new / 1.5done = Falseif abs(M_new - M_target) < 0.01: #如果m_new足够接近m_target,完成并停止使用fuel#reward = 1000done = Trueobservation=self._get_obs()state=self.state#reward=(M_new-M_target)**2reward=-10.* FF #math.sqrt(np.sum(reward)) + FFif truncated:reward = -50000return self._agent_location,奖励,完成,截断,{}

减少将强化学习应用于复杂物理系统所需的训练时间,为将强化学习应用于更广泛的问题提供了机会。 正如我们所讨论的,强化学习对于这个特定问题的效用是有限的。喷气发动机自动油门可以使用现有的控制技术来提供足够的性能。然而,考虑到非线性系统可能包含未知或意外的操作条件,即使将强化学习应用于具有现有控制方法的系统,也可以帮助我们找到新的、更有效的操作模式或设计点,或者可以提供更稳健、更灵活的控制系统,在超出传统控制器的设计条件时可以接管。 对于现有控制方法过于严格或不足的更复杂的系统,强化学习可能会带来新的进步。

此外,这里用于 ROM 生成的 SINDy 方法以及类似的数据驱动工程方法可以帮助提供洞察力并捕获以前太大或太复杂而无法有效建模的系统的行为。 由此产生的 ROM 可用于经典分析和控制技术,用于增强 RL 或其他 AI 方法,或者用于聚合模型和模拟,以解决阻碍分析的缩放或刚度问题(例如材料对空气动力学和核动力学的响应和影响)。

注意:我们在离散化和空气动力学计算中始终使用低阶近似。我们甚至忽略了冲击阻力,因为体育馆的域包括可压缩马赫数。如前所述,我们的目标不是创建基于 RL 的功能性自动油门,而是演示 (1) SINDy 方法创建物理动力系统 ROM 的原理和实用性,以及 (2) 通过使用这些 ROM 进行迁移学习来减少 RL 训练时间,这是我们通过低阶近似实现的目标。