2. PINN训练不收敛的常见根因分类

PINN 训练不收敛,很少是单一原因造成的。更常见的情形是:损失曲线看起来在下降,但物理残差始终压不下去;或者某一项损失突然爆炸,把其他项一起带崩;又或者训练几百轮后预测解完全偏离边界条件。面对这类现象,如果只是反复调学习率,往往事倍功半。更有效的做法是先建立一张“根因地图”,把不收敛的表现归入数据、网络结构、损失函数、优化器、数值精度五个维度,再按维度逐项排查。

需要先明确一个判断基准:PINN 的“收敛”不是指总损失降到某个绝对数值,而是指数据项、物理残差项、边界/初值项同时下降到可接受量级,且预测解在验证点上满足方程与定解条件。因此排查时不能只看总损失,必须分项观察。下面这张图给出了五个维度的根因分类及其典型表现,可作为排查的起点。

PINN 不收敛根因分类地图 总损失不降 ≠ 单一原因:先分项定位,再按维度排查 训练不收敛 分项损失诊断 ① 数据与采样 配点稀疏/分布不均 边界点缺失、量纲悬殊 归一化未做或做错 ② 网络结构 深度/宽度不足 激活函数不匹配 输出尺度未约束 ③ 损失函数 各项权重失衡 残差量纲未缩放 硬约束/软约束冲突 ④ 优化器 学习率过大/过小 Adam 后期不收敛 批大小与噪声 ⑤ 数值精度 自动微分精度损失 float32 累加误差 高阶导数放大噪声 排查顺序建议:数据 → 损失权重 → 优化器 → 网络 → 精度

一、数据与采样:最容易被低估的根因

PINN 的物理残差是在配点上计算的,配点分布直接决定方程约束被“看见”的程度。常见问题有三类。第一类是配点稀疏或分布不均:例如求解一维对流扩散方程时,若配点只在区间中部均匀撒点,而边界层附近几乎没有点,网络在梯度剧烈变化区就得不到约束,表现为物理残差项长期停在较高水平。第二类是边界/初值点缺失或重复:边界条件项权重再大,若采样时漏掉某个端点,该端点约束就是零。第三类是量纲与归一化问题:当自变量 x 在 [0, 1]、因变量 u 在 [0, 1e5] 量级时,未归一化的输入会让网络第一层权重更新极不均衡。

实操上建议先做一次“数据体检”:统计配点在各子区间的数量、检查边界点是否覆盖全部端点、打印各输入输出的均值与标准差。若发现某区间配点占比低于 10%,应改用拉丁超立方或按梯度自适应加密。归一化应统一在数据预处理层完成,并保证物理残差计算时使用的导数是对归一化后变量求的,否则会引入额外的链式缩放因子。

二、网络结构:表达能力与解的匹配

网络结构问题通常表现为“训练损失能降但验证解偏差大”或“残差项完全不动”。典型根因包括:深度或宽度不足以表达解的高频成分;激活函数选择不当,例如用 ReLU 拟合需要二阶导数的方程时,二阶导在大部分区域为零,物理残差信息几乎丢失;输出层未做尺度约束,导致预测值量级与真解相差几个数量级。

对于需要二阶导的 PDE,建议优先使用 tanh、sin 或 GELU 等光滑激活函数。若解具有多尺度特征,可考虑在输入层加入傅里叶特征映射,把高频信息显式编码进网络。输出层可加一个可学习的缩放系数,或直接对输出做与真解同量级的线性变换。判断依据是:固定其他条件,仅替换激活函数后观察物理残差项是否出现数量级变化。

三、损失函数:权重失衡是最常见的“假不收敛”

PINN 的总损失通常是数据项、物理残差项、边界项、初值项的加权和。若各项量纲不同而未缩放,权重就失去了物理意义。例如残差项以方程残差平方计,边界项以解的偏差平方计,两者量级可能相差 1e4,此时总损失几乎完全由大项主导,小项长期不降,看起来像“不收敛”,实际是权重问题。

推荐做法是先分别记录各项损失的量级,再按“使各项初始贡献相近”的原则设定权重,例如用各项初始损失的倒数做归一化。另一种做法是采用自适应权重,根据各项梯度范数的比例动态调整。需要警惕的是硬约束与软约束混用:若边界已通过输出变换硬性满足,却仍在损失中加入边界项,会造成约束冲突。判断是否属于此类根因,最直接的方法是单独训练只含物理残差的模型,看残差能否下降。

四、优化器:学习率与阶段策略

优化器层面的根因相对直观,但容易被误判。学习率过大会让损失在初期剧烈震荡甚至发散;学习率过小则表现为损失长期缓慢下降、物理残差几乎不动。另一个常见现象是 Adam 在后期难以进一步压低残差,此时可切换到 L-BFGS 做精细收敛,但要注意 L-BFGS 对批大小和内存的要求。

实操建议采用分阶段策略:前若干轮用 Adam 配合较大学习率快速下降,后段用余弦退火或切换到拟牛顿法。批大小也会影响收敛稳定性,全批计算物理残差时噪声小但内存占用高,小批则噪声大。判断依据是观察损失曲线的形态:若呈周期性震荡,优先怀疑学习率;若长期平台,优先怀疑权重或网络表达力。

五、数值精度:高阶导数的隐性误差

PINN 依赖自动微分计算高阶导数,float32 在累加与高阶求导中会放大舍入误差。当方程含二阶甚至三阶导数、且配点密集时,残差计算本身就可能带有可观噪声,表现为残差项在某个水平附近随机波动、无法继续下降。此时可尝试切换到 float64,或对输入做中心化与缩放以改善条件数。

此外,残差计算中的除零、对数域越界、开方负数等也会产生 NaN,进而让整个训练崩溃。排查时应在每个训练步检查损失是否为有限值,一旦出现 NaN 立即回退到上一步并定位出问题的配点。

排查清单(可直接对照使用)

维度 检查项 典型表现 优先动作
数据 配点覆盖、边界点完整性、归一化 残差项平台高、边界解偏差大 统计分区配点数,补边界点,统一归一化
网络 激活函数光滑性、深度宽度、输出尺度 残差不动或验证解高频缺失 换 tanh/GELU,加傅里叶特征,约束输出尺度
损失 各项量级、权重、硬软约束冲突 总损失降但某项不降 按初始损失归一化权重,去除冲突约束
优化器 学习率、阶段策略、批大小 震荡或长期平台 降学习率,Adam 后接 L-BFGS
精度 dtype、NaN、条件数 残差随机波动或训练崩溃 切 float64,逐步检查有限值
排查时坚持“一次只改一个维度”,并固定随机种子。否则多个变量同时变化,无法判断是哪一项起了作用。建议先跑一个只含物理残差的最小实验,确认残差本身可降,再逐步加入数据项与边界项。

把上述五个维度串起来看,PINN 不收敛的排查本质上是一个分层定位过程:先用分项损失判断问题落在哪一类,再在该维度内做最小化实验。数据与损失权重决定了问题“能不能被表达”,网络结构决定了“有没有能力表达”,优化器与精度决定了“能不能稳定地表达”。按这个顺序推进,大多数不收敛现象都能在较短时间内定位到具体根因,而不是停留在盲目调参上。