图神经网络 (GNN)

目录

一、GNN介绍

1.1引入

1.1.1图的介绍

我们以民国最出名的七角恋人物关系图为例进行讲解,如下图所示:

这是一张图,包括人物实体以及人物关系。我们抽象成下面的形式,人物是图的顶点(Vertex)、人物关系是图的边(Edge)。顶点和边都可以附带各自的属性(如:姓名、关系类型等)

  1. V:点,每个点都有自己的特征向量(特征举例:邻居点数量、一阶二阶相似度)
  2. E:边,每个边都有自己的特征向量(特征举例:边的权重值、边的定义)
  3. U:整个图,每个图都有自己的特征向量(特征举例:节点数量、图直径)

1.1.2怎样将内容表示成图

  1. 一张图片可以表示为一个244x244x3的tensor,244x244个像素,3个rgb通道。就可以像下图这样表示,点表示的是像素,边表示的是像素间的邻接关系。
  2. 句子中的每个单词可以表示成一个节点,有向边表示这些单词的链接关系。
    3.分子结构表示成图,每个原子表示成一个节点,原子间的连接键表示成一个边

1.1.4图神经网络是在做什么

目的:整合特征

  1. 为每个节点整合特征向量,根据其对节点做分类或者回归
  2. 为每条边整合特征向量,根据其对边做分类或者回归
  3. 为每张图整合特征向量,根据其对图做分类或者回归

1.2基本概念

GNN 可以理解为是由 Graph(图) + Nerual Networks 组合而成的

  1. 图神经网络(Graph Neural Network,GNN)是一类用于处理图结构数据的深度学习模型。图结构数据中的实体以节点的形式表示,实体之间的关系以边的形式表示。GNN的目标是从图结构数据中学习有用的表示,并利用这些表示进行各种任务,例如节点分类、图分类、链接预测等。
  2. 图神经网络的核心思想是通过消息传递机制(message-passing mechanism)来聚合节点的邻居信息,并更新节点的特征表示。这个过程通常会进行多轮迭代,以便捕获图中更远距离的信息。最终,每个节点的特征表示将包含其邻居和更远节点的信息。
  3. 图神经网络的基本组成部分包括:
    节点特征矩阵:用于表示图中每个节点的初始特征。
    邻接矩阵:用于表示图中节点之间的连接关系。
    图卷积层:用于聚合邻居节点的信息并更新节点特征。
    输出层:根据任务需求设计的输出层,用于输出预测结果。

二、GNN流程

上图中 (1,1,1,1,1) (2,2,2,2,2,) 等,代表节点的特征,这个特征可以是提取到的,也可以是标签,如果没有标签也没有特征,也可以初始化一个特征,做为可训练的变量,参与后续的训练。

2.1聚合

核心思路:将邻居的信息结合到自己身上,作为自己特征的补充

  • 假设现在需要判断A节点的分类,但有时单看A节点自己的特征无法确定其属于哪个类别,从图中可以看出,A节点和B、C、D都有关系,这时B、C、D的特征就可以从一定程度上决定A的类别。 通俗解释:假如现在不知道A是否有钱,但知道他的三个朋友BCD都很有钱,那么就基本上可以判断A也很有钱。
  • 以A节点为例,邻居信息N = a ∗ \ast ∗(2,2,2,2,2) + b ∗ \ast ∗(3,3,3,3,3) + c ∗ \ast ∗(4,4,4,4,4),其中a,b,c是边的权重,假如b对a很重要,则a的值就可以设置的高一些,假如c对a不是很重要,则c的值就可以设置的低一些。

2.2更新

2.2.1一次GNN操作

  • A节点的总特征,就是自己的特征 加上 α \alpha α倍的邻居信息N,再乘权重W,再经过一个激活函数,最终得到的是经过一层GNN操作之后A的最终信息。
  • A的信息= σ \sigma σ(W((1,1,1,1,1)+ α \alpha α ∗ \ast ∗N))
    其中, α \alpha α为激活函数 (relu,sigmoid等),W是模型需要训练的参数

2.3循环

2.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的特征。

2.3.2能做什么

  • 通过聚合更新,我们能够得到每个节点的表达,也就是特征feature,此时:节点分类就可以直接拿去分类,计算loss,优化权重W;关联预测则将两个节点的特征拼接起来,做分类,计算loss,做优化。
    归根到底,GNN就是一个提取特征的方法

三、GNN算法原理

3.1数据

利用networkx简单生成一个无向图

python 复制代码
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个节点的特征向量依次为:

python 复制代码
[[2, 3], [4, 7], [3, 7], [4, 5], [5, 5]]

同样,6条边的特征向量为:

python 复制代码
[[1, 3], [4, 1], [1, 5], [5, 3], [5, 6], [5, 4], [4, 3]]

3.2变量定义

特征向量实际上也就是节点或者边的标签,这个是图本身的属性,一直保持不变。

3.3GNN算法

完整描述如下:Forward向前计算状态,Backward向后计算梯度,主函数通过向前和向后迭代调用来最小化损失。

主函数中:

3.3.1Forward

早期的GNN都是RecGNN,即循环GNN。这种类型的GNN基于信息传播机制: GNN通过不断交换邻域信息来更新节点状态,直到达到稳定均衡。节点的状态向量x由以下fw函数来进行周期性更新:

解释上述公式:

GNN的Forward描述如下:

解释:

3.3.2Backward

在节点嵌入中,我们最终得到了每个节点的表征向量,此时我们就能利用这些向量来进行聚类、节点分类、链接预测等等。

GNN中类似,得到这些节点状态向量的最终形式不是我们的目的,我们的目的是利用这些节点状态向量来做一些实际的应用,比如节点标签预测。

在GNN中,我们定义z(t)如下:


四、GNN优势

相对于传统的神经网络模型,GNN在处理图数据时有一些优势:

  1. 能够学习到节点和边之间的复杂关系。与传统神经网络只能处理类似向量或矩阵的数据不同,GNN天然地适用于处理有复杂关系的数据,如社交网络、蛋白质结构中残基之间的关系等。

  2. 具有很强的泛化性能。不同于传统的机器学习方法,GNN可以在没有预训练的情况下进行端到端的学习和推理。这意味着GNN可以更好地适应广泛的数据和任务,并且可以避免过度拟合。

  3. 涉及节点和边的信息量非常大,对于节点和边上存在多种属性或者情境信息的任务,在GNN中可以很自然地将这些信息进行整合。这些属性可以来自节点和边的语义信息、拓扑信息、上下文信息和其他相关信息。

  4. 强大的可扩展性:GNN已经在多个领域实现预测性能的颠覆,但其最大优势是可扩展性。 我们可以在GNN中添加更多的参数并训练它们以适用于特定的问题。

五、GNN应用

5.1应用领域

5.1.1芯片设计

芯片的设计比较耗费人力和物力,如果可以通过AI算法自动设计芯片,则可以大大提高芯片制造的效率,降低芯片制造的成本

5.1.2场景分析与问题推理

例如剧本杀中的推理,警匪片中嫌疑人的图推理等

5.1.3 推荐系统

例如,刷抖音,经常看英雄联盟的游戏视频,那么说明你对游戏比较感兴趣,系统会根据网络图结构推荐更多和英雄联盟相关的内容给你

5.1.4欺诈检测与风控相关

贷款软件,读取用户的通讯录信息和app使用情况,从而测评用户的还款能力,然后决定用户的借款额度

5.1.5知识图谱

智能客服

5.1.6道路交通的流量预测

预测道路上每条边的流量

5.1.7自动驾驶(无人机等场景)

5.1.8化学,医疗等场景

5.1.9物理模型相关

根据分子结构进行相关分析

5.2GNN在分子生物领域的应用

5.2.1电子健康记录建模

我们可以用图来建立医学本体的模型。下面是一个使用DAG(有向无环图)表示本体的例子

为了利用本体论,我们通过将嵌入的eᵢ与其父节点结合使用,学习出一个为节点cᵢ嵌入的网络gᵢ。为了进行预测,我们将本体知识G与当前访问的xt相乘,并通过神经网络进行传递。例如,它们可以是诊断预测任务或心力衰竭预测任务。

以下是使用t-SNE对不同疾病的最终代表gᵢ的散点图。

5.2.2药物发现和合成化合物

DNN可以训练成千上万的化学结构来编码和解码分子,还可以构建预测因子,根据潜在的表征来估计化学性质。例如,我们可以学习一个自编码器来编码一个分子的图形表示,然后用解码器重建分子。目的是学习一个潜在的表示,最大限度地减少重建损失。我们可以使用这个潜在表示来预测合成可及性和药物与另一个DNN(下面的绿色网络)的相似性。

这些潜在的表达方式允许研究人员在潜在空间中通过扰乱已知的化学结构或插入分子之间的简单操作自动生成新的化学结构。

这是麻省理工学院的另一个项目,将深度学习应用于图形对象,从而发现新的抗生素。

Open Catalyst项目是利用人工智能发现用于可再生能源存储的新催化剂的另一个例子。

相关推荐
搏博32 分钟前
神经网络问题之二:梯度爆炸(Gradient Explosion)
人工智能·深度学习·神经网络
Chef_Chen1 小时前
从0开始学习机器学习--Day33--机器学习阶段总结
人工智能·学习·机器学习
搏博1 小时前
神经网络问题之:梯度不稳定
人工智能·深度学习·神经网络
databook1 小时前
『玩转Streamlit』--布局与容器组件
python·机器学习·数据分析
肖永威2 小时前
CentOS环境上离线安装python3及相关包
linux·运维·机器学习·centos
白光白光3 小时前
量子神经网络
人工智能·深度学习·神经网络
IT古董4 小时前
【人工智能】Python在机器学习与人工智能中的应用
开发语言·人工智能·python·机器学习
机器人虎哥5 小时前
【8210A-TX2】Ubuntu18.04 + ROS_ Melodic + TM-16多线激光 雷达评测
人工智能·机器学习
代码不行的搬运工7 小时前
神经网络12-Time-Series Transformer (TST)模型
人工智能·神经网络·transformer
罗小罗同学7 小时前
医工交叉入门书籍分享:Transformer模型在机器学习领域的应用|个人观点·24-11-22
深度学习·机器学习·transformer