【论文阅读】Diffusion-Convolutional Neural Networks (DCNNs) | day9、10

30th Conference on Neural Information Processing Systems (NIPS 2016)


用于图结构化数据的神经网络——扩散神经网络。
该网络可从图结构化数据中获得基于扩散的特征表示。
基于此,可实现节点的分类。

优点:

  1. 可以获得同构结构下不变的图结构的潜在表示。
  2. 可以以张量运算的方式在GPU上进行预测和学习。
  3. 在节点分类任务中的表现优于概率关系模型和基于图的核方法。

一、介绍

  通过引入“扩散卷积 diffusion-convolution’ operation”运算,将卷积神经网络(CNN)扩展到一般的图结构数据。扩散卷积运算不是像标准卷积运算那样在网格结构输入上扫描参数的“平方”,而是通过在图形结构输入中的每个节点上扫描扩散过程来构建潜在表示。

  该模型的动机是,封装图扩散的表示,可以提供比图本身更好的预测基础。图扩散可以表示为矩阵幂级数,提供了一种简单的机制,用于包含有关实体的上下文信息,这些信息可以在多项式时间内计算并在GPU上高效实现。

  优势:
  • 分类准确率:DCNNs在节点分类任务上表现良好,并提供与图形分类任务的基线方法相当的性能。
    【基线是项目储存库中每个工件版本在特定时期的一个“快照”。它提供一个正式标准,随后的工作基于此标准,并且只有经过授权后才能变更这个标准。建立一个初始基线后,以后每次对其进行的变更都将记录为一个差值,直到建成下一个基线。】
  • 灵活的图形数据表示方法:只需很少的预处理即可对节点特征、边缘特征和纯结构信息进行编码。且可用于具有图形数据的各种分类任务,包括节点分类和全图分类。
  • 处理速度快:基于DCNN的预测可以表示为一系列多项式时间张量(tensor)操作,允许使用现有库在GPU上高效地实现模型。

二、模型

  假设有一组图,图形可以是加权的或未加权的、有向的或无向的。图的节点和边分别用一个矩阵表示,且构造一个度归一化矩阵,用于说明在一步中节点i跳到节点j的概率。
  

  • 半监督分类任务:若输入一个图,且节点标签与其他节点有关。
  • 标准监督分类任务:输入图没有边。
  • 监督图分类任务:若输入多个图,且图标签与与每个图都有关。

  DCNNs将图作为输入,返回节点 / 图的标签Y的硬预测或条件分布P(Y |X)。

  节点或图形将被转换为扩散卷积表示,是一个H × F矩阵。若为节点分类任务,图被表示为N × H × F的张量,若为图分类任务,则被表示为H × F矩阵。

  模型基于扩散核的思想建立,当考虑图中任意两个节点之间的所有路径时,较长的路径比较短的路径更容易被忽略。扩散核是节点分类任务的基础。

  DCNN的核心操作是将节点及其特征,映射到,从该节点开始的扩散结果中。与标准CNN相比,DCNN参数与扩散搜索深度有关,而不是在网络中的位置。

  DCNN可应用于没有特征的图输入,将值为1.0的“偏差特征”与每个节点关联起来即可。此外,可以通过添加额外的结构节点特征(如Pagerank或聚类系数)来编码更丰富的结构,这时需要手工工程和预处理。

  DCNN通过反向传播误差的随机小批量梯度下降进行学习。在每个epoch上,节点索引被随机分组为几个批次。每个批次的误差计算方法是,取图定义幂级数的切片,将输入向前传播以预测输出,然后对反向传播的误差进行梯度上升设置权值。若实行“窗口早停”,则当给定epoch的验证误差大于前几次epoch的平均误差时,停止训练。

三、缺点

  不可扩展性:DCNNs可应用于具有数万到数十万个节点的图,但不适用于具有数百万到数十亿个节点的图。内存不够存储张量。

  局部性:DCNNs为节点构造的潜在表示,是基于该节点之后的扩散过程。是一个局部的构造。而无法为单个节点构造潜在表示,或为其他非局部行为之间构造潜在表示。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是用 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
发出的红包

打赏作者

炖鹅小铁锅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值