源码下载链接

https://download.csdn.net/download/VectorShift/92342504

——从基本原理到可执行代码的完整指南

物理信息神经网络(PINNs)已经成为现代科学计算的重要工具,它们通过将物理定律直接融入神经网络的训练过程,使得网络能够在极少数据甚至无数据的情况下求解偏微分方程。然而,当物理系统存在明显的 界面结构 时,例如材料边界、电磁介质分层、多相流耦合区域,传统 PINNs 往往表现不佳。

本文将介绍一种新颖且高效的改进方法:Adaptive Interface-PINNs(AdaI-PINNs)。该方法首次提出为每个子域自适应地学习激活函数,使网络在处理界面不连续系数或跳跃条件时仍具备稳定而高精度的表现。

文章内容包括:

  • 为什么 PINNs 在界面问题上会失败

  • AdaI-PINNs 的思想与架构

  • 完整的代码结构讲解

  • 如何扩展到高维求解

  • 实践中的训练技巧与注意事项


一、界面问题为何难以用 PINNs 求解

在许多实际场景中,物理参数在不同区域之间存在突变,例如:

  • 热传导中的导热率在材料边界发生改变

  • 弹性力学中材料刚度发生跳跃

  • 电磁场中的介电常数随界面变化

  • 地质结构中土层密度在不同深度突然变化

这些问题都属于 界面 PDE。界面 PDE 的特殊性体现在两点:

1. 系数不连续

物理参数在界面附近突然变化,使得解的梯度出现明显折线或尖点。

2. 界面跳跃条件

解本身可能连续,但其导数或通量存在跳变。

对于传统 PINNs 来说,这会造成两个直接影响:

(1)网络不易拟合

使用统一激活函数(例如 tanh)时,网络对不同区域的复杂度需求不同。一侧可能非常平滑,而另一侧变化剧烈。统一激活函数无法同时兼顾两边的行为,从而导致:

  • 残差下降非常慢

  • 界面附近误差大

  • 精度瓶颈明显

(2)优化难度成倍增加

神经网络必须依靠共享激活函数去同时适应多个区域,会出现梯度竞争、更新方向冲突等问题,使得优化过程更加困难。

因此传统 PINNs 在此类问题上通常表现不稳定。


二、AdaI-PINNs:核心思想

AdaI-PINNs 的创新点非常精炼:
为每个子域配置独立的、可训练的激活函数,同时让所有子域共享主干网络。

下面拆解其核心思想。


1. 主干网络共享

AdaI-PINNs 保留 PINNs 的主体结构:

  • 若干线性层

  • 前向传播输出解

  • 自动求导获取梯度

  • 利用物理约束训练

所有区域 共用同一套线性层参数
这样可以:

  • 保持模型规模适中

  • 共享结构信息

  • 保证整体解的连续性


2. 激活函数自适应

传统 PINNs 所用激活函数的形状是固定的,而 AdaI-PINNs 引入:

  • 作用在每个子域上的独立激活模块

  • 激活强度(斜率)是可训练参数

其含义是:
不同子域可以拥有不同的激活曲线,神经网络能自动“调整”自己以适应各区域难度。

当界面两边的物理现象明显不同,比如:

  • 左侧变化平缓

  • 右侧变化陡峭

网络可以学到:

  • 左侧激活函数更柔和

  • 右侧激活函数更陡峭

这让它能够更快更好地逼近界面问题。


3. 损失设计保持不变

AdaI-PINNs 的损失和传统 PINNs 一样:

  • PDE 残差

  • 边界条件

  • 界面上的解连续性

  • 界面上的通量跳跃条件

唯一变化的是网络结构,而不是物理约束本身。

这是它得以无缝迁移到各类工程问题(热传导、电磁场、声学、流体、弹性力学等)的关键。


三、AdaI-PINNs 的整体架构

整体架构可以分为三个部分:


1. AdaptiveActivation(自适应激活模块)

特点:

  • 每个子域一个独立模块

  • 内含可训练参数,用于控制映射强度

  • 可以嵌套任意基础激活函数,如 tanh、relu、silu 等

  • 支持自动学习最佳激活形态

这是论文的创新核心。


2. SharedMLP(共享主干)

  • 多层线性网络

  • 激活函数由每个模块提供

  • 前向传播时根据输入所在子域选择对应激活函数

它确保网络可以在不同子域切换“不同风格的非线性表达”。


3. AdaI_PINN(整体框架)

该类统一管理:

  • 多个激活模块

  • 一个共享主干

  • 根据采样点分类选择激活函数

训练时,所有模块共同参与反向传播。


四、完整代码结构解析

完整实现包含以下文件:


AdaI_PINN/ │── models.py │── domains.py │── utils.py │── run_1d.py

下面逐一讲解重点。


1. models.py(整个方法的核心)

AdaptiveActivation

负责区域自适应,在初始化时创建一个可训练参数,用来控制激活函数的变形。在前向传播中,根据该参数动态调整输入特征的分布,使网络在不同区域具有不同的非线性行为。

SharedMLP

定义网络中所有线性层,不包含激活函数本身。激活函数在外部注入,由 AdaI_PINN 控制。

AdaI_PINN

整合多个 AdaptiveActivation,为每个区域注册一个独立的激活模块。前向计算时,根据点所属区域自动选择对应模块。


2. domains.py(采样与域划分)

提供:

  • 全域内部点

  • 边界点

  • 界面点

  • 左/右区域掩码

该文件的核心是保证每个点都能被正确标记所属子域,以便在训练过程中选择正确的激活模块。


3. utils.py(自动微分与 PDE 计算)

该模块中包含:

  • 自动求一阶导数

  • 自动求二阶导数

  • 计算 PDE 残差

  • 平方损失函数

通过 PyTorch 自动求导机制,网络对输入点的二阶导数能够自然计算,这使 PINNs 能够直接求解 PDE。


4. run_1d.py(训练流程)

主程序负责:

  1. 初始化模型

  2. 采样训练点

  3. 构建损失

  4. 训练

  5. 可视化结果

  6. 保存图片与模型

训练结束后,你将得到一张图:
预测解在界面处处理得非常平滑且满足跳跃条件。


五、实践建议:如何让 AdaI-PINNs 训练更快、效果更好

1. 合理设置子域

界面位置在实际工程问题中通常已知。
机械、地质、材料、传热等领域均能提供准确界面。

统一建议:
尽量准确地定义界面位置,AdaI-PINNs 的效果会非常稳定。


2. 选择合适的激活函数

推荐:

  • tanh(最稳定)

  • silu(适合高维问题)

不推荐:

  • relu(会导致梯度离散,使界面处理不稳定)


3. 子域训练点需要均衡

确保两个子域的样本数量大致相同,避免某个区域训练不足。


4. 训练中监控以下指标

  • PDE 残差

  • 界面跳跃误差

  • 边界误差

  • 预测曲线是否振荡

振荡一般意味着:

  • 激活函数斜率太大

  • 学习率过高

  • 主干网络层数不足


六、如何扩展到 2D 或 3D?

扩展非常自然,只需要修改三部分:

(1)从一维坐标改为二/三维坐标

例如点从 (x) 变成 (x, y) 或 (x, y, z)。

(2)在 utils.py 中扩展 PDE 残差

使用自动求导求偏导,无需额外公式。

(3)在 domains.py 中定义更复杂的界面

例如:

  • 椭圆

  • 不规则曲线

  • 任意几何形状

主干网络与自适应激活模块完全可以复用。

如果你需要,我可以提供:

  • 可直接运行的 2D AdaI-PINNs

  • 可直接运行的 3D AdaI-PINNs

  • 完整工程项目(含训练脚本、绘图脚本、误差评估)


七、总结

AdaI-PINNs 的优势极具工程应用价值:

  • 自适应激活使 PINNs 的表达能力随子域变化

  • 更快的训练速度(实验中提升 2–6 倍)

  • 更高的精度(提升 1–2 个数量级)

  • 对激活函数选择不敏感

  • 在界面附近不再振荡、不再失真

  • 完全保留 PINNs 的物理一致性与灵活性

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐