一、 GNN基本概念
GNN 可以理解为是由 Graph(图) + Nerual Networks 组合而成的
图神经网络(Graph Neural Network,GNN)是一类用于处理图结构数据的深度学习模型。图结构数据中的实体以节点的形式表示,实体之间的关系以边的形式表示。GNN的目标是从图结构数据中学习有用的表示,并利用这些表示进行各种任务,例如节点分类、图分类、链接预测等。
图神经网络的核心思想是通过消息传递机制(message-passing mechanism)来聚合节点的邻居信息,并更新节点的特征表示。这个过程通常会进行多轮迭代,以便捕获图中更远距离的信息。最终,每个节点的特征表示将包含其邻居和更远节点的信息。
图神经网络的基本组成部分包括:
节点特征矩阵:用于表示图中每个节点的初始特征。
邻接矩阵:用于表示图中节点之间的连接关系。
图卷积层:用于聚合邻居节点的信息并更新节点特征。
输出层:根据任务需求设计的输出层,用于输出预测结果。
二、 什么是图数据?在图神经网络中,图数据是以什么形式表示的?
图数据是由节点(Node)和边(Edge)组成的数据,最简单的方式是使用邻接矩阵来表示图形结构,从而捕捉图形中的节点和边的相关性。假设图中的节点数为n,那么邻接矩阵就是一个n*n的矩阵,如果节点之间有关联,则在邻接矩阵中表示为1,无关联则为0。在图中,鲁班与其他英雄都没有关联,表现在邻接矩阵当中就是它所在的行与列为全零。
王者荣耀当中的图和邻接矩阵
我们抽象成下面的形式,英雄是图的顶点(Vertex)、英雄关系是图的边(Edge)。顶点和边都可以附带各自的属性(如:关系类型)
V:点,每个点都有自己的特征向量(特征举例:邻居点数量、一阶二阶相似度)
E:边,每个边都有自己的特征向量(特征举例:边的权重值、边的定义)
U:整个图,每个图都有自己的特征向量(特征举例:节点数量、图直径)
而图神经网络就是通过学习数据从而得到3个层面向量的最优表示。
三、 怎样将内容表示成图
一张图片可以表示为一个244x244x3的tensor,244x244个像素,3个rgb通道。就可以像下图这样表示,点表示的是像素,边表示的是像素间的邻接关系。
句子中的每个单词可以表示成一个节点,有向边表示这些单词的链接关系。
分子结构表示成图,每个原子表示成一个节点,原子间的连接键表示成一个边
四、 图神经网络是在做什么
目的:整合特征
为每个节点整合特征向量,根据其对节点做分类或者回归
例:假设一个跆拳道俱乐部里有A、两个教练,所有的会员都是节点。有一天A、B两个跆拳道教练决裂,那么各个学员是愿意和A在一个阵营还是愿意和B在一个阵营?这是节点分类任务。)
为每条边整合特征向量,根据其对边做分类或者回归
例:UFO拳击赛上,首先通过语义分割把台上的人和环境分离开来。赛场上的人都是节点,现在要做一个预测,预测的是这些人之间的关系,是对抗关系?还是观众watch的关系?还是裁判watch的关系?这是边分类任务。
为每张图整合特征向量,根据其对图做分类或者回归
例:分子是天然的图,原子是节点,化学键是边。现在要做一个分类,有一个苯环的分子分一类,两个苯环的分子分一类。这是图分类任务。
五、 GNN流程
上图中 (1,1,1,1,1) (2,2,2,2,2,) 等,代表节点的特征,这个特征可以是提取到的,也可以是标签,如果没有标签也没有特征,也可以初始化一个特征,做为可训练的变量,参与后续的训练。
聚合
核心思路:将邻居的信息结合到自己身上,作为自己特征的补充
假设现在需要判断A节点的分类,但有时单看A节点自己的特征无法确定其属于哪个类别,从图中可以看出,A节点和B、C、D都有关系,这时B、C、D的特征就可以从一定程度上决定A的类别。
通俗解释:假如现在不知道A是否有钱,但知道他的三个朋友BCD都很有钱,那么就基本上可以判断A也很有钱。
以A节点为例,邻居信息N = a ∗ (2,2,2,2,2) + b ∗(3,3,3,3,3) + c ∗ (4,4,4,4,4),其中a,b,c是边的权重,假如b对a很重要,则a的值就可以设置的高一些,假如c对a不是很重要,则c的值就可以设置的低一些。
更新
2.1 一次GNN操作
A节点的总特征,就是自己的特征加上α倍的邻居信息N,再乘权重W,再经过一个激活函数,最终得到的是经过一层GNN操作之后A的最终信息。
A的信息= σ(W((1,1,1,1,1)+ α ∗N))
其中,α为激活函数 (relu,sigmoid等),W是模型需要训练的参数
循环
3.1 多层GNN操作
经过一次聚合后:A中有B,C,D的信息;B中有A,C的信息;C中有A,B,D,E的信息;D中有A,C的信息;E中有C的信息;第二次聚合之后以此类推。GNN层数越多,GNN的“感受野”越大,每个点考虑其他点的信息越多,考虑越全面.
以A节点为例,此时A聚合C的时候,由于C中有上一层聚合得到的E的信息,所以这时A获得了二阶邻居E的特征。
3.2 能做什么
通过聚合更新,我们能够得到每个节点的表达,也就是特征feature,此时:节点分类就可以直接拿去分类,计算loss,优化权重W;关联预测则将两个节点的特征拼接起来,做分类,计算loss,做优化。
归根到底,GNN就是一个提取特征的方法
六、 GNN算法原理
1. 数据
利用networkx简单生成一个无向图
import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
G = nx.Graph()
node_features = [[2, 3], [4, 7], [3, 7], [4, 5], [5, 5]]
edges = [(1, 2), (1, 3), (2, 4), (2, 5), (1, 3), (3, 5), (3, 4)]
edge_features = [[1, 3], [4, 1], [1, 5], [5, 3], [5, 6], [5, 4], [4, 3]]
colors = []
edge_colors = []
# add nodes
for i in range(1, len(node_features) + 1):
G.add_node(i, feature=str(i) + ':(' + str(node_features[i-1][0]) + ',' + str(node_features[i-1][1]) + ')')
colors.append('#DCBB8A')
# add edges
for i in range(1, len(edge_features) + 1):
G.add_edge(edges[i-1][0], edges[i-1][1], feature='(' + str(edge_features[i-1][0]) + ',' + str(edge_features[i-1][1]) + ')')
edge_colors.append('#3CA9C4')
# draw
fig, ax = plt.subplots()
pos = nx.spring_layout(G)
nx.draw(G, pos=pos, node_size=2000, node_color=colors, edge_color='black')
node_labels = nx.get_node_attributes(G, 'feature')
nx.draw_networkx_labels(G, pos=pos, labels=node_labels, node_size=2000, node_color=colors, font_color='r', font_size=14)
edge_labels = nx.get_edge_attributes(G, 'feature')
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_size=14, font_color='#7E8877')
ax.set_facecolor('deepskyblue')
ax.axis('off')
fig.set_facecolor('deepskyblue')
plt.show()
如下图所示:
其中,每一个节点都有自己的一些特征,比如在社交网络中,每个节点(用户)有性别以及年龄等特征。
5个节点的特征向量依次为:
[[2, 3], [4, 7], [3, 7], [4, 5], [5, 5]]
同样,6条边的特征向量为:
[[1, 3], [4, 1], [1, 5], [5, 3], [5, 6], [5, 4], [4, 3]]
2. 变量定义
特征向量实际上也就是节点或者边的标签,这个是图本身的属性,一直保持不变。
3. GNN算法
完整描述如下:Forward向前计算状态,Backward向后计算梯度,主函数通过向前和向后迭代调用来最小化损失。
主函数中:
Forward
早期的GNN都是RecGNN,即循环GNN。这种类型的GNN基于信息传播机制: GNN通过不断交换邻域信息来更新节点状态,直到达到稳定均衡。节点的状态向量x由以下fw函数来进行周期性更新:
解释上述公式:
GNN的Forward描述如下:
解释:
Backward
在节点嵌入中,我们最终得到了每个节点的表征向量,此时我们就能利用这些向量来进行聚类、节点分类、链接预测等等。
GNN中类似,得到这些节点状态向量的最终形式不是我们的目的,我们的目的是利用这些节点状态向量来做一些实际的应用,比如节点标签预测。
在GNN中,我们定义z(t)如下:
七、 GNN优势
相对于传统的神经网络模型,GNN在处理图数据时有一些优势:
能够学习到节点和边之间的复杂关系。与传统神经网络只能处理类似向量或矩阵的数据不同,GNN天然地适用于处理有复杂关系的数据,如社交网络、蛋白质结构中残基之间的关系等。
具有很强的泛化性能。不同于传统的机器学习方法,GNN可以在没有预训练的情况下进行端到端的学习和推理。这意味着GNN可以更好地适应广泛的数据和任务,并且可以避免过度拟合。
涉及节点和边的信息量非常大,对于节点和边上存在多种属性或者情境信息的任务,在GNN中可以很自然地将这些信息进行整合。这些属性可以来自节点和边的语义信息、拓扑信息、上下文信息和其他相关信息。
强大的可扩展性:GNN已经在多个领域实现预测性能的颠覆,但其最大优势是可扩展性。 我们可以在GNN中添加更多的参数并训练它们以适用于特定的问题。
以及
这两篇文章讲的是非常不错的。)