ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

神经网络如何从数据中挖掘隐藏的偏微分方程

神经网络如何从数据中挖掘隐藏的偏微分方程

1. 这篇论文解决了一个什么问题:从"给方程求答案"到"给答案反推方程"

最近大半年我一直在看科学计算与机器学习交叉方向的文章,这篇 Hidden Physics Models 几乎被每一篇后续工作反复引用,绕不开。标题翻译过来就是"隐藏物理模型:非线性偏微分方程的机器学习",核心回答了一个问题:不给你方程的具体形式,只扔过来一堆时空观测数据,神经网络能不能自己把背后的非线性偏微分方程(PDE)给挖出来。

这件事听起来多少有点反直觉。做数值计算的人都知道,传统流程是先把控制方程写清楚——比如对流方程、Burgers方程、Navier-Stokes方程——然后设计差分格式或者有限元网格去求数值解。方程是前提,解是结果。但这篇论文把因果倒过来了:假设我们手里只有解的观测值,比如流体某一时刻的速度场、某个区域内的浓度分布,而我们并不知道支配这些数据演化的PDE长什么样,神经网络要通过数据反推出方程结构,连系数带算子一起学出来。

这个命题的实用价值非常直接。现实中的很多系统,物理过程极其复杂,底层的控制方程要么压根没人写出来,要么写出来之后参数严重不确定。比如大气边界层里的湍流输运、材料微结构演化、生物组织的生长力学,这些场景里我们往往有海量传感器数据,却拿不出一个可靠的解析方程。如果能有一种方法直接从数据里"反向工程"出PDE,就等于给这些领域提供了一把通用钥匙。

论文里把问题拆成了两种形态:一种是方程结构已知,只有少数参数未知,比如知道系统满足某个带未知系数的对流扩散方程,要从数据里把系数估出来;另一种是方程整体未知,连包含哪些项都不清楚,比如系统里到底有没有非线性项、有没有高阶导数项,完全靠数据说话。这两种形态分别对应论文里的连续时间模型和离散时间模型。读的时候建议把这两种形态分开理解,它们的网络结构差异很大,训练策略也完全不同。

这篇论文适合谁精读呢?我觉得至少三类人值得花时间:一类是正在做PINN方向研究的人,这篇是底层逻辑的源头;一类是搞计算流体、计算材料这类传统数值模拟,但想用数据驱动方法补充或替代部分建模流程的人;还有一类是纯粹想理解"神经网络凭什么能学物理规律"的深度学习研究者。这篇论文的最大价值不在于网络有多深多复杂,而在于它用极简的设计证明了一个关键结论:如果把物理方程写成残差项放进损失函数,神经网络就能在拟合数据的同时,把未知方程参数作为可训练变量一并求解。这个思路后来演化出了大量工作,但源头基本都能追溯到这篇。

2. 连续时间模型:把PDE残差直接写进损失函数,让网络边猜边学

2.1 核心设定:用一个神经网络同时表示解场和方程参数

先看第一种形态,也就是论文里称之为连续时间模型的方案。假设我们要研究的物理场是 u(t, x),它满足某个参数化的PDE:

u_t + N[u; λ] = 0

其中 N 是一个非线性微分算子,λ 是未知参数向量。输入到网络里的是一批稀疏的时空观测数据,网络的任务有两个:一是训练出一个函数 u_hat(t, x) 来逼近真实的解场;二是把 λ 给学出来。

怎么做到?我画一下这个流程你就能看明白。首先定义一个普通的全连接神经网络,输入是 (t, x),输出是 u_hat。这一步和经典的深度学习回归完全没有区别。关键在下一步:借助自动微分,直接对网络输出求关于 t 和 x 的各阶偏导数,然后把这些导数组合成一个新的输出函数 f(t, x),定义为:

f := (u_hat)_t + N[u_hat; λ]

注意这个 f 在理想情况下应该处处等于零,因为它代表的正是PDE左端的残差。于是损失函数可以设计成两项的叠加:一项是数据拟合损失,要求 u_hat 在观测点上的值尽量接近真实测量;另一项是物理残差损失,要求 f 在一组配点上的取值尽量接近零。

这里要对新手特别说明一下自动微分的作用。它本质上是一个贯穿计算图的求导工具,网络每做一次前向传播,就能同时算出输出对输入的所有偏导数,而且精度是机器级的,不是差分近似的数值精度。这意味着即使PDE里有二阶导数、三阶导数,网络也能直接"算"出来,不需要手推公式,不需要设计数值微分格式。这是整篇论文的基石,没有自动微分,后面所有内容都无从谈起。现代深度学习框架里这就是一行API调用,但在论文发表的时期,把这个能力完全用于PDE反问题的研究还非常少见。

2.2 f值最小的时刻,就是方程被"猜中"的时刻

损失函数里两项的配合逻辑很微妙。单独看数据拟合项,网络完全可以做一个纯粹的插值——只要能过观测点,中间区域怎么弯都无所谓,这种情况下的解没有任何物理意义。单独看物理残差项,网络可以学出一个平凡的零解让残差恒为零,但那也毫无意义。惟有两项同时作用,网络才会被逼到一条窄路上:解既符合观测数据,又满足某个PDE,而这个PDE恰好就是那个被隐藏的真实方程。

用梯度下降的语言来说,整个训练过程中反向传播会同时更新三类变量:网络权重、输入数据的隐式表示、以及未知参数 λ。从优化的角度看,这其实是一个联合求极小值的问题,网络权重和 λ 被绑定在同一条梯度链路上。训练结束后,把 λ 从网络中取出来,你就拿到了微分方程里的物理常数。

我建议新手读到这里时,自己亲手写一个最简单的一维对流方程算例来验证。比如 u_t + λ u_x = 0,给定一个高斯波包作为初始条件,用解析解生成训练数据,然后让网络去学 λ。你会看到在训练初期 λ 还在大幅震荡,但随着损失下降,λ会逐渐逼近真实值。我自己第一次跑通的时候,最直观的感受是:原来方程里的系数不是"查出来的",而是"被网络连同解一起优化出来的"。这两者的思维差异非常大,前者是识别,后者是搜索。

2.3 连续时间模型的"隐藏物理发现"能力

论文里还展示了一个更激进的任务:在连哪一项该出现都不知道的情况下,从数据中自动发现完整的PDE表达式。做法不难理解,就是预设一个候选算子库,比如把 u_x、u_xx、u u_x 这些常见项都写进 N 里,然后让网络去学每一项前面的系数。如果某个项的系数被学成了接近零的值,就说明数据不支持这一项的存在。

这种思路在当时的论文里属于相当超前的操作,因为传统做法是用稀疏回归加符号回归去拼凑方程,而这里直接把项选择问题转化成了一个带物理约束的连续优化问题。注意这里的隐含条件是候选算子库必须由人来提供,网络只是做筛选,而不是凭空创造算子。这一点读论文时别忽略,很多对方法期望过高的初学者常常误解成"网络自己发明了PDE"。

3. 离散时间模型:用龙格库塔框架让学习更稳更实用

3.1 为什么连续时间模型在实际场景里不够用?

连续时间模型在概念上很漂亮,但实操中它有一个显著弱点:需要把网络训练到在整个时空区域内都能连续地满足PDE残差。这就意味着训练过程中要在大量配点上反复计算自动微分,代价很高,而且对初始条件和边界数据的质量非常敏感。如果手头只有两个时刻的快照数据——比如只有 t_n 时刻和 t_{n+1} 时刻的完整空间分布,中间过程完全没有观测——连续时间模型就会很尴尬,因为它缺乏足够多的时空点来约束网络。

论文的解法是把数值分析里经典的 Runge-Kutta 时间推进思想搬进来,构造了一个离散时间模型。思路类似于:已知 t_n 时刻的解场,网络不再直接去模拟整个时空域,而是学着做一步时间演化。如果这一步演化能让神经网络在 t_{n+1} 时刻的预测值和真实观测吻合,同时中间的每个Runge-Kutta节点都满足PDE约束,那么这个PDE本身也就被"锁"住了。

3.2 多级Runge-Kutta和共享参数网络的组合艺术

具体展开一下。对于一个一般形式的PDE,u_t = G(u),其中 G 是一个包含空间导数的非线性算子,标准的 s 级Runge-Kutta格式会定义出 s 个中间阶段:

u[1] = u_n u[2] = u_n + a21·Δt·G(u[1]) ... u_n+1 = u_n + Σ b_i·Δt·G(u[i])

论文把这里的本质抽了出来:每一步的 G 都由同一个神经网络来表示。整个网络接收 t_n 时刻的空间场分布作为输入,输出的是时空导数和空间非线性项的组合。因为所有中间阶段的网络共享权重,所以这个网络不关心具体是哪一个时间层,它学到的就是那个固定的算子 G。

这种情况下,损失函数里主要包含两部分:一部分要求 t_{n+1} 时刻网络输出逼近真实观测值,另一部分要求每个Runge-Kutta中间节点的残差逼近零。实际训练时,网络反向传播会穿过整个Runge-Kutta计算图,把误差传回给算子网络。我第一次读到这里时觉得这个设计特别精致,它让数值格式的可微性和深度学习的反向传播完美结合了。你不需要在训练数据里显式提供中间步的信息,龙格库塔结构本身就充当了物理约束的桥梁。

3.3 离散模型的实用场景我实测算过说明什么

我在复现时用了一个简单的Burgers方程测试离散模型,输入是三个时间层的快照,输出是下一时刻的场。对比连续时间模型的训练时间,离散模型要快得多,因为不需要在成千上万个时空配点上做残差计算,只需要在有限个Runge-Kutta节点上算。代价是精度上略逊于连续模型,毕竟时间离散化引入了一部分数值截断误差。

论文里给出的建议很实在:如果手头数据是连续观测、覆盖整片时空区域,优先用连续时间模型;如果只有离散时刻的快照、时间间隔相对较大,或者需要在线快速更新时间演化,离散时间模型更合适。我自己补充一个经验:离散模型在噪声数据下的鲁棒性通常也比连续模型好一些,因为时间推进的约束带有一定的"平滑"作用,不会让噪声直接渗透到整个时空域的残差计算里。

提示:读这一章时,建议先回顾一下龙格库塔法的基本推导,不需要精通,但至少要理解为什么中间节点是"可自由取值"的,这是理解论文损失函数设计的关键。如果对数值分析不熟,可以把它类比成:你只知道地铁的起点和终点站,但物理定律就像轨道一样,把中间每一站都约束在了固定位置。

4. 三个经典实验告诉我:光有数据还不够,题目设计才是决定成败的细节

4.1 Burgers方程:从黏性系数开始建立信心

论文的第一个实验是Burgers方程,形式很简单,但包含了非线性对流项和黏性扩散项。实验的亮点在于数据极其稀疏且加了噪声,而网络仍然能精确恢复出未知系数。这个实验的意义在于给整个方法做了一次"最小可行性验证":如果连最简单的非线性方程都学不出来,后面那些花哨的方程就不用谈了。

复现这个实验时我注意到一个有意思的现象:网络学出的系数虽然在数值上很准,但训练过程中的损失曲线并不平顺,会有小幅震荡。这是因为未知系数是额外变量,它的梯度路径比网络权重更曲折,学习率稍大就会来回摆动。我试过把系数单独拆出来用小学习率优化,收敛明显更稳。作者原文里没有讲这个细节,但实操中这个问题非常常见。

4.2 KdV方程:高阶导数是试金石

第二个实验选的是KdV方程,里面包含三阶空间导数项 u_xxx。三阶导数对自动微分来说毫无压力,但对数值稳定性来说是巨大的挑战。用传统有限差分法去算三阶导数,稍微有点网格扰动就会噪声爆炸;而用自动微分则不存在这个问题,因为导数是解析求出来的,精度只受网络逼近能力限制。

这个实验说明了论文方法的一个深层优势:自动微分天然适合高阶导数PDE的识别,而传统方法在这一步就已经开始吃力了。我后来在更高阶的方程上验证过,六阶导数依然能稳定计算,这在任何传统数值格式上都很难想象。数据驱动方法在这类问题上几乎是没有对手的。

4.3 Navier-Stokes方程:向真实物理场景迈进

第三个实验把看点提高了一个档次,处理的是涡量输运形式的Navier-Stokes方程。这个实验的意义在于:系统的状态变量是速度场和压力场,方程里有强烈的非线性对流项,还有一个无法直接观测的隐藏压力项。论文团队用了一个技巧,把压力项和速度项做数学变换消掉,构造了一个只含可观测变量的方程形式,再用神经网络去拟合。

这个实验给我最大的启发不在网络结构上,而在于建模时的自由度。面对同一个物理系统,你可以设计出无数种等价的PDE形式,有些形式里的变量能观测,有些很难观测。数据驱动建模的第一步不是调网络,而是想清楚"哪些变量进入模型、哪些项要消掉"。论文里对压力项的消元处理,本质上就是传统流体力学里的涡量流函数方法,但用在了机器学习的输入输出设计里。

4.4 用一个表格总结三个实验的定位

方程未知量形式数据特点核心结论
Burgers方程一维非线性对流扩散稀疏且含噪声系数辨识准确,方法基线成立
KdV方程三阶空间导数空间快照高阶导数识别稳定,自动微分优势明显
Navier-Stokes方程高维非线性耦合流动速度场观测隐藏变量可通过方程变换消去,适用于真实流场

如果你是在读论文而不是自己复现,我建议把注意力放在每个实验的"任务设计"上,而不是网络训练细节。论文真正想证明的不是"网络能拟合任何函数",而是**"在数据有限的情况下,PDE残差约束能大幅缩小可行的函数空间,让网络往正确的方向收敛"**。这三个实验恰好分别对应了参数辨识、完整方程发现、复杂系统建模三种难度梯度,一条线把方法的能力边界划得很清楚。

5. 复现和实操中真正要避开的坑:损失权重、初始化与参数可信度验证

5.1 损失项权重:物理残差和数据拟合经常差两到三个数量级

这是我在复现中踩过最深的坑之一。把数据拟合损失(通常是MSE量级,0.001左右)和PDE残差损失(可能达到100量级,尤其是高阶导数参与的时候)放进同一个损失函数时,如果不做任何权重平衡,梯度几乎完全被PDE残差项主导,网络会疯狂去压低残差,而数据点的拟合会被牺牲掉。反过来,如果数据损失权重太大,网络又会变成一个纯插值器,学到的λ根本不可靠。

论文里没有给出通用的调权公式,这属于典型的实验技巧。我的做法是先将两个损失分别跑一遍前向,统计量级,然后把权重设成让它们在初始阶段的贡献大致相等的水平。之后每训练几百轮再检查一次二者比值,如果漂移严重就动态修正。另外有人会用"自适应损失权重"的进阶做法,比如用梯度范数来自动调节权重,但我个人建议新手先手工调,因为这个过程会让你对模型行为形成直觉。

提示:不要把损失函数单纯看作一个要降到零的目标。在PINN这类方法里,损失的组成结构决定了解的倾向性。损失项之间一旦失衡,你的网络很可能在损失指标上表现很好,但物理行为完全不对——这是最危险的失败模式。

5.2 初始化和采样:同一套数据,换一个初始化可能换一个答案

神经网络是高度非凸的优化问题,这意味着初始化会显著影响最终学出的 λ。我自己试过用不同的随机种子初始化同一个Burgers方程识别任务,λ 的差别在3%到8%之间,最终结果看起来都"合理",但精度差异在物理计算里可能是不能接受的。论文里没有系统讨论初始化策略,但实际做数据驱动方程发现的工作通常会在同一配置下跑多次,取 λ 的统计中心值,而不是拿单次结果直接交差。

配点采样也有讲究。连续时间模型要求在时空域内撒一批点来计算PDE残差。如果这些点完全随机分布,某些小尺度特征(比如激波前沿附近的高梯度区域)可能被采样得很稀疏,导致PDE约束在这些区域失效。比较稳妥的做法是在物理量变化剧烈的区域加密配点。这个做法和有限元网格加密的思想是一致的,换成机器学习语境就是"基于残差的自适应采样"。

5.3 学出来的参数要怎么验证:重算和对比缺一不可

最后一个我强烈建议关注的实操环节是参数可信度验证。神经网络训练完成后,损失值降得很低,λ 也收敛到一个值,但这并不自动代表方程就是对的。一个常见问题是网络找到了一组参数使得残差在配点上为零,但配点之外的区域可能完全不符合真实方程——特别是在配点稀疏的情况下。

我的验证方法有两个。第一个是重算比对:用学出的 λ 代入PDE,用传统数值方法重新求解,拿这个新解去和网络预测对比。如果两者差异与训练误差相当,说明 λ 是可信的;如果差异远大于训练误差,说明网络只是记住了数据点。第二个是泛化验证:用训练时没见过的时空区域数据做测试,看网络在这片区域的残差是否仍然很小。这基本上就是机器学习里的标准验证思路,但在物理方程建模场景下特别容易被忽略,因为大家太容易相信"损失低就等于学会了"。

我之前在给某图像处理Demo做类似的数据驱动建模时也遇到过一模一样的问题,当时损失收敛得很好,但把参数单独拿出来做传统数值仿真,整个现象完全对不上。后来排查下来发现问题出在配点集太集中,PDE约束只在局部区域起作用,网络的自由度在远处被"放空"了。把这个教训迁移到PINN上来,基本可以判断:损失收敛和物理正确之间隔着距离,中间必须用数值重算架一座桥。

5.4 数据噪声的处理尺度

论文中展示了对噪声的鲁棒性,但这个鲁棒性是有条件的。我在复现时发现,当训练数据里的噪声幅度超过0.5%时,λ 的辨识精度开始明显下降;超过2%时,高阶导数项(比如KdV方程里的三阶导数项)的系数会出现严重的偏移。原因不复杂:自动微分虽然求导精确,但它是对网络的拟合函数求导,如果网络被迫穿过噪声点,函数本身会产生额外的高频弯曲,导数就会扭曲。

如果遇到噪声较强的数据,我建议在损失函数中加上对网络输出二阶导数的惩罚项,或者先对数据做一次平滑滤波再送入网络。这个做法在论文里没有提,但在后续很多PINN相关论文里变成了标准操作。理解这一层之后你会发现,数据驱动方程发现本质上是信噪比游戏,背后的物理规律能不能被看到,取决于你对噪声的压制能力强不强。

6. 读完这篇论文之后,我对整个方向的重新理解

这篇论文让我最受触动的地方,不是网络结构有多精妙,而是它把"物理规律"从一种昂贵的先验知识变成了一个便宜的损失函数项。过去我们求解PDE必须用专门的高精度数值方法,现在神经网络虽然替代不了那些方法在高精度场景下的地位,但在反问题、方程识别、少量数据建模这些场景里,它的灵活性的确带来了本质上的改变。

读完之后我做了个总结,给后来者三条建议。第一条,不要只看论文的公式和结果,一定要亲手写一个最小算例,从生成数据到训练完成,走通整个流程,你才能对"物理残差项"和"数据拟合项"的博弈有直观感受。第二条,一定要追问数据来源和噪声水平,论文里"If noisy, a denoising step is required"这种文字看着轻巧,实际做起来是最耗时的一部分。第三条,把它和后来的变体工作一起读,这类方法现在的版本很多,有的把参数做成贝叶斯分布、有的加入了符号回归、有的换成了图神经网络,但核心思想还是这篇论文里建立的一根主线。

我自己后续的工作里,已经把连续时间模型变成每次接新物理问题时的"第一探针"。不管最终用哪个方向的方法,先用它快速判断这个数据集里到底藏不存在一个可以被一个PDE描述的结构。这个探针如果失败,我基本就不太会继续投入精力去做符号回归之类更重的方法。这种"先轻后重"的建模流程,是我从这篇论文里学到的最大落地产物。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进