3. 深度学习基础
在进入 PINN(物理信息神经网络)与 Physical AI 的物理驱动建模之前,必须夯实深度学习的核心地基。PINN 本质上是一个以物理方程(如 PDE)作为正则化约束的神经网络,其训练过程完全依赖于神经网络的前向传播、损失函数设计、反向传播与自动微分。本章将系统梳理神经网络的基本结构、激活函数的选择逻辑、损失函数的构建方法、优化器的演进与适用场景,并重点剖析反向传播与自动微分(Autograd)的数学原理与工程实现。理解这些基础,是后续将物理方程嵌入损失项、计算高阶偏导数的前提。
上图展示了 PINN 中神经网络的核心数据流:输入坐标(如 x, y, t)经过多层隐藏层与激活函数的非线性变换,输出预测解 u(x);随后将预测解代入损失函数(包含数据拟合项与物理残差项),再通过反向传播计算梯度,最后由优化器更新网络参数。整个过程形成一个闭环,而自动微分(Autograd)正是连接前向传播与反向传播的桥梁。
3.1 神经网络结构:从全连接到 PINN 的适配
核心原理:神经网络的本质是一个参数化的非线性函数逼近器。对于 PINN 而言,最常用的基础结构是全连接神经网络(Fully Connected Neural Network, FCNN),也称为多层感知机(MLP)。其数学表达为:
输入层: z^(0) = x
隐藏层: z^(l) = σ^(l)(W^(l) · z^(l-1) + b^(l)), l = 1, 2, ..., L
输出层: u(x) = W^(L+1) · z^(L) + b^(L+1)
其中 W 为权重矩阵,b 为偏置向量,σ 为激活函数。PINN 通常采用 4~8 层隐藏层,每层 20~100 个神经元,具体取决于 PDE 的维度与非线性程度。值得注意的是,对于物理问题,输入通常是时空坐标(x, y, z, t),输出是物理场(如温度、速度、位移)。
判断方法:选择网络结构时,应遵循以下原则:
- 深度 vs 宽度:深度增加可提高函数的表达复杂度,但过深会导致梯度消失;宽度增加则提升拟合能力,但计算量增大。PINN 中常用中等深度(4-6层)配合较宽(50-100神经元)的结构。
- 输入归一化:物理坐标往往跨越多个数量级,需将输入归一化到 [-1, 1] 或 [0, 1] 区间,否则会导致梯度不稳定。
- 输出约束:若物理场有已知边界值(如固定位移边界),可在网络输出层后直接施加硬约束(如乘以距离函数),而非仅依赖损失函数软约束。
| 结构参数 | 推荐值 | 说明 |
|---|---|---|
| 隐藏层数 | 4~8 | 过深需配合残差连接 |
| 每层神经元数 | 20~100 | 与输入维度、PDE 复杂度相关 |
| 激活函数 | tanh / Swish / sin | 需保证高阶可导 |
| 权重初始化 | Xavier / He | 避免梯度消失或爆炸 |
3.2 激活函数:物理可导性的关键
核心原理:激活函数为神经网络引入非线性,同时其导数特性直接决定了 PINN 能否计算高阶偏导数。PINN 的损失函数中常包含 PDE 残差项,例如二阶导数 u_xx,因此激活函数必须至少二阶可导且导数不为零。
常用激活函数对比:
| 函数 | 表达式 | 一阶导 | 二阶导 | PINN 适用性 |
|---|---|---|---|---|
| ReLU | max(0, x) | 0 或 1 | 0(几乎处处) | 不适用(二阶导为零) |
| tanh | (e^x - e^-x)/(e^x + e^-x) | 1 - tanh²(x) | -2tanh(x)·(1-tanh²(x)) | 推荐,光滑且导数稳定 |
| sin | sin(x) | cos(x) | -sin(x) | 适合周期性问题 |
| Swish | x · sigmoid(x) | σ(x) + x·σ(x)(1-σ(x)) | 可计算,非零 | 较新,效果良好 |
操作流程:在 PyTorch 中,只需将激活函数作为网络层的一部分,Autograd 会自动追踪其导数。例如:
import torch.nn as nn
class PINN(nn.Module):
def __init__(self):
super().__init__()
self.hidden = nn.Sequential(
nn.Linear(2, 50), nn.Tanh(),
nn.Linear(50, 50), nn.Tanh(),
nn.Linear(50, 50), nn.Tanh(),
nn.Linear(50, 1)
)
def forward(self, x, t):
u = self.hidden(torch.cat([x, t], dim=1))
return u
3.3 损失函数:数据拟合与物理约束的加权融合
核心原理:PINN 的损失函数由三部分构成:数据拟合损失(L_data)、物理残差损失(L_pde)以及边界/初始条件损失(L_BC/IC)。总损失为:
L_total = w_data · L_data + w_pde · L_pde + w_bc · L_bc
其中 L_pde 是将网络输出代入 PDE 后计算残差的均方误差(MSE)。例如对于热传导方程:
L_pde = (1/N_pde) · Σ | u_t(x_i, t_i) - α · u_xx(x_i, t_i) |²
判断方法:权重 w_data、w_pde、w_bc 的选取直接影响训练收敛性。若 w_pde 过大,网络可能忽略数据拟合;若过小,则物理约束失效。常用策略包括:
- 固定权重:简单但需手动调参,通常 w_pde = 1, w_bc = 10, w_data = 1。
- 自适应权重:使用 GradNorm 或 NTK 理论动态调整权重,使各损失项梯度量级一致。
- 时间分段训练:对于瞬态问题,可先训练初始时刻,再逐步推进时间域。
| 损失项 | 采样点 | 权重策略 | 常见问题 |
|---|---|---|---|
| L_pde | 内部随机点 | 1~10 | 配点不足导致残差不降 |
| L_bc | 边界/初始点 | 10~100 | 边界权重过低,解不满足边界 |
| L_data | 实验/仿真数据 | 1~100 | 数据噪声过大需降权 |
3.4 优化器:从 Adam 到 L-BFGS 的进阶
核心原理:优化器负责根据损失函数的梯度更新网络参数。PINN 中常用两类优化器:一阶优化器(Adam)和拟牛顿法(L-BFGS)。Adam 基于梯度的一阶矩和二阶矩估计,具有自适应学习率,适合初期快速下降;L-BFGS 利用损失函数的曲率信息,收敛更快且精度更高,但对内存和梯度精度要求较高。
操作流程:推荐采用两阶段训练策略:
- 阶段一:使用 Adam,学习率 1e-3,训练 5000~10000 次,使损失快速下降至相对稳定。
- 阶段二:切换至 L-BFGS,max_iter=1000,利用其超线性收敛特性精细优化。
# PyTorch 实现
optimizer_adam = torch.optim.Adam(model.parameters(), lr=1e-3)
for epoch in range(5000):
loss = compute_loss(model, x_pde, t_pde, x_bc, t_bc, x_data, t_data, u_data)
optimizer_adam.zero_grad()
loss.backward()
optimizer_adam.step()
# 切换 L-BFGS
optimizer_lbfgs = torch.optim.LBFGS(model.parameters(), lr=1.0, max_iter=1000)
def closure():
optimizer_lbfgs.zero_grad()
loss = compute_loss(model, x_pde, t_pde, x_bc, t_bc, x_data, t_data, u_data)
loss.backward()
return loss
optimizer_lbfgs.step(closure)
3.5 反向传播与自动微分(Autograd)原理
核心原理:反向传播(Backpropagation)是计算神经网络参数梯度的核心算法,其数学基础是链式法则。自动微分(Autograd)是反向传播的工程实现,它通过构建计算图(Computational Graph),在前向传播时记录每个操作,在反向传播时自动应用链式法则计算梯度。
Autograd 的工作机制:
- 前向传播:每个张量(Tensor)携带一个 grad_fn 属性,记录产生它的操作(如加法、乘法、激活函数)。
- 反向传播:调用 loss.backward() 时,Autograd 从损失节点出发,沿计算图反向遍历,逐节点计算梯度并累积到对应参数的 .grad 属性中。
- 高阶导数:PINN 需要计算 u_xx 等二阶导数,这要求 Autograd 支持高阶微分。PyTorch 通过 create_graph=True 参数实现:
# 计算 u 对 x 的一阶导
u_x = torch.autograd.grad(u, x, grad_outputs=torch.ones_like(u), create_graph=True)[0]
# 计算 u 对 x 的二阶导
u_xx = torch.autograd.grad(u_x, x, grad_outputs=torch.ones_like(u_x), create_graph=True)[0]
案例拆解:在 PINN 中计算 PDE 残差时,我们需对每个配点计算 u_t 和 u_xx。假设输入 x 和 t 均为 requires_grad=True 的张量,前向传播得到 u 后,Autograd 自动构建了从 x, t 到 u 的计算图。调用 grad 两次即可获得二阶导数,且由于 create_graph=True,这些导数本身也可被微分,从而支持损失函数对参数的二阶梯度(如用于 NTK 理论分析)。
| 概念 | 数学表达 | 工程实现 |
|---|---|---|
| 链式法则 | ∂L/∂W = ∂L/∂u · ∂u/∂z · ∂z/∂W | Autograd 自动逐层回传 |
| 一阶导数 | ∂u/∂x | torch.autograd.grad(u, x) |
| 二阶导数 | ∂²u/∂x² | 对一阶导再次 grad,需 create_graph=True |
| 混合偏导 | ∂²u/∂x∂t | 先对 x 求导,再对 t 求导 |