系列最开始当然要提到很经典的文章 —— Physics-informed neural networks: A deep learning framework for solving forward and inverse problems involving nonlinear partial differential equations 。 这篇文章是布朗大学的助理教授 Maziar Raissi 和学术大牛GE Karniadakis 一起写的, 文章分为两部分, 第一部分写的是 Data-driven solutions of nonlinear partial differential equations, 就是在讲怎么解 PDEs(Partial Differential Equations), 第二部分写的是 Data-driven discovery of nonlinear partial differential equations, 就是在讲怎样解PDE的反问题 (带参数的PDE,参数需要在解的过程中求解出来)。 由于其基本想法很接近, 我们只谈第一部分, 简略的讲第二部分。

附(作者的程序代码Github地址:https://github.com/maziarraissi/PINNs

下面便进入正题。 监督学习是机器学习中的一个大类, 很多分类问题,回归问题都可以用它来解决。 那么, 从求解PDE的角度来看, 监督学习能发挥什么样的作用呢? 

如何逼近一个函数(算子)一直以来便是数学中的难题。 数学家们发展了很多工具来逼近函数, 如插值理论,框架, 谱方法 , 有限元等。 从逼近论的角度来看, 神经网络(Neural Networks)便可以看做一个非线性函数逼近器。 我们期望输出一个数据, 通过神经网络输出的值可以反应出输入数据的好坏, 有效性等, 从而有助于我们理解问题。 假设我们限制神经网络输出的值是一维的, 那么对于 binary classfication 来说, 我们可以把大于 0 的分为一类, 小于 0 的分为另一类。但是对于一个PDE来说, 我们如何来判断输入数据的好坏呢? 

给定一个非线性PDE 

u_t+\mathcal{N}[u;\lambda]=0, 

其中 u(x,t) 是要求的解, \mathcal{N}[u;\lambda ] 是非线性偏微分算子, \lambda 是需要待定的参数。 为简单起见, 我们假设\mathcal{N}[u;\lambda]=\mathcal{N}(u)。 用一个具体的例子(Burgers方程)来说明主要的想法和步骤

定义 f 为 f= u_t+uu_x-(0.01/\pi)u_{xx},  利用 Neural Networks 来逼近 u(x,t)。 定义损失函数为

其中

这里 \{t_u^i,x_u^i,u^i\}_{i=1}^{N_u} 定义了 u(x,t) 的初边值训练数据, \{t_f^i,x_f^i\}_{i=1}^{N_f} 定义了f(x,t) 的配置点的训练数据(内部)。 

我们来分析一下损失函数。 如果神经网络能很好地求解出PDE的解, 那么对于来自初边值的任一个点, 其值MSE_u \to 0;对于内部的配置点, 因为很好地拟合了微分方程, MSE_f\to 0. 也就是说, 损失函数的值为 0 时, 我们便可以说在训练集上每个点都有 u_{NN}(x,t)\approx u(x,t)。这样便问题便转化为如何优化损失函数。

利用神经网络的反向传播机制和L-BFGS便可以求解。 作者使用了tensorflow1.13 版本来求解。 值得注意的是, 我们处理u_t,\;u_x,\;u_{xx} 时不能用 tensorflow 的反向传播机制来计算, 因为反向传播计算的对参数 \Theta=\{weights,biases\}  的导数, 处理的代码是


最后解的结果L2 误差为1.6e-03, 解的图像为

对于求解带参数的PDE, 只需将\Theta=\{weights,biases\} 转变为\Theta = \{weights,biases,{\color{Red} \lambda}\} 即可。

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐