3. 损失函数设计与不收敛的关联

在PINN训练中,损失函数不是“把数据项和物理项加起来”这么简单。它实际上定义了一个多目标优化问题:数据损失约束网络在观测点上贴合真值,物理损失(残差损失)约束网络在配点上满足偏微分方程。两者量级、梯度尺度、权重比例一旦失衡,优化器就会在“拟合数据”和“满足方程”之间来回拉扯,表现为损失震荡、物理残差长期不降、或数据拟合很好但解完全违背物理规律。本节围绕量级失衡与权重设置不当两类典型失败,给出可操作的诊断与调整方法。

一、两类损失的尺度差异从何而来

设数据损失为

L_data = (1/N_d) * Σ |u_θ(x_i) - u_i|²
L_phys = (1/N_r) * Σ |N[u_θ](x_j)|²

其中 N[·] 是微分算子。二者量级差异主要来自三处:其一,物理残差的量纲。若方程是 u_tt = c²u_xx,残差单位是“加速度”,数值可能比位移大几个数量级;其二,导数放大。自动微分求二阶导时,若网络输出尺度偏大,残差会被平方进一步放大;其三,采样点数与区域。配点常远多于观测点,但平均后仍可能因残差本身量级大而占主导。因此不能只看损失数值大小,要看梯度尺度——真正决定参数更新方向的是 ∂L/∂θ。

常见误区:看到 L_phys 比 L_data 大 10³ 倍就立刻把物理权重调小。若物理残差本身量纲大,这可能是正常的;应先做无量纲化,再比较梯度范数。

二、量级失衡的两种典型失败

失败案例A:物理项压倒数据项。某一维热传导问题,观测点仅 20 个,配点 2000 个,初始权重 λ_data=1、λ_phys=1。训练 5000 步后 L_phys 从 1e-1 降到 1e-4,但 L_data 停在 8e-2 几乎不动,预测温度场整体偏移。原因是物理残差梯度范数约为数据项的 50 倍,网络几乎只被物理项驱动,观测信息被淹没。调整方式:对残差做无量纲化(用特征长度、特征时间归一化),并将 λ_phys 降至 1e-2 量级,使两项梯度范数接近。

失败案例B:数据项压倒物理项。观测点密集(500 个)、配点稀疏(200 个),λ_phys=1 但残差量级很小。结果网络在观测点附近拟合极好,远离观测区完全发散,物理残差在后期反而上升。这是“过拟合数据、放弃物理”的典型表现。应提高 λ_phys 或增加配点,并检查配点是否覆盖了边界层等关键区域。

损失量级失衡的两种失败模式 模式A:物理项压倒数据项 观测点 N_d=20 配点 N_r=2000 残差量纲偏大 未无量纲化 梯度范数对比 ‖∂L_data/∂θ‖ ≈ 1 ‖∂L_phys/∂θ‖ ≈ 50 现象:L_phys 降至 1e-4,L_data 停在 8e-2 预测场整体偏移,观测信息被淹没 对策:残差无量纲化 + λ_phys 降至 1e-2 使两项梯度范数同量级 模式B:数据项压倒物理项 观测点 N_d=500 配点 N_r=200 配点稀疏 边界层未覆盖 梯度范数对比 ‖∂L_data/∂θ‖ ≈ 40 ‖∂L_phys/∂θ‖ ≈ 1 现象:观测点拟合极好,远离观测区发散 后期物理残差反而上升 对策:提高 λ_phys、增加配点 重点覆盖边界层与高梯度区

三、权重设置不当的三种情形

情形1:固定权重但量级不匹配。最常见。建议先做一次“梯度探针”:在训练前若干步记录两项损失对最后一层权重的梯度范数,取比值 r = ‖∇L_phys‖ / ‖∇L_data‖,令 λ_phys ≈ 1/r 作为初值,再微调。这比凭经验拍一个 1e-3 更可靠。

情形2:权重过大导致优化刚性。λ_phys 过大时,物理项主导,网络被迫先满足方程,数据项几乎不更新;若方程本身有刚性(如对流主导、边界层薄),还会引发梯度爆炸。表现为损失出现 NaN 或剧烈尖峰。此时应降低 λ_phys,并配合梯度裁剪(如 clip=1.0)与学习率衰减。

情形3:权重过小导致物理约束失效。λ_phys 过小时,网络退化为纯数据拟合的插值器,外推区完全不可信。判断依据不是看 L_phys 绝对值,而是看验证集上的物理残差是否随训练下降;若长期不降,说明物理项没有起到约束作用。

四、可执行的权重调整流程

下面给出一份可直接套用的检查与调整清单,适用于大多数PINN回归问题:

步骤操作观察指标判断与动作
1对输入输出与方程做无量纲化残差量级是否在 O(1)若残差达 1e3 以上,先归一化再训练
2记录前 100 步两项梯度范数比值 rλ_phys 初值取 1/r 量级
3固定权重训练 2000 步两项损失曲线一项长期不降即失衡
4启用自适应权重(如梯度归一化)权重变化是否平稳剧烈震荡则降学习率
5在验证集上评估物理残差残差是否随步数下降不降则提高 λ_phys 或增配点

自适应权重的常用做法是梯度归一化:每若干步计算两项梯度范数,按 λ_phys ← λ_phys · (‖∇L_data‖ / ‖∇L_phys‖)^α 更新,α 取 0.5~1。注意要设上下限(如 [1e-4, 1e2]),否则在训练初期梯度噪声大时权重会剧烈跳动。

实操建议:把两项损失分别记录到 TensorBoard,并同时记录梯度范数。只看总损失会掩盖失衡;分开看曲线形态——一条平、一条降,就是失衡的直接证据。

五、一个可复现的示例配置

以一维 Burgers 方程为例(ν=0.01/π,观测点 100,配点 2000,网络 4 层×50 神经元),合理的初始配置可写为:

lambda_data = 1.0
lambda_phys = 1e-2      # 由梯度探针 r≈100 反推
optimizer   = Adam(lr=1e-3)
clip_norm   = 1.0
adaptive    = True      # 每 500 步按梯度比更新,范围 [1e-4, 1e2]
n_steps     = 20000

训练中若发现 L_data 在 1e-3 附近停滞而 L_phys 已到 1e-5,说明数据项被压制,应适当提高 λ_data 或降低 λ_phys;反之若 L_phys 长期在 1e-2 不降,则提高 λ_phys 并检查配点是否覆盖激波区域。最终验收标准应同时满足:验证集数据误差低于阈值,且物理残差在配点上整体下降一个数量级以上。

总结来说,损失函数设计的核心不是找一个“万能权重”,而是建立量级对齐—梯度可比—动态可调的机制。先无量纲化消除量纲干扰,再用梯度范数确定初值,最后用自适应策略维持平衡,才能避免训练在两项之间反复失衡。