一 图神经网络GNN基础
- 以下都来自网络博客和视频以及自己的理解和整理,感谢这些博主和讲师的分享。欢迎和大家一起讨论,内容难免有些错误,希望大家指出错误,一起学习和成长谢谢
GNN(Graph Neural Network,图神经网络)是一个广泛的概念,指的是一类专门用于处理图结构数据的神经网络模型。
1.1 应用领域
1.1.1 化学医疗
- 药物发现与设计: 图神经网络可以用于分析化合物之间的结构和相互作用关系,从而加速药物发现和设计过程。
- 蛋白质相互作用预测: 图神经网络可以分析蛋白质之间的相互作用关系,从而预测蛋白质的功能和结构。
1.1.2 推荐系统
- 基于用户行为的推荐: 图神经网络可以通过学习用户与物品之间的交互行为,挖掘用户的兴趣和偏好,从而为用户推荐他们可能感兴趣的物品。
- 场景感知推荐: 图神经网络可以通过学习用户与环境之间的关系,实现场景感知推荐。
1.1.3 知识图谱
- 实体链接和实体分类: 图神经网络可以利用实体之间的连接和语义信息,提高实体链接和分类的准确性。
- 问答系统: 图神经网络可以利用知识图谱中实体和关系之间的语义信息,帮助问答系统更好地理解用户的问题并给出准确的答案。
1.1.4 计算机视觉
- 图像分类: 图神经网络可以用于图像分类任务,通过学习图像中像素之间的关系来识别图像中的对象或者场景。
- 目标检测: 图神经网络可以用于目标检测任务,通过学习图像中不同区域之间的关系来检测图像中的物体并确定其位置。
1.1.5 自然语言处理
- 文本分类和情感分析: 图神经网络可以通过构建词语或短语之间的关系图,从而对文本进行分类或者情感分析。
- 语义表示学习: 图神经网络可以用于学习文本中词语、短语或句子之间的语义关系,从而生成更加丰富和语义化的表示。
1.1.6 程序分析
- 代码表示学习: 图神经网络可以将程序表示为图结构,其中节点表示代码中的元素(如函数、变量、语句等),边表示它们之间的关系(如依赖关系、调用关系等)。通过学习代码的图表示,可以捕获代码结构和语义之间的复杂关系,为代码理解和分析提供更加丰富的信息。
- 程序漏洞检测: 图神经网络可以通过学习程序中代码元素之间的关系,发现潜在的程序漏洞和安全风险。
1.1.7 智慧城市
- 城市交通管理: 图神经网络可以分析城市交通数据,包括道路网络、公共交通线路、车辆轨迹等信息,帮助城市管理者进行交通拥堵预测、交通信号优化、路径规划等,从而提升城市交通效率。
- 智能能源管理: 图神经网络可以分析城市能源系统的数据,包括电网、供暖系统、能源消耗等信息,帮助城市管理者进行能源供给预测、能源消耗优化、能源调度等,从而提高能源利用效率和减少能源浪费。
1.2 图的定义
一共三个维度:点、边和全图,我们的目标就是为这三个维度根据邻居关系提取特征,然后根据提取到的特征做分类或者回归。
1.3 图的邻接矩阵
以图像举例,每个像素点周围都有邻居,邻接矩阵就代表各个像素点之间的连接关系 。
化学分子式
GNN (以 GCN 为例)对输入的数据格式没有要求,只要能将输入数据表示成邻接矩阵就行。
1.4 GNN中常见任务
点和边级别的任务
预测这个点是谁,预测这个边在做什么动作,或者预测两个点之间有没有某个边 。
图级别的任务
预测整个图有没有环路等。
1.4 节点特征如何更新
每个点的特征应该既考虑自身的特征,也需要考虑邻居的特征
h i = σ ( ∑ j ∈ N i W j ∗ x j ) 求和 = σ ( ∑ j ∈ N i W j ∗ x j ∣ N i ∣ ) 求平均 = σ ( max j ∈ N i ( { W j ∗ x j } ) ) 求最大值 = σ ( min j ∈ N i ( { W j ∗ x j } ) ) 求最小值 … \begin{aligned} h_i &= \sigma(\sum \limits_{j \in N_i} W_j * x_j) &\qquad\qquad\qquad\qquad\color{gray}求和\\ &= \sigma(\frac{\sum_{j\in N_i} W_j * x_j}{\mid N_i \mid})&\qquad\qquad\qquad\qquad\color{gray}求平均\\ &= \sigma(\max \limits_{j \in N_i}(\{W_j * x_j\}))&\qquad\qquad\qquad\qquad\color{gray}求最大值\\ &= \sigma(\min \limits_{j \in N_i}(\{W_j * x_j\}))&\qquad\qquad\qquad\qquad\color{gray}求最小值\\ &\dots \end{aligned} hi=σ(j∈Ni∑Wj∗xj)=σ(∣Ni∣∑j∈NiWj∗xj)=σ(j∈Nimax({ Wj∗xj}))=σ(j∈Nimin({ Wj∗xj}))…求和求平均求最大值求最小值
1.5 GNN设计流程
1.5.1 提取图结构
首先,我们需要提取出具体应用中的图结构。我们将这些应用分为结构化场景和非结构化场景。
- 在结构化场景下,图结构显式地存在于分子、物理系统、知识图谱等应用中。
- 在非结构化场景下,图结构是隐式的,我们首先需要针对具体任务构图(例如,文本中单词的全连接图,图像的场景图)。
当我们得到图结构后,接下来就需要为其设计最优的 GNN 模型。
1.5.2 图的类别与规模
在得到图结构后,为了设计最优的 GNN 模型,我们需要考虑图的类型和规模。我们可以按照以下正交的标准对图进行分类,我们也可以将这些分类方法组合起来使用:
- 有向图/无向图:有向图中的边从某一个节点指向另一个节点,它能比无向图提供更多的信息。无向图中的边也可以被视为双向边。
- 同构图/异构图:同构图中的节点和边的类型都相同,而异构图中的节点和边则具有多种类型。
- 静态图/动态图:动态图的输入特征或拓扑结构会随时间变化,此时需要考虑时间信息。
就图的规模而言,目前并没有明确的将图分为「小型图」和「大型图」的标准,随着计算设备的发展,这一分类标准也将不断改变。我们通常认为,如果图的邻接矩阵或拉普拉斯矩阵无法在设备上存储、处理,则该图为大规模图,此时我们需要考虑使用某些采样方法。
1.5.3 设计损失函数
与大多数机器学习场景一样,在图学习场景下,我们需要根据任务类型和训练情况涉及损失函数。我们通常需要考虑三类图学习任务:
- 节点级别:此类任务包括节点的分类、回归、聚类等。
- 边级别:此类任务包括边分类和链接预测。边分类旨在确定图中存在的边的类别;链接预测旨在判断图中某两个节点之间是否存在一条边。
- 图级别:此类任务包括图的分类、回归、匹配等任务,它们要求模型学习图的表征。
从监督信号的角度而言,图学习任务涉及以下三种训练设定: - 监督学习:训练使用有标签数据。
- 半监督学习:训练使用少量的有标签节点数据和大量的无标签节点数据。在测试时,转导学习要求模型预测出给定的已见过的无标签节点的标签,而归纳学习则要求模型预测出来自相同分布的无标签节点的标签。大多数节点和边的分类都是半监督学习任务。
- 无监督学习:模型只能利用无标签数据提取模式(例如,节点聚类)。
在明确了任务类型和训练设定后,我们可以为任务设计特定的损失函数。例如,我们可以将交叉熵损失用于节点级的半监督分类任务。
1.5.4 使用计算模块构建图模型
在完成了上述步骤之后,我们可以使用计算模块构建图模型。常用的计算模块包括:
- 传播模块:该模块被用于在节点之间传播信息,聚合得到的信息可以同时捕获特征和拓扑信息。传播模块通常使用卷积操作和循环操作从邻居节点聚合信息,同时也使用跳跃链接操作从历史表征中聚合信息并缓解过平滑问题。
- 采样模块:在处理大型图时,我们通常需要使用采样模块来组织图上的传播过程。
- 池化模块:在表征高层次子图或图的时候,我们需要使用池化模块从节点中提取信息。
我们可以使用上述计算模块构建 GNN 模型。其中,每一层网络中都可以使用卷积操作、循环操作、采样模块和跳跃链接,而池化操作则被用于提取高层次的信息。我们通常将这些网络层堆叠起来,从而获得更好的表征。
根据使用的计算模块,我们可以将现有的 GNN 网络进行如下的分类
二 图卷积GCN模型
2.1 GCN 基本模型概述
下图是一个具体的例子
GCN的主要思想是取所有邻居节点特征(包括自身节点)的加权平均值。度低的节点获得更大的权重。之后,我们将得到的特征向量通过神经网络进行训练
和卷积类似,GCN也可以做多层,每一层的特征输入都是上一层的输出
多层卷积的优点:
-
特征的抽象表示: 多层卷积允许模型逐渐提取数据的抽象特征表示。每一层的卷积操作都能够捕获不同层次的特征,从原始输入中提取更高级别、更抽象的表示。
-
模型的非线性建模: 每一层的卷积操作都通过非线性激活函数引入非线性变换,从而增加了模型的表达能力。这使得模型能够学习更复杂的数据模式和结构。
-
泛化能力和性能提升: 多层卷积可以帮助模型更好地理解数据的层次结构和内在关系,从而提高模型的泛化能力和性能。通过逐渐组合抽象层次的特征表示,模型能够更有效地学习数据的内在规律,并在新的未见数据上表现良好。
-
提高感受野: 每一层的卷积操作都会扩大模型对输入数据的感受野,使模型能够在更大范围内捕获数据的上下文信息。多层卷积可以进一步增加感受野的大小,从而提高模型对整体数据结构的理解能力。
2.2 邻接矩阵
2.2.1 图的邻接矩阵表示
- 邻接矩阵:每个节点的邻居信息
- 特征矩阵:每个节点的自身向量表示
- 度矩阵:每个节点的出边的个数
2.2.2 特征计算方法
邻接矩阵和特征矩阵进行乘法操作,表示聚合邻居信息
2.2.3 邻接矩阵的变换
2.2.3.1 加入节点自身特征
除了考虑邻居的特征,也要考虑自身的特征。
2.2.3.2 考虑度矩阵
左乘度矩阵相当于对行做归一化
D ~ − 1 ( A ~ X ) ( D ~ − 1 A ~ ) X \begin{align} \widetilde{D}^{-1}(\widetilde{A}X) \\ (\widetilde{D}^{-1}\widetilde{A})X \end{align} D −1(A X)(D −1A )X
对列做归一化
D ~ − 1 A ~ D ~ − 1 X \begin{align} \widetilde{D}^{-1}\widetilde{A}\widetilde{D}^{-1}X \end{align} D −1A D −1X
但是这么做相当于对每个值做了两次归一化
D ~ − 1 / 2 A ~ D ~ − 1 / 2 X \begin{align} \widetilde{D}^{-1/2}\widetilde{A}\widetilde{D}^{-1/2}X \end{align} D −1/2A D −1/2X
为什么要这么做呢
上图表示的是一个社交关系的图
图中红色框中的节点,只有一个邻居
如果模型在训练的时候只考虑邻居和自身的特征,不考虑节点的度,那么在计算他的特征时就只能大量利用这个邻居的特征,最后得到的结果是会把红色框中的节点vi和绿色框中的节点vj预测成一类人,这显然不符合常理。
1 d e g ( v i ) ∗ d e g ( v j ) = D ~ − 1 / 2 A ~ D ~ − 1 / 2 X \begin{aligned} \frac{1}{\sqrt{deg(v_i)} * \sqrt{deg(v_j)}} = \widetilde{D}^{-1/2}\widetilde{A}\widetilde{D}^{-1/2}X \end{aligned} deg(vi)