斯坦福-CS224W-图机器学习笔记-全-
斯坦福 CS224W 图机器学习笔记(全)


课程 P1:1.1 - 为什么需要图? 🧩
在本节课中,我们将要学习图(Graph)这一数据结构的重要性,以及为什么它是机器学习和数据分析中一个强大且通用的工具。我们将探讨图如何自然地表示现实世界中各种复杂的关系网络,并理解为什么传统的深度学习方法在处理图数据时会面临挑战。

概述:什么是图?
图是描述和分析具有交互关系的实体的通用语言。这意味着我们不是将世界或特定领域视为一组孤立的数据点,而是从实体之间的网络和关系角度来审视它。
实体之间存在着潜在的关系图,这些实体根据连接或图的结构相互关联。许多类型的数据都可以自然地表示为图,并对这些图形关系进行建模。底层领域的关系结构使我们能够建立更忠实、更准确的模型,以反映数据背后的现象。
图的应用领域
以下是图数据可以发挥重要作用的一些领域示例:
- 计算机网络与基础设施:设备之间的连接和通信。
- 生物与医学网络:基因、蛋白质之间的调控关系,疾病传播途径,神经元连接。
- 物理与化学系统:粒子间的相互作用网络,分子结构(原子为节点,化学键为边)。
- 社交与经济网络:人与人之间的社交关系,经济实体间的交易。
- 信息与知识网络:学术论文间的引用关系,互联网网页链接,知识图谱中的实体关系。
- 计算机科学领域:软件代码的函数调用图(抽象语法树),三维形状的网格表示,场景图中物体间的关系。
在所有这些领域中,图结构是让我们以本质方式建模底层现象的重要组成部分。
图数据的分类
我们思考关系数据的方式是,可以表示为图的数据主要分为两大类:
- 自然图或网络:底层领域本身就是一个图。
- 例如:社交网络、通信网络、大脑神经网络、生物分子相互作用网络。
- 具有关系结构的领域:其关系结构可以用图来建模和表示。
- 例如:通过链接相似数据点创建的图(相似性网络)、分子结构图、三维形状图、基于粒子模拟的物理系统。
这意味着存在许多不同的领域,它们要么本身就是自然图,要么可以自然地建模为图以捕捉其关系结构。
图数据带来的挑战
上一节我们介绍了图在各种领域的广泛应用。本节中我们来看看,为什么处理图数据对现代机器学习工具箱构成了独特的挑战。

今天的深度学习工具箱主要针对简单的数据类型设计,特别是序列(如文本、语音)和网格(如图像)。深度学习方法非常擅长处理这种具有固定尺寸或规则结构的数据。
然而,图网络更难处理,原因如下:
- 任意的大小与复杂的拓扑结构:图没有固定的尺寸或形状,其结构(拓扑)可以非常复杂。
- 缺乏空间局部性:在图像网格中,我们有上下左右的明确概念;在文本序列中,有左右顺序。但在图中,没有这样的参考点或空间局部性概念。
- 没有固定的节点顺序:节点的排列顺序不是固定的,这给许多需要固定输入顺序的深度学习操作带来了困难。
- 动态性与多模态特征:图通常是动态变化的(随时间演变),并且节点和边可能具有多种类型的特征信息。
因此,在本课程中,我们将重点讨论如何开发更广泛适用的神经网络,特别是能够处理像图这样复杂数据类型的神经网络。关系数据图是深度学习和表示学习的新前沿。
图表示学习的目标

我们想要构建的神经网络,能够接收图作为输入,并输出各种预测。这些预测可以发生在不同层级:
- 在单个节点的级别(例如,用户分类)。
- 在节点对或边的级别(例如,链接预测)。
- 在整个图的级别(例如,图分类或生成新图)。
关键问题是:如何设计神经网络架构,使其能够端到端地处理图数据? 这意味着无需大量人工特征工程。
传统机器学习方法需要精心设计特征来捕获数据结构。本课程将聚焦于表示学习,即自动从图数据中学习有效的特征表示。具体来说,表示学习的目标是学习一个映射函数:
f(node) -> embedding_vector
该函数将图中的每个节点映射到一个 d 维的实数向量(称为嵌入或表示)。目标是使图中相似的节点在嵌入空间中的向量也彼此接近。
本课程大纲
我们将探讨图结构数据的机器学习和表示学习的多个主题:
- 传统图机器学习方法:如图核方法。
- 节点嵌入方法:如 DeepWalk、Node2Vec 等。
- 图神经网络:我们将深入探讨流行的图神经网络架构,如图卷积网络、GraphSAGE 和图注意力网络。
- 图神经网络的理论与扩展:包括其表达能力和扩展到大规模图的技术。
- 高级主题与应用:在课程后半部分,我们将讨论异构图、知识图谱及其在逻辑推理中的应用(如 TransE、BetaE 等方法),图的深度生成模型,以及在生物医学、科学和工业(如推荐系统、欺诈检测)领域的应用。
本课程将持续约十周,共 20 节课,涵盖上述所有核心主题。
总结

本节课中,我们一起学习了图作为一种通用数据表示语言的重要性。我们看到了图在众多领域的自然存在,理解了图数据因其任意大小、复杂结构和缺乏固定顺序而带来的独特挑战。最后,我们明确了本课程的核心目标:通过图表示学习和图神经网络,开发能够自动、高效处理复杂关系数据的机器学习方法,从而在节点、边和图级别做出更准确的预测。


课程P11:4.2 - PageRank 如何求解? 🔍

在本节课中,我们将学习如何实际计算PageRank向量 r。我们将介绍一种名为“幂迭代”的有效方法,并探讨在计算过程中可能遇到的问题及其解决方案。
幂迭代法
上一节我们介绍了PageRank的基本方程。本节中我们来看看如何通过迭代过程求解这个方程。
核心思想是:给定一个有 n 个节点的图,我们通过一个迭代过程来逐步更新排名向量 r。
以下是算法的基本步骤:
- 初始化:为每个节点分配一个初始的PageRank分数。可以均匀分配,也可以随机分配。
- 迭代更新:重复应用更新公式,直到向量
r的变化足够小。 - 收敛判断:比较当前估计
r^(t)和上一轮估计r^(t-1)。如果向量中所有元素的变化总和小于一个预设的极小值ε,则认为算法已收敛。
具体的迭代方程可以写作:
r^(t+1) = M * r^(t)
其中 M 是图的列随机邻接矩阵。
这个方程保证了迭代最终会收敛到矩阵 M 的主特征向量,即我们想要的PageRank向量。在实践中,大约进行50次迭代即可得到稳定的解。
潜在问题与挑战
虽然幂迭代法看起来简单有效,但在实际应用中会遇到两个主要问题。
1. 死胡同
死胡同是指那些没有出链的网页。在随机游走模型中,一旦到达死胡同节点,游走者将无处可去,导致重要性“泄漏”,最终所有节点的PageRank分数都可能收敛到零。
2. 蜘蛛陷阱
蜘蛛陷阱是指一组节点,其所有出链都指向组内节点(例如一个自循环)。随机游走者一旦进入这个组,就会被困住,最终该组会吸收网络中几乎所有的重要性,导致排名结果不合理。
解决方案:随机传送(Teleport)
为了解决上述问题,我们引入“随机传送”机制。其核心思想是:在每一步,随机游走者有两个选择。
以下是随机游走者的行为规则:
- 以概率
β(通常设为0.8到0.9),随机游走者沿着当前节点的出链前进。 - 以概率
1 - β,随机游走者“传送”到网络中的任何一个随机页面(包括当前页面),每个页面被选中的概率相同,均为1/n。
这个机制通过以下方式解决问题:
- 解决蜘蛛陷阱:即使游走者进入蜘蛛陷阱,它也有一定概率通过传送跳出来,从而避免了重要性被单一节点或群组垄断。
- 解决死胡同:对于死胡同节点,我们可以将其视为以概率1进行传送(即强制跳转到随机页面),从而保证了转移矩阵的列随机性,使数学计算得以成立。
引入随机传送后,PageRank的更新公式变为:
r_j = β * Σ_{i→j} (r_i / d_i) + (1 - β) / n
这个公式可以写成矩阵形式:
G = βM + (1 - β) * (1/n) * ee^T
其中 e 是全1的列向量。新的迭代方程为:
r = G * r
我们依然可以使用幂迭代法在这个新的随机矩阵 G 上进行计算。
实例演示
让我们通过一个简单的例子来看随机传送的效果。假设有一个包含蜘蛛陷阱的图,设置 β = 0.8。
经过多次幂迭代后,PageRank分数会收敛到一个稳定分布。结果显示,即使存在蜘蛛陷阱,由于传送机制,所有节点仍然会获得非零的重要性分数,但蜘蛛陷阱节点的重要性不会无限膨胀。
在一个更复杂的图中,PageRank的结果会呈现出一些有趣的特性:
- 即使是没有入链的节点,也会因为传送机制而获得少量重要性。
- 从一个重要节点获得一个入链,比从多个不重要节点获得入链更能提升自身的重要性。
- PageRank分数综合考量了入链的数量和质量。
总结
本节课中我们一起学习了如何求解PageRank。


- 我们介绍了幂迭代法,这是一种通过矩阵乘法迭代来高效计算PageRank向量的方法。
- 我们探讨了计算中可能遇到的死胡同和蜘蛛陷阱问题。
- 我们引入了随机传送机制作为通用解决方案,并给出了更新后的PageRank公式
r = G * r。 - 最终,我们看到了PageRank如何综合考虑链接的数量与质量,从而为网页给出合理的全局重要性评分。这种方法数学优美,且能扩展到包含数百亿节点的大型网络图上进行计算。


课程 P12:4.3 - 随机重启游走与个性化PageRank 🚶♂️➡️🔄

在本节课中,我们将要学习PageRank算法的两个重要扩展:个性化PageRank和随机重启游走。我们将了解它们如何解决传统PageRank的局限性,并应用于像推荐系统这样的实际问题中。
概述
上一节我们介绍了经典的PageRank算法。本节中,我们将探讨其扩展形式,这些形式通过改变“传送”行为,使得算法能够衡量图中特定节点集之间的相关性或接近度,这在诸如商品推荐等场景中非常有用。
为什么需要扩展?🤔
假设我们有一个用户和物品(如电影、商品)构成的二分图。用户与物品之间的连线表示用户购买或观看了该物品。
问题:如何衡量图中两个不同物品之间的相关性或接近度,以便向用户推荐商品?
一个简单的想法是测量最短路径。路径越短,相关性越高。然而,这种方法忽略了“共同邻居”的数量和路径的多样性。例如,两个物品如果被同一批用户购买,它们可能比仅由一条短路径连接的两个物品更相关。
我们需要一个指标,既能考虑路径长度,也能考虑连接路径的数量和强度。PageRank的扩展概念恰好能解决这个问题。
个性化PageRank与随机重启游走
在经典PageRank中,随机游走者以均匀概率传送到图中的任何节点。
个性化PageRank 对此进行了修改:传送目标不再是所有节点,而是一个特定的节点子集 S。这意味着游走者只对这部分节点感兴趣。
随机重启游走 是个性化PageRank的一个特例,其中传送子集 S 只包含一个节点(通常是起始节点或查询节点)。每当游走者决定传送时,它总是跳回这个起始节点。
核心公式/关系:
- 经典PageRank:传送集 S = 所有节点。
- 个性化PageRank:传送集 S = 节点的特定子集。
- 随机重启游走:传送集 S = {单个查询节点}。
从数学上讲,这三种算法使用相同的框架(如幂迭代)求解,主要区别在于传送向量(teleport vector)的定义。
随机重启游走的工作原理
让我们通过一个二分图(用户-物品)的例子来理解。假设我们的查询节点集 Q 只包含一个物品节点。
以下是模拟随机重启游走的步骤:
- 从查询节点 Q 开始。
- 随机选择一条边,游走到一个相邻的用户节点。
- 从该用户节点,再随机选择一条边,游走到一个物品节点。
- 增加该物品节点的“访问计数”。
- 抛一个有偏硬币:以概率 α 选择“重启”,跳回查询节点 Q;以概率 1-α 选择“继续”,从当前物品节点重复步骤2-4。
- 重复此过程多次。
伪代码描述:
初始化:当前节点 = 查询节点Q
循环 多次:
从当前节点随机游走一步到邻居节点
如果当前节点是物品节点:
增加该物品的访问计数
以概率 α:
当前节点 = 查询节点Q # 重启
否则:
继续游走
最终,访问计数越高的物品节点,被认为与查询节点 Q 越接近、越相关。
方法的优势
这种方法在衡量节点相似性方面具有多个良好特性:
以下是其主要优势:
- 考虑多重路径:不仅考虑最短路径,还计算节点之间所有可能路径的贡献。
- 衡量连接强度:路径上的节点度数会被考虑。连接数多的节点(枢纽)会分散游走者的概率,从而降低其对特定目标节点的重要性贡献。
- 实现简单:既可以通过物理模拟随机游走实现,也可以通过矩阵运算(幂迭代)精确计算。
- 可扩展性强:适用于大规模网络。
总结与课程回顾
本节课中我们一起学习了PageRank算法的扩展。
总结核心要点:
- 经典PageRank:随机游走者均匀传送到所有节点,用于衡量全局重要性。
- 个性化PageRank:游走者只传送到特定的节点子集 S,用于衡量相对于该子集的重要性。
- 随机重启游走:个性化PageRank的特例,传送集 S 仅为单个节点,用于衡量图中其他节点与该特定节点的接近度或相关性。
这些算法共享相同的数学基础:将图表示为矩阵,定义随机游走过程(包括随机移动和传送),然后求解随机冲浪者的极限分布,该分布即代表了节点的重要性排名。


我们看到了三种等价的直觉:线性代数(特征向量问题)、随机过程(随机游走)和网络流(投票模型)。它们都导向相同的解决方案和算法,为我们提供了强大而灵活的工具来分析网络中的节点关系。


课程 P13:4.4 - 矩阵分解与节点嵌入 📊

在本节课中,我们将学习节点嵌入与矩阵分解之间的深刻联系。我们将看到,基于随机游走的节点嵌入方法,本质上可以归结为对图的邻接矩阵(或其某种变换形式)进行分解。理解这种联系,有助于我们从更统一的数学视角来看待各种图嵌入算法。
从节点嵌入到矩阵分解 🔄
上一节我们介绍了节点嵌入的基本框架,即通过编码器-解码器结构,最大化相似节点对之间的嵌入点积。本节中,我们来看看如何将这一目标形式化为一个矩阵分解问题。
我们的目标是学习一个嵌入矩阵 Z,其维度为 (d, |V|),其中 d 是嵌入维度,|V| 是节点数。矩阵 Z 的每一列 z_v 存储了节点 v 的嵌入向量。
在编码器-解码器框架中,我们希望最大化相似节点对的嵌入点积。如果我们采用最简单的相似性定义:两个节点相似当且仅当它们之间存在一条边,那么我们的目标就变为:用嵌入向量的点积来近似图的邻接矩阵 A。
具体来说,对于任意节点对 (u, v):
- 如果
(u, v)之间存在边(即A[u, v] = 1),我们希望z_u^T * z_v ≈ 1。 - 如果
(u, v)之间无边(即A[u, v] = 0),我们希望z_u^T * z_v ≈ 0。
将这个目标用矩阵形式表达,我们就是在尝试近似:
A ≈ Z^T * Z
这被称为矩阵分解,因为我们试图将邻接矩阵 A 分解为两个矩阵 Z^T 和 Z 的乘积。由于嵌入维度 d 通常远小于节点数 |V|,这个等式通常无法精确成立。因此,我们的目标是找到一个矩阵 Z,使得 Z^T * Z 在某种度量下尽可能接近 A,常用的度量是弗罗贝尼乌斯范数(即矩阵元素差值的平方和)。
因此,结论是:基于边连通性(即邻接矩阵)的节点相似性定义,配合内积解码器,等价于对邻接矩阵 A 进行分解。
更复杂的相似性与矩阵分解 🧩
上一节我们讨论了最简单的基于边的相似性。本节中我们来看看,当我们使用更复杂的、基于随机游走的相似性定义时,情况会如何。
事实证明,基于随机游走的节点嵌入方法(如 DeepWalk、node2vec)同样可以统一到矩阵分解的框架下。区别在于,此时我们分解的不再是原始的邻接矩阵 A,而是它的一个变换矩阵。
以下是 DeepWalk 方法对应的矩阵分解形式:
log(vol(G) / b * (∑_{r=1}^T (D^{-1} A)^r) D^{-1}) ≈ Z^T * Z
其中:
- A 是邻接矩阵。
- D 是度矩阵(对角矩阵)。
- T 是随机游走的长度(即上下文窗口大小)。
- vol(G) 是图的体积(所有节点度之和)。
- b 是负采样中使用的负样本数量。
这意味着,通过模拟随机游动并进行梯度下降来优化节点嵌入,在数学上等价于分解上述这个经过复杂变换的矩阵。这个结论将 DeepWalk、node2vec 等多种算法统一到了一个数学框架中。
当前方法的局限性 🚧
通过矩阵分解或随机游走学习节点嵌入的方法虽然强大,但也存在一些明显的局限性。了解这些局限性有助于我们理解为何需要更先进的图表示学习方法。
以下是当前方法的主要局限:
- 无法处理新节点:这些方法是直推式的。它们只能为训练时图中存在的节点生成嵌入。如果图是动态的,出现了新节点,我们必须为全图重新计算所有嵌入,这非常低效。
- 无法捕捉结构等价性:这些方法更关注节点的邻居身份,而非节点的局部网络结构。例如,两个在不同子图中具有完全相同局部连接结构的节点,可能会得到完全不同的嵌入,因为它们的邻居ID不同。
- 无法利用节点、边及图的特征:这些方法仅从图的结构(连接关系)中学习嵌入,无法自然地融合节点自身附带的特征向量(如用户属性、蛋白质特征)、边特征或整个图的全局特征信息。

总结与展望 📝
本节课中我们一起学习了以下内容:
- 我们从最简单的基于边的相似性出发,揭示了节点嵌入与矩阵分解之间的等价关系:用内积解码器近似邻接矩阵
A ≈ Z^T * Z。 - 我们进一步了解到,更复杂的基于随机游走的嵌入方法(如 DeepWalk)同样可以视为对邻接矩阵的某种变换进行矩阵分解。
- 最后,我们讨论了这些方法的局限性,包括无法泛化到新节点、难以捕捉结构相似性,以及无法利用丰富的特征信息。

这些局限性正是我们接下来要学习的图神经网络所要解决的核心问题。图神经网络能够以归纳的方式学习节点表示,融合结构与特征信息,从而为更复杂、更动态的图学习任务提供强大的解决方案。


课程 P14:5.1 - 消息传递与节点分类 🧠

在本节课中,我们将要学习如何利用网络中的关联性,通过消息传递的框架来预测未标记节点的类别。这是一种半监督的节点分类方法,它结合了节点的自身特征和其邻居节点的标签信息。
概述
我们面临的问题是:给定一个部分节点带有标签(例如,可信或欺诈)的网络,如何预测其余未标记节点的标签?核心思想是,网络中相连的节点往往具有相似的标签,这种现象被称为同质性或影响力。我们将利用这种关联性,通过三种经典技术——关系分类、迭代分类和置信度传播——来迭代地更新和推断节点的标签。
网络中的关联性
上一节我们介绍了问题的背景,本节中我们来看看为何网络中会存在标签的关联性。个体行为在网络结构中通常是相关的,这意味着相邻的节点往往拥有相同的标签或属于同一类别。这主要由两种社会现象驱动:
- 同质性:指具有相似特征的个体倾向于彼此建立联系。例如,研究同一领域的研究人员更可能合作。
- 影响力:指社会连接会影响个体的特征或行为。例如,朋友之间会相互影响音乐品味。
这两种现象导致了网络中“物以类聚”的效应,即连接在一起的节点标签相似。这正是我们进行节点分类算法设计的基础直觉。
集体分类框架
基于上述关联性,我们采用“集体分类”的框架。其核心假设是:一个节点的标签取决于其自身特征以及其邻居节点的标签。这是一个概率框架,并遵循马尔可夫假设,即一个节点的标签仅依赖于其直接邻居的标签。
集体分类方法包含三个关键组成部分:
- 局部分类器:用于为未标记节点分配初始标签,仅基于节点自身的属性,不利用网络信息。
- 关系分类器:用于捕捉节点间的关联性,基于节点邻居的标签或属性来预测该节点的标签。这里开始利用网络结构。
- 集体推理:迭代地应用关系分类器,在整个网络上传播标签信息,直到预测结果稳定或达到最大迭代次数。
方法一:关系分类
首先,我们来看第一种具体方法——关系分类。这是一种概率性方法,它直接利用邻居节点的标签分布来预测当前节点的标签。
其基本思路是:初始化所有未标记节点的标签(例如,使用局部分类器或随机初始化)。然后,我们迭代地扫描所有未标记节点,基于其已标记邻居的当前标签,按照以下公式更新其属于某类别 c 的概率:
P(Y_v = c) = (1 / |N(v)|) * Σ_{u ∈ N(v)} P(Y_u = c)
其中,N(v) 表示节点 v 的邻居集合。简单来说,节点 v 属于类别 c 的概率是其邻居节点属于类别 c 的平均概率。
以下是算法步骤的简述:
- 将所有已标记节点的标签概率设为 1(对于其真实类别)或 0。
- 初始化所有未标记节点的标签概率(例如,均匀分布或基于局部分类器)。
- 按随机顺序遍历未标记节点,根据其所有邻居的当前概率,使用上述公式计算其属于每个类别的概率。
- 将节点
v的标签更新为概率最高的类别。 - 重复步骤 3 和 4,直到所有节点的标签不再变化,或达到最大迭代次数。
需要注意:此方法可能不收敛,特别是当图中存在“标签冲突”的邻居结构时。它更适用于同质性很强的网络。
方法二:迭代分类
上一节介绍的关系分类器直接使用邻居标签。迭代分类方法则更为通用,它通过构建一个包含节点自身特征和邻居标签摘要的增强特征向量来进行分类。
其核心思想是:我们训练一个分类器(如逻辑回归、神经网络),其输入特征不仅包括节点自身的属性 f_v,还包括从其邻居标签中聚合而来的统计信息 z_v。
以下是构建邻居摘要特征 z_v 的一些常见方法:
- 邻居中不同标签的计数。
- 邻居中最常见标签(众数)。
- 邻居标签的列表(需定长编码)。
迭代分类算法分为两个阶段:
阶段1:训练
- 使用已标记节点的数据,训练两个分类器:
- Φ1(f_v):仅基于节点自身特征
f_v预测标签。 - Φ2(f_v, z_v):基于节点自身特征
f_v和邻居标签摘要z_v预测标签。计算z_v时需要已知邻居的真实标签。
- Φ1(f_v):仅基于节点自身特征
阶段2:迭代推理
- 使用分类器 Φ1 为所有未标记节点预测初始标签
Y_v。 - 基于当前所有节点的预测标签
Y,为每个节点计算邻居摘要特征z_v。 - 使用分类器 Φ2(f_v, z_v) 为所有节点(或仅未标记节点)更新预测标签
Y_v。 - 重复步骤 2 和 3,直到所有节点的标签稳定,或达到最大迭代次数。
这种方法更灵活,可以融入更复杂的邻居聚合函数和分类模型。
方法三:置信度传播
最后,我们介绍置信度传播。这是一种在概率图模型中进行精确推理的流行方法。它将节点分类问题转化为在由网络构成的“马尔可夫随机场”中传递“消息”并进行概率推断的问题。
BP 的核心是迭代地在相连的节点之间传递“消息”。消息 m_{i->j}(Y_j) 可以理解为节点 i 基于其自身信息,对节点 j 应该属于标签 Y_j 的“意见”或“支持度”。
每个节点 v 都会维护一个“置信向量” b_v(Y_v),表示当前认为该节点属于各个标签的概率。置信度通过以下方式更新:
- 考虑节点自身的局部证据(由其特征得出)。
- 综合来自所有邻居节点传递来的消息。
算法流程简述如下:
- 初始化:将所有已标记节点的标签固定(对应类别置信度为1),未标记节点的置信度初始化为均匀分布或先验概率。所有消息初始化为1。
- 迭代传播:
- 每个节点
i计算并向外发送给每个邻居j的消息。消息综合了i自身的局部证据和来自i的其他邻居(除了j)的消息。 - 公式化表示(简化版):
m_{i->j}(Y_j) ← Σ_{Y_i} [Ψ(Y_i, Y_j) * φ(Y_i) * Π_{k ∈ N(i)\j} m_{k->i}(Y_i)]Ψ(Y_i, Y_j):节点i和j之间的势函数,编码了它们标签一致性的强度(同质性假设)。φ(Y_i):节点i的局部证据(来自节点特征)。
- 每个节点
- 置信度计算:在所有消息传递一轮后,每个节点根据来自所有邻居的消息和自身局部证据更新其置信向量
b_v(Y_v)。 - 重复步骤2和3,直到消息和置信度的变化小于某个阈值。
- 预测:对于每个未标记节点
v,选择使其置信度b_v(Y_v)最大的标签Y_v作为预测结果。
BP 的优点是在树状结构网络上能保证收敛并计算出精确的边缘概率。在一般图中,它作为近似推断算法也通常非常有效。
总结
本节课中我们一起学习了半监督节点分类的核心思想与方法。我们了解到,利用网络中存在的同质性,可以通过消息传递来推断未标记节点的标签。
我们详细介绍了三种经典的集体分类技术:
- 关系分类:直接根据邻居的标签概率来更新当前节点标签,简单直观但可能不稳定。
- 迭代分类:通过构建包含邻居摘要的特征向量,使用标准分类器进行迭代预测,灵活性更高。
- 置信度传播:基于概率图模型框架,通过在节点间迭代传递消息来更新置信度,具有坚实的概率基础。


这些方法为理解更现代的图神经网络奠定了重要基础。在图神经网络中,消息传递、邻居聚合等概念将以可学习、端到端的方式得到更强大的实现。



课程 P15:5.2 - 关系与迭代分类 🧠

在本节课中,我们将学习两种重要的图节点分类方法:关系分类和迭代分类。这两种方法都利用网络结构信息来预测未标记节点的标签,但它们在利用信息的方式上有所不同。我们将首先介绍关系分类,它仅使用节点标签和网络结构;然后探讨迭代分类,它进一步结合了节点的特征信息。
关系分类 🔗
上一节我们概述了课程内容,本节中我们来看看关系分类。关系分类的核心思想是:一个节点的类别概率,是其邻居节点类别概率的加权平均值。
这意味着,对于已标记的节点,我们固定其真实标签。对于未标记的节点,我们初始化其类别信念(例如,假设属于某个类别的概率为0.5)。然后,节点会根据其网络邻居的标签信念,迭代更新自身对类别的信念,直到收敛。请注意,此方法仅使用节点标签和网络结构,不使用节点自身的属性特征。
以下是更新节点信念的核心公式:
设节点 v 属于类别 c 的概率为 P(Y_v = c)。其更新公式为:
P(Y_v = c) = (1 / Σ_{u∈N(v)} w_{vu}) * Σ_{u∈N(v)} [w_{vu} * P(Y_u = c)]
其中:
N(v)是节点v的邻居集合。w_{vu}是连接节点v和u的边的权重(对于无权图,可视为1)。P(Y_u = c)是邻居u属于类别c的概率。
公式解读:节点 v 属于类别 c 的概率,是其所有邻居属于类别 c 的概率的加权平均(并进行归一化)。这基于一个基本假设:网络中相连的节点更可能共享相同的标签。
关系分类工作流程示例
以下是关系分类在一个简单图上的迭代过程:
-
初始化:
- 标记节点(如绿色、红色)固定其真实标签概率(例如,绿色节点为1,红色节点为0)。
- 未标记的灰色节点初始化其属于绿色类的概率为0.5。
-
迭代更新:
- 按一定顺序(例如节点ID顺序)更新每个未标记节点的概率。
- 每个节点根据上述公式,计算其邻居当前概率的加权平均,作为自身新的概率。
- 已标记节点的概率保持不变。
-
收敛:
- 重复迭代更新步骤,直到所有节点的概率变化很小或不再变化(即收敛)。
- 最终,根据节点的最终概率(例如,大于0.5判为绿色,否则为红色)进行分类预测。
通过这种迭代,标签信息从已标记节点“传播”到未标记节点,最终完成对整个图的分类。
迭代分类 🔄
上一节我们介绍了仅使用标签和网络的关系分类,本节中我们来看看更强大的迭代分类。迭代分类的主要思想是:对一个节点 v 进行分类时,不仅依据其自身的属性特征 f_v,还依据其邻居节点的标签摘要 z_v。
这种方法结合了节点特征信息和网络结构信息。其工作流程分为两个阶段:分类器训练阶段和迭代应用阶段。
第一阶段:训练分类器
在此阶段,我们需要利用已标记的训练数据训练两个分类器:
-
基础分类器 φ₁:该分类器仅基于节点自身的特征向量
f_v来预测其标签Y_v。可以使用任何分类模型,如逻辑回归、支持向量机或神经网络。# 伪代码示例:训练基础分类器 phi1 = train_classifier(X_features=train_node_features, y_labels=train_node_labels) -
关系分类器 φ₂:该分类器的输入有两部分:
- 节点自身的特征向量
f_v。 - 邻居标签摘要向量
z_v。这个向量总结了节点v的邻居们的标签分布情况(例如,邻居中属于各类别的数量或比例)。
# 伪代码示例:训练关系分类器 # 首先为每个训练节点计算其邻居标签摘要 Z Z_summary = compute_neighbor_label_summary(graph, current_node_labels) # 然后使用特征和摘要一起训练 phi2 = train_classifier(X_features_and_summary=[train_node_features, Z_summary], y_labels=train_node_labels) - 节点自身的特征向量
第二阶段:迭代分类(在测试集/未标记节点上)
训练好分类器后,我们对未标记的节点进行如下迭代预测:
- 初始化:使用基础分类器 φ₁ 为所有未标记节点预测一个初始标签。
- 迭代直至收敛:
a. 计算摘要:根据图中节点当前的标签(对于已标记节点是真实标签,对于未标记节点是上一轮的预测标签),为每个节点重新计算其邻居标签摘要向量z_v。
b. 重新分类:使用关系分类器 φ₂(输入为节点特征f_v和新的摘要z_v)为每个节点重新预测标签。
c. 检查收敛:如果节点的预测标签不再变化,或达到最大迭代次数,则停止;否则,回到步骤 (a)。
这个过程通过不断整合邻居的最新预测信息,来优化每个节点自身的分类结果。
迭代分类示例:网页主题分类
假设我们有一个网页链接图,任务是预测每个网页的主题(类别)。
- 节点特征
f_v:可以表示网页内容中的关键词向量。 - 邻居标签摘要
z_v:可以设计为一个向量,表示指向该网页的链接(入边)和该网页指向外部的链接(出边)中,各类别网页的数量。例如:
z_v = [入边中类别0的数量, 入边中类别1的数量, 出边中类别0的数量, 出边中类别1的数量]
工作流程:
- 首先,用 φ₁ 根据网页内容词向量预测其主题,得到初始标签。
- 然后,进入迭代阶段:
- 基于当前所有网页的标签,计算每个网页的
z_v(即其入链和出链网页的主题分布)。 - 用 φ₂(考虑自身词向量
f_v和链接主题分布z_v)重新预测每个网页的主题。 - 重复此过程。例如,一个网页如果内容模糊,但所有指向它的链接都来自“体育”主题的网页,那么迭代后它很可能也被分类为“体育”。
- 基于当前所有网页的标签,计算每个网页的
总结 📝

本节课中我们一起学习了两种基于图的集体分类方法。
- 关系分类:该方法通过迭代方式,让节点根据其邻居的类别概率来更新自身的类别概率。它只利用了网络结构和节点标签,实现简单,适用于没有节点特征信息的场景。
- 迭代分类:这是一种更通用的框架。它通过训练两个分类器,在分类时同时考虑节点自身的特征和其邻居的标签分布。通过迭代地更新邻居信息并重新分类,能够更有效地结合网络信息和内容信息,通常能获得比关系分类更好的性能。

这两种方法都体现了网络数据中“物以类聚”的基本思想,即相连的节点很可能具有相似的属性或标签,是图机器学习中的重要基础技术。


课程 P16:5.3 - 集体分类 🧠

在本节课中,我们将要学习集体分类的第三种核心方法:信念传播。我们将了解它如何通过节点间传递“信念”信息来协同预测标签,并探讨其在树状结构和带环图上的应用。

概述 📋
上一节我们介绍了迭代分类,它结合了节点特征和邻居标签。本节中,我们将探讨一种基于概率图模型的方法——信念传播。这种方法的核心思想是,节点通过与邻居交换关于其可能标签的“信念”信息,迭代地更新自身判断,最终达成全局一致的分类结果。
信念传播的基本思想 💡
信念传播是一种动态规划方法,用于回答图中的概率查询,例如计算某个节点属于特定类别的概率。这是一个迭代过程,节点之间相互传递信息。
节点 v 会告诉它的邻居:“我相信你属于某个类别的可能性如下。” 然后,一个节点会收集来自所有邻居的这些信念,综合这些信息来更新自己对自身类别的确信程度。当这些信息在网络中传递并逐渐稳定时,我们就得到了每个节点标签的最优估计。
从简单图开始:线图计数 🔢
为了理解消息传递的基本操作,我们首先在一个简单的线图上完成一个任务:计算图中的节点总数。假设每个节点只能与直接邻居交互。
我们定义节点的顺序,例如从节点1到节点6。消息传递从节点1开始,向节点6方向进行。
- 每个节点会监听来自其“上游”邻居的消息。
- 节点会更新这个消息(例如,将计数值加1,代表自己),然后将其传递给下一个“下游”邻居。
用 m 表示消息。过程如下:
- 节点1发送消息
m = 1(只有自己)给节点2。 - 节点2收到
m=1,更新为m = 1 + 1 = 2,发送给节点3。 - 节点3收到
m=2,更新为m = 2 + 1 = 3,发送给节点4。 - 以此类推,当消息到达节点6时,其值为6,即图中节点的总数。
这个例子展示了信念传播的核心操作:节点收集来自邻居的消息,进行处理和更新,然后将新的消息发送出去。
推广到树状结构 🌳
同样的算法可以应用于树状结构。关键在于消息需要从叶子节点开始,向根节点传递。
以下是消息在树中传递的步骤:
- 叶子节点(如节点5、6、7)初始化自己的消息(例如,
m=1),发送给它们的父节点(节点2、3)。 - 父节点收集所有子节点传来的消息,将这些值求和,并加上自身(
+1),然后将新的消息值发送给它们的父节点。 - 这个过程递归进行,直到根节点。根节点最终的消息值就是整棵树的节点总数。
在树结构上,由于没有环,消息来自互不相交的子树,因此信念传播算法是精确且收敛的。
循环信念传播算法 🔁
现在,我们将上述思想形式化,并推广到一般图,此时的算法称为“循环信念传播”。
我们需要定义几个核心概念:
- 标签-标签势矩阵 (ψ):这个矩阵捕获节点与其邻居在标签上的依赖关系。矩阵中的元素
ψ(Y_i, Y_j)表示在已知节点i的标签为Y_i的条件下,节点j的标签为Y_j的可能性。如果图中存在同质性(相连节点倾向于相同标签),则该矩阵对角线上的值会很高。 - 先验信念 (φ):函数
φ(Y_i)表示节点i属于标签Y_i的先验概率。 - 消息 (m):消息
m_{i->j}(Y_j)表示节点i认为节点j属于标签Y_j的“信念”。
以下是算法的核心步骤:
1. 初始化
将所有消息初始化为1。
2. 迭代更新消息
对于图中的每条边 (i, j),节点 i 发送给节点 j 的消息按以下公式计算:
m_{i->j}(Y_j) = α * Σ_{Y_i} [ ψ(Y_i, Y_j) * φ_i(Y_i) * Π_{k ∈ N(i)\j} m_{k->i}(Y_i) ]
其中:
α是归一化常数。Σ_{Y_i}是对节点i所有可能的标签求和。Π_{k ∈ N(i)\j}是乘积符号,表示对节点i的所有邻居k(除了节点j)传来的消息进行连乘。
这个公式的含义是:节点 i 综合了自身的先验信念 φ、它与节点 j 的关联强度 ψ,以及来自其他所有邻居 k 的信念 m_{k->i},来形成它对节点 j 标签的判断 m_{i->j}。
3. 计算最终信念
当消息传递收敛(或达到预设迭代次数)后,对于每个节点 i,其属于标签 Y_i 的最终信念 b_i(Y_i) 为:
b_i(Y_i) = α * φ_i(Y_i) * Π_{j ∈ N(i)} m_{j->i}(Y_i)
即,节点自身的先验信念与所有邻居传来消息的乘积。
处理图中的环 ⭕
上一节我们介绍了在树上的精确传播,本节中我们来看看当图存在环时会遇到什么挑战。
如果图中有环,消息可以在环中循环传递。这可能导致两个问题:
- 理论收敛性:算法可能无法保证收敛。
- 信念放大:消息在环中循环时,可能人为地放大某些信念。例如,一个关于“某节点为真”的微弱信念,在环中传递一圈后,可能被错误地强化为强信念,因为节点收到了来自环上不同路径的、本质上是同一来源的重复信息。
然而在实践中,许多真实世界的网络(如社交网络、引用网络)虽然存在环,但环的数量相对较少,且环往往较长(即环的周长很大)。这使得环内消息的相关性较弱,信念强度在循环中会衰减,因此“循环信念传播”仍然是一个非常有效的启发式方法。
方法总结与对比 📊
本节课中,我们一起学习了如何利用图中的关联性进行节点预测。我们共介绍了三种技术:
以下是三种集体分类方法的对比:
- 关系分类:我的标签是我邻居标签的函数(如多数投票)。它利用了网络结构,但不使用节点自身的特征信息。
- 迭代分类:我的标签基于我自身的特征向量
z,以及我邻居的标签摘要。它同时使用了节点特征和邻居标签,但仍主要依赖于同质性假设。 - (循环)信念传播:通过标签-标签势矩阵
ψ来建模节点间的依赖关系。其过程是收集来自邻居的消息,转换它们,并发送新的消息。该方法在树状图上是精确的。在带环图上,虽然存在理论挑战,但由于真实网络中的环通常影响较弱,它仍是一种强大且通用的半监督节点分类方法。
信念传播的优点:
- 易于编程实现和并行化。
- 通用性强,可以定义复杂的势函数(不限于同质性)。
- 在实践中,对于复杂网络非常有效。
信念传播的挑战:
- 在带环图上不能保证收敛。
- 势函数
ψ需要从数据中估计或学习。


通过本课程,你已经掌握了集体分类的核心范式,从简单的基于邻居的方法,到结合特征的迭代方法,再到基于概率消息传递的信念传播。理解这些方法的原理和适用场景,将帮助你为实际的图节点分类任务选择合适的技术。

课程 P17:6.1 - 图神经网络简介 🧠

在本节课中,我们将要学习图神经网络的基本概念。我们将了解为什么需要图神经网络,它与之前学习的浅层节点嵌入方法有何不同,以及它如何帮助我们处理更复杂的图结构数据。


概述
到目前为止,我们一直在讨论节点嵌入。其核心思想是将图中的节点映射到一个D维的嵌入空间中,使得图中相似的节点在嵌入空间中也彼此靠近。我们的目标是学习一个函数 f,它接收一个图作为输入,并为每个节点生成一个位置嵌入。
我们曾在编码器-解码器框架中考虑过这个问题。我们希望网络中节点的相似性(表示为 similarity(u, v))能够匹配它们在嵌入空间中的相似性(例如,通过点积 z_u^T z_v 来衡量)。因此,给定一个输入网络,我们希望通过计算嵌入来编码节点,使得如果网络中的节点相似,它们在嵌入空间中也相似。
在之前的节点嵌入框架中,有两个关键组件:
- 编码器:将每个节点
v映射到一个低维向量z_v。 - 相似性函数(解码器):指定向量空间中的关系如何映射回原始网络中的关系。
我们的目标是训练编码器,使得当我们解码嵌入时,能够恢复网络中的相似性。
浅层编码的局限性
之前我们讨论的是浅层编码。这是学习编码器最简单的方法,编码器本质上只是一个嵌入查找表。这意味着我们直接学习一个矩阵 Z,其中每一列对应一个节点的嵌入。
以下是这种方法的局限性:
- 参数数量庞大:模型需要学习的参数数量与图中的节点数量成正比(即
O(|V| * d))。对于大型图,参数空间会变得极其巨大。 - 缺乏参数共享:每个节点都必须学习自己独特的嵌入,计算开销大。
- 缺乏归纳能力:这是一种直推式学习。我们只能为训练阶段见过的节点生成嵌入,无法为未见过的节点生成嵌入,也无法将学到的嵌入迁移到另一个图上。
- 未利用节点特征:许多图具有附加在节点上的特征属性,而浅层方法(如DeepWalk、node2vec)无法自然地利用这些信息。
深度图编码器:图神经网络
为了解决上述问题,本节我们将介绍深度图编码器,即图神经网络。
其核心思想是:节点 v 的嵌入 z_v 是基于图结构,通过多层非线性变换计算得到的。我们现在要考虑真正的深度神经网络,以及它们如何通过信息的多层非线性传播来生成最终的嵌入。
重要的是,所有这些深度编码器都可以与第三讲中提到的节点相似性函数(解码器)相结合。我们可以训练编码器来解码节点标签,这意味着我们可以直接以端到端的方式训练这些模型。
直观地说,我们将开发深度神经网络:
- 输入:图结构、节点特征、边信息。
- 处理:通过多层非线性变换在网络中传递信息。
- 输出:节点嵌入、子图嵌入、节点对嵌入等,可用于各种预测任务。
这种端到端的训练方式(从右侧的标签一直反向传播到左侧的图结构)使得模型是任务无关的,可以应用于多种任务,例如:
- 节点分类
- 链接预测
- 社区检测
- 图相似性比较
为什么需要图神经网络?🤔

这很有趣,但也颇具挑战。传统的深度学习工具箱是为简单的数据类型设计的:
- 固定大小的网格(如图像,可表示为固定大小的矩阵)。
- 线性序列(如文本、语音,可表示为链式图)。
然而,许多现实世界的数据无法用这两种简单形式表示。图神经网络允许我们将表示学习应用于更复杂的数据类型。
处理图数据之所以困难,是因为图具有以下复杂性:
- 任意大小:图可以包含任意数量的节点和边。
- 复杂的拓扑结构:图没有像网格那样的空间局部性概念。
- 没有参考点或固定顺序:图中没有“左上角”或“右下角”,也没有像文本中那样的“左”和“右”的固定方向。
- 动态性:图通常是动态变化的。
- 多模态特征:节点和边可以具有多种类型的特征。
正如在第一节课中展示的,在许多领域和用例中,图是表示底层数据和关系的正确方式,而这些数据无法简单地用固定大小的矩阵或线性序列来表示。
总结

本节课中,我们一起学习了图神经网络的基本动机和概念。我们回顾了浅层节点嵌入方法的局限性,并引出了深度图编码器——图神经网络。图神经网络通过多层非线性变换聚合图结构和节点特征信息,能够生成更强大、可归纳的节点表示,并能以端到端的方式应用于各种图分析任务。它扩展了深度学习的能力,使其能够处理具有复杂、非欧几里得结构的图数据。


深度学习基础教程 P18:6.2 - Basics of Deep Learning 🧠
在本节课中,我们将学习深度学习的基础概念。我们将从机器学习的基本框架开始,逐步深入到深度神经网络的核心思想,包括损失函数、优化方法以及反向传播算法。这些知识是理解后续更复杂模型(如图神经网络)的基石。


机器学习作为优化问题 🤖
我们将监督学习视为一个优化问题。其核心思想是:给定输入 x,目标是预测或产生输出标签 y。x 可以有多种表示形式,例如实数向量、序列(如自然语言)、矩阵(如图像)或图结构数据。
我们的目标是学习一个函数 f,将输入 x 映射到标签 y。我们将这个学习过程表述为一个优化问题:函数 f 由一组参数 θ 参数化,我们的目标是找到能使预测值与真实值之间差异(即损失)最小的 θ。
损失函数 L 用于量化预测值与真实值之间的差异。例如,在回归任务中,常用 L2 损失(均方误差)。在分类任务中,则常用交叉熵损失。
损失函数与优化目标 📉
我们定义损失函数来衡量单个数据点的预测质量。总损失则是所有训练样本损失的总和。我们的优化目标是找到模型参数 θ,使得总损失最小化。
以下是一个常见的损失函数示例——交叉熵损失,它常用于多类分类任务。
假设我们有 5 个类别,使用独热编码表示真实标签 y。模型输出 f(x) 是一个经过 Softmax 函数处理的概率分布,表示属于每个类别的预测概率。交叉熵损失的计算公式如下:
公式:
L = - Σ [y_i * log(f(x)_i)],其中求和遍历所有类别 i。
损失值越低,表示预测概率分布越接近真实的独热编码分布。
梯度下降与参数优化 📈
为了最小化损失函数,我们使用梯度下降法。梯度是一个向量,指示了函数在给定点上升最快的方向。为了最小化损失,我们沿着梯度的反方向更新参数。
基础梯度下降的更新公式为:
公式:
θ_new = θ_old - η * ∇L(θ_old)
其中,η 是学习率,控制更新步长。∇L(θ_old) 是损失函数在 θ_old 处的梯度。
在实际训练中,我们通常不会在梯度为零时(即陷入局部最小值)才停止,而是根据模型在独立验证集上的性能是否停止提升来决定是否终止训练。
随机梯度下降与小批量处理 ⚡
计算整个数据集的精确梯度(批量梯度下降)成本高昂,尤其对于大型数据集。因此,我们采用随机梯度下降。
其核心思想是:每次迭代时,我们不使用全部数据,而是随机抽取一个小子集(称为小批量)来计算损失和梯度。这大大加快了优化速度。
以下是几个关键概念:
- 小批量:用于计算梯度的数据子集。
- 批量大小:每个小批量中包含的数据点数量。
- 迭代:处理一个小批量并更新一次参数。
- 周期:完整遍历一遍整个训练数据集。
SGD 使用小批量梯度作为全数据集梯度的无偏估计。虽然需要仔细调整学习率,但它是深度学习优化的核心,后续许多高级优化器(如 Adam)都基于此思想改进。
反向传播与自动求导 🔄
在深度学习中,预测函数 f 可能非常复杂(例如深度神经网络)。手动计算梯度极其困难。反向传播算法利用链式法则,可以自动、高效地计算损失函数关于所有模型参数的梯度。
其工作原理是:
- 前向传播:输入
x通过网络层层计算,得到最终输出和损失值。 - 反向传播:从损失值开始,逆向应用链式法则,将梯度从输出层逐层传播回输入层,计算出损失关于每一层参数的梯度。
现代深度学习框架(如 PyTorch、TensorFlow)实现了自动微分,使得我们只需定义前向计算图,框架会自动处理反向传播过程,极大简化了模型开发。
从线性模型到深度网络 🏗️
简单的线性层组合(如 f(x) = W2 * (W1 * x))本质上仍是线性模型。为了增加模型的表达能力,我们在线性变换之间引入非线性激活函数。
常见的激活函数包括:
- ReLU:
g(a) = max(0, a) - Sigmoid:
g(a) = 1 / (1 + exp(-a))
通过将线性变换与非线性激活函数交替堆叠,就构成了多层感知机,这是深度神经网络的基本构建块。网络越深,其表示能力通常越强。
核心流程总结 🎯
本节课我们一起学习了深度学习的基本流程:

- 定义模型:构建一个由参数
θ定义的预测函数f,它可以是一个简单的线性层,也可以是多层感知机等复杂网络。 - 定义损失:根据任务(回归、分类等)选择合适的损失函数
L。 - 准备数据:从数据集中抽取小批量样本
{x, y}。 - 前向传播:将小批量输入
x送入模型,计算得到预测输出和损失值。 - 反向传播:利用链式法则(通常由框架自动完成),计算损失关于模型参数
θ的梯度∇L(θ)。 - 参数更新:使用随机梯度下降法,沿梯度反方向更新参数:
θ = θ - η * ∇L(θ)。 - 循环迭代:重复步骤 3-6,遍历多个周期,直到模型在验证集上的性能满意为止。

掌握了这些基础知识后,在接下来的课程中,我们将探讨如何将这些概念应用于图结构数据,并学习图神经网络的基本架构。


课程 P19:6.3 - 图的深度学习 V2 🧠

在本节课中,我们将要学习如何将深度神经网络推广到图结构数据上,即图神经网络。我们将从基本概念出发,理解如何利用图的结构来定义神经网络的计算图,并学习如何通过聚合邻居信息来生成节点嵌入。
背景与设置
上一节我们介绍了神经网络的基本概念。本节中,我们来看看如何将其推广到图结构上。
我们假设有一个图 G,它包含:
- 一组节点(顶点)V。
- 一个邻接矩阵 A。为简化起见,我们假设它是二元的,表示一个无向、无权图(但方法可推广到有向图)。
- 每个节点 v 关联一个特征向量 x_v。这可以是用户画像、基因表达谱等信息。如果没有节点特征,常用做法是使用独热编码向量或全1向量,有时也会使用节点度数作为特征。
- 用 N(v) 表示节点 v 的邻居集合。
为何不能直接使用邻接矩阵?
一个朴素的想法是:直接将邻接矩阵 A 与节点特征拼接,作为神经网络的输入。但这种方法存在几个关键问题:
- 参数过多:输入维度与节点数相关,导致参数量巨大,容易过拟合。
- 无法处理可变大小图:模型输入尺寸固定,难以适应不同节点数的图。
- 对节点顺序敏感:同一个图可以有多种邻接矩阵表示(取决于节点编号顺序),而模型无法识别这种等价性。图数据没有固定的节点排序。
因此,我们需要一种对节点顺序不变(置换不变)的方法。
核心思想:借鉴卷积,推广到图
卷积神经网络在图像上的成功在于其滑动窗口操作:一个中心像素从其邻居像素聚合信息,经过变换后生成新的像素值。
我们的目标是将这一思想推广到复杂的图上:
- 将图中的节点视为中心。
- 节点的邻域定义了其信息聚合的范围。
- 通过聚合(Aggregate)邻居的信息,并结合自身信息进行变换(Transform),来生成节点的新表示(嵌入)。
这个过程可以看作是一个消息传递机制:节点从其邻居接收信息,聚合并转换后,再传递给下一层。
计算图与神经网络架构
图神经网络可以看作一个两步过程:
- 为每个目标节点确定其计算图。该计算图基于目标节点周围的网络邻域结构(如k跳内的邻居)定义。
- 在这个计算图上进行信息的传播与转换。
关键洞察:
- 每个节点的计算图(即神经网络结构)由其局部网络结构唯一决定。
- 结构相似的节点(如对称节点)会拥有相似的计算图。
- 因此,我们实际上是在同时训练多个不同结构的神经网络,但这些网络共享相同的变换参数。
基础模型:邻域聚合与嵌入更新
现在,我们来看看计算图中的“黑盒”里具体发生了什么。核心是邻域聚合函数,它必须是置换不变的(例如求和、求平均)。
一个基础的图神经网络层操作如下:
设 h_v^(l) 为节点 v 在第 l 层的嵌入。初始层(第0层)的嵌入即节点特征:h_v^(0) = x_v。
从第 l 层到第 l+1 层的更新公式为:
h_v^(l+1) = σ ( W_self * h_v^(l) + W_neigh * MEAN( { h_u^(l), for u in N(v) } ) )
其中:
- MEAN 是聚合函数(此处为求平均),保证了置换不变性。
- W_self 和 W_neigh 是可学习的权重矩阵,用于转换节点自身信息和聚合后的邻居信息。
- σ 是非线性激活函数(如ReLU)。
这个公式的含义是:节点新的嵌入由其自身上一层的嵌入和邻居上一层的聚合嵌入共同决定,经过线性变换和非线性激活后得到。
矩阵形式与高效计算
为了高效计算,我们可以将上述操作写成矩阵形式。
令 H^(l) 为第 l 层所有节点嵌入堆叠而成的矩阵。
令 D 为度矩阵(对角矩阵,D_ii = 节点 i 的度数)。
令 A 为邻接矩阵。
那么,对所有节点的邻居信息求平均这一操作,可以表示为:D^(-1) A H^(l)。
因此,单层更新的矩阵形式可写为:
H^(l+1) = σ ( A_hat * H^(l) * W^(l) )
其中 A_hat 是包含了自连接的归一化邻接矩阵(例如 D^(-1/2) (A+I) D(-1/2)**),**W(l) 是该层可学习的权重矩阵。这种形式便于利用稀疏矩阵乘法进行高效实现。
模型训练
模型参数(各层的 W 矩阵)通过最小化损失函数来学习。训练可以在有监督或无监督设置下进行。
有监督训练
当节点带有标签时(例如,社交网络中用户的类别,分子网络中原子的类型),我们可以直接使用这些标签进行监督训练。
损失函数(例如交叉熵损失):
L = - Σ [ y_v * log(σ(z_v^T θ)) + (1 - y_v) * log(1 - σ(z_v^T θ)) ]
其中:
- y_v 是节点 v 的真实标签。
- z_v = h_v^(L) 是图神经网络最后一层(第 L 层)输出的节点嵌入。
- θ 是分类层的权重参数。
- σ 是sigmoid函数。
通过反向传播和随机梯度下降优化这个损失,可以同时更新分类权重 θ 和图神经网络内部的聚合/变换参数 W。
无监督训练
当没有节点标签时,我们可以利用图结构本身作为监督信号。例如,使用随机游走等方法来定义节点的“相似性”(如Node2Vec中的思想)。
损失函数可以设计为:让在随机游走中共现的节点(相似节点),其嵌入向量的点积更大。
L = - Σ_{(u,v) in walks} log(σ(z_u^T z_v))
通过优化此类损失,模型可以学习到保留图结构信息的节点嵌入。
归纳能力与模型泛化
图神经网络有一个强大的特性:归纳学习能力。
- 参数共享:所有节点共享相同的聚合与变换参数(W 矩阵)。
- 参数数量与图大小无关:参数量只取决于嵌入维度和特征维度,与图中节点数无关。
这意味着:
- 训练完成后,模型可以为训练时未见过的节点生成嵌入,只需根据该节点的新邻域进行前向传播即可。
- 模型可以跨图迁移。在一个图上训练好的模型(学到了通用的聚合变换规则),可以应用到另一个结构相似的图上。
这对于演化网络、大规模图或需要在多个相似领域应用模型的任务来说,是一个极其重要的优势。
总结
本节课中,我们一起学习了图神经网络的基础:
- 核心思想:通过聚合目标节点的邻居信息来生成其节点嵌入,这是一个消息传递过程。
- 关键结构:每个节点的计算图由其局部网络邻域定义,实现了“图结构即神经网络架构”。
- 基础操作:介绍了最基本的邻域聚合(平均)与变换的更新公式 h_v^(l+1) = σ ( W_self * h_v^(l) + W_neigh * MEAN( { h_u^(l) } ) ) 及其矩阵形式。
- 模型训练:模型可以在有监督(使用节点标签)或无监督(使用图结构相似性)的设置下进行训练。
- 重要特性:图神经网络具有归纳能力,参数在所有节点间共享且与图规模无关,因此能够泛化到未见过的节点和图。


下一节课,我们将探讨更强大的图神经网络框架(如图注意力网络),它们使用更灵活的聚合方式(如基于注意力的加权聚合)来进一步提升模型性能。


课程 P2:1.2 - 图机器学习的应用 🚀

在本节课中,我们将学习图机器学习在不同领域的具体应用。我们将看到图模型如何被用于解决从蛋白质结构预测到药物发现等一系列复杂且具有重大影响的实际问题。

概述
图机器学习可以制定不同层次的任务,包括节点级、边级、子图级和图级任务。通过在不同层次应用图模型,我们可以解决众多领域的实际问题。接下来,我们将逐一探讨这些任务层次及其对应的代表性应用。
节点级任务应用

上一节我们介绍了图任务的不同层次,本节中我们首先来看看节点级任务的应用。节点级任务通常指节点分类,即预测图中单个节点的性质。
蛋白质折叠问题
一个近期取得重大突破的节点级应用是蛋白质折叠问题。蛋白质是调节生物过程的分子,其功能依赖于其复杂的三维结构。生物学中长期存在的一个挑战是:仅根据氨基酸序列预测蛋白质的三维结构。

在2022年12月,DeepMind的AlphaFold系统将蛋白质结构预测的准确性大幅提升至90%以上,解决了这一重大科学难题。其核心思想是将蛋白质表示为空间图:
- 节点:代表氨基酸。
- 边:代表在空间上彼此接近的氨基酸对。
通过训练图神经网络来预测每个氨基酸节点的空间位置,从而模拟出整个蛋白质的折叠结构。这是一个典型的节点级预测任务。
边级任务应用

在理解了节点级预测后,我们转向边级任务。边级任务的核心是链路预测,旨在理解节点对之间的关系。
以下是边级任务的两个重要应用:
推荐系统

推荐系统可以建模为用户与物品(如商品、电影)之间的交互图。这是一个二部图,包含用户节点和物品节点。边表示用户与物品之间的交互行为(如购买、点击)。
该任务的目标是学习节点(用户和物品)的嵌入表示,使得相关的节点(例如用户可能喜欢的物品)在嵌入空间中彼此更接近。许多公司(如Pinterest、LinkedIn)的现代推荐系统都基于这种图表示学习和图神经网络。
药物副作用预测
许多患者同时服用多种药物,药物组合可能产生未知的副作用。由于药物组合数量庞大,无法全部通过实验测试。
该问题可以通过构建一个异构网络来形式化:
- 节点:药物(三角形)和人体内的蛋白质(圆形)。
- 边:
- 药物与靶点蛋白质之间的作用。
- 蛋白质与蛋白质之间的相互作用。
- 已知的由两种药物共同服用导致的副作用。
任务目标是预测图中缺失的“药物-药物-副作用”边,即预测任意两种药物组合可能产生的新副作用。基于图的方法可以高精度地预测出未被记录在官方数据库中的潜在副作用,并通过医学文献得到验证。
子图级与图级任务应用
接下来,我们探讨涉及更大范围结构的任务,即子图级和图级任务。
交通预测(子图级)
谷歌地图等应用的预计到达时间(ETA)功能使用了图机器学习。在该模型中:
- 节点:表示道路段。
- 边:表示路段之间的连接。

系统基于历史交通模式数据,训练图神经网络来预测从起点到终点整条路径(一个子图)的旅行时间。这是一个在实际生产中广泛应用的子图级预测任务。

药物发现与生成(图级)
在图级任务中,我们可以对整张图进行分类或生成新的图。
1. 分子性质预测与药物发现
分子可以被表示为图,其中原子是节点,化学键是边。图神经网络可以对分子图进行分类,预测其是否具有治疗效果(如抗菌性),从而在数十亿候选分子中快速筛选出有潜力的药物进行后续实验验证。
2. 分子生成与优化
图生成模型可以有针对性地创造全新的分子图结构,例如生成具有高溶解度或低毒性的分子。此外,它还可以对已知分子进行优化,修改其结构以增强某种特定性质。
物理模拟(图级)
在物理领域,图模型可用于模拟材料的变形。方法是将材料表示为一组粒子,并根据粒子间的邻近关系构建图。
- 根据粒子当前位置构建邻近图。
- 使用图神经网络,基于粒子当前的位置和速度属性,预测其下一时刻的位置和速度。
- 更新粒子状态,并基于新的位置重新构建图,重复迭代。
这种方法能够实现快速且精确的基于物理的仿真。
总结


本节课中,我们一起学习了图机器学习在不同任务层级上的广泛应用。我们看到,从预测蛋白质结构的节点分类,到推荐系统和药物副作用预测的链路分析,再到交通预测的子图级任务,以及药物发现和物理模拟的图级任务,图模型为解决科学和工程领域的复杂问题提供了强大而统一的框架。这些应用充分展示了图机器学习技术的巨大潜力和实际影响力。

课程 P20:7.1 - 图神经网络(GNN)概述 🧠

在本节课中,我们将学习图神经网络(GNN)的通用框架。我们将回顾其核心思想,并深入探讨如何从数学上形式化一个深度图编码器。课程将涵盖GNN的关键设计组件,包括单层定义、多层堆叠方式、计算图的构建以及训练目标的选择。

上一节我们回顾了图神经网络的基本直觉,即每个节点根据其网络邻域定义一个计算图。本节中,我们来看看如何从数学上形式化这一过程,并理解其设计空间。
深度图编码器的目标 🎯
我们的目标是构建一个深度图编码器。它以图作为输入,通过一系列非线性变换(即深度神经网络),产生可用于预测的输出。这些预测可以在节点级别、子图级别或节点对级别进行。
图神经网络的核心组件 ⚙️
基于之前的讨论,图神经网络的核心思想是将底层网络视为计算图。当我们想对网络中某个节点(例如一个红色节点)进行预测时,首先需要基于该节点周围的网络邻域构建一个计算图。这个计算图的结构就定义了图神经网络的结构。
信息(或消息)通过网络中的边进行传播和转换,从一个邻居聚合到另一个邻居,最终汇聚到中心节点。这使得中心节点能够基于聚合的信息做出预测或生成嵌入表示。直觉上,每个节点都利用神经网络来聚合其邻居的信息。
因此,网络中的每个节点都可以定义一个多层神经网络结构,这个结构依赖于以该节点为中心的图结构。例如,节点B会从它的邻居节点A和C获取信息。这个神经网络中的转换过程由参数控制,从而使整个方法生效。
关键在于,网络邻域定义了一个计算图。图中的每个节点都基于其邻域获得自己独特的神经网络架构。
图神经网络的通用框架 🏗️
有了上述快速回顾,现在我们来讨论通常如何定义图神经网络,它们的组成部分是什么,以及如何在数学上形式化这些组件。

在这个通用框架中,主要有两个方面需要考虑。

1. 单层定义:消息与聚合
不同的架构(如图卷积网络GCN、图注意力网络GAT等)的区别在于它们如何定义“消息”和“聚合”这两个核心概念。

- 消息(Message):指在边上传播和转换的信息。
- 聚合(Aggregation):指将来自邻居的消息汇集到中心节点的操作。
因此,转换(消息) 和 聚合 是构建图神经网络单层的两个核心操作。
2. 多层堆叠:层间连接性
第二组操作是关于如何将多个图神经网络层堆叠在一起。我们是简单地按顺序堆叠这些层,还是添加跳跃连接(Skip Connections)等机制?这定义了层与层之间的连接性,是架构设计的重要部分。
3. 计算图的构建:图增强
第三个重要的设计决策是如何创建计算图。我们是直接使用输入图作为计算图,还是对其进行增强?这可能包括特征增强(例如添加节点特征),或图结构操作(例如采样或添加虚拟节点)。本节课将介绍这些概念,后续课程会深入细节。
4. 训练目标与任务
第四个设计领域是目标函数和任务类型。我们如何训练这个网络?是使用监督学习、无监督学习还是自监督学习?任务是在节点级别、边级别还是整个图级别进行预测?这些选择决定了模型的学习目标。
以下是图神经网络设计空间的五个关键部分总结:
- 单层设计:如何定义消息传递和聚合操作。
- 层间连接:如何堆叠和连接多个网络层。
- 图增强:如何构建和增强用于计算的基础图。
- 训练目标:针对何种任务(节点/边/图级别)进行训练。
- 目标函数:使用何种学习目标(监督/无监督等)。

总结 📝

本节课中,我们一起学习了图神经网络(GNN)的通用视角。我们首先明确了构建深度图编码器的目标。然后,我们回顾了GNN的核心直觉:每个节点根据其邻域定义独特的计算图。接着,我们深入探讨了GNN的通用框架,将其分解为四个关键的设计组件:单层的消息与聚合定义、多层的堆叠与连接方式、计算图的构建与增强方法,以及训练任务与目标函数的选择。理解这个设计空间是灵活构建和运用各种图神经网络模型的基础。



课程 P21:7.2 - 图神经网络单层详解 🧠
在本节课中,我们将学习图神经网络(GNN)单层的核心构成。我们将深入探讨消息传递与聚合机制,并了解几种经典GNN架构(如GCN、GraphSAGE、GAT)是如何在这一统一框架下构建的。最后,我们还会介绍如何将现代深度学习技术(如批归一化、Dropout、激活函数)融入GNN层中,以提升模型性能。
单层GNN的定义与核心思想
首先,我们来讨论如何定义图神经网络的单层。
一个GNN单层包含两个核心组件:消息转换 和 消息聚合。不同的GNN架构主要在这些操作的设计上存在差异。
单层GNN的核心思想是:将来自邻居节点(即“子节点”)的一组向量信息进行压缩,并通过聚合操作将其融合。我们将这个过程分为两步:消息转换和消息聚合。
消息转换与聚合的基本流程
上一节我们介绍了单层GNN的核心思想,本节中我们来看看其具体流程。
想象一下,在网络的底层,我们有一组输入。我们的目标是从每个邻居节点获取信息,将其转换,然后将这些转换后的消息聚合成一条信息,传递给上一层。
我们可以这样理解:节点 v 从上一层的三个邻居那里接收信息(用圆圈表示),同时它自身也拥有来自上一层的嵌入信息 h_v^(l-1)。我们的目标是将这些信息结合起来,生成节点 v 在当前层 l 的新嵌入 h_v^(l)。
这里有两个关键细节需要注意:
- 来自邻居的信息是一个集合,聚合这些信息的顺序应该是无关的(置换不变性)。因为图中节点的邻居没有特定的顺序。
- 我们需要结合来自邻居的信息 和 节点自身的信息,以生成新的节点表示。
现在,让我们更精确地定义这些操作。
消息计算
消息计算是第一个操作。它接收上一层节点的表示,并通过某种变换将其转换为一条“消息”,这条消息将被发送给邻居节点。
一个简单的消息转换例子是线性变换:
m_u = W * h_u^(l-1)
其中 W 是一个可学习的权重矩阵。这就是一个简单的线性层。
消息聚合
消息聚合的直觉是:每个节点聚合来自其所有邻居的转换后消息。
以下是聚合函数的一些例子(它们都是置换不变的):
- 求和:
sum({m_u for u in N(v)}) - 平均:
mean({m_u for u in N(v)}) - 最大值:
max({m_u for u in N(v)})
一个具体的实现方式是,节点 v 在 l 层的嵌入是其邻居转换后消息的总和:
h_v^(l) = sum( W * h_u^(l-1) for u in N(v) )
融入节点自身信息
目前的设计存在一个问题:节点 v 自身的上一层信息 h_v^(l-1) 在计算新嵌入时可能丢失。
为了解决这个问题,我们通常采用两种策略:
- 使用不同的变换矩阵:对邻居消息和自身消息应用不同的线性变换(例如,邻居用矩阵
W,自身用矩阵B)。 - 合并自身信息:在聚合邻居消息后,将节点自身的信息也合并进来。通常通过拼接或求和来实现。
例如,我们可以这样定义:
h_v^(l) = CONCATENATE( AGGREGATE({W * h_u^(l-1) for u in N(v)}), B * h_v^(l-1) )
或者:
h_v^(l) = AGGREGATE({W * h_u^(l-1) for u in N(v)}) + B * h_v^(l-1)
经典架构剖析
上一节我们介绍了单层GNN的通用框架,本节中我们来看看几种经典架构是如何实例化这一框架的。
图卷积网络 (GCN)
GCN的层定义公式为:
h_v^(l) = σ( sum( (1 / sqrt(deg(u)*deg(v))) * W * h_u^(l-1) for u in N(v) ∪ {v} ) )
在消息转换与聚合框架下,我们可以这样理解GCN:
- 消息转换:每个邻居
u将其上一层的嵌入h_u^(l-1)与权重矩阵W相乘,并按照节点度deg(u)和deg(v)进行归一化。 - 消息聚合:对来自所有邻居(包括节点自身)的转换后消息进行求和。
- 非线性激活:最后应用一个非线性激活函数
σ(如ReLU)。
GraphSAGE
GraphSAGE在GCN的基础上进行了重要扩展:
- 它允许使用任意的置换不变聚合函数(不仅仅是平均)。
- 它显式地将节点自身的信息与聚合后的邻居信息进行拼接。
其公式可以表示为:
h_v^(l) = σ( W * CONCATENATE( AGGREGATE({h_u^(l-1) for u in N(v)}), h_v^(l-1) ) )
在消息转换与聚合框架下:
- 消息转换:可以是一个简单的线性层,也可以是一个多层感知机(MLP)。
- 消息聚合:使用一个通用的聚合算子
AGGREGATE,可以是均值、池化(如最大池化)甚至LSTM(需配合随机排序以近似置换不变性)。 - 合并与激活:将聚合后的邻居信息与节点自身信息拼接,经过线性变换
W和非线性激活σ。
GraphSAGE还引入了 L2归一化 的选项,即对每一层的节点嵌入进行归一化,使其欧几里得长度为1。这有时能带来性能提升,因为它避免了嵌入向量尺度不一致的问题。
图注意力网络 (GAT)
GAT的核心创新是引入了注意力机制,使得模型能够学习邻居节点对中心节点的重要性差异。
动机在于:在GCN或GraphSAGE中,所有邻居的重要性是隐含的、相同的(例如,在GCN中仅由节点度决定)。GAT希望显式地学习一个权重 α_uv,来衡量邻居 u 对中心节点 v 的重要性。
注意力机制的工作流程如下:
- 计算注意力系数:使用一个函数
a,基于一对节点(u, v)上一层的嵌入,计算出一个未归一化的注意力分数e_uv。
e_uv = a( W * h_u^(l-1), W * h_v^(l-1) )
函数a可以是一个简单的单层神经网络,将两个嵌入拼接后输出一个标量。 - 归一化注意力权重:使用softmax函数对某个节点所有邻居的
e_uv进行归一化,得到最终的注意力权重α_uv,使得对于节点v,其所有邻居的权重之和为1。
α_uv = softmax_u(e_uv) = exp(e_uv) / sum( exp(e_uk) for k in N(v) ) - 加权聚合:在消息聚合时,使用学到的注意力权重进行加权求和。
h_v^(l) = σ( sum( α_uv * W * h_u^(l-1) for u in N(v) ) )
为了稳定训练,GAT常使用多头注意力。即并行运行多个独立的注意力机制,然后将它们输出的嵌入拼接(或平均)作为最终输出。这增加了模型的表达能力与稳健性。
注意力机制的优势包括:
- 隐式指定重要性:允许为不同邻居分配不同的重要性。
- 计算高效:注意力系数的计算可以并行化。
- 存储高效:参数数量固定,与图大小无关。
- 归纳能力强:注意力函数
a不依赖于全局图结构,可以迁移到未见过的图上。
融入现代深度学习技术
上一节我们探讨了几种经典的GNN架构,本节中我们来看看如何将其他成功的深度学习模块整合到GNN层中,以构建更强大、更稳定的模型。
以下是几种可以融入GNN的关键技术:
批归一化 (Batch Normalization)
批归一化的目标是稳定神经网络的训练。对于一批节点嵌入,它将其重新中心化为零均值,并缩放为单位方差。
具体操作如下:
- 计算该批数据在每个特征维度上的均值
μ和方差σ^2。 - 对数据进行标准化:
x‘_i = (x_i - μ) / sqrt(σ^2 + ε) - 引入可学习的缩放参数
γ和平移参数β,进行仿射变换:y_i = γ * x‘_i + β
在GNN中,可以在非线性激活函数之前应用批归一化。
Dropout
Dropout是一种防止过拟合的正则化技术。在训练时,它以概率 p 随机将神经网络中的一部分神经元(或其输出)设置为零。在测试时,则使用全部神经元。
在GNN中,Dropout可以应用于消息转换中的线性变换层。例如,在计算 W * h_u^(l-1) 时,可以对输入 h_u^(l-1) 或输出应用Dropout。
激活函数 (Activation Functions)
激活函数为神经网络引入了非线性,是模型具有强大表达能力的关键。常用的激活函数包括:
- ReLU (Rectified Linear Unit):
σ(x) = max(0, x) - Sigmoid:
σ(x) = 1 / (1 + exp(-x)),将输出压缩到(0,1)区间。 - Parametric ReLU (PReLU):
σ(x) = max(0, x) + a * min(0, x),其中a是一个可学习的参数。经验上,PReLU通常比ReLU效果更好。
总结与工具
本节课中,我们一起学习了图神经网络单层的核心原理与设计。
- 我们首先定义了GNN单层的两个基本组件:消息转换和消息聚合,并强调了聚合函数的置换不变性以及融入节点自身信息的重要性。
- 接着,我们在这一统一框架下剖析了三种经典架构:GCN、GraphSAGE和GAT,重点理解了GAT的注意力机制如何学习邻居的重要性。
- 最后,我们探讨了如何将批归一化、Dropout和多种激活函数等现代深度学习技术融入GNN层,以提升模型的性能和稳定性。


如果你想快速尝试和比较这些不同的架构选择与设计决策,可以探索名为 GraphGym 的工具包。它可以帮助你系统地进行GNN架构实验,以找到针对特定问题的最有效设计。


课程 P22:7.3 - 堆叠 GNN 层 🧱

在本节课中,我们将要学习如何将多个图神经网络层堆叠起来,构建一个多层的 GNN 模型。我们将探讨堆叠层时可能遇到的“过度平滑”问题,并学习如何通过调整网络深度、增加层内表达能力以及添加跳过连接等方法来克服它。
概述
上一节我们介绍了图神经网络单层的设计与定义,它由消息转换和消息聚合操作组成。本节中,我们来看看如何将这些单层堆叠起来,形成更深层的 GNN 架构。
堆叠 GNN 层
一个标准且常见的方法是顺序堆叠 GNN 层。基本思想是:第 0 层的节点嵌入使用节点的原始特征。然后,这些特征通过每一层 GNN 进行逐层转换。
例如,一个三层的 GNN 会将输入节点特征在每一层水平上转换为新的嵌入。
然而,一个重要的问题是,堆叠太多 GNN 层会带来挑战。这里需要向你介绍“过度平滑”的概念,并讨论如何预防它。
此外,需要指出的是,GNN 中“层”的深度概念与卷积神经网络不同。GNN 的深度更多地表示信息在网络中传播的“跳数”,它不一定直接等同于网络的整体复杂度或表达能力,因为这还取决于每一层 GNN 的具体设计。
过度平滑问题
将许多 GNN 层堆叠在一起时,模型往往会遭受所谓的“过度平滑”问题。过度平滑是指所有节点的嵌入收敛于相同或非常相似的值。
发生这种情况的原因是:如果网络的“感受野”过大,那么基本上所有节点都会收集到相同的信息,最终导致所有节点的输出嵌入也相同。我们不希望出现过度平滑问题,因为我们希望不同节点的嵌入是不同的。
感受野的定义
首先,我们需要定义“感受野”的概念。感受野是指决定目标节点嵌入的那一组节点。在一个 K 层 GNN 中,每个节点都有一个 K 跳的接收场,即该节点周围的 K 跳邻域。
这一点很重要。例如,考虑图中两个黄色节点之间的链接预测任务。随着网络深度增加,这两个节点对应的计算图(即感受野)会变得多大?
- 对于一层 GNN,感受野是一跳邻居。
- 对于两层 GNN,感受野扩展到两跳邻居(邻居的邻居)。
- 对于三层 GNN,在这个小图的例子中,感受野几乎覆盖了网络中的每个节点。
这意味着黄色节点将收集网络中几乎所有其他节点的信息来确定自己的嵌入。对于链接预测任务,当增加 GNN 的跳数时,两个节点共享的邻居数量会快速增长,导致它们的感受野高度重叠。
过度平滑的解释
节点的嵌入由其感受野决定。如果两个节点的感受野高度重叠,那么它们的嵌入也很可能相似。
因此,如果堆叠很多 GNN 层,节点的感受野会高度重叠,它们会从网络的相同部分收集信息并以相同方式聚合,从而导致节点嵌入高度相似,难以区分。这就是过度平滑问题。
克服过度平滑的方法
1. 谨慎选择层数
首先,与图像分类中的卷积神经网络不同,向 GNN 添加更多层并不总是有帮助。我们需要确定合适的层数。
- 分析信息需求:分析做出良好预测需要多少信息,平衡网络直径与单层 GNN 聚合的信息量。如果深度太大,单个节点的感受野可能基本覆盖整个网络。
- 设置层数:将 GNN 层数
L设置为略大于我们所需的感受野大小,但避免L不必要地过大。
2. 增加单层的表达能力
如果我们无法通过增加深度来提升性能,另一种方法是让较浅的 GNN 变得更有表现力。
- 深化聚合与转换函数:在我们之前的例子中,每个变换或聚合函数可能只是一个线性变换。但我们可以让聚合算子和转换算子本身成为深度神经网络,例如使用三层多层感知机,而不仅仅是一个简单的线性层。这样就在单层 GNN 内增加了表现力。
- 添加预处理与后处理层:我们可以在 GNN 层前后添加不传递消息的层,例如多层感知机层。这可以看作是预处理和后处理步骤。
- 预处理层:在编码节点特征时很重要,例如,如果节点特征表示图像或文本,我们可能希望这里有一个完整的 CNN。
- 后处理层:在进行图分类或知识图谱推理等任务时,对嵌入进行转换很重要。
在实践中,添加这些预处理和后处理层效果很好,这意味着我们将经典的神经网络层与图神经网络层结合了起来。
3. 添加跳过连接
让浅层 GNN 更有表现力的最后一个方法是添加跳过连接。过度平滑问题的一个观察是:早期 GNN 层中的节点嵌入有时能更好地区分不同节点。
解决方案是:我们可以通过添加“快捷方式”(即跳过连接)来增加早期层对最终嵌入的影响。
跳过连接的工作原理:
在标准的 GNN 层中,我们接收消息并对其进行转换。添加跳过连接后,我们不仅转换消息,还将转换后的结果与未转换的原始消息(或来自更早层的消息)相加。
代码示意:
假设 f(x) 是当前层的消息转换函数,x 是上一层的输出。带有跳过连接的标准操作可以表示为:
output = σ( f(x) + x )
其中 σ 是非线性激活函数。
为什么跳过连接有效:
直觉上,跳过连接创建了一种“混合模型”。现在你的模型是上一层和当前层的加权组合,这意味着你将两个不同层(或模型)的信息混合在一起。
通过添加多个跳过连接,可以极大地增加模型的表达能力,让 GNN 在如何传递和聚合消息方面具有更大的灵活性。例如,一个三层的 GNN 添加跳过连接后,最终的输出可以是单层、两层和三层子网络输出的某种组合,这相当于同时利用了多种深度的网络架构。
应用示例:
以图卷积网络层为例,添加跳过连接后,该层的操作变为:将从邻居聚合的消息与上一层的节点自身表示相加,然后通过非线性激活函数。
更复杂的跳过连接策略,如“跳跃知识网络”,建议从多个中间层直接跳过连接到最后一层,然后在最后一层聚合来自不同深度的所有嵌入。这样,模型可以自动确定对于预测任务而言,是附近节点的信息更重要,还是需要聚合更广网络范围的信息。
总结


本节课中,我们一起学习了如何堆叠 GNN 层以构建深层网络。我们深入探讨了堆叠过多层会导致的“过度平滑”问题,其根源在于节点感受野的重叠。为了克服这一问题,我们学习了三种主要策略:谨慎选择网络层数以匹配任务需求;通过深化单层内部结构或添加预处理/后处理层来增强模型表达能力;以及使用跳过连接来融合不同深度的特征信息,从而提升模型性能并缓解过度平滑。



课程 P23:8.1 - 图神经网络中的图增强 🛠️

在本节课中,我们将学习如何通过图增强技术来改进图神经网络(GNN)的性能。我们将探讨当输入图的结构或特征不理想时,如何通过添加虚拟节点、边或特征来优化GNN的计算图,使其更高效、更具表现力。

图增强的必要性 📈
上一节我们介绍了图神经网络的基本架构。本节中我们来看看为什么需要对输入图进行增强。
原始输入图并不总是定义GNN计算图的最佳选择。有时,输入图可能过于稀疏或过于稠密,导致消息传递效率低下。有时,图可能缺乏节点特征,或者某些图结构(如循环)难以被标准GNN学习。此外,对于非常大的图,计算图可能无法放入GPU内存。因此,我们需要通过图增强技术来改进输入图,使其更适合用于GNN嵌入。
图特征增强 🧩
当输入图缺乏节点特征时,我们可以通过特征增强来创建有用的特征。以下是几种常见的方法:
1. 分配常量特征
为图中的每个节点分配一个相同的常量特征值(例如,所有节点的特征向量均为 [1])。这种方法计算成本低,允许GNN通过聚合函数(如求和)捕捉节点邻域的结构信息(例如,一级邻居的数量)。然而,其表现力有限,因为所有节点的初始特征相同。
2. 分配独热编码特征
为每个节点分配一个唯一的独热编码(One-Hot Encoding)向量。例如,在一个有6个节点的图中,每个节点的特征是一个6维二进制向量,其中仅在其对应索引位置为1。这种方法表现力强,因为每个节点都有唯一标识。但其缺点是无法泛化到训练时未见过的节点或新图,且特征维度随节点数增长,不适用于大型图。
3. 添加图结构特征
有时,GNN难以学习某些图结构信息(例如,节点所在的循环长度)。我们可以通过计算并添加这些信息作为节点特征来增强GNN的表达能力。例如,可以为每个节点创建一个特征向量,记录其参与的长度为0、1、2、3等的循环数量。其他可添加的图结构特征还包括PageRank值、节点中心性度量等。这相当于将领域知识编码到特征中,可以显著提升模型性能。
图结构增强 🔗
除了特征,我们还可以增强图本身的结构。这主要针对图过于稀疏、过于稠密或过大的情况。
添加虚拟边
对于稀疏图,一个常见方法是连接两跳邻居。具体做法是使用邻接矩阵 A 加上其平方 A² 作为新的邻接关系。公式表示为:
A_augmented = A + A²
这在二部图中特别有用,例如,可以快速建立作者合作网络。添加虚拟边可以减少所需GNN的深度,使消息传递更高效。
添加虚拟节点
另一种增强稀疏图的方法是在图中添加一个虚拟节点,并将其连接到图中所有节点或一个精心选择的子集。这样,原本相距很远的节点可以通过虚拟节点进行快速通信,从而减少所需的消息传递层数,提高效率。
处理稠密图:邻居采样 👥
当图过于稠密(例如,社交网络中的高度数节点)时,聚合所有邻居的信息计算成本会非常高。此时,我们可以采用邻居采样技术。
核心思想是:在每一层消息传递中,不是从节点的所有邻居聚合信息,而是只从一个采样子集中聚合。例如,对于一个有大量邻居的节点,我们可能只随机选择其中一小部分(如2个)进行信息聚合。
以下是邻居采样的关键点:
- 计算效率:显著减小了计算图的规模,降低了计算和内存开销。
- 表达能力:可能会丢失被忽略邻居的重要信息,从而影响模型性能。这是一种权衡。
- 鲁棒性:可以在不同的训练轮次或层中对不同的邻居子集进行采样。这增加了模型的鲁棒性,使其对边缺失等情况不那么敏感。
- 可扩展性:这是将GNN扩展到具有数十亿节点和边的大规模图(如工业推荐系统)的关键技术。
通过邻居采样,我们可以控制计算成本,并使GNN能够处理现实世界中的超大规模图。
总结 📝
本节课中我们一起学习了图神经网络中的图增强技术。我们首先了解了为什么需要对输入图进行增强,然后详细探讨了两种主要增强方式:
- 图特征增强:包括为节点分配常量特征、独热编码,以及添加基于图结构的特征(如循环计数、节点中心性),以弥补原始特征的不足或提升模型对特定结构的感知能力。
- 图结构增强:包括为稀疏图添加虚拟边或虚拟节点以提高消息传递效率,以及对稠密图采用邻居采样技术以控制计算成本并实现大规模扩展。


这些技术是设计和训练高效、强大图神经网络的重要工具,使我们能够根据具体问题灵活地调整和优化模型输入。


课程P24:8.2 - 训练图神经网络 🧠

在本节课中,我们将要学习如何训练图神经网络。我们将讨论如何从模型生成的节点嵌入得到最终预测、如何定义损失函数以及如何评估模型性能。
预测头:从嵌入到预测
上一节我们介绍了图神经网络如何生成节点嵌入。本节中我们来看看如何将这些嵌入转化为具体的预测。预测头是模型的最终输出部分,根据任务的不同,可以分为节点级、边(链接)级和图级预测。
节点级预测头
对于节点级任务,我们可以直接使用节点的最终嵌入进行预测。例如,进行K分类(预测节点属于K个类别中的哪一个)或回归任务。
其核心思想是使用一个线性变换将节点嵌入映射到预测空间。公式如下:
公式:
Ŷ = W * h_v
其中,h_v 是节点v的最终嵌入,W 是一个可学习的权重矩阵,Ŷ 是预测值(例如,K维向量,表示属于各类别的概率)。
边级预测头
对于边级任务(如链接预测),我们需要使用一对节点的嵌入来做出预测。
以下是两种常见的构建边级预测头的方法:
-
连接后线性变换:将两个节点的嵌入连接起来,然后通过一个线性层(可能加上非线性激活函数如Sigmoid或Softmax)。
代码示例(概念):# h_u, h_v 分别是节点u和v的嵌入 concatenated = torch.cat([h_u, h_v], dim=-1) prediction = linear_layer(concatenated) # linear_layer 将维度映射到目标输出维度 -
点积变换:计算两个节点嵌入的点积。对于二元分类(如链接存在与否),这直接得到一个标量。对于K分类(如预测链接类型),可以为每个类别学习一个变换矩阵,分别计算点积后再组合。
公式(二元分类):
Ŷ = h_u^T · h_v
公式(K分类,简化):
Ŷ_k = h_u^T · W_k · h_v, 其中W_k是为第k个类别学习的变换矩阵。
图级预测头
对于图级任务,我们需要聚合图中所有节点的嵌入,形成一个图级别的表示,然后再进行预测。
常见的聚合(池化)方法有:
- 全局平均池化:计算所有节点嵌入的均值。
- 全局最大池化:取所有节点嵌入在每个维度上的最大值。
- 全局求和池化:对所有节点嵌入求和。
然而,简单的全局池化可能会丢失信息,例如两个结构不同的图可能产生相同的池化结果。为了解决这个问题,可以采用分层池化。
分层池化的核心思想是:先识别图中紧密连接的社区(簇),在社区内部聚合节点嵌入,形成“超级节点”;然后基于超级节点之间的结构,再次进行聚合,如此迭代,最终得到图的嵌入。这种方法可以通过可学习的图神经网络(如DiffPool)来实现,从而自动学习如何最优地聚合节点。
监督信号:标签从何而来
有了预测,我们需要知道“正确答案”是什么来计算损失。根据标签来源,学习任务可分为监督学习和无监督学习。
监督学习
监督学习的标签来自外部数据源。
- 节点级:例如,在引文网络中,论文的研究领域。
- 边级:例如,在交易网络中,某笔交易是否为欺诈。
- 图级:例如,在分子图中,分子的毒性。
将实际问题建模为这三种标准任务之一,有助于利用现有的研究和方法。
无监督学习
无监督学习的监督信号来自图数据本身的结构。
- 节点级:预测节点的内在属性,如聚类系数、PageRank值或原子类型。
- 边级:预测链路是否存在(链路预测)。
- 图级:预测图统计量,如图是否同构,或包含何种子图模式。
损失函数与评估指标
本节我们将定义如何衡量预测与真实标签之间的差距,即损失函数,并介绍如何评估模型性能。
损失函数
损失函数的选择取决于任务是分类还是回归。
-
分类任务 - 交叉熵损失:这是最常用的分类损失。对于K分类任务,单个数据点的损失计算如下:
公式:
L = - Σ_{k=1}^{K} y_k · log(ŷ_k)
其中y是真实标签的one-hot编码,ŷ是模型预测的(通常经过Softmax的)概率分布。总损失是所有训练数据点损失之和。 -
回归任务 - 均方误差损失:用于预测连续值。单个数据点的损失计算如下:
公式:
L = Σ_{k=1}^{K} (y_k - ŷ_k)²
同样,总损失是所有数据点损失之和。
评估指标
训练后,我们需要用独立的评估指标来衡量模型性能。
以下是常见的评估指标:
-
回归任务:
- 均方根误差:
RMSE = sqrt( mean( (y - ŷ)² ) ) - 平均绝对误差:
MAE = mean( |y - ŷ| )
- 均方根误差:
-
分类任务:
- 准确率:
Accuracy = (正确预测数) / (总预测数)。在类别不平衡时可能不具代表性。 - 精确率与召回率:基于混淆矩阵计算。
- 精确率:
Precision = TP / (TP + FP)(预测为正的样本中,真正为正的比例)。 - 召回率:
Recall = TP / (TP + FN)(所有正样本中,被正确预测出来的比例)。
- 精确率:
- F1分数:精确率和召回率的调和平均数,
F1 = 2 * (Precision * Recall) / (Precision + Recall)。 - ROC-AUC:绘制真正例率 vs. 假正例率曲线,并计算曲线下面积。AUC值越接近1,模型性能越好;0.5相当于随机猜测。AUC可以理解为“随机选取一个正样本和一个负样本,模型对正样本打分高于负样本的概率”。
- 准确率:
总结
本节课中我们一起学习了图神经网络的完整训练流程。我们首先介绍了预测头,它负责将节点嵌入转化为节点级、边级或图级的预测。接着,我们探讨了监督信号的来源,区分了监督学习和无监督学习场景。最后,我们详细讲解了用于优化模型的损失函数(如交叉熵损失和均方误差损失)以及评估模型性能的多种评估指标(如准确率、F1分数和ROC-AUC)。


下一节,我们将讨论如何具体设置训练过程,包括如何划分数据集、如何进行训练和测试,以实现高效且可靠的模型训练。


课程 P25:8.3 - 设置图神经网络预测任务 📊

在本节课中,我们将学习如何为图神经网络(GNN)设置预测任务。我们将重点讨论如何将图数据集正确划分为训练集、验证集和测试集,并深入探讨在节点分类、图分类和链路预测等不同任务中划分策略的差异与挑战。
概述
上一节我们介绍了图神经网络的设计选择、训练推理流程以及评估指标。本节中,我们将解决一个关键问题:如何将图数据集划分为训练集、验证集和测试集。由于图中节点和边相互连接的特性,这种划分比传统数据(如图像或文本)更为复杂,需要特别注意信息泄露问题。
数据集划分的两种基本方法
在划分数据集时,我们主要有两种策略。
以下是两种基本划分方法:
- 固定划分:将数据集一次性划分为训练集、验证集和测试集三个固定部分。训练集用于优化模型参数,验证集用于调整超参数,测试集则用于最终评估模型性能。
- 随机划分:进行多次随机划分,每次生成不同的训练、验证和测试集组合。最终报告模型在多次划分上的平均性能,以获得更稳健的结果。
对于图数据,划分的复杂性在于节点之间通过边相互连接。例如,在节点分类任务中,一个节点的预测会受到其邻居节点信息的影响。如果邻居节点在训练集中,而目标节点在测试集中,就可能发生信息从训练集“泄露”到测试集的情况。
节点分类的划分策略
针对节点分类任务,我们有两种主要的划分设置来处理信息泄露问题。
以下是两种节点分类划分策略:
- 转导设置:所有数据拆分(训练、验证、测试)共享同一个完整的图结构。我们只划分节点的标签。在训练时,模型能看到整个图的结构和所有节点特征,但只能使用训练集节点的标签进行学习。这种设置也被视为一种半监督学习。
- 归纳设置:在不同数据拆分之间切断边,从而为训练、验证和测试集创建不同的子图。这样,测试集的预测完全不会受到训练集图结构信息的影响。但这种方法的缺点是会丢弃部分边,损失图的结构信息。
转导设置适用于我们只有一个连通图,且希望利用全图信息进行预测的场景。归纳设置则更侧重于测试模型在完全未见过的图结构上的泛化能力。如果我们没有多个天然独立的图,就需要通过切割边来人为创建多个子图。
图分类的划分策略
既然我们已经讨论了节点分类,让我们切换到下一个分类任务:图分类。
图分类通常在归纳设置中定义良好。我们可以简单地将不同的图样本分配到训练集、验证集和测试集中。由于每个图是独立的数据点,这种划分简单直接,不存在信息泄露问题。
链路预测的划分策略
所有设置中最棘手的可能是链路预测。链路预测本质上是一种无监督任务,我们需要自己创建标签和划分数据。核心思想是:对GNN隐藏一部分边,然后让GNN去预测这些缺失的边。
设置链路预测需要两个步骤。
以下是链路预测设置的两个步骤:
- 边类型分配:将原始图中的边分为两类:
- 消息传递边:GNN在计算节点嵌入时可以使用的边。
- 监督边:我们将尝试预测的边,用于计算损失函数和评估模型性能。
- 数据集划分:进一步将监督边划分为训练、验证和测试集。这里也有两种方式:
- 归纳链路预测划分:假设我们有多个图,每个图独立划分其消息传递边和监督边。
- 转导链路预测划分(默认):只有一个输入图。我们需要精心划分出四种边:
- 训练消息传递边
- 训练监督边
- 验证边
- 测试边
在转导设置中,划分是嵌套的。例如,在训练时,图仅包含训练消息传递边,模型需要预测训练监督边。在验证时,图包含训练消息传递边和训练监督边,模型需要预测验证边。在测试时,图包含之前所有的边,模型需要预测最终的测试边。这可以模拟图随着时间推移而演化的场景。
总结与工具
本节课中,我们一起学习了如何为GNN设置预测任务。我们讨论了整个GNN训练流程,从划分策略到应对不同任务(节点分类、图分类、链路预测)的挑战。我们了解到:
- 转导设置和归纳设置是处理图数据划分的两种核心思想。
- 节点分类需要仔细处理邻居信息泄露。
- 图分类的划分最为直接。
- 链路预测的划分最为复杂,需要创建“隐藏边”作为预测目标。


幸运的是,我们有像 DeepSNAP 和 GraphGym 这样的工具,可以帮助我们自动化地、正确地完成这些复杂的划分工作,让我们能够更专注于模型本身的设计与优化。


课程 P26:9.1 - 图神经网络有多强大? 🧠

在本节课中,我们将要学习图神经网络(GNN)的表达能力。我们将探讨GNN能学习什么、不能学习什么,以及如何设计出理论上最具表达能力的GNN模型。理解这些理论概念对于选择和应用不同的GNN架构至关重要。
背景与核心问题
上一节我们介绍了多种GNN模型及其设计选择。本节中,我们来看看这些模型的理论表达能力。
图神经网络通过多层非线性传播,为图中的节点生成嵌入表示,以便进行各种机器学习预测任务。其核心思想是聚合目标节点周围局部邻域的信息。
关键在于,GNN通过神经网络聚合来自邻居的信息。我们已经讨论过在设计消息传递和聚合操作时的各种选择。今天,我们将聚焦于GNN的理论能力。
我们特别要问:图神经网络有多强大?它们的表达能力如何?它们能学到什么,又有什么是学不到的?理解这一点非常重要,因为存在许多不同的GNN模型,如图卷积网络(GCN)、图注意力网络(GAT)和图SAGE网络等。问题在于它们的表达能力究竟是什么?这本质上是指它们区分不同节点和不同图结构的能力,以及在学习不同类型模式时的表现力。
一个非常酷的目标是,我们今天将能够设计出理论上最具表达能力的GNN模型,即最强大的图神经网络。
表达能力:区分节点与结构
计划如下:背景是我们拥有许多具有不同聚合和转换方式的GNN模型。问题是,我们能理解它们的表达能力吗?这些不同的设计选择如何导致不同类型的模型?
例如,在图卷积网络(GCN)中,它使用所谓的均值池化。当我们从邻居聚合信息时,我们使用元素级的平均池化,然后进行线性变换和ReLU非线性激活。而图SAGE网络则使用多层感知机(MLP)加上元素级的最大池化。这两者有何不同?在理论性质和表达能力方面,哪个更好?
这里有一个重要的说明:在图神经网络中,我们有两个方面:节点特征(属性)和图结构方面。为了本次讲座的目的,我将用节点的颜色来表示它们的特征向量。如果两个节点颜色相同,则意味着它们具有相同的特征向量和特征表示。
例如,在下图中,数字表示节点ID,但所有节点的特征都是相同的(都是黄色),因此没有特征信息可以用来区分节点。问题在于,GNN能在多大程度上区分不同的图结构?因为如果每个节点都有独特的特征向量,区分节点就很容易。但如果所有特征向量都相同,那么问题就变成了:你还能区分节点吗?你能了解到节点五和节点四不同吗?
在图神经网络中,我们对局部邻域结构的概念特别感兴趣。我们想要量化每个节点周围的本地网络邻居。
例如,考虑节点一和节点五。我能学会区分节点一和节点五吗?这相当容易,因为它们具有不同的邻域结构。即使只看每个节点的邻居数量(度),节点一的度为2,节点五的度为3。所以,如果GNN能捕捉节点的度,就可以区分节点一和五。
现在看第二个例子:节点一和节点四呢?如果只看单跳邻域,节点一的度是2,节点四的度也是2。所以,如果只能捕捉节点本身的度,就无法区分一和四。然而,一和四仍然是不同的。因为如果观察二度邻域,节点一的两个邻居,一个度为2,一个度为3;而节点四的两个邻居,一个度为1,另一个度为3。所以,如果我能捕捉节点本身的度加上邻居的度,那么一和四就是可区分的,因为它们的邻居具有不同的度。
这非常有趣:两个节点乍看相同,但深入网络探索邻居后,它们就变得可区分了。
现在继续研究另一对节点:节点一和节点二。有趣的是,一和二在这个图中实际上是无法区分的,因为它们在图中是对称的。它们都是2度,它们的邻居也都有两个邻居(一个2度,一个3度)。即使探索到第二跳邻域,网络邻居也是相同的。无论我们探索网络多深,因为在这两种情况下,它们在二跳邻域都有一个2度节点和一个3度节点,在三跳远都有一个2度邻居和一个1度邻居。所以,你无法区分一和二,除非有一些特征信息。但基于图结构,你无法区分它们,因为它们在图中位置同构。
这是一个建立直觉的例子。我们想要的关键问题是:GNN节点嵌入能区分不同的局部邻域结构吗?如果可以,是在什么情况下?如果不能,GNN的失败案例有哪些?
计算图:理解GNN如何工作
接下来我们需要理解GNN如何捕捉局部邻域结构。我们将通过计算图这个关键概念来理解。
想法是:GNN的每一层都会聚合邻居的嵌入。在GNN中,我们通过定义在节点邻域结构上的计算图来生成嵌入。
例如,对于节点一,如果我们构建一个两层的GNN计算图:节点一聚合来自节点二和节点五的信息。节点五聚合来自其邻居(节点一、二、四)的信息。节点二聚合来自其邻居(节点一、五)的信息。这就是我们所说的计算图,它展示了消息如何从第0层聚合到第1层再到第2层。这是描述节点一的两层GNN计算图。
有趣的是,现在如果我为节点二创建计算图:节点二聚合来自节点一和节点五的信息,节点五聚合来自节点一、二、四的信息,节点一聚合来自节点二和五的信息。你注意到,节点一和节点二的计算图实际上是相同的。它们都有两个一度子节点(在零层),其中一个子节点有2个邻居,另一个有3个邻居。
GNN只是在传递信息,而不使用节点ID,它只使用节点特征向量。这意味着如果你观察这些传播树(计算图),它们现在是不同的,因为你说“哦,很明显,这是第一个节点,那是第二个节点”。但如果你只看颜色(即节点特征信息),这些树看起来一模一样,并且无法区分节点彼此。
在所有情况下,GNN所能做的只是聚合这些黄色节点的信息。它可以说“我有三个黄色的子节点”,而另一个节点可以说“我有两个黄色的子节点”。然后我们可以描述:“我有两个孩子,其中一个有两个子节点,另一个有三个子节点”。但关键是,对于两个不同的节点一和二,计算图是相同的。因此,在没有特征信息、没有节点属性信息的情况下,这两个计算图是一样的。
因此,这两个节点将被嵌入到嵌入空间中的同一点,这意味着它们将重叠。所以图神经网络无法区分它们,也不能将节点一划分为与节点二不同的类别,因为它们的嵌入将完全相同。它们会重叠,因为计算图相同,并且没有可区分的节点特征信息(这是我们的假设)。
这是本节课最重要的一张幻灯片:我们通过计算图捕捉局部邻域结构。如果两个节点的计算图相同,那么这两个节点将完全嵌入到同一点,在嵌入空间中。这意味着我们不能把一个归为一个类别,把另一个归为另一个类别,因为它们是相同的、重叠的。所以我们无法区分它们。
总结一下,在这个简单的例子中,GNN将为节点1和节点2生成相同的嵌入,因为两个事实:首先,计算图是相同的;其次,节点特征信息在这种情况下是相同的(所有节点都是黄色的)。因为GNN不关心节点ID,它关心的是节点的属性/特征并将其聚合。这意味着这个GNN不能区分节点一和节点二,所以1和2总是有完全相同的嵌入,总是被归入同一个类别或分配相同的标签。
这看起来相当令人失望,我们这么快就找到了GNN的一个失败案例:它们基本上不能区分某些节点。
这里要说的重点是:总的来说,不同的局部邻域定义不同的计算图。 下图展示了节点一和二、节点三和四、以及节点五的计算图。我们已经知道我们将无法区分一和二,因为它们有相同的计算图。但问题仍然是:三和四,或者三和五呢?图神经网络能区分这些节点吗?因为很明显它们有不同的计算图。所以也许图神经网络能够记住或捕获计算图的结构,这意味着节点三和节点四将得到不同的嵌入,因为它们的计算图不同。这在某种意义上是个大问题。
关键是,计算图与每个节点周围的有根子树结构相同。所以我们可以把这个有根子树看作定义了每个节点周围邻域的拓扑结构。两个节点在最好的情况下能够被区分,如果它们有不同的有根子树结构,即不同的计算图。当然,也许我们的GNN太不完美,它甚至无法区分具有不同计算图的节点(即根树结构不同的节点)。我们接下来要看的是,在什么情况下二和三会被简单地归类为同一个嵌入。
单射性:最具表达力的GNN
继续右边的内容:GNN节点嵌入捕获根子树结构。它们基本上试图捕捉计算图(即给定节点周围网络邻域)的图结构。最具表达力的图神经网络会将不同的有根子树映射到不同的节点嵌入中(这里用不同的颜色表示)。
例如,一和二,因为它们有完全相同的计算图,将映射到相同的点。以目前GNN的定义,我们对此无能为力。但例如,节点三、四和五,它们没有相同的计算图结构,所以它们应该被映射到嵌入空间中的不同点。
因此,最具表现力的图神经网络基本上能够学习或捕捉计算图的结构,并基于此结构为每个计算图分配不同的嵌入。这是我们的前提。
我们希望确保:如果两个节点有不同的计算图,那么它们被映射到嵌入空间中的不同点。问题是,图神经网络有一个重要的数学概念可以让我们在理解方面取得进一步进展:图神经网络是否可以将两个不同的计算图(即有根子树)映射到嵌入空间中的不同点?
有一个概念,或者说定义,关于什么是单射函数:一个从域X映射的函数,如果它将不同的元素映射到不同的输出,那么基本上意味着f保留了输入的信息。这意味着无论你得到什么输入,你总是把它们映射到不同的点或不同的输出。例如,不是二和三会碰撞并给出相同的输出。每个输入都映射到不同的输出,这是单射函数的定义。这是一个非常重要的概念,我们将在讲座的其余部分大量使用。
我们想知道图神经网络有多有表现力。最具表现力的图神经网络应该将这些子树(这些计算图)单射地映射到节点嵌入中。这意味着对于每一个不同的子树,我们应该把它映射到嵌入空间中的另一个点。如果这个映射不是单射的,意味着两个不同的输入(两个不同的子树)映射到同一个点,那就有问题了。
所以我们想展示一个场景,其中不同的子树被映射到嵌入空间中的不同点。
关键的观察使我们能够取得进展:相同深度的树可以递归地从叶节点到根节点进行表征。 我的意思是,如果我们能够区分树的某一层,那么我们可以递归地获取这些信息,并将它们聚合在一起,形成对这棵树的独特描述。
例如,你可以简单地通过每个节点的子树数量来描述树的特征。在较低级别,一个节点有三个邻居(孩子),另一个节点有两个孩子。然后,根节点已经有两个孩子。所以我可以描述为:“在零层,我们有两个邻居和三个邻居;在第一层,我们有两个邻居”。对于这个特定的计算图,我这里有一个孩子,那里有三个孩子,然后这里有两个孩子。这个描述和另一个描述不一样,所以这意味着我可以分开或区分这两棵不同的树。
重要的是,树可以逐级分解。所以如果我能捕捉到树某一层的结构,也许甚至只是这一层,然后我可以递归地逐级进行。我的意思是,我们只需要专注于如何描述这个计算图的某一层,或者围绕给定节点的有根子树的某一层。
单射聚合:保留邻域信息
让我们继续思考并解决这个问题。如果GNN聚合过程的每一步都能完全保留邻域信息(即给定节点的邻居数量、孩子数量),那么生成的节点嵌入就可以区分不同的子树结构。
如果我能说:“在第一层,在一棵树上,我有两个孩子;在另一棵树上,我有三个孩子。” 如果我能捕捉到这些信息,并一直传播到根节点……在另一棵树上,我可以捕捉到一个节点有一个子节点,另一个节点有三个子节点,如此反复。我可以把这些信息一直保留到顶层。那么很明显,孩子数量是不同的,所以这两棵树我们能够区分开来。
重点是,从某种意义上说,我们是否能够从孩子们那里收集信息,并以某种方式存储这些信息,这样当我们把它传递给树中的父级时,这些信息被保留。在这种情况下,关于二和三的信息被一直保留到树根。这是我们想要回答的问题。
换句话说,我们要说的是:最具表达力的图神经网络将对计算图的每一层使用单射邻域聚合。这意味着它会映射不同的邻域信息(例如孩子数量)并保留这些信息,因为我们把它推上树,这样树就知道它的每一个内部节点有多少孩子。这就是本质上的想法。
总结与核心观点
到目前为止的总结如下:生成节点嵌入的GNN使用计算图,它对应于每个节点周围的根子树结构。如果我有一个节点,我就有一个计算图的概念,这只是一个有根子树结构,描述了这个节点周围的局部邻域结构。
那么,不同的根子树(不同的计算图)将是可区分的,如果我们使用单射邻域聚合。这意味着我们能够区分不同的子树。正如我们将要看到的,GNN可以在各个级别上完全区分不同的子树结构,前提是它的邻域聚合是单射的。这意味着在聚合孩子信息时没有信息丢失,这样我们就可以完全描述计算图并区分一个计算图与另一个。

本节课中我们一起学习了:
- 图神经网络(GNN)的表达能力核心在于其区分不同节点和局部图结构的能力。
- 计算图是理解GNN如何工作的关键,它代表了以目标节点为根的局部邻域子树。
- 单射性是衡量GNN表达能力的核心数学概念。最具表达力的GNN应能将不同的计算图(子树)单射地映射到不同的节点嵌入中。
- 失败案例:当两个节点具有完全相同的计算图且节点特征也相同时,任何GNN都无法区分它们(如图中的对称节点)。
- 设计原则:为了最大化表达能力,GNN的每一层聚合函数都应该是单射的,从而在信息向上传播时完全保留邻域结构信息。

理解这些理论概念为我们设计和选择GNN模型提供了坚实的基础,并解释了为什么某些架构(如使用最大池化的GraphSAGE)在某些情况下可能比使用简单平均池化的GCN更具表达能力。在接下来的课程中,我们将探讨如何具体构建这种具有单射聚合函数的GNN。


课程 P27:9.2 - 设计最强大的图神经网络 🧠

在本节课中,我们将学习如何设计最具表达能力的图神经网络。我们将从分析现有模型的局限性开始,然后介绍一个理论框架,帮助我们构建理论上最强大的图神经网络——图同构网络。
概述
图神经网络的表达能力,可以通过其邻域聚合函数的表达能力来表征。更具表达力的聚合函数,会带来更具表达力的图神经网络。如果邻域聚合函数是单射的,即能将不同的输入组合映射到不同的输出,那么信息就不会丢失,从而得到最具表达力的图神经网络。
接下来,我们将从理论上分析不同聚合函数的表达能力。
邻域聚合与多集
邻域聚合本质上是从邻居节点(子节点)收集信息并进行聚合。我们可以将邻域聚合视为一个作用于多集上的函数。多集是允许重复元素的集合。
例如,一个节点可能有两个黄色特征的邻居,而另一个节点可能有两个黄色特征和一个蓝色特征的邻居。当我们聚合这些信息时,我们希望聚合后的表示能够保留原始多集中的所有信息,使得这两个不同的多集在聚合后依然可区分。
分析现有聚合函数
以下是两种我们在第一节课中讨论过的模型所使用的聚合函数,我们将分析它们的表达能力。
1. GCN 的均值池化
GCN 使用均值池化,即对邻居节点的特征向量进行逐元素的平均。
观察:GCN 的聚合函数无法区分那些具有相同特征比例但节点总数不同的多集。
原因:当对特征向量进行平均时,比例相同的多集会得到相同的平均值。
示例:假设节点颜色用独热编码表示,黄色为 [1, 0],蓝色为 [0, 1]。
- 一个黄色和一个蓝色的多集:
[1, 0]和[0, 1]的平均值是[0.5, 0.5]。 - 两个黄色和两个蓝色的多集:四个向量的平均值同样是
[0.5, 0.5]。
即使后续应用非线性变换,由于聚合步骤的输出相同,最终表示也会相同。因此,均值池化无法区分特征比例相同但规模不同的多集。
2. GraphSAGE 的最大池化
GraphSAGE 的一个变体使用最大池化,即对经过多层感知机变换后的邻居特征进行逐元素的最大值操作。
观察:最大池化函数无法区分那些具有相同不同颜色集合的多集。
原因:只要多集中出现的不同颜色种类相同,那么逐元素最大值就会是这些颜色中的一种,无论各种颜色的具体数量或比例如何。
示例:考虑三个不同的多集,经过 MLP 变换后,颜色被编码为新的独热向量。
- 无论节点是两个、三个还是四个,只要出现的颜色种类(例如黄色和蓝色)相同,逐元素最大值在所有情况下都可能相同(例如
[1, 1])。
这意味着所有不同的多集被映射到了相同的表示,信息丢失了。因此,最大池化也不是单射运算符。
本节小结
上一节我们分析了两种常见聚合函数的局限性,现在让我们总结一下关键发现:
- 图神经网络的表达能力由其邻域聚合函数的表达能力决定。
- 邻域聚合是多集上的函数。
- GCN 和 GraphSAGE 的聚合函数(均值和最大池化)无法区分某些基本的多集,它们不是单射的,会导致信息丢失。
- 因此,GCN 和 GraphSAGE 不是最强大的图神经网络。
设计最强大的图神经网络 🎯
我们的目标是设计一个在所有消息传递图神经网络中最强大的模型。实现方式是设计一个单射的邻域聚合函数,确保在从子节点聚合信息以创建父节点消息时永不丢失信息。
理论基础:单射多集函数的表示
有一个重要的定理指出:任何单射多集函数都可以表示为以下形式:
其中:
- ( X ) 是一个多集。
- ( f ) 是一个作用于多集中每个元素的函数。
- ( \sum ) 表示求和。
- ( \Phi ) 是另一个函数。
直观理解:函数 ( f ) 可以为不同的节点特征生成类似“独热编码”的表示。求和 ( \sum f(x) ) 实际上是在“计数”每种特征出现了多少次,从而保留了多集中的所有信息。最后,函数 ( \Phi ) 对这个求和结果进行变换。
用神经网络实现
我们不知道具体的 ( f ) 和 ( \Phi ) 是什么,但我们可以用神经网络(多层感知机,MLP)来学习它们。这依赖于通用近似定理:一个具有足够大隐藏层的 MLP 可以以任意精度逼近任何连续函数。
因此,我们可以构建一个神经网络来近似这个单射多集映射。具体做法是:用一个 MLP 作为 ( f ) 来转换每个邻居的特征,对结果求和,再用另一个 MLP 作为 ( \Phi ) 对求和结果进行变换。
图同构网络
基于以上理论,最具表达力的图神经网络之一被称为图同构网络。
它的聚合函数定义如下:
其中:
- ( h_v^{(k)} ) 是节点 ( v ) 在第 ( k ) 层的嵌入。
- ( \mathcal{N}(v) ) 是节点 ( v ) 的邻居集合。
- ( \text{MLP}f ) 和 ( \text{MLP} ) 是两个多层感知机。
- ( \epsilon ) 是一个小的可学习标量,用于调节节点自身信息的重要性。
这个聚合函数使用了求和池化,它比均值池化或最大池化更具表达能力,能够以单射的方式捕捉邻域信息,因此是消息传递类图神经网络中最强大的。
GIN 与 WL 图同构测试的关系 🔗
我们之前提到的 WL 图同构测试(颜色细化算法)与 GIN 有深刻联系:
- WL 算法:迭代地聚合邻居节点的颜色,并通过一个单射的哈希函数为节点生成新颜色。K 步后,节点的颜色总结了其 K 跳邻域的结构。
- GIN 模型:可以看作是 WL 算法的可微分神经网络版本。
- WL 使用离散的节点颜色和确定的哈希函数。
- GIN 使用连续的低维节点嵌入,并用两个 MLP (
MLP_f和MLP_Φ) 来模拟单射的哈希/聚合过程。
这种关系意味着:
- GIN 的表达能力与 WL 测试一样强大。
- 由于 WL 测试在实践中已被证明能区分大多数现实世界的图结构,因此 GIN 的表达能力对于实际应用通常是足够的。
- 这也为图神经网络的表达能力设定了一个理论上限:任何消息传递图神经网络最多只能像 WL 测试一样强大,而 GIN 达到了这个上限。
总结与展望

本节课我们一起学习了如何设计最强大的图神经网络:
- 核心结论:图神经网络的表达能力取决于其邻域聚合函数。求和池化比均值池化或最大池化更具表达能力。
- 理论工具:任何单射多集函数都可表示为 ( \Phi(\sum f(x)) ) 的形式,我们可以用 MLP 来学习 ( f ) 和 ( \Phi )。
- 最强模型:图同构网络 利用该理论,使用求和池化和 MLP 构建了单射聚合函数,达到了消息传递图神经网络的表达能力上限。
- 与 WL 的关系:GIN 是 WL 图同构测试的可微分推广,两者表达能力等价。

最后需要指出,可以进一步提高图神经网络的表达能力:
- 利用节点特征:目前讨论假设节点初始特征可能不可区分。使用更丰富的节点特征可以增强区分能力。
- 超越消息传递:仅靠聚合邻域特征的消息传递框架,其表达能力受限于 WL 测试。要突破这个上限,需要引入更复杂的机制,例如使用图的结构化信息作为参考点。这将在后续课程中探讨。


课程 P28:10.1 - 异构图与知识图谱嵌入 🧠

在本节课中,我们将学习异构图的概念,并重点介绍一种专门处理此类图的方法——关系图卷积网络。我们还将探讨其在知识图谱完成这一特定任务中的应用。



异构图与关系图卷积神经网络 (RGCN) 🔗
到目前为止,我们处理的图都只有单一的节点类型和边类型。然而,现实世界中的图通常包含多种类型的节点和它们之间多种类型的关系。这种图被称为异构图。
一个异构图由四元组定义:一组节点 V,一组边 E,其中每个节点都有一个类型,每条边都有一个关系类型 r。这意味着一条边现在是一个三元组 (i, r, j),表示节点 i 通过关系 r 连接到节点 j。
以下是异构图的例子:
- 生物医学图:节点类型可以是疾病、蛋白质、药物等。边类型可以是“治疗”、“导致”、“相似于”等。
- 事件图:节点类型可以是航班、机场。边类型可以是“目的地是”、“出发地是”等。
为了处理这种异质性,我们需要扩展标准的图卷积网络。
从标准 GCN 到关系 GCN
上一节我们回顾了标准 GCN。现在,我们来看看如何将其扩展到多关系场景。
在标准 GCN 中,每个节点通过聚合其邻居的信息来更新自己的表示。聚合操作通常是对邻居的表示进行线性变换后求和并归一化。其单层更新公式为:
公式:
h_v^(l+1) = σ( Σ_{u∈N(v)} (1 / c_v) * W^(l) * h_u^(l) )
其中 W^(l) 是第 l 层的共享权重矩阵。
在异构图中,边具有不同的关系类型。关系 GCN 的核心思想是:为不同的关系类型使用不同的变换矩阵。这样,来自不同关系类型邻居的信息会以不同的方式被转换。
因此,关系 GCN 的单层更新公式变为:
公式:
h_v^(l+1) = σ( Σ_{r∈R} Σ_{u∈N_r(v)} (1 / c_{v,r}) * W_r^(l) * h_u^(l) + W_0^(l) * h_v^(l) )
这里:
R是所有关系类型的集合。N_r(v)是通过关系r与节点v相连的邻居集合。W_r^(l)是专门用于关系r在第l层的变换矩阵。c_{v,r}是归一化常数,通常是关系r下节点v的入度。W_0^(l)用于处理节点自身的上一轮表示。
提升 RGCN 的可扩展性 ⚙️
当关系类型很多时(例如成百上千种),为每一层、每一种关系都学习一个独立的稠密矩阵 W_r 会导致参数量爆炸,容易过拟合且难以训练。以下是两种解决该问题的主要技术。
方法一:块对角矩阵
这种方法的思路是强制每个关系特定的变换矩阵 W_r 具有块对角结构。这意味着矩阵中只有沿对角线的若干个小块是非零的,其余部分为零。
优势:这显著减少了需要学习的参数数量,因为只需估计这些小块中的参数。
代价:这种结构限制了不同特征维度之间的交互(只有同一块内的维度能直接交互),可能需要更深的网络来弥补。
方法二:基变换分解
这是一种更优雅的权重共享方式。其核心思想是:所有关系特定的变换矩阵 W_r 都共享一组基矩阵 V_b,而每个 W_r 只是这些基矩阵的线性组合。
公式:
W_r = Σ_{b=1}^B a_{rb} * V_b
这里:
{V_1, V_2, ..., V_B}是一组共享的基矩阵(字典)。a_{rb}是标量系数,表示基矩阵V_b对构建关系r的变换矩阵的重要性。
优势:参数量从 |R| * d * d 大幅减少到 B * d * d + |R| * B。即使关系类型很多,我们只需要学习少量的基矩阵和组合系数,使模型更紧凑、更鲁棒。
在异构图上进行预测任务 🎯
我们已经构建了 RGCN 模型,现在来看看如何在异构图上执行具体的预测任务。
节点分类(实体分类)
这与同构图上的节点分类类似。RGCN 为每个节点生成最终的嵌入表示 h_v^(L)。然后,我们可以简单地添加一个预测头,例如一个线性层加 softmax 激活函数,来预测节点的类别。
公式(预测头):
y_v = softmax( W_class * h_v^(L) + b )
链接预测
链接预测在异构图中变得更复杂,因为我们需要预测“是否存在某种特定类型的边”。关键步骤在于数据划分和负样本生成。
数据划分(分层划分):我们不能随机拆分所有边,因为某些关系类型可能非常稀少。正确做法是对每种关系类型的边单独进行划分(分成训练/验证/测试集),然后再将各种关系类型的划分结果合并。这确保了即使罕见关系,在各个数据集中也有代表。
训练阶段的负采样:对于每个监督边(正样本)(e, r, a),我们通过“破坏”它来生成负样本。例如,保持头节点 e 和关系 r 不变,随机替换尾节点 a 为一个未通过关系 r 与 e 相连的节点(如 b)。必须确保生成的负边 (e, r, b) 在图中不存在。
评分函数:我们需要一个函数来为给定的三元组 (h, r, t) 打分。一个简单的方法是使用双线性变换:
公式:
score(h, r, t) = h^T * W_r * t
其中 h 和 t 是头尾节点的嵌入,W_r 是关系 r 的评分矩阵。
训练目标:使用交叉熵损失,最大化正样本的分数,最小化负样本的分数。
验证/评估:计算正样本边的得分,并计算其在一组负样本边中的排名。常用评估指标有:
- 命中率@K:正样本边排名在前 K 位的频率。
- 平均倒数排名:正样本边排名的倒数的平均值。值越大越好。
总结 📝
本节课我们一起学习了异构图的表示及其嵌入方法。
- 我们引入了异构图的概念,它包含多种节点和关系类型。
- 我们重点介绍了关系图卷积网络,它通过为不同关系类型分配不同的变换矩阵来扩展标准 GCN。
- 我们探讨了 RGCN 的可扩展性挑战,并学习了两种解决方案:使用块对角矩阵和基变换分解来减少参数量。
- 最后,我们讲解了如何在异构图上进行节点分类和链接预测任务,特别是链接预测中分层数据划分和负采样的重要性。


RGCN 的思想可以自然地扩展到其他图神经网络架构,如 GAT 或 GraphSAGE,从而构建出更强大、更灵活的多关系图学习模型。


课程 P29:10.2 - 知识图谱补全 🧠

在本节课中,我们将要学习知识图谱的基本概念,并重点探讨如何使用嵌入方法来完成知识图谱补全任务。知识图谱补全是预测图中缺失关系的关键技术,在信息检索、问答系统等领域有广泛应用。
什么是知识图谱?
知识图谱旨在以图结构的形式存储特定领域的知识。其核心思想是捕捉实体类型以及不同实体之间的关系。因此,图中的节点被称为“实体”,每个实体都有其类型标签。实体之间则通过不同类型的关系进行连接。
从这个角度看,知识图谱是异构图的一个特例,但它通常特指用于捕捉领域事实知识的结构。例如,在学术文献网络中,节点类型可以包括论文、作者、会议、年份。关系类型则可以是“发表于”、“完成于”、“标题为”、“作者是”、“引用”等。
以下是一个简单的知识图谱模式示例:
- 论文与会议通过“发表于”关系连接。
- 论文与论文通过“引用”关系连接。
- 论文具有“标题”和“出版年份”属性。
- 论文与作者通过“作者是”关系连接。
另一个例子是生物医学知识图谱,其节点类型可能包括药物、疾病、蛋白质、通路。关系类型则可以是“有作用”、“导致”、“与…相关”等。这种图谱将生物学知识编码为图结构。
知识图谱的应用
知识图谱在工业界被广泛用于捕捉领域背景知识和实体间关系。
- 信息检索:例如,在搜索引擎中查询“《泰坦尼克号》的导演是谁?”。系统通过知识图谱找到“《泰坦尼克号》”实体,再通过“导演”关系找到对应的人物实体,并可直接展示相关信息。没有图结构的数据编码,回答此类复杂查询将非常困难。
- 问答与对话代理:智能系统需要理解问题中包含的实体及其关系,才能给出准确回答。维基百科、IMDB等都可以作为构建知识图谱的数据源。
目前存在许多公开的知识图谱,如Freebase、维基数据、DBpedia等。它们通常规模巨大,包含数百万甚至数十亿的节点和边。
知识图谱补全任务
然而,这些大型知识图谱普遍存在一个显著问题:不完整性。图中存在大量缺失的关系。
知识图谱补全的核心任务就是:给定一个大规模但不完整的知识图谱,预测其中哪些潜在的关系是真实存在但被遗漏的。这可以被视为一种链接预测任务。
以Freebase知识图谱为例,它包含约5千万个实体、3.8万种关系类型和30亿条边。但统计显示,其中约94%的“人物”实体缺失“出生地”信息,约78%缺失“国籍”信息。
因此,知识图谱补全要解决的问题是:我们能否自动推断出某个给定实体的国籍?或者某个人物的出生地?这就是知识图谱补全任务。
总结


本节课我们一起学习了知识图谱的基本概念,它是一种用图结构存储实体和关系的知识库。我们了解到知识图谱虽然规模庞大,但普遍存在数据不完整的问题。因此,知识图谱补全——即预测图中缺失的关系——成为了一项至关重要且具有挑战性的任务。在接下来的章节中,我们将深入探讨如何利用嵌入技术来解决这一任务。


课程 P3:1.3 - 图表示的选择 📊

在本节课中,我们将学习如何为一个具体问题选择合适的图表示。图是一种强大的通用语言,可以描述演员、人际关系、蛋白质相互作用等多种系统。然而,如何定义图中的节点和边,将直接影响我们使用机器学习算法进行预测的能力和效果。
图的基本组成
上一节我们介绍了图的基本概念,本节中我们来看看图的正式组成部分。
一个图或网络由两种基本对象构成:
- 节点:也称为顶点,代表实体或对象。
- 边:也称为链接,代表节点之间的相互作用或关系。
整个系统被称为图或网络。我们通常用大写字母 N 或 V 表示节点集合,用大写字母 E 表示边集合。因此,一个图 G 可以形式化地定义为:
G = (V, E)
图表示的重要性
图是一种通用语言,这意味着同样的数学结构可以表示演员合作网络、社交网络或蛋白质相互作用网络。因此,同样的机器学习算法可以应用于这些不同的领域。
然而,为特定问题选择合适的图表示至关重要。例如,对于同一组人,根据“同事关系”构建的图与根据“性关系”构建的图完全不同。对于一组科学论文,根据“引用关系”构建的图与根据“标题共享词汇”构建的图,其质量和适用性也大相径庭。
因此,每当我们面对一个数据集,都需要仔细设计底层图:确定哪些对象是节点,它们之间应建立何种关系作为边。这个选择将决定我们能否成功利用网络进行分析和预测。
图的类型与概念
为了展示设计图表示时的选择,我们现在介绍几种常见的图类型和相关概念。
有向图与无向图
以下是两种基本的图类型:
- 无向图:边没有方向,用于建模对称关系(如友谊、蛋白质相互作用)。
- 有向图:边有方向,包含源节点和目标节点,用箭头表示。现实中的例子包括电话呼叫、金融交易和Twitter关注关系。
节点度
在无向图中,节点度 是指与该节点相邻的边的数量。例如,节点A的度为4。平均节点度 是网络中所有节点度的平均值。可以证明,平均节点度等于 2 * |E| / |V|,其中 |E| 是边数,|V| 是节点数。这是因为每条边在计算度时都被其两个端点各计算一次。
在有向图中,我们区分:
- 入度:指向该节点的边的数量。
- 出度:从该节点指出的边的数量。
二分图
二分图 是一种特殊的图,包含两种不同类型的节点,并且边只存在于不同类型节点之间,同类型节点之间没有边。以下是自然出现的二分图例子:
- 作者与论文(作者写了论文)
- 用户与电影(用户观看了电影)
- 顾客与产品(顾客购买了产品)
投影网络
从一个二分图可以衍生出投影网络。投影时,我们只保留其中一种类型的节点,并在两个节点之间建立连接,如果它们在原二分图中至少有一个共同的邻居。
例如,在“作者-论文”二分图中,投影到作者侧,就得到了合著网络:如果两位作者至少共同撰写过一篇论文,他们之间就有一条边。
图的表示方法
我们讨论了图的类型,现在来看看如何在计算机中表示图结构。
邻接矩阵
表示图的一种常用方法是邻接矩阵。对于一个有 n 个节点的图,我们创建一个 n x n 的方阵 A。对于无向图:
- 如果节点
i和j之间有边,则A[i][j] = 1,A[j][i] = 1。 - 如果无边,则为
0。
因此,无向图的邻接矩阵是对称的。对于有向图,邻接矩阵通常不对称。
节点的度可以通过对邻接矩阵的对应行(或列)求和得到。
现实网络的稀疏性
现实世界的网络通常非常稀疏。这意味着邻接矩阵中绝大多数元素都是0。例如,在社交网络中,一个人不可能与全球所有人成为朋友。因此,我们通常将邻接矩阵作为稀疏矩阵来存储和计算,以节省空间和时间。
其他表示方法
除了邻接矩阵,还有两种常见的表示方法:
- 边列表:简单地存储所有边的列表(如
(节点1, 节点2))。这种表示简单,但不便于进行图操作和分析。 - 邻接表:为每个节点存储一个其所有邻居的列表。这种表示对于大型稀疏网络非常高效,可以快速检索任意节点的邻居。
图的属性与扩展概念
图的结构不仅仅是节点和边,还可以携带丰富的附加信息。
属性图
节点、边乃至整个图都可以拥有属性。
- 边属性:例如权重(关系强度)、类型、符号(友好/敌对)、持续时间等。
- 节点属性:例如人的年龄、性别,或化学品的分子式等。
- 图属性:描述整个图所代表系统的属性。
边的权重等属性可以直接在邻接矩阵中表示,此时矩阵元素不再是0或1,而是具体的权重值。
自环与多重图
在图表示中,我们还可以考虑更复杂的情况:
- 自环:一条边连接一个节点到其自身。在邻接矩阵中,这体现在对角线元素上。
- 多重图:允许两个节点之间存在多条边。这可以表示为带权图(权重为边数),或者单独表示每条边(如果边属性不同)。
连通性
连通性 是图的一个重要性质。
- 对于无向图,如果任意两个节点之间都存在一条路径,则该图是连通的。否则,图由多个连通分量组成。
- 对于有向图,连通性有两种:
- 弱连通:忽略边的方向后,图是连通的。
- 强连通:对于任意一对节点,都存在从一个节点到另一个节点的有向路径。图中满足此条件的最大节点子集称为强连通分量。
邻接矩阵的块对角线结构可以直观反映图的连通分量。
总结
本节课中,我们一起学习了如何为机器学习任务选择合适的图表示。我们首先回顾了图在多种应用中的通用性。然后,我们深入探讨了设计图表示时的关键选择:包括使用有向图还是无向图,是否采用二分图结构,以及如何为边和节点赋予权重或属性。


我们还介绍了图的几种数学和计算机表示方法,特别是邻接矩阵,并理解了现实世界网络普遍具有的稀疏特性。最后,我们讨论了图的一些基本性质,如节点度、连通性等,这些概念是后续进行图分析和算法设计的基础。正确理解和选择图表示,是成功应用图机器学习的第一步。


课程P30:10.3 - 知识图谱补全 🧠

在本节课中,我们将学习知识图谱补全任务,并探讨完成该任务的各种方法。我们将介绍几种具有不同名称的方法,如TransE、TransR、DistMult和ComplEx,并理解它们各自能够捕获和预测何种类型的关系。
知识图谱补全任务概述
知识图谱补全任务的核心是:给定一个庞大的知识图谱,我们能否推断或预测其中缺失的信息?因为知识图谱通常是不完整的。
该任务的具体形式是:给定头节点和关系类型,我们需要预测缺失的尾节点。这与经典的链接预测任务略有不同,后者是预测整个图中缺失的所有链接,而这里我们关注的是特定节点和特定关系下的预测。
例如,我们可能想知道“J.K.罗琳”与“科幻”这一体裁是否相连。我们给定头节点“J.K.罗琳”和关系“体裁”,目标是预测尾节点“科幻”。
我们将通过节点嵌入来完成这个任务。知识图谱中的每个实体(节点)都将学习到一个嵌入向量。这里我们主要使用浅层嵌入,即直接为每个实体学习一个向量,而不使用图神经网络,以简化模型。
知识图谱通常表示为一组三元组 (头实体, 关系, 尾实体)。例如,(巴拉克·奥巴马,国籍,美国)。
核心思想是:将实体和关系建模为嵌入空间中的点和向量。对于真实的三元组 (h, r, t),我们的目标是让 头实体h和关系r的组合嵌入 尽可能接近 尾实体t的嵌入。
不同的方法主要区别在于如何定义“组合嵌入”以及如何衡量“接近程度”。
TransE:基于平移的嵌入模型 🚶♂️
上一节我们介绍了任务的基本设定,本节我们来看第一个也是最直观的方法——TransE。它的核心直觉是“平移”。
TransE希望学习到头实体h、尾实体t和关系r的嵌入向量,并满足以下公式:
h + r ≈ t
这意味着,如果我们从头实体h的嵌入点出发,沿着关系r对应的向量方向移动,应该到达尾实体t的嵌入点。
例如,对于(巴拉克·奥巴马,国籍,美国),我们希望“巴拉克·奥巴马”的向量加上“国籍”关系的向量,结果接近“美国”的向量。并且,这个“国籍”向量应该适用于任何人和其国籍国家。
评分函数用于衡量头尾实体通过关系组合后的接近程度,在TransE中通常使用负的L2范数距离:
score = -|| h + r - t ||
距离越小(或负值越大),表示三元组成立的可能性越高。
训练时,模型参数(所有实体和关系的嵌入)被随机初始化。我们会采样一个正例三元组和一个“损坏”的三元组(例如,保持h和r不变,随机替换t为一个错误的实体)。学习目标是使正例的距离小于损坏样本的距离。
TransE的优点是简单直观,它将关系视为实体空间中的平移操作。
现在,我们需要思考:TransE能够学习哪些类型的关系模式?关系可以具有不同的属性,例如对称性、互逆性等。
以下是几种重要的关系模式:
- 对称/反对称关系:对称关系(如“室友”)是相互的;反对称关系(如“上位词/下位词”)是单向的。
- 互逆关系:如果关系r1连接h到t,则存在另一个关系r2连接t到h(如“导师/学生”)。
- 复合关系:如果关系r1连接x到y,关系r2连接y到z,则存在关系r3连接x到z(如“母亲的丈夫是父亲”)。
- 一对多关系:一个头实体可以通过同一种关系连接到多个尾实体(如“指导学生”)。
那么,TransE能处理这些模式吗?
- 反对称关系:可以。因为从h通过r到达t后,再从t通过同一个r无法回到h。
- 互逆关系:可以。只需让互逆的两个关系向量互为相反数,即
r2 = -r1。 - 复合关系:可以。复合关系r3的向量可以表示为
r3 = r1 + r2。 - 对称关系:无法处理。要使
h + r = t且t + r = h同时成立,唯一解是r = 0且h = t,这迫使不同实体具有相同嵌入,不合理。 - 一对多关系:无法处理。要使
h + r = t1和h + r = t2同时成立,唯一解是t1 = t2,这迫使不同的尾实体具有相同嵌入,不合理。
因此,TransE虽然简单有效,但在处理对称和一对多关系时存在局限。
TransR:关系特定空间的平移模型 🧩
为了解决TransE的局限性,我们引入了TransR。它的核心思想是:为每种关系设计一个独立的嵌入空间,并在该关系特定空间中进行平移操作。
在TransR中,实体被嵌入到一个实体空间,而每个关系r则关联一个关系空间以及一个将该实体从实体空间投影到关系空间的投影矩阵Mr。
对于三元组(h, r, t),TransR首先使用关系特定的矩阵Mr将实体嵌入h和t投影到关系r的空间中,然后在该空间内应用类似TransE的平移思想。评分函数为:
score = -|| Mr*h + r - Mr*t ||
这种方法带来了更大的灵活性。
- 对称关系:可以处理。投影矩阵Mr可以将两个不同的实体(如室友)映射到关系空间中的同一点,然后只需设置平移向量
r = 0即可满足对称性。 - 反对称关系:可以处理。原理与TransE类似,在投影后的空间中,从h到t和从t到h的路径不同。
- 一对多关系:可以处理。投影矩阵Mr可以将多个不同的尾实体(如多个学生)映射到关系空间中的同一点,使得
Mr*h + r能够同时接近它们。 - 互逆关系:可以处理。要求两个互逆关系的投影矩阵相同,且它们的平移向量互为相反数。
那么,TransR有什么缺点呢?它无法处理TransE能够轻松处理的复合关系。因为每个关系都有自己的投影空间,我们不知道如何在不同关系空间之间进行组合。从空间A到空间B,再到空间C的变换,无法简单地用一个从A到C的变换来表示。
DistMult:基于双线性评分的模型 ✖️
我们介绍了两种基于平移的模型,现在来看一种改变评分函数思路的方法——DistMult。它不再使用距离作为评分,而是采用双线性模型。
DistMult将实体和关系都嵌入到同一个向量空间中,并使用以下评分函数:
score = sum( h_i * r_i * t_i ), 其中i遍历向量的每个维度。
这可以写成向量形式:score = h^T * diag(r) * t
其中 diag(r) 是一个以向量r为对角线元素的对角矩阵。
这个评分函数可以理解为:关系r定义了一个超平面,其法向量由 h * r(逐元素乘积)决定。评分是尾实体t与该法向量的点积(余弦相似度)。如果三元组成立,t应该落在超平面的正确一侧(得分高);否则得分低。
让我们分析DistMult的能力:
- 一对多关系:可以处理。多个尾实体可以位于超平面的同一侧。
- 对称关系:可以处理。因为评分函数
h^T * diag(r) * t对于h和t是对称的(交换h和t结果不变)。 - 反对称关系:无法处理。正是由于上述对称性,它无法区分
(h, r, t)和(t, r, h),因此不能建模单向关系。 - 互逆关系:无法处理。要使
score(h, r1, t)和score(t, r2, h)都高,唯一简单解是r1 = r2,但这会将互逆关系错误地建模为对称关系。 - 复合关系:无法处理。由多个关系组合诱导出的数据分布,无法用单个双线性超平面来完美表达。
ComplEx:复数空间嵌入模型 🔮
最后,我们介绍ComplEx模型,它将嵌入空间从实数域扩展到复数域,以克服DistMult的一些限制。
在ComplEx中,实体和关系的嵌入都是复数向量,包含实部和虚部。它使用一个改进的评分函数:
score = Re( sum( h_i * conj(r_i) * t_i ) )
其中 conj(r_i) 是关系向量第i维的复共轭,Re() 表示取结果的实部。
引入复共轭操作打破了评分的对称性,从而带来了新的建模能力:
- 反对称关系:可以处理。利用复共轭的非对称性,可以区分
(h, r, t)和(t, r, h)。 - 对称关系:可以处理。只需将关系向量的虚部设为零,即可退化为DistMult的对称形式。
- 互逆关系:可以处理。通过设置两个互逆关系向量互为复共轭,即
r2 = conj(r1)。 - 复合关系:无法处理。与DistMult类似,其评分函数形式限制了它对关系组合的建模能力。
- 一对多关系:无法处理。原因与DistMult相同。
方法总结与实践建议 📊
本节课我们一起学习了四种用于知识图谱补全的嵌入方法。下表总结了它们对不同关系模式的建模能力:
| 方法 | 嵌入空间 | 核心思想 | 对称 | 反对称 | 互逆 | 复合 | 一对多 |
|---|---|---|---|---|---|---|---|
| TransE | 实数空间 | 关系即平移 | ❌ | ✅ | ✅ | ✅ | ❌ |
| TransR | 实体空间+关系空间 | 关系特定投影+平移 | ✅ | ✅ | ✅ | ❌ | ✅ |
| DistMult | 实数空间 | 双线性评分(超平面) | ✅ | ❌ | ❌ | ❌ | ✅ |
| ComplEx | 复数空间 | 双线性评分+复共轭 | ✅ | ✅ | ✅ | ❌ | ❌ |
注:✅ 表示能够较好建模,❌ 表示难以或无法建模。
不同的知识图谱可能具有截然不同的关系模式。在实践中,没有一种方法在所有情况下都是最好的。
选择建议如下:
- TransE 是一个很好的起点,它简单、直观,且能处理复合关系。
- 如果需要建模一对多关系,应避免使用TransE。
- 如果需要建模反对称关系,应避免使用DistMult。
- 一般来说,TransR和ComplEx能够建模更多样化的关系类型,表达能力更强。还有像RotatE(在复数空间做旋转,类似TransE)这样的模型也值得尝试。
- 最终选择应基于你的知识图谱特点和你想要预测的关系类型。
课程总结


在本节课中,我们一起学习了知识图谱补全这一重要任务,并深入探讨了四种不同的嵌入方法:TransE、TransR、DistMult和ComplEx。这些方法在嵌入空间(实数/复数)和评分函数(平移/双线性)上各有不同,从而具备了不同的表达能力,能够建模不同类型的关系。理解这些方法的原理和优缺点,有助于我们在实践中根据具体任务选择最合适的模型。



课程P31:11.1 - 知识图谱推理 🧠
在本节课中,我们将学习如何在知识图谱中进行推理。具体来说,我们将探讨如何利用嵌入技术,来回答知识图谱中的多跳查询和复杂逻辑查询。我们将从简单的单跳查询开始,逐步扩展到路径查询和合取查询,并介绍一种名为“查询到盒子”的方法。
单跳查询与知识图谱补全
上一节我们介绍了知识图谱的基本概念。知识图谱由节点和节点间不同类型的关系构成。我们曾定义过一个任务,称为知识图谱补全任务。其核心问题是:给定一个庞大的知识图谱,我们能否预测其中缺失的关系?例如,给定一个头实体和一个关系,我们想要预测缺失的尾实体。
这本质上等同于回答一个单跳查询。例如,查询“药物富马酸替诺福韦酯会引起哪些副作用?”,就是从实体“富马酸替诺福韦酯”出发,沿着“引起”关系进行一步预测。
因此,知识图谱补全任务可以形式化为回答单跳查询。其目标是估计在头实体 h 和关系 r 下,尾实体 t 存在的可能性。我们可以用公式表示这个预测任务:
公式: P(t | h, r)
其中,P 表示概率,h 是头实体,r 是关系,t 是待预测的尾实体。
路径查询:多步推理
本节中,我们来看看如何将单跳查询推广到更复杂的多步推理,即路径查询。
一个 n 跳的路径查询 q 可以表示为一个锚点实体 V_a(起始实体)和一系列关系 [R1, R2, ..., Rn]。答案则是在知识图谱 G 中,从 V_a 开始,依次经过这些关系后所能到达的实体集合。
公式表示: [[q]]_G = { v | V_a —R1→ ... —Rn→ v }
用图形化的“查询计划”表示,即从锚点实体出发,依次遍历关系 R1, R2, ..., Rn。
例如,查询“哪些蛋白质与富马酸替诺福韦酯引起的副作用相关?”就是一个路径查询。其锚点实体是“富马酸替诺福韦酯”,关系序列是 [引起, 关联]。
以下是回答路径查询的逻辑步骤:
- 从锚点实体“富马酸替诺福韦酯”出发。
- 沿着“引起”关系,找到所有由此药物引起的副作用实体(如头痛、脑出血等)。
- 从这组副作用实体出发,再沿着“关联”关系,找到所有相关的蛋白质实体。
- 最终得到的蛋白质集合就是该查询的答案。
在知识图谱完整的情况下,我们只需按照上述步骤遍历图谱即可得到答案。
不完整知识图谱的挑战
然而,现实中的知识图谱通常是不完整的。许多实体间的关系是缺失或未知的。例如,我们可能尚未发现“富马酸替诺福韦酯”会导致“呼吸短促”这一事实。
如果知识图谱缺失了这条“引起”边,那么在上述路径查询中,我们就无法通过“呼吸短促”这个节点,进一步发现蛋白质“B.E.R.K.2”也是答案之一。直接遍历不完整的图谱会导致答案遗漏。
一个直观的想法是:先利用知识图谱补全技术预测所有可能缺失的边,将图谱“补全”,然后再进行遍历。但这种方法存在严重问题:
- 计算爆炸:补全后的图谱会新增大量边(即使是概率形式的)。当执行长路径查询时,每一步都可能扩展到大量节点,导致计算量随查询长度呈指数级增长。
- 管理复杂:需要跟踪和处理这些带有概率的新增边,使得遍历过程变得异常复杂和低效。
因此,我们需要一种能够直接在不完整知识图谱上进行复杂查询推理的方法。
预测式查询:将推理转化为预测
为了解决上述挑战,我们引入“预测式查询”的概念。核心思想是:不通过显式补全和遍历图谱来回答查询,而是将“回答查询”本身定义为一个复杂的预测任务。
这意味着,我们将查询 q(如一个路径查询)作为输入,模型的目标是直接预测出属于答案集的实体。这种方法的关键优势在于:
- 隐式处理不完整性:模型在预测过程中,能够隐式地考虑和处理知识图谱中缺失的信息,而无需先显式地补全所有边。
- 泛化能力强:我们可以在训练时让模型学习如何回答各种基本查询模式。在测试时,即使遇到从未见过的复杂查询组合,模型也应能给出答案。
- 是链接预测的泛化:单跳的链接预测任务(预测
(h, r, ?))只是预测式查询的一个特例(路径长度n=1)。我们现在将其推广到任意多步的预测任务。

通过这种范式转换,我们将复杂的图谱遍历问题,转化为一个可学习的嵌入空间中的预测问题,从而能够高效、稳健地回答知识图谱上的复杂查询。
总结
本节课中,我们一起学习了知识图谱推理的基本框架。
- 我们首先回顾了单跳查询,它等价于知识图谱补全任务。
- 接着,我们将其推广到路径查询,它允许进行多步推理。
- 我们指出了在不完整知识图谱上直接进行遍历查询的缺陷。
- 最后,我们引入了预测式查询的新范式,其核心是将回答查询视为一个直接的预测任务,从而能够隐式处理知识缺失问题,并泛化了链接预测任务。

这为我们后续学习具体的推理方法(如处理合取查询的“查询到盒子”方法)奠定了重要的概念基础。



课程 P32:11.2 - 回答预测性查询 🔍
在本节课中,我们将学习如何利用知识图谱的嵌入空间结构来预测给定查询的答案。我们将从TransE方法的基础思想出发,探讨如何将其推广到处理多跳推理和包含逻辑运算符(如合取)的复杂查询。
从TransE到查询嵌入
上一节我们介绍了知识图谱补全的基本概念。本节中,我们来看看如何将TransE方法的思想用于回答预测性查询。
TransE知识图谱补全方法的核心思想是:给定头实体 H 和关系 R,我们希望尾实体 T 的嵌入满足 H + R ≈ T。其评分函数通常写作:
score(H, R, T) = - || H + R - T ||
这可以解释为:我们首先将查询嵌入为 Q = H + R,然后目标是使查询嵌入 Q 与答案实体 T 的嵌入之间的距离最小化。
例如,从实体“巴拉克·奥巴马”开始,加上关系“国籍”对应的向量,我们得到一个查询嵌入点 Q。我们希望 Q 与实体“美国人”的嵌入距离小,而与“纽约人”的嵌入距离大。
这种方法的优雅之处在于,查询嵌入只需简单的向量加法即可获得。
推广到多跳推理路径查询
理解了如何嵌入单关系查询后,我们可以将TransE自然地推广到多跳推理。
我们可以定义一个查询 Q,它由一个锚点实体和一系列关系组成。查询嵌入的生成方式是:从锚点实体的嵌入开始,依次加上每个关系对应的向量。
Q = E_anchor + R1 + R2 + ... + Rn
生成查询嵌入 Q 后,我们只需在嵌入空间中寻找与 Q 最接近的实体,这些实体就是预测的答案。
以下是一个多跳查询的示例步骤:
- 从药物“氟维司群”的嵌入开始。
- 加上“导致”关系对应的向量,到达一个代表其副作用的区域。
- 再从此区域加上“与...相关”关系对应的向量,到达最终查询嵌入点
Q。 - 与
Q最接近的实体(蛋白质)即为答案。
这种方法之所以有效,是因为TransE具有关系组合性,允许我们将多个关系向量串联起来。
处理包含逻辑运算符的复杂查询
上一节我们处理了路径查询,本节中我们来看看如何回答更复杂的查询,例如包含合取(AND)逻辑运算符的查询。
考虑这样一个查询:“哪些药物既会导致呼吸短促,又能治疗与蛋白质ESR2相关的疾病?” 这涉及到两个子路径的交集。
如果知识图谱完整,我们可以通过图谱遍历来回答:
- 从ESR2出发,沿“与...相关”关系找到相关疾病,再沿“被...治疗”关系找到治疗这些疾病的药物集合A。
- 从“呼吸短促”出发,沿“由...导致”关系找到导致该症状的药物集合B。
- 计算集合A与集合B的交集,即为答案。
然而,现实中的知识图谱往往不完整,缺失的边会使遍历失败。因此,我们需要在嵌入空间中实现这种集合操作。
关键洞察在于:查询计划中的中间节点(灰色节点)代表的是实体集合,而非单个实体。因此,我们需要解决两个问题:
- 如何在嵌入空间中表示一个实体集合?
- 如何在潜在空间中定义交集等逻辑运算符?
我们将在后续课程中探讨解决这些问题的具体嵌入方法。
核心要点总结
本节课中我们一起学习了如何利用嵌入技术回答知识图谱上的预测性查询。
- 基础思想:将查询嵌入到与实体相同的向量空间中,答案即为最接近查询嵌入的实体。
- 路径查询:通过连续叠加关系向量(
Q = E + R1 + R2 + ...)来嵌入多跳查询,这是TransE方法组合性的直接应用。 - 复杂查询:对于包含合取等逻辑运算的查询,需要将查询计划中的中间节点视为实体集合,并在嵌入空间中定义集合的交集操作。
- 嵌入优势:与遍历相比,嵌入方法能够通过全局信息隐式地补全缺失的关系,从而对不完整的知识图谱进行鲁棒的推理。


通过将查询表示为向量空间中的点,我们能够以一种统一、可计算的方式处理从简单到复杂的各种预测性问题。


课程 P33:11.3 - 知识图谱上的查询到框推理 🧠

在本节课中,我们将学习一种名为“查询到框”的方法,它允许我们使用“框嵌入”对知识图谱进行推理。我们将探讨如何表示复杂的查询,以及如何在低维向量空间中执行逻辑操作,如交集和并集。
动机与问题设定
上一节我们介绍了在知识图谱上进行推理的挑战。本节中,我们来看看如何回答更复杂的预测性问题,特别是那些包含合取(交集)操作的查询。
我们需要解决两个核心问题:
- 如何在嵌入空间中表示一组实体。
- 如何在嵌入空间中定义交集操作符,以便快速找到两组实体的交集。
核心概念:框嵌入 📦
关键的洞察是引入“框嵌入”的概念。这意味着我们将所有实体和关系嵌入为多维空间中的矩形框。
一个框由两点定义:
- 中心点:表示框的位置。
- 角偏移量:表示框在各个维度上的大小。
公式表示:一个框可以表示为 (中心点, 角偏移量)。
直觉上,我们希望由某个查询(例如,遵循某个关系)所引出的所有实体,都能被紧密地包裹在一个框内。这样,实体集就与一个几何对象(框)关联起来。
为什么使用框?
使用框嵌入的主要原因是,框之间的交集可以很好地被定义。两个框的交集本身也是一个框(可能是一个空框或尺寸缩小的框)。
这意味着我们可以定义符合逻辑操作符的几何变换。当我们遍历知识图谱寻找答案时,每一步都会产生一组可达实体。我们现在用一个框来对这组实体进行建模。这个框提供了一个强大的抽象,因为它包含了这些实体,并且我们可以轻松地在其上定义几何交集操作符。无论我们以何种方式组合框,交集结果总是一个框,这保留了组合性。
方法框架:需要学习什么?
为了实现框嵌入推理,我们需要学习以下组件:
以下是需要学习的模型参数:
- 实体嵌入:每个实体被嵌入为一个“平凡”的框,即一个体积为零的点框。
- 关系嵌入/投影算子:每个关系对应一个学习到的“投影”算子
P。它接收一个输入框,并根据该关系移动和缩放这个框(改变其中心和偏移量),从而输出一个新框。 - 交集算子:这是一个新的学习组件。它接收多个框作为输入,并输出一个代表它们交集的单个框。这个算子比简单的数学交集更灵活,具有可学习的参数。
工作流程示例
让我们通过一个具体查询来理解工作流程:“哪些疾病与蛋白质ESR2相关,并且其治疗方式也能引起呼吸急促?”
我们的查询计划是:
- 从锚实体
ESR2开始,沿“相关”关系投影,得到与ESR2相关的所有疾病的框。 - 从锚实体“呼吸急促”开始,沿“引起”关系投影,得到能引起呼吸急促的所有事物的框。
- 计算这两个框的交集,交集框中的实体就是答案。
代码逻辑描述:
框_Q1 = 投影算子_P_相关(实体_ESR2的嵌入框)
框_Q2 = 投影算子_P_引起(实体_呼吸急促的嵌入框)
答案框 = 交集算子_J(框_Q1, 框_Q2)
答案 = 所有位于“答案框”内的实体
交集算子的设计
我们如何定义这个学习的交集算子 J 呢?直觉上,我们希望:
- 交集框的中心 应该靠近所有输入框的中心。
- 交集框的尺寸(偏移量) 应该收缩,因为交集的集合小于任何输入集合。
具体定义如下:
中心计算:交集框的中心是输入框中心的加权和。权重通过一个可学习的注意力机制(Softmax)计算,该机制评估每个输入框对最终交集中心的重要性。
公式:中心_交集 = Σ (注意力权重_i * 中心_框_i)
偏移量计算:首先取所有输入框偏移量的最小值(保证收缩),然后通过一个带sigmoid激活的可学习函数进行变换,以增加模型表达能力。
公式:偏移量_交集 = sigmoid( f_偏移量( min(偏移量_框1, 偏移量_框2, ...) ) )
距离函数与答案评分
在现实中,由于数据噪声,答案实体可能并不严格在框内。因此,我们需要定义实体点与框之间的距离。
我们分两种情况定义距离:
- 如果点在框内,距离是点到框中心的距离乘以一个小于1的缩放因子
α。这鼓励答案实体靠近框中心。 - 如果点在框外,距离是点到框最近表面的距离加上一个惩罚项。
最终,一个实体作为查询答案的得分,可以通过计算该实体嵌入点到查询框的(负)距离来获得。距离越小(得分越高),是该答案的可能性越大。
如何处理析取(并集/OR)查询? ➕
一个自然的问题是:能否处理包含析取(OR)操作的查询?答案是在低维空间中直接嵌入任意并集操作是困难的。
原因:为了在 m 个互不重叠的实体集合上表示任意的并集操作,所需的嵌入维度至少需要 m-1 维。对于大规模知识图谱(数万实体),这需要不可接受的高维度。
解决方案:利用逻辑等价性。任何一阶逻辑查询都可以重写为析取范式,即一系列合取查询的析取(OR)。
原始查询 -> 析取范式 = (合取查询1) OR (合取查询2) OR ...
这样做的好处是,所有并集操作都被推到了最后一步。我们可以先利用已有的框投影和交集算子,为每个合取查询生成一个答案框。最后一步,实体对于整个析取查询的距离,定义为它到各个合取查询框的最小距离。
公式:距离(实体v, 查询Q) = min( 距离(实体v, 框_合取查询1), 距离(实体v, 框_合取查询2), ... )
只要实体是任何一个合取查询的答案,它到整体查询的距离就会很小。
模型训练
现在我们已经讨论了方法框架,那么如何训练模型来学习这些嵌入和算子呢?
训练过程类似于知识图谱补全,采用负采样策略:
以下是训练步骤:
- 采样查询:从训练知识图谱中随机采样各种结构的查询(单跳、多跳、含交集的查询等)。
- 确定正负样本:对于每个查询,已知的答案实体作为正样本。随机采样一些非答案实体作为负样本(需小心避免采到未知的正确答案)。
- 计算得分与损失:使用模型将查询嵌入为框,计算正样本和负样本实体到该框的距离得分。目标是最大化正样本得分,最小化负样本得分。
- 优化:通过梯度下降优化损失函数,更新所有参数(实体嵌入、投影算子参数、交集算子参数)。
通过这种方式,模型学会将答案实体嵌入到查询框内,而非答案实体排除在外。
实例演示
在一个包含约1.5万个实体的真实知识图谱上,我们可以进行查询:“所有演奏弦乐器的男性器乐演奏家”。
- 投影“弦乐器”:从“弦乐器”概念节点出发,投影得到包含所有具体弦乐器实例的框。
- 投影“演奏者”:将上一步的框沿“演奏”关系投影,得到所有弦乐器演奏者的框。
- 投影“男性”:从“男性”概念节点出发,投影得到所有男性实体的框。
- 计算交集:对“弦乐器演奏者框”和“男性框”应用交集算子,得到最终的答案框。
可视化显示,系统能够高精度地识别出答案实体,展示了该方法对复杂逻辑查询的有效性。
总结
本节课中,我们一起学习了基于嵌入的知识图谱逻辑推理方法——查询到框。
- 核心思想:将多跳逻辑查询的答案预测任务,转化为在低维向量空间中“导航”并寻找一组实体(用框表示)的任务。
- 关键创新:
- 引入框嵌入来表示实体集合。
- 定义可学习的投影算子来模拟关系遍历。
- 设计可学习的交集算子来处理合取查询。
- 通过重写为析取范式并定义最小距离,来处理析取查询。
- 优势:该方法具有可扩展性(回答查询仅需简单的几何操作)和鲁棒性(不依赖于知识图谱中单个缺失的链接)。


通过将逻辑操作映射为几何空间中的变换,我们能够高效且灵活地对不完整的知识图谱进行复杂推理。


课程 P34:12.1 - 快速神经子图匹配与计数 🧠🔍

在本节课中,我们将学习一个非常有趣的问题:子图匹配与子图计数,也称为频繁子图匹配与计数。令人兴奋的是,我们将探讨如何利用神经网络来解决这个经典的组合问题,并将其转化为机器学习问题。我们将使用嵌入和图神经网络来实现高效、可扩展且准确的解决方案,从而替代复杂的离散匹配与计数方法。
概述:什么是网络构建块?🧱
我们通常将一个大图视为由许多小“积木”(即小子图)组合而成。就像用乐高积木搭建房屋一样,大图是由这些小碎片组合而成的。我们的目标是识别出这些最常见的“乐高积木”,即网络中最常见的子结构或模式。通过理解这些构建块,我们可以描述和区分不同的网络。

例如,观察一组分子(可以表示为图),我们可以问:在这些图中,常见的子结构是什么?识别出共同的亚结构(例如某个特定的官能团)可以帮助我们理解分子的性质(如酸性)。在许多领域中,反复出现的结构组件决定了其功能或行为。

我们将从三个步骤来解决这个问题:
- 定义子图和网络主题。
- 讨论如何识别重要的主题。
- 介绍如何使用图神经网络和嵌入来快速识别公共子图,而无需进行昂贵的离散匹配。
第一部分:定义子图与网络主题 📐
上一节我们概述了课程目标,本节中我们将正式定义子图和网络主题。
子图的两种形式化定义
以下是形式化网络构建块的两种方法:
1. 节点诱导子图
- 定义:给定图
G=(V, E),其节点诱导子图G'=(V', E')满足:V'是V的子集,而E'包含了原图G中所有端点均在V'内的边。 - 核心概念:子图完全由所选节点集
V'决定,并包含这些节点之间的所有原始边。通常简称为“诱导子图”。
2. 边诱导子图
- 定义:给定图
G=(V, E),其边诱导子图G'=(V', E')满足:E'是E的子集,而V'是E'中所有边的端点的集合。 - 核心概念:子图由所选边集
E'决定,节点集随之确定。通常称为“非诱导子图”或简称为“子图”。
选择哪种定义取决于具体领域。在化学等领域,人们通常使用节点诱导子图;而在知识图谱等领域,可能更常用边诱导子图。
图同构与子图同构
要判断一个图是否包含另一个图,我们需要引入“同构”的概念。
图同构
- 问题:判断两个图
G1和G2是否在结构上完全相同。 - 定义:称
G1和G2同构,如果存在一个双射函数f: V(G1) -> V(G2),使得对于G1中的任意边(u, v),在G2中都存在边(f(u), f(v))。函数f称为图同构。 - 重要性:图同构问题的计算复杂度尚未明确,它既未被证明是NP完全问题,也未有已知的多项式时间算法,是计算机科学中的一个重要开放问题。
子图同构
- 定义:称图
G1是图G2的子图(即G1子图同构于G2),如果G2存在一个子图(可以是节点诱导或边诱导的)与G1同构。 - 示例:若存在从
G1节点到G2节点的双射映射,且G1中的边关系在G2的对应节点间得以保持,则G1是G2的子图。注意,G2的对应节点间允许存在额外的边。
非同构子图的数量
当我们谈论给定大小的子图时,通常指的是所有“非同构”的子图,即结构互不相同的子图。这个数量随着节点数的增加而急剧增长。
- 示例:对于无向连通图,3个节点时有13种不同结构,4个节点时已有多种不同结构。对于有向图,数量更多。
- 挑战:由于不同子图的数量增长极快,通常只计算大小为3、4或5的构建块,因为规模更大时,跟踪所有可能子图会变得非常困难。
第二部分:定义网络主题及其重要性 🎯
上一节我们定义了子图,本节中我们来看看如何定义反复出现且重要的子图模式,即网络主题。
网络主题的定义
网络主题被定义为图中反复出现的、互连的、显著的小型节点诱导子图模式。这个定义包含三个关键部分:
- 模式:一个小型的节点诱导子图。
- 反复出现:必须在图中出现多次,即具有高频率。
- 显著/重要:其出现频率必须显著高于随机预期。
为了量化“显著高于随机预期”,我们需要一个空模型作为比较基准。
子图频率
首先,我们需要量化一个子图在目标图中出现的次数,即计算其频率。有两种常见的定义方式:
1. 图级子图频率
- 定义:给定查询图
G_q和目标图G_T,频率F(G_q, G_T)是G_T中节点子集的数量,这些子集诱导出的子图与G_q同构。 - 示例:一个三角形查询图在目标图中出现了两次,则频率为2。
2. 节点级子图频率
- 定义:查询图
G_q附带一个指定的“锚”节点。频率是指能够将G_q映射到G_T中,且锚节点被映射到不同目标节点的方式数量。 - 示例:一个星形图(中心为锚节点)在一个拥有100个叶节点的目标图中,节点级频率为1(只有一种方式映射中心锚点)。但如果锚节点是一个叶节点,则频率可能为100(有100种方式映射那个叶节点锚点)。
随机图空模型
为了评估显著性,我们需要生成与真实图具有某些相同统计特性(如节点数、边数)的随机图,作为空模型。常用的有两种:
1. Erdős–Rényi (ER) 随机图模型 G(n, p)
- 方法:给定节点数
n和连边概率p。初始化n个孤立节点,对于每一对节点,以概率p创建一条边。 - 代码描述:
# 伪代码:生成 ER 随机图 initialize graph with n isolated nodes for each pair of nodes (i, j): if random() < p: # random() 返回 [0,1) 均匀随机数 add edge between i and j
2. 配置模型
- 目标:生成一个随机图,其度序列(每个节点的度数)与真实图
G_T相同。 - 方法:
- 为每个节点
i创建d_i个“存根”(stub),d_i是其目标度数。 - 随机配对所有存根。
- 将配对的存根所属的节点连接起来(忽略自环和重边,在实际中大图中其概率很小)。
- 为每个节点
- 优势:比ER模型更精确地保留了原图的局部连接特性,通常作为首选的空模型。
主题显著性与Z分数
现在我们可以定义主题的统计显著性。
Z分数
- 定义:用于量化一个主题在真实图中相对于随机图是否过表征或欠表征。
- 公式:
Z_i = (N_i_real - mean(N_i_rand)) / std(N_i_rand)
其中:N_i_real:主题i在真实图中的出现次数。mean(N_i_rand):主题i在多个随机图实例中出现的平均次数。std(N_i_rand):上述次数的标准差。
- 解释:
Z_i ≈ 0:该主题的出现频率与随机预期无异。|Z_i| > 2:通常认为该主题在统计上显著(过表征或欠表征)。
网络显著性剖面
- 定义:为了比较不同网络,我们将所有主题的Z分数归一化。
- 公式:对于主题
i,其显著性剖面分量为SP_i = Z_i / sqrt( sum(Z_j^2) ),其中求和遍历所有考虑的主题。 - 作用:得到一个与网络规模无关的、可比较的显著性向量。
主题分析示例
通过计算不同网络(如基因调控网络、神经网络、社交网络、词邻接网络)的显著性剖面,我们可以发现:
- 社交网络:特定的三角关系(两人是朋友,但与第三人不是共同朋友)通常显著欠表征,这与社交理论(三角闭合)一致。
- 其他网络:如前馈循环在信号网络中可能过表征。
这些模式为我们理解网络的功能提供了深刻见解。
总结 📝
本节课中,我们一起学习了子图匹配与计数的核心概念:
- 子图与同构:我们定义了节点诱导和边诱导子图,并介绍了图同构与子图同构的概念,这是判断图包含关系的基础。
- 网络主题:我们定义了网络主题作为反复出现且统计显著的子图模式。其重要性通过比较真实图与随机空模型(如配置模型)中子图的频率来评估。
- 显著性量化:我们引入了Z分数来量化主题的过表征或欠表征程度,并通过网络显著性剖面进行归一化比较。
- 应用洞察:识别重要的网络主题有助于我们理解特定领域网络(如社交、生物、信息网络)的独特功能和结构特性。


总之,主题和子图是网络的基本构建块。子图同构和计数是计算上的难题。了解哪些主题是常见且重要的,能够使我们深入理解数据集的独特特征,而随机图空模型为我们提供了评估显著性的关键参考点。


课程 P35:12.2 - 神经子图匹配 🧠🔍

在本节课中,我们将学习一种名为“神经子图匹配”的机器学习方法。该方法旨在快速判断一个小的查询图是否是一个大的目标图的子图,而无需进行复杂的组合匹配计算。
问题定义:子图匹配
上一节我们介绍了网络母题和子图的概念。本节中,我们来看看子图匹配的具体问题。
子图匹配问题描述如下:给定一个大的目标图和一个小的查询图,我们需要判断查询图是否是目标图的一个子图。
例如,在下图中,答案是肯定的,因为存在一种节点映射关系(用虚线表示),使得查询图中的所有边都能在目标图的对应节点间找到。

我们的任务不是找出具体的节点对应关系,而是进行一个二分类预测:如果查询图是目标图的子图,则返回 True;否则返回 False。
方法概述:利用嵌入空间
我们将把子图匹配问题构建为一个预测任务。核心思想是利用嵌入空间的几何形状来捕捉子图关系。
以下是该方法的高级步骤:
- 分解目标图:将大的目标图分解为一组相对较小的“邻域”块。
- 生成嵌入:使用图神经网络为每个邻域块以及查询图生成嵌入向量。
- 进行预测:基于查询图的嵌入和各个邻域块的嵌入,构建一个预测器来判断查询是否是某个邻域的子图。
这样,当给出一个新查询时,我们只需将其嵌入与所有邻域块的嵌入进行比较,快速得到一系列“是/否”的预测结果。
关键概念:节点锚定邻域
为了实现上述方法,我们需要引入“节点锚定”的概念。
节点锚定意味着我们指定一个锚点节点。判断查询图是否是目标图(或其邻域)的子图时,我们要求查询图中的锚点必须映射到目标图邻域中的锚点,并且所有边和其他节点也必须正确映射。
我们将目标图分解为一组节点锚定邻域。具体做法是:对于目标图中的每个节点,获取其周围 K 跳范围内的所有节点和边,形成一个以该节点为锚点的邻域。参数 K 通常设置为 3 到 5。
对于查询图,我们也选择一个锚点节点,并获取其 K 跳邻域。
核心思想:顺序嵌入空间 🧩
现在,我们进入本节课最核心、最精彩的部分:顺序嵌入空间。
我们使用图神经网络将每个锚点节点(代表其所在邻域)嵌入到一个高维空间(例如64维)。我们要求这个嵌入空间的所有坐标都是非负的。
在这个空间中,我们定义一种偏序关系:如果一个嵌入向量 z1 的所有坐标都小于或等于另一个嵌入向量 z2 的所有坐标,则称 z1 位于 z2 的“左下角”,记作 z1 ≤ z2。
为什么这个关系如此重要?
因为它完美地编码了子图关系!我们的目标是学习这样的嵌入:
- 如果查询图
Q是目标邻域T的子图,那么查询锚点的嵌入z_Q应位于目标锚点嵌入z_T的“左下角”,即z_Q ≤ z_T。 - 如果不是子图,则
z_Q不应位于z_T的“左下角”。
这种“左下角”关系具有传递性、反对称性等性质,与子图同构关系的性质一致,因此非常适合用于编码子图信息。
损失函数与模型训练
为了学习到能保持上述顺序关系的嵌入,我们需要设计一个合适的损失函数。
我们使用一种基于最大间隔损失的函数。对于一对图(查询 Q 和目标邻域 T),其损失定义如下:
如果 Q 是 T 的子图(正样本),我们希望 z_Q ≤ z_T。违反此约束的程度(即 z_Q 的坐标大于 z_T 对应坐标的部分)将受到惩罚。
如果 Q 不是 T 的子图(负样本),我们希望 z_Q 不满足 z_Q ≤ z_T,即鼓励出现违反约束的情况。
损失函数可以形式化地表示为铰链损失(Hinge Loss)的形式,确保模型能够区分正负样本。
以下是训练数据生成和模型训练的流程:
- 生成训练样本:从目标图中随机选择锚点,获取其 K 跳邻域作为
T。- 正样本:通过对
T进行随机游走或采样,生成一个肯定是T子图的查询图Q。 - 负样本:通过向正样本查询图中随机添加/删除节点或边,破坏其子图关系,生成负样本
Q‘。
- 正样本:通过对
- 训练嵌入模型:使用生成的
(Q, T)对,通过最小化上述最大间隔损失来训练图神经网络,使其学会生成符合顺序约束的嵌入。
推理过程
当训练好的模型接收到一个新的查询图时,推理过程非常高效:
- 为查询图选择一个锚点,并使用训练好的 GNN 获取其嵌入
z_query。 - 遍历目标图中所有(或部分)锚点节点的预计算嵌入
{z_target_i}。 - 对于每个
z_target_i,只需检查是否满足z_query ≤ z_target_i(即z_query的所有坐标是否都小于等于z_target_i的对应坐标)。 - 如果对任何一个
z_target_i满足该条件,则判断查询图是目标图的子图。

这种比较操作是逐元素的,计算速度极快,从而避免了 NP 难的子图同构计算。
总结
本节课中,我们一起学习了神经子图匹配方法。我们了解到:
- 问题转化:将复杂的子图匹配问题转化为基于嵌入的二分类预测任务。
- 节点锚定:通过锚定节点来定义和分解邻域,使问题可处理。
- 顺序嵌入:引入了顺序嵌入空间的核心概念,利用“左下角”的偏序关系来编码子图包含关系。
- 模型训练:设计了最大间隔损失函数,通过生成正负样本来训练图神经网络,学习保持子图关系的嵌入。
- 高效推理:训练完成后,判断子图关系简化为在嵌入空间中快速的逐坐标比较操作。

这种方法巧妙地绕过了子图同构的传统计算难题,利用表示学习实现了快速且有效的子图匹配。



课程 P36:12.3 - 寻找频繁子图 🧩
在本节课中,我们将学习如何从一个大型目标图中找出那些频繁出现的子图结构,即“频繁子图挖掘”。我们将了解传统组合方法面临的挑战,并学习如何利用图神经网络和表示学习来优雅地解决这个计算难题。
概述
上一节我们讨论了子图和模体的概念,并介绍了如何利用神经网络快速判断一个查询图是否是某个大图的子图。本节中,我们将进一步扩展,探讨“频繁子图挖掘”问题。其核心目标是:给定一个大型目标图,我们希望找出其中出现频率最高的、由K个节点构成的子图结构。
传统组合方法需要枚举所有可能的K节点连通子图,并对每一个进行子图同构计数,这面临组合爆炸和计数困难两大挑战。接下来,我们将看到如何利用表示学习和图神经网络来巧妙地规避这些难题。
频繁子图挖掘的问题定义
首先,让我们更清晰地定义问题。给定一个大型目标图 G_t、子图大小参数 K 以及期望的结果数量 R,我们的目标是:在所有可能的K节点图中,找出在 G_t 中出现频率最高的前 R 个子图。
这里,我们采用“节点锚定频率”的定义。具体来说,一个查询图 G_q 的频率是指:在目标图 G_t 中,存在某个子图与 G_q 同构,并且该同构映射能将 G_q 中的某个指定“锚点”节点映射到 G_t 中节点 u 的节点 u 的数量。
公式: 频率(G_q) = |{ u ∈ V(G_t) | ∃ 子图 H ⊆ G_t,使得 H ≅ G_q 且同构映射 f 满足 f(锚点) = u }|
这种定义方式能更稳健地处理组合爆炸问题。例如,一个六条边的星形查询图在一个有一百条边的星形目标图中,其频率是1(只有中心节点能匹配锚点),而不是简单的100选6。
SPMiner 方法的核心思想
我们将介绍一种名为 SPMiner 的神经网络模型来识别频繁模体。其核心流程分为两步:
- 快速频率预测:利用图神经网络和有序嵌入空间,快速预测任意给定子图的频率,而无需进行耗时的子图同构匹配。
- 引导式搜索:从一个种子节点开始,逐步“生长”子图,在每一步都选择能保持高频率的扩展方式,最终得到指定大小的频繁子图。
上一节我们介绍了如何将图分解为节点锚定的邻域并用图神经网络进行编码。本节的新内容在于最后的搜索过程。
第一步:基于有序嵌入的快速频率预测
关键思想是将目标图 G_t 分解为大量以各节点为中心的邻域子图 G_n,并用图神经网络将它们嵌入到一个“有序嵌入空间”中。
在这个空间中,嵌入向量之间具有“小于等于”的偏序关系。如果一个子图 G_a 是另一个子图 G_b 的子图,那么 G_a 的嵌入向量的每个维度都应小于等于 G_b 对应维度的值。
代码/公式概念: 若 G_q ⊆ G_n,则在其嵌入 z 上有:z(G_q) ≤ z(G_n) (每个维度比较)。
基于此,预测查询图 G_q 频率的方法变得非常简单:
- 将 G_q 也嵌入到同一空间,得到
z(G_q)。 - 其预测频率就是目标图中,所有满足
z(G_q) ≤ z(G_n)的节点邻域 G_n 的数量。
公式: 预测频率(G_q) = |{ G_n | z(G_q) ≤ z(G_n) }|
这相当于在嵌入空间中,数出位于 z(G_q) 点“右上方”的所有邻域点的数量。这个操作非常快速,规避了直接进行子图同构匹配的昂贵计算。
第二步:神经嵌入引导的搜索过程
现在我们知道如何快速估计频率,接下来的问题是如何找到那些高频子图本身。我们不再枚举所有可能的K节点图,而是采用一种逐步生长的搜索策略。
以下是搜索过程的核心步骤:
- 初始化:在目标图 G_t 中随机选择一个起始节点 u,当前模体 S 仅包含这个节点。
- 迭代生长:当 S 的节点数小于目标大小 K 时,重复以下步骤:
- 考虑将 S 在 G_t 中的邻居节点(或邻居的邻居)加入,形成候选的新模体 S‘。
- 利用上一步的快速频率预测方法,评估每个候选 S‘ 的预测频率。
- 选择能使预测频率保持最高(或“违反度”最低,见下文)的节点加入,更新 S。
- 终止与返回:当 S 大小达到 K 时,停止生长。返回最终的子图 S 及其预测频率。
如何选择下一个节点?
我们定义当前子图 G 的“总违反度”为:不包含 G 作为子图的邻域数量(即嵌入不满足 z(G) ≤ z(G_n) 的邻域数)。
公式: 总违反度(G) = |{ G_n | z(G) ≰ z(G_n) }|
显然,最小化总违反度等价于最大化频率。因此,在每一步,我们可以贪心地选择那个加入后能使新子图 S‘ 总违反度最小的节点。这引导着搜索朝着嵌入空间中“右上方”点密集的区域移动,最终找到的K节点子图会拥有尽可能多的邻域位于其“右上方”,即拥有高频率。
方法效果与总结
实验表明,SPMiner 方法非常有效。在真实网络数据上,对于传统方法只能计算到大小5或6的模体,SPMiner 能近乎完美地识别出前10个最频繁的模体。更重要的是,该方法可以轻松扩展到寻找大小为14、17甚至20的大型频繁模体,且计算效率很高,找到的模体频率远高于传统的随机搜索或启发式基线方法。

本节课中我们一起学习了频繁子图挖掘这一重要问题。我们了解到:
- 子图和模体是理解大型图结构的重要概念,其频率可作为图或节点的特征。
- 传统组合方法因面临组合爆炸和计数困难,只能处理很小的子图。
- 我们利用有序嵌入空间和图神经网络,建立了快速的子图频率预测器。
- 我们设计了一种神经嵌入引导的搜索策略,通过逐步生长来高效地发现大型高频子图。

这种方法将计算上棘手的组合问题,转化为高效的表示学习和搜索问题,在实践中兼具速度快和准确性高的优点。至此,我们完成了关于子图识别、子图计数和频繁子图挖掘的内容。


课程 P37:13.1 - 网络中的社区检测 🕸️

在本节课中,我们将要学习网络中的社区检测。社区检测本质上是在图中对节点进行聚类,这种聚类将基于网络的结构特性。我们将从定义问题开始,探讨其背后的社会科学原理,并了解这些原理如何指导社区检测方法的发展。
社区检测的定义与意义
上一节我们介绍了社区检测的基本概念,本节中我们来看看其具体定义和为什么它有意义。
当我们绘制网络时,通常会观察到一种结构:节点倾向于形成集群或社区。在这些社区内部,节点之间的连接(边)比不同社区之间的连接更为密集。这就是我们直观上对网络,尤其是社交网络的认知。
在社交网络中,这些集群可能对应着真实的社会群体。在生物网络中,它们可能代表执行特定任务的功能单元或模块。因此,我们认为网络并非杂乱无章的物体,而是具有内在的组织结构。
一个关键问题是:我们有什么证据表明这种结构真实存在于网络中?又是什么原因导致了这种结构的形成?
信息流动与社交网络结构
为了理解社区的形成,我们需要深入古典社会科学中的社交网络分析。核心问题是:信息如何通过网络流动?
在社交网络中,人们通过链接相连,信息通过这些链接传播。我们可以将链接分为两类:
- 短链接/强联系:指牢固的本地友谊。
- 长链接/弱联系:指与熟人、同事等不常联系的人之间的连接。
20世纪60年代,社会学家马克·格兰诺维特进行了一项开创性研究。他调查人们如何通过个人关系找到工作。一个有趣的发现是:告知求职者职位空缺信息的,更多是他们的“熟人”(弱联系),而非“亲密朋友”(强联系)。
这令人惊讶,因为通常我们认为亲密朋友更愿意帮助我们。这个发现意味着,在信息传播过程中,弱联系可能扮演着更重要的角色。
链接的结构视角与人际视角
格兰诺维特的研究连接了网络中链接的两个重要视角:
- 结构视角:关注链接在网络中扮演的结构性角色。例如,一条边是连接了网络的不同部分,还是深深地嵌入在一个密集连接的集群中。
- 人际视角:关注链接的强度,即关系是强还是弱。
格兰诺维特揭示了这两者之间的关联:
- 结构上嵌入良好的边(即端点拥有许多共同邻居的边),往往对应着人际上的强联系。
- 连接网络不同部分的边(即端点几乎没有共同邻居的边),往往对应着人际上的弱联系。
用公式表示,一条边 (i, j) 的邻里重叠度可以量化其结构嵌入性:
邻里重叠度(i, j) = (i和j的共同邻居数) / (i和j的邻居总数 - 2) (当 i 和 j 相连时)
重叠度高的边在结构上更强。
弱联系的力量与社区形成
格兰诺维特提出的第二个重要观点关乎信息流。弱联系(长链接)能够让你接触到网络中遥远部分的信息,这些信息对你而言可能是新颖且有价值的。相反,强联系(嵌入良好的边)在信息获取上往往是冗余的,因为你的亲密朋友们彼此认识,知道的信息也类似。
那么,为什么网络中会自然形成社区(密集连接的集群)呢?原因包括:
- 三元闭包:如果两个人有一个共同的朋友,他们更有可能相遇并建立联系。
- 同质性:我们倾向于与和自己相似的人建立联系。如果两个人都与同一个人有联系,他们可能共享某些相似点,从而更容易连接。
因此,网络中倾向于形成许多三角形结构。高聚类系数(即朋友的朋友也是朋友的程度)反映了一种温暖、紧密的社会结构,这也是人类社交所追求的。
理论验证:手机网络数据分析
格兰诺维特的理论在提出后约四十年,才在2007年得到大规模真实数据的验证。一项研究利用欧洲的手机通话数据,将通话频率作为联系强度的指标。
以下是该研究的关键发现:
- 预测:强联系(高频通话)应出现在网络的小集群中;弱联系(低频通话)应出现在连接不同集群的边上。
- 验证:数据显示,边的强度(通话量)与其邻里重叠度高度正相关。即,通话越频繁的链接,其端点的共同邻居越多;反之亦然。
为了更直观地展示,研究还进行了对照实验:
- 随机打乱边上“通话量”的强度值,但保持网络结构不变。结果,原本清晰的“强联系聚集在社区内,弱联系作为桥梁”的图景消失了。
- 逐步移除网络中的边。如果优先移除弱联系(低重叠边),网络会迅速分裂成多个连通组件;如果优先移除强联系(高重叠边),网络则能保持相对完整的连通性更久。
这证明了弱联系在连接整个网络不同社区方面起着关键的“桥梁”作用,而强联系则巩固了社区内部的结构。
核心概念总结
本节课中我们一起学习了网络社区检测的基础及其社会科学根源。我们了解到:
- 社区是网络中连接紧密的节点集群。
- 链接兼具结构角色(由其邻里重叠度
邻里重叠度(i, j)衡量)和人际强度。 - 弱联系(低重叠度)往往是连接不同社区的桥梁,在信息传播中至关重要。
- 强联系(高重叠度)则密集地存在于社区内部,巩固了集群结构。
- 社区的形成受到三元闭包和同质性等社会过程的驱动。


这种对网络结构的深刻理解,为我们后续设计算法来自动识别网络中的社区和连接桥梁奠定了坚实的基础。


课程 P38:13.2 - 网络社区 🕸️

在本节课中,我们将学习网络社区的概念,了解如何从网络结构中识别出紧密连接的节点组(即社区)。我们将介绍一个名为“模块化”的核心度量,并学习如何利用它来发现网络中的社区结构。
上一节我们介绍了网络中存在紧密连接集群的直觉。本节中,我们来看看如何正式地确认和识别这些网络中的集群。
我们从已学知识开始。Granovetter的理论表明,网络由紧密连接的集群或节点集组成。在社会网络中,集群内部的联系很强,而跨集群的连接则很弱。这些集群也被称为社区、团体或模块。我们将使用“网络社区”一词来指代那些内部连接很多、外部连接很少的节点集合。
现在的问题是:给定一个网络,我们如何找到这些密集连接的节点组?理想情况下,这些节点组应能对应真实的社会团体。
以下是几个网络社区的例子:
- 扎卡里空手道俱乐部网络:在研究大学空手道俱乐部的社会关系时,俱乐部因冲突分裂为两组。引人注目的是,网络结构清晰地预示了这种分裂:基于最小化两组间交叉边数的划分,与最终实际形成的两个俱乐部成员高度一致。
- 在线广告网络:可以构建一个二分图,一边是广告商,另一边是搜索查询或关键词。邻接矩阵中的密集星团揭示了拥有共同兴趣的“微型市场”,例如,赌博广告商群体与对赌博感兴趣的人群查询。
- NCAA大学足球队网络:将相互比赛的队伍连接起来。最初的可视化可能看不出明显结构,但应用社区检测方法后,识别出的集群与实际的体育会议(队伍组织)高度一致,揭示了隐藏的结构。
这些例子展示了如何从网络结构中提取社区,即使这种结构最初并不明显。
上一节我们看到了社区的例子。本节中,我们来看看如何形式化地识别这些紧密连接的节点集。
我们要定义一个名为模块化的度量,用于衡量网络划分到社区的程度。假设我们已有一个节点分组(分区),模块化得分 Q 的计算思路如下:
Q 正比于所有群组的总和。对于每个群组 S,我们计算:群组成员之间的实际边数 减去 在某个随机零模型下,我们期望在该群组中看到的边数。
如果群组 S 成员之间的边数远多于随机预期,那么我们就发现了一个强大的显著集群。整个网络的模块化程度,就是所有单个集群模块化分数的总和。
为了计算“期望的边数”,我们需要一个随机图零模型。这里我们使用配置模型。
配置模型的思路是:给定一个具有 n 个节点和 m 条边的真实图 G,我们创建一个随机网络 G‘。在这个随机网络中,每个节点保持其原始度数(连接数)不变,但边被随机重连。这意味着网络具有相同的度序列,但连接是随机的。我们将图视为允许多重边的图。
在这个模型下,节点 i 和节点 j 之间的期望边数公式为:
E(i, j) = (k_i * k_j) / (2m)
其中 k_i 和 k_j 分别是节点 i 和 j 的度数,m 是网络中的总边数。
现在,让我们回到模块化的正式定义。根据我们对配置模型(作为空模型)的了解,模块化 Q 可以写成如下公式:
Q = (1/(2m)) * Σ_S [ Σ_(i,j ∈ S) ( A_ij - (k_i * k_j)/(2m) ) ]
公式解析:
m:网络中的总边数。Σ_S:对所有社区S求和。Σ_(i,j ∈ S):对社区S内的所有节点对(i, j)求和。A_ij:邻接矩阵元素。如果节点i和j相连,则为1;否则为0。这部分计算社区内的实际边数。(k_i * k_j)/(2m):在配置模型下,节点i和j之间的期望边数。A_ij - (k_i * k_j)/(2m):实际边数与期望边数的差值,体现了社区连接的紧密程度。1/(2m):归一化常数,使模块化Q的值落在-1到1之间。
模块化 Q 的取值范围和意义:
Q接近1:表示社区结构非常强,组内的边远多于随机预期。Q为0:表示社区结构与随机网络没有显著差异。Q为负值:表示网络没有社区结构,甚至可能具有反社区结构(例如,二分图核心)。在实践中,如果Q大于0.3到0.7,通常认为网络存在显著的社区结构。
现在我们有了模块化得分作为目标函数。接下来的核心问题是:我们能否通过最大化这个模块化得分来识别网络社区? 换句话说,我们如何搜索节点的分组方式,以使 Q 值尽可能高?这将是后续要解决的关键问题。


本节课中我们一起学习了网络社区的概念。我们了解到,社区是网络中内部连接紧密、外部连接稀疏的节点组。我们引入了模块化(Q) 作为衡量社区划分好坏的核心指标,它通过比较真实网络与随机配置模型(空模型)下的连接差异来量化社区结构的强度。最后,我们提出了通过最大化模块化来发现社区的核心问题,为后续学习社区检测算法奠定了基础。


课程 P39:13.3 - Louvain 算法 🧩
在本节课中,我们将学习一种用于社区检测的流行算法——Louvain 算法。我们将了解它的工作原理、核心计算步骤以及它如何高效地将大型网络划分为具有高模块化得分的社区。

概述
Louvain 算法是一种用于识别网络中高模块化得分社区的算法。它以其发源地——比利时鲁汶大学命名。该算法具有高度可扩展性,是进行网络划分时实际上的首选方法。
它是一种贪婪的社区检测算法,时间复杂度约为 O(n log n),其中 n 是网络中的节点数,因此能够扩展到大型网络。它支持加权图,并能提供层次化的社区结构,即不仅给出一个层级的聚类,还能展示单个节点如何加入小组,以及这些小组又如何聚合成更大的超级社区。
该算法应用广泛,有快速的实现,在实践中效果良好,能够发现具有高度模块化的社区。
算法运行的两个阶段
Louvain 算法分两个阶段运行,其核心思想是贪婪地将节点分配给社区以最大化模块化。每次迭代都包含这两个阶段。
上一节我们介绍了算法的基本目标,本节中我们来看看这两个具体阶段是如何运作的。
第一阶段:模块化优化
在第一阶段,算法通过仅允许节点对社区进行局部更改来优化模块化。每个节点都有机会改变其社区归属。
具体步骤如下:
- 初始化:首先,将图中的每个节点放入一个独立的社区。即每个节点自成一个集群。
- 迭代优化:对于每个节点 i,算法进行以下计算:
- 计算如果将节点 i 放入其每个邻居节点 j 所在的社区,模块化将如何变化。
- 核心问题是:将节点 i 放入节点 j 的社区,是否会增加整体模块化?
- 决策移动:算法尝试将节点 i 放入其每个邻居所在的社区(前提是它们属于同一社区)。选择能使模块化增加最多的那个社区进行移动。
- 终止条件:当没有任何单个节点移动到不同社区能提高模块化时,第一阶段停止。此时达到了模块化的一个局部极大值。
需要注意的是,算法的输出取决于处理节点的顺序。但在实践中,顺序影响不大,通常采用随机顺序即可。
以下是节点移动时,计算模块化增益(ΔQ)的核心公式:
假设节点 i 从当前社区 D 移动到新社区 C。模块化增益 ΔQ 可以高效地计算为:
ΔQ = [Σ_in + 2k_i,in] / (2m) - [Σ_tot + k_i]² / (2m)² - [Σ_in / (2m) - (Σ_tot/(2m))² - (k_i/(2m))²]
其中:
- Σ_in: 社区 C 内部所有边的权重和。
- Σ_tot: 与社区 C 中节点相连的所有边的权重和(包括连接外部社区的边)。
- k_i: 节点 i 的度(所有边的权重和)。
- k_i,in: 节点 i 与社区 C 内部节点相连的边的权重和。
- m: 网络中所有边的总权重。
简化后,将节点 i 移入社区 C 的模块化增益近似为:
ΔQ ≈ [k_i,in / (2m)] - [Σ_tot * k_i / (2m)²]
这个公式表明,增益取决于节点 i 与社区 C 内部的连接强度(k_i,in)以及社区 C 的总连接规模(Σ_tot)。
第二阶段:网络重组(聚合)
当第一阶段达到稳定状态,无法再通过移动单个节点来提升模块化后,算法进入第二阶段。
具体步骤如下:
- 构建超级节点:将在第一阶段识别出的每个社区“收缩”为一个超级节点。
- 构建超级网络:
- 如果原始网络中两个社区之间至少存在一条边,则在对应的两个超级节点之间创建一条边。
- 这条新边的权重,等于原始网络中这两个社区之间所有边的权重之和。
- 超级节点内部可能形成自环,其权重代表原社区内部所有边的权重和。
- 迭代:这样,我们就得到了一个新的、更粗粒度的加权网络(超级网络)。然后,在这个新的超级网络上,再次运行第一阶段的算法,以发现更大的社区结构(即社区的社区)。
算法流程总结
现在,让我们将两个阶段串联起来,总结 Louvain 算法的完整流程:
- 输入:原始网络。
- 初始化:每个节点自成社区。
- 第一阶段:
- 遍历节点,计算将其移动到各邻居社区带来的模块化增益 ΔQ。
- 将节点移动到能带来最大正增益的社区。
- 重复此过程,直到没有节点移动能提升模块化。
- 第二阶段:
- 将上一步得到的每个社区聚合为一个超级节点。
- 根据社区间的连接,构建新的超级节点网络(边权为社区间连接总和)。
- 迭代:将新生成的超级网络作为输入,跳回步骤3(第一阶段)继续执行。
- 输出:当网络结构稳定或达到预设层次后停止。最终得到一个层次化的社区结构(树状图或 dendrogram),展示了从单个节点到最大社区的聚合过程。
举例说明:例如,分析一个国家的通信网络。第一轮可能将网络划分为两个大社区(如法语区和荷兰语区)。第二轮可能将每个大社区进一步细分为更小的区域社区。这样就得到了一个国家通信网络的层次化社区结构。
总结
本节课中我们一起学习了 Louvain 社区检测算法。
- 我们首先回顾了模块化的概念,它是衡量网络划分质量的整体指标。
- 接着,我们深入探讨了用于模块化最大化的 Louvain 算法。该算法本质上是一种贪婪策略:
- 我们从每个节点作为独立社区开始。
- 然后,我们在社区间移动节点,使得整体模块化不断增长(第一阶段)。
- 当无法再优化时,我们将社区聚合为超级节点,并在新的网络层级上重复聚类过程(第二阶段)。
- 通过这种“优化-聚合”的迭代,算法能够高效地发现网络中层次化的社区结构。


Louvain 算法在实践中表现优异,并且能够扩展到处理大型网络。



课程P4:2.1 - 传统基于特征的方法:节点级特征 🧩
在本节课中,我们将学习如何为图中的节点设计特征。我们将重点关注结构特征,这些特征描述了节点在网络中的位置和其局部邻域的结构。通过将这些特征输入到机器学习模型中,我们可以进行节点级别的预测。


节点级任务与特征
上一节我们介绍了课程的整体框架,本节中我们来看看如何为节点级预测任务设计特征。在半监督学习场景中,我们已知部分节点的标签(例如颜色),目标是预测未标记节点的标签。为了做到这一点,我们需要能够描述每个节点在网络中位置和邻域结构的特征。
以下是四种描述节点结构的方法:
-
节点度:这是最简单的特征,表示与节点相连的边数。公式为:
deg(v) = |N(v)|
其中N(v)是节点v的邻居集合。它的局限性在于无法区分度数相同但位置不同的节点。 -
节点中心性:这类特征试图量化节点在网络中的“重要性”。我们介绍了三种中心性度量:
- 特征向量中心性:一个节点的重要性取决于其邻居的重要性。这可以通过求解邻接矩阵
A的主特征向量c得到:
λc = Ac - 中介中心性:衡量一个节点作为“桥梁”或“枢纽”的重要性。计算节点
v的中介中心性公式为:
c_B(v) = Σ_{s≠v≠t} (σ_{st}(v) / σ_{st})
其中σ_{st}是节点s到t的最短路径总数,σ_{st}(v)是经过v的最短路径数。 - 接近中心性:衡量一个节点到网络中所有其他节点的平均距离有多近。节点
v的接近中心性计算为:
c_C(v) = 1 / Σ_{u≠v} d(u, v)
其中d(u, v)是节点u到v的最短路径长度。
- 特征向量中心性:一个节点的重要性取决于其邻居的重要性。这可以通过求解邻接矩阵
-
聚类系数:衡量一个节点的邻居之间相互连接的程度,即“朋友的朋友也是朋友”的概率。节点
v的聚类系数计算公式为:
C(v) = (2 * #(v的邻居之间的边)) / (deg(v) * (deg(v) - 1))
其值在0到1之间。它本质上计算了以节点v为中心的三角形数量。 -
图元度向量:这是对聚类系数(计数三角形)概念的推广。图元 是小的、连通的、非同构的子图。图元度向量 统计一个节点作为根节点时,参与不同图元结构的次数。这提供了比节点度或聚类系数更精细的局部拓扑描述。例如,一个基于2-5个节点的图元度向量可能有73个维度。
总结
本节课中我们一起学习了为节点设计传统手工特征的方法。
这些特征主要分为两大类:
- 基于重要性的特征:如节点度、特征向量中心性、中介中心性、接近中心性。它们用于预测节点在网络中的影响力或重要性,例如识别社交网络中的关键用户。
- 基于结构的特征:如节点度、聚类系数和图元度向量。它们用于捕获节点局部邻域的拓扑结构,适用于预测节点在网络中的角色,例如在蛋白质相互作用网络中预测蛋白质的功能。


通过将这些精心设计的特征与经典机器学习模型(如随机森林、支持向量机)结合,我们可以构建有效的节点级预测系统。下一节,我们将探讨如何为边(链接) 和整个图设计特征。


课程 P40:13.4 - 检测重叠社区 🧩

在本节课中,我们将学习如何检测网络中的重叠社区。与之前假设节点只属于一个社区不同,现实中的节点(如人或蛋白质)常常同时属于多个社区。我们将介绍一种基于生成模型的方法,通过拟合模型来发现这种重叠的社区结构。
重叠社区的概念

上一节我们介绍了非重叠社区的检测方法。本节中,我们来看看当社区可以重叠时的情况。
在许多现实网络中,节点可以同时属于多个社区。例如,一个人可能同时是高中同学圈、大学同学圈和公司同事圈的成员。在生物网络中,一个蛋白质也可能参与多个功能模块。因此,我们需要能够识别这种重叠社区结构的方法。
为了直观理解,我们可以对比两种社区结构在邻接矩阵中的表现:
- 非重叠社区:邻接矩阵呈现明显的块状结构,块内连接密集,块间连接稀疏。
- 重叠社区:邻接矩阵中,重叠区域的节点(属于多个社区)会与多个社区块内的节点都有连接,使得矩阵结构更加复杂。
我们的目标是:给定一个网络,如何自动提取出这种重叠的社区结构?
生成模型:隶属关系图模型 (AGM)
为了检测重叠社区,我们首先需要为网络定义一个生成模型。这个模型将基于节点的社区隶属关系来生成网络的边。
模型的核心思想如下:
- 我们有一组节点和一组社区。
- 每个节点可以属于零个、一个或多个社区。我们用一条边连接节点和它所属的社区来表示这种“隶属关系”。
- 每个社区
C都有一个内部连接概率参数p_c。
边的生成过程:
- 对于任意一对节点
u和v,找出它们共同隶属的所有社区。 - 对于每一个共同的社区
C,我们独立地抛一枚有偏硬币,其正面(产生连接)的概率为p_c。 - 如果至少有一枚硬币抛出正面,则在节点
u和v之间创建一条边。
这意味着,如果两个节点共享多个社区,它们就有多次“机会”产生连接,因此它们之间更可能出现边。节点 u 和 v 之间存在边的概率可以表示为:
公式:
P(A_{uv}=1) = 1 - ∏_{c∈C} (1 - p_c)
其中,C 是节点 u 和 v 共同隶属的社区集合。
这个模型非常灵活,不仅可以表示重叠社区,还可以表示层次化社区等复杂结构。
从网络反推模型:最大似然估计
上一节我们知道了如何从模型生成网络。本节中,我们反过来思考:给定一个观察到的真实网络,最有可能生成这个网络的模型参数是什么?这个过程称为最大似然估计。
我们的目标是:找到一组模型参数 F(包括社区数量、每个节点的社区隶属关系、每个社区的连接概率 p_c),使得这组参数生成我们观察到的真实图 G 的概率最大。
图 G 的似然定义为模型 F 生成图 G 的概率。具体计算如下:
- 对于图中存在的每一条边
(u, v),乘以模型预测该边存在的概率P(A_{uv}=1)。 - 对于图中不存在的每一条边(即非边),乘以模型预测该边不存在的概率
1 - P(A_{uv}=1)。
公式:
L(F) = ∏_{(u,v)∈E} P(A_{uv}=1) * ∏_{(u,v)∉E} (1 - P(A_{uv}=1))
为了数值计算的稳定性,我们通常优化对数似然 log L(F),它将连乘转换为求和。
模型参数化与优化
直接优化上述公式中的 p_c 和离散的隶属关系比较困难。因此,我们引入一个“放松”的连续参数化方法:
- 我们为每个节点
u对每个社区c定义一个隶属强度f_{u,c}。f_{u,c} = 0表示节点不属于该社区,值越大表示隶属关系越强。 - 我们将社区
c的内部连接概率参数化为隶属强度的函数:p_c(u,v) = 1 - exp(-f_{u,c} * f_{v,c})。
此时,节点 u 和 v 之间存在边的概率公式可以简化为一个优雅的形式:
公式:
P(A_{uv}=1) = 1 - exp(-f_u · f_v)
其中,f_u 和 f_v 分别是节点 u 和 v 的社区隶属强度向量,· 表示点积。
现在,我们的优化目标——对数似然——就变成了关于所有节点隶属强度向量 {f_u} 的函数。我们可以使用梯度下降法来求解:
- 随机初始化所有节点的隶属强度向量
{f_u}。 - 迭代直到收敛:固定其他所有节点的向量,计算对数似然关于当前节点
u的向量f_u的梯度,然后沿着梯度方向更新f_u,以增加对数似然值。
梯度计算中涉及对节点 u 的所有非邻居求和,这在大型网络上计算代价很高。一个有效的优化技巧是:将这个求和改写为对所有节点的求和,减去对邻居节点的求和。由于“所有节点求和”项可以预先计算并全局更新,而每个节点的邻居通常很少,这大大加快了计算速度,使得方法能够扩展到大型网络。
总结
本节课中,我们一起学习了如何检测网络中的重叠社区。

我们首先介绍了隶属关系图模型 (AGM),这是一个基于节点社区隶属关系来生成网络边的概率模型。然后,我们通过最大似然估计的框架,将社区检测问题转化为一个模型拟合问题:即寻找最能解释当前观测网络结构的模型参数(节点的社区隶属关系)。
具体步骤包括:
- 定义基于隶属强度的连续化模型。
- 建立网络的对数似然函数。
- 使用梯度下降法优化对数似然,从而得到每个节点对各个社区的隶属强度。

最终,通过将生成模型拟合到观测网络,我们能够自动地发现其中潜在的重叠社区结构。


课程 P41:14.1 - 图的生成模型 📊

在本节课中,我们将要学习图的生成模型。我们将探讨如何生成合成图,使其与现实世界的网络(如社交网络或通信网络)具有相似的性质。通过学习这些模型,我们可以理解真实网络的形成过程,并利用它们进行预测、异常检测或作为测试算法的数据集。
真实世界图的性质 📈

上一节我们介绍了图生成模型的目标。本节中,我们来看看如何衡量一个图是否“逼真”。为了比较生成的图和真实的图,我们需要刻画图的一些关键性质。
以下是描述图的四个核心性质:

-
度分布:度分布描述了随机选择一个节点,其具有给定度数的概率。它本质上是一个归一化的直方图。设
P(k)表示一个节点度数为k的概率。- 公式:
P(k) = (具有度数 k 的节点数量) / (总节点数 N)
- 公式:
-
聚类系数:聚类系数衡量一个节点的邻居之间相互连接的程度。节点
i的聚类系数C_i定义为:- 公式:
C_i = (节点 i 的邻居之间实际存在的边数) / (节点 i 的邻居之间可能存在的最大边数) - 整个图的聚类系数通常是所有节点聚类系数的平均值。
- 公式:
-
连通性:连通性通常通过最大连通分量的大小来衡量。连通分量是一组可以相互到达的节点。我们关注属于最大连通分量的节点比例。
-
最短路径长度:最短路径长度描述了网络中节点间的平均距离。图的直径是任意两个节点之间最短路径的最大值。更常用的是平均最短路径长度,它计算所有可达节点对之间最短路径的平均值。
案例分析:微软即时通讯网络 💬
为了具体理解这些性质,我们分析一个现实世界的大规模网络:微软即时通讯(MSN Messenger)网络。该网络包含约1.8亿用户(节点)和30亿条边(表示用户之间至少交换过一条信息)。
以下是该网络的关键测量结果:
- 度分布:在对数坐标下绘制时,度分布呈现明显的“长尾”或幂律形状。大多数节点的度数很小(小于10),但存在极少数度数非常高的节点(最高约6000)。
- 聚类系数:该网络的平均聚类系数为 0.11。这意味着,平均而言,一个用户的朋友之间有11%的概率也是朋友。
- 连通性:99.9% 的节点属于同一个最大的连通分量,表明网络几乎是完全连通的。
- 最短路径长度:网络的平均最短路径长度仅为 6.6。这意味着,平均只需通过不到7个人,你就可以联系到这个庞大网络中的另一个人。这体现了“小世界”现象。
这些数字本身是否有意义?为了判断它们是否令人惊讶或具有特殊性,我们需要一个空模型作为参考基准。接下来,我们将介绍几种传统的图生成模型,它们将为我们提供这样的参考点。
传统图生成模型 🏗️
上一节我们分析了真实网络的性质,并意识到需要一个基准模型进行比较。本节中,我们来看看几种经典的传统图生成模型。这些模型相对简单,但提供了关于网络形成过程的重要见解。
以下是三种基础但重要的图生成模型:
-
Erdős–Rényi (ER) 随机图模型:
- 描述:该模型以概率
p在每一对节点之间独立地生成一条边。 - 代码/公式:给定
N个节点,对于每一对节点(i, j),以概率p创建边。G(N, p)。 - 性质:ER 图通常具有较低的平均最短路径长度,但聚类系数也极低,且度分布近似泊松分布,这与许多真实网络的“长尾”度分布不符。
- 描述:该模型以概率
-
小世界模型(Watts-Strogatz):
- 描述:该模型从一个规则环状网络开始,然后以概率
β随机“重连”一些边。它旨在生成具有高聚类系数和短平均路径的图。 - 过程:
- 构建一个环状网络,每个节点与最近的
K个邻居相连。 - 以概率
β将每条边的一个端点随机重新连接到网络中的另一个节点。
- 构建一个环状网络,每个节点与最近的
- 性质:通过调节
β,可以在高度规则(高聚类、长路径)和完全随机(低聚类、短路径)之间过渡,从而模拟小世界特性。
- 描述:该模型从一个规则环状网络开始,然后以概率
-
优先连接模型(Barabási-Albert):
- 描述:该模型基于“富者愈富”的思想。新节点加入网络时,更倾向于连接到已经拥有较多连接的节点。
- 过程:
- 从一个小型初始网络开始。
- 每次新增一个节点,并连接到
m个现有节点。 - 新节点连接到节点
i的概率与节点i的度数成正比。
- 性质:该模型能够自然生成具有幂律度分布的网络,即存在少数高度连接的“枢纽”节点。这解释了像互联网、社交网络等许多真实系统中的度分布特征。
总结与展望 🎯

本节课中,我们一起学习了图的生成模型。我们首先明确了评估图是否“逼真”的四个关键性质:度分布、聚类系数、连通性和最短路径长度。接着,我们以微软即时通讯网络为例,具体观察了这些性质在真实网络中的体现。

最后,我们介绍了三种传统的图生成模型:ER随机图模型、小世界模型和优先连接模型。这些模型各自基于不同的简单机制,能够生成具有特定性质的图,为我们理解和模拟真实网络提供了基础框架和宝贵的参考基准。

在下节课中,我们将探讨更强大的深度图生成模型,它们能够学习并捕获真实图中更复杂、更细微的模式和结构。


课程 P42:14.2 - 埃尔德什-瑞尼随机图模型 V2 📊

在本节课中,我们将学习埃尔德什-瑞尼随机图模型。这是一种最简单的图生成模型,可以作为分析真实网络时的参考基准。我们将探讨它的定义、关键性质,并将其与真实网络(如MSN网络)进行比较。
概述
埃尔德什-瑞尼随机图模型是图论中一个基础且重要的生成模型。它以两位匈牙利数学家的名字命名,其数学理论非常丰富。我们将学习该模型的两种变体,分析其度分布、聚类系数、连通性和平均路径长度等性质,并理解它为何无法完全模拟真实网络的特征。
埃尔德什-瑞尼随机图模型
现在,我们开始讨论这些可以作为参考基准的图生成模型。首先介绍的是埃尔德什-瑞尼随机图模型。
该模型有两种主要变体:G(n, p) 模型和 G(n, m) 模型。
以下是两种模型的核心定义:
- G(n, p) 模型:该模型生成一个具有
n个节点的无向图。图中每条边以独立同分布的概率p出现。这意味着对于每一对节点,我们都进行一次概率为p的“抛硬币”实验,以决定是否在这对节点之间创建边。 - G(n, m) 模型:该模型生成一个具有
n个节点和恰好m条边的无向图,这些m条边是从所有可能的边中均匀随机选取的。
这两种模型有什么区别呢?它们都有相同数量的节点。在期望上,G(n, p) 模型的边数也是 m(约为 n * n * p),并且边都是随机放置在节点之间的。关键区别在于,G(n, p) 的边数是随机的,可能因随机过程的方差而略有波动;而 G(n, m) 的边数总是固定的。
模型的性质分析
由于该模型是随机的,相同的参数 n 和 p 可以产生许多不同的图实例。接下来,我们分析从 G(n, p) 模型生成的随机图具有哪些性质。这个模型的优美之处在于其简单性,使得我们可以用数学方法精确推导出这些性质,而无需依赖模拟和测量。
度分布
G(n, p) 模型的度分布是二项分布。
推导过程:设 P(k) 表示具有给定度 k 的节点比例。对于一个特定节点,它有 n-1 个可能的邻居。该节点恰好与其中 k 个节点相连的概率,是选择 k 个邻居的组合数,乘以这 k 条边存在的概率,再乘以其余边不存在的概率。公式如下:
P(k) = C(n-1, k) * p^k * (1-p)^(n-1-k)
这正是二项分布的公式。该分布呈钟形(类似离散的高斯分布)。其均值(即平均度)为 p * (n-1)。当 n 很大时,平均度近似为 n * p。
需要注意的是,在像MSN这样的真实网络中,我们观察到的度分布是高度偏斜的,而非这种钟形曲线。因此,G(n, p) 模型生成的图的度分布与真实网络不同。
聚类系数
接下来我们分析聚类系数。回忆一下,节点 i 的聚类系数 C_i 定义为:其邻居之间实际存在的边数,除以邻居间所有可能的边数(即 k_i*(k_i-1)/2)。
在 G(n, p) 模型中,边以概率 p 独立出现。因此,节点 i 的邻居之间,期望的边数等于所有可能的邻居对数目乘以 p。
E[#edges among neighbors of i] = C(k_i, 2) * p = [k_i*(k_i-1)/2] * p
将上述期望值代入聚类系数公式,得到节点 i 的期望聚类系数:
E[C_i] = p
对于整个图,平均聚类系数 C 也约等于 p。而我们知道 p 约等于平均度 <k> 除以节点数 n。因此:
C ≈ <k> / n
这个结论意味着,随机图的平均聚类系数很小。如果我们生成越来越大的图,同时保持平均度不变,那么聚类系数将随着图规模的增大而减小。以MSN网络为例,其平均度为14,节点数为1.8亿,代入公式得到的聚类系数约为 10^-8 量级。这与MSN网络实际高达0.11的聚类系数相差甚远。因此,我们的MSN网络不是一个随机图。
连通性与巨连通分量
G(n, p) 模型中连通分量的行为非常有趣,我们可以分析图的连通性如何随边概率 p 变化。
- 如果
p = 0,图是空的,只有孤立节点。 - 如果
p = 1,图是完全图,所有节点都相连。
研究表明,当平均度 <k> = p*(n-1) 超过 1 时,图中会开始出现一个包含相当比例节点的巨连通分量。当平均度低于1时,则不会出现这样的巨分量。这体现了一种相变行为。
随着 p 继续增大,当 p 达到 (2 * log n) / n 量级时,图中将几乎没有孤立节点(尽管可能仍有一些小的不连通分量)。模拟结果也显示,当平均度超过1后,巨连通分量迅速出现;当平均度达到2时,已有约80%的节点位于最大连通分量中。
因此,G(n, p) 模型在平均度大于1时,就会出现巨连通分量。
平均路径长度与扩展性
为了讨论直径和平均路径长度,我们需要引入扩展性的概念。
什么是扩展性?
对于一个图,如果它具有扩展性 α,那么对于任意节点子集 S(假设 S 的规模不超过总节点数的一半),从 S 连接到图其余部分的边数至少为 α * |S|。
数学定义为:α = min_{S} ( #edges leaving S / |S| )
可以将扩展性理解为网络鲁棒性的一种度量。例如,要想将包含 L 个节点的子集 S 从图中断开,至少需要切断 α * L 条边。
- 低扩展性图示例:一个仅通过一条“桥”边连接两个稠密簇的图。如果选择其中一个簇作为子集
S,那么离开S的边数很少。 - 高扩展性图示例:一个近似完全图的网络,任何子集
S都有大量边连接到外部。 - 中等扩展性图:具有社区结构的网络,社区内部连接紧密(局部扩展性高),但社区之间的连接稀疏(全局扩展性较低)。真实网络通常介于两者之间。
扩展性与路径长度的关系
有一个重要的数学结论:对于一个具有 n 个节点和扩展性 α 的图,图中任意两个节点之间的最短路径长度约为 O(log n / α)。
这意味着:
- 图规模
n越大,路径越长(以对数增长)。 - 扩展性
α越高,路径越短。
对于 G(n, p) 随机图,研究表明,当平均度 <k> = n*p 大于 log n 时,其直径约为 O(log n / log(n*p))。由于 log n 远小于 n,这说明随机图具有较短的路径长度和高扩展性。从任一节点出发,仅需对数步数(相对于总节点数)的广度优先搜索就能访问所有节点。
模拟实验也证实了这一点:在保持平均度不变的情况下,随着节点数 n 增加,图的平均最短路径长度增长非常缓慢,符合对数趋势。
与真实网络(MSN)的比较
现在,我们将 G(n, p) 模型的性质与MSN网络的实际观测值进行比较。
以下是关键属性的对比:
- 度分布:
- MSN:高度偏斜,长尾分布。
- G(n, p):二项分布,钟形曲线。
- 结论:不匹配。
- 平均最短路径长度:
- MSN:6.6。
- G(n, p):量级为
O(log n),对于1.8亿节点,log10(1.8e8) ≈ 8.25,量级相近。 - 结论:匹配。
- 聚类系数:
- MSN:0.11。
- G(n, p):
<k>/n ≈ 14/1.8e8 ≈ 7.8e-8。 - 结论:严重不匹配(相差超过6个数量级)。
- 巨连通分量:
- MSN:99.9%的节点位于最大连通分量中。
- G(n, p):当平均度>1时出现巨分量。MSN平均度为14,满足条件。
- 结论:匹配。
通过比较,我们可以得出结论:MSN网络(以及许多其他真实网络)在短路径和连通性上与随机图有相似之处,但在度分布和聚类系数(即局部结构)上存在根本性差异。因此,真实网络不是随机的。
尽管我们只分析了一个MSN网络的实例,但上述特性(偏斜的度分布、短路径、高聚类系数、整体连通)在很大一类真实世界网络中普遍存在。
总结与模型的意义

本节课我们一起学习了埃尔德什-瑞尼随机图模型。
我们了解到,如果问“真实网络像随机图吗?”,答案是复杂的:
- 在巨连通分量和短路径长度方面,其行为与随机图相似。
- 但在聚类系数和度分布方面,与随机图完全不同。
随机图模型的主要问题在于:其度分布与真实网络差异显著;巨分量的出现依赖于清晰的相变,而真实网络通常已是连通的;最重要的是,随机图缺乏局部结构,没有“朋友的朋友也是朋友”的效应,导致三角形数量极少,聚类系数过低。
尽管如此,埃尔德什-瑞尼随机图模型仍然非常有用。它作为一个简单而严谨的基础参考模型,为我们提供了第一个比较基准。当我们想要生成一个图或分析某个网络属性时,通常会首先问:“如果这是一个随机图,会怎么样?”因此,它是图模型研究中一个不可或缺的工具。

最后留下的问题是:我们能否扩展或修正这个 G(n, p) 模型,使其能匹配真实网络的更多属性呢?这将是我们后续课程可能探讨的方向。


课程 P43:14.3 - 小世界模型 🌐

在本节课中,我们将要学习小世界模型。该模型旨在解释现实网络如何同时具备较短的平均最短路径长度和较高的聚类系数这两种看似矛盾的特性。我们将了解其基本原理、构建方法以及它如何帮助我们理解真实世界的网络结构。
模型的目标与矛盾
上一节我们介绍了GP(随机图)模型,本节中我们来看看小世界模型。
小世界模型试图同时实现两个目标:
- 提供较短的平均最短路径长度。
- 提供较高的聚类系数。
这两种特性通常是相互对立的:
- 在随机图中,存在大量随机连接,因此平均最短路径长度(或直径)很小。但随机连接也导致局部结构缺失,聚类系数很低。
- 在规则格型图(如环形网格)中,附近的节点相互连接,形成了许多三角形,因此聚类系数很高。但这种局部连接结构导致从一个角落到另一个角落需要很多步骤,因此直径很长。
现实网络(如社交网络、合作网络)的观察结果凸显了这一矛盾:
- 它们的平均最短路径长度与对应随机图相近,都很短。
- 但它们的聚类系数却远高于对应随机图,通常高出几个数量级。
因此,核心问题是:我们能否构建一个同时具备高聚类系数和小直径的网络?
小世界模型的构建思路
小世界模型的基本思想是在高聚类的规则格型图和低直径的随机图之间进行插值,从而结合两者的优点。
以下是构建小世界模型的步骤:
-
构建基础规则网络
从一个低维规则晶格开始,例如将节点排列成一个环,每个节点与其最近的k个邻居(如左右各k/2个)相连。这种结构具有高聚类系数,但直径也很大。 -
引入随机性以创建“捷径”
以概率p对网络中的边进行“重新布线”。对于每条边,我们有一定概率p将其一端断开,并随机连接到网络中的另一个节点上。这个过程创建了连接网络遥远部分的“捷径”。
关键机制:
- 当重连概率
p = 0时,网络保持原始的规则格型结构(高聚类、高直径)。 - 当重连概率
p = 1时,所有边都被随机重连,网络趋近于随机图(低聚类、低直径)。 - 当
p取一个较小的中间值(例如 0.01 到 0.1)时,奇迹发生了:网络保留了大部分原始局部连接(从而保持高聚类),同时少数几条随机“捷径”极大地缩短了网络直径。
模型特性分析
通过模拟不同重连概率 p 下的网络,我们可以绘制出聚类系数和平均最短路径长度随 p 变化的曲线。
观察结果:
- 平均最短路径长度:随着
p从 0 开始略微增加,它会急剧下降。这意味着只需很少的几条随机捷径,就能显著缩小网络直径。 - 聚类系数:在
p较小的范围内,聚类系数下降非常缓慢,基本保持在高位。只有当p较大时,它才会显著降低。
因此,在 p 的某个中间范围内,我们成功获得了高聚类系数和低平均最短路径长度并存的“小世界”网络。这正是许多真实网络所展现的特性。

总结与意义
本节课中我们一起学习了小世界模型。
核心总结:
小世界模型通过在规则网络中引入少量随机捷径,巧妙地实现了高聚类与小直径的共存。它揭示了网络直径对随机连接的高度敏感性,以及聚类系数对局部结构的依赖性。
模型的意义:
- 它提供了对网络聚类特性与连通效率之间相互作用的深刻见解。
- 它成功地捕捉了众多现实世界网络(社交、生物、技术网络)的关键特征。
- 它为我们提供了一种思考网络生成过程的模型框架。
模型的局限:
标准的小世界模型生成的网络度分布是均匀的(所有节点拥有大致相同的连接数),这与我们在MSN等网络中观察到的幂律度分布(少数节点拥有大量连接)不符。这引出了我们对更复杂网络模型(如偏好连接模型)的探索需求。

通过GP模型和小世界模型,我们可以看到,用不同的模型来解释网络的不同属性,有助于我们思考在现实世界中可能发生什么样的过程,从而形成我们观察到的网络性质。


课程 P44:14.4 - 克罗内克图模型 🧩

在本节课中,我们将学习第三个图生成模型——克罗内克图模型。这是一个基于数学运算的模型,能够生成具有自相似结构的丰富网络。我们将从递归生成的角度理解它,并学习如何通过克罗内克积从一个小型“种子”图生成大型图。
什么是克罗内克图模型? 🤔
上一节我们介绍了小世界模型,本节中我们来看看克罗内克图模型。该模型的核心思想是递归生成和自相似性。自相似意味着物体的整体结构与它的部分结构相似。克罗内克图模型旨在通过一个小的“种子”图(或称发起矩阵),递归地生成越来越大的图,从而模拟网络中不同社区的形成和增长。
克罗内克积是实现这一目标的关键数学工具,它允许我们生成自相似的邻接矩阵。
克罗内克积的定义与运算 ⚙️
为了理解模型,我们首先需要定义两个矩阵的克罗内克积。
克罗内克积的定义如下:
给定两个矩阵 A(大小为 m × n)和 B(大小为 p × q),它们的克罗内克积 A ⊗ B 是一个大小为 (m*p) × (n*q) 的矩阵。运算规则是:将矩阵 B 乘以矩阵 A 中的每一个元素,并用这个乘积块替换 A 中对应的元素位置。
用公式表示,结果矩阵 C 中的元素为:
C[(i-1)*p + r, (j-1)*q + s] = A[i, j] * B[r, s]
其中 i, j 是 A 的索引,r, s 是 B 的索引。
两个图的克罗内克积 则定义为它们对应邻接矩阵的克罗内克积。
确定性克罗内克图的生成 🏗️
有了克罗内克积的概念,我们就可以定义确定性克罗内克图。
生成步骤如下:
- 从一个小的“发起矩阵” K₁(例如一个3x3的邻接矩阵)开始。
- 递归地对 K₁ 应用克罗内克积:K₂ = K₁ ⊗ K₁, K₃ = K₂ ⊗ K₁, 依此类推。
- 经过
m次迭代后,得到的矩阵 Kₘ 就是最终生成图的邻接矩阵。
这个过程会产生一个具有明显自相似块结构的邻接矩阵。例如,如果发起矩阵中有零块和非零块,生成的大矩阵中也会出现按比例放大的相同模式。
随机克罗内克图模型 🎲
确定性模型生成的是固定结构的图。为了生成随机图,我们引入了随机克罗内克图模型。
核心思想是将发起矩阵视为概率矩阵。
- 我们有一个发起矩阵 Θ₁,其每个元素值在0到1之间,代表该位置出现边的概率。
- 我们对这个概率矩阵进行克罗内克幂运算,得到一个大的概率矩阵 Θₘ。
- 最后,我们根据 Θₘ 中每个单元格的概率值进行“抛硬币”,独立地决定每条边是否存在,从而实例化出一个具体的图。
然而,对于一个有 n 个节点的图,其邻接矩阵有 n² 个元素,这意味着我们需要进行 O(n²) 次抛硬币操作,对于大规模图(如百万节点)来说计算量过大。
快速生成:随机“抛边”算法 ⚡
为了解决效率问题,我们使用一种称为“抛边”或“球下降”的快速采样算法。
算法的直观理解如下:
将最终的概率邻接矩阵想象成一个递归的四叉树结构(假设发起矩阵是2x2)。生成一条边的过程,就是从树根(整个矩阵)出发,递归地选择进入哪个子象限(即矩阵的哪个子块),直到到达代表单个单元格的叶子节点。
算法步骤如下:
以下是该算法的描述:
- 将发起矩阵 Θ₁ 的四个元素(a, b, c, d)归一化,使其和为1,作为选择概率。
- 要生成一条边,我们从矩阵的顶层开始。
- 在每一层,根据(a, b, c, d)的概率分布,随机选择四个象限中的一个进入。
- 重复步骤3,不断深入更小的子象限,直到到达最底层的一个具体单元格
(i, j)。 - 在节点
i和j之间创建一条边。如果边已存在,则忽略此次结果(或重新采样)。 - 重复步骤2-5,直到生成所需数量的边。
这种方法只需大约 O(E log n) 次操作即可生成 E 条边,效率远高于 O(n²)。
模型的表现与总结 📊
通过精心选择发起概率矩阵的几个参数(如一个2x2矩阵的四个值),随机克罗内克图模型能够生成在多个统计特性上与真实网络高度吻合的图。
例如,它能够同时匹配:
- 度分布
- 聚类系数
- 直径与最短路径分布
- 连通分量规模
本节课中我们一起学习了三种传统的图生成模型。我们从描述图的度量开始,首先介绍了最简单的埃尔德什-雷尼随机图模型,它具有良好的路径长度但缺乏聚类性。接着是小世界模型,它通过添加少量重连边就能在保持高聚类的同时缩短直径。最后,我们深入探讨了更数学化的克罗内克图模型,它通过克罗内克积实现递归和自相似生成,其随机版本配合“抛边”算法,能够高效地生成具有真实网络特性的大规模图。


下周,我们将进入网络的深度生成模型领域,那时我们将不再关注网络形成的机械式原因,而是将其视为一个机器学习问题,直接学习如何生成逼真的网络结构。



课程 P45:15.1 - 图的深度生成模型 🧠
在本节课中,我们将要学习图的深度生成模型。我们将探讨如何利用深度学习技术,从给定的图数据中学习其分布,并生成新的、具有相似特性的图。这包括理解生成模型的基本原理、最大似然估计方法,以及如何通过自回归模型将复杂的图生成过程分解为一系列简单的步骤。
概述 📋
图生成模型的目标是学习一个能够生成与真实世界图相似的合成图的模型。这种技术在许多领域都有应用,例如生成新的分子结构、设计材料、模拟社交网络、创建道路布局,甚至生成组合优化问题(如布尔可满足性问题)的实例。传统方法依赖于对网络性质的假设(如无标度特性)或统计模型,而深度学习方法则直接从数据中学习生成过程,更具通用性。
图生成任务的定义 🎯
上一节我们介绍了图生成模型的应用背景,本节中我们来看看如何将图生成任务形式化为一个机器学习问题。


我们假设真实世界的图是从一个未知的分布 P_data 中采样得到的。我们的目标是学习一个由参数 θ 定义的模型分布 P_model,使其尽可能接近 P_data。这包含两个子目标:
- 密度估计:找到最优参数 θ*,使得观测到的图数据 x 在 P_model 下的对数似然 log P_model(x; θ) 最大。
- 采样:在获得 P_model 后,我们需要能够从中生成新的图样本 x。
为了实现采样,我们通常从一个简单的噪声分布(如标准正态分布)中采样一个随机种子 z,然后通过一个复杂的函数 f(通常是一个深度神经网络)将其“解码”成一个完整的图 x,并希望 x 遵循 P_model 的分布。
深度生成模型方法:自回归模型 🔄
上一节我们定义了图生成任务,本节中我们来看看实现该任务的一种核心方法——自回归模型。
在深度生成模型中,我们将使用自回归模型来同时进行密度估计和采样。其核心思想是利用概率的链式法则,将一个复杂的联合分布分解为一系列条件概率的乘积。
对于一组随机变量 X = (x_1, x_2, ..., x_T),其联合分布可以表示为:
P_model(X) = ∏_{t=1}^{T} P(x_t | x_1, x_2, ..., x_{t-1})
这意味着,生成整个对象(如图)的概率,可以分解为按顺序生成其每个组成部分的概率,其中每个步骤都依赖于之前所有已生成的部分。
以下是这种方法应用于图生成的关键步骤:
- 将图表示为动作序列:我们不直接生成整个图结构,而是生成一系列构建图的动作。每个动作可以是“添加一个新节点”或“在现有节点之间添加一条新边”。
- 顺序生成:模型从空图开始,在每一步 t,它根据当前已构建的部分图(即历史动作 a_1, a_2, ..., a_{t-1}),预测下一个最可能的动作 a_t 的概率分布。
- 概率计算:整个生成序列(即最终生成的图)的概率,就是每一步条件概率的乘积。
通过这种方式,我们将一个复杂的图生成问题,转化为了一个序列预测问题,这非常适合用循环神经网络(RNN)或Transformer等序列模型来解决。
总结 ✨


本节课中我们一起学习了图的深度生成模型。我们首先了解了图生成任务广泛的应用场景,从分子设计到社交网络模拟。接着,我们将其形式化为一个机器学习问题,即学习一个模型分布 P_model 来近似未知的真实数据分布 P_data,并完成密度估计和采样两个目标。最后,我们介绍了实现该任务的核心框架——自回归模型,它通过将图的生成过程分解为一系列顺序依赖的动作,巧妙地利用链式法则将复杂问题转化为序列预测问题,为使用深度学习模型生成图结构奠定了理论基础。


课程 P46:15.2 - 图RNN生成逼真图 🧠

在本节课中,我们将学习一种名为图RNN的图生成模型。该模型能够生成逼真且多样的图,无需对图的结构做出任何先验假设。我们将把复杂的图生成过程分解为一系列简单的步骤,并使用递归神经网络(RNN)来建模这些步骤之间的依赖关系。
核心思想:将图生成视为序列生成 🧩
上一节我们介绍了图生成的基本挑战。本节中,我们来看看如何将图生成问题转化为序列生成问题。
关键思想是:通过顺序添加节点和边来生成图。我们将一个复杂的图分布分解为许多小步骤,每一步都基于当前已生成的图状态,预测下一步要添加什么。
具体来说,给定一个节点顺序(排列π),图的生成过程可以唯一地映射为一个序列。这个序列包含两个层次:
- 节点级序列:决定何时添加新节点。
- 边级序列:在添加一个新节点后,决定该节点与之前所有已存在节点之间是否建立连接。
这相当于在生成邻接矩阵:节点级步骤添加新的一列,边级步骤填充该列的各个条目(0表示无边,1表示有边)。
模型架构:嵌套递归神经网络 🔄
既然我们将问题转化为序列生成,自然可以使用为序列数据设计的递归神经网络(RNN)。图RNN使用一个嵌套的RNN结构来建模两级序列。
以下是RNN的基本更新公式,它描述了RNN如何在每个时间步更新其隐藏状态并产生输出:
公式:
S_t = σ(W * S_{t-1} + U * X_t)
Y_t = V * S_t
其中:
S_t是时间步t的隐藏状态,承载了RNN的记忆。X_t是时间步t的输入。Y_t是时间步t的输出。W,U,V是可训练的参数矩阵。σ是非线性激活函数。
在图RNN中,两个RNN协同工作:
- 节点级RNN:负责高级的节点生成序列。当它决定添加一个新节点时,会为边级RNN生成一个初始隐藏状态。
- 边级RNN:接收节点级RNN传来的状态,负责生成新节点与所有已有节点之间的连接序列(一串0和1)。生成完毕后,将其最终状态传回节点级RNN,以决定下一个节点的生成。
这个过程循环往复,直到边级RNN生成一个“序列结束”信号(例如,新节点不与任何已有节点相连),图生成过程便停止。
训练:使用教师强制和二元交叉熵 🎯
我们的目标是让RNN学习生成随机图,而非确定性的图。因此,在每一步,RNN的输出应是连接概率,而非确定的0或1。
训练阶段,我们使用教师强制技术:
- 对于训练数据中的每个图,我们知道其真实的生成序列(即真实的边连接情况)。
- 在RNN的每一步,我们使用真实的上一时间步输出(0或1)作为当前时间步的输入,而不是使用模型自己预测的结果。这有助于模型更快、更稳定地学习。
我们使用二元交叉熵损失来衡量模型预测的概率与真实连接情况之间的差异,并通过反向传播来优化RNN的参数。
损失函数公式:
Loss = - [y* * log(y) + (1 - y*) * log(1 - y)]
其中 y* 是真实标签(0或1),y 是模型预测的连接概率。
生成:基于概率采样进行序列展开 🎲
生成(测试)阶段,我们不再有真实序列作为指导。
- 模型从初始状态开始。
- 在每一步,边级RNN输出一个连接概率
p。 - 我们进行一次伯努利采样(以概率
p输出1,以概率1-p输出0),将这个采样结果(0或1)作为下一个时间步的输入。 - 重复此过程,直到模型输出序列结束信号。
这种方法使得每次运行模型都能生成一个可能不同的、符合学习到的分布的新图。
总结 📝


本节课中,我们一起学习了图RNN模型的核心原理。我们首先将图生成问题转化为两级序列生成问题(节点级和边级)。然后,我们使用一个嵌套的RNN结构来建模这个序列过程:节点级RNN控制节点生成节奏,边级RNN负责生成具体的边连接。在训练时,我们采用教师强制和二元交叉熵损失来优化模型。在生成时,模型通过概率采样来自主展开序列,从而创造出逼真且多样的新图。这个框架非常通用,能够适应不同大小和结构的图生成任务。



课程 P47:15.3 - 图生成的扩展与评估 📈
在本节课中,我们将要学习如何扩展图生成模型以处理大规模图,并探讨如何定量评估生成图的质量。我们将重点介绍一种名为广度优先搜索排序的技术,它能显著降低模型的计算复杂度。同时,我们将学习使用统计度量,如地球移动距离和最大均值差异,来量化生成图与真实图之间的相似性。
上一节我们介绍了图生成模型的基本框架。本节中我们来看看如何提升模型的可扩展性。
图生成模型面临的一个核心挑战是可扩展性。在图中,原则上任何新节点都可以连接到任何已有的节点。这意味着,当生成第 n 个节点时,模型可能需要考虑与之前 n-1 个节点的连接可能性。这要求模型生成一个完整的邻接矩阵,并导致非常长的依赖关系,因为模型需要记住所有早期节点的信息。
为了限制这种复杂性,一个关键的见解是:我们可以主动选择节点的生成顺序,而不是使用随机顺序。我们提出的节点排序方法称为广度优先搜索节点排序。
以下是BFS排序的具体步骤:
- 从图中随机选择一个起始节点,标记为节点1。
- 按照广度优先的顺序遍历图,依次为节点编号。
- 在生成图时,按照此编号顺序依次添加节点和边。
BFS排序为我们带来了以下好处:
- 减少长期依赖:由于BFS的性质,一个节点不会连接到距离它很远的早期节点(例如,节点5不会连接到节点1)。这意味着模型在生成新节点时,只需要关注最近添加的几个节点,而无需记住整个历史。
- 减少生成步骤:邻接矩阵变得稀疏且具有带状结构。边缘级别的RNN只需要生成矩阵的一小部分(即非零的带状区域),而不是整个上三角部分。
- 保持通用性:这种排序方式并不限制模型生成图的能力,它只是利用图本身的稀疏性,让学习过程变得更加高效。
本质上,BFS排序将所需的记忆步骤从 O(n) 减少到了 O(1),并极大地减少了需要考虑的可能连接数量。
上一节我们介绍了如何通过BFS排序来扩展模型。本节中我们来看看如何评估生成的图。
评估图生成模型的质量至关重要。我们有两种主要方法:定性可视化观察和定量统计度量比较。
首先,通过可视化可以直观判断生成图是否与训练图相似。例如,当输入是网格图时,GraphRNN能够生成新的网格图,而其他传统模型(如Kronecker、BA模型)则可能失败。同样,对于具有社区结构的图,GraphRNN也能成功捕捉并生成类似结构的图,这显示了其强大的通用性。
然而,我们需要更严谨的、可量化的评估标准。由于直接比较两个图(图同构测试)是计算困难的问题,我们转而比较它们的图统计量。
我们采用一个两步法来量化两组图集(例如,真实训练图集和合成生成图集)之间的相似性。
第一步:计算并比较单个统计量的分布
对于每个图,我们计算一组统计量,例如:
- 度分布
- 聚类系数分布
- 轨道计数分布
这些统计量通常表现为概率分布。接着,我们比较真实图集和生成图集在同一统计量上的分布差异。用于衡量两个分布之间差异的度量称为地球移动距离。
地球移动距离的直观理解是:将一个概率分布(想象成一堆土)转变为另一个分布所需移动的“泥土”的最小总工作量。如果两个分布相似,则移动距离小;如果差异很大,则移动距离大。其计算可以形式化为一个线性规划问题。
第二步:聚合多个统计量的差异
在得到每个统计量(如度分布、聚类系数分布)上的地球移动距离后,我们需要将这些差异聚合起来,得到一个整体的相似性分数。
我们使用最大均值差异 来完成这种聚合。MMD是一种衡量两个分布之间差异的方法,它计算在某个特征空间中,两个分布样本均值之间的差异。在我们的场景中,我们使用基于地球移动距离的内核函数。
具体公式为:
MMD²(p, q) = E_p[k(x, x‘)] + E_q[k(y, y‘)] - 2E_{p,q}[k(x, y)]
其中,p 和 q 是两个分布,k(., .) 是基于地球移动距离定义的内核函数,E 表示期望值。


本节课中我们一起学习了提升图生成模型可扩展性的关键技术——广度优先搜索节点排序,它通过精心设计节点生成顺序来降低模型复杂度和记忆需求。同时,我们探讨了评估生成图质量的方法,从直观的可视化检查到严谨的定量分析。我们重点介绍了使用地球移动距离来比较单个图统计量的分布,并使用最大均值差异来聚合多个统计量的比较结果,从而对生成图的整体相似性做出量化评估。

课程 P48:15.4 - 深度图生成模型的应用 🧪

在本节课中,我们将学习深度图生成模型在分子生成领域的应用。我们将探讨如何利用图生成模型来创造新的药物分子,并使其满足特定的化学性质和优化目标。

概述
本节课的最后一部分将讨论深度图生成模型在分子生成中的应用。核心目标是生成既符合化学规则又具有现实意义的药物分子,并优化其特定性质,如药物相似性或溶解度。
问题定义
我们希望构建一个模型,该模型能够输出一个给定的分子。这个分子必须满足两个核心条件:
- 有效性:必须遵守化学规则。
- 现实性:必须看起来像一个真实的药物分子,而非随意组合的结构。
此外,我们希望模型能够优化给定的分子性质,例如药物的相似性或溶解度。
解决方案:目标导向的分子图生成
我们将介绍一种称为“目标导向分子图的图卷积策略网络”的方法。以下是该方法的高级概述。
上一节我们介绍了图生成的基本概念,本节中我们来看看如何将其应用于优化特定目标。
核心目标:生成能够优化给定目标(如药物相似性)的图,同时确保生成的图遵循潜在的化学有效性规则,并且看起来逼真(即模仿训练数据集中真实分子的分布)。
关键区别:与单纯模仿现有图分布不同,我们不仅要生成有效的图,还要生成能优化特定黑盒标准的图。这里的“黑盒”意味着我们无需知道目标函数(如药物相似性评分)的内部物理或化学原理,只需知道当我们输入一个分子时,它能给出一个评分。
形式化:强化学习框架
我们将此问题形式化为一个强化学习问题:
- 代理 (Agent):我们的图生成模型。
- 环境 (Environment):化学规则和黑盒评分函数。
- 动作 (Action):在部分生成的分子图上添加一个原子或一条键。
- 奖励 (Reward):
- 即时奖励:在每一步,如果添加原子或键的动作符合化学规则,则给予小的正面奖励。
- 长期奖励:在完成整个分子的生成后,由黑盒评分函数给出的最终评分。
总奖励是即时奖励与长期奖励的总和。通过这种方式,模型学习既遵守规则(即时奖励),又朝着优化最终目标(长期奖励)的方向生成分子。
模型架构:图卷积策略网络
该解决方案的核心是图卷积策略网络。其关键组件是使用图神经网络来捕捉图的结构信息。
以下是两种图生成方法的对比:
图RNN (Graph RNN):
- 使用RNN的隐藏状态来编码生成历史,并基于此状态预测下一个动作(添加节点或边)。
- 所有历史信息都压缩在隐藏状态中,对于大型图可能信息容量不足。
图卷积策略网络 (我们的方法):
- 使用GNN为部分生成的图中的每个节点计算嵌入向量。
- 当要添加新节点时,基于所有现有节点和新节点的嵌入,通过链接预测来决定新节点应与哪些现有节点连接。
- 优势:GNN比RNN更具表现力,能更好地捕捉图结构。
- 劣势:计算成本通常更高。但由于药物分子通常较小,我们可以承受这种计算开销。
生成流程:
- 插入一个新节点。
- 使用GNN计算当前图(包括新节点)中所有节点的嵌入。
- 基于节点嵌入,预测新节点与现有节点之间的连接(即进行链接预测)。
- 检查该连接是否符合化学有效性规则,并给予即时奖励。
- 重复步骤1-4,直到分子生成完成。
- 将完成的分子输入黑盒函数,获得长期奖励。
模型训练
模型训练分为两个阶段:
第一阶段:监督预训练
- 目标:让模型学会生成逼真的分子。
- 方法:使用已有的真实分子图数据集,通过模仿学习(即让模型学习如何一步步重建这些真实分子)来训练策略网络。此阶段不涉及优化特定性质。
第二阶段:策略梯度强化学习
- 目标:让模型学会优化奖励(即特定分子性质)。
- 方法:使用策略梯度算法(如REINFORCE)进行训练。模型通过试错生成分子,并根据获得的即时奖励和长期奖励来更新策略,从而学习生成能获得更高总奖励(即更好性质)的分子。
应用与结果
这种方法允许我们:
- 从头生成优化分子:从零开始生成试图优化特定性质(如溶解度
LogP或药物相似性QED)的全新分子结构。 - 完成部分分子结构:给定一个起始的分子片段,模型可以“补全”该分子,以显著提高其目标性质。
例如,可以从一个溶解度很差的结构开始,让模型完成它,最终得到一个溶解度大幅改善的完整分子。
总结 🎯
在本节课中,我们一起学习了:
- 复杂的图可以通过顺序生成的方式创建,每一步都基于当前状态做出决策。
- 状态表示可以是隐式的(如图RNN中的隐藏状态),也可以是显式的(如图卷积策略网络中直接在图上计算的节点嵌入)。
- 图生成模型的任务包括模拟给定图的分布和针对给定目标优化图。
- 我们重点探讨了在分子生成中的应用,旨在产生具有最佳性质的分子。
- 这种框架具有通用性,可应用于任何类型的图生成任务,例如生成逼真的地图、城市道路网络或新材料的结构。


核心概念公式/代码表示:
- 奖励函数:
总奖励 R_total = Σ(即时奖励 R_step) + 最终奖励 R_final - 策略网络:
动作 a_t = π_θ(s_t),其中s_t是由GNN计算的当前图状态,π_θ是参数为θ的策略网络。 - 目标:最大化期望总奖励
J(θ) = E_π_θ[R_total]。
课程 P49:16.1 - 图神经网络的局限性 🧠


在本节课中,我们将要学习图神经网络(GNN)的两个核心局限性,并探讨如何通过设计更具表达力的模型来解决这些问题。我们将首先理解“完美”GNN的理想行为,然后分析现有模型在“位置感知任务”和“表达能力”上的不足。最后,我们将简要介绍两种改进思路:位置感知GNN和身份感知GNN。

什么是“完美”的图神经网络? 🤔
上一节我们介绍了课程目标,本节中我们来看看一个理想化的“完美”GNN应该具备哪些特性。
一个K层图神经网络的嵌入,是基于目标节点周围K跳邻域的结构信息计算得出的。下图试图说明这一点:为了嵌入一个特定节点,模型会聚合该节点周围的图结构信息,并通过消息传递机制计算其嵌入。

一个完美的GNN会做到:将每一个具有不同邻域结构的节点,都嵌入到嵌入空间中的不同位置。
基于这种直觉,我们可以得出两个重要观察:
以下是关于完美GNN的两个核心观察:
- 观察一:如果两个节点具有完全相同的邻域结构,那么一个完美的GNN会将它们嵌入到完全相同的点(假设没有额外的判别性特征信息)。例如,在下图中,假设两个连通分量结构相同,那么节点v1和v2将被嵌入到同一点。
![]()
- 观察二:如果两个节点具有不同的邻域结构,那么一个完美的GNN会将它们嵌入到空间中的不同点。例如,一个位于三角形中的节点和一个位于正方形中的节点,应该被嵌入到不同的位置。
然而,这些观察所描述的理想情况在实践中并不总是成立,这也引出了GNN的局限性。
局限性一:无法处理位置感知任务 📍
上一节我们描述了完美GNN的理想行为,本节中我们来看看第一个现实中的局限性。
观察一可能会出现问题:即使两个节点具有相同的邻域结构,我们有时也需要为它们分配不同的嵌入。这是因为节点可能出现在图中的不同“位置”。
需要模型理解图中“位置”概念的任务,我们称之为位置感知任务。
即使是一个完美的、能在邻域结构和嵌入之间建立单射函数的GNN,也会在这类任务上失败。
例如,在一个简单的网格图中,节点v1和v2分别位于网格的两端。尽管它们在结构上都是“角落”节点,具有相同的邻域结构,但我们希望它们能被嵌入到不同的位置。然而,目前定义的GNN无法做到这一点,因为它们只依赖于局部邻域结构。
局限性二:表达能力不足 ⚖️
上一节我们讨论了GNN在位置感知任务上的不足,本节中我们来看看其根本的表达能力限制。
观察二的含义是:我们目前介绍的GNN表达能力是不完美的、不够强大的。
在第9讲中我们讨论过,具有判别性特征的消息传递图神经网络,其表达能力上限是Weisfeiler-Lehman(WL)图同构检验。
这意味着,在某些情况下,GNN无法区分结构不同的节点。
例如,考虑一个长度为4的环(循环图)上的两个节点v1和v2。如果我们查看它们的计算图结构(假设所有节点初始特征相同),这两个计算图的结构将是相同的。因此,GNN将无法区分v1和v2,总是将它们嵌入到空间的同一点,即使一个节点位于某种局部模式(如潜在的三角形连接趋势)中,而另一个位于另一种模式(如方形连接趋势)中。
本课程的改进计划 🛠️
上一节我们明确了GNN的两大核心局限,本节中我们来看看本课程计划如何解决它们。
我们计划通过设计更具表达力的图神经网络来解决这两个问题:
以下是我们的两项主要改进思路:
- 解决位置感知问题:我们将根据节点在图中的“位置”来创建节点嵌入。核心思想是在图中创建一些“参考点”,然后根据节点与这些参考点的关系来量化其位置。这类模型被称为位置感知图神经网络。
- 提升表达能力:我们将构建表达能力超越WL测试的消息传递GNN。这类方法的一个例子是身份感知图神经网络。
在讲座的最后部分,我们还将简要讨论图神经网络对对抗性攻击的鲁棒性。
一个直观但不可行的解决方案 💡
上一节我们概述了改进计划,本节中我们先分析一个简单直观但存在严重缺陷的解决方案。
我们的目标是:当两个节点(如v1和v2)具有相同特征但需要不同标签时,GNN能为它们分配不同的嵌入。
一个天真的解决方案是:为图中的每个节点分配一个独热编码作为其初始特征。
这样,每个节点都有了独一无二的特征ID。因此,即使它们的邻域结构相同,由于其自身ID不同,在消息传递过程中,计算图也会变得可区分,GNN便能为其分配不同的嵌入。
然而,这种方法存在两个致命问题:
以下是独热编码方案的两个主要缺陷:
- 不可扩展性:这种方法需要O(N)维的特征向量,其中N是节点数量。对于拥有数万、数百万节点的大图,每个节点都需要一个极其冗长的特征向量,这在计算上是不可行的。
- 非归纳性:这种方法无法推广到未见过的节点或新图上。节点ID的分配是任意的,模型学到的是与特定图节点顺序相关的模式。如果出现新节点,特征维度需要扩展,模型必须重新训练。将模型迁移到新图时,由于节点ID顺序不同,也无法保证有效。
因此,虽然“丰富节点特征以区分计算图”这个思路是好的,但简单地使用独热编码并不可行。我们需要更巧妙、可扩展且具有归纳能力的方法。
总结 📝
本节课中我们一起学习了图神经网络的两个关键局限性:
- 位置感知能力不足:现有GNN难以区分图中不同位置但局部结构相同的节点。
- 表达能力有限:其表达能力受限于WL测试,无法区分某些具有不同高阶结构的节点。

我们探讨了一个使用独热编码的直观但不可行的解决方案,并指出了其不可扩展和非归纳性的缺陷。最后,我们引出了本课程后续的改进方向:通过构建位置感知GNN和身份感知GNN来设计更具表达力的模型。

在接下来的课程中,我们将深入探讨这些更具表达力的GNN模型是如何构建的。


课程 P5:2.2 - 传统基于特征的方法:链接预测 🔗

在本节课中,我们将学习如何为链接预测任务设计特征。链接预测的目标是预测网络中未来可能出现的连接。我们将介绍三种主要的特征描述方法:基于距离的特征、局部邻域重叠特征和全局邻域重叠特征。

链接预测任务概述
链接预测任务是根据网络中已有的连接,预测新的链接。在测试时,我们需要评估所有尚未连接的节点对,对它们进行排名,并预测排名最高的K对节点之间将产生新的链接。
我们可以用两种方式表述此任务:
- 随机丢失链接:假设网络中的一些链接是随机丢失的,我们的目标是使用机器学习算法预测这些丢失的链接。
- 随时间演化的链接:对于随时间自然发展的网络(如引用网络、社交网络),我们基于过去某个时间点的图结构,预测未来将出现的链接。
这两种表述适用于不同类型的网络。第一种适用于静态网络(如蛋白质相互作用网络),第二种适用于动态演化网络(如社交网络)。
特征描述方法
我们的目标是为一对节点 (x, y) 计算一个得分 c(x, y),然后根据得分对所有节点对进行降序排序,预测得分最高的节点对将产生新链接。以下是我们将探讨的三种特征化方法。
1. 基于距离的特征 📏
上一节我们介绍了任务的基本概念,本节首先来看一种直观的特征:基于节点间距离。
我们可以简单地使用两个节点之间的最短路径距离作为特征。例如,节点B和H之间的最短路径长度为2,则该特征值为2。
然而,这个度量只捕获了距离信息,无法衡量节点间连接的强度或邻域重叠的程度。例如,节点B和H有两个共同邻居,其连接应比只有一条路径的节点对(如D和F)更强。因此,我们需要能捕捉连接强度的特征。
2. 局部邻域重叠特征
为了捕捉两个节点之间连接的紧密程度,我们可以询问:“它们有多少个共同的邻居?” 这由局部邻域重叠的概念捕获。
以下是几种常见的局部邻域重叠度量:
- 共同邻居数:计算两个节点邻居集合的交集大小。
- 公式:
CN(v1, v2) = |N(v1) ∩ N(v2)|
- 公式:
- 雅卡尔系数:对共同邻居数进行归一化,除以两个节点邻居集合的并集大小。
- 公式:
Jaccard(v1, v2) = |N(v1) ∩ N(v2)| / |N(v1) ∪ N(v2)|
- 公式:
- Adamic-Adar指数:不仅计算共同邻居数,还根据共同邻居自身的度数(连接数)对其重要性进行加权。度数低的共同邻居贡献更大。
- 公式:
AA(v1, v2) = Σ_{u ∈ N(v1) ∩ N(v2)} 1 / log(|N(u)|)
- 公式:
局部邻域重叠度量的一个限制是:如果两个节点没有共同邻居(例如,距离为两跳但没有直接共同朋友),这些度量值将为零。但在现实中,这样的节点未来仍有可能连接。为了解决这个问题,我们需要考虑更全局的图结构信息。
3. 全局邻域重叠特征
为了解决局部方法的局限性,我们引入全局邻域重叠度量。这类方法不仅考虑两跳路径,还考虑图中所有长度的路径。
我们将重点介绍 Katz 指数。它计算一对节点之间所有长度路径的加权数量,对较长路径给予较低的权重(折扣)。
核心问题:如何计算一对节点之间长度为 k 的路径数?
解决方案:这可以通过计算图的邻接矩阵 A 的 k 次方来优雅地实现。
- 邻接矩阵
A:如果节点u和v相连,则A[u][v] = 1,否则为0。A本身给出了长度为1的路径数。 A^k的含义:矩阵A^k中的元素(A^k)[u][v]的值,等于节点u和v之间长度为k的路径数量。
直观证明:计算 u 和 v 之间长度为2的路径数,可以分解为:对 u 的每个邻居 i,计算从 i 到 v 长度为1的路径数,然后求和。这正是矩阵 A 与自身相乘(即 A^2)的计算过程。通过归纳法,此性质对任意 k 成立。
有了计算任意长度路径数的方法,我们就可以定义 Katz 指数。
Katz 指数公式:
对于一对节点 v1 和 v2,其 Katz 指数得分计算如下:
S[v1][v2] = Σ_{l=1}^{∞} β^l · (A^l)[v1][v2]
其中 β 是一个折扣因子(0 < β < 1),用于降低较长路径的重要性。
这个无穷级数有一个闭式解,可以直接计算:
S = (I - βA)^{-1} - I
其中 I 是单位矩阵。矩阵 S 中的每个元素 S[i][j] 就是节点 i 和 j 的 Katz 指数得分。
总结 📝

本节课我们一起学习了用于链接预测任务的三种特征描述方法:
- 基于距离的特征:例如最短路径距离。简单直观,但无法捕捉邻域重叠信息。
- 局部邻域重叠特征:例如共同邻居数、雅卡尔系数、Adamic-Adar指数。能精细刻画节点间的共同连接,但对于两跳以上无共同邻居的节点对会失效(得分为零)。
- 全局邻域重叠特征:以 Katz 指数 为例。它利用全局图结构,通过计算节点间所有长度路径的加权和来给出分数,克服了局部方法的局限性。

掌握这些传统特征工程方法,是理解后续更复杂图神经网络模型的重要基础。

课程 P50:16.2 - 位置感知图神经网络 🧠📍


在本节课中,我们将要学习位置感知图神经网络。这是一种增强传统图神经网络表达能力的方法,使其不仅能理解节点的局部结构,还能感知节点在整个图中的全局位置。这对于解决某些特定类型的图学习任务至关重要。
概述:两种图任务类型 📊
上一节我们介绍了图神经网络的基础。本节中我们来看看图上的两种主要任务类型。
- 结构感知任务:节点的标签主要由其自身及其邻域的结构决定。例如,在一个由两个连通三角形组成的简单图中,节点根据其局部连接模式被标记为A或B。
- 位置感知任务:节点的标签主要由其在图中的全局位置决定。例如,在社区检测任务中,即使两个节点具有完全相同的局部邻域结构(即同构),如果它们位于网络的不同部分(如不同社区),也可能被赋予不同的标签。
传统图神经网络(如GCN、GAT)在结构感知任务上表现良好,因为它们通过不同的计算图来区分具有不同局部结构的节点。然而,在位置感知任务中,当两个位置不同但局部结构相同的节点具有相同的计算图时,传统GNN会为它们生成相同的嵌入,从而无法区分它们。
核心思想:引入锚点进行三角定位 🎯
那么,如何让图神经网络感知节点的位置呢?关键思想是引入锚点的概念。
我们可以将锚点视为图中的参考点。通过量化一个节点到不同锚点的距离,我们就能确定该节点的位置,这类似于通过三角定位法确定一个点的坐标。
从单个锚点到锚点集
首先,考虑使用单个锚点节点。通过计算目标节点到该锚点的距离,我们可以区分图中不同位置的节点。然而,单个锚点提供的信息有限。
更好的方法是使用多个锚点。这样,我们可以用一个向量来表示一个节点相对于图中多个参考区域的位置,从而更精确地定位节点。
为了进一步提升定位的效率和粒度,我们将锚点的概念从单个节点推广到锚点集。我们定义节点到锚点集的距离为该节点到该集合中任何节点的最短距离。
以下是使用锚点集的一个优势示例:
- 如果仅使用两个锚点节点S1和S2,节点V1和V3可能无法区分(它们到S1和S2的距离可能相同)。
- 但如果引入一个包含节点{V3, V1}的锚点集S3,那么V3到S3的距离为0(因为它在集合内),而V1到S3的距离为1。这样,V1和V3就被区分开了。
理论上,使用不同大小的锚点集组合,可以用相对较少的总坐标数(参考点数量)来实现对图中节点的有效定位。
构建位置编码 🧩
根据上述思想,我们可以为图中的每个节点构建一个位置编码。
- 生成锚点集:随机选择多组节点作为锚点集。一个有效的策略是生成一系列大小呈指数增长的锚点集(例如,大小为1, 2, 4, 8...),但数量依次减半。这样可以用较少的锚点集覆盖更细粒度的位置信息。
- 计算距离:对于每个锚点集,计算目标节点到该集合的最短路径距离。
- 形成编码:将所有距离值组合成一个向量,即为该节点的位置编码。编码中的每个维度对应一个特定的锚点集,其值表示节点到该集合的最小距离。
公式:对于节点 v 和锚点集集合 {S_1, S_2, ..., S_k},其位置编码 PE(v) 为:
PE(v) = [d(v, S_1), d(v, S_2), ..., d(v, S_k)]
其中 d(v, S_i) = min_{u ∈ S_i} dist(v, u),dist 表示图中两节点间的最短路径距离。
将位置信息融入图神经网络 🔗
现在我们有了节点的位置编码,如何将其用于图神经网络呢?
简单方法:特征增强
最直接的方法是将位置编码作为额外的节点特征,与原始节点特征拼接后,输入到标准的GNN模型中。
增强特征 = CONCAT(原始节点特征, 位置编码)
这种方法在实践中通常效果良好且易于实现。
进阶考虑:置换不变性
然而,直接拼接存在一个潜在问题:位置编码的维度顺序是随机的(因为锚点集是随机选择的)。打乱这些维度的顺序,其语义是等价的,但可能会影响某些神经网络的输出。
更严谨的解决方案是设计一种特殊的神经网络算子,使其对位置编码的维度排列具有不变性。这意味着,无论位置编码的维度如何排列,算子的输出值(在相应排列后)应保持不变。相关研究(如P-GNN)对此进行了深入探讨。
但本节课的核心在于理解锚点的概念,以及通过距离来量化图中节点位置的基本原理。这从根本上增强了GNN的表达能力,使其能够同时感知局部结构和全局位置。
总结 📝
本节课中我们一起学习了位置感知图神经网络的核心思想。
- 我们首先区分了结构感知与位置感知两类图任务,并指出了传统GNN在后者上的局限性。
- 我们引入了锚点和锚点集作为参考点,通过计算节点到它们的最短路径距离来构建节点的位置编码,从而实现节点的“三角定位”。
- 我们探讨了将位置编码融入GNN的两种方式:简单的特征增强和考虑置换不变性的更严谨方法。


通过引入位置感知能力,图神经网络能够应对更广泛的现实世界图学习问题。


课程 P51:16.3 - 身份感知图神经网络 🧠

在本节课中,我们将学习身份感知图神经网络。这是一种更具表达力的图神经网络,它通过引入节点身份信息,解决了传统图神经网络在处理某些对称图结构时可能失效的问题。
上一节我们讨论了节点如何编码其在网络中的位置。本节中,我们将看看如何通过赋予节点“身份”来增强图神经网络的表达能力。
传统图神经网络的局限性
传统图神经网络在执行结构感知任务时存在局限性。问题在于,由于图结构的对称性,不同的输入节点或图可能产生相同的计算图,从而导致相同的嵌入表示,使得模型无法区分它们。
以下是几种典型的失败案例:
- 节点级任务失败案例:假设进行节点分类,两个不同的节点
v1和v2可能拥有完全相同的邻居结构(计算图)。传统GNN会将它们嵌入到完全相同的点,无法分配不同的标签。 - 链路预测失败案例:在预测节点
V0应与V1还是V2相连时,如果v1和v2的计算图相同,它们将获得相同的嵌入,导致模型为边a和边b分配相同的连接概率。 - 图级任务失败案例:两个不同构的图,如果所有节点度数相同且计算图结构一致,传统GNN会为这两个图生成相同的图级嵌入,无法区分它们。
在这些情况下,图神经网络在没有额外节点特征时,会将不同的输入分类到相同的类别中。
解决方案:身份感知的核心思想
那么,我们该如何解决这个问题?第二部分的核心思想是:为待嵌入的起始节点分配颜色。这就是“身份感知”的由来,因为图神经网络在展开计算时会记住起始节点的身份。
这个想法是归纳的,并且对节点顺序或标识保持不变。我们只对起始节点着色,然后观察这个着色节点在计算图中出现的频率。因为节点着色是归纳的,即使节点编号不同,基础计算图也不会改变,这有助于模型更好地泛化。
身份感知如何解决具体问题
现在,让我们具体看看归纳节点着色如何帮助我们解决之前提到的任务。
节点分类任务
在之前的案例中,三角形上的节点和正方形上的节点计算图可能相同。如果给根节点着色,再创建计算图,你会发现两者变得不同。特别是在两跳之后,着色方案会揭示结构差异(例如,是否回到了起始节点)。因此,模型能够成功区分节点 v1 和 v2。
图分类任务
对于两个输入图,通过标记起始节点,计算图中的着色模式会变得不同。这意味着节点的嵌入将不同,进而导致聚合后的图嵌入也不同。因此,我们可以将图 A 和图 B 嵌入到不同的点,并为它们分配不同的类别。
链路预测任务
在预测边 a 和边 b 时,我们同时为参与预测的两个节点着色。这样,节点 v1 和 v2 的计算图就会因为到达起始节点 v0 的速度不同而产生差异。这使得模型能够为边 a 和边 b 分配不同的概率。
如何构建身份感知图神经网络
现在的问题是,如何构建一个能利用这种节点着色的图神经网络?关键思想是使用异构消息传递。
在传统GNN中,我们对所有节点应用相同的消息聚合计算。在身份感知图神经网络中,我们将根据节点的颜色,应用不同类型的聚合和消息传递函数。
这意味着,在聚合信息到着色节点时,我们使用一种类型的转换算子;在聚合信息到非着色节点时,我们使用另一种类型的算子。这样,消息会根据是否涉及着色节点而以不同方式转换,最终导致不同的嵌入结果。
为什么异构消息传递有效?假设两个节点 v1 和 v2 的计算图结构相同但节点颜色不同。由于我们对不同颜色的节点应用了不同的神经网络参数,最终 v1 和 v2 的输出嵌入就会不同。
身份感知图神经网络实际上是在计算从给定根节点出发的不同长度的环。例如,它能识别一个节点是处于一个长度为3的环中,还是处于一个长度为4的环中。这种能力使其能够学习和计数图中的环结构。
简化实现方法
除了异构消息传递,还有一种简化方法。其基本思想是将身份信息作为增强的节点特征,从而避免复杂的异构消息传递。

具体做法是:在每一层中,使用环计数(例如,该节点是长度为0、2、3等的环的一部分)作为根节点的增强特征。然后,简单地应用均匀的消息传递。这样,两个计算图不同的节点就能获得不同的特征描述,从而被区分开来。
总结
本节课中,我们一起学习了身份感知图神经网络。这是对图神经网络框架的一个通用而强大的扩展。
- 它通过归纳节点着色和异构消息传递的核心思想,使图神经网络更具表达力。
- 这种方法可以应用于任何图神经网络架构(如图卷积网络、图同构网络等)。
- 它在节点、边和图级别的任务上都能提供一致的性能提升,因为它能打破对称性,识别节点所属的不同环结构。
- 身份感知图神经网络比传统GNN以及最简单的WL测试模型更具表达力。
- 它易于实现,本质上只需要为根节点着色。

关键思想是进行归纳节点着色。我们还提到了位置感知图神经网络,其思想是使用锚点的概念,通过节点到一组锚点的距离来描述节点的位置。我们通常希望使用不同尺寸的锚点集,并计算节点到这些锚点集中任何节点的距离。


课程 P52:16.4 - 图神经网络的鲁棒性 🛡️

在本节课中,我们将要学习图神经网络(GNN)的鲁棒性。我们将探讨图神经网络模型在面对攻击,特别是对抗性攻击时的脆弱性,并了解如何形式化地描述这些攻击。通过本课程,你将理解为什么确保模型在现实世界中的鲁棒性至关重要。
攻击背景与动机
上一节我们介绍了图神经网络的基本概念,本节中我们来看看其在现实应用中的潜在风险。深度学习模型,包括图神经网络,虽然在许多任务上表现出色,但已被证明容易受到精心设计的微小扰动的影响,这被称为对抗性攻击。
在计算机视觉、自然语言处理等领域,攻击者可以通过对输入(如图像像素或文本)添加人眼难以察觉的噪声,就能完全改变模型的预测结果。例如,一张被分类为“熊猫”的图片,经过轻微扰动后,模型可能将其错误地分类为“长臂猿”。
这种对抗性示例的存在,阻碍了深度学习模型在关键现实场景(如金融、安全、推荐系统)中的可靠部署,因为恶意攻击者可能试图操纵系统输入以达成其目的。因此,研究模型的鲁棒性成为一个非常活跃的领域。
图神经网络中的攻击场景
了解了对抗性攻击的普遍性后,我们将其概念具体应用到图神经网络上。图神经网络的常见应用,如社交网络分析、推荐系统和搜索引擎,通常是公开可访问或涉及经济利益,因此更容易成为攻击目标。
攻击者有动机操纵输入的图结构或节点特征,试图改变或推翻图神经网络的预测结果。为了系统性地研究这个问题,我们设定以下框架:
- 任务:半监督节点分类。
- 模型:以图卷积神经网络(GCN)为例。
- 设置:我们有一个部分带标签的图,节点具有特征,目标是预测未标记节点的标签。
接下来,我们将描述攻击者可能实施的几种攻击类型。
攻击类型:直接攻击与间接攻击
以下是攻击者可能采取的两种主要策略:
直接攻击
在直接攻击中,攻击者控制的目标节点 t 就是其希望改变预测标签的节点。攻击者可以:
- 修改目标节点自身的特征(例如,更改用户个人资料)。
- 添加或删除目标节点与其他节点之间的连接(例如,购买粉丝或取消关注)。
间接攻击
在间接攻击中,攻击者希望改变一个其不控制的目标节点 t 的预测。攻击者通过操纵其控制的代理节点 M 来实现:
- 修改代理节点的特征和连接。
- 通过改变网络结构(特别是与目标节点的连接)来间接影响目标节点的分类结果。
形式化对抗性攻击
上一节我们介绍了攻击的类型,本节中我们来看看如何用数学语言形式化地定义一次攻击。攻击者的目标是:在尽可能少地改动图的前提下,最大化目标节点预测标签的变化。
设原始图的邻接矩阵为 A,节点特征矩阵为 X。攻击者操纵后的图对应 A‘ 和 X‘。操纵的幅度 ΔA = A‘ - A 和 ΔX = X‘ - X 应当很小,以保持基本的图统计特性(如度分布)不被明显破坏。
攻击的正式目标可以表述为以下优化问题:
我们希望最大化目标节点 v 的预测变化 Δ。设 c 为原始预测的类别,c‘ 为攻击后希望模型预测的类别。我们定义变化 Δ 为:
Δ = log Pθ‘(c‘|A‘, X‘, v) - log Pθ(c|A, X, v)
其中 θ 和 θ‘ 分别是在原始图和操纵后图上训练得到的模型参数。
攻击者的优化问题是:
argmax_{A‘, X‘} Δ
同时满足约束:ΔA 和 ΔX 尽可能小。
解决此优化问题的挑战在于:
- 邻接矩阵
A是离散的,难以使用基于梯度的方法进行优化。 - 每次对图结构的修改都需要重新训练 GCN 以评估预测效果,计算成本高昂。
实证结果与分析
理论形式化之后,让我们通过实验看看攻击的实际效果。我们在一个论文引用网络(约2800个节点,8000条边)上进行六分类的半监督节点分类任务。
首先,在无攻击情况下,GCN 模型表现良好,对大多数节点的分类具有高置信度。

然后,我们实施攻击:
- 直接对抗性攻击:攻击者直接修改目标节点的连接。实验发现,仅修改连接到目标节点的5条边,就足以使其预测标签从真实类别(如“类别6”)翻转为目标错误类别(如“类别7”),且模型对新预测具有高置信度。
- 直接随机攻击:随机添加/删除目标节点的边。这会降低模型性能,但效果远不如有针对性的对抗性攻击剧烈。
- 间接对抗性攻击:通过操纵代理节点来影响目标节点。其效果强于随机攻击,但弱于直接对抗性攻击。
下图总结了不同攻击下模型的分类置信度变化:
- 无攻击:大多数节点分类正确且置信度高。
- 直接对抗性攻击:模型在大量节点上做出错误且高置信度的预测。
- 随机攻击:性能下降,但多数预测仍正确。
- 间接攻击:能成功翻转相当一部分目标节点的标签。
总结与结论
本节课中我们一起学习了图神经网络,特别是图卷积神经网络(GCN)在半监督节点分类任务中的对抗鲁棒性。
我们首先讨论了对抗性攻击的背景和动机。接着,我们定义了图上的两种攻击场景:直接攻击和间接攻击。然后,我们将对抗性攻击形式化为一个优化问题,其核心是在最小化图改动的前提下,最大化目标节点预测标签的变化。最后,通过实证分析,我们观察到:
- GCN 对直接对抗性攻击非常脆弱,只需微小改动即可导致预测完全错误。
- GCN 对随机扰动和间接攻击具有一定鲁棒性,但性能仍会显著下降。

我们的结论是:当前的图神经网络模型对精心设计的对抗性攻击并不健壮,这提醒我们在将此类模型部署于开放或对抗性环境时,必须将鲁棒性纳入重要的考量范围。


课程 P53:17.1 将图神经网络扩展至大规模图 🚀

概述
在本节课中,我们将学习如何将图神经网络(GNN)扩展应用于包含数百万乃至数十亿节点的大规模图。我们将探讨传统方法面临的挑战,并介绍几种关键技术,使GNN能够高效地处理海量图数据。
问题定义与动机
在许多现代应用中,我们都会遇到大规模图。例如,在推荐系统中,亚马逊向你推荐产品的系统、Pinterest的帖子推荐、Instagram的检查等。你可以将这些任务视为一种连接用户与内容(如产品、视频)的方式。这个推荐任务可以被看作是在一个巨大的二分图上进行链接预测。这个图的一端可能有数亿甚至数十亿用户,另一端则有数千万乃至数百亿的物品。我们的目标是预测哪些电影、视频或产品对哪些用户是有趣的。
另一个例子是社交网络,如Twitter、Facebook、Instagram。在这些网络中,我们有用户、朋友和关注关系。我们可能需要进行链接级别的朋友推荐、用户属性预测(如预测用户对哪些广告感兴趣或来自哪个国家),或者进行属性补全(例如,预测未知用户的性别)。这些网络通常拥有数十亿用户和数百亿到数千亿的边。
此外,异构图也是一个重要的应用领域。例如,微软学术图数据集包含1.2亿篇论文、1.2亿作者及其所属机构。这构成了一个巨大的异构知识图。任务可能包括论文分类、向作者推荐合作者、预测论文间的引用关系等。更广泛地说,我们可以考虑来自维基百科或Freebase的知识图,它们同样包含数亿实体,我们需要在其上完成知识图补全或知识推理任务。
所有这些应用的共同点是它们都是大规模的:节点数量从数百万到数十亿不等,边的数量从数千万到数千亿不等。核心问题是:面对如此大规模的数据,我们如何在节点级任务(如节点分类)和成对级任务(如链接预测)中应用GNN?我们需要开发什么样的系统和算法来处理这种海量数据?
传统方法的挑战
接下来,我们解释为什么这很困难,以及为什么需要特殊的方法来处理大规模数据集。
小批量梯度下降的困境
通常,当有大量数据点时,我们的目标是最小化训练数据上的平均损失。如果我们有 n 个训练数据点,损失函数可以表示为对所有数据点损失的求和:
公式: 总损失 = Σ(从 i=0 到 n-1) 损失(真实标签_i, 预测标签_i)
为了高效计算,我们通常采用小批量梯度下降:随机选择一小批(大小为 m)数据点,用这小批数据的损失和梯度来近似整个数据集的梯度。这大大加快了计算速度。
然而,在图神经网络中,简单地采样一组节点作为小批量是行不通的。如下图所示,当我们采样一小批节点时,这些节点在图中很可能是彼此孤立的。因为GNN通过聚合邻居信息来生成节点嵌入,而这些邻居节点很可能不在当前的小批量中。这意味着小批量内的节点无法进行有效的消息传递,计算出的梯度无法代表整个图的梯度,从而导致随机梯度下降法无法有效训练GNN。
全批量训练的瓶颈
另一种思路是采用全批量训练:同时为图中所有节点计算嵌入。在K层GNN中,计算第k层的节点嵌入需要用到第k-1层所有节点的嵌入。这种递归结构要求我们将整个图结构以及每一层所有节点的嵌入都存储在内存中,以便进行计算。
全批量训练存在两个主要问题:
- 计算效率低:即使不考虑时间,全批量训练对于大图来说也是不现实的。
- 内存限制:为了快速训练,我们希望使用GPU。但GPU内存非常有限(通常为10-30GB)。对于一个拥有十亿节点、每个节点有数百字节特征的图,所需内存轻松达到TB级别,这远远超出了GPU的内存容量。虽然CPU内存更大,但计算速度慢。
因此,我们无法将全批量训练扩展到超过几千个节点的网络,更不用说数百万或数十亿节点的图了。
解决方案概览
这引出了本节课的核心:我们如何改变思考GNN的方式、如何实施训练、如何修改架构,从而将其扩展到数十亿节点的大规模图,并能在有限的GPU内存上运行?

我们将介绍三种主要方法,前两种基于在小批量内对子图进行消息传递,从而改变小批量的构建方式:
- 邻域采样技术
- Cluster-GCN技术
第三种方法则通过简化GNN架构,使其计算能够主要在内存充足的CPU上高效执行:
3. 简化GCN方法
总结

本节课我们一起学习了将图神经网络扩展至大规模图所面临的挑战。传统的小批量梯度下降法因节点孤立而失效,全批量训练则受限于GPU内存。为了克服这些困难,我们需要采用新的策略,例如在构建小批量时考虑图的局部结构(如邻域采样、Cluster-GCN),或者设计更简洁、易于在CPU上计算的模型架构(如简化GCN)。这些技术使得GNN能够应用于推荐系统、社交网络、知识图谱等真实世界的大规模场景中。


课程 P54:17.2 - GraphSAGE 邻域采样 🧠
在本节课中,我们将学习图神经网络(GNN)中一个关键的大规模训练技术——邻域采样。这是 GraphSAGE 架构的核心思想,它使得 GNN 能够处理包含数十亿节点和边的大规模图数据。

概述
在 GraphSAGE 出现之前,图神经网络的实现大多是全批次的。这意味着人们只能将整个图(例如几千个节点)一次性加载到 GPU 内存中进行训练,极大地限制了可处理的图规模。GraphSAGE 引入了一种新的视角,通过小批次和邻域采样的方法,让我们能够高效地训练深层 GNN,并将其扩展到工业级的大图上。
核心思想:从计算图到邻域采样
上一节我们介绍了图神经网络的基本工作原理。本节中,我们来看看 GraphSAGE 是如何通过计算图的局部性来实现高效小批次训练的。
GNN 的计算图视角
图神经网络通过邻域聚合来生成节点嵌入。对于一个目标节点,其 K 层嵌入的计算依赖于其 K 跳邻域 内的节点特征和图结构。
公式表示: 对于一个 K 层 GNN,节点 v 在第 k 层的嵌入 h_v^(k) 可以表示为:
h_v^(k) = AGGREGATE({ h_u^(k-1) : u ∈ N(v) })
其中 N(v) 是节点 v 的邻居集合,AGGREGATE 是聚合函数。
这意味着,要计算节点 v 的最终嵌入,我们只需要知道以 v 为中心、半径为 K 的子图(即其 K 跳邻域)。图的其他部分不会影响 v 的嵌入结果。这是一个非常重要的洞察。
基于计算图的小批次训练
基于上述洞察,我们可以设计一种新的小批次训练策略:
- 传统方式: 小批次由一组独立的节点组成。
- GraphSAGE 方式: 小批次由一组计算图组成。每个计算图对应一个目标节点及其 K 跳邻域。
以下是具体步骤:
- 从图中随机采样
M个目标节点。 - 对于每个目标节点,提取其完整的 K 跳邻域,构建一个计算图。
- 将这
M个计算图放入 GPU 内存,计算损失并更新模型参数。
这种方法允许我们进行随机梯度下降,因为每个小批次都是随机创建的。梯度虽然带有随机性,但更新速度非常快。
邻域采样的必要性
然而,直接构建完整的 K 跳计算图仍然面临挑战:
- 计算图指数增长: 即使每个节点平均只有少量邻居,随着层数
K增加,计算图中的节点数也会呈指数级增长。 - 现实图中的枢纽节点: 在社交网络或知识图谱中,存在一些连接数极多(度很高)的“名人”节点或“大国”节点。如果目标节点或其中间邻居是这种枢纽节点,其 K 跳邻域会变得极其庞大,无法放入内存。
因此,我们需要对计算图进行“修剪”,这就是邻域采样。
邻域采样详解 🎯
邻域采样的核心思想是:在构建计算图时,对于需要进行聚合的每个节点,我们最多只采样固定数量(H)的邻居。

代码描述:
# 伪代码:为节点v构建K层计算图,每层最多采样H个邻居
def build_computation_graph(v, K, H):
graph = {0: [v]} # 第0层:目标节点
for layer in range(1, K+1):
current_nodes = graph[layer-1]
sampled_neighbors = []
for node in current_nodes:
# 从node的邻居中随机采样最多H个
neighbors = sample_neighbors(node, max_count=H)
sampled_neighbors.extend(neighbors)
graph[layer] = sampled_neighbors
return graph
通过这种方式,计算图的大小增长被限制在 O(H^K) 以内,变得可管理。参数 H 控制了采样数量。
关于采样策略的权衡与优化
以下是关于邻域采样的一些重要考量:
- 采样数量 H 的权衡:
H越小,计算图越小,训练效率越高,但梯度估计的方差越大,训练过程更不稳定,因为忽略了更多的邻域信息。 - 层数 K 的影响: 即使采用采样,增加 GNN 层数仍会使计算成本增加约
H倍。因此,K和H都需要谨慎选择(例如,H在5-10左右,K在5层左右)。 - 更智能的采样策略: 均匀随机采样可能不是最优的。在现实的高度倾斜的度分布图中,随机采到的很可能是大量不活跃、信息量少的低度节点。一种更好的策略是使用带重启的随机游走来为邻居节点的重要性打分,然后选择分数最高的
H个邻居。这样构建的计算图更具代表性,包含更多信息丰富的节点,能提升模型性能。
目前,对于不同场景下最优的采样策略,还没有系统性的研究,这将是图机器学习领域一个有价值的方向。
总结与要点 📝
本节课中,我们一起学习了 GraphSAGE 的邻域采样方法。
- 核心动机: 为了将 GNN 扩展到大规模图,需要采用小批次训练。而计算节点嵌入只需其局部 K 跳邻域信息。
- 关键方法: 将计算图(即目标节点的 K 跳邻域)作为小批次的基本单元。为了控制计算图大小,提出了邻域采样,即为每个待聚合的节点最多采样
H个邻居来构建计算图。 - 优势: 这种方法极大地提高了计算和内存效率,并引入随机性,某种程度上起到了类似 Dropout 的正则化效果,增强了模型的鲁棒性。
- 工业应用: 邻域采样是当前工业级大规模图神经网络实现(如 Pinterest 使用的系统)的基石技术。

最终,我们需要在小批次大小、采样数量 H 和模型深度 K 之间进行权衡,以在训练效率、梯度可靠性和模型表达能力之间取得平衡。


图神经网络课程 P55:17.3 - 使用 Cluster GCN 扩展 GNN 🚀

在本节课中,我们将学习一种名为 Cluster GCN 的图神经网络扩展方法。该方法旨在解决大规模图数据无法一次性装入GPU内存进行训练的问题。我们将了解其核心思想、工作原理、优势以及如何通过改进来克服其局限性。
问题背景与动机
上一节我们介绍了邻域采样的方法。本节中,我们来看看另一种基于采样的方法——Cluster GCN。
在图神经网络中,计算图的大小会随着GNN层数的增加呈指数级增长。此外,由于节点之间共享邻居,计算图可能包含大量冗余计算。例如,节点A和B的计算图中,其共同邻居C和D的计算部分是重复的。
目前有两种思路来解决这个问题:
- 意识到计算是重复的,只计算一次(例如,KDD 2021的“Yaksha”论文提出的分层聚合方法)。
- 对原始图进行子图采样,然后在子图上进行全批次计算。这就是 Cluster GCN 的核心思想。
全批次GNN的实现虽然计算高效(计算量与边数呈线性关系),但无法处理过大的图,因为GPU内存有限。Cluster GCN的洞察在于:我们可以将大图分割成多个小子图,然后在这些子图上执行全批次GNN计算。
Cluster GCN 的核心思想
Cluster GCN 的关键在于如何采样“好”的子图。GNN通过边传递消息,每个节点从其邻居处聚合信息。因此,一个好的子图应尽可能多地保留原始图的边,以模拟在大图上的计算,从而生成接近原始图的节点嵌入。
以下是选择子图的示例:
- 好的子图:保留了节点的大部分邻居,能很好地估计其嵌入。
- 差的子图:丢弃了节点的大部分邻居,导致其嵌入估计不准确。
现实世界的图通常具有社区(聚类)结构。Cluster GCN 的关键洞察是:基于社区结构对子图进行采样,可以使每个子图保留大部分内部边,只丢弃少量跨社区的边。
基础 Cluster GCN 的工作流程
Cluster GCN 采用两步流程:
- 预处理:使用社区检测算法(如Louvain算法)将原始大图划分为
C个节点组(社区)。 - 小批量训练:
- 采样一个节点组。
- 在该节点组上创建一个诱导子图(包含组内所有边)。
- 将这个诱导子图装入GPU内存。
- 在该子图上执行全批次GNN计算:进行分层节点嵌入更新,计算损失和梯度,并更新模型参数。
- 重复此过程,采样下一个节点组。
核心公式/代码描述:
假设我们将节点集合 V 划分为 C 个组 {V1, V2, ..., VC}。对于每个小批量,我们采样一个组 Vc,并在其上构建诱导子图 G[Vc],然后进行GNN计算。
基础 Cluster GCN 的局限性及改进
基础方法存在一个问题:诱导子图丢弃了组与组之间的边(跨社区边)。这导致消息传递过程中丢失了来自其他社区的信息,可能损害模型性能。
更严重的是,由于社区检测将相似节点聚在一起,采样到的节点组往往只覆盖图中一个集中的小部分。这会导致:
- 模型只在图的局部区域学习,缺乏多样性。
- 不同节点组计算的梯度差异巨大,造成训练不稳定,收敛困难。
改进方法:高级 Cluster GCN
为了解决上述问题,高级 Cluster GCN 在每个小批量中聚合多个节点组。
其工作流程如下:
- 将节点划分为比基础方法更小的子组。
- 在每个小批量中,采样多个这样的节点子组,并将它们合并为一个“超组”。
- 在这个超组的所有节点上创建诱导子图。这个子图不仅包含各子组内部的边,也包含不同子组之间的边。
- 在此诱导子图上执行全批次GNN计算。
这种方法使得采样子图更具代表性和多样性,从而得到更稳定的梯度估计,实现更快、更稳定的训练收敛。
Cluster GCN 与邻域采样的比较
现在,我们来比较一下 Cluster GCN 和邻域采样两种方法。
邻域采样:为每个目标节点采样一个计算图。对于 M 个节点和 K 层GNN,计算成本与 M * H^K 相关,其中 H 是采样邻居数。这是关于层数 K 的指数成本。
Cluster GCN:在包含 M 个节点的诱导子图上执行消息传递。计算成本与 K * M * AvgDegree 相关,其中 AvgDegree 是平均度数。这是关于层数 K 的线性成本。
比较总结:
- 计算效率:当
H(邻域采样的邻居数)大于平均度数的一半时,Cluster GCN 通常比邻域采样计算效率更高,尤其是在层数较深时。 - 实践应用:邻域采样在实践中使用更广泛。
- 深度限制:Cluster GCN 的深度受限于采样子图的直径。即使网络总层数很深,消息也只在子图内部振荡,无法探索原始图的全局深度。而邻域采样可以构建更深的计算图。

总结
本节课中,我们一起学习了 Cluster GCN 这种扩展GNN的方法。
- 其核心思想是将大图划分为社区,然后对社区子图进行全批次训练,以解决内存限制问题。
- 基础 Cluster GCN 存在梯度不稳定、缺乏多样性的问题。
- 高级 Cluster GCN 通过在每个小批量中聚合多个节点组来改进,使训练更稳定。
- 与邻域采样相比,Cluster GCN 在计算上可能更高效(线性 vs 指数),但邻域采样在探索图深度和实际应用上更具灵活性。

理解这两种主流采样方法的权衡,有助于我们在面对大规模图数据时,选择或设计合适的训练策略。


课程 P56:17.4 - 通过简化GNN实现扩展 📈

在本节课中,我们将学习如何通过简化图神经网络(GNN)的架构来实现模型扩展。这是一种与前两种方法(如采样或分区)正交的策略。我们将从一个具体的例子——图卷积网络(GCN)开始,通过移除其非线性激活函数来简化它,并探讨这种简化带来的效率提升与性能权衡。
简化GCN架构的动机 💡
上一节我们讨论了扩展GNN的几种思路。本节中,我们来看看一种不同的方法:通过简化模型架构本身来提高可扩展性。具体来说,我们将以图卷积网络(GCN)为例,展示如何通过移除非线性激活函数来获得一个计算效率极高的模型。
研究表明,在基准测试中,移除非线性后的GCN性能下降并不显著。这意味着我们可以通过牺牲模型的一部分表达能力,来换取训练速度的大幅提升。简化的GCN架构计算速度快,易于训练,并且能够在大规模数据上高效运行。当然,这背后存在一个权衡,我们将在后续详细讨论。
GCN的矩阵形式回顾 🔄
为了理解简化过程,我们首先需要回顾标准GCN的公式。GCN通过聚合邻居信息来迭代更新节点嵌入。假设我们有一个图,节点特征为 X。在每一层 l,节点 v 的嵌入 h_v^(l) 通过聚合其邻居 N(v) 在前一层的嵌入并应用非线性变换得到。
我们可以用优雅的矩阵形式重写这个过程。定义邻接矩阵 A(包含自环),度矩阵 D(对角线元素为节点度数)。那么,邻居聚合操作可以表示为 D^(-1) A H^(l)。因此,标准GCN的一层更新可以写成:
H^(l+1) = σ( D^(-1) A H^(l) W^(l) )
其中:
- H^(l) 是第 l 层的节点嵌入矩阵。
- σ 是非线性激活函数(如ReLU)。
- W^(l) 是可学习的权重矩阵。
- Ã = D^(-1) A 是归一化的邻接矩阵。
通过迭代 K 次上述公式,我们可以计算出 K 层GCN的最终节点嵌入。
移除非线性:简化GCN 🧹
现在,让我们开始简化GCN。核心思想是移除每一层的非线性激活函数 σ。这样,更新方程变为一个纯粹的线性变换:
H^(l+1) = Ã H^(l) W^(l)
接下来,我们展开这个递归关系。假设输入层 H^(0) = X(原始节点特征矩阵)。那么经过 K 层后,最终嵌入 H^(K) 可以展开为:
H^(K) = Ã^K X W
其中 W = W^(0) W^(1) ... W^(K-1) 是 K 个权重矩阵的乘积,它本身仍然是一个可学习的参数矩阵。
这个推导带来了一个关键的洞见:项 Ã^K X 完全独立于任何需要训练的参数 W。回忆一下,邻接矩阵的 K 次幂 Ã^K 编码了图中长度为 K 的路径信息。因此,Ã^K X 本质上是对每个节点其 K 跳邻居的特征进行预聚合。
简化GCN的训练流程 ⚙️
基于上述分析,简化GCN的训练可以分解为两个独立的阶段:预处理和参数学习。
以下是具体的步骤:
- 预处理阶段:在训练开始之前,我们在CPU上预先计算矩阵 X̃ = Ã^K X。这个计算只涉及稀疏矩阵的幂运算和乘法,效率很高。计算结果 X̃ 是一个矩阵,其中每一行对应一个节点的预处理特征向量。
- 训练阶段:在每一小批量(mini-batch)训练中:
- 我们随机采样一小批节点。
- 对于每个被采样的节点,我们从预计算的矩阵 X̃ 中取出对应的行(即该节点的预处理特征)。
- 该节点的最终嵌入通过一个简单的线性变换得到:z_v = X̃_v W,其中 W 是待学习的参数矩阵。
- 使用这些嵌入进行预测、计算损失,并通过反向传播更新参数 W。
这种方法的巨大优势在于,为小批量中的节点生成嵌入变得极其高效,因为它只是一个矩阵乘法,节点之间没有依赖关系,也不需要构建复杂的计算图。
性能权衡与同质性假设 ⚖️
上一节我们介绍了简化GCN的高效训练流程。本节中,我们来看看这种简化付出的代价,并探讨它为何在许多实际场景中依然有效。
与Cluster-GCN等方法相比,简化GCN的节点采样可以完全随机进行,无需复杂的图分区或子图诱导,训练稳定,梯度方差小。然而,代价是模型表达能力的显著下降。由于移除了非线性,简化GCN无法学习复杂的节点表示变换,理论上其区分不同图结构的能力较弱。
但有趣的是,在许多现实世界的图数据集基准测试中,简化GCN的表现往往与原始GCN相差不大。这是为什么呢?答案在于图结构的“同质性”(Homophily)假设。
同质性是一个社会学概念,俗称“物以类聚,人以群分”。在图数据中,它表现为相连的节点往往具有相似的属性或标签。例如:
- 在社交网络中,朋友通常有相似的兴趣。
- 在引文网络中,同一领域的论文倾向于互相引用。
- 在推荐系统中,用户喜欢看的电影通常属于相同类型。

简化GCN的预处理步骤 Ã^K X 正是在 K 跳邻居内对节点特征进行迭代平均。如果图具有强同质性,那么通过边连接的节点,其预处理后的特征 X̃ 自然会变得相似。如果这些节点的真实标签也恰好相似(即标签在网络中聚集),那么一个简单的线性分类器(即参数 W)就足以根据 X̃ 做出准确的预测。
因此,简化GCN成功的关键前提是:图数据必须表现出较强的同质性。如果节点标签在网络中随机分布或异质性很强,简化GCN的性能可能会大幅下降。
总结 📝
本节课中,我们一起学习了通过简化GNN架构来实现扩展的方法。我们以GCN为例,通过移除其非线性激活函数,将其转化为一个高效的线性模型。
核心简化步骤是将GCN的递归更新展开,分离出与参数无关的预处理部分 Ã^K X。这使得训练过程分为两步:先在CPU上高效预计算节点特征,然后在训练中仅对可学习参数 W 进行快速的随机梯度下降优化。

这种简化牺牲了模型的理论表达能力,但在许多实际同质图数据上表现良好,因为其预处理步骤天然地使相连节点的特征相似化,便于后续线性分类。理解这种方法的有效性和局限性,有助于我们在实际应用中权衡模型复杂度与计算效率。


课程 P57:计算生物学中的图神经网络 🧬
在本节课中,我们将要学习图神经网络在计算生物学领域的应用。我们将探讨为什么图结构非常适合表示生物数据,并了解GNN如何被用于解决药物安全性预测、疾病诊断和药物重定位等关键生物医学问题。
概述:为什么图神经网络适用于生物学?



生物学本质上是一个相互关联的系统。从基因组序列、蛋白质相互作用,到人体细胞、整个生态系统,生物实体之间存在着复杂的网络关系。例如,药物的作用方式并非独立,而是通过影响细胞内的蛋白质网络来产生效应。因此,从网络视角研究生物学非常有意义。
一个核心观察是“局部假说”:在生物网络中,具有相似属性(如导致相同疾病)的实体倾向于聚集在网络中的特定区域。例如,在人类蛋白质相互作用网络中,与同一种疾病相关的蛋白质倾向于彼此连接。这种网络特性使得图神经网络成为分析生物网络、学习有意义的生物学表示的强大工具。
然而,生物网络也带来了一些独特的挑战,包括网络异质性、多源数据整合以及数据固有的噪声和不完整性。本课程将介绍如何通过算法创新来应对这些挑战。
第一部分:建模药物安全性与药物组合 💊
上一节我们介绍了图神经网络在生物学中的通用优势,本节中我们来看看它在预测药物组合安全性方面的具体应用。
多药治疗是指患者同时服用多种药物的情况,这在老年患者中非常普遍。问题在于,多种药物同时服用可能引发意想不到的药物间相互作用,导致严重的不良事件。据估计,约15%的人口受到药物不良事件的困扰。
我们的学习任务是:设计一个模型,能够预测特定的药物组合导致特定副作用的可能性。
面临的挑战
以下是建模药物组合安全性时面临的主要挑战:
- 组合爆炸:即使只考虑两种药物的组合,可能性也超过1300万种,在实验室中全面测试是不可行的。
- 非线性效应:药物相互作用本质上是非加性的,即组合效应不等于单个药物效应的简单相加。
- 数据稀疏性:对于许多尚未广泛使用的药物组合,患者报告数据极少,形成“小数据”问题。

DECAGON方法
为了应对这些挑战,我们介绍一种名为DECAGON的方法,它使用图神经网络在多药理学知识图谱上预测药物组合安全性。
知识图谱结构:
- 节点:药物(绿色三角形)和蛋白质(橙色圆形)。
- 边:
- 药物-药物边:表示两种药物联合使用时会导致特定类型的不良事件(副作用)。
- 药物-蛋白质边:表示药物靶向的蛋白质。
- 蛋白质-蛋白质边:表示蛋白质之间的相互作用(来自蛋白质相互作用网络)。
模型架构:
DECAGON包含两个主要组件:
- 编码器:一个多关系图编码器,用于学习图中每种药物和蛋白质节点的嵌入表示。它通过区分不同的边类型来探索每个节点的局部邻域。
- 解码器:一个张量分解风格的解码器,用于预测药物节点之间是否存在表示特定副作用的边。
编码器的工作方式可以概括为以下公式。对于节点 v 在第 k 层的嵌入 h_v^k 更新为:
h_v^k = σ( W_self^k * h_v^{k-1} + Σ_{r∈R} Σ_{u∈N_r(v)} (c_{vu} * W_r^k * h_u^{k-1}) )
其中,R 是所有边类型的集合,N_r(v) 是节点 v 在边类型 r 下的邻居集合,W_r^k 和 W_self^k 是可训练的权重矩阵,c_{vu} 是归一化常数,σ 是非线性激活函数。
结果与应用
DECAGON模型在一个包含超过400万条药物-药物边、药物-蛋白边和蛋白-蛋白边的知识图谱上进行了训练。与基线模型(如张量分解、浅层嵌入模型)相比,DECAGON在预测药物相互作用方面表现更优。

更重要的是,当进行时间外推测试时(使用2012年前的数据训练,预测之后的新相互作用),DECAGON做出的前十名预测中,有五个在2012年后的医学文献中找到了直接证据。这证明了其发现新型、潜在有害药物相互作用的能力。
这项工作为开发更个性化的不良事件预测模型奠定了基础,目前已有包含超过1000万份不良事件报告的数据集可供此类研究使用。
第二部分:预测患者结局与疾病诊断 🩺
在了解了如何利用GNN预测药物安全性后,本节我们将转向另一个重要问题:疾病诊断。
疾病诊断的核心是基于观察到的患者表型信息。表型是可观察的特征,由基因型和环境相互作用产生。医生使用标准化词汇(如人类表型本体HPO)来描述疾病。在机器学习中,我们可以将诊断任务形式化如下:
- 基础图:一个以表型为节点、以表型间关系为边的图。
- 子图:代表特定疾病的表型集合,或代表患者症状的表型集合。
- 学习任务:预测与描述患者的表型子图最一致的疾病标签。
子图预测的挑战
一个直观的想法是使用节点级GNN学习表型嵌入,然后通过平均聚合得到子图嵌入。但这种方法可能丢失关键信息,原因如下:
- 子图大小不一:如何有效表示不同大小的子图?
- 丰富的连通性:子图内部及其与外部图的连接结构包含重要信息。
- 分布多样性:子图可能集中在图的某个区域,也可能分散在多个不连通的社区。
SubGNN方法
为了解决子图级别的预测问题,我们引入了SubGNN模型。它的目标是学习能够捕捉子图拓扑结构的嵌入表示,使得拓扑相似的子图在嵌入空间中也彼此接近。
SubGNN通过分层的消息传递方案工作,该方案专门设计用于捕获子图拓扑的三个关键方面:
- 邻域:子图直接邻域内的连通性。
- 位置:子图在整个基础图中的位置。
- 结构:子图内部的结构模式(如特定模体的出现频率)。
模型在三个独立的通道中分别进行消息传递,每个通道针对上述一个方面进行优化。消息从随机采样的“锚点补丁”传递到目标子图的各个组件,传递的权重由子图组件与锚点补丁的相似性决定。最后,三个通道的输出被聚合,形成最终的子图表示 z_s。
实验验证
首先,在合成数据集上测试SubGNN。这些数据集的子图标签根据其网络属性(如密度、割集大小)定义。结果表明,SubGNN能够有效捕捉子图拓扑的不同方面,并且性能显著优于简单的节点嵌入平均等基线方法。
随后,在真实世界数据集上进行了测试,特别是基于人类表型本体构建的HPO-Metab和HPO-Neuro数据集。这些数据集模拟了根据患者表型诊断代谢或神经系统疾病的任务。SubGNN在这类诊断任务上的性能,相比基线模型提升了最高达127%,证明了子图级建模的有效性。

第三部分:识别有效的疾病治疗方法 🎯

在讨论了安全性和诊断之后,本节我们关注药物开发的另一个核心终点:疗效。我们将重点放在为新兴疾病寻找治疗方法,特别是药物重定位。
药物重定位是指发现已上市药物对新的疾病适应症的治疗作用。这是一种比从头开发新药更快、成本更低的策略。例如,在COVID-19大流行初期,快速识别已有药物作为潜在疗法至关重要。


问题定义与挑战
我们将药物重定位形式化为一个链接预测问题:在一个二分图中,一侧是药物节点,另一侧是疾病节点,已知的治疗关系作为边。目标是预测新的“药物-疾病”边。
主要挑战在于样本稀缺。对于像COVID-19这样的全新疾病,根本没有已知的治疗药物作为正样本。传统的GNN方法依赖丰富的标签信息进行训练,这在面对新疾病时失效。
元学习与G-META方法
为了解决少样本学习问题,我们采用元学习策略。元学习的目标是训练一个模型,使其能够在只有极少数标签示例的新任务上快速适应。
我们引入了G-META方法,用于图上的少样本学习。其核心思想是:通过提取包含标记节点的局部子图,并将子图的结构信息作为“签名”,来初始化GNN。这种方法有效的原因在于:
- 结构相似性:在标签极度稀缺的情况下,依赖标签传播不可行,而具有相似标签的节点通常在局部邻域内具有相似的结构模式。
- 生物学依据:在生物网络中,预测所需的关键信息通常存在于目标节点周围2-3跳的邻域内。
COVID-19药物重定位应用
我们将G-META应用于COVID-19药物重定位:
- 数据构建:
- COVID-19表示:基于病毒蛋白攻击的332种人类蛋白质集合,及其在人类蛋白质相互作用网络中的邻域。
- 药物表示:每种药物已知靶向的蛋白质集合。
- 训练任务:基于其他已知的药物-疾病治疗关系进行元训练。
- 预测与验证:
- 模型学习COVID-19的嵌入,并寻找嵌入空间中与之最接近的药物。
- 生成的候选药物列表被提交给病毒学家进行实验验证。
- 在细胞系和小鼠模型测试中,G-META预测的药物显示出比以往基于网络邻近性或随机游走的方法高出一个数量级的“命中率”。
- 一个关键发现是,绝大多数预测有效的药物并非直接靶向病毒蛋白,而是通过“网络效应”作用于与病毒靶点相互作用的蛋白质,这凸显了图方法在发现新型作用机制方面的优势。
总结与展望 🚀
本节课中,我们一起学习了图神经网络在计算生物学中的三个重要应用方向:
- 药物安全性预测:利用多关系知识图谱(如DECAGON模型)预测药物组合的不良反应,应对组合爆炸和数据稀疏挑战。
- 疾病诊断:通过子图神经网络(如SubGNN)对患者表型子图进行嵌入和分类,实现更精准的诊断。
- 药物重定位:采用元学习框架(如G-META)解决少样本学习问题,快速为新兴疾病(如COVID-19)识别有潜力的治疗药物。


这些应用展示了GNN如何利用生物数据中固有的网络关系结构,推动生物医学发现。未来的挑战包括提高模型的可解释性、建立临床医生的信任,以及将这些方法更广泛、更常规地整合到临床和药物研发工作流程中。随着更多数据的产生和算法的进步,图神经网络有望在个性化医疗、疾病机理理解和新型疗法开发中发挥越来越重要的作用。

课程 P58:19.1 - 图神经网络预训练 🧠


在本节课中,我们将学习图神经网络在科学领域的应用,特别是如何通过预训练来解决数据稀缺和外推预测的挑战。我们将探讨几种有效的预训练策略,并理解其背后的原理。
图神经网络在科学领域的应用 🧪
上一节我们介绍了课程概述,本节中我们来看看图神经网络在科学领域的具体应用场景。
在许多科学领域,图结构问题非常普遍。例如,在化学中,分子可以表示为图,其中每个节点是一个原子,每条边代表一个化学键。我们的目标是预测分子的性质,例如其毒性。在生物学中,蛋白质-蛋白质相互作用网络也是一个图,其中节点是蛋白质,边代表相互作用。我们的目标可能是预测某个中心蛋白质是否具有特定的生物活性。
图神经网络可以用于解决这类图分类问题。其基本流程如下:
- 给定一个图(如分子图),GNN通过迭代聚合邻居信息来获得每个节点的嵌入表示。
- 一旦获得所有节点的嵌入,我们可以通过一个池化函数(如求和、平均)来获得整个图的嵌入表示。
- 最后,在图嵌入上应用一个线性分类器,来预测整个图的属性(如是否有毒)。

在这个过程中,节点嵌入试图捕获每个节点周围的局部邻域结构。如果我们应用K跳GNN,它就能捕获K跳范围内的局部社区信息。整个图的嵌入则聚合了所有这些局部结构信息。

科学应用中的挑战 🚧
上一节我们介绍了GNN如何应用于科学问题,本节中我们来看看将机器学习应用于这些领域时面临的主要挑战。
将机器学习应用于科学领域主要面临两个基本挑战:
- 标签数据的稀缺性:在科学领域获取标签通常需要昂贵的实验室实验。例如,确定一个分子是否有毒需要进行湿实验室实验,成本高昂。因此,我们无法获得大量的训练数据,导致模型容易在小数据集上过拟合。
- 分布外预测:在科学发现中,我们常常希望预测与训练样本本质上不同的新样本(例如发现新分子)。机器学习模型,尤其是深度学习模型,在这种分布外数据上的推断能力往往不佳。
深度学习模型本身加剧了这些挑战:
- 模型参数众多,需要大量数据训练,在少量标记数据上极易过拟合。
- 深度学习模型的外推能力通常较差,它们可能学习到数据中的虚假相关性而非真正的因果机制。
例如,在一个分类北极熊和棕熊的玩具例子中,如果训练数据里北极熊总在雪地背景中,棕熊总在草地背景中,模型可能学会根据背景而非动物本身进行分类。如果在测试时遇到草地上的北极熊,模型就会预测错误,因为它并未理解任务本质。


解决方案:预训练 💡
上一节我们讨论了科学应用中的挑战,本节中我们来看看一个潜在的解决方案:预训练。
我们的核心目标是:在数据有限的情况下,提升模型的性能,特别是其分布外预测能力。实现这一目标的关键思想是,在模型应用于下游任务之前,先将领域知识注入模型。
预训练是一个非常有效的框架。其步骤是:
- 在一个与下游任务相关、但数据丰富的预训练任务上训练模型。
- 预训练完成后,模型的参数已经蕴含了一定的领域知识。
- 将这些预训练好的参数迁移到我们关心的、数据稀缺的下游任务中。
- 在下游任务上对模型参数进行微调。
预训练在计算机视觉和自然语言处理领域已取得巨大成功,它能显著提高标签利用效率并改善模型泛化能力。因此,预训练有望成为解决科学领域挑战的强大工具。
设计有效的GNN预训练策略 🔬
上一节我们引入了预训练的概念,本节中我们具体探讨如何为图神经网络设计有效的预训练策略。
我们以分子性质预测为例。一个简单的策略是多任务监督预训练:在一个包含大量分子和各种性质标签的化学数据库上,预训练GNN同时预测这些多样的性质,期望模型能捕获化学领域知识,然后迁移到下游任务。
然而,实验发现这种朴素策略效果有限,有时甚至会导致负迁移,即预训练模型的性能比随机初始化的模型还要差。
那么,什么才是有效的预训练策略呢?我们的关键思想是:需要在节点级别和图级别同时对GNN进行预训练,使得模型能在局部和全局层面都捕获图的语义知识。
直觉在于:节点嵌入被聚合以生成图嵌入。如果只在图级别预训练,可能无法保证聚合前的节点嵌入质量;如果只在节点级别预训练,生成的图嵌入可能不佳。两者都需要高质量的表示。
三种自监督预训练方法 🛠️
上一节我们提出了在节点和图级别进行预训练的核心思想,本节中我们来介绍三种实现这一思想的具体自监督预训练方法。

以下是三种无需外部标注的预训练方法:

1. 属性掩码
这是一种节点级别的预训练方法。
- 算法:给定输入图,随机掩码掉一部分节点(或边)的属性(例如在分子图中掩码掉原子的类型)。然后,使用GNN为被掩码的节点生成嵌入,并基于该嵌入预测被掩码属性的原始身份。
- 直觉:通过解决这个“填空”任务,GNN被迫学习关于图中元素及其上下文的领域知识,从而捕获局部语义。
2. 上下文预测
这是一种节点/子图级别的预训练方法。
- 算法:对于图中的每个节点,提取其K跳邻域作为“子图”,并提取该子图的外围部分作为“上下文图”。使用两个独立的GNN分别编码子图和上下文图得到向量表示。训练目标是最大化真实“子图-上下文图”对之间的相似性,同时最小化与随机采样的错误上下文图之间的相似性。
- 直觉:该方法基于自然语言处理中的“分布假说”——出现在相似上下文中的单词具有相似含义。在这里,我们假设被相似上下文包围的子图在语义上也相似,从而学习有意义的节点/子图表示。
3. 图级别多任务预训练
这是一种图级别的预训练方法。
- 算法:直接利用大量可用的图级别标签(如分子的多种性质),以多任务学习的方式预训练GNN进行监督预测。
- 直觉:这是将领域知识注入模型的直接方法,使模型学习与下游任务相关的全局图属性。
整体策略与效果 📈
上一节我们介绍了三种具体的预训练方法,本节中我们来看看如何将它们组合成整体策略并评估其效果。
我们提出的整体预训练策略分为两步:
- 节点级预训练:首先使用自监督方法(如属性掩码、上下文预测)对GNN进行预训练,以获得高质量的节点表示。
- 图级预训练:然后,使用第一步预训练得到的参数作为初始化,在图级别进行(多任务)监督预训练,以获得良好的图表示。
完成这两步预训练后,再将模型参数迁移到下游任务进行微调。
实验表明,这种先节点、后图的两阶段预训练策略非常有效:
- 它成功避免了朴素策略中出现的负迁移现象。
- 在多个下游数据集上,其性能 consistently 优于随机初始化基线以及朴素的图级多任务预训练基线。
一个有趣的发现是,表达能力更强的GNN模型(如能区分不同图结构的模型)从预训练中获益最大。直觉是,这类模型能够从海量预训练数据中捕获更丰富、更本质的领域知识。
总结 🎯
本节课中我们一起学习了图神经网络预训练的相关知识。

我们了解到,GNN在分子性质预测、蛋白质功能预测等科学领域有重要应用,但这些应用面临标签稀缺和分布外预测的挑战。预训练是解决这些挑战的一个有前景的框架。

然而,简单的、仅在图级别进行多任务监督预训练的策略可能效果不佳,甚至导致负迁移。我们提出的有效策略是:对节点嵌入和图嵌入进行分阶段预训练。具体可通过属性掩码、上下文预测等自监督方法实现节点级预训练,再结合图级监督预训练。这种策略能显著提升下游任务性能,并使模型获得更好的泛化能力。


课程 P59:19.2 - 双曲线图嵌入 🌲

在本节课中,我们将要学习双曲线图嵌入。这是一种用于表示具有层次结构或树状结构的图的方法。我们将了解为什么欧几里得空间不适合表示这类图,并探索双曲几何如何提供更自然的嵌入空间。
概述:为什么需要双曲线嵌入?
在上一节课中,我们关注了欧几里得空间中的图表示学习。然而,欧几里得嵌入并不总能捕获复杂的图结构。
例如,考虑一个完整的二叉树结构。第一层有1个节点,第二层有2个节点,第三层有4个节点,节点数量随着树的深度呈指数级增长。这种树状结构很难嵌入到欧几里得空间。在二维平面上,随着深度增加,叶子节点会越来越拥挤,导致嵌入空间无法忠实地表示节点之间的距离。
因此,我们关注具有这种树状结构的图。这类图主要呈树状,但也可以包含少量循环,例如按层次结构组织的知识图谱。我们将看到,双曲几何非常适合嵌入这种结构。
双曲几何简介
双曲几何与欧几里得几何不同,它违反了欧几里得几何的第五公理(平行公设)。在欧几里得几何中,过直线外一点有且仅有一条平行线。而在双曲几何中,过直线外一点有无限多条平行线。
由于这一特性,双曲空间无法在欧几里得空间中自然表示。我们通常使用两种等价的几何模型在欧几里得空间中可视化双曲空间。
庞加莱圆盘模型 🎯
庞加莱圆盘模型将一个开放的单位圆盘(不包括边界)表示为双曲空间。圆盘的半径与 \(\sqrt{K}\) 成正比,其中 \(K\) 是曲率的倒数。
该模型的一个重要性质是:圆盘中的所有三角形在双曲度量下面积相等。这解释了为什么该空间适合嵌入层次结构:中心区域可以容纳较少的节点(如树根),而靠近边缘的区域可以指数级地容纳更多节点(如树叶)。
双曲面模型(洛伦兹模型) 🌐
双曲面模型,也称为洛伦兹模型,将双曲空间表示为双曲面的上半部分。与庞加莱模型相比,它在数值上更稳定,不需要极高的机器精度来表示靠近边缘的点,并且具有更简单的度量公式。
这两个模型是等价的,可以通过一对一的映射进行转换。
任务定义:图表示学习
我们的核心任务与典型的图表示学习相同,主要包括:
- 链接预测:预测图中两个节点之间是否存在边。
- 节点分类:预测图中节点的标签。
例如,在知识图谱嵌入中,高级抽象实体(如“物理”、“生物”)可能嵌入在庞加莱圆盘中心,而具体实体(如“代谢率”)则嵌入在边缘。通过这种嵌入,我们可以执行上述任务。
双曲空间的数学表示
双曲几何在数学上被定义为一个黎曼流形。流形是一个可以在局部用欧几里得空间(切空间)来近似的曲面。双曲空间是一个具有恒定负曲率的黎曼流形,曲率表示为 \(-1/K\)(\(K > 0\))。
以下是几个核心概念:
1. 闵可夫斯基内积
在 \(d\) 维双曲空间的双曲面模型中,我们使用 \(d+1\) 维坐标,并定义闵可夫斯基内积:
2. 双曲距离
基于上述内积,两点 \(\mathbf{x}\) 和 \(\mathbf{y}\) 之间的双曲距离为:
其中 \(\operatorname{arcosh}\) 是反双曲余弦函数。
3. 切空间
在流形上某一点 \(\mathbf{x}\) 的切空间 \(T_{\mathbf{x}}\mathcal{M}^K\),是一个与该点相切的欧几里得空间,是所有满足 \(\langle \mathbf{x}, \mathbf{v} \rangle_{\mathcal{L}} = 0\) 的向量 \(\mathbf{v}\) 的集合。
4. 指数与对数映射
这是在切空间(欧几里得)和流形(双曲)之间转换的关键操作:
- 指数映射 \(\exp_{\mathbf{x}}^K(\cdot)\):将切空间中的点映射到流形上。
- 对数映射 \(\log_{\mathbf{x}}^K(\cdot)\):将流形上的点映射回切空间。
这两个映射是可微的,使我们能够在欧几里得切空间中执行运算(如神经网络操作),然后再映射回双曲空间。
双曲线图神经网络 (Hyperbolic GNN) 🧠
将深度学习与双曲空间结合的主要挑战在于:标准神经网络操作是为欧几里得空间设计的。在双曲空间中,我们需要定义特殊的操作。


一个典型的GNN层包含消息计算、聚合和更新三个步骤。在双曲GNN中,这些步骤需要适配双曲几何。
上一节我们介绍了双曲空间的基本数学工具,本节中我们来看看如何构建双曲GNN。其高层思想如下图所示:在每一层,我们将节点嵌入从一个双曲空间(具有曲率 \(K^{l-1}\))转换到另一个双曲空间(具有曲率 \(K^l\))。

1. 消息计算
由于双曲空间中没有直接定义神经网络操作,我们利用指数映射和对数映射。首先,使用对数映射将双曲空间中的点映射到原点的切空间(这是一个欧几里得空间)。然后,在切空间中执行标准的线性变换(如乘以权重矩阵和加偏置)。最后,通过指数映射将结果映射回双曲空间。这种组合操作被称为“莫比乌斯”运算。
2. 聚合
聚合操作(如注意力聚合)也遵循类似模式。我们将邻居节点的消息映射到中心节点的切空间中进行加权求和,然后再映射回双曲空间。这里需要一个称为“平行移动”的操作,以确保向量在双曲空间中正确移动。
3. 更新
更新函数同样在切空间中应用非线性激活函数,然后通过指数映射映射到具有新曲率 \(K^l\) 的双曲空间中。
所有这些操作都是可微的,因此可以使用PyTorch等框架进行自动微分和训练。此外,每一层的曲率 \(K\) 也可以作为参数进行学习,以在模型性能和数值稳定性之间取得平衡。
效果与总结
使用双曲GNN嵌入树状结构时,几何结构保持得更好。与欧几里得嵌入相比,双曲嵌入能够将根节点和叶子节点清晰地分离到不同的层次中。
我们还发现,双曲GNN的性能与图的“树状”程度密切相关。对于一个称为“双曲性”的度量 \(\delta\),\(\delta\) 越低表示图越像树。实验表明,双曲GNN在 \(\delta\) 较低(即图更接近树状结构)的数据集上表现尤为出色。
本节课中我们一起学习了:
- 双曲几何基础:了解了庞加莱圆盘和双曲面两种模型,以及它们适合表示层次化结构的原因。
- 核心数学概念:包括黎曼流形、负曲率、闵可夫斯基内积、双曲距离以及关键的指数映射和对数映射。
- 双曲图神经网络:掌握了如何利用指数/对数映射在双曲空间的切空间中执行消息传递、聚合和更新操作,从而构建可训练的GNN模型。
- 应用与优势:认识到双曲嵌入特别适用于树状或层次化明显的图结构,并能通过学习曲率参数来优化模型。


通过本课程,你应该对如何利用双曲空间的独特几何性质来增强图表示学习有了基本的理解。

课程 P6:2.3 - 基于图的传统特征方法 📊

在本节课中,我们将学习如何为整个图结构设计特征,以便进行图级别的预测。我们将重点介绍图核方法,这是一种通过衡量图之间相似性来进行预测的传统机器学习技术。

概述
之前我们讨论了节点级别和边级别的特征。现在,我们将视角提升到图级别,目标是设计能够表征整个图结构的特征。例如,一个图可能由两个松散连接的部分组成,每个部分内部连接紧密,但两部分之间仅有一条边连接。问题在于,如何创建一个特征描述符来刻画这种整体结构。
我们将使用核方法来解决这个问题。核方法在传统机器学习中广泛应用于图级预测,其核心思想是设计一个核函数来衡量两个图之间的相似性,而不是直接设计特征向量。
什么是图核?🤔
图核 ( K(G, G') ) 是一个函数,它接收两个图 ( G ) 和 ( G' ) 作为输入,并返回一个实数值,用于衡量这两个图之间的相似性。
- 核矩阵:一个矩阵,其中每个元素 ( K_{ij} ) 衡量了数据集中第 ( i ) 个图与第 (j) 个图之间的相似性。一个有效的核矩阵必须是对称且半正定的。
- 特征表示:核函数的一个重要特性是,存在一个特征映射 ( \phi(\cdot) ),使得两个图之间的核值等于它们特征向量的点积:
[
K(G, G') = \phi(G)^T \phi(G')
]
这个特征映射 ( \phi ) 甚至不需要显式地计算出来,只要能计算出核值即可。
一旦定义了核函数,就可以将其与支持向量机等核机器学习模型结合,进行图级别的预测。
在本节中,我们将讨论两种重要的图核:图元核和Weisfeiler-Lehman核。文献中还存在其他图核(如随机游走核、最短路径核等),它们在图级任务中通常能提供有竞争力的性能,但本课程不做深入讨论。
核方法的关键思想 🎯
图核背后的关键思想,是将图 ( G ) 的特征向量 ( \phi(G) ) 视为一种 “词袋” 表示。
- 文本的词袋模型:在文本处理中,我们可以将一个文档表示为一个词袋向量。向量中的每个位置对应一个特定的单词,其值是该单词在文档中出现的频率。
- 图的词袋模型:我们可以将这一思想扩展到图上。但如果我们简单地将节点视为“单词”,那么两个结构不同但节点数相同的图会得到相同的特征向量,这显然缺乏区分度。
因此,我们需要为图寻找更有表现力的“单词”。一个简单的改进是使用节点度作为“单词”。这样,图的特征向量就变成了图中不同度数的节点数量的计数。这种方法可以区分更多不同结构的图。
图元核和Weisfeiler-Lehman核都采用了图级别的“词袋”思想,但它们使用的“单词”比节点度更为复杂。
图元核 🧩
图元核的目标是将一个图表示为图中出现的不同子图结构(即“图元”)的计数。
这里需要明确一个重要区别:在图元核的语境中,“图元”的定义与节点级特征中的“图元”略有不同。在图元核中,图元:
- 不一定需要连通。
- 不是有根的。
例如,对于大小为 ( k=3 ) 的图元,在三个无向节点上存在四种不同的图:
- 全连接图(三角形)
- 有两条边的图(长度为2的路径)
- 有一条边的图
- 无边图(三个孤立节点)
对于 ( k=4 ),则有十一种不同的图元。
给定一个图 ( G ) 和一个预定义的图元列表 ( (G_1, G_2, ..., G_{n_k}) ),我们可以定义图的图元计数向量 ( f_G ):
[
(f_G)_i = \text{图元 } G_i \text{ 在图 } G \text{ 中出现的次数}
]
例如,对于一个包含一个三角形、三个长度为2的路径和六条边的图,其图元计数向量可能是 ( (1, 3, 6, 0) )。
有了特征向量,两个图 ( G ) 和 ( G' ) 之间的图元核就可以简单地定义为它们计数向量的点积:
[
K(G, G') = f_G^T f_{G'}
]
然而,这里存在一个问题:图 ( G ) 和 ( G' ) 的大小可能不同,导致计数向量的尺度差异很大。常见的解决方案是对特征向量进行归一化,即用每个图元的计数除以图中图元的总数,从而得到一个与图大小和密度无关的比例向量 ( h_G )。归一化后的图元核定义为:
[
K(G, G') = h_G^T h_{G'}
]
图元核的局限性
图元核有一个重要的局限性:计算图元的计数非常昂贵。在一个有 ( n ) 个节点的图中,通过枚举计算大小为 ( k ) 的图元,时间复杂度是 ( O(n^k) )。这意味着计算复杂度在节点数上是多项式级,但在图元大小 ( k ) 上是指数级。
在最坏情况下,这是不可避免的,因为子图同构判定问题是NP难的。虽然对于节点度有界的图存在更快的算法,但计算这些离散结构总体上仍然非常耗时。因此,我们通常只能计算包含少量节点(例如3、4、5个)的图元。
Weisfeiler-Lehman 图核 🎨
为了解决图元核的计算效率问题,Weisfeiler-Lehman图核应运而生。它的目标是设计一个高效的特征描述符 ( \phi(G) ),其核心思想是:通过迭代地聚合邻居信息来丰富节点的“颜色”标签。这可以看作是节点度(一跳邻域信息)向多跳邻域信息的推广。
实现这一思想的算法称为 Weisfeiler-Lehman(WL)图同构测试,或颜色细化算法。
算法步骤
- 初始化:给定图 ( G ),为每个节点 ( v ) 分配一个初始颜色 ( c^{(0)}(v) )。通常所有节点初始颜色相同。
- 迭代聚合:对于第 ( k ) 次迭代,每个节点 ( v ) 的新颜色 ( c^{(k)}(v) ) 由其自身上一轮的颜色 ( c^{(k-1)}(v) ) 与其所有邻居 ( u \in N(v) ) 的颜色拼接后,经过一个哈希函数 ( H ) 映射得到:
[
c^{(k)}(v) = H\left( c^{(k-1)}(v), { c^{(k-1)}(u) | u \in N(v) } \right)
]
哈希函数 ( H ) 将不同的输入组合映射为不同的新颜色。 - 特征构建:在运行 ( K ) 次迭代后,节点颜色 ( c^{(K)}(v) ) 总结了该节点 ( K ) 跳邻域内的结构信息。此时,整个图的特征描述符 ( \phi(G) ) 就是所有迭代中出现的所有不同颜色的计数向量。
算法示例
假设有两个结构相似但略有不同的图(区别在于一条对角边)。WL算法运行过程如下:
- 迭代0:所有节点被赋予相同的初始颜色(例如,灰色)。
- 迭代1:每个节点聚合自身和邻居的颜色(例如,“灰色+{灰色,灰色}”),经过哈希后得到新颜色(例如,红、蓝、绿等)。此时,两个图的着色已显示出差异。
- 迭代2:基于上一轮的颜色,再次进行聚合和哈希,得到更精细的颜色划分。
- 构建特征:假设运行了2轮,我们统计在整个过程中(第0、1、2轮)所有出现的颜色在图中的出现次数,形成一个计数向量。
WL核的计算与优势
两个图 ( G ) 和 ( G' ) 之间的WL核,就是它们各自特征描述符 ( \phi(G) ) 和 ( \phi(G') ) 的点积:
[
K_{WL}(G, G') = \phi(G)^T \phi(G')
]
WL核的优势在于其极高的计算效率。颜色细化每一步的时间复杂度与图的边数成线性关系 ( O(|E|) ),因为每个节点只需要收集邻居颜色并应用一次哈希。颜色的总数最多与节点数成正比。因此,计算一对图之间的WL核的总体复杂度是线性的,这使得它非常快速且实用,性能通常难以被超越。
总结
在本节课中,我们一起学习了用于图级别预测的传统特征方法——图核。
- 图核概念:图核通过衡量图之间的相似性进行预测,其基础是将图表示为某种“词袋”。
- 图元核:将图表示为不同子图结构(图元) 的计数袋。这种方法表达能力强,但计算图元计数非常昂贵,时间复杂度在图元大小上是指数级的。
- Weisfeiler-Lehman核:将图表示为迭代生成的节点颜色的计数袋。它通过高效的颜色细化算法,从邻居聚合信息,为节点分配颜色。WL核计算效率极高(线性时间复杂度),性能强大,并且与我们后续将要学习的图神经网络密切相关。


至此,我们完成了对图机器学习中传统特征方法的讨论,涵盖了节点级别、边级别和图级别的特征工程方法。

课程 P60:19.3 - 图神经网络的设计空间 🧠

在本节课中,我们将系统性地探讨图神经网络的设计空间。我们将学习如何为特定任务选择合适的GNN架构,并理解不同任务之间的相似性,从而能够将优秀的设计迁移到新任务上。

1. 核心概念与术语 📖
在深入设计空间之前,我们首先需要明确几个核心术语。
- 设计:指一个具体的模型实例。例如,一个四层的GraphSAGE就是一个特定的设计。
- 设计维度:用于描述设计的特征。例如,层数
L是一个设计维度,其取值可以是{2, 4, 6, 8}。 - 设计选择:设计维度中的具体取值。例如,层数
L=4就是一个设计选择。 - 设计空间:由所有设计维度的笛卡尔积构成,它枚举了所有可能的设计组合。
- 任务:我们感兴趣的特定问题。例如,在Quora数据集上进行节点分类。
- 任务空间:由我们关心的所有任务构成。
2. GNN 设计空间 🏗️
上一节我们定义了基本术语,本节中我们来看看GNN设计空间的具体构成。一个完整的GNN设计空间主要包含三个部分:层内设计、层间设计和学习配置。
层内设计
GNN层可以理解为两个部分:转换函数和聚合函数。从这个视角出发,我们定义了四个关键的设计维度:
- 是否添加批归一化:
batch_norm = {True, False} - 是否添加Dropout:
dropout = {0.0, 0.5}(0.0表示不使用) - 激活函数的选择:
activation = {ReLU, PReLU, ...} - 聚合函数的选择:
aggregator = {mean, max, sum, ...}
层间设计
除了核心的GNN层,我们还需要考虑如何组织这些层,以及是否添加额外的处理层。
- 预处理层:在输入图数据进入GNN层之前,可能需要对节点特征进行编码。例如,当节点特征来自图像或文本时,可以使用CNN或Transformer进行编码。
- 后处理层:在GNN层计算得到节点/图嵌入之后,可能需要进行进一步转换。例如,在图分类任务中,需要一个读出函数来生成图级表示。
- 跳跃连接:在GNN层之间添加跳跃连接,这已被证明能有效提升深层GNN的性能。
学习配置
学习配置在实践中对模型性能影响巨大,但常被文献忽视。我们主要考虑以下维度:
- 批量大小:
batch_size - 学习率:
learning_rate - 优化器:
optimizer = {Adam, SGD, ...} - 训练轮数:
num_epochs
综合以上所有设计维度,我们构建了一个包含超过 31.5万种 可能设计的巨大空间。我们的目标不是穷举所有设计,而是倡导一种思维转变:研究设计空间比研究单个GNN设计更有效。
3. GNN 任务空间 🎯
定义了设计空间后,我们来看看任务空间。传统上,任务被粗略分为节点级、边级和图级预测。但这种分类不够精确。我们的创新在于提出一种定量的任务相似性度量方法。
如何度量任务相似性?
我们的核心思想是:在相同一组“锚模型”上表现排名相似的任务,其本质也相似。
具体步骤如下:
- 选择锚模型:从一个易于处理的小数据集中,从设计空间中随机采样N个模型,根据其性能排序,然后均匀地选择K个模型作为锚模型(覆盖从最差到最好的性能范围)。
- 描述任务:在一个新任务上运行所有K个锚模型,根据它们的性能进行排名。
- 计算相似性:比较两个任务在锚模型上的排名顺序相似度(例如,使用斯皮尔曼等级相关系数)。排名越相似,任务越相似。
这种方法使我们能够超越主观分类,定量地理解不同GNN任务之间的关系,从而为模型迁移奠定基础。
4. 如何评估设计选择?📊
现在,我们有了设计空间和任务空间,如何科学地评估一个具体的设计选择(例如“批归一化是否有用”)呢?
传统做法是固定一个模型(如5层GCN),比较有/无批归一化的版本。我们的方法更严格、更系统,称为 “受控随机搜索”。

以下是评估一个设计维度(如 batch_norm)的步骤:
- 随机采样:从整个设计空间和任务空间中,随机采样大量(模型,任务)组合。
- 控制变量:对于每个采样的组合,固定其他所有设计维度,只将待评估的维度(
batch_norm)分别设置为True和False,得到两个对比模型。 - 性能排名:在相同任务和训练预算下运行这两个模型。根据验证性能对
batch_norm=True和batch_norm=False进行排名(排名越低越好)。 - 统计分析:收集所有采样组合下的排名,绘制
batch_norm=True和batch_norm=False的平均排名分布。如果一方的平均排名显著更低,则说明该选择普遍更优。
这种方法可以令人信服地评估任何新的设计维度或新的GNN层。
5. 关键研究发现 🔑
基于上述框架,我们得到了以下重要发现:
通用设计指南
某些设计选择显示出明显优势:
- 层内设计:
batch_norm=True通常更好,有助于GNN的优化。dropout=0.0(不使用)通常更好,因为GNN更多面临欠拟合而非过拟合。PReLU激活函数显著优于常用的ReLU。sum聚合器通常表现最佳,因为其表达能力最强。
- 层间设计:
- 最优层数高度依赖于任务,难以预先决定。
- 跳跃连接能显著提升性能。
- 学习配置:
- 最优批量大小和学习率也高度依赖任务。
- 使用优化器(如Adam)和训练更多轮次通常更好。
任务空间的理解
- GNN的最佳设计在不同任务间差异显著,证明了研究任务空间的必要性。
- 我们提出的任务相似性度量方法计算成本低(仅需约12个锚模型),且能提供丰富信息。
- 通过分析,我们将任务大致分为两类:
- A组:依赖特征信息的任务(如节点/图分类,输入特征维度高)。
- B组:依赖结构信息的任务(节点特征少,预测高度依赖图结构)。
- 相似的任务确实具有相似的最佳模型设计。
迁移到新任务:案例研究
我们将方法应用于一个全新的、具有挑战性的OGB分子属性预测任务:
- 在新任务上运行12个锚模型。
- 计算新任务与任务空间中现有任务的相似性。
- 从最相似的现有任务中,推荐其最佳模型设计。
- 结果:从相似任务迁移来的模型,在新任务上取得了接近最优的性能;而从非相似任务迁移的模型则表现不佳。这证明了我们任务相似性度量的有效性。
总结 📝


本节课我们一起学习了图神经网络设计空间的系统性研究方法。我们提出了一个包含层内、层间设计和学习配置的GNN设计空间,以及一个基于锚模型排名的定量任务相似性度量方法。通过“受控随机搜索”,我们可以科学评估设计选择。研究发现,存在一些通用设计准则,但最佳设计高度依赖于任务性质。最后,我们展示了如何利用任务相似性,将优秀模型设计迁移到新的、未见过的任务上,并发布了易于使用的平台 GraphGym 以供实践探索。这项研究标志着从研究单个GNN模型到研究整个GNN生态系统的思维转变。


课程P7:3.1 - 节点嵌入 🧩

在本节课中,我们将学习节点嵌入的核心概念。这是一种将图中的节点表示为低维向量的技术,旨在自动捕捉网络的结构信息,从而服务于下游的预测任务,如节点分类、链接预测和图分类。
核心思想与目标 🎯
上一节我们介绍了图分析的基本背景,本节中我们来看看节点嵌入的具体目标。
给定一个输入图,我们的目标是提取能够描述其拓扑结构(如节点间的连接或图级别的特征)的信息。传统方法依赖于人工特征工程,但节点嵌入旨在自动化这一过程。
具体做法是,为图中的每个节点生成一个D维向量,称为该节点的特征表示或嵌入。这个向量应能自动捕捉节点在网络中的结构信息。
将节点映射到嵌入空间后,嵌入之间的相似性应能反映节点在网络中的相似性。例如,网络中彼此靠近的节点,其嵌入在嵌入空间中也应彼此接近。这种编码后的结构信息可用于多种下游任务。
下图展示了一个小型网络的节点嵌入在二维空间中的可视化结果,不同颜色的节点被映射到了嵌入空间的不同区域,直观地展示了网络结构与嵌入空间的对应关系。



编码器-解码器框架 🔄
上一节我们了解了节点嵌入的目标,本节中我们将通过一个编码器-解码器框架来形式化这一过程。
我们将一个图表示为其邻接矩阵A,并假设节点没有额外的属性特征。目标是学习节点的嵌入,使得嵌入空间中的相似性(如点积)能够近似原始网络中的相似性。
以下是该框架的核心组件:
-
编码器 (Encoder): 将节点映射为低维嵌入向量。我们使用一个简单的“浅层”编码器,即一个嵌入查找矩阵。
- 公式:
ENC(v) = z_v - 其中,
z_v是节点v的嵌入向量,存储在一个维度为|V| × d的矩阵Z中(|V|是节点数,d是嵌入维度)。这相当于为每个节点学习一个唯一的向量。
- 公式:
-
相似度函数 (Similarity Function): 定义原始网络中两个节点的相似性。这是不同嵌入方法的核心区别所在。
-
解码器 (Decoder): 从嵌入向量映射回相似性分数。我们使用简单的点积作为解码器。
- 公式:
DEC(z_u, z_v) = z_u · z_v = z_u^T z_v - 点积值高表示嵌入相似度高(向量方向接近)。
- 公式:
-
优化目标: 调整编码器的参数(即嵌入矩阵
Z),使得解码出的相似性DEC(ENC(u), ENC(v))尽可能接近由相似度函数定义的原始网络相似性similarity(u, v)。
这种方法的参数数量与节点数成正比(|V| × d),对于超大规模图可能面临可扩展性挑战。后续课程将介绍如图神经网络等“深度”编码器来解决此问题。
定义节点相似性:随机游走 🚶♂️
上一节我们建立了编码器-解码器框架,本节中我们来看看如何具体定义节点相似性。这是节点嵌入方法的关键。
我们这里不使用任何节点标签或属性信息,仅基于网络拓扑结构来定义相似性。我们将根据随机游走来定义节点的相似性。
随机游走相似性的核心思想是:如果从节点 u 开始的随机游走序列经常访问到节点 v,那么节点 u 和 v 是相似的。
以下是基于随机游走定义相似性的步骤:
- 从图中的一个节点开始,随机选择一条边移动到邻居节点,重复此过程,生成一个节点序列。
- 定义
N_R(u)为从节点u开始进行固定长度随机游走所访问到的节点集合(称为上下文节点)。 - 优化节点嵌入,使得一个节点与其随机游走上下文节点在嵌入空间中是相似的。也就是说,对于每个节点
u,我们希望其嵌入z_u与N_R(u)中所有节点v的嵌入z_v的点积尽可能大。
通过优化这个目标,节点的嵌入将能捕捉到其局部网络邻域的结构信息。我们将学习两种基于此思想的具体方法:DeepWalk 和 node2vec。

总结 📝
本节课中我们一起学习了节点嵌入的基本概念。
- 我们首先了解了节点嵌入的目标:自动学习节点的低维向量表示,以捕捉网络结构,替代手工特征工程。
- 接着,我们通过编码器-解码器框架形式化了这个问题。编码器(如嵌入查找)将节点映射为向量,解码器(如点积)计算嵌入相似性,并通过优化使嵌入相似性逼近网络定义的节点相似性。
- 最后,我们介绍了基于随机游走来定义节点相似性的思想,这是 DeepWalk 和 node2vec 等流行方法的基础。

通过本课的学习,你应该对节点嵌入为何有用、其基本框架如何工作,以及如何利用随机游走定义相似性有了清晰的认识。

课程P8:3.2 - 随机游走节点嵌入方法 🚶♂️➡️🧩


在本节课中,我们将学习如何利用随机游走的方法为图中的节点生成嵌入。我们将从核心概念出发,逐步讲解如何定义节点相似性、构建优化目标,并最终通过高效的算法学习到节点的向量表示。
概述
节点嵌入的目标是为图中的每个节点学习一个低维向量表示。本节课的核心思想是:如果两个节点在随机游走中经常共同出现,那么它们在嵌入空间中也应该彼此接近。我们将通过定义基于随机游走的节点相似性,并构建一个最大似然优化问题来学习这些嵌入。
核心概念与函数
在深入方法之前,我们需要理解两个关键的数学函数。
Softmax函数
Softmax函数将一组实数转换成一个概率分布。给定一个向量,Softmax会放大其中的最大值,使其获得更高的概率。
公式:
对于一个包含 k 个实数的向量 z,其第 i 个元素的Softmax值为:
softmax(z_i) = exp(z_i) / Σ_{j=1}^{k} exp(z_j)
Sigmoid函数
Sigmoid函数是一个S形函数,它将任意实数映射到(0, 1)区间内。
公式:
sigmoid(x) = 1 / (1 + exp(-x))
什么是随机游走?🔄
上一节我们介绍了用于概率转换的核心函数,本节中我们来看看定义节点相似性的基础——随机游走。
随机游走是图上一个简单的探索过程:
- 从某个起始节点开始。
- 随机选择当前节点的一个邻居。
- 移动到该邻居节点。
- 重复步骤2和3,进行固定步数。
这个过程中访问的节点序列,就构成了一次随机游走。随机游走可以重复访问节点和边。
基于随机游走的节点相似性
我们如何利用随机游走定义节点相似性呢?思路是:从节点 u 开始的随机游走访问到节点 v 的概率,反映了 u 和 v 的相似度。
我们希望学习到的节点嵌入 z_u 和 z_v,使得它们的点积 z_u · z_v 近似于这个共现概率。点积越大,表示两个向量在嵌入空间中越接近,对应节点也越相似。
使用随机游走定义相似性的好处包括:
- 表达性强且灵活:可以捕捉局部和高阶的邻域信息。
- 高效:训练时只需考虑在随机游走中共同出现的节点对,而非所有节点对。
优化目标:最大似然估计
我们的目标是学习一个映射函数 f: u -> z_u,将每个节点映射到其嵌入向量。
以下是构建优化问题的步骤:
- 对图中每个节点
u,运行固定长度的随机游走。 - 将这次游走访问的节点集合(允许重复)定义为节点
u的邻域N_R(u)。 - 我们希望嵌入能够预测这些邻域节点。
因此,优化目标是最大化所有节点预测其随机游走邻域节点的对数似然。
目标函数公式:
max Σ_{u ∈ V} Σ_{v ∈ N_R(u)} log P(v | z_u)
其中,条件概率 P(v | z_u) 使用Softmax定义:
P(v | z_u) = exp(z_u · z_v) / Σ_{n ∈ V} exp(z_u · z_n)
这个公式的直觉是:我们想让起始节点 u 与其邻域节点 v 的点积尽可能大,同时让 u 与图中所有其他节点 n 的点积尽可能小。
计算挑战与负采样
直接优化上述目标函数计算量巨大,因为Softmax分母需要对图中所有节点求和,复杂度是 O(|V|^2)。
为了解决这个问题,我们采用负采样技术进行近似。
负采样的核心思想是:不再用所有节点做归一化,而是只使用一小部分“负样本”节点。我们采样 k 个负样本节点,这些节点通常不是 u 的邻居,并且采样概率与其节点度数成正比(度数高的节点更常被选为负样本)。
近似优化目标公式:
log σ(z_u · z_v) - Σ_{i=1}^{k} log σ(z_u · z_{n_i})
其中,σ 是Sigmoid函数,n_i 是第 i 个负样本。
实践中,k 值通常取5到20之间,在估计的稳健性和计算效率之间取得平衡。
优化算法:随机梯度下降
我们使用随机梯度下降来求解这个优化问题。其基本思想是:
- 随机初始化所有节点的嵌入向量。
- 重复以下步骤直到收敛:
- 随机选取一个节点
u及其邻域中的一个节点v。 - 采样
k个负样本节点。 - 计算当前参数下目标函数关于这些节点嵌入的梯度。
- 沿梯度相反方向,以一个小步长(学习率)更新嵌入向量。
- 随机选取一个节点
更新公式(概念性):
z := z - η * ∇L
其中 η 是学习率,∇L 是损失函数 L 的梯度。
随机梯度下降的优势在于,它每次只基于一个或一小批样本更新参数,速度远快于计算全部数据梯度的传统梯度下降法。
更丰富的游走策略:Node2Vec 🧭
上一节我们介绍了基础的随机游走和优化方法,本节中我们来看看如何通过改进游走策略来获得更具表达力的嵌入。
基础的均匀随机游走可能限制了对网络结构的捕捉。Node2Vec方法提出了一种有偏的二阶随机游走策略,它通过两个参数在“广度优先”和“深度优先”探索之间进行权衡。
游走参数
- 返回参数
p:控制游走返回上一节点的概率。p值小,则更容易返回,游走更倾向于在局部徘徊(类似BFS)。
- 进出参数
q:控制游走向更远节点探索的概率。q值小,则更容易走向远方,游走更倾向于深度探索(类似DFS)。q值大,则更倾向于停留在起始节点附近。
游走过程
假设游走刚从节点 t 走到节点 v,现在需要决定下一个节点 x。x 与前一节点 t 的距离关系分为三种:
- 返回:
x = t(距离0)。 - 保持相同距离:
x是v的邻居,且与t距离为1。 - 走向更远:
x是v的邻居,且与t距离为2。
Node2Vec为非归一化的转移概率设定权重:
- 返回
t的权重为1/p - 保持距离的权重为
1 - 走向更远的权重为
1/q
通过调整 p 和 q,我们可以让游走策略适应不同的任务需求。
方法总结与比较
本节课中我们一起学习了基于随机游走的节点嵌入方法。让我们总结一下关键点:
核心流程:
- 为图中每个节点生成随机游走序列(可使用Node2Vec等有偏策略)。
- 将游走序列中共同出现的节点对视为正样本。
- 通过负采样构造负样本。
- 使用随机梯度下降优化目标函数,学习节点嵌入。
方法特点:
- 优点:表达力强,能捕捉网络局部和全局结构;通过随机游走和负采样,算法效率较高,可并行化。
- 缺点:需要为每个节点学习独立的嵌入,对于超大图存储开销大;且无法直接泛化到训练时未见过的新节点。
方法选择:
没有一种方法在所有任务上都是最优的。例如,Node2Vec在节点分类任务上表现突出,而其他方法可能在链接预测上更优。选择时应考虑任务特性,并匹配最合适的节点相似性定义。

延伸阅读

如果你想深入了解,可以查阅以下论文:
- DeepWalk:首次将随机游走与语言模型技术应用于网络嵌入。
- Node2Vec:提出了有偏随机游走,在探索网络时灵活性更高。
- LINE:定义了明确的一阶与二阶相似性目标。
- Goyal & Ferrara的综述:系统比较了多种网络嵌入方法在不同任务上的性能。


图机器学习课程 P9:3.3 - 嵌入整个图 🧩
在本节课中,我们将学习如何将整个图或子图嵌入到低维向量空间中。这与之前嵌入单个节点的方法不同,其目标是为整个图结构生成一个统一的表示。我们将重点介绍一种基于匿名随机游走的方法。

概述
之前我们学习了如何为图中的单个节点生成嵌入。本节我们将探讨三种为整个图生成嵌入的思路:简单聚合节点嵌入、引入虚拟节点,以及基于匿名随机游走的方法。我们将详细讲解第三种方法,并了解如何将其应用于图分类等下游任务。
方法一:聚合节点嵌入
第一个思路非常简单直接。我们可以先运行标准的节点嵌入技术(如DeepWalk或Node2Vec),然后对图中所有节点的嵌入进行求和或平均,以此作为整个图的嵌入。
公式表示如下:
Z_G = (1/|V|) * Σ_{v∈V} z_v
其中 Z_G 是图的嵌入,V 是图中所有节点的集合,z_v 是节点 v 的嵌入。
这种方法虽然简单,但在实践中(例如在2016年的分子分类任务中)被证明非常有效。
方法二:引入虚拟节点
对平均节点嵌入思路的一个改进是引入一个虚拟节点来代表整个图或子图。
具体操作如下:
- 创建一个虚拟节点,并将其连接到我们想要嵌入的那组节点(若要嵌入整个图,则连接到所有节点)。
- 在这个扩展后的新图上运行标准的节点嵌入算法(如DeepWalk或Node2Vec)。
- 将学习到的虚拟节点的嵌入
z_virtual作为整个图G的嵌入Z_G。

这种方法通过图结构本身的学习过程来生成图级表示,比简单的平均更为巧妙。
方法三:匿名随机游走
上一节我们介绍了通过虚拟节点获取图嵌入的方法。本节中,我们来看看一种更抽象、基于匿名随机游走的图嵌入方法。
什么是匿名随机游走?
匿名随机游走的核心思想是:在记录游走路径时,我们不记录节点的真实身份(如A、B、C),而是记录节点是第几个被首次访问的。
举个例子:
假设我们有一个图,从节点A出发的一条随机游走路径为:A -> B -> C -> B -> C。
- 第一步访问A,它是第一个被访问的节点,记为
1。 - 第二步访问B,它是第二个被访问的新节点,记为
2。 - 第三步访问C,它是第三个被访问的新节点,记为
3。 - 第四步再次访问B,B已被访问过,因此仍记为
2。 - 第五步再次访问C,C已被访问过,因此仍记为
3。
因此,这条游走的匿名表示为序列:[1, 2, 3, 2, 3]。
关键点在于,两条访问了不同节点但访问顺序相同的游走,会得到相同的匿名表示。这使得嵌入能够捕捉图的结构模式,而非具体的节点标签。
如何用匿名游走表示图?
一个直观的想法是:在图上进行大量长度为 L 的匿名随机游走采样,并统计每种匿名游走序列出现的频率。
具体步骤如下:
- 选择匿名游走的长度
L(例如L=3)。 - 在图上进行大量随机游走采样。
- 将每条游走转换为匿名表示(如
[1,2,1])。 - 统计所有可能的匿名序列出现的概率,形成一个概率分布向量。
这个向量就可以作为图的嵌入。L 越大,可能的匿名序列越多,嵌入的维度就越高,能捕捉更复杂的结构信息。
需要采样多少次?
为了保证估计出的匿名游走概率分布足够准确,我们需要采样足够多的随机游走。所需的采样次数 N 可以通过以下公式估算:
N = (2 / ε²) * (log(2^L - 2) - log(δ))
其中:
ε是容忍的误差。δ是允许的失败概率。L是匿名游走长度。2^L - 2近似为长度为L的可能匿名游走数量。
例如,当 L=7, ε=0.1, δ=0.1 时,大约需要采样12万次随机游走。
学习匿名游走的嵌入
我们还可以更进一步,不直接使用计数,而是像Word2Vec学习词向量一样,为每一种匿名游走序列也学习一个嵌入 z_wi。
目标函数是:给定一个图 G 的嵌入 z_G 和从某个节点 u 开始的匿名游走序列,我们希望最大化在同一个上下文窗口内共同出现的匿名游走序列的概率。
这类似于DeepWalk,但邻域 N_R(u) 的定义从“共现的节点”变成了“从节点 u 开始采样时共同出现的匿名游走序列”。
优化目标公式如下:
maximize Σ_{u∈V} Σ_{t∈[T-Δ, T+Δ]} log P(w_t | z_G, z_{w_{t±Δ}})
通过这种联合优化,我们可以同时学到图的嵌入 z_G 和每种匿名游走的嵌入 z_wi。
图嵌入的应用
学习到图的嵌入 Z_G 后,我们可以将其用于各种下游预测任务,例如:
以下是图嵌入的几个主要应用场景:
- 图分类:将
Z_G输入一个分类器(如神经网络),预测图的标签(例如,分子是否有毒)。 - 社区检测/节点聚类:对节点的嵌入
z_i运行聚类算法(如K-Means),以发现图中的社区结构。 - 节点分类:直接使用节点的嵌入
z_i来预测该节点的标签。 - 链路预测:预测两个节点之间是否存在边。可以通过组合两个节点的嵌入来实现:
- 连接(Concatenate):
[z_i, z_j],适用于有向图。 - 哈达玛积(Hadamard Product):
z_i ⊙ z_j,适用于无向图(具有交换性)。 - 求和/平均:
z_i + z_j或(z_i + z_j)/2,同样适用于无向图。 - L2距离:
||z_i - z_j||₂。
- 连接(Concatenate):
总结
本节课中我们一起学习了如何为整个图生成嵌入表示。我们探讨了三种方法:
- 聚合节点嵌入:对图中所有节点的嵌入进行平均或求和。
- 虚拟节点法:引入代表全图的虚拟节点,并通过标准节点嵌入技术学习其嵌入。
- 匿名随机游走:通过采样并统计匿名化的游走序列来表征图结构,并可进一步学习游走序列和图的联合嵌入。

这些方法使我们能够将复杂的图结构转换为固定长度的低维向量,从而方便地应用于图分类、社区发现等多种机器学习任务。在后续课程中,我们还将看到使用图神经网络进行层次化图嵌入等更高级的方法。


浙公网安备 33010602011771号