DYffusion阅读笔记 “DYffusion: A Dynamics-informed Diffusion Model for Spatiotemporal Forecasting“

 引言

        动态预测是指预测动态系统未来行为的任务,设计学习控制系统演化的潜在动态,以对其未来状态做出准确的预测。高斯diffusion在正向过程中使用高斯噪声不同程度地破坏数据,然后通过反向过程对随机输入进行去噪以得到高度真实的样本。然而,在高维度上将噪声映射到真实数据十分具有挑战性,因此扩散模型的计算成本非常高。而且,扩散模型多用于静态图像,即使是能生成真实样本的video diffusion model也没有明确利用数据的时间性质来生成准确的预测。

        本文贡献:

  • 从扩散模型的角度研究概率时空预测。
  • 提出了用于多步骤预测和长期视野的DYffusion框架,此框架通过时间归纳偏差来加速训练和降低内存要求。并且探讨了该方法的理论含义,DYffusion是学习动力系统解的隐式模型,cold sampling可以解释为它的欧拉方法解。
  • 从预测性能和算力要求两个方面与conditional video diffusion models等先进的概率方法进行对比试验。结果表明,相较于高斯扩散模型,DYffusion提高了计算效率。

背景

问题提出

        给定一组快照数据集\left \{ \rm{x}_t \right \} _{t=1}^T \in \mathcal{X}\mathcal{X}由空间维度(例如纬度、经度和大气高度)和通道维度(例如速度、温度和湿度)组成,表示数据所在的空间),概率预测的任务是学习条件分布P(\rm{x}_{t+1:t+h}|\rm{x}_{t-l+1:t}),用l张过去的快照来预测接下来连续的h个快照。本文从单个初始条件开始进行预测任务,即学习P(\rm{x}_{t+1:t+h}|\rm{x}_{t})

扩散过程

        为了将扩散步骤的状态和\left \{ \rm{x}_t \right \} _{t=1}^T的时间步区分开,我们用上标n来表示扩散步状态s^{(n)}。这个操作可以概括为,假设我们有一个退化算子D,以数据点s^{(0)}为输入,针对不同程度的退化比例输出s^{(n)}=D(s^{(0)},n)n \in \left \{1,...,N \right \}。通常,D加入带有递增方差的高斯噪声使得s^{(N)}\sim \mathcal{N} (\mathbf{0},\mathbf{I})。使用\theta参数化一个去噪网络,训练R_{\theta }来恢复s^{(0)}。扩散模型可以通过考虑R_{\theta }(s^{(n)},\rm{x}_t,n)来根据输入动态进行条件设定。在动态预测中,可以训练扩散模型以最小化目标:

好的,以下是用 PINN 求解二阶 Diffusion 方程的 PyTorch 代码: ```python import torch import numpy as np import matplotlib.pyplot as plt # 定义求解区域的左右边界 x_left = 0.0 x_right = 1.0 # 定义时间和空间步长 delta_t = 0.001 delta_x = 0.05 # 定义神经网络的输入维度和隐藏层维度 input_dim = 2 hidden_dim = 10 # 定义神经网络的输出维度 output_dim = 1 # 定义 Diffusion 方程的初始条件和边界条件 def u_init(x): return np.sin(np.pi * x) def u_left(t): return 0.0 def u_right(t): return 0.0 # 定义神经网络模型 class PINN(torch.nn.Module): def __init__(self): super(PINN, self).__init__() self.fc1 = torch.nn.Linear(input_dim, hidden_dim) self.fc2 = torch.nn.Linear(hidden_dim, hidden_dim) self.fc3 = torch.nn.Linear(hidden_dim, output_dim) def forward(self, x, t): # 拼接时间和空间坐标作为神经网络的输入 xt = torch.cat([x, t], dim=1) h1 = torch.tanh(self.fc1(xt)) h2 = torch.tanh(self.fc2(h1)) out = self.fc3(h2) return out # 定义 PINN 的损失函数 def pinn_loss(model, x_left, x_right, delta_t, delta_x): # 定义空间和时间的网格 x = torch.linspace(x_left, x_right, int((x_right - x_left) / delta_x) + 1).unsqueeze(1) t = torch.linspace(0, 1, int(1 / delta_t) + 1).unsqueeze(1) # 计算模型在内部网格点上的预测值 x_internal = x[1:-1] t_internal = t[1:-1] u_internal = model(x_internal, t_internal) # 计算模型在左右边界上的预测值 u_left_boundary = model(x_left, t_internal) u_right_boundary = model(x_right, t_internal) # 计算初始条件和边界条件的损失 init_loss = torch.mean((model(x, torch.zeros_like(x)) - u_init(x)) ** 2) left_boundary_loss = torch.mean((u_left_boundary - u_left(t_internal)) ** 2) right_boundary_loss = torch.mean((u_right_boundary - u_right(t_internal)) ** 2) # 计算 Diffusion 方程的残差 u_x = torch.autograd.grad(u_internal, x_internal, grad_outputs=torch.ones_like(u_internal), create_graph=True)[0] u_xx = torch.autograd.grad(u_x, x_internal, grad_outputs=torch.ones_like(u_x), create_graph=True)[0] f = u_xx - (1 / delta_t) * (u_internal - u_init(x_internal)) # 计算残差的损失 residual_loss = torch.mean(f ** 2) # 计算总的损失 loss = init_loss + left_boundary_loss + right_boundary_loss + residual_loss return loss # 初始化神经网络模型和优化器 model = PINN() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # 训练神经网络模型 for i in range(10000): optimizer.zero_grad() loss = pinn_loss(model, x_left, x_right, delta_t, delta_x) loss.backward() optimizer.step() if i % 1000 == 0: print("Iteration {}, Loss = {}".format(i, loss.item())) # 使用训练好的神经网络模型进行预测 x_test = torch.linspace(x_left, x_right, 101).unsqueeze(1) t_test = torch.linspace(0, 1, 1001).unsqueeze(1) u_test = model(x_test, t_test).detach().numpy() # 绘制预测结果 X, T = np.meshgrid(x_test, t_test) plt.pcolormesh(X, T, u_test, cmap='coolwarm') plt.colorbar() plt.xlabel("x") plt.ylabel("t") plt.title("PINN Solution to Diffusion Equation") plt.show() ``` 这段代码中,首先定义了求解区域的左右边界、时间和空间步长等参数,然后定义了 Diffusion 方程的初始条件和边界条件,以及神经网络模型和损失函数。在训练神经网络模型时,使用了 Adam 优化器,最后使用训练好的模型进行预测,并绘制了预测结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值