3. 深度学习基础

在进入 PINN(物理信息神经网络)与 Physical AI 的物理驱动建模之前,必须夯实深度学习的核心地基。PINN 本质上是一个以物理方程(如 PDE)作为正则化约束的神经网络,其训练过程完全依赖于神经网络的前向传播、损失函数设计、反向传播与自动微分。本章将系统梳理神经网络的基本结构、激活函数的选择逻辑、损失函数的构建方法、优化器的演进与适用场景,并重点剖析反向传播与自动微分(Autograd)的数学原理与工程实现。理解这些基础,是后续将物理方程嵌入损失项、计算高阶偏导数的前提。

深度学习核心组件与自动微分链路 输入层 x (坐标/参数) 隐藏层 1 权重 W1, 偏置 b1 激活 σ1 (如 tanh) 隐藏层 2 权重 W2, 偏置 b2 激活 σ2 (如 tanh) 输出层 u(x) 预测解 损失函数 L L_data + L_pde + L_BC/IC 反向传播与自动微分(Autograd) 计算图 → 链式法则 → 梯度 ∂L/∂W, ∂L/∂b Autograd 记录前向操作,反向自动累积梯度 优化器(Adam / L-BFGS) 更新参数: θ ← θ - η · m̂ / (√v̂ + ε) ■ 前向传播 (蓝色) ■ 反向梯度 (橙色虚线) ■ 参数更新 (紫色虚线)

上图展示了 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] 区间,否则会导致梯度不稳定。
  • 输出约束:若物理场有已知边界值(如固定位移边界),可在网络输出层后直接施加硬约束(如乘以距离函数),而非仅依赖损失函数软约束。
实战场景:在一维热传导方程 u_t = α u_xx 的 PINN 求解中,输入为 (x, t),输出为温度 u(x,t)。若采用 5 层隐藏层、每层 40 个神经元、tanh 激活函数,通常能在 10^4 次迭代内收敛。若改用 ReLU,则由于其二阶导数为零,无法计算 u_xx 项,导致物理残差恒为零,训练失败。
结构参数推荐值说明
隐藏层数4~8过深需配合残差连接
每层神经元数20~100与输入维度、PDE 复杂度相关
激活函数tanh / Swish / sin需保证高阶可导
权重初始化Xavier / He避免梯度消失或爆炸
常见误区:初学者常直接套用 ReLU 于 PINN。ReLU 在正区间二阶导数为零,无法计算 PDE 中的二阶偏导项(如拉普拉斯算子),导致物理损失无法回传。务必使用光滑激活函数(如 tanh、sin、Swish)。

3.2 激活函数:物理可导性的关键

核心原理:激活函数为神经网络引入非线性,同时其导数特性直接决定了 PINN 能否计算高阶偏导数。PINN 的损失函数中常包含 PDE 残差项,例如二阶导数 u_xx,因此激活函数必须至少二阶可导且导数不为零。

常用激活函数对比:

函数表达式一阶导二阶导PINN 适用性
ReLUmax(0, x)0 或 10(几乎处处)不适用(二阶导为零)
tanh(e^x - e^-x)/(e^x + e^-x)1 - tanh²(x)-2tanh(x)·(1-tanh²(x))推荐,光滑且导数稳定
sinsin(x)cos(x)-sin(x)适合周期性问题
Swishx · 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
经验提醒:对于含有高频振荡的物理场(如声波传播),建议使用 sin 激活函数或 Fourier 特征映射,可显著提升高频分量的拟合精度。

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 理论动态调整权重,使各损失项梯度量级一致。
  • 时间分段训练:对于瞬态问题,可先训练初始时刻,再逐步推进时间域。
案例拆解:在 Burgers 方程(非线性对流-扩散)的 PINN 求解中,初始条件为 u(0, x) = -sin(πx),边界条件为 u(t, -1) = u(t, 1) = 0。我们设置 N_pde = 10000 个内部配点,N_bc = 200 个边界点,N_data = 100 个观测数据点。初始权重 w_pde = 1, w_bc = 10, w_data = 1。训练 5000 次后,L_pde 从 1e-1 降至 1e-5,但 L_data 仍为 1e-3。此时将 w_data 提升至 10,再训练 2000 次,L_data 降至 1e-5,整体误差满足要求。复盘发现,初始权重设置导致网络优先满足物理方程,但忽略了稀疏观测数据,调整权重后达到平衡。
损失项采样点权重策略常见问题
L_pde内部随机点1~10配点不足导致残差不降
L_bc边界/初始点10~100边界权重过低,解不满足边界
L_data实验/仿真数据1~100数据噪声过大需降权

3.4 优化器:从 Adam 到 L-BFGS 的进阶

核心原理:优化器负责根据损失函数的梯度更新网络参数。PINN 中常用两类优化器:一阶优化器(Adam)和拟牛顿法(L-BFGS)。Adam 基于梯度的一阶矩和二阶矩估计,具有自适应学习率,适合初期快速下降;L-BFGS 利用损失函数的曲率信息,收敛更快且精度更高,但对内存和梯度精度要求较高。

操作流程:推荐采用两阶段训练策略:

  1. 阶段一:使用 Adam,学习率 1e-3,训练 5000~10000 次,使损失快速下降至相对稳定。
  2. 阶段二:切换至 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)
风险说明:L-BFGS 对梯度噪声敏感,若数据含噪声或配点过少,可能导致收敛不稳定。建议在 Adam 充分预训练后再切换,并监控损失曲线是否出现震荡。

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/∂WAutograd 自动逐层回传
一阶导数∂u/∂xtorch.autograd.grad(u, x)
二阶导数∂²u/∂x²对一阶导再次 grad,需 create_graph=True
混合偏导∂²u/∂x∂t先对 x 求导,再对 t 求导
经验提醒:在 PINN 中,务必确保输入张量 x, t 设置 requires_grad=True,否则 Autograd 无法追踪梯度。此外,计算高阶导数时,内存消耗随导数阶数指数增长,建议使用梯度检查点(checkpointing)或限制批大小。
总结复盘:本章从神经网络结构出发,强调了 PINN 对激活函数光滑性的特殊要求;损失函数部分阐述了物理约束与数据拟合的加权平衡;优化器部分给出了 Adam + L-BFGS 的两阶段策略;最后深入剖析了 Autograd 在 PINN 高阶导数计算中的核心作用。掌握这些基础,即可为后续章节中物理方程嵌入、复杂 PDE 求解以及 Physical AI 应用打下坚实基础。