图神经网络入门
目录图神经网络背后的动机GNN 算法GNN 在 Karate 网络上的实现GNN 的应用GNN 的挑战GNN 研究论文图神经网络背后的动机由于图形能够以可以客观分析的方式表示现实世界,因此如今它们受到了很多关注
目录图神经网络背后的动机GNN 算法GNN 在 Karate 网络上的实现GNN 的应用GNN 的挑战GNN 研究论文图神经网络背后的动机由于图形能够以可以客观分析的方式表示现实世界,因此如今它们受到了很多关注。图可用于表示许多现实世界的数据集,如社交网络、分子结构、地图、网络链接数据、自然科学、蛋白质-蛋白质相互作用网络、知识图等。此外,非结构化数据,如图像文本可以以图形的形式建模。图是对一组对象(节点)及其关系(边)进行建模的数据结构。图分析作为一种独特的机器学习非欧数据结构,侧重于节点分类、图分类、链接预测、图聚类和图可视化等任务。图神经网络 (GNN) 是基于深度学习的方法,可在图域上运行。由于其在涉及非欧空间的现实世界问题中的良好表现,GNN 已成为近来广泛应用的图分析方法。
图神经网络算法一个节点可以用它的特征和图中的相邻节点来表示。GNN 的目标是学习一个状态嵌入,它对每个节点的邻域信息进行编码。状态嵌入用于产生输出,例如预测节点标签的分布。GNNs 是信息扩散机制和神经网络的结合,代表了一组转换函数和一组输出函数。信息扩散机制由节点表示,节点在其中更新其状态,并通过将“消息”传递给其相邻节点来交换信息,直到它们达到稳定的平衡。转换函数以每个节点的特征、每个节点的边缘特征、相邻节点的状态和相邻节点的特征作为输入,输出是节点的新状态。
图 2
空手道俱乐部社交网络上的图神经网络实现
在本节中,让我们看看如何将 GNN 应用于空手道网络,这是一种简单的图网络。
1. 空手道网络资料背景:两个 34×34 矩阵ZACHE 对称,二进制ZACHC 对称,有值。
这些数据是 Wayne Zachary 从大学空手道俱乐部成员那里收集的。ZACHE 矩阵表示俱乐部成员之间是否存在联系;ZACHC 矩阵表示关联的相对强度(发生互动的俱乐部内外情况的数量)。
Zachary (1977) 利用这些数据和网络冲突解决的信息流模型来解释这个群体在成员之间发生纠纷后的分裂。
2.使用的数据
此数据可以转换为 2 个 CSV 文件:
node.csv 存储每个俱乐部成员及其属性。34 名俱乐部成员用“Id”从 0 到 33 表示。他们所在的俱乐部 – Mr Hi(Node id 0) 或 Mr Officer(Node id 1) 用“Club”栏表示。
edge.csv 存储两个俱乐部成员之间的成对交互。权重被赋予由“权重”特征表示的节点 id 之间的这些交互。
Nodes.csv – Self Project
Edges.csv – Self Project
3. 使用 DGL 库进行图形表示:然后我们构建一个图,其中每个节点都是俱乐部成员,每条边代表他们的互动。在 DGL 中,节点是从零开始的连续整数。因此,在准备数据时,重要的是重新标记或重新洗牌行顺序,以便第一行对应于第一个节点,依此类推。在本例中,我们已经按照正确的顺序准备了数据,因此我们可以通过edges.csv 表中的“Src”和“Dst”列创建图形。加载 DGL 图的代码:import dgl
src = edges_data['Src'].to_numpy()
dst = edges_data['Dst'].to_numpy()
# Create a DGL graph from a pair of numpy arrays
g = dgl.graph((src, dst))
出于可视化目的,我们可以将 DGL 图转换为网络图:import networkx as nx
# Since the actual graph is undirected, we convert it for visualization purpose.
nx_g = g.to_networkx().to_undirected()
# Kamada-Kawaii layout usually looks pretty for arbitrary graphs
pos = nx.kamada_kawai_layout(nx_g)
nx.draw(nx_g,pos, with_labels=True)
DGL 图网络
4. 空手道网络上的 GNN 模型训练:将俱乐部特征添加到 DGL 图中:# The "Club" column represents which
community does each node belong to.
# The values are of string type, so we must convert it to either categorical
# integer values or one-hot encoding.
club = nodes_data['Club'].to_list()
# Convert to categorical integer values with 0 for 'Mr. Hi', 1 for 'Officer'.
club = torch.tensor([c == 'Officer' for c in club]).long()
# We can also convert it to one-hot encoding.
club_onehot = F.one_hot(club)
print(club_onehot)
# Use `g.ndata` like a normal dictionary
g.ndata.update({'club' : club, 'club_onehot' : club_onehot})
将边缘特征更新为 DGL 图:# Get edge features from the DataFrame and feed it to graph.
edge_weight = torch.tensor(edges_data['Weight'].to_numpy())
# Similarly, use `g.edata` for getting/setting edge features.
g.edata['weight'] = edge_weight
更新节点嵌入:node_embed = nn.Embedding(g.number_of_nodes(), 5) # Every node has an embedding of size 5.
inputs = node_embed.weight # Use the embedding weight as the node features.
nn.init.xavier_uniform_(inputs)
更新 2 个组长的标签功能 - 0 和 33 ids 为:labels = g.ndata['club']
labeled_nodes = [0, 33]
使用 GraphSage 模型将 GNN 实现为:from dgl.nn import SAGEConv
# build a two-layer GraphSAGE model
class GraphSAGE(nn.Module):
def __init__(self, in_feats, h_feats, num_classes):
super(GraphSAGE, self).__init__()
self.conv1 = SAGEConv(in_feats, h_feats, 'mean')
self.conv2 = SAGEConv(h_feats, num_classes, 'mean')
def forward(self, g, in_feat):
h = self.conv1(g, in_feat)
h = F.relu(h)
h = self.conv2(g, h)
return h
# Create the model with given dimensions
# input layer dimension: 5, node embeddings
# hidden layer dimension: 16
# output layer dimension: 2, the two classes, 0 and 1
net = GraphSAGE(5, 16, 2)
设置损失和优化器并将模型训练为:# in this case, loss will in training loop
optimizer = torch.optim.Adam(itertools.chain(net.parameters(), node_embed.parameters()), lr=0.01)
all_logits = []
for e in range(100):
# forward
logits = net(g, inputs)
# compute loss
logp = F.log_softmax(logits, 1)
loss = F.nll_loss(logp[labeled_nodes], labels[labeled_nodes])
# backward
optimizer.zero_grad()
loss.backward()
optimizer.step()
all_logits.append(logits.detach())
if e % 5 == 0:
print('In epoch {}, loss: {}'.format(e, loss))
输出 :
获得结果为:pred = torch.argmax(logits, axis=1)
print('Accuracy', (pred == labels).sum().item() / len(pred))
输出 :
图神经网络的应用GNN 能够解决的问题 :节点分类:手头的任务是通过利用其邻居的标签来确定节点的标签。通常,这种类型的问题是以半监督的方式训练的,只有一部分图被标记。图分类:该过程是将整个图分为不同的类别。
示例:在生物信息学中确定蛋白质是否为酶,在 NLP或社交网络分析中对文档进行分类。图形可视化:它处理图形的可视化表示,揭示数据中可能存在的结构和异常,并帮助用户理解图形。正如本博客前面提到的,一些可视化图形的方法是网络和 dgl。链接预测:该算法用于理解图中实体之间的关系,并尝试预测两个实体之间是否存在连接。它还可以用于推荐系统和预测犯罪组织。
它在社交网络中用于推断社交互动或向用户推荐潜在朋友。图聚类:这意味着以图的形式对数据进行聚类。有两种不同形式的聚类在图数据顶点和图聚类上执行。顶点聚类是指 根据边权重或边距离将图的节点聚类成一组密集连接的区域。图聚类是将图作为待聚类的对象,根据聚类特征的相似性对这些对象进行聚类。
图神经网络的挑战
1.动态特性——由于 GNN 是动态图,处理具有动态结构的图可能是一个挑战。
2.可扩展性——在社交网络或推荐系统中应用嵌入方法对于包括 GNN 在内的所有图嵌入算法来说在计算上可能很复杂。
3.非结构化数据——GNNs 也难以应用于非结构化场景。为 GNN 寻找最佳图生成方法是一项具有挑战性的任务。
图神经网络研究论文列出了一些论文,以深入了解 GNN 及其在某些应用领域中正在进行的工作——A Comprehensive Survey on Graph Neural Networks. arxiv 2019. https://arxiv.org/pdf/1901.00596.pdfZonghan Wu, Shirui Pan, Fengwen Chen, Guodong Long, Chengqi Zhang, Philip S. Yu.Graph Neural Networks: A Review of Methods and Applications. AI Open 2020. https://doi.org/10.1016/j.aiopen.2021.01.001Jie Zhou, Ganqu Cui, Zhengyan Zhang, Cheng Yang, Zhiyuan Liu, Maosong Sun.Supervised Neural Networks for the Classification of Structures. IEEE TNN 1997. https://ieeexplore.ieee.org/abstract/document/572108Alessandro Sperduti and Antonina Starita.A new model for learning in graph domains. IJCNN 2005. https://www.researchgate.net/profile/Franco_Scarselli/publication/4202380_A_new_model_for_earning_in_raph_domains/links/0c9605188cd580504f000000.pdfMarco Gori, Gabriele Monfardini, Franco Scarselli.Deep Learning on Graphs: A Survey. arxiv 2018.Ziwei Zhang, Peng Cui, Wenwu Zhu.