1. 课程导入与问题界定

物理信息神经网络(PINN)把控制方程残差、初边值条件与数据拟合项一起塞进损失函数,用自动微分把物理约束"软"地施加到网络输出上。这种设计让 PINN 在正问题、反问题、参数辨识等场景中很有吸引力,但也带来一个非常现实的困扰:训练过程经常不收敛,或者看起来收敛了、结果却不可信。本章不急着给调参技巧,而是先把"不收敛"这件事界定清楚——它到底长什么样、由哪些环节引起、后续应该按什么顺序排查。

一、什么叫"不收敛":三类典型表现

在普通监督学习中,不收敛通常指训练损失降不下去。PINN 的麻烦在于损失是多项加权和,单项下降不代表整体健康。工程上更实用的判断是看三类现象:

  • 损失震荡或发散。总损失在迭代中大幅上下跳动,或训练损失持续上升、出现 NaN/Inf。常见诱因是学习率过大、损失项量级差异悬殊、硬约束与软约束冲突。
  • 梯度异常。梯度范数爆炸(如持续大于 1e3)或迅速衰减到 1e-8 以下,导致参数几乎不再更新。高阶 PDE 残差中的二阶、三阶导数、以及 tanh/sin 激活的饱和区都会放大这一问题。
  • 预测失真。损失曲线看似平稳,但预测场在边界附近振荡、在稀疏采样区偏离真解,或反问题中辨识参数漂移到物理上不合理的范围。这类"假收敛"最危险,因为仅看 loss 曲线无法发现。

需要强调:判断是否收敛不能只看总损失。合理的做法是同时监控分项损失(PDE 残差、边界条件、初始条件、数据项)、梯度范数、预测场在验证点上的误差,以及反问题中的参数估计轨迹。这四类信号共同构成诊断依据。

二、问题从哪来:五个环节的因果链

PINN 训练失败的根源通常落在五个环节上,它们之间存在明确的传导关系,而不是彼此孤立的"调参点":

  1. 问题与量纲。方程中系数跨越多个数量级(如扩散系数 1e-3 与对流速度 1e2 并存),残差量级天然失衡,梯度被大项主导。
  2. 采样与配点。配点集中在某区域、边界点过少、时空采样分辨率不足,导致残差估计有偏,网络"学会"在容易的区域满足方程。
  3. 网络与激活。层数过深、激活函数光滑性不足(ReLU 的二阶导为零,无法表达二阶 PDE 残差),或初始化尺度不当。
  4. 损失加权。各项权重固定不变,PDE 项与数据项量级相差几个数量级,优化器实际只在优化其中一项。
  5. 优化策略。学习率、优化器选择、训练轮次、是否采用课程学习或自适应权重,直接决定能否越过病态损失面。

这五个环节的传导方向是:量纲与采样决定损失面的"地形",网络与激活决定可表达性,加权决定优化器实际看到的梯度方向,优化策略决定能否走到低损失区。因此排查顺序应当从数据与量纲出发,再往网络、加权、优化器推进,而不是一上来就换优化器或调学习率。

PINN 不收敛诊断地图:从现象到根因 现象层(观察到的信号) 损失震荡 / 发散 / NaN 梯度爆炸 / 消失 预测失真 / 假收敛 参数漂移 环节层(根因所在) ① 问题与量纲 系数跨数量级 变量未归一化 残差量级失衡 ② 采样与配点 配点分布不均 边界点不足 时空分辨率低 ③ 网络与激活 激活光滑性不足 层数/宽度不当 初始化尺度 ④ 损失加权 权重固定不变 分项量级悬殊 约束相互冲突 ⑤ 优化策略 学习率过大 优化器选择 训练轮次不足 排查顺序(推荐路径) 第 1 步 量纲归一化 + 分项损失监控 第 2 步 检查配点分布与边界覆盖 第 3 步 激活函数与网络容量 第 4 步 自适应损失加权 第 5 步 优化器与学习率调度 原则:先修地形(量纲/采样),再修表达(网络),最后修优化(加权/学习率)

三、一个可操作的诊断起点:分项损失与梯度监控

在动手调任何超参数之前,先让训练过程"可观测"。下面是一段最小化的监控代码骨架,用于在每若干轮记录分项损失与梯度范数。示例中的数值仅用于说明格式,并非实测结果。

import torch

def log_diagnostics(epoch, loss_dict, model, optimizer):
    # loss_dict: {"pde":..., "bc":..., "ic":..., "data":...}
    total = sum(loss_dict.values())
    grad_norm = 0.0
    for p in model.parameters():
        if p.grad is not None:
            grad_norm += p.grad.detach().norm(2).item() ** 2
    grad_norm = grad_norm ** 0.5

    if epoch % 200 == 0:
        print(f"epoch={epoch:6d} total={total.item():.3e} "
              f"pde={loss_dict['pde'].item():.3e} "
              f"bc={loss_dict['bc'].item():.3e} "
              f"ic={loss_dict['ic'].item():.3e} "
              f"data={loss_dict['data'].item():.3e} "
              f"grad_norm={grad_norm:.3e} "
              f"lr={optimizer.param_groups[0]['lr']:.2e}")

观察要点:若 pde 项比 bc 项大 4~6 个数量级且长期不降,说明加权或量纲有问题;若 grad_norm 在 1e-8 附近徘徊,说明梯度消失,应检查激活函数与初始化;若 grad_norm 持续大于 1e3 并伴随损失 NaN,优先降学习率并检查残差中的高阶导数项。这些判断规则构成了后续章节的排查依据。

四、本课程的学习地图

围绕上述五个环节,本课程按"先诊断、再定位、后优化"的顺序展开:先建立可观测的训练诊断体系(分项损失、梯度、验证误差、参数轨迹),再逐环节分析根因——量纲与归一化、配点采样策略、网络结构与激活选择、损失加权与自适应方案、优化器与学习率调度;随后进入典型场景的实战,包括高阶 PDE 残差、反问题参数辨识、多物理场耦合与硬约束构造;最后给出可复用的排查清单与调参决策表。学完本课程,你应当能在拿到一条不收敛的损失曲线时,快速判断问题落在哪个环节,并给出有依据的修改方案,而不是盲目试错。