提升pinn开发效率:如何利用deepseek-r1的推理能力超越传统LLM
将推理 LLM 打造为 PINN 开发的解题伙伴
图片由 AbsolutVision 拍摄于 Unsplash
作为一名 物理信息神经网络 (PINN) 的从业者,我的工作通常围绕着学习新的 PINN 概念、为新的 PINN 项目实现原型代码,以及在 PINN 训练失败时调试实现。如果我能有一个解题伙伴,为我的特定问题提供有价值的、可操作的见解,我的生活肯定会轻松得多。
最近,大型语言模型 (LLM) 已被广泛用于编码辅助和一般查询。因此,很自然地会考虑将它们作为有前景的协同助手。然而,鉴于 PINN 开发固有的复杂性,并非每个 LLM 都能胜任这项任务。
我需要的是一个 推理 LLM。
与生成即时响应的“传统”LLM 模型(例如 GPT-4)不同,推理 LLM 被设计为在回答之前进行“思考”。它们利用所谓的思维链 (CoT) 技术,将复杂问题系统地分解为更小的逻辑步骤,然后再生成答案,从而使它们能够更准确地解决数学、编码和科学挑战。
其中一个模型是 DeepSeek-R1,这是一个最近发布的推理 LLM,它已经席卷了整个社区。它是第一个声称其推理能力与 OpenAI 的 o1 模型(目前市场上功能最强大的模型,但属于闭源)相当的开源模型。
而最好的部分是:DeepSeek-R1 作为网络应用程序是免费提供的。这意味着 PINN 从业者可以利用其推理能力来增强工作流程,而无需昂贵的订阅或复杂的设置过程。
但它真的能达到预期吗?它能提高我们在 PINN 开发中的生产力、创造力和解决问题的效率吗?
在这篇博文中,让我们来测试一下 DeepSeek-R1!基于我遇到的典型用例,我整理了一系列测试,从基础概念到实践编码,再到调试,最后到解决高级工业研究设计。
图 1 我们在 PINN 开发周期的不同阶段测试推理 LLM 的“有用性”。(图片由作者提供)
目录
0. 组织
在深入研究之前,让我们讨论一下我们希望如何构建这些测试。
在这篇博文中,我们将使用 DeepSeek-R1 的网络应用程序,可以在这里访问:https://chat.deepseek.com/。您需要先注册(例如,使用您的 Google 帐户),然后才能与该模型聊天。要启用推理功能,请单击“DeepThink (R1)”按钮以激活 DeepSeek-R1 模型:
图 2 我们使用激活了 R1 模型的 DeepSeek 网络应用程序。
还有其他访问方法可用,例如,您可以通过 DeepSeek 移动应用程序、官方 API 或通过 Microsoft Azure AI Foundry 和 NVIDIA NIM Service 访问,这两个服务最近都将 DeepSeek-R1 模型添加到他们的模型目录中。
对于每个测试类别(例如,基础概念),我准备了一个典型的查询,输入到聊天界面中,我们可以根据生成的响应来检查模型的“有用性”。具体来说,我们将检查模型如何“思考”这个问题并得出最终答案。
现在我们准备出发了 🚀
1. 基础概念
在第一个类别中,我们测试 DeepSeek-R1 是否可以为 PINN 相关概念提供准确的、按需的解释。这对于试图掌握基本原理或需要快速澄清高级主题的从业者来说尤其有益。
让我们尝试以下测试查询:
- 什么是 DeepONet,它与物理信息神经网络有何不同?
这是我从刚接触物理信息机器学习领域的新同事那里收到的最常见的问题之一。 DeepONet 是一个相当新的概念,很容易与 PINN 混淆,因为这两种方法都使用神经网络来求解微分方程。理解这两个概念之间的区别对于为给定问题选择正确的方法至关重要。因此,让我们问问 DeepSeek-R1,看看它如何回应。
图 3 基础概念类别下的测试查询。
由于 DeepSeek-R1 是一个推理 LLM,它将花费更多时间来分析问题并决定解决问题的角度。在这种情况下,它“思考”了 37 秒才得出最终答案:
图 4 DeepSeek-R1 生成的答案
相当全面的回应!DeepSeek-R1 解释了这两种模型在目标、架构、训练数据和用例方面的差异,并将它们总结在一个格式良好的表格中。此外,它认识到存在 DeepONet 的物理信息变体,该变体融合了这两个框架的关键思想。
DeepSeek-R1 的一个优点是,除了最终答案之外,您还可以看到它经历的整个思考过程。完整的记录太长,无法在此处显示。相反,我总结了以下关键的逻辑步骤:
- 回忆一般的神经网络应用。
- 将 PINN 识别为用于求解 PDE 的物理约束网络。
- 将 DeepONet 识别为算子学习框架,即函数之间的映射。
- 分析 DeepONet 的结构:分支和干线网络。
- 比较目标:PINN 求解特定的 PDE,而 DeepONet 学习解算子。
- 比较架构:PINN 使用标准前馈,DeepONet 使用分支-干线。
- 比较数据需求:PINN 依赖于物理学,DeepONet 需要函数对数据集。
- 承认重叠和混合方法(例如,物理信息 DeepONet)。
- 结论:DeepONet 概括了 PDE 实例,而 PINN 求解特定情况。
我们可以看到逻辑序列是自然的、清晰的、结构良好的。我强烈建议您自己尝试一下,阅读 DeepSeek-R1 的完整“独白”会更有趣😊
如果您对深入学习 DeepONet 和 物理信息 DeepONet 感兴趣,请随时查看我在此处发布的文章:
2. 代码实现
我们要测试的下一个类别是 DeepSeek-R1 协助 PINN 代码实现的能力。这是最实用和最常用的用例之一,即编写样板代码和可自定义的模板,以减少新实验的设置时间。
让我们尝试以下测试查询:
- 我正在研究金属棒 1D 热传导问题,并且我对使用 PINN 来推断给定几个空间点传感器测量值的未知热扩散率感兴趣。请生成完整的 PyTorch 实现。
图 5. 代码实现类别下的测试查询。
在这里,我们要求该模型为实际的工程应用开发一个功能齐全的 PINN 解决方案(在 PyTorch 中)。请注意,我们正在考虑的特定任务是一个参数估计问题,这是一种逆问题,与更常见的 PINN 直接求解 PDE 的应用(即经典的正向问题)不同。
由于此任务要求模型不仅要“思考”如何制定解决方案,还要实现相应的 PyTorch 代码,因此它花费了 4 分钟以上的时间才得出最终答案。让我们来看看。
==== 注意:以下代码完全由 DeepSeek-R1 生成 =====
import torch
import torch.nn as nn
import torch.optim as optim
### Set random seeds for reproducibility
torch.manual_seed(42)
### Generate synthetic training data
def exact_solution(x, t, alpha):
return torch.sin(torch.pi * x) * torch.exp(-alpha * (torch.pi**2) * t)
alpha_true = 0.5 # True thermal diffusivity to be inferred
### Sensor measurements (randomly sampled in domain)
N_data = 200
x_data = torch.rand((N_data, 1)) # Random spatial points
t_data = torch.rand((N_data, 1)) # Random temporal points
u_data = exact_solution(x_data, t_data, alpha_true)
### Boundary and initial condition points
N_bc = 100
x_bc = torch.cat([torch.zeros(N_bc//2, 1), torch.ones(N_bc//2, 1)], dim=0)
t_bc = torch.rand(N_bc, 1)
u_bc = torch.zeros(N_bc, 1) # Boundary condition (0 at both ends)
N_ic = 100
x_ic = torch.rand(N_ic, 1)
t_ic = torch.zeros(N_ic, 1)
u_ic = torch.sin(torch.pi * x_ic) # Initial condition
### Collocation points for PDE residual
N_col = 1000
x_col = torch.rand(N_col, 1)
t_col = torch.rand(N_col, 1)
### Define PINN architecture
class HeatPINN(nn.Module):
def __init__(self):
super().__init__()
self.net = nn.Sequential(
nn.Linear(2, 32), nn.Tanh(),
nn.Linear(32, 32), nn.Tanh(),
nn.Linear(32, 32), nn.Tanh(),
nn.Linear(32, 1)
)
self.alpha = nn.Parameter(torch.tensor([0.1])) # Initial guess
def forward(self, x, t):
return self.net(torch.cat([x, t], dim=1))
### Initialize model and optimizer
model = HeatPINN()
optimizer = optim.Adam(model.parameters(), lr=0.001)
def compute_loss():
# Data loss
u_pred = model(x_data, t_data)
loss_data = nn.functional.mse_loss(u_pred, u_data)
# Boundary condition loss
u_bc_pred = model(x_bc, t_bc)
loss_bc = nn.functional.mse_loss(u_bc_pred, u_bc)
# Initial condition loss
u_ic_pred = model(x_ic, t_ic)
loss_ic = nn.functional.mse_loss(u_ic_pred, u_ic)
物理损失 (PDE 残差)
x_col.requires_grad = True
t_col.requires_grad = True
u = model(x_col, t_col)
## Compute gradients
u_t = torch.autograd.grad(u, t_col,
grad_outputs=torch.ones_like(u),
create_graph=True)[0]
u_x = torch.autograd.grad(u, x_col,
grad_outputs=torch.ones_like(u),
create_graph=True)[0]
u_xx = torch.autograd.grad(u_x, x_col,
grad_outputs=torch.ones_like(u_x),
create_graph=True)[0]
## PDE residual
residual = u_t - model.alpha * u_xx
loss_pde = torch.mean(residual**2)
## Total loss
return loss_data + loss_bc + loss_ic + loss_pde
### Training loop
epochs = 5000
for epoch in range(epochs):
optimizer.zero_grad()
loss = compute_loss()
loss.backward()
optimizer.step()
if epoch % 500 == 0:
print(f"Epoch {epoch:5d} | Loss: {loss.item():.2e} | Alpha: {model.alpha.item():.4f}")
print(f"\nTrue alpha: {alpha_true:.4f}")
print(f"Predicted alpha: {model.alpha.item():.4f}")
该实现提供了一个坚实的基础,其中包含构建 PINN 的所有基本组件:前馈网络架构、边界和初始条件的执行、物理信息损失和传感器数据损失的结合、搭配点的生成、用于计算梯度的自动微分以及将所有内容放在一起的训练循环。
这个实现的一个优点是,模型与参数估计目标对齐,并使用 nn.Parameter()
将热扩散率 α 正确设置为可训练参数,并将其值与网络权重和偏差一起优化。这是利用 PINN 解决逆问题的一种有效方法。
此外,该模型更进一步,提供了一个具有已知解析解的测试案例。这允许用户方便地验证实现。一个很大的加分项!
我运行了生成的代码,得到了预期的结果,没有任何错误(可视化是我自己编写的):
图 6. 使用 PINN 估计未知参数的收敛曲线。
再次,我强烈建议您试一试,并记住看看它的完整“思考”过程。我相信您会觉得它很有趣 :)
如果您有兴趣了解更多关于使用 PINN 解决逆问题的信息,请随时查看我在这里发布的文章:使用物理信息神经网络和符号回归发现微分方程。
3. 故障排除
在提供了关于基础概念的解释并协助实现代码之后,我们接下来要研究的主题是模型是否可以帮助我们排除 PINN 训练运行失败的故障。
由于 PINN 的开发涉及许多活动部件,因此调试失败的训练运行非常困难。这正是 PINN 从业者将受益于拥有一位解决问题的合作伙伴的时候,他们可以从各个角度检查问题并提供可能被忽略的新见解。
让我们尝试以下测试查询:
- 我正在训练一个 PINN 来求解微流体通道中粘性流动的稳态 2D 斯托克斯方程。我的神经网络有 4 层(每层 32 个神经元,ReLU 激活),我的优化器是 Adam,学习率为 1e-3。但是,即使经过 10000 次迭代后,损失也不会收敛并保持在高值,并且预测的速度场是非物理的。如何调试此问题?
图 7. 故障排除类别下的测试查询。
这是模型产生的响应:
图 8. DeepSeek-R1 模型产生的响应。
该模型生成了一份潜在问题的综合列表,从那些经常被忽视的点开始,例如边界条件的执行、激活函数选择、损失函数平衡和输入归一化。在涵盖了这些快速检查之后,该模型还提出了更深入的步骤,例如超参数调整和高级采样。
如果我们检查模型的逻辑链(由于页面限制,此处未显示),我们可以看到模型首先澄清问题(即,识别目标问题,斯托克斯流,并回忆 PINN 的工作原理),然后识别可能的故障点(例如,激活函数等)并提出具体的调试步骤。在我看来,这种推理过程结构良好,它不仅提供了有用的调试帮助,而且使建议具有可解释性和透明性。
在实践中,当使用 DeepSeek-R1 进行故障排除时,始终包含足够的上下文(如实现细节和问题的症状描述)是一个好主意。总的来说,我们的提示越具体,模型就越能推理问题并提供量身定制的根本原因分析。
4. 工业研究设计
对于最后一个类别,我们稍微偏离纯粹的技术问题解决,探讨从业者可能面临的更高级别的挑战,即设计 PINN 相关的研究。
PINN 从业者的主要任务之一是将算法开发转化为实用的工业解决方案。这包括设计可行性研究、展示业务价值以及沟通结果以获得利益相关者的支持。如果推理 LLM 能够在这里成为一个有效的助手,那就太好了。
让我们尝试以下测试查询:
- 我正在一家工业公司领导一个研发项目,以评估 PINN 在异常检测方面的可行性。我们的目标是使用(稀疏的)传感器数据(来自压力和流量测量)来检测管道泄漏。我应该如何设计这项研究,以验证 PINN 的可行性并向利益相关者展示其价值?
图 9. 工业研究设计类别下的测试查询。
这是模型生成的响应:
图 10. 模型响应 — 1
图 11. 模型响应 — 2
图 12. 模型响应 — 3
我认为模型提出的计划结构良好且全面。该路线图清晰且合乎逻辑,涵盖了可行性调查的各个方面,例如,成功指标定义、数据策略、模型基准测试、成本效益分析以及解决方案部署的工程考虑。我特别喜欢关于使用仪表板可视化向利益相关者展示的部分。利益相关者可能不是技术人员。创建可视化仪表板并显示实时比较是使结果更易于访问和可操作的关键。总的来说,我们可以看到像 DeepSeek-R1 这样的推理 LLM 可以成为 PINN 从业者起草工业研究的得力助手。
5. 总结
在这篇博文中,我们系统地评估了使用推理 LLM (DeepSeek-R1) 作为 PINN 从业者问题解决伙伴的潜力。我们探讨了四个与日常 PINN 开发高度相关的关键任务类别:
- 阐明基本概念
- 生成功能代码
- 解决问题
- 头脑风暴可行性研究
在所有这些任务中,我们看到 DeepSeek-R1 可以正确地“思考”这个问题,并提出有见地的答案或可行的建议。
DeepSeek-R1(和其他推理 LLM)的一个突出特点是,除了最终答案之外,模型还输出了其响应背后所采取的整个逻辑步骤序列。这使得模型的响应更透明、更易于解释。如果您正在处理复杂的问题,请不要忘记查看那些中间的“想法”。您可能已经在过程中受到启发 ✨。
希望您觉得这篇博文有用🤗如果您有兴趣了解有关 PINN 的更多信息,请查看我之前的博文:
- Physics-Informed Neural Networks: An Application-Centric Guide
- Unraveling the Design Pattern of Physics-Informed Neural Networks
- Discovering Differential Equations with PINN and Symbolic Regression
- Operator Learning via Physics-Informed DeepONet
- Solving Inverse Problems With Physics-Informed DeepONet