开通VIP,畅享免费电子书等14项超值服
首页
好书
留言交流
下载APP
联系客服
2022.12.02辽宁
在过去的几十年里,人工神经网络已被用于解决计算机视觉、自然语言处理等各种应用领域的问题。最近,科学机器学习(ML)社区出现了另一个非常有前途的应用:使用人工神经网络求解偏微分方程(PDE),使用通常称为物理信息神经网络(PINN)的方法。PINN最初是在[1]中的开创性工作中引入的,如今它们不再局限于纯粹的研究主题,而且在行业中也越来越受欢迎,足以在2021年进入著名的Gartner新兴技术炒作周期。
PDE在从流体动力学到声学和结构工程的许多工程和基础科学领域发挥着至关重要的作用。有限元建模(FEM)方法是行业中普遍使用的标准求解器。尽管它们很受欢迎,但FEM方法显示出一些局限性,例如它们对大型工业问题的计算成本(主要是由于所需的网格大小)以及利用外部数据源(例如传感器数据)来驱动PDE的解决方案的问题。
尽管这个方程的解可以很容易地通过分析得出,但用它作为案例来说明PINN的工作原理有助于我们的理解。下面解释的所有技术都可以很容易地应用于更复杂的常微分方程和偏微分方程。然而,通常需要进一步的技巧才能在更复杂的场景中获得良好的收敛。
PINN基于神经网络的两个基本属性:
这些都是不错的功能,但我们如何才能让神经网络真正学习解决方案呢?这里出现了PINN[3、4]背后出人意料的简单但极其聪明的想法:我们可以构造NN损失函数,以便在最小化时自动满足PDE。换句话说,最重要的损失贡献被视为微分方程的残差如下:
其中f_NN(t)是具有一个输入的NN的输出,其导数是自动计算的。可以立即看出,如果NN输出符合上述方程,则实际上是在求解微分方程。要计算来自DE残差的实际损失贡献,需要在方程域中指定一组点(通常称为配置点)并评估均方误差(MSE)或另一个损失函数作为所有所选坐标的平均值:
然而,仅基于上述残差的损失并不能确保方程具有唯一解。因此,让我们以与上述完全相同的方式将边界条件添加到损失计算中:
因此,最终的损失只是:
在优化过程中,这被最小化并且NN输出被训练以遵守微分方程和给定的边界条件,从而近似最终的DE解。
现在让我们看看如何使用PyTorch构建的简单神经网络来构建这样的损失函数。
PINN是一个非常活跃的研究领域,并且已经设计出更复杂且通常针对问题定制的神经网络架构。对这些架构的讨论超出了本介绍性博客的范围。
现在我们定义了我们的通用函数逼近器,让我们构建损失函数。如前所述,这由DE残差项和边界条件项组成,DE残差项充当物理知识正则化,边界条件项驱动网络收敛到无限可能的解中的所需解。
首先,需要选择一组托管点。由于我们正在解决一个非常简单的问题,我们可以在时域中选择一个均匀间隔的网格:t=torch.linspace(0,1,steps=10,requires_grad=True)。对于更复杂的问题,托管点的选择非常重要,需要更加谨慎的选择。
DE残差损失需要评估NN输出相对于其输入的导数:
上面定义的自定义损失确保在训练过程之后,NN将逼近所选微分方程的解。现在,让我们看看它的实际效果。
由于上面定义的损失仅使用可微函数构建,我们可以使用向后传递(PyTorch中的一行代码)直接计算模型参数的梯度:`final_loss.backward()`。优化过程是标准的PyTorch代码,为简洁起见此处省略。
让我们看看一些结果。我们使用随机梯度下降优化器,学习率为0.1,只有10个训练点。鉴于所选微分方程的简单性,20000个时期足以几乎完美地再现最大增长率设置为R=1的分析结果:
在上图中,解决方案是在100个均匀分布的点上进行评估的,我还显示了10个训练点以供比较。损失情况如下所示:
请注意,使用Adam优化器可以用更少的epoch获得更好的结果。然而,优化结果超出了本文的范围,本文仅旨在解释PINN的工作原理。