DeepXDE阅读
DeepXDE: A Deep Learning Library for Solving Differential Equations
PINNs算法
简介
PINNs的基本思想是学习一个神经网络用来拟合需要求解的偏微分方程的解析解,在训练此网络时使用偏微分方程的残差项(所有的偏导项和非线性项)对神经网络的训练进行限制。
PINNs算法流程如下:
- 构建一个多层神经网络 u ^ ( x ; θ ) \hat{\mathrm{u}}(\mathrm{x};\theta ) u^(x;θ) 。
- 指定两个数据集 T f T_f Tf , T b T_b Tb分别代入方程和边界条件计算loss训练神经网络用。
- 指定一个损失函数:需要平衡PDE残差和边界条件残差。
- 通过最小化loss来训练神经网络以找到最终参数 θ \theta θ 。
问题1:PINNs不能保证唯一解
与传统的数值方法不同,PINNs不能保证唯一解,因为PINNs是通过求解非凸优化问题来获得解的,而这些问题通常没有唯一解。在实践中,为了实现良好的准确性,需要调整所有的超参数,例如网络大小、学习率和残差点的数量。神经网络的大小在很大程度上决定了PDE解的平滑度。
比如, 对于一维Poisson方程,一个只有几层,每层20个神经元的小型神经网络就能得到足够好的结果,但是,一维Burgers方程却需要更深、神经元更多的神经网络才能达到相同水平的精确度。
而且, PINNs可能会从不同的网络初始值收敛到不同的解。因此一种常见的策略是,随机初始化训练PINNs几次(例如,10次独立运行),并选择训练损失最小的网络作为最终解。
问题2:PINNs结果依赖于优化器
在PINNs最后一步中,需要通过基于梯度的优化器(如梯度下降、Adam和L-BFGS)来最小化损耗函数,因此即使网络结构确定了,优化器的选择同样会影响到最终结果的好坏。
比如:对于光滑的PDE解,L-BFGS可以用比Adam更少的迭代找到一个好的解,因为L-BFGS使用损失函数的二阶导数,而Adam只依赖于一阶导数。然而,对于刚性解,L-BFGS更有可能被困在一个糟糕的局部最小值。
而优化器所需的迭代次数在很大程度上也取决于问题本身(例如,解决方案的平滑度)。
独特之处:PINNs在不同频率上的学习速度与一般神经网络不同
最近的研究表明:对于函数逼近,神经网络是从低频到高频学习目标函数,但在PINNs中,作者认为由于高阶导数的存在,PINN的学习模式是不同的。
PINNs近似理论与误差分析
近似理论
与PINNs相关的一个基本问题是,是否存在既满足PDE方程又满足边界条件的神经网络,即是否存在能够同时一致逼近函数及其偏导数的神经网络。
理论2.1就证明了具有足够神经元的前馈神经网络可以同时一致地逼近任何函数及其偏导数。然而,神经网络在现实中的规模是有限,所以会产生误差。
误差分析
假设对于给定的偏微分方程的解析解为u,而神经网络可以表示的所有函数构成的函数空间为F,可以定义F中最接近u的函数为:
u
F
=
a
r
g
min
f
∈
F
∥
f
−
u
∥
\mathrm{u}_{\mathrm{F}}=\underset{\mathrm{f}\in \mathrm{F}}{\mathrm{arg}\min}\parallel \mathrm{f}-\mathrm{u}\parallel
uF=f∈Fargmin∥f−u∥
另一方面,因为训练使用的数据集T在空间中也是有限的,因此可以定义神经网络在数据集T上Loss达到最小时的结果:
u
T
=
a
r
g
min
f
∈
F
L
(
f
;
T
)
\mathrm{u}_{\mathrm{T}}=\underset{\mathrm{f}\in \mathrm{F}}{\mathrm{arg}\min}\mathrm{L(f};\mathrm{T)}
uT=f∈FargminL(f;T)
同时,通过最小化损失来找到
u
T
\mathrm{u}_\mathrm{T}
uT通常在计算上是很困难的,并且优化器返回的通常是近似解。
∥
u
~
T
−
u
∥
\left\| \tilde{\mathrm{u}}_{\mathrm{T}}-\mathrm{u} \right\|
∥u~T−u∥
利用三角不等式将上式分解,就可以将总误差分解为三个部分:
其中,近似误差项 E a p p \mathcal{E} _{\mathrm{app}} Eapp 描述了 u F \mathcal{u}_\mathcal{F} uF 和 u \mathcal{u} u 之间的近似程度,而泛化误差项 E g e n \mathcal{E} _{\mathrm{gen}} Egen 则取决于用于训练的点集T和F函数族的表示能力。神经网络的规模越大,则近似误差越小,但泛化误差可能更高,也即所谓的偏差-方差权衡。当泛化误差占主导地位时,会发生过拟合。
此外,优化误差 E o p t \mathcal{E} _{\mathrm{opt}} Eopt 源于损失函数的复杂性和优化设置,例如学习率和迭代次数。然而,目前关于PINNs误差估计相关工作还比较少,即使在监督学习中,量化这三个误差仍然是一个悬而未决的研究问题。
基于残差的自适应细化
作者注意到,PINNs在选择残差点T时有很大的灵活性,那么或许可以通过改进残差点的选取来减小泛化误差项。
残差点的选取目前一共有三种可行的策略:
- **在训练中使用固定点:**在训练开始前取点(可以从网格取点,也可以随机取点),开始训练后一直使用这些点不再改变。
- **每一次迭代优化都随机取不同的点:**在每次更新时重新采样,这可以视为mini-batch梯度下降的一个特例。
- **在训练过程中自适应的改变残差点的位置:**基于残差的自适应细化
RAR
残差点T通常在域中通过随机采样获得。但对于偏微分方程中变化比较大的地方,这可能不是有效的。以Burgers方程为例,直观地说,应该在陡峭的部分附近采样更多的点,以更好地近似不连续性的区域。所以作者提出了一种基于残差的自适应细化方法,用来改善训练过程中残差点的分布。基本思想就是在偏微分方程残差大的位置多取一些点。
实验
作者在Burgers方程上进行了试验。RAR在变化剧烈的区域内增加了采样密度,同时使用了RAR的PINN在变化剧烈的区域内预测更加准确。
总结
这篇文章主要对PINNs的近似理论与误差分析进行了研究,同时提出了自适应采样的想法,当然,最重要的是作者开发了DeepXDE库。
使用DeepXDE库可以快速实现PINN相关算法,而且,目前DeepXDE库可以使用飞浆paddlepaddle作为基线,这样就可以白嫖百度AI Studio里的显卡了,每天16小时的V100显卡相当舒适。
当然,我觉得对不同的PDE用例还要改具体的算法代码实在是太不优雅了,所以又自己包装了一下,算法归算法,用例归用例。目前项目开源在Gitee上。
相关链接: