PINN 讲义第 6 章:一个最简单的 PINN 常微分方程
本文属于“PINN 入门讲义”系列:第 6 章。如果你是第一次阅读,建议先从 总目录 开始。
阅读说明
这份讲义面向希望系统理解 Physics-Informed Neural Networks 的读者,尽量从微分方程、数值近似和神经网络函数表示的基本语言讲起,再逐步进入 PINN 的残差构造与训练过程。
前一章给出了 PINN 的一般形式。一般形式虽然重要,但如果第一次接触 PINN,只看 、 和各种损失项,很容易觉得抽象。本章把这些符号放进一个最简单的常微分方程中,完整走一遍 PINN 的构造过程。
我们选择的例子是指数衰减方程:
这个问题足够简单,解析解也容易写出:
正因为它简单,才适合作为第一个 PINN 例子。我们可以清楚地看到网络函数、方程残差、初值损失和训练目标如何对应,而不会被复杂 PDE、边界几何或多维采样分散注意力。读者应把本章看作一张小比例尺地图:后续 PDE 中的结构更复杂,但基本路线与这里相同。
6.1 初值问题的结构
方程
描述的是一个量随时间衰减的过程。左端 是变化率,右端 表示变化率与当前量成正比且方向相反。若 表示某种物质剩余量,那么剩余越多,减少越快;随着 变小,减少速度也变慢。
只有方程还不能唯一确定解。任意函数
都满足 ,其中 是常数。初值条件 规定了起点,从而确定 。因此这个初值问题的唯一解是 。
PINN 的目标不是先利用解析公式求解,而是假设我们不知道解析解,只知道方程和初值条件。我们希望构造一个神经网络函数 ,让它满足两件事:
- 在时间区间内部近似满足微分方程。
- 在 处近似满足初值条件。
这两件事会分别变成残差损失和初值损失。
6.2 用神经网络表示候选解
在这个例子中,未知解只依赖时间 ,所以神经网络可以看成从一个实数输入到一个实数输出的函数:
如果用一个全连接网络来表示,它可以写成多层复合函数。例如,
这里 表示所有可训练参数。实际代码中, 可能是矩阵, 可能是向量;本章只关心它们共同决定了一个函数 。
训练开始时,参数通常随机初始化,此时 可能是一条完全不符合方程的曲线。训练的任务是调整 ,让这条曲线逐渐接近满足方程和初值条件的函数。由于真实解是 ,我们训练后可以把 与 比较,观察 PINN 是否学到了正确形状。
需要注意,网络输出 是一个连续函数表达。与在固定网格点上存储数值不同,一旦参数确定,我们可以在任意时间 上计算 ,也可以通过自动微分计算它对 的导数。
6.3 方程残差
原方程为
把神经网络函数 代入方程左端,得到残差
如果 ,说明 在时间点 处满足微分方程;如果残差不为零,说明网络函数在该点违反了方程。这个残差是本章最重要的对象。
为了训练,我们在时间区间内选择若干配置点:
这些点不需要真实标签。它们只是用来检查方程是否被满足。对应的残差损失为
这条公式的结构很清楚:在每个配置点上,把网络函数和它的时间导数代入方程左端,得到残差;把残差平方后求平均,就得到方程约束的损失。
这里的 通常通过自动微分计算。它不是用差分公式近似出来的,也不是手工写出网络的解析导数,而是由深度学习框架根据网络计算图和链式法则自动得到。PyTorch 中的 torch.autograd 正是用于完成这类导数计算的工具。
6.4 初值损失
仅仅让残差小还不够。方程 有一族解 。如果不施加初值条件,网络可能学到某个满足方程但起点错误的函数。例如 也满足方程,但它不满足 。
因此必须把初值条件写入损失函数。初值条件为
网络对应的初值误差是
于是初值损失可以写成
这个损失项只在一个点上计算,但作用非常关键。它把整族可能解中的一个具体解选出来。对更复杂的时间演化 PDE,初值条件通常是一整条曲线或一个空间分布,例如 ;本章的 ODE 例子中,初值只是一个数。
6.5 总损失与训练
把方程残差损失和初值损失相加,得到总损失:
这里 是初值损失的权重。最简单时可以取 ,但在实际问题中,不同损失项的尺度可能不同,权重选择会影响训练效果。
展开写,总损失为
训练就是求解优化问题
每一步训练可以理解为以下过程。首先,把配置点输入网络,得到 ;然后通过自动微分计算 ;接着计算方程残差和初值误差,组合成总损失;最后计算总损失对参数 的梯度,并用优化器更新参数。这个过程不断重复,直到损失下降到较小水平,或者训练达到预设迭代次数。
从这个例子可以清楚看到 PINN 中两类导数的关系。构造残差时,需要计算
这是网络输出对输入 的导数。更新参数时,需要计算
这是损失对网络参数的导数。二者都可以由自动微分框架完成,但含义完全不同。
6.6 训练结果应如何理解
如果训练成功,网络函数 应当接近解析解 。判断训练结果时,至少可以看三个方面。
第一,看残差损失是否下降。若 较小,说明网络函数在配置点上较好地满足了方程。第二,看初值损失是否下降。若 较小,说明网络在 处接近 。第三,如果解析解已知,可以计算误差,例如在一组测试点上比较
在真实科学计算问题中,解析解往往未知,因此第三种检查不一定可用。这时通常需要借助高精度数值解、实验数据、残差分布、守恒量或物理一致性来评估结果。本章之所以选这个 ODE,是因为它有解析解,便于第一次观察 PINN 是否按预期工作。
即使在这个简单问题中,也可能出现训练不理想的情况。若配置点太少,网络可能只在少数点附近满足方程;若学习率太大,损失可能震荡;若网络太小,表达能力可能不足;若初值损失权重太低,网络可能较好地满足方程却偏离初始值。这些现象在 PDE 中会更加明显。
还要注意,损失小并不总是等于真实误差小。残差只在采样点上被约束,初值只在指定点上被约束。如果网络在采样点之间出现不合理振荡,训练损失可能看起来不错,但整体解仍然有问题。因此,PINN 训练后通常需要额外验证,而不能只看训练损失。
6.7 与传统数值方法的比较
对这个简单 ODE,传统数值方法可以用欧拉法近似求解。若时间步长为 ,显式欧拉法写成
它从初值 出发,一步一步推进,得到离散时间点上的近似值。这个方法直接利用方程给出的变化率,从当前点走到下一个点。
PINN 的思路不同。它不按时间一步步推进,而是先假设整个时间区间上的解由一个函数 表示,再通过残差损失和初值损失让这个函数整体满足问题。训练完成后, 可以在任意时间点上求值。
这种差异在简单 ODE 上看起来并不一定带来优势,因为欧拉法、Runge—Kutta 方法等传统方法已经非常成熟。但这个例子帮助我们理解 PINN 的基本机制。对于高维问题、反问题、数据融合问题或复杂约束问题,PINN 的“把方程和数据共同写进损失函数”的思想会显示出更多可能性。当然,这些可能性并不意味着它总能超过传统方法;具体问题仍需具体分析。
6.8 从 ODE 例子到 PDE 例子
本章的 ODE 例子虽然简单,但已经包含了 PINN 的核心结构:
在 PDE 中,输入从单个时间变量 变为 或 ;残差中会出现偏导数,例如 、、;初值条件可能是一条曲线或一个函数;边界条件可能作用在空间边界上。虽然符号更复杂,但基本逻辑没有改变。
例如热方程 PINN 的残差为
这与本章 ODE 残差
在结构上完全类似:都是把网络函数代入方程左端,得到衡量方程违反程度的量。下一章将把本章的一维时间例子推广到偏微分方程。
本章小结
本章用初值问题 完整展示了 PINN 的基本流程。首先用神经网络函数 近似未知解,然后把它代入方程构造残差 ,再用配置点上的残差平方形成 PDE 或 ODE 残差损失。初值条件 被写成初值损失 。二者共同组成总损失,通过优化参数 选择合适的网络函数。
这个例子说明,PINN 的基本思想并不依赖复杂方程。只要一个问题可以写成“未知函数满足某种微分关系和条件”,就可以尝试用神经网络表示候选函数,并把这些关系写成损失项。后续 PDE 章节只是把输入变量、残差结构和边界条件变得更丰富。
习题
- 对方程 ,写出 PINN 残差 和初值损失。
- 对方程 ,写出残差损失的形式。
- 解释为什么只最小化残差损失 不能唯一确定本章例子的解。
- 若候选函数为 ,计算它对方程 的残差。
- 比较欧拉法和 PINN 在本章 ODE 问题中的求解思路差异。
延伸阅读
- M. Raissi, P. Perdikaris, and G. E. Karniadakis, “Physics-informed neural networks: A deep learning framework for solving forward and inverse problems involving nonlinear partial differential equations,” Journal of Computational Physics, 378, 686-707, 2019. DOI: 10.1016/j.jcp.2018.10.045。
- Raissi 等人的 PINN 项目页:Physics Informed Deep Learning。
- OpenStax, Calculus Volume 2, Section 4.1 “Basics of Differential Equations”: OpenStax Calculus Volume 2。
- PyTorch 官方教程:Automatic Differentiation with torch.autograd。
- MIT OpenCourseWare, Differential Equations: 18.03 Differential Equations。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!