应用图深度学*-全-
应用图深度学*(全)
原文:
annas-archive.org/md5/4b63ded9bc6bc6b825e7f847af7d9da1译者:飞龙
序言
*年来,社交网络、分子结构、推荐系统和计算机视觉等领域网络化数据的快速增长,凸显了更好地处理图结构数据方法的需求。传统的深度学*模型在处理网格状数据(如图像)和序列数据(如文本)时表现良好,但这些模型在处理不规则结构(如图)时却力不从心。
欢迎来到图谱深度学*应用,本书通过探讨图论和深度学*交叉领域的前沿技术,解决了这一挑战,提供了来自领先公司实际应用的策略和见解。
本书的作者凭借在 Adobe、沃尔玛和 Meesho 等公司实施基于图的解决方案的经验,亲眼见证了这些技术如何转变业务应用。本书提供了理解和应用图深度学*的清晰、全面的指南,将理论基础与来自大规模行业实施的实践见解相结合。
本书适合的读者
本书面向多种技术受众。数据科学家、机器学*从业者以及希望将自己的专业知识扩展到图形数据分析的研究人员,将找到有实践指导的真实世界例子。此外,参与图相关应用的软件工程师,也能从这里提供的动手操作方法和实现细节中获益。
本书同样对技术领导者和企业家有着同样的价值,他们需要理解图深度学*的战略意义。我们提供了图方法如何应用于各个领域的全面概述,帮助决策者识别机会并构建适合特定业务需求的解决方案。本书弥合了理论概念和实际应用之间的差距,成为技术执行和战略规划的多功能参考书。
本书内容
第一章,图谱学*简介,介绍了图谱学*,解释了图谱如何比传统的表格数据结构更有效地表示复杂关系,并通过多种类型的图、它们的属性和计算表示来加以说明。
第二章,图谱学*在实际应用中的探索,全面探讨了图谱学*的三个基本层次:节点层(预测单个节点的属性)、边缘层(分析节点之间的关系)和图层(研究整个图结构),并结合在推荐系统、知识图谱、网络安全和自然语言 处理(NLP)等方面的实际应用。
第三章,图表示学*,解释了图表示学*技术,重点介绍了浅层编码方法,如 DeepWalk 和 Node2Vec,这些方法通过随机游走在图中生成节点嵌入。
第四章,图的深度学*模型,详细探讨了图神经网络(GNNs),包括消息传递机制和三种关键架构:图卷积网络(GCNs)、GraphSAGE 和图注意力网络(GATs)。
第五章,图深度学*的挑战,详尽地介绍了图深度学*中的主要挑战,包括数据相关问题、模型架构局限性、计算约束、特定任务的问题以及图神经网络(GNNs)的可解释性问题。
第六章,利用大型语言模型进行图学*,探讨了如何通过特征增强、预测能力和检索增强生成(RAG)方法,利用大型语言模型(LLMs)来提升图学*任务。
第七章,图深度学*实践,展示了如何使用 PyTorch Geometric 在社交网络分析中实施图深度学*技术,重点介绍了大学生网络中的节点分类和链接预测任务。
第八章,图深度学*在自然语言处理中的应用,探讨了图深度学*技术如何应用于 NLP 任务,包括语言学图结构、文本摘要、信息抽取和对话系统。
第九章,使用图深度学*构建推荐系统,全面介绍了如何使用图深度学*构建和实现推荐系统,包括基本概念、图结构、模型架构和训练技术。
第十章,图深度学*在计算机视觉中的应用,介绍了如何通过将视觉数据表示为图,利用图神经网络(GNNs)增强计算机视觉任务,相比传统基于网格的卷积神经网络(CNN)方法,可以更好地建模关系和结构属性。
第十一章,新兴应用,探讨了图深度学*在六个主要领域中的最新应用:生物学/医疗、社交网络、金融服务、网络安全、能源系统和物联网(IoT)。
第十二章,图学*的未来,探讨了图学*的未来发展趋势,涵盖了新兴趋势、先进架构、人工智能(AI)集成以及量子计算、通用人工智能(AGI)和元宇宙应用等领域的潜在突破。
为了从本书中获得最大收益
为了最大化地利用本书,你应该具备机器学*基础、基本图论和编程概念的基础。我们假设你已经熟悉 Python 编程,并且有神经网络和深度学*原理的工作理解。提前了解数据结构和算法将是有益的,但不是必须的。
| 本书涵盖的软件/硬件 | 操作系统要求 |
|---|---|
| Jupyter Lab/Google Colab | Windows、macOS 或 Linux |
| Python |
为了成功地使用本书中的示例,你需要为你的 Python 环境设置几个必备的软件包。首先安装核心库:
-
PyTorch 用于深度学*操作
-
PyTorch Geometric 用于基于图的神经网络
-
NetworkX 用于图的操作和分析
-
NumPy 和 pandas 用于数据处理和数值计算
这些可以通过 pip 或 conda 包管理器进行安装。
为了获得最佳性能,确保你的系统至少有 8 GB 的内存和相对现代的 CPU。虽然对于运行较小的示例来说,GPU 并不是绝对必要的,但拥有 GPU 会显著加速较大模型和更复杂图操作的训练过程。
如果你正在使用本书的数字版,我们建议你自己输入代码或从本书的 GitHub 仓库中访问代码(下一节提供了链接)。这样做有助于避免与代码复制和粘贴相关的潜在错误。
下载示例代码文件
你可以从 GitHub 下载本书的示例代码文件,网址为 github.com/PacktPublishing/Applied-Deep-Learning-on-Graphs。如果代码有更新,它会在 GitHub 仓库中进行更新。
我们还提供了其他来自我们丰富书籍和视频目录的代码包,访问地址为 github.com/PacktPublishing/。快去看看吧!
使用的约定
本书中使用了若干文本约定。
文本中的代码:表示文本中的代码单词、数据库表名、文件夹名称、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 账号。示例如下:“我们使用 model.eval() 设置模型为评估模式。”
一段代码块如下所示:
model.eval()
_, pred = model(data.x, data.edge_index).max(dim=1)
correct = float(pred[data.test_mask].eq(
data.y[data.test_mask]).sum().item())
accuracy = correct / data.test_mask.sum().item()
print(f'Accuracy: {accuracy:.4f}')
当我们希望你注意代码块中特定部分时,相关行或项会以粗体显示:
import torch
import torch.nn.functional as F
from torch_geometric.datasets import Planetoid
from torch_geometric.nn import GCNConv
# Load the Cora dataset
dataset = Planetoid(root='data/Cora', name='Cora')
任何命令行输入或输出如下所示:
pip install torch torch_geometric scikit-learn matplotlib networkx
粗体:表示一个新术语、一个重要词汇,或你在屏幕上看到的词汇。例如,菜单或对话框中的词语通常以粗体显示。比如:“在一个电子商务系统中,一个可能的用例是预测客户的生命周期价值(LTV),这基于他们与产品及其他功能的互动。”
提示或重要事项
显示如下。
联系我们
我们始终欢迎读者的反馈。
一般反馈:如果你对本书的任何部分有疑问,请通过电子邮件联系我们,customercare@packtpub.com,并在邮件主题中注明书名。
勘误表:尽管我们已尽最大努力确保内容的准确性,但错误仍然可能发生。如果你在本书中发现了错误,我们将非常感谢你向我们报告。请访问www.packtpub.com/support/errata并填写表格。
盗版:如果你在互联网上遇到我们作品的任何非法复制品,我们将非常感谢你提供其网址或网站名称。请通过版权@packt.com 与我们联系,并提供材料链接。
如果你有兴趣成为作者:如果你在某个领域有专业知识,并且有兴趣写书或参与书籍的编写,请访问authors.packtpub.com。
分享你的想法
一旦你读完了《应用深度学*:图形分析》,我们很想听听你的想法!请点击这里直接进入亚马逊评论页面并分享你的反馈。
你的评论对我们和技术社区非常重要,将帮助我们确保提供优质的内容。
下载本书的免费 PDF 副本
感谢你购买本书!
你喜欢随时随地阅读,但又无法随身携带纸质书籍吗?
你的电子书购买是否与你选择的设备不兼容?
别担心,现在每本 Packt 书籍都可以免费获得无 DRM 保护的 PDF 版本。
在任何地方、任何设备上随时阅读。直接在应用程序中搜索、复制并粘贴你最喜欢的技术书籍中的代码。
福利不止于此,你还可以获得独家折扣、新闻通讯,并每天在邮箱中收到精彩的免费内容。
按照以下简单步骤来享受福利:
- 扫描二维码或访问以下链接

packt.link/free-ebook/978-1-83588-596-3
-
提交你的购买凭证
-
就这些!我们将直接把免费的 PDF 和其他福利发送到你的电子邮件。
第一部分:图学*的基础
在本书的第一部分,您将概览图学*的基本概念,包括基础定义、现实世界的应用和核心表示技术。您将了解理解图形机器学*所需的基本构建块,跨行业的实际应用案例,以及在机器学*环境中表示图数据的各种方法。
本部分包括以下章节:
-
第一章,图学*简介
-
第二章,图学*在现实世界中的应用
-
第三章,图表示学*
第一章:图学*简介
图形数据是一种强大且直观的信息表达方式,许多实际场景使用图形数据表达要比表格方式更为合适。图形数据分析已经是几十年的研究课题,但由于计算能力的提升,它最*才开始受到关注。
在本书中,我们旨在向你介绍图形的世界。我们将从讨论图形数据是什么以及图形相关的基本数学术语开始。接下来,我们将绕道讨论一些常见的图算法及其在图形数据分析中的应用。我们还将扩展关于图形数据分析的讨论,涉及图形深度学*的需求,以及为何它作为一个专门子领域,与应用现有架构有所不同。
在本章中,我们将涵盖以下主题:
-
我们需要图形吗?
-
图的形式化
-
图的类型和属性
-
图形数据结构
-
传统的基于图的解决方案
-
表示学*的需求
-
图神经网络(GNNs)及其作为独立领域的需求
我们需要图形吗?
最*的人工智能(AI)革命只是一个大趋势的冰山一角,这一趋势已影响计算机行业数十年。随着时间的推移,计算性能在消耗功率和成本上指数级增长;信息存储成本也在指数级下降。为了更好理解这一点,2024 年,一个 100 美元的硬盘可以存储一 TB 数据,而在 1990 年代初,存储同样数据的成本超过一百万美元!
使用计算机及其衍生产品,如软件、网页应用程序、游戏和多媒体内容,已深深融入我们的日常生活。这种依赖关系催生了对所有交互实体行为的理解需求:人类、计算机硬件、像网页应用程序这样的软件,甚至整个组织。最终目标是找到方法提高交互效率,从而可能带来前所未有的商业机会。
最初,由于时间的限制,收集到的信息较为零散,记录的事实提供了系统的一个非常高层次的概述,且仅涉及系统中的少量变量(对于数据科学家来说,类似于聚合级别的数据,且维度较少)。在某个时刻,有人意识到计算能力和数据存储已经足够便宜,可以更加细致地记录事实:不仅可以更频繁地单独记录每个场景,还可以在每次拍摄快照时记录其他变量。数据革命开始了,利益相关者意识到,通过捕捉并审查这些交互实体的足够数据,可以绘制出它们在生态系统中的行为全貌。2010 年代人们致力于数据及其产品的商品化,以至于即使是获得 A 轮融资的初创公司也采用了数据解决方案:无论是数据仓库、Elasticsearch,还是推荐引擎。
回到原点,让我们理解数据的含义。一个数据点本质上只是一个事实陈述。关于事实在数据中的表示方式,讨论非常少。数据的事实表示方式通常是表格形式,这对于围绕现有数据生态系统构建的能力而言通常运作良好。数据科学研究和工程的重点一直围绕现有的数据库架构,这也是表格形式的表示最为广泛的原因。然而,表格形式并不是唯一的表示方式。本章的目的是围绕图形表示法构建案例,并说明为什么图形表示法可以成为许多实际场景中的最佳选择。
图数据通过节点(也称为对象、顶点或名词)和边(也称为关系、链接或动词)来表示。某些现实生活中的场景需要强调对象之间的关系,而不仅仅是将每个对象视为独立实体。图数据结构为我们提供了一种自然的方式来表达这些场景,这与表格格式等其他方式不同。通过将实体视为节点、关系视为两个节点之间的边这一简单结构,图形表示能够有效地建模来自各个领域的信息:从网络拓扑到生物系统,再到供应链和分子结构。
案例研究
为了更清楚地说明这一点,让我们考虑社交网络中常见的一个问题。对于一个用户(比如 John),我们想要确定另一个用户(比如 Mary)是否是其二度连接。二度连接简单来说是指 Mary 和 John 有共同的连接,但 Mary 并不直接与 John 相连接(即 Mary 是 John 的朋友)。社交媒体平台通常在用户对之间跟踪这一信息,并决定是否应该推荐他们连接。我们将从两个角度解决这个问题:首先使用表格表示,然后使用图形表示。
表格表示
首先,我们需要了解数据库中表的架构。在典型的社交媒体平台数据库中,可能会有几个表 – 一个用于用户(包含年龄、位置、加入日期等人口统计信息)、一个用于帖子(包含关于发布帖子的详细信息,如发布帖子的用户、帖子内容、发布日期、可见性等),以及其他许多表。对我们而言关键的表是所谓的 连接表。它应该记录直接连接的用户信息(即具有一度连接的用户)。架构应该类似于这样:
connections(
conn_id: UUID,
user_id_1: UUID FOREIGN KEY,
user_id_2: UUID FOREIGN KEY,
date_of_conn: TIMESTAMP,
status_of_conn: TEXT
)
表 1.1 显示了一个包含几个数据点的表:
| conn_id | user_id_1 | user_id_2 | date_of_conn | status_of_conn |
|---|---|---|---|---|
| conn_uuid_0 | john_uuid | alex_uuid | 2022-10-30 | active |
| conn_uuid_1 | alex_uuid | greg_uuid | 2023-03-12 | active |
| conn_uuid_2 | greg_uuid | mary_uuid | 2023-04-11 | active |
| conn_uuid_3 | mary_uuid | alex_uuid | 2023-06-09 | active |
表 1.1 – 以表格格式存储的示例数据
要确定 John 和 Mary 是否具有二度连接,可以执行类似以下的 SQL 查询:

图 1.1 – 在先前介绍的表上执行的 SQL 查询,以检索二度连接
该查询的关键部分包含递归自连接操作,其中每个递归级别包含特定程度的连接。初始过滤条件 user_id_1 = 'john_uuid' 或 user_id_2 = 'john_uuid' 确保我们只关注与 John 有某种级别连接的用户。最后,通过过滤条件 degree = 2 ,我们可以获取所有与 John 有二度连接的用户列表。
这种方法的效率如何?最坏情况下的时间复杂度可以渐进地评估,并用大 O 记法表示。设
为社交媒体平台上用户的数量,
图 1.2 – 将表 1.1 中的数据表示为图
我们如何找到约翰和玛丽是否有二度连接的答案呢?我们可以在这个图上应用一个直观的算法:
-
从源点开始:从选择的起始点开始,通常称为图的源点或初始节点。这是你当前的探索位置。在我们的用例中,初始节点将是约翰的节点。
-
按层级探索邻居:在进入它们的邻居之前,先访问当前节点的所有邻居。想象一下按层次探索图形,每次向外扩展一级。这确保你在继续探索更远的节点之前,先发现所有距离较*的节点。
-
标记访问的节点:当你访问每个节点时,将其标记为已访问,以避免重新访问同一节点。使用队列来跟踪你遇到节点的顺序。在标记节点时,你还可以跟踪从初始节点跳跃到达该节点的次数。继续这个过程,直到访问到从起始点能够到达的所有节点。
简单来说,这个算法通过逐渐远离起始点来探索图,逐层检查相邻节点,并跟踪已访问的节点以避免重复。这就像一颗小石子落入池塘,产生的涟漪先向周围扩散,然后再向更远的地方扩展。这个算法叫做广度优先搜索(BFS),它是最流行的图算法之一:

图 1.3 – 在图上运行 BFS
使用这个算法,如果玛丽的节点被标记为已访问,并且跳数为2,那么我们可以放心地说,约翰和玛丽有二度连接。
BFS 的时间复杂度是多少?如前所述,用户的数量假定为
,一度连接的数量为
。实际上,BFS 至多访问图中的所有顶点和边一次,所以时间复杂度就是简单的
。在实际场景中,连接数远远超过平台上的用户数,因此时间复杂度可以*似为
。
是
比
更好吗?当然好。我们可以看到,通过改变问题的解决方法视角,我们可以实现一个更高效的解决方案。为了进一步测试你的理解,假设问题保持不变,只是你现在需要检查约翰和玛丽是否为三度连接,而不是二度连接。那么这两种方法的时间复杂度会受到什么影响?
图在实际应用中非常有用。但在我们讨论图的某些属性和算法如何用于解决图问题之前,我们需要定义一种通用语言,用来指代图及其属性。以下部分将介绍数学中图的常见定义,以及如何通过简单的表示方式涵盖图所能表示的所有不同类型的数据。
图的形式化
图是数学中非常流行的概念。在这个领域,常用的术语已经得到了广泛的接受。让我们仔细看一下。
定义和语义
随着对图表示作为实际问题相关话题的论述,我们先花点时间来定义什么是图。图是一个抽象概念。从数学角度来看,通常表示为
,其中
是图,包含一组顶点
和一组边
。每个
的元素是一个元组
,其中
,表示两个顶点之间的连接。数学定义就是这些;如何将语义应用于此完全取决于你。
在前一节中提到的例子中,社交媒体平台的用户由顶点表示,两个用户之间的连接由边表示。此外,顶点和边不一定是完全相同的。考虑一下家庭网络的图表示:

图 1.4 – 一个经典的异构图,其中有多种类型的元素作为节点进行表示。边所代表的交互也具有异质性
在这里,节点表示家庭网络中所有的实体,从人类用户到物联网(IoT)设备、路由器和智能电视。边的语义范围从互动到网络通信,再到媒体流播放。形式上,顶点和边的集合可以定义如下:
V = {useri, user2, iPhone, Smart TV, Laptop, Android Phone, Raspberry Pi, Router, ISP1, ISP2}
E = {
(user1,iPhone: interacts with),
(user1,Smart TV: interacts with),
(user1,Laptop: interacts with),
(user2,Smart TV: interacts with),
(user2,Laptop: interacts with),
(user2,Android Phone: interacts with),
(iPhone,Router: communicates with),
(Smart TV,Router: communicates with),
(Laptop,Router: communicates with),
(Android Phone,Router: communicates with),
(Raspberry Pi,Smart TV: streams to),
(Raspberry Pi,Router: communicates with),
(Router,ISP1: is connected to),
(Android Phone,ISP2: is connected to)
}
通过为节点或边添加更多特定信息,可以进一步增强图表示。一种常见的表示方法是使用特征向量。我们将在未来的章节中学*如何为节点和边添加特征。
这里的关键是,图是一种非常强大的事实表示方式。理解了这个定义后,我们可以尝试探讨一些图的派生特性。图的某些特性暗示了关于图中节点和边如何组织的高层次事实。接下来的部分将重点介绍几种流行的图属性和类型。
图的类型和属性
已识别出几种类型的图,每种图都有其独特的属性,但我们将重点讨论最流行的几种。请注意,这些类型不一定是互斥的,也就是说,一个图可以同时标记为多种类型。
有向图
当图的边具有单向关系时,图就是有向图。许多场景中,表示的关系是单向的。在表示家谱的图中,一条边可能代表“是父母”的关系,而另一条边可能代表“是宠物”的关系。这样的关系无法在节点之间倒转,并且保持相同的含义。
二分图
二分图是一种图,其顶点可以被划分为两个不相交的集合,使得每条边都连接一个集合中的顶点和另一个集合中的顶点。换句话说,图中没有连接同一集合内顶点的边。从数学上讲,图,
,是二分图当且仅当顶点集
被划分为两个非空集合,
和
,使得图中每条边
都连接
中的一个顶点和
中的一个顶点。
二分图通常表示为
,其中
和
是两个不相交的顶点集合,! <mml:math >mml:miE</mml:mi></mml:math> 是连接
到
的边集合。二分图的一个常见应用是在建模两种不同类型实体之间的关系,其中边表示不同类型实体之间的连接或关系。
二分图在实际应用中非常常见。在电子商务中,推荐系统(也称为推荐引擎,参见第二章和第九章)是建立在二分图数据上的,其中节点由用户和商品组成。用户和商品之间的交互仅限于用户与商品之间的互动,而用户与用户、商品与商品之间没有交互。这种互动可以表现为用户点击或订购商品的形式:

图 1.5 – 二分图的经典示例,来自电子商务应用
另一个二分图的例子是婚姻问题,其中一个集合中的顶点代表男性,另一个集合中的顶点代表女性,边表示夫妻之间的婚姻关系。另一个例子是建模推荐系统中客户与产品之间的互动。
连通图
完全连通图,也称为完全图,是每一对不同顶点都通过边连接的图,形成一个每个节点与其他每个节点都直接相连的网络。它们具有很高的连通性,但随着节点数量的增加,计算复杂度也会增加。
加权图
图还可以附加额外的信息,包括节点和边。当边作为标量附加信息添加时,图被称为加权图。
在讨论图的类型时,我们来介绍一些图的常见属性。这些不是我们之前提到的附加到图上的标签,而是一些度量或属性,独立于所讨论的图的类型。
子图
子图是由原始图的一个顶点和边的子集构成的图。更正式地说,设
是一个具有顶点集
和边集
的图。图
的一个子图是一个图,记作
,使得
是
的子集,且 E(
是
的子集。通常,寻找具有有用性质(如二分图或连通图)的子图是解决更大问题的重要步骤。
中心性
中心性是图论中的一个度量,它量化了一个节点在网络中的重要性或影响力。具有高中心性的节点在网络中更为中心,在其结构和动态中发挥着更重要的作用。中心性有多种度量方式,每种方式捕捉节点重要性的不同方面。以下是一些常见的中心性度量:
-
度数中心性:一个节点的度数中心性是连接到它的边的数量(即它的邻居数量)。具有高度数中心性的节点通常连接紧密,可能在传播信息或影响力方面起着关键作用。
-
接*中心性:接*中心性衡量一个节点与网络中所有其他节点的接*程度。它是从一个节点到所有其他节点的最短路径距离之和的倒数。具有高接*中心性的节点可以迅速与其他节点进行交互,并且在通信效率方面通常处于中心位置。
-
介数中心性:介数中心性量化了通过一个节点的最短路径数量。具有高介数中心性的节点对其他节点之间的通信有显著影响。高介数中心性的节点在网络中充当桥梁或门控者,控制着信息流动。
-
特征向量中心性:特征向量中心性不仅考虑节点的连接数,还考虑其邻居的中心性。它基于这样的原则:与高评分节点的连接对节点的中心性贡献更大。具有高特征向量中心性的节点通常与其他中心节点连接,使其在整个网络结构中非常重要。
-
PageRank:PageRank 是一种用于网页搜索算法(例如,谷歌的 PageRank)的中心性度量。它根据节点的入链数量和质量来赋予节点重要性。具有高 PageRank 的节点被认为是有影响力的,因为它们与其他重要节点相连。
中心性度量有助于识别网络中的关键节点,这对于理解信息流动、识别有影响力的个体或在各种应用中(如社交网络、交通系统和生物网络)针对节点进行干预都非常重要。根据分析的具体背景和目标,可能需要不同的中心性度量。
社区结构
在图论中,社区结构指的是将网络或图分为节点的群组或簇,这些节点在内部连接密集,但组与组之间的连接较少。社区内的节点更可能具有相似的属性、兴趣或功能,识别社区结构是分析复杂网络的组织和动态的基础。检测图中的社区对理解系统的模块化组织至关重要,并且在许多领域(如社交网络分析、生物学和信息检索)都有应用。
同构
同构是图论中的一个概念,处理两个图之间的结构相似性。若两个图的顶点之间存在一一对应关系,并且邻接关系得以保持,则认为这两个图是同构的。换句话说,从结构角度来看,这两个图本质上是相同的,即使顶点和边的标签可能不同。
图同构是计算机科学中的一个基础问题,应用广泛,如化学、计算机辅助设计和模式识别等领域。尽管它在实际应用中非常重要,但找到一个快速的图同构算法仍然是一个具有挑战性的问题,而且是否存在具有多项式时间复杂度的算法仍然是一个悬而未决的问题:

图 1.6 – G 和 H 是同构图。要理解这一点,请注意以下映射关系:g 1 →h 1,g 2 →h 2,g 3 →h 3,依此类推。
专用图的属性可以被利用,以进一步洞察这些图所表示的场景。现在,让我们来看看如何将图输入到机器中,以便它们可以被算法读取。
图数据结构
我们应该如何将图数据输入到计算机程序中,以便能够应用基于图的算法来解决问题?这一点将在本节中讨论。每种表示方法都有其优缺点,我们将从确定边是否存在以及更新图的时间复杂度的角度来探讨它们。
邻接矩阵
邻接矩阵旨在通过矩阵记录图的结构。创建一个矩阵,例如
,大小为
(其中
表示节点数,或者从数学角度来看,
图 1.7 – 对于给定的图 G,M 和 L 分别是邻接矩阵和邻接表
到目前为止,我们讨论了邻接矩阵和邻接表这两种在算法中常用的图表示数据结构。然而,根据问题的不同,还有许多其他图数据结构可以使用。每种图数据结构都有其优缺点,这是一个很好的研究领域,值得进一步探讨。
传统的基于图的解决方案
许多计算机科学家通过设计优雅的解决方案解决了涉及图的看似复杂问题,留下了浓厚的历史印记。然而,图并不仅仅局限于算法书籍中,图相关的问题在实际中也非常常见。许多商业问题和科学研究实际上可以转化为图问题,现有的解决方案可以在这些问题上实施,以生成所需的输出。在这一节中,我们将讨论图领域中最常见的问题、一些解决这些问题的方法,以及这些问题在实际场景中常见的应用。
搜索
执行图搜索时有两种基本的方法:广度优先搜索(BFS)和深度优先搜索(DFS)。这两种方法都是从起始点开始遍历图,直到所有可以从初始节点到达的节点,但它们的区别在于各自的处理方式。
在广度优先搜索(BFS)中,算法逐层探索图,从源顶点开始,先访问所有邻居节点,再进入下一层。这种方法确保了离源节点较*的节点会先被访问,而更深层的节点则会后访问。另一方面,深度优先搜索(DFS)则是沿着每个分支尽可能深入,直到无法继续,然后回溯。它会在到达某个分支的末端之前,先深入探索这一分支,才会转向下一个分支。
广度优先搜索(BFS)非常适合在无权图中寻找最短路径,并且常用于网络路由协议和社交网络分析中。深度优先搜索(DFS)则通过深度探索,非常适合用于拓扑排序、环检测,以及解决迷宫探索和拼图问题等。
现在我们对搜索算法有了基本的了解,接下来让我们来看另一类问题——划分。在实际中,理解图划分的需求非常频繁。
划分
在图论中,划分指的是将图的顶点或边分割成互不相交的子集或组件。划分的目标是以某种方式将图的元素分组,以满足特定的属性或达成某个目标。图划分有不同的类型,选择哪种划分标准取决于应用或当前问题的需求:
-
顶点划分:这涉及将图的顶点集合划分为互不重叠的子集。顶点划分的目的是为了在每个子集中的顶点数量上实现平衡。这是并行计算中的负载平衡、网络设计和社交网络分析中常见的问题。
-
边划分:顾名思义,这涉及将图的边集合划分为互不重叠的子集。与顶点划分类似,这里的目标是平衡每个子集中边的数量或边的总权重。边划分问题通常应用于分布式计算中的通信优化,最小化子集间的通信。
-
图割:这涉及通过去除最少数量的边来划分图。目的是在满足某些约束条件的同时,最小化割的大小(去除边的总权重)。应用包括图像分割和社交网络中的社区检测。
-
K-路划分:这是上述概念的推广,涉及将顶点或边划分为
个互不重叠的子集。在 K-路划分问题中,我们需要在每个
子集中的元素数量上实现平衡,这类问题出现在 超大规模集成(VLSI)设计和并行计算等领域。你可以在这里阅读更多内容: https://patterns.eecs.berkeley.edu/?page_id=571 。
图划分问题通常是 NP 难的,这意味着对于大型图而言,找到最优解在计算上可能是不可行的。因此,各种启发式算法、*似算法和优化技术被用来在合理的时间内找到良好的解决方案。
在图论领域中,另一个重要问题是路径优化,许多供应链企业和网络研究人员一直对此类问题的解决方案感兴趣。
路径优化
图论中两个常见问题是找到两节点之间的最短路径和最宽路径。它们的应用显而易见,涉及供应链中的路线优化和社交网络分析(前述案例研究中提到的问题也可以视为两节点之间的最短路径问题,特别是如果通过要求边加权进行了轻微修改的话)。
最宽路径问题是最短路径问题的变种。正式地,问题定义如下:给定一个加权图,最宽路径问题寻找一条从源顶点到目标顶点的路径,使得路径上最小的边权(瓶颈)最大化。这在网络设计或通信系统中尤为相关,目标是最大化瓶颈链路的容量。
寻找两个节点之间最短路径的最流行方法是迪杰斯特拉算法。虽然不深入细节,这里是该算法的简短步骤总结:
-
初始化:
-
从源顶点开始。
-
将源顶点的临时距离设为 0,所有其他顶点的临时距离设为无穷大。
-
将所有顶点标记为未访问。
-
-
迭代探索:
-
选择未访问的临时距离最小的顶点。
-
对于选定的顶点,考虑它的所有邻居。
-
通过将当前顶点到每个邻居的距离加起来,更新每个邻居的临时距离。
-
如果更新后的距离小于当前的临时距离,则更新它。
-
将当前顶点标记为已访问。
-
-
终止:
-
重复迭代过程,直到目标顶点被访问或所有顶点都被访问。
-
最终分配的距离表示从源顶点到所有其他顶点的最短路径。
-
通过从目标顶点回溯到源顶点,利用存储的最短距离信息来重建最短路径。
-
总结来说,Dijkstra 算法以逐步的方式探索图,始终选择具有最小暂定距离的顶点。它逐渐构建从源点到所有其他顶点的最短路径,同时标记已访问的顶点。最终的结果是从源点到图中所有其他顶点的一组最短距离和路径。最宽路径问题也可以通过相同的算法解决,但不是保持每个节点的最小暂定距离,而是保持瓶颈权重(或者是所有路径中最小权重的最大值)。该算法的时间复杂度很大程度上依赖于所使用的实现方法,复杂度范围从
到
。然而,当边权为负时,Dijkstra 算法会失败,而且当图几乎完全连接时也会效率低下。在这种情况下,可以使用Bellman-Ford 算法等替代方法。
现在我们已经基本了解了图数据上执行的各种分析方法,接下来让我们看看另一种强大的学*图数据中模式的方式。表示学*的核心思想将在以下部分中介绍;我们将学*表示学*是解决许多涉及图的复杂问题的重要第一步。
表示学*的需求
在这里,我们将介绍一个新概念——图形的表示学*。让我们通过一个小类比来理解这意味着什么。一个典型的公司组织包含几个实体:员工、IT 设备、办公室等。所有这些实体之间保持不同类型的关系:员工之间可以基于组织层级相关联;一个员工可能使用几件 IT 设备;几件设备,如服务器,可以相互连接;员工和设备可以分别在某个特定办公室报到或位于该办公室,等等。
图形,确实是表示这些信息的一种自然方式,如下所示:

图 1.8 – 显示组织中不同实体相互作用的图形
图形在视觉上非常直观。然而,对图形进行算法计算并不是一件简单的事情。我们能否找到一种方法,在一些共同的字段中尽可能捕捉每个实体的特征和关系信息?考虑为每个实体设计一张独特的 ID 卡,其中包含以下字段:姓名、子组织、启动日期、行业年限和地理位置。因此,几张 ID 卡可能长这样:

图 1.9 – 几个具有相同字段的实体 ID 卡示例
现在,如果你只看到了所有实体的 ID 卡而没有看到前面的图形,你能回答一些问题吗?比如哪个员工汇报给谁?或者,哪张 ID 卡是员工的,哪张是办公室的,哪张是 IT 设备的?仅凭 ID 卡上的信息,确定这些问题的答案并不容易(或完全可行),但我们可以接*正确答案。要回答一个员工是否在另一个员工的层级下,我们可以检查两个员工是否具有相同的子组织和地理位置值,并且层级更高的员工在行业年限上是否高于另一个员工。猜测某张 ID 卡是否属于办公室,可能只需要检查该实体的子组织值是否为空,等等。
尽管这种方法一开始听起来不太直观,但仅仅通过 ID 卡而不是图形,使用这种启发式方法来尝试回答这些实际问题,计算机和现代实现可以高效地完成。这里的 ID 卡试图表示图形中实体的特征和关系。
更正式地说,前面示例中的身份证是与图的每个节点相关的固定维度的向量嵌入。应用了一种学*算法,旨在在这些嵌入向量中尽可能多地捕捉图结构中的信息。这些嵌入向量集随后用于回答有关图的难题,而不依赖于原始图形本身。
为什么我们要尝试学*表示?与直接处理原始图形相比,使用嵌入向量有什么好处?让我们来看看:
-
可扩展性:传统的图算法对于大规模图形可能会变得计算上昂贵且不切实际。表示学*方法通过生成紧凑的嵌入向量来捕捉图形的关键信息,从而实现更可扩展和高效的计算。
-
任务灵活性:表示学*生成的嵌入向量是与任务无关的,这意味着它们可以用于各种下游任务。传统的图算法通常是针对特定问题设计的,将其适配到不同的任务中可能会面临挑战。而嵌入向量提供了更灵活和多功能的方式来处理各种任务。
-
包含节点和边的特征:许多现实世界的图形都带有与节点和边相关的额外特征。表示学*方法可以自然地将这些特征纳入学*过程,从而对图形特征进行更全面的理解。传统的图算法可能不容易集成外部特征。
-
处理动态图:表示学*非常适合处理结构不断演变的动态图。学*到的嵌入向量可以捕捉时间模式和变化,提供比传统图算法更适应的方式,而传统算法可能未能本质上解决时间因素。
-
对未见数据的泛化能力:表示学*旨在生成能够很好地泛化到未见数据的嵌入向量。这在图结构不完全已知或可能发生变化的情况下尤为有用。传统的图算法可能无法有效地对新的或未见过的图实例进行泛化。
-
噪声鲁棒性:嵌入向量可以对噪声或不完整的图数据更具鲁棒性。传统的图算法可能对噪声敏感,但表示学*方法可以学会忽略无关信息,专注于图形的最重要部分。
-
与机器学*模型的集成:表示学*促进了图数据与机器学*模型的集成。学*到的嵌入向量可以作为各种机器学*任务的输入特征,使得实践者能够在统一框架中利用图基算法和非图基算法的优势。
通过捕捉图数据中的关键信息并将其压缩成嵌入,应用机器学*技术于图结构数据变得更加可行,并且可以高效地处理各种任务。
GNN 和需要单独关注的领域
在本章中,我们不会深入讨论 GNN 的具体工作原理或它们与其他流行的神经网络架构的不同之处。在这里,我们只是尝试解释为什么有必要将 GNN 单独研究,而不是与其他深度学*架构一起研究。
在讨论差异之前,我们必须先讨论相似性。GNN 是一种专门用于处理图数据并输出表示或节点嵌入的架构选择。类似于卷积网络对于读取像素数据的重要性,GNN 架构集被优化用于读取图数据。基于 GNN 的学*任务与其他深度学*解决方案的轨迹相同:通过迭代优化模型的参数,以使损失函数最小化。在 GNN 的情况下,损失函数通常尝试捕捉并保留关于图结构的有意义信息。
现在,让我们来看看这些差异,以及为什么 GNN 需要特别关注:
-
不规则的图结构:图可以具有不规则和变化的结构,节点可能有不同数量的邻居。这种不规则性对传统的深度学*架构构成挑战,因为传统架构通常假设输入大小是固定的。例如,在社交网络中,个体可能有不同数量的连接(朋友、关注者等等)。
-
置换不变性:图中节点的顺序不应影响 GNN 的输出。实现置换不变性对于确保模型能够跨不同节点顺序进行泛化至关重要。一个置换不变性的好例子是化学中的分子图。分子的性质仅依赖于其结构,而不是原子标号的顺序。
-
图同构问题:确定两个图是否同构是一个计算上复杂的问题。GNN 需要能够捕捉并区分不同的图结构。
-
节点和图分类:GNN 通常需要执行如节点分类或图分类等任务。这些任务要求模型能够捕获图的局部和全局信息,这可能是一个挑战。
-
处理不同类型的边:图可能具有不同类型的边,每种边代表节点之间不同的关系。GNN(图神经网络)需要能够建模并利用这种边类型的异质性。
-
池化与聚合:在图中聚合邻居信息是 GNNs 中的一个基本操作。设计有效的池化和聚合策略,以捕获重要信息,同时避免信息丢失或冗余,是一个挑战。一个很好的例子是推荐系统如何从用户朋友的偏好中池化信息。表示应当能够捕捉到这种池化的思路。
-
捕捉长程依赖:GNNs 需要捕捉图中的长程依赖关系。与递归神经网络(RNNs)中的顺序数据不同,后者的依赖关系通常是局部的,图可能存在跨越长距离的依赖关系。
-
可解释的表示:在图神经网络(GNNs)中,理解和解释学*到的表示是至关重要的,尤其是在那些可解释性至关重要的应用中。可解释性在使用电子健康记录进行医学诊断时尤为关键。GNNs 可以用来分析患者记录,其中节点表示不同的健康参数。可解释的表示对于医疗专业人员理解并信任模型在诊断疾病或预测患者结果时的决策过程至关重要。
GNNs 提供了机器学*方法在处理表格数据时所具备的许多优势,但它们是在图数据的背景下发挥作用。使用 GNNs 作为解决与图相关问题的中介步骤有几个重要的意义。我们将在接下来的章节中探索更多类似的话题。
摘要
在本章中,我们介绍了图学*和表示的基础概念。我们从激励性示例开始,说明了图结构如何自然地捕捉实体之间的关系,使其成为一种强大的数据表示。接着,我们讨论了图的正式定义、常见图类型和关键属性。我们还介绍了流行的图算法,如搜索、划分和路径优化,以及它们的实际应用场景。
这里提出的一个关键观点是图上表示学*的需求。将图数据转化为向量嵌入使我们能够利用机器学*模型的能力。诸如可扩展性、灵活性和鲁棒性等好处使得图嵌入成为一种促进技术。
最后,我们证明了专门化 GNN 架构的必要性。诸如不规则结构、排列不变性以及复杂操作如聚合和池化等因素都要求定制化的解决方案。GNNs 为跨领域学*关系数据开辟了新的可能性。
在下一章中,我们将讨论图学*如何在实际中应用。图学*和表示有多个层次,所有这些层次都有商业和学术意义。本章所涵盖的主题将作为你理解后续章节中概念的基础。
第二章:现实世界中的图学*
在数据科学和机器学*(ML)日新月异的领域中,基于图的学*的变革性力量已成为揭示现实世界现象复杂性的关键力量。从社交网络和交通系统到生物学交互和电子商务,许多复杂的系统可以通过图的视角进行抽象和分析。本章将深入探讨现实世界中的图学*领域,我们将在其中探讨这样一个引人注目的观点:许多复杂的现实问题可以有效地转化为节点、边和图级的预测任务。
图,由表示实体的节点和捕捉它们之间关系的边组成,为建模互联结构提供了直观的框架。通过利用图中固有的关系,我们获得了一个强大的工具,用于理解多领域中的动态和模式。重点将放在利用图的拓扑结构和结构中蕴含的预测潜力,从而为解决从推荐系统和欺诈检测到药物发现和城市规划等问题提供解决方案。
图学*的核心是节点,即网络中的基本实体。节点可以是从社交网络用户到生物分子,再到交通系统中的城市等任何事物。通过学*和预测节点的属性或行为,我们可以构建诸如个性化推荐和定向营销等应用。
边,表示节点之间的关系,增加了复杂性。边可以捕捉社交联系、生物交互或网络连接。通过学*和预测边的属性或结果,我们可以深入了解实体之间如何相互关联。这对于链接预测、异常检测和网络优化等任务至关重要。
超越单个节点和边,图级预测提供了一个全局视角。通过学*和分析图的整体结构和特征,我们可以发现从网络中涌现出的模式、社区和现象。这对于城市规划等场景非常有用,在这些场景中,城市基础设施的设计可以影响日常生活的各个方面。
本章将探讨以下主题:
-
节点级学*
-
边级学*
-
图级学*
-
真实世界应用
节点级学*
节点级学* 是学*和预测图中单个节点的属性或行为的任务。根据目标变量的类型和范围,节点级学*可以分为四个子任务:节点分类、节点回归、节点聚类 和 节点异常检测。
节点分类
图节点分类 是一种机器学*任务,旨在根据节点的特征和连接关系为节点分配标签或类别。例如,在一个电商图中,我们可以根据用户与商品的互动,将用户分类到不同的偏好组。为此,我们需要从节点和边缘中提取特征,如人口统计信息、商品属性、流行度、评论、购买频率以及在商品上的停留时间。这些特征捕捉了用户和商品的特征与偏好,以及它们互动的强度和性质。通过在一部分带标签的节点上训练机器学*模型,我们可以预测未标记节点的标签。这样,我们就可以将用户分为如 健康意识、科技爱好者 或 时尚爱好者 等群体,并为他们提供更相关和个性化的推荐。
看这个图:

这里,
是节点集合,
是边集合,每个节点
拥有一个特征向量
.
节点分类任务旨在根据节点的特征和图结构预测每个节点
的标签。数学上,这可以表示为:

这里,
是节点分类函数,考虑了节点
的特征和图结构
,以生成预测标签
。该函数
通常通过从带标签的训练数据集中的示例学*,其中节点与真实标签相关联。目标是将这种学*泛化,以便准确地对未见数据中的未知标签节点进行分类。

图 2.1 – 电商中的节点分类任务
在图 2.1中,一个带标签的电商图,我们的目标是确定 Andrew 属于哪个类别。
一些其他现实世界中的节点分类任务示例如下:
-
信息检索:节点分类可以根据网页、文档、查询或用户的内容、结构和交互来进行分类。例如,节点分类可以帮助将查询分类为电商查询图中的不同意图,或将网页在网络图中分类为不同主题。
-
社交网络分析:节点分类可以用来根据用户或实体的属性、行为和关系,在社交网络中识别其角色、社区或兴趣。例如,它可以帮助我们在 Twitter 上检测假冒或恶意账户。
-
生物信息学:节点分类可以根据生物分子或细胞的特征和关联推测它们的功能、相互作用或属性。例如,节点分类可以帮助预测蛋白质在蛋白质-蛋白质相互作用网络中的功能,或在单细胞基因表达网络中识别细胞类型。
接下来,让我们看看当我们有一个连续值需要预测时会发生什么。
节点回归
与分类相比,节点回归涉及预测与单个节点相关的数值。这个任务在理解节点的定量方面至关重要的场景中特别有用。在电子商务系统中,一个可能的使用场景是基于客户与产品及其他特征的互动来预测生命周期价值(LTV)。例如,您可以将电子商务平台建模为一个二分图,其中客户和产品是节点,购买、评分或浏览是边。您可以从节点和边中提取特征,如客户人口统计、产品属性、历史购买模式、流行度和互动强度。然后,您可以训练一个回归模型来预测每个客户的 LTV,这可以帮助您细分客户并优化营销策略。

图 2.2 – 电子商务 LTV 预测的节点回归
图 2.2展示了一个标记的电子商务图,用于通过节点回归预测 LTV。该图包含表示用户(James、John、Anna、Andrew)、物品(服装和电子产品)以及与用户、物品及其互动相关的各种特征的节点。目标是基于图结构和可用特征预测 Andrew 的 LTV。
其他一些节点回归的现实世界示例包括:
-
产品需求:给定一个以产品为节点、产品之间相似性为边的产品图,节点回归可以基于相关产品的销售情况预测某个产品的需求。这有助于库存和供应链管理。
-
房地产网络中的房产估值:房地产图中的节点可能表示单独的房产。节点回归可以根据位置、面积、设施以及附*最*的房产销售等特征预测房产价值。
现在让我们看看在图系统中如何利用聚类技术。
节点聚类
节点聚类旨在将具有相似特征或连接模式的节点进行分组。通过识别图中的社区,这个任务为我们提供了对内在结构和关系的更深理解。例如,在一个引用网络中,研究相似主题的研究人员可能会形成不同的聚类,揭示出兴趣社区。
继续以电商为例,节点聚类可以用于根据客户的购买行为和偏好对其进行分组。这种方法有助于深入理解客户群体,推动精准营销活动,并提升个性化推荐的质量。通过使用图聚类算法,我们可以识别出具有相似购买模式的客户群体,或者与常被相似客户群体购买的商品进行互动的客户。节点聚类可以作为一个有价值的工具,用于为特定客户群体量身定制营销策略,并优化推荐系统,从而为用户提供更加个性化的购物体验。

图 2.3 – 基于购买行为的电商客户节点聚类
在图 2 .3中,我们可以看到如何在节点层面应用聚类,以根据用户的购买历史对其进行分类。
其他一些现实世界中的节点聚类示例如下:
-
引文网络:在学术引文网络中,节点可以表示学术论文,边可以表示引用。根据相似的主题、关键词或引用模式对论文进行聚类,可以帮助研究人员进行文献综述并识别研究趋势。
-
物联网(IoT)网络:在物联网网络中,节点可以表示连接的设备,边可以表示通信链路。根据设备的功能、使用模式或兼容性对其进行聚类,可以帮助优化网络流量、资源分配,并识别潜在的安全威胁。
有时,我们可能希望识别图数据中的异常情况。让我们看看该如何操作!
节点异常检测
图学*中的节点异常检测是指识别偏离正常模式的图节点。例如,考虑一个在线零售平台,用户在平台上创建账户、浏览产品并进行购买。节点异常检测可以用来发现显示出异常购买行为的用户,例如过高频率的交易、异常大的购物车尺寸或购买*惯的突然变化。检测这些异常对标记潜在的欺诈活动至关重要,从而确保为真正的用户提供一个安全可靠的在线购物体验。
其他一些现实世界中的节点聚类任务示例如下:
-
网络入侵检测:在计算机网络中,识别表现出异常通信模式的节点(计算机或设备),例如数据传输突然增加或可疑的访问尝试,有助于检测潜在的安全威胁或入侵。
-
电信网络:电信网络中的节点可以是移动设备或通信塔。异常检测可以帮助识别异常的呼叫模式、意外的漫游行为或网络流量的突然激增。
-
金融欺诈检测:在金融交易网络中,异常检测可以识别可能表明欺诈活动的异常模式,例如洗钱或内部交易。
-
网络安全:通过检测不寻常的访问模式或数据传输行为,识别网络中被攻击的用户账户或设备。
接下来,让我们深入探讨边学*——连接节点并定义关系的关键。
边缘级学*
边缘级 学*是图机器学*的一个分支,专注于根据节点和边的特征以及图的结构,预测图中边的属性或标签。边缘级图学*在链接预测、推荐系统、欺诈检测和社交网络分析等任务中非常有用。
链接预测指的是预测图或网络中缺失或未来的边/链接的问题。给定一个网络的快照,目标是根据现有的图结构和节点属性,估算两个节点之间形成边的可能性。
在电子商务图中,链接预测可以用来预测用户与产品之间的潜在新边,代表未来的可能购买。具体来说,我们可以基于用户的历史交互以及类似用户的购买模式,预测用户可能感兴趣的产品。

图 2.4 – 电子商务用户-商品推荐的链接预测
在图 2.4中,我们看到,给定用户-商品交互的图数据,我们可以使用链接预测任务来判断向特定客户推荐某个产品是否会导致转化。
链接预测的一些实际应用包括:
-
推荐系统:链接预测可以根据用户的偏好、行为或反馈,推荐产品、服务或内容。例如,在一个电影流媒体服务中,节点代表用户和电影,边代表明确/隐式评分,链接预测可以用来估算客户对他们还未观看的电影的评分。
-
社交网络分析:链接预测可以用于分析社交网络的结构和动态,例如寻找社区、影响者或潜在的朋友。例如,在一个社交网络图中,节点代表用户,边代表朋友关系或互动,链接预测可以用来预测两位用户之间关系的强度或亲密度,或预测两位用户连接的概率。
现在,让我们探索链接预测与边分类任务之间的区别。
边分类
边分类是预测图中每条边的离散标签的任务,例如边的类型、类别或状态。例如,在一个电子商务图中,节点代表商品和顾客,边代表交易或评价,边分类可以用来分类每条边所表示的关系类型,如休闲浏览、认真兴趣或购买意图。这将帮助我们更好地理解用户行为和意图。

图 2.5 – 用于电子商务会话意图的边分类
在图 2 .5中,展示了边分类的应用,演示了如何根据用户的购买历史将用户划分为不同的细分群体。
一些实际的边分类应用示例如下:
-
出版物引用:在一个出版物引用网络中,节点代表论文,边代表引用,边分类可以用来将边分类为正面或负面,表示引用的情感或语气。
-
社交网络:在社交网络中,边分类可以用来将边分类为强关系或弱关系,表示用户之间关系的强度或亲密度。
类似于节点,回归也可以在图的边上执行。
边回归
边回归是预测图中边的连续值的任务,例如边的权重、强度或相似度。在电子商务的案例中,边回归可以用来估算顾客在做出购买决策之前,基于用户与各类相似商品的历史互动,以及其他用户和商品特征,所花费的时间。

图 2.6 – 用于预测发现和购买之间时间的边回归
图 2 .6 展示了我们如何使用边回归来预测连续标签,例如在某个特定商品上的停留时间。
一些实际的边回归应用示例如下:
-
预测地点间的交通流量:在一个道路网络图中,边回归可以基于历史流量和连接模式预测两个地点之间的交通量。这有助于交通优化。
-
预测产品共购率:在电子商务图中,边回归可以根据过去的共购数据预测未来两个商品可能会一起购买的频率。
边学*超越了监督学*的技术;它还可以应用于无监督学*方法。
边聚类
这是将图中的边缘根据其特征或标签分组的任务,使得同一组中的边缘彼此之间的相似度高于与其他组中的边缘。例如,在电子商务图中,边缘聚类可以用于识别具有相似模式的边缘组,比如频繁或高价值的购买。

图 2.7 – 基于交易价值的购买聚类
图 2 .7 展示了我们如何根据交易价值对边缘进行聚类,将相似的交易放入同一类别。
边缘聚类的其他应用如下:
-
账户间的金融交易聚类:边缘聚类可以将相似类型的货币转账或流动分组,有助于识别可疑的模式。
-
网页之间的超链接聚类:边缘聚类可以将网页之间的超链接分为多个类别,如导航链接、商业链接、关联链接等。
与节点类似,我们也可能遇到需要检测的异常边缘。
边缘异常检测
边缘异常检测是识别图中偏离正常模式的边缘的任务,比如那些具有异常特征、标签或连接的边缘。在电子商务图中,边缘异常检测可以用于检测欺诈交易和虚假评论等异常。以下列表列出了一些边缘级异常检测的应用。
边缘异常检测的一些应用如下:
-
检测欺诈性资金转移:在银行交易图中,识别出在不相关账户之间的异常高价值转账作为异常边缘,可能揭示潜在的欺诈行为。
-
检测未经授权的网络访问:在企业网络图中,边缘异常可能代表设备之间的稀有连接,表明有恶意行为者或已被攻破的设备。
-
检测股市操纵:在股票交易网络中,账户之间的异常边缘可能揭示非法交易共谋或“拉高出货”计划的模式。
在我们深入探讨前一部分的边缘学*复杂性时,可以看出其应用已经超越了传统的边界。接下来,让我们进入学*领域的最上层,关注图级学*。
图级学*
图级学*是指在整个图的层面上进行操作的机器学*任务和技术,而不是仅仅针对图中的单个节点或边缘。图级学*侧重于基于整个图或子图结构生成预测、分类或洞察。
图级预测
这里的目标是为整个图谱进行预测或分类,而不是单个节点或边。例如,给定一个特定时间的电商用户-商品交互图谱,我们可以基于图谱层级学*预测任何特殊事件或一般模式。在城市规划和交通管理中,图谱级预测 可用于预测整个道路网络的交通流量。这能够优化交通信号时间、路线规划和基础设施建设。

图 2.8 – 基于电商图谱快照的事件预测
图 2.8 展示了我们如何使用整个图谱在图谱层面进行某些预测。
图谱级表示
学* 图谱层级表示 涉及捕捉整个图谱的基本特征和特性。像 图神经网络(GNNs)这样的技术被用来聚合来自单个节点和边的信息,创建整个图谱的数值表示。

图 2.9 – 用浮点数向量表示图谱
图 2.9 展示了我们如何使用现代深度学*技术将整个图谱表示为一个嵌入向量。这些表示可以进一步用于构建下游任务的模型,如 回归、分类 或 聚类。
让我们通过整个流程来看看一个社交网络分析的示例用例:产品推荐
-
数据收集与图谱构建:从社交网络平台收集用户数据(节点)及其交互(边)。构建一个图谱,其中用户为节点,朋友关系或交互为边。包括用户属性(年龄、兴趣)作为节点特征,交互类型作为边特征。
-
GNN 模型:选择一个 GNN 架构(例如,图卷积网络(GCN)或 GraphSAGE)。定义 GNN 层的数量及其维度。
-
节点级表示学*:对于每个节点,使用 GNN 聚合来自其邻居的信息。这个过程为每个用户创建一个学*到的嵌入,捕捉他们的属性和网络结构。
-
图谱级表示:使用读出函数(例如,求和、平均或最大池化)来聚合节点嵌入。这一步生成一个表示整个图谱的单一向量。
-
训练过程:定义一个任务特定的损失函数(例如,产品推荐的二元交叉熵)。使用反向传播来更新 GNN 参数,优化图谱级任务。
-
图谱嵌入输出:训练好的模型现在会为任何输入图谱输出一个固定大小的向量(例如,128 维)。这个向量捕捉了社交网络的全局特性。
-
下游任务 – 产品推荐:将图嵌入作为分类器的输入,预测某个产品在网络中的受欢迎程度。根据产品成功和失败的历史数据训练该分类器。
-
部署和推断:对于一个新产品,生成当前社交网络图的嵌入。将这个嵌入输入到已训练的分类器中,预测该产品的潜在受欢迎程度。
正如我们所见,图层次学*在生物信息学、社交网络分析、化学和推荐系统等各种应用中都至关重要。图层次学*中使用的技术通常利用图的层次结构和关系特性来捕捉复杂的依赖关系,并在更高的抽象层次上进行预测。

图 2.10 – 节点、边和图层次学*
图 2 .10 将所有三个学*层次——节点、边 和 图——整合到同一个画布上。这展示了图学*如何在不同层次上运作。每个层次代表图结构中数据的不同方面,并且在每个层次上有特定的应用。
现实世界中的应用
本节将探讨图学*积极应用的一些领域。
推荐系统
图学*已经成为推荐系统领域中的一项强大工具,增强了其能力和有效性。推荐系统旨在预测用户的偏好并提供个性化建议,而图学*利用数据固有的关系结构,更高效地实现这一目标。

图 2.11 – 用户-物品链接预测用于推荐
图 2 .11 展示了如何将电子商务推荐中的用户-物品亲和度任务转化为链接预测问题。这个任务是推荐系统中一个领域的示例,在这个领域中,图学*可以发挥重要作用。
用户-物品图表示
图学*使得用户和物品可以作为图中的节点进行表示,边表示它们之间的交互或关系。这种表示方式捕捉了用户-物品交互中的复杂依赖关系和连接,从而更细致地理解用户偏好。
例如,在社交网络中,用户和帖子可以作为图中的节点进行表示,边 表示交互,例如点赞、评论或分享。然后,图学*可以捕捉用户与帖子的关系,从而实现个性化内容推荐。
隐式反馈与显式反馈
推荐系统通常处理显式和隐式反馈。图学*可以通过结合图结构来有效地建模隐式反馈,例如点击、浏览和停留时间,从而捕捉用户和物品之间的关系。这有助于在显式反馈稀缺时做出准确的预测。
基于邻域的推荐
基于图的推荐系统利用基于邻域的学*的概念。通过分析图中围绕某个用户或物品的局部结构,这些系统可以推荐与用户或其他相似用户已经互动或喜欢的物品相似的项目。
以电影推荐系统为例。可以通过分析邻域用户(具有相似品味的用户)喜欢或观看的电影来推测某个用户的偏好。图学*识别这些局部结构来推荐电影。
异构图
在现实场景中,推荐系统常常处理异构信息,包括用户、物品和各种互动。图学*可以处理异构图,其中节点代表不同类型的实体,从而更全面地建模关系和偏好。
例如,在学术论文推荐系统中,节点可以代表作者、论文、会议和关键词。异构图学*捕捉这些实体之间的关系,允许基于用户的研究兴趣进行个性化推荐。
冷启动问题
冷启动问题发生在新用户或新物品的互动历史有限时,这使得提供准确推荐变得具有挑战性。图学*可以通过利用图结构来缓解这一问题,基于相似的用户或物品识别和推荐项目,即使没有直接的互动,也能从多级跳跃中汲取学*。
时间动态
图学*可以扩展以捕捉推荐系统中的时间动态。通过在图中加入时间戳边缘,模型可以随时间适应用户偏好的变化,改善对不断变化的用户行为的推荐准确性。
例如,在新闻推荐系统中,包含文章和用户的图可以加入时间戳边缘。图学*可以考虑用户兴趣随时间的演变,确保最*的互动对推荐的影响大于较旧的互动。
我们将在第九章中探讨图学*方法来解决各种推荐系统问题。
知识图谱
知识图谱是捕捉关系和实体的结构化信息的强大表示。图学*可以显著增强知识图谱的能力,提供更细致的洞察、高效的查询和改进的推理。

图 2.12 – 电子商务知识图谱
接下来,我们将探讨知识图谱中图学*可以发挥重要作用的各个方面。
实体和关系嵌入
图学*技术,如 GNNs(图神经网络),可以为知识图谱中的实体和关系生成嵌入。这些嵌入捕捉实体和关系的潜在特征,从而实现更有效的表示和理解其基础语义。例如,在医学知识图谱中,图学*模型可以为疾病、症状和治疗生成嵌入。该模型捕捉潜在特征,帮助更细致地理解关系,如特定症状与疾病之间的关联。
链接预测
图学*在知识图谱中的链接预测任务中发挥着重要作用。通过分析现有结构,基于图的模型可以预测实体之间缺失的关系,帮助完善图谱并发现隐性连接。
考虑一个表示学术合作的科学知识图谱的例子。图学*通过识别尚未合作但有共同研究兴趣的研究人员之间的潜在合作关系,预测缺失的链接。
语义相似性和实体解析
图学*可以帮助确定实体之间的语义相似性。通过考虑图结构,模型可以识别相关实体,促进诸如实体解析之类的任务,其中不同的记录指向同一实体并将其连接起来。
例如,在零售公司客户数据的知识图谱中,图学*可以识别客户档案之间的语义相似性,帮助实体解析,通过链接指向同一客户的不同记录,无论它们存储在多个数据库中。
知识图谱补全
图学*可以通过预测缺失的事实来帮助解决知识图谱的不完整性问题。这对于生物学、医学和金融等领域的知识图谱尤其有价值,因为这些领域中的信息不断变化,可能导致不完整的表示。
本体对齐
图学*可以通过捕捉不同本体中实体之间的结构和语义关系来促进本体对齐。这对于整合来自不同来源的信息,并确保知识图谱之间的互操作性至关重要。
例如,在具有多个本体的医疗健康知识图谱中,图学*可以通过识别实体之间的关系和相似性来对齐本体,从而确保来自不同医疗来源的信息无缝集成。
图学*通过提供复杂的表示学*、推理和预测工具,丰富了知识图谱领域。随着基于图的技术与知识图谱的协同作用不断增长,我们可以预见将来会有更强大和智能的系统,用于组织、查询和从复杂的互联数据集中提取知识。
其他应用
让我们探索图学*在解决现实问题中积极应用的各种其他领域。
自然语言处理
自然语言处理(NLP)涵盖了多个关键应用领域,在这些领域中,图学*技术能够增强语言理解和处理能力。以下是图基方法做出重大贡献的主要领域:
-
语义表示 : 捕捉词汇之间的语义关系
-
命名实体识别(NER) : 提高实体识别准确性
-
共指消解 : 改进文本中的指代解析
-
依存句法分析 : 精确分析句子结构
-
情感分析 : 利用图连接进行细致的情感分析
-
问答系统 : 基于语义关系检索答案
-
对话系统 : 使用图结构管理对话型人工智能(AI)中的上下文
-
基于图的语言模型 : 集成上下文信息以更好地理解语言
网络安全
在网络安全领域,图学*作为分析复杂网络(如设备和用户之间的互联关系)的一种强大工具应运而生。通过利用基于图的模型,网络安全专家可以检测模式、异常和潜在威胁,从而以一种全面和积极的方式强化数字防御机制。
图学*在网络安全中的主要应用包括以下内容:
-
异常检测 : 识别网络流量中的异常模式
-
威胁情报 : 集成并分析威胁情报数据
-
攻击图分析 : 建模并分析潜在的攻击路径
-
用户行为分析 : 基于用户交互检测异常行为
-
漏洞评估 : 识别并优先处理系统漏洞
-
欺诈检测 : 通过图模式揭示欺诈活动
社交网络
图学*有助于揭示用户之间复杂的模式和关系。通过将社交结构建模为图,这种方法能够提取有价值的洞察,促进多个关键应用的发展:
-
社区检测 : 识别社交网络图中的凝聚群体
-
影响预测 : 预测网络中的影响力和信息流动
-
推荐系统 : 利用图数据增强个性化推荐
-
欺诈检测 : 通过社交关系揭示欺诈活动
-
意见动态:分析意见和信息在网络中的传播
-
用户参与预测:基于社交互动预测用户参与度
这些应用案例展示了图学*在不同领域的多样性,展示了它在解决多样化挑战中的适用性,能够深入理解社会动态,并优化在现代世界中不断演变的互联数据上构建智能的过程。
摘要
图提供了一个强大的框架,用于建模互联的现实世界系统,其中节点表示实体,边捕捉关系。节点级学*旨在预测单个节点的属性和行为,促进个性化推荐等应用。另一方面,边级学*深入分析实体之间的关系,支持链路预测和异常检测等任务。同时,图级学*提供了一个整体视角,以理解整体结构、识别社区并预测新兴模式,这在城市规划等应用中具有重要价值。
图学*在现实世界中的应用可以在推荐系统中得到体现,它增强了基于邻居的建议功能,解决了隐性反馈,并应对了冷启动问题。此外,知识图谱利用图学*技术生成实体和关系的嵌入,预测缺失的链接,对本体进行对齐,并补全缺失的信息。除了推荐系统和知识图谱,图学*还广泛应用于自然语言处理、网络安全、社交网络分析和生物信息学等多个领域。
在下一章中,我们将进一步探讨图表示学*的概念,该概念旨在将图结构编码为低维向量,并被各种机器学*任务所利用。
第三章:图表示学*
在解释了为什么将深度学*技术应用于图数据是值得的努力之后,让我们直接进入正题。在本章中,我们将向你介绍图 表示学*。
首先,我们将从传统的(基于表格数据的)机器学*(ML)的角度来审视表示学*,然后将这一思想扩展到图数据领域。接下来,我们将讨论在尝试学*图数据中的特征时需要解决的初步挑战。随后,你将了解几种简单的图表示学*算法,即Node2Vec和DeepWalk,并理解它们之间的差异。最后,我们将讨论这类浅层编码技术的局限性,以及为什么我们需要更强大的算法来捕捉图中的复杂关系。
我们还将介绍相关算法的 Python 实现。我们将选择 Python 作为编程语言,并主要使用PyTorch Geometric(PyG)库来实现我们的算法。其他库也很流行(例如Tensorflow-图神经网络(GNNs)),但 PyG 在本文写作时似乎是行业中最为成熟的。
在本章中,我们将涵盖以下主题:
-
表示学*——它是什么?
-
图表示学*
-
图学*框架
-
DeepWalk
-
Node2Vec
-
浅层编码的局限性
表示学*——它是什么?
现代与机器学*(ML)相关的任务和实验已经形成了一个标准化的工作流管道。以下是步骤的快速简化概述:
-
将业务/领域特定的问题转化为机器学*问题(监督学*或无监督学*,正在优化的度量标准,度量的基准水平等等)。
-
获取数据。
-
善待数据(通过基于现有列引入新列、填补缺失值等方式)。
-
在数据上训练一个机器学*模型,并在测试集上评估其性能。通过新的模型迭代这一步骤,直到达到令人满意的性能。
这份清单中最重要且最耗时的步骤之一是决定如何从现有的列中创建新列,以增加数据中指定的知识。
要理解这一点,我们先来了解一下什么是数据集。在数据集中,一行实际上只是一个事件的记录。行中的不同列(特征)代表了不同的变量(或维度、指标等),这些变量的值是在该事件中记录下来的。现在,为了让机器学*模型学*有用的信息,数据集中必须记录那些主要的有用特征的值。当我们称某些特征为有用时,指的是当这些特征的值发生变化时,会显著改变事件的整体结果。
让我们通过一个例子来理解这个问题。在自然语言处理(NLP)领域,一个极其流行的问题是预测给定前面几个单词后,下一个单词会是什么。我们不会深入探讨这个问题,而是集中在几个已经做出不同特征选择的场景上。这里的不同特征基本上就是前面的几个单词:
Feature_1 (F1): The last word of the unfinished sentence.
Feature_2 (F2): The 2nd last word of the unfinished sentence.
Feature_3 (F3): The 3rd last word of the unfinished sentence.
… and so on.
以以下未完成的句子为例:
As the sun set over the horizon, the mountains cast elongated ___.
特征(以及给定训练数据集下的期望单词)如下所示:
| F11 | F10 | F9 | F8 | F7 | F6 | F5 | F4 | F3 | F2 | F1 | P |
|---|---|---|---|---|---|---|---|---|---|---|---|
| As | the | sun | set | over | the | horizon | the | mountains | cast | elongated | shadows |
表 3.1 – 用于预测下一个单词的特征
通过理解什么是特征,我们来看一下可以作为合格特征用于模型训练的不同特征子集。让我们看三个不同的案例:
Case 1: All features with a lookback window of 10.
{F1, F2, F3, …, F8, F9, F10}
Case 2: The 10th last word to the 5th last word
{F5, F6, F7, F8, F9, F10}
Case 3: All even positioned last words till the 10th position
{F2, F4, F6, F8, F10}
在这个实例中,我们有以下训练集(括号中的单词表示模型需要预测的单词):
R1: As the sun set over the horizon, the sky turned a fiery (orange).
R2: As the sun set over the horizon, the clouds glowed with a golden (hue).
R3: As the sun set over the horizon, the ocean shimmered with reflected (light).
R4: As the sun set over the horizon, the landscape transformed into a (silhouette).
现在,让我们看看一旦对三个使用案例执行特征转换后,数据集会是什么样子。
这是案例 1:
| R | F10 | F9 | F8 | F7 | F6 | F5 | F4 | F3 | F2 | F1 |
|---|---|---|---|---|---|---|---|---|---|---|
| R1 | sun | set | over | the | horizon | the | sky | turned | a | fiery |
| R2 | set | over | the | horizon | the | clouds | glowed | with | a | golden |
| R3 | sun | set | over | the | horizon | the | ocean | shimmed | with | reflected |
| R4 | sun | set | over | the | horizon | the | landscape | transformed | into | a |
表 3.2 – 使用 10 的回看窗口的特征(案例 1)
这是案例 2:
| R | F10 | F9 | F8 | F7 | F6 | F5 |
|---|---|---|---|---|---|---|
| R1 | sun | set | over | the | horizon | the |
| R2 | set | over | the | horizon | the | clouds |
| R3 | sun | set | over | the | horizon | the |
| R4 | sun | set | over | the | horizon | the |
表 3.3 – 使用从倒数第 10 个到倒数第 5 个窗口的特征(案例 2)
最后,我们有案例 3:
| R | F10 | F8 | F6 | F4 | F2 |
|---|---|---|---|---|---|
| R1 | sun | over | horizon | sky | a |
| R2 | set | the | the | glowed | a |
| R3 | sun | over | horizon | ocean | with |
| R4 | sun | over | horizon | landscape | into |
表 3.4 – 使用偶数索引单词的特征(案例 3)
在哪个案例中,您认为模型会学到有用的东西?
案例 1,毫无疑问。这个例子可能很简单,但它展示了特征选择的决策如何深刻影响模型在整个流程中的表现。特征选择是一个步骤,它涉及从原始数据中挑选出有用的信息;这个步骤中的错误可能会带来灾难性的后果。
在理解了特征选择为何是重要的一步后,我们回到关于表示学*的讨论。表示学*几乎在机器学*的所有子领域中都可以遇到。
在图像领域,表示学*最初沿着传统统计方法的线路进行探索,例如主成分分析( PCA )。然而,考虑到要学*的数据是像素数据,或者等效地说,是一组浮点值的二维矩阵,研究了更适合该任务的其他想法。在这一领域最成功的想法是使用卷积滤波器从数据矩阵中提取有意义的模式。这是现代图像处理中大部分机器学*任务的基础驱动力。卷积神经网络( CNN )的初始层依赖于找到合适值的滤波器,以便在通过图像时从中提取有意义的模式。
在自然语言领域,特征学*的关键突破是理解每个标记与其前一个标记的依赖关系。需要制定一种表示,该表示在我们通过每个标记时进行学*,同时保持到目前为止所学知识的状态。循环神经网络( RNNs )保持了记忆的概念,其中,随着标记的顺序传递,内存向量基于内存状态和新标记进行更新。其他架构,如长短期记忆( LSTM ),改进了 RNN 模型,以支持更长范围的依赖关系和标记之间的交互。其他传统方法包括算法如GloVe和Word2Vec,它们属于浅层变体。
在表格数据中,有几种经过验证的特征操作方法可用于去噪和从数据中提取有意义的信息。常见的降维方法如 PCA 和编码器-解码器网络在工业中证明了它们的有效性。使用矩阵分解方法处理不完整和稀疏的交互矩阵,以生成嵌入向量已成为构建面向业务的技术(如搜索和推荐引擎)的非常有效的第一步。
在表示学*领域的创新列表是无穷无尽的。关键是,表示学*与所解决问题的领域密切相关。实际上,这是一种引导算法的方式,使其使用更有效的技术而不是通用架构,并且不利用其试图学*的底层数据的不变模式。
图表示学*
在前一部分,我们讨论了在不同类型数据(如图像、表格和文本)上进行表示学*的必要性。在这一部分,我们将尝试将这一思路扩展到图数据上。从理论上讲,图数据比我们迄今为止处理过的所有其他数据表示方法(如图像的矩阵、文本的词令和表格)更具表达力。随着表达能力的增强,挑战也随之而来,如何找到一种表示框架,以捕获相关信息,尽管数据表示本身施加的约束较少。文本中的词语是顺序的,图像中的像素以二维矩阵形式表示,而表格数据假设行之间是独立的(大多数情况下)。
数据中固有的这种模式使我们在表示学*阶段可以加以利用(想想词的 skip-grams 或图像的卷积滤波器)。然而,图中的约束非常松散——实际上松散到没有明显的模式可供利用。图数据相比其他形式的数据,提出了两个主要挑战:
-
计算成本增加:表示学*的目标之一是输出能使模型学*更明显模式的特征。如在《第一章》中讨论的那样,图中有几个有用的特性可以利用,从而进行快速推理。理解两个节点之间的最短路径是一个可以添加到表示中的有用特征,但计算这个最短路径平均需要

在这种情况下,余弦相似度函数,
定义如下:

解释在机器学*领域已经有了广泛的研究,因此这里没有展开详细说明。简而言之,余弦相似度可以看作是两个向量在向量空间中方向相似度的得分。指向几乎相同方向的向量会有接* 1 的余弦相似度得分,而互相垂直的两个向量则会有接* 0 的得分。
容易的部分是定义嵌入之间的相似度得分。现在,我们需要为图中的节点之间定义一个相似度得分。
随机游走 – 它是什么,为什么要这样做
我们如何定义图中两个节点之间的相似度?是否可以简单地说,如果它们通过边直接连接,则赋值为 1;如果它们没有直接连接,但有共同的邻居,则赋值为共同邻居的自然对数;如果不满足这两个条件,则赋值为 0。
可以投入很多思考来找到两个节点之间相似性的最佳定义,你可以想象这个定义需要接*图的一个关键结构特性。所有试图定义节点间相似度的启发式方法都有其优缺点。然而,我们可以实现一个简单且数学上优雅的想法:随机游走。
随机游走的概念是相当直观的。该算法用于在图中找到某个节点的邻域,假设是
。根据某种策略,假设是
(我们稍后会解释策略的含义),我们尝试找到那些属于
邻域的元素;这里,邻域是
。以下步骤解释了该算法:
-
从
开始,我们通过策略
来决定(带有一定的随机性)应该跳到与
相连接的哪个节点。我们将该节点称为
。将
添加到集合
中。 -
重复步骤 1,但从
开始,而不是
。策略的输出将是
,并将其添加到
中。重复此过程,直到你的集合中有足够的条目为止。
就这样!我们几乎完成了算法中的随机游走步骤。在我们考虑随机游走如何生成邻域之前,先来讨论一下策略。该策略,
,决定了我们应该从前一个节点跳到哪个节点。最简单的策略是随机选择,在所有连接的节点中,你以与其他节点相同的概率随机选择一个节点。也可以采用其他策略,例如,可以对未访问过的节点给予更多偏向,而不是反复将相同的节点添加到邻域中。不同策略的选择通常是此类浅层嵌入学*算法之间的区分因素。
为什么是随机游走?随机游走是一种有效采样图中重要特征的好方法。首先,如果我们注意到某个节点在另一个节点的随机游走邻域中出现的概率很高,我们可能会得出它们应该非常相似的结论。这样的技术不依赖于复杂的启发式方法,而这些方法通常受限于连接的度数。基于随机游走的采样不需要担心连接度数,就能在统计层面上找出最适合成为邻域一部分的候选节点。其次,它是一种快速高效的采样方式。训练步骤不需要评估图中所有的节点,只需要关注邻域中的节点。
在下一小节中,我们将基于对随机游走的理解,提出一种估计嵌入分量的方法。
节点嵌入的估计
现在我们已经了解了节点的邻域集合
,针对节点
,让我们理解它如何与学*节点嵌入的任务相关。回想一下,在我们开始讨论随机游走之前,我们关注的子问题是找到一种方法来估计图中两个节点的相似性。为图中的节点提出相似性函数是一项艰巨的任务,但我们能否对这个相似性分数做出一些有指导性的假设呢?
一个重要的假设可能如下:“当两个节点相似时,一个节点很可能位于另一个节点的邻域内。” 如果我们假设这个说法是正确的,那么我们几乎解决了问题。现在,我们可以利用这个假设来得出节点的嵌入。无需深入探讨概率魔法(例如似然函数等),这个想法的关键是,如果在图空间中这个假设成立,那么在定义嵌入的向量空间中它也必须成立。如果是这样的话,我们需要找到嵌入空间,使得当一个节点位于另一个节点的邻域内时,似然函数能够最大化。
所以,如果
是节点
的嵌入向量,我们可以找到
的分量,以便最大化以下值:

概率的负对数是对数似然函数的一种形式。现在,由于这必须在所有节点及其嵌入中都成立,我们必须在考虑所有节点的同时优化这些分量,本质上是最大化:

最后的步骤是将概率函数与我们之前定义的相似度函数联系起来。在嵌入空间内创建概率分布的一种常见方法是使用softmax函数,它将一个函数转换为概率密度函数:

这里,
是我们之前定义的余弦相似度函数。通过将这个定义代入到我们的优化度量中,我们得到了需要优化的损失函数的最终参数化形式:

使用梯度下降法,我们将找到嵌入,
,以使得
最大化。这将确保我们找到符合我们标准的嵌入。
请注意,优化过程还有其他一些步骤,使得该过程在计算上可行,其中最重要的一步是负采样的概念。在这里,我们并不是在每次迭代中计算softmax函数对所有节点的归一化组件(分母),而是随机选取一些不在目标节点邻域中的节点,并计算它们的总和。这种优化问题被称为噪声对比估计,它是 NLP 学*任务中的一种常见技术。它通常被称为跳字模型。
在我们结束这一部分时,也许是时候提一下,前述的完整算法被称为DeepWalk,正如原始论文中所述,该论文于 2014 年发布(dl.acm.org/doi/10.1145/2623330.2623732)。DeepWalk 算法是一个高效的浅层编码估计过程。然而,这种方法的简洁性也是其主要缺点之一:随机无偏的随机游走策略常常会偏离目标节点太远,因此它会采样到与目标节点不太局部的邻域。因此,嵌入表示并没有基于节点的最局部信息进行优化。其他一些算法在本文的工作基础上进行了改进。我们将在下一节讨论一个这样的显著改进,称为Node2Vec。
下面是 DeepWalk 的伪代码:
function DeepWalk(Graph G, walk_length L, num_walks R, dimensions d):
Initialize walks = []
for each node v in G:
for i = 1 to R:
walk = RandomWalk(G, v, L)
append walk to walks
model = Word2Vec(walks, dimensions=d)
return model
function RandomWalk(Graph G, start_node v, length L):
walk = [v]
for i = 1 to L:
neighbors = GetNeighbors(G, v)
next_node = RandomChoice(neighbors)
append next_node to walk
v = next_node
return walk
上述伪代码概述了两个主要功能:
-
首先,DeepWalk为图中的每个节点生成多个随机游走,并使用 Word2Vec 创建嵌入表示。
-
其次,RandomWalk执行一次从给定节点出发、指定长度的随机游走。
Node2Vec
DeepWalk 算法使用无偏的随机化游走来生成任何目标节点的邻域。其无偏的特性确保了图结构以统计上最佳的方式被捕捉,但在实际应用中,这通常并不是最优的选择。Node2Vec 的前提是,我们在随机游走策略中引入偏差,确保采样以一种方式进行,使得图的局部和全局结构都能在邻域中得到体现。Node2Vec 中的大多数其他概念与 DeepWalk 相同,包括学*目标和优化步骤。
在我们深入探讨算法的细节之前,让我们快速回顾一下图遍历方法。
图遍历方法
正如我们在第一章 中简要介绍的,图遍历的两种最常见方法是广度优先搜索 (BFS) 和 深度优先搜索 (DFS)。BFS 是图探索中的局部优先方法,在这个方法中,从一个起始节点出发,首先会探索所有一度连接,再远离起始节点进行探索。DFS 则采取全局优先的图探索方法,其重点是在到达叶子节点后回溯之前尽可能深入地探索图。DeepWalk 算法中使用的随机游走策略在统计学上更接* DFS 方法,而不是 BFS 方法,这就是为什么邻域中的局部结构被低估的原因。
随机游走策略如何模拟 BFS 和 DFS?
首先,让我们考虑 DFS 的情况。在随机游走过程中,当当前节点是某个节点时,我们有两个选择:访问上一个访问过的节点,或者访问另一个节点。如果我们能确保当当前节点没有其他连接节点时,才发生第一个选择,那么我们可以确保随机游走遵循 DFS 遍历。
为了让随机游走模拟 BFS,需要更多的考虑。首先,随机游走的实体需要跟踪上一步来自哪个节点。从当前节点出发,我们有三种选择:回到上一个节点,去一个比上一个节点更远的节点,或者去一个与当前节点等距的节点。如果我们最小化第二种选择的发生概率,就可以有效地实现 BFS 遍历。
所以,我们可以在随机游走算法中加入偏差,以模拟 BFS 和 DFS 的遍历模式。有了这些知识,我们可以对随机游走进行更精细的控制,使得邻域包含我们感兴趣的局部结构和全局结构的表示。
完善随机游走策略
让我们正式化之前提到的策略。为此,我们将使用两个超参数:p 和 q。第一个超参数 p 与决定随机游走是否会回到上一步所经过节点的权重相关。第二个超参数 q 决定随机游走是否有可能去更远的节点,或者是否会偏向于此。它也可以被理解为一个参数,用来决定 BFS 策略相对于 DFS 策略的偏好程度。图 3.1 中的例子可以帮助说明这一点:

图 3.1 – 展示 Node2Vec 超参数效果的小图
看看这个图。在这里,随机游走在上一步从节点n L 迁移到了n。在当前步骤,它需要决定应该迁移到哪个节点,选择的节点有n 1 、n 2 或n L。下一步的迁移概率由超参数p和q决定。假设c是迁移到n 1 的概率。那么,迁移到n L 的概率是c/p,而迁移到n 2 的概率是c/q。在这里,c应该是使得所有概率的总和为 1 的值。
为了澄清这一点,概率值之所以是这样,是因为每个节点所代表的含义;n L 是上次访问的节点,因此它的访问会额外加权p值。在这里,n 1 是 BFS 选项,因为它与n L 的距离与n的距离相同,而n 2 是 DFS 选项,因为它距离n L 更远。这就是它们访问比例是q的原因。
通过这种为每一步邻域创建赋予偏差的策略,我们可以确保邻域既包括与目标节点的局部上下文相关的节点,也包括与其全局上下文相关的节点。请注意,这种随机游走策略被称为二阶随机游走策略,因为我们需要保持一个状态——即,知道从哪个状态开始走的。
这是 Node2Vec 的伪代码:
function Node2Vec(Graph G, walk_length L, num_walks R, dimensions d, p, q):
Initialize walks = []
for each node v in G:
for i = 1 to R:
walk = BiasedRandomWalk(G, v, L, p, q)
append walk to walks
model = Word2Vec(walks, dimensions=d)
return model
function BiasedRandomWalk(Graph G, start_node v, length L, p, q):
walk = [v]
for i = 1 to L:
current = walk[-1]
previous = walk[-2] if len(walk) > 1 else None
next_node = SampleNextNode(G, current, previous, p, q)
append next_node to walk
return walk
Node2Vec 通过引入受p和q参数控制的有偏随机游走来扩展 DeepWalk。BiasedRandomWalk函数使用这些参数来平衡探索局部邻域(q)和到达更远节点(p)之间的关系,从而实现更灵活的图结构探索。
Node2Vec 与 DeepWalk
接下来的步骤与 DeepWalk 中提到的步骤相同。我们尝试最大化目标节点邻域中嵌入的节点与目标节点之间的相似度。这个优化步骤在所有节点上执行时,可以为我们提供最优的嵌入。与 DeepWalk 的不同之处在于,嵌入的优化目标不同。在 DeepWalk 中,节点的邻居选择与 Node2Vec 情境中的选择不同。
到此为止,我们已经覆盖了两种最流行的浅层图表示学*算法。我们已经了解了 DeepWalk 和 Node2Vec 这两种相似的算法如何优雅地使用随机游走方法生成浅层节点嵌入。然而,我们也需要理解这种方法的局限性,因为这些限制将为本书后续讨论的主题提供动机。
浅层编码的局限性
浅层嵌入的优点是易于理解且相对容易实现。然而,它们也有几个缺点,尤其是与深度编码技术相比:
-
这种方法无法结合节点或边级别的特征。在使用图数据时,通常会附加辅助信息到每个节点或每条边上,以描述进一步的属性。默认情况下,随机游走方法无法将这些信息融入其嵌入中。
-
它们可能在计算上非常昂贵。为什么?如果我们对某一维度的嵌入感兴趣,d,且节点数为v,那么我们需要学*总共v.d个值。具有隐藏层的深度方法可能会有更少的参数需要学*,从而使得过程在计算上更为高效。
-
从前面的内容出发,由于在这种方法中需要学*的参数非常多,我们通常无法利用通过使表示更加密集所带来的优势。更密集的表示(使用更少的参数)通常能减少学*到的噪声。显然,低于某一最小阈值时,参数的数量将过少,无法有效地表示正在学*的图数据的复杂性。
-
最后,浅层编码的学*方法没有提供将图推断任务融入学*问题中的功能。这些嵌入是基于图结构学*的,旨在用于一般用途,而不是针对特定的推断任务进行优化。
许多这些局限性可以通过更为复杂的架构来克服,这些架构经过优化,可以学*节点嵌入。
摘要
在本章中,我们介绍了图表示学*,这是使用机器学*处理图数据领域的一个基本概念。首先,我们讨论了表示学*在机器学*中的一般意义。当专注于图时,你了解到表示学*的主要目标是找到能够模拟图结构的嵌入,并学*执行推断任务所必需的关键概念(如果有的话)。
我们还探讨了 DeepWalk 和 Node2Vec,这两种流行的图表示学*方法,它们是一类利用随机游走生成节点邻域的算法。基于这个邻域,你可以优化嵌入值,使得邻域中节点的嵌入与相关节点的嵌入高度相似。最后,我们探讨了在实际应用中使用这些方法的缺点。
在下一章中,我们将专注于最流行的深度学*架构,这些架构可以用于学*图节点的嵌入。你将学*这些架构如何利用图中的模式,同时保持图数据中的不变性。
第二部分:高级图学*技术
本书的这一部分将探索图形学*中的高级概念,包括图形的深度学*架构、该领域的常见挑战以及大型语言模型的整合。你将了解图形人工智能系统中的最前沿方法、技术挑战和新兴解决方案。
本部分包含以下章节:
-
第四章,图形的深度学*模型
-
第五章,图形深度学*挑战
-
第六章,利用大型语言模型进行图形学*
第四章:图的深度学*模型
*年来,随着图神经网络(GNNs)的出现,机器学*领域迎来了范式转变,GNN 成为了处理图结构数据预测任务的强大工具。在这里,我们将深入探讨 GNN 的变革潜力,强调其作为可优化变换的作用,能够处理多样的图属性,如节点、边缘和全局上下文,同时保持重要的图对称性,尤其是排列不变性。
GNN 的基础在于信息传递神经网络(MPNN)框架。通过该框架,GNN 利用一种复杂的机制,在图结构中进行信息交换和聚合,使得模型能够捕捉数据中的复杂关系和依赖性。
GNN 的一个显著特点是遵循图输入,图输出架构。这意味着模型接受一个图作为输入,该图包含嵌入在节点、边缘和全局上下文中的信息。这种固有的结构与许多现实世界的问题相吻合,数据通常展现出复杂的关系和依赖性,最适合通过图来表示。
GNN 的优势在于其能够在不改变图的连接性的情况下,对输入图执行逐步的嵌入变换。这一逐步变换确保了模型不断优化对数据中潜在模式和结构的理解,从而提升预测能力。
本章将涵盖以下主题:
-
图中的信息传递
-
解码 GNN
-
图卷积网络(GCNs)
-
图采样与聚合(GraphSAGE)
-
图注意力网络(GATs)
技术要求
本章要求读者具备图和表示学*的基本理解,这些内容已在前几章中讲解。章节中的代码以及 GitHub 上的代码可以直接在 Google Colab 上使用,只需额外安装PyTorch Geometric(PyG)包。书中的代码示例可以在其 GitHub 仓库中找到:github.com/PacktPublishing/Applied-Deep-Learning-on-Graphs。
图中的信息传递
与传统的神经网络不同,GNN(图神经网络)需要考虑图的固有结构,使得节点能够交换信息并根据其局部邻域更新自身表示。这一核心机制是通过信息传递实现的,这是一个节点间迭代传递信息并聚合邻居信息的过程。
GNN 在图结构数据上进行操作,并使用信息传递机制基于邻居节点的信息更新节点表示。让我们深入探讨 GNN 中信息传递的数学解释。
考虑一个无向图
,其中
是节点集合, 表示节点  的邻居集合。
节点  的聚合消息是通过聚合其邻居的信息计算得出的:

聚合函数可以有所不同(例如,求和、均值或注意力加权和)。
-
更新函数:
-
基于聚合的消息
和当前节点表示
,更新节点表示
。 -
UPDATE 函数
(
) 是一个神经网络层,它将聚合的消息和当前节点表示作为输入,并生成更新后的表示:
-
= 
UPDATE 函数通常涉及一个具有可学*参数的神经网络层。
这些步骤会迭代应用固定次数,或直到收敛,以细化节点表示。整个过程可以通过几个公式表达:


这些方程捕捉了图神经网络(GNN)中信息传递机制的本质。聚合函数、更新函数以及迭代次数的具体选择取决于 GNN 的架构(例如,GraphSAGE、GCN、门控图神经网络(GGNNs)等)。
例如,在一个简单的GraphSAGE公式中,聚合函数可能是均值操作,更新函数可能是一个简单的神经网络层:


这里,
是一个激活函数,
是一个可学*的权重矩阵,而
是连接操作。

图 4.1 – 图中的信息传递
通过这些迭代步骤,信息传递使得节点能够学*到不仅仅是自身的内在特征,还能从其连接的邻居以及图的整体结构中获取信息。这使得 GNN 能够有效地建模图结构数据中的复杂关系和依赖。
现在,让我们尝试理解如何正式定义 GNN。
解码 GNN
GNN 是一种神经网络架构,旨在处理图结构数据。它学*一个函数,将图及其相关特征映射到一组节点级、边级或图级的输出。以下是 GNN 的正式数学定义。
给定一个图
,其中
是节点集,
让我们分解一下:
-
是第
节点在第
层的表示,且满足条件
。其中,
表示一个实值向量空间,维度为
。 -
UPDATE 函数
是一个可学*的函数,通过基于节点先前的表示和从邻居聚合的消息来更新节点表示。 -
聚合(AGG)函数
是一种置换不变的聚合函数,结合了相邻节点的表示。常见选择包括求和、平均值和最大值。 -
表示图
中节点
的邻居集合。
在
层消息传递和聚合之后,最终的节点表示由
代表所有
。
更新函数通常实现为神经网络,如多层感知器(MLPs)或注意机制,具有可学*参数。
对于图级任务,会应用一个 READOUT 函数来获取最终的节点表示以获得图级表示:

在这里,READOUT是一个排列不变的函数,它将节点表示聚合为一个单一的向量,如求和、均值或更复杂的池化操作。
图级别的表示
随后可以用于下游任务,如图分类或回归。
这是图神经网络(GNN)的一个通用公式框架,许多具体的架构都属于这一框架,例如 GCN、GraphSAGE、GAT 和 MPNN 等,每种架构都有自己不同的UPDATE、AGG和READOUT函数变体。
让我们理解图学*如何借用卷积网络的概念,并利用它从图中提取学*。
GCN
GCN是 GNN 的一种特定类型,它将卷积的概念扩展到图结构化数据。GCN 通过聚合来自邻*节点的信息来学*节点表示,从而能够捕捉节点特征和图结构。
在 GCN 中,第 l 层的图卷积操作
定义如下:

让我们来分解一下:
-
是层
中节点表示的矩阵,其中
是输入节点特征。 -
是添加了自环的邻接矩阵
,其中
是单位矩阵。 -
是
的对角度矩阵,其中
. -
是一层的可学*权重矩阵
。 -
是一个非线性激活函数,例如修正线性单元(ReLU)函数或 sigmoid 函数。
术语
是对称归一化邻接矩阵,它确保节点表示在不同层之间的一致性。
想象一个引用网络,其中每个节点代表一篇科学论文,每条边代表连接两篇论文的引用。每篇论文有一个特征向量,代表其内容(例如,词袋模型)。GCN 可以通过学*节点表示来将论文分类到不同的类别(例如,计算机科学、物理学、生物学),这些节点表示同时捕捉了内容和引用网络的结构。
基于我们对 GCN 的数学理解,接下来我们来看一段使用 PyG 的示例代码:
import torch
import torch.nn.functional as F
from torch_geometric.datasets import Planetoid
from torch_geometric.nn import GCNConv
# Load the Cora dataset
dataset = Planetoid(root='data/Cora', name='Cora')
对于这个示例,我们导入必要的库,并使用 PyG 中的Planetoid类加载Cora 数据集。Cora 数据集是一个引用网络数据集,其中节点代表科学论文,边代表论文之间的引用。该数据集包含 2,708 个节点,10,556 条边和 7 个类别,表示不同的研究领域:
# Get the graph data
data = dataset[0]
# Print some statistics about the graph
print(f'Number of nodes: {data.num_nodes}')
print(f'Number of edges: {data.num_edges}')
print(f'Number of features: {data.num_features}')
print(f'Number of classes: {dataset.num_classes}')
在这里,我们通过dataset[0]访问图数据。然后,我们打印一些关于图的统计信息,包括节点数、边数、特征数和类别数:
Number of nodes: 2708
Number of edges: 10556
Number of features: 1433
Number of classes: 7
现在我们已经理解了数据的结构,让我们来构建模型的基本模块:
# Define the GCN model
class GCN(torch.nn.Module):
def __init__(self, in_channels, hidden_channels, out_channels):
super(GCN, self).__init__()
self.conv1 = GCNConv(in_channels, hidden_channels)
self.conv2 = GCNConv(hidden_channels, out_channels)
def forward(self, x, edge_index):
x = self.conv1(x, edge_index)
x = F.relu(x)
x = F.dropout(x, training=self.training)
x = self.conv2(x, edge_index)
return F.log_softmax(x, dim=1)
接下来,我们定义 GCN 模型。该模型由两层 GCN(GCNConv)组成,中间有一个隐藏层。init方法使用指定的输入、隐藏和输出维度来初始化层。forward方法定义了模型的前向传播过程,其中x和edge_index会传递到 GCN 层。ReLU 激活函数和 dropout 会在第一层之后应用,log-softmax则应用于第二层的输出:
# Set the model parameters
in_channels = dataset.num_node_features
hidden_channels = 16
out_channels = dataset.num_classes
# Create an instance of the GCN model
model = GCN(in_channels, hidden_channels, out_channels)
在这里,我们根据数据集设置模型的参数。输入维度(in_channels)设置为数据集中的节点特征数,隐藏维度(hidden_channels)设置为16,输出维度(out_channels)设置为数据集中的类别数。然后,我们用这些参数创建一个 GCN 模型的实例:
# Define the optimizer and loss function
optimizer = torch.optim.Adam(
model.parameters(), lr=0.01, weight_decay=5e-4)
criterion = torch.nn.NLLLoss()
# Train the model
model.train()
for epoch in range(200):
optimizer.zero_grad()
out = model(data.x, data.edge_index)
loss = criterion(out[data.train_mask],
data.y[data.train_mask])
loss.backward()
optimizer.step()
在这一部分,我们定义了优化器(Adam)和损失函数(负对数似然损失(NLLLoss))以训练模型。我们将学*率设置为0.01,权重衰减设置为5e-4。
然后我们训练模型 200 个周期。在每个周期中,我们执行以下操作:
-
将优化器的梯度清零。
-
对节点特征和边索引执行前向传播。
-
使用模型输出和训练节点的真实标签(由data.train_mask指定)计算损失。
-
执行反向传播以计算梯度。
-
使用优化器更新模型参数:
# Evaluate the model model.eval() _, pred = model(data.x, data.edge_index).max(dim=1) correct = float(pred[data.test_mask].eq( data.y[data.test_mask]).sum().item()) accuracy = correct / data.test_mask.sum().item() print(f'Accuracy: {accuracy:.4f}') Accuracy: 0.8000
最后,我们在测试集上评估训练后的模型。我们通过model.eval()将模型设置为评估模式。我们对整个图进行前向传播,并使用max(dim=1)获得预测的类别标签。然后,我们通过比较预测标签和测试节点的真实标签(由data.test_mask指定)来计算准确率。
这段代码提供了一个使用 PyG 在 Cora 数据集上实现 GCN 的基本实现。
注意
在运行此代码之前,请确保已安装 PyG。您可以使用pip install torch-geometric来安装它。
总体而言,这段代码创建了一个 GCN 模型实例,使用指定的超参数(隐藏单元、学*率、周期数)在 Cora 数据集上进行训练,并在测试集上评估训练后的模型,以衡量其在准确度方面的表现。
使用 GCN 执行不同的图任务
GCN 可以用于在图中不同层次上学*和执行任务。以下是 GCN 可以执行的任务:
-
节点级任务:GCN 可用于节点分类,目标是预测图中每个节点的标签。这在前面的示例中有所展示,其中 GCN 用于分类 Cora 引文网络中的节点。
-
边级任务:GCN 可以适应边预测或链接预测任务,目标是预测图中边的存在性或属性。为此,可以使用 GCN 学*到的节点表示来计算边的得分或概率。
-
图级任务:GCN 可用于图分类或回归任务,目标是预测整个图的标签或连续值。为此,需要对 GCN 学*到的节点表示应用池化操作(例如全局平均池化或全局最大池化),以获得图级表示,然后将其输入分类器或回归器。
GCN 是强大且广泛使用的图神经网络(GNN)类型,通过结合节点特征和图结构,能够有效地学*节点表示。它们在各种基于图的任务中表现出色,且可以适应节点级、边级和图级的问题。
随着时间的推移,许多对原始 GCN(图卷积网络)进行优化的方案相继被提出,并在行业中得到了应用。其中一种优化方法,尤其适用于扩展图学*过程的,是 GraphSAGE。
GraphSAGE
GraphSAGE引入了一种可扩展且自适应的图表示学*方法,解决了 GCN 的一些局限性,并增强了其可扩展性。GraphSAGE 的核心在于采用了邻域采样与聚合策略,突破了 GCN 固定权重聚合机制的限制。
在 GraphSAGE 中,学*节点表示的过程涉及反复从局部邻域中采样和聚合信息。设
是一个图,其中包含节点
和边
,且
表示节点
在第
层的嵌入。GraphSAGE 的更新规则可以表示如下:

这里,
表示节点
在每次迭代中动态采样的邻居子集。这种适应性使得 GraphSAGE 比 GCN 在大规模图或计算资源有限的情况下更高效,保持了可扩展性。
PyG 代码的结构与 GCN 相同;我们只是使用torch_geometric.nn中的GraphSAGE模块。
要修改之前的代码以使用 GraphSAGE 而非 GCN,你需要做一些更改。以下是需要更新的代码行:
-
将GCNConv的import语句替换为SAGEConv:
from torch_geometric.nn import SAGEConv -
更新GCN模型类,使用SAGEConv层代替GCNConv:
# Define the GraphSAGE model class GraphSAGE(torch.nn.Module): def __init__(self, in_channels, hidden_channels, out_channels): super(GraphSAGE, self).__init__() self.conv1 = SAGEConv(in_channels, hidden_channels) self.conv2 = SAGEConv(hidden_channels, out_channels) def forward(self, x, edge_index): x = self.conv1(x, edge_index) x = F.relu(x) x = F.dropout(x, training=self.training) x = self.conv2(x, edge_index) return F.log_softmax(x, dim=1) -
更新model创建行,以使用GraphSAGE模型而不是GCN:
# Create an instance of the GraphSAGE model model = GraphSAGE(in_channels, hidden_channels, out_channels)
做出这些更改后,代码将使用 GraphSAGE 模型而不是 GCN。其余代码,包括数据集加载、训练和评估,保持不变。

图 4.2 – 利用邻域采样的 GraphSAGE 网络
有时,根据邻居与特定节点的相关性,为邻居分配不同的权重是一个好主意。我们现在来看一下 GAT,它借用了语言模型中的注意力概念。
GAT
GAT 是GCN的扩展,结合了注意力机制,根据邻居节点的相关性为其分配不同的权重。虽然GCN应用固定的聚合函数来组合邻居节点的特征,GAT通过在聚合过程中学*每个邻居的重要性,提供了更灵活和自适应的方法。GAT的核心就是注意力网络。
注意力网络
注意力网络,通常被称为注意力机制或注意力模型,是机器学*和人工智能中的一个强大概念,特别是在神经网络领域。它的灵感来源于人类注意力的工作方式——在处理信息时专注于输入数据的特定部分。
注意力机制使模型能够动态地关注输入数据的不同部分,赋予每个部分不同程度的重要性或关注度。这使得模型在做出预测或决策时,可以权衡不同输入的相关性。
注意力网络通常用于涉及序列数据的任务,如自然语言处理(NLP)任务,包括机器翻译、文本摘要和情感分析。在这些任务中,模型需要处理一系列单词或标记,并理解它们之间的上下文关系。通过使用注意力机制,模型可以有效地捕捉长程依赖,并关注输入序列中相关的部分。
这是在图学*中如何利用注意力机制:
-
在 GATs(图注意力网络)中,注意力机制用于计算节点与其邻居之间的注意力系数。
-
注意力系数表示每个邻居特征对目标节点的重要性。
-
注意力机制通常通过 MLP(多层感知机)或单层神经网络来实现。
-
注意力系数是基于学*到的注意力机制的权重以及目标节点和其邻居的特征来计算的。
让我们看看如何在图的设置中计算注意力系数。
注意力系数的计算
对于每个节点,计算其所有邻居的注意力系数。节点
和其邻居
之间的注意力系数按以下方式计算:

-
是连接操作,而
是泄漏 ReLU 激活函数。 -
和
分别表示节点
和
的学*到的节点嵌入表示。 -
是一个可学*的注意力权重向量,该向量在所有节点中共享。
注意力系数使用softmax函数进行归一化,以确保每个节点的系数和为 1。
现在我们理解了如何计算注意力系数,接下来让我们看看这些系数是如何在 GNN 的聚合步骤中被利用的。
邻居特征的聚合
一旦计算出注意力系数,就使用加权和对邻居节点的特征进行聚合。
节点
的聚合特征计算如下:

这里,
是一种非线性激活函数,如 ReLU。聚合特征
代表了节点
在考虑了邻居的重要性后的更新表示。

图 4.3 – 由节点 1 在其邻域上执行的多头注意力(K = 3 个头)
为了捕捉节点之间关系的多个方面,我们可以利用多头注意力的概念。
多头注意力
在 GNN 中,多头注意力可以作为传统注意力的扩展,应用于学*节点的表示。每个“头”可以看作是应用于节点邻域的不同视角或注意力机制。通过并行运行多个头,GNN 可以捕捉节点局部图结构和特征空间的多样化方面。这使得模型能够以多种方式聚合来自邻居节点的信息,从而增强其学*节点表示的能力,这些表示融入了图中多种模式和关系。
在多头注意力中,有几个需要注意的方面:
-
GAT 可以采用多头注意力来捕捉节点关系的不同方面。
-
在多头注意力中,多个注意力机制并行使用,每个机制都有自己的一组可学*参数。
-
每个注意力头的输出特征会被连接或平均,以获得最终的节点表示。
-
多头注意力使得模型能够学*多样的模式,并捕捉节点之间不同类型的依赖关系。
有时,单个注意力层可能无法捕捉图中复杂的关系。堆叠多个层可以帮助改善学*空间。
堆叠 GAT 层
我们也可以使用多个 GAT 层,类似于 GCN:
-
与 GCN 类似,GAT 层可以堆叠以捕捉更高阶的依赖关系,并学*图的更抽象表示。
-
在每一层中,来自前一层的更新节点表示作为输入传递到下一层。
-
在多个 GAT 层之后获得的最终节点表示可以用于下游任务,例如节点分类或图分类。
GAT 无缝地结合了自适应感受野和可解释的注意力机制的优点,使其成为处理图结构数据的强大工具。GAT 的自适应感受野使得节点在信息聚合过程中可以动态调整其关注相关邻居的程度。更重要的是,GAT 提供了可解释的注意力系数,使得我们能够清楚地理解模型的决策过程。注意力权重的透明性使我们能够直观地了解哪些邻居在节点表示中贡献显著,从而促进了模型的可解释性并便于调试。
这种适应性与可解释性的结合使得 GAT 在捕捉精细的局部信息的同时,保持全局视角,从而在各种基于图的任务中取得成功。
让我们看看 GAT 的模型代码:
class GAT(torch.nn.Module):
def __init__(self, in_channels, hidden_channels,
out_channels, heads=8, dropout=0.6):
super(GAT, self).__init__()
self.conv1 = GATConv(
in_channels, hidden_channels,
heads=heads, dropout=dropout)
self.conv2 = GATConv(
hidden_channels * heads, out_channels,
heads=1, dropout=dropout)
def forward(self, x, edge_index):
x = self.conv1(x, edge_index)
x = F.elu(x)
x = F.dropout(x, training=self.training)
x = self.conv2(x, edge_index)
return F.log_softmax(x, dim=1)
在这段代码中,GAT 模型类使用了两个GATConv 层来定义。第一层有多个由 heads 参数指定的注意力头,而第二层只有一个注意力头。使用的激活函数是 指数线性单元(ELU)函数。
请注意,在 GAT 类的 init 方法中,我们在指定第二个 GATConv 层的输入通道时,将 hidden_channels 乘以 heads。这是因为第一层的输出由于多个注意力头的原因,具有 hidden_channels * heads 的维度。
总结
本章中,我们提供了关于基于图的深度学*模型的全面概述,从信息传递的基本概念开始,然后深入探讨了特定的 GNN 架构,如 GCN、GraphSAGE 和 GAT。
基于图的模型依赖于信息传递,这是一个关键操作,其中节点与邻居交换信息,以更新它们的表示。GCN 在图上执行卷积,聚合邻居节点的信息来学*节点表示。GraphSAGE 通过邻域采样高效地为大规模图生成嵌入。GAT 整合了注意力机制,使得节点在信息传递过程中能够为邻居分配不同的重要性权重。这些技术增强了基于图的模型捕捉数据结构中复杂关系和模式的能力。
在对流行的图学*算法有了基础理解后,我们将在接下来的章节中探讨 GNN 面临的当代挑战。
第五章:图深度学*挑战
随着*年来图上的深度学*获得了广泛关注,研究人员和从业者遇到了许多挑战,这些挑战使得将传统深度学*技术应用于图数据变得复杂。
本章旨在为您提供图学*中面临的关键挑战的全面概述,涵盖从基础数据问题到高级模型架构及领域特定问题的各个方面。我们将探讨图的独特特性——如其不规则结构、可变大小和复杂的依赖关系——如何为传统机器学*方法带来重大障碍。
通过解决这些挑战,我们旨在为您提供一个扎实的基础,帮助您理解当前深度学*在图上的局限性和未来的发展方向。本章将作为一个路线图,突出那些需要进一步研究和创新的领域,以推动图学*领域的发展。
当我们深入探讨这些挑战时,我们将讨论当前的解决方法、局限性以及未来研究的潜在方向。理解这些挑战对于开发更加稳健、高效和有效的图学*算法及应用至关重要。
本章讨论的挑战大体上可以分为几个关键领域:
-
数据相关的挑战
-
模型架构挑战
-
计算挑战
-
特定任务的挑战
-
可解释性和可解释性
数据相关的挑战
图数据由于其固有的复杂性和多样性,带来了独特的挑战。在这一部分,我们将探讨三个与数据相关的关键挑战,它们对图学*算法的发展和应用产生了重大影响。
图结构的异质性
不同领域的图具有截然不同的结构特性:
-
节点和边的类型:许多现实世界中的图是异质的,包含多种类型的节点和边。例如,在学术网络中,节点可能代表作者、论文和会议,而边则可能代表作者关系、引用或参与情况。
-
属性多样性:节点和边可能具有各种类型的关联属性(数值型、类别型、文本型),为学*过程增添了另一层复杂性。
-
结构变化:图可以表现出不同的全局结构(例如,尺度无关、小世界、随机图)和局部模式(例如,社区、模体),需要能够适应这些变化的模型。
动态和演变中的图
许多现实世界的图不是静态的,而是随时间变化的:
-
时间演化:节点和边可能会随着时间的推移出现或消失,动态地改变图结构。在社交媒体平台上,用户连接的网络不断演化,因为新的友谊形成,旧的友谊消失。例如,用户可能在开始新工作后与新同事建立联系,同时与老同学失去联系,导致节点和边随着时间的推移出现和消失。
-
属性变化:节点和边的属性也可能随着时间变化,反映出不断变化的属性或状态。在像 LinkedIn 这样的职业社交网站上,用户的个人资料和连接会频繁更新。用户可能会更改职位名称、增加新技能或搬迁,改变节点属性。同样,随着专业人士在更多项目上合作,连接的强度可能增加,从而动态地修改边的属性。
-
概念漂移:支配图结构的基础模式或规则可能会发生变化,要求能够适应这些变化的模型。在电子商务推荐系统中,用户偏好的基础模式可能随时间变化。最初,系统可能会根据相似类别推荐产品,但随着消费者行为向优先考虑可持续性或伦理采购转变,推荐算法需要调整规则以反映这些变化的偏好。
-
流式数据:在某些应用中,图数据以连续流的形式到达,要求使用在线学*算法,能够逐步处理和更新模型。银行的实时欺诈检测系统处理交易数据作为连续流。每笔新交易都会在图中创建一个节点,并立即与账户持有者和商户连接。系统必须即时分析这些传入数据,更新图结构并运行欺诈检测算法,确保不间断地适应新出现的欺诈行为模式。
噪声和不完整的图数据
现实世界的图数据通常存在质量问题:
-
缺失数据:由于数据收集的限制或隐私问题,图可能缺少节点、边或属性。
-
噪声连接:图中的一些边可能是错误的或不相关的,可能会误导学*算法。
-
不确定的属性:节点和边的属性可能是不确定的、不精确的,或受测量误差的影响。
-
抽样偏差:观察到的图可能是较大总体的偏倚样本,从而导致学*模型中可能出现不准确的情况。
解决这些与数据相关的挑战对于开发稳健且有效的图学*算法至关重要。实践者在设计模型、选择评估指标和解释结果时必须考虑这些问题。未来的图学*进展可能会集中在开发能够处理更大、更复杂和动态图形的技术,同时能够抵御噪声和数据不完整的影响。
让我们来看看现代图神经 网络(GNNs)面临的主要架构挑战。
模型架构挑战
GNN 在各种图学*任务中取得了显著成功。然而,在某些场景中,它们面临着一些限制其效果的架构挑战。这里,我们研究了图学*中四个关键的模型架构挑战。
捕捉长程依赖
GNN 通常难以捕捉图中远距离节点之间的依赖关系,因为信息通常只传播到每一层的直接邻居。例如,在引用网络中,一篇论文可能受到另一篇论文的影响,而两篇论文之间可能有多个引用链接。标准的 GNN 可能无法捕捉到这种影响,如果这种影响超出了它们的感受野。
图 注意力机制和高阶图卷积代表了两种增强图神经网络(GNN)长程能力的复杂方法。图注意力机制引入了一种动态加权系统,使得模型能够智能地关注图中的最重要连接,特别是那些跨越较远距离的连接。通过为邻居节点分配可学*的权重,这些机制使得模型能够自动识别并优先考虑有影响力的节点,即使它们在图结构中相距较远。
这一机制得到了高阶图卷积的补充,它将传统的图卷积概念进一步推进。与仅限于直接邻居节点的传统卷积不同,这些先进的卷积能够在一次操作中处理并汇总来自多个跳数远节点的信息。这意味着模型能够直接捕捉跨越广泛邻域的复杂关系和模式,从而更全面地理解图的结构和潜在关系。结合这两种方法,模型能够有效地管理局部和全局信息流,从而显著提高处理和理解复杂图结构数据的能力。
GNN 中的深度限制
与传统的深度神经网络(DNNs)不同,GNN 在增加深度时往往不会从中受益,甚至在层数过多时可能会导致性能下降。这个问题在诸如分子属性预测等任务中尤为明显,深度 GNN 可能不会比浅层的 GNN 表现更好,从而限制了模型学*分子结构复杂层次特征的能力。
为了克服这一限制,已经开发了几种架构修改方法:
-
残差连接,受到残差网络(ResNet)架构在计算机视觉(CV)中的启发,允许信息跳过中间层,从而促进深层网络中的梯度流动。这些连接可以通过将每层的输入添加到其输出中来实现,使网络能够学*残差函数。
-
跳跃连接通过允许信息跨越多层跳跃,提供更短的梯度传播路径,从而扩展了这一概念。可以通过如Jumping Knowledge Networks(JKNets)等技术实现。
-
自适应深度机制动态地调整每个节点的有效深度,使图的不同部分可以根据需要在不同深度下进行处理。这个方法可以通过使用如DropEdge等技术实现,该技术在训练过程中随机移除边或层,以创建具有不同有效深度的网络。
过度平滑与过度压缩
随着 GNN 层数的增加,节点表示趋向于收敛到相似的值(过度平滑),并且远程节点的信息可能在传播过程中被“压缩”(过度压缩)。例如,在蛋白质-蛋白质相互作用网络中,过度平滑可能导致模型失去个体蛋白质的独特特征,而过度压缩则可能阻止远程重要相互作用的信息影响最终的表示。
为了解决这些问题,提出了几种技术:
-
归一化方法,如PairNorm(
arxiv.org/abs/1909.12223)或DiffGroupNorm(arxiv.org/abs/2006.06972),通过归一化节点特征之间的成对距离来帮助维持不同层之间节点表示的多样性。这些方法调整节点表示的尺度,以防止它们收敛到单一点。 -
自适应边修剪技术在消息传递过程中动态移除不重要的边,减少冗余信息流并缓解过度平滑。可以通过使用注意力机制或学*的边重要性得分来实现这一点。
-
层次池化策略逐步简化图的结构,在保留全局结构的同时减少其大小。像DiffPool这样的算法可以用来创建层次化表示,在不同尺度上捕捉信息,帮助通过提供更直接的信息流路径,防止过度压缩。
平衡局部和全局信息
GNN 需要有效地结合局部结构信息与全局图属性,但找到合适的平衡往往是困难的。这个挑战在诸如交通预测这类任务中尤为明显,在这些任务中,模型需要同时考虑道路段的周围环境(局部)以及整个城市的交通流量模式(全局)。
为了实现这一平衡,已经开发出几种方法:
-
图池化技术通过分层聚合节点信息,创建图的多尺度表示。像自注意力图池化(SAGPool)或TopKPool这样的技术使用可学*的池化操作,在每个层次选择并结合重要的节点。
-
结合局部 GNN 层与全局读出函数可以让模型显式地融入图级信息。这可以通过使用像Set2Set或SortPool这样的技术来实现,生成固定大小的图表示,从而捕捉全局结构。Set2Set 是一种基于递归的方法,通过迭代地应用注意力机制聚合节点表示,确保动态且顺序不变的集合表示。另一方面,SortPool 根据选定标准(例如节点度数)对节点嵌入进行排序,然后选择排名前 k 的节点来形成固定大小的图表示。这两种方法都帮助总结整个图,同时保持重要的结构信息,从而确保在需要局部和全局图理解的任务中获得更好的表现。
-
跨尺度的注意力机制,例如图 Transformer 架构中使用的注意力机制,使模型能够有选择地关注图的局部和全局属性。这些机制可以通过多头注意力(MHA)实现,其中不同的头可以关注不同尺度的信息,从直接邻居到远程节点,甚至是全局图属性。
面临模型架构挑战——举个例子
为了通过具体例子来说明这些挑战,假设我们面临一个大型社交网络分析任务。
假设你正在开发一个 GNN 模型,用于预测平台(例如 X(前身为 Twitter))上的用户兴趣。图包含数百万个用户(节点),这些用户通过粉丝关系(边)相连接,并且推文和标签作为附加特征。以下是可能出现的一些挑战:
-
长程依赖:模型需要捕捉来自流行用户或热门话题的影响,这些影响可能位于粉丝图中相隔多个跳数的地方。
-
深度限制:单纯堆叠更多的 GNN 层不一定能提高模型理解复杂用户交互模式的能力。
-
过度平滑和过度压缩:在深层 GNN 中,兴趣多样的用户可能会得到相似的表示,从而丧失重要的区分性。来自网络远端的关于小众兴趣的信息可能会随着传播在图中逐渐丧失。
-
平衡局部和全局信息:模型必须将用户的即时网络(局部)与平台范围内的趋势和有影响力的用户(全局)结合,以做出准确的兴趣预测。
通过采用前面提到的策略来解决这些架构挑战,实践者可以开发出更强大、更灵活的图神经网络(GNN)模型,能够处理跨多个领域的各种图学*任务。
随着图神经网络(GNN)技术的不断发展,并在越来越大规模的图数据集上找到应用,实践者面临着重大的计算挑战,这些挑战推动着现有算法和计算基础设施的边界。以下部分将探讨研究人员和开发人员必须应对的三大计算挑战,以解锁 GNN 在多个领域的全部潜力。
计算挑战
随着图学*技术的不断发展并在越来越复杂的领域中找到应用,它们面临着巨大的计算挑战。现实世界图的规模和复杂性为现有算法和计算基础设施带来了巨大的挑战。在这里,我们深入探讨了研究人员和实践者在处理大规模图数据时遇到的三大主要计算挑战:扩展性问题、内存限制和对并行与分布式计算解决方案的需求。
大规模图的扩展性问题
随着图数据在规模和复杂性上的不断增长,扩展性已成为图学*算法的一个关键挑战。这一问题在社交网络分析或 Web 规模图等场景中尤为明显,这些场景中数十亿的节点和边是常见现象。传统的图算法往往在图的规模增大时时间复杂度急剧上升,使得它们在大规模应用中变得不可行。
为了解决这一挑战,已经开发出多种方法。
基于采样的方法,如GraphSAGE,我们在第四章中探讨过,或者FastGCN,通过在图的子集上操作来减少计算复杂度。这些技术在训练过程中随机采样邻域或节点,使得模型能够通过*似全图计算来扩展到大规模图。
另一种方法是使用简化的传播规则,如简单图卷积(SGC)或可扩展的图神经网络(SIGNs)。这些方法减少了每次迭代中所需的非线性操作和参数更新的数量,从而显著加速了大规模图的训练和推理过程。
图处理中的内存限制
处理大规模图通常需要在内存中存储大量数据,这可能超过单台机器的容量。这一挑战在涉及到大规模知识图谱或包含数百万化合物的分子数据集的任务中尤为突出。为了解决这个问题,已经开发了几种技术:
-
外存计算技术,如GraphChi或X-Stream中使用的技术,允许处理那些无法完全存入主内存的图,通过高效管理磁盘上的数据来进行处理。这些方法精心组织图数据和计算,尽量减少对二级存储的随机访问。
-
图压缩技术,例如k2-tree表示法中使用的技术,通过利用结构性规律和冗余来减少大图的内存占用。这些方法可以显著减少存储需求,同时仍然允许高效的查询操作。
-
另一种有效的方法是使用小批量训练策略,例如在Cluster-GCN(
arxiv.org/abs/1905.07953)或GraphSAINT(arxiv.org/abs/1907.04931)中所见。这些方法通过将图划分为小的、可管理的子图或批次来处理图,从而可以在比全图方法更大的图上进行训练。
图的并行和分布式计算
许多实际图的规模需要使用并行和分布式计算技术来实现合理的处理时间。这在分析互联网级网络或处理大规模科学模拟数据等应用中至关重要:
-
图并行框架,如Pregel、GraphLab或PowerGraph,提供专门为分布式图计算设计的编程模型。这些框架通常使用“像顶点一样思考”范式,在这种范式中,计算从单个节点的角度来表达,从而便于在集群中的并行化。
-
分布式 GNN 训练技术,例如PinSage或AliGraph中使用的技术,允许在分布在多台机器上的庞大图上训练 GNN 模型。这些方法通常将数据并行性(将图分布到不同机器上)与模型并行性(将神经网络(NN)本身分布到不同机器上)结合使用。
-
GPU 加速的图处理,例如Gunrock或cuGraph等框架,利用 GPU 的强大并行计算能力来加速图算法。这些方法通常需要精心重新设计算法,以适应 GPU 架构,如使用基于 warp 的编程模型或优化内存访问模式。
通过解决这些计算挑战,我们可以开发出能够处理现实世界图数据规模和复杂性的图学*系统,开启在社交网络分析、推荐系统、科学计算等领域的新应用可能性。
尽管解决这些广泛的计算挑战至关重要,但同样重要的是要考虑不同图相关任务中出现的具体问题。让我们从不平衡图中的节点分类开始,探讨一些这些任务特定的挑战。
特定任务的挑战
尽管图学*算法面临普遍的挑战,但某些任务呈现出独特的困难,需要专门的方法。在本节中,我们考虑了图学*中的四个常见任务特定挑战,每个挑战都有其自身的复杂性和提出的解决方案。
不平衡图中的节点分类
现实世界图中的节点分类通常存在类不平衡问题,其中某些类的样本显著较少。这个问题在金融交易网络中的欺诈检测等场景中尤为突出,在这些场景中,欺诈交易通常比合法交易少得多。这种不平衡可能导致模型偏向多数类,表现不佳。
一些缓解这种问题的方法包括:
-
重采样技术,例如过采样少数类或欠采样多数类,可以适应图数据。例如,GraphSMOTE 将 合成少数类过采样技术(SMOTE)算法扩展到图结构数据,通过在特征和图空间中插值现有节点来为少数类生成合成样本。
-
成本敏感学*方法 在训练过程中对少数类节点的误分类赋予更高的惩罚。这可以通过修改损失函数来加重少数类的错误权重。
-
另一种有效的方法是使用 元学*技术,例如为图定制的 小样本学*(FSL)算法。这些方法,如 Meta-GNN 或 图原型网络(GPNs),旨在学*可泛化的表示,从而能够在样本稀缺的情况下,针对少数类表现良好。
稀疏图中的链接预测
稀疏图中的链接预测面临独特的挑战,因为绝大多数潜在的边缘都缺失,导致链接预测任务中的类不平衡。这在生物网络中很常见,在这些网络中,只有少数实体之间的可能交互被观察到。稀疏性使得很难学*到有意义的模式。
为了解决这个问题,已经提出了几种专门的方法。负采样技术在训练过程中仔细选择一部分不存在的边作为负样本,从而平衡数据集而不引入过多噪声。像基于知识的生成对抗网络(KBGANs)这样的先进方法通过对抗训练生成高质量的负样本。
图生成与重建
图生成和重建任务旨在创建新的图形或完成部分图形,由于图形的离散性质以及需要保持复杂结构属性,这一任务充满挑战。这对于药物发现等应用尤为关键,其中生成有效的分子图形至关重要。
应对这一挑战的一个主要方法是使用适应图形的变分自编码器(VAEs),如GraphVAE或变分图自编码器(VGAE)。这些模型学*图形的连续潜在空间表示,从而通过从这个空间中采样生成新的图形。
然而,确保生成的图形的有效性仍然是一个挑战。另一种强大的方法是使用自回归模型进行图形生成,如GraphRNN或图形递归注意力网络(GRANs)。这些模型逐节点或逐边生成图形,捕捉图结构中的复杂依赖关系。
图匹配与对齐
图匹配与对齐涉及找到不同图形之间节点的对应关系,这对于如系统生物学中的网络对齐或计算机视觉中的 3D 物体匹配等任务至关重要。由于问题的组合性质以及需要考虑结构和属性相似性,这一任务在计算上非常具有挑战性。
为了克服较大图形的这一挑战,基于图嵌入的*似方法变得越来越流行。基于表示学*的图对齐(REGAL)等模型学*保留局部和全局图结构的节点嵌入,从而通过匹配嵌入空间中的节点实现高效对齐。最*的进展还包括将图神经网络(GNNs)应用于匹配任务,如跨图注意力网络,它通过关注图中的局部邻域来学*匹配节点。通过解决这些任务特定的挑战,我们可以开发出更有效、更稳健的图学*模型,以适应不同应用的独特需求。随着该领域的发展,我们可以预见到将出现更多创新,结合多种方法的见解来解决这些复杂问题。
随着我们从讨论图学*中的技术创新转向,考虑这些复杂模型如何被理解和解释变得至关重要,尤其是在高风险领域应用时。这引出了我们下一个重要的话题:图学*模型的可解释性和可解释性。
可解释性和可解释性
随着图学*模型变得越来越复杂,并且被应用于诸如医疗保健、金融和社会科学等关键领域,对可解释和可解释模型的需求显著增长。在这里,我们探讨图学*中可解释性和可解释性的两个关键方面。
解释 GNN 决策
GNN 通常作为黑盒运行,使得理解其做出某些预测的原因变得困难。这种透明度缺乏在药物发现或金融欺诈检测等高风险应用中可能带来问题。为了解决这个问题,已经开发了几种方法来解释 GNN 的决策:
-
一个重要的方法是GNNExplainer,它识别影响模型预测的重要子图和特征。通过优化 GNN 预测的条件分布与简化解释之间的互信息目标来实现这一点。
-
另一种方法是GraphLIME,它是局部可解释模型无关解释(LIME)框架的一个扩展,专为图结构数据设计。它通过在预测周围局部学*一个可解释的模型来解释单个预测。
-
基于梯度的方法,如适用于图的Grad-CAM,通过可视化输出相对于中间特征图的梯度提供解释,突出显示输入图的重要区域。一些*期的研究还集中于图神经网络(GNN)的反事实解释,生成最小的输入图变化,以改变模型的预测。
这些方法有助于理解模型决策并识别模型中的潜在偏差或脆弱性。
可视化图嵌入
图嵌入将节点或整个图表示为低维空间中的向量,这是许多图学*任务的基础。然而,由于其高维性质,解释这些嵌入可能具有挑战性。已经开发了各种技术来可视化和理解这些嵌入:
-
降维技术,如t-分布随机邻域嵌入(t-SNE)或均匀流形*似与投影(UMAP),通常用于将高维嵌入投影到二维或三维空间以进行可视化。这些方法旨在保持点之间的局部关系,从而能够在嵌入空间中识别集群和模式。
-
交互式可视化工具,例如TensorBoard Projector或Embedding Projector,允许用户动态地探索嵌入,放大特定区域并检查节点之间的关系。一些先进的方法将嵌入可视化与原始图结构相结合。例如,GraphTSNE将图结构信息集成到 t-SNE 算法中,生成的布局反映了嵌入的相似性和图的拓扑结构。
-
另一种创新方法是使用图生成技术来可视化嵌入。通过在嵌入和原始图上训练图生成模型,可以生成代表嵌入空间不同区域的合成图,从而直观地展示嵌入所捕捉到的内容。
通过解决这些可解释性和可解释性的方面,研究人员旨在弥合复杂图学*模型的性能与透明、可信赖的人工智能系统需求之间的差距。随着该领域的进展,我们可以预期看到这些技术进一步融入主流的图学*框架,使其更易于被各个领域的从业者使用。可解释和可解释的图学*模型的开发不仅增强了信任和采纳,还为从复杂的图结构数据中进行科学发现和知识提取开辟了新的途径。
总结
在本章中,我们探讨了定义当前图学*领域的多方面挑战。从处理大规模、异构和动态图数据的基本问题到设计有效的 GNN 架构的复杂问题,每个挑战都带来了独特的障碍和创新机会。我们还研究了处理大规模图数据的计算难题、在节点分类和链接预测等特定任务中的细微困难,以及对可解释和可解释模型日益增长的需求。
这些挑战并非孤立存在;它们交织在一起,相互叠加,创造出一个复杂的生态系统,研究人员和从业者必须在其中导航。随着图学*的不断发展,并在医疗、金融和社会科学等关键领域找到应用,解决这些挑战不仅是学术追求,更是实际的必要性。
图学*的未来在于开发能够处理现实世界图的规模、复杂性和动态性的整体解决方案,同时提供强大、高效和可解释的模型。通过正面应对这些挑战,您现在已准备好解锁新的可能性,并推动创新,改变我们理解和与周围互联世界互动的方式。
在我们展望图学*的未来时,一个有前景的方向是将大语言模型(LLMs)与基于图的方法相结合。下一章将探讨如何利用 LLMs 来增强图学*技术,可能解决此处讨论的一些挑战,同时为更复杂的图分析和理解开辟新的可能性。
第六章:利用大型语言模型进行图学*
传统上,图神经网络(GNNs)一直是图学*任务的主力,取得了显著的成果。然而,最*的研究探索了大型语言模型(LLMs)在该领域的巨大潜力。
本章将深入探讨 LLMs 与图学*的交集,探讨这些强大的语言模型如何提升基于图的任务。我们将从 LLMs 的概述开始,随后讨论 GNNs 的局限性以及引入 LLMs 的动机。接下来,我们将探讨在图学*中使用 LLMs 的各种方法,检索增强生成(RAG)与图的交集,并解释这种整合的优势和挑战。
本章将探讨以下主题:
-
理解 LLMs
-
图中的文本数据
-
图学*中的 LLMs
-
将 RAG 与图学*结合
-
集成 LLMs 的挑战
理解 LLMs
LLMs 是人工智能(AI)中的一项重大进展,特别是在自然语言处理(NLP)和理解方面。这些模型旨在以一种既有意义又具有上下文相关性的方式理解、生成和与人类语言互动。LLMs 的发展和演化标志着一系列创新,这些创新扩大了其在各个领域的能力和应用。
从本质上讲,LLMs 是在互联网上的海量文本数据集、书籍、文章和其他书面语言来源上进行训练的。该训练过程涉及分析语言的模式、结构和语义,使得这些模型能够根据接收到的输入生成连贯且符合上下文的文本。训练过程依赖于深度学*技术,特别是神经网络,允许模型通过接触更多数据来不断改进其语言能力。
LLMs 的一个关键特点是它们的规模,通常通过其包含的参数数量来衡量。早期的模型只有数百万个参数,但如今最先进的模型拥有数十亿甚至上百亿个参数。规模的增加与模型理解和生成类似人类文本的能力显著提高相关,这使得它们在广泛的应用中更为有效。
LLMs 有广泛的应用,从简单的任务,如语法纠正和文本补全,到更复杂的任务,如写文章、生成代码、翻译语言,甚至创作诗歌或散文。它们还被用于对话代理,作为聊天机器人和虚拟助手的核心,能够与用户进行更自然和有意义的互动。
LLMs 的发展经历了几个重要的里程碑:
-
1990 年代 :统计语言模型(SLMs)的时代开始,利用n-gram 模型基于前面几个词预测序列中的下一个词。由于数据稀疏问题,这些模型在高阶预测方面面临挑战。
-
2000 年代初 :神经语言模型(NLMs)的引入,采用了如多层感知机(MLPs)和递归神经网络(RNNs)等神经网络,标志着向深入理解语言关系的转变。
-
2010 年代 :词嵌入技术的发展,如Word2Vec和GloVe,它们将词语表示为连续的向量空间,使得模型能够捕捉语义意义和上下文。
-
2017 :变换器架构的引入,使得处理序列数据取得突破,无需递归处理。这一架构是许多后续 LLM 的基础。
-
2018 :生成预训练变换器(GPT)由 OpenAI 发布,展示了变换器在语言理解和生成方面的强大能力。
-
2019 :双向编码器表示法来自变换器(BERT)由谷歌提出,革命性地引入了一个能够从文本中双向理解上下文的模型。
-
2020 年代 :更大规模的模型开始出现,如GPT-3,展现了生成类人文本的卓越能力,同时出现了能够将 LLM 与其他 AI 领域相结合的模型,如图学*。
-
2023 – 2024 :LLM 的强大进展引发了广泛关注,首先是 ChatGPT,接着是GPT-4、Anthropic 的 Claude、谷歌的 Gemini 和 Meta 的 Llama,这表明了更专业化、更强大的语言模型趋势。
LLM 的显著成就激发了将其能力应用于图机器学*任务的兴趣。一方面,LLM 的广泛知识和逻辑能力为改善传统的 GNN 模型提供了有前景的前景。另一方面,图中的有组织表示和具体知识有可能缓解 LLM 的一些主要缺点,包括它们产生误导性信息的倾向和解释性问题。
图中的文本数据
部署 GNN 的一个基本障碍是获取节点和边的复杂特征表示。当这些元素与复杂的文本属性(如描述、标题或摘要)相关联时,这一点尤为重要。
传统方法,如词袋模型或使用预训练词嵌入模型,一直是常见的做法。然而,这些技术通常无法把握文本中固有的微妙语义差异。它们往往忽视上下文及词语之间的相互依赖,导致丧失对于 GNN 进行最佳表现所需的关键信息。
为了克服这一挑战,越来越需要更先进的方法来理解和将语言的丰富性编码到图结构中。这正是 LLM 的优势所在。通过深刻理解语言的细微差别和上下文,LLM 能够生成捕捉更广泛语言特征的嵌入。
通过将 LLM 整合到 GNN 的特征提取过程中,您可以潜在地编码更丰富、更具信息性的表示,这些表示能够反映文本属性的真实语义内容,从而提升 GNN 在执行如节点分类、链路预测和图生成等任务时的准确性和效率。
LLM 的能力不仅仅局限于生成文本嵌入作为特征。LLM 擅长从原始文本属性中生成增强信息。它们可以用来生成标签/标签以及其他有用的元数据,且可以以无监督/半监督的方式进行处理。
LLM 的一个重要优势是它们能够在极少或没有标注数据的情况下适应新任务,这得益于它们在广泛文本数据集上的预训练。这种少量样本学*的能力有助于减少图神经网络(GNN)对大量标注数据集的依赖。
一种策略是通过将图的结构和节点信息框架化为自然语言提示,直接利用 LLM 预测图相关任务的结果。像 InstructGLM 这样的技术通过精心设计的提示,优化像 Llama 和 GPT-4 这样的 LLM,详细描述图的拓扑结构,包括节点连接和邻域等方面。这些优化后的 LLM 能够在推理阶段无需任何标注样本即可预测节点分类和链路预测等任务。
利用 InstructGLM
InstructGLM是一个框架,利用自然语言描述图结构和节点特征,并通过指令调优来解决图相关问题。它是一个提议的指令微调图语言模型(GLM),利用自然语言指令进行图机器学*,为图相关任务提供强大的自然语言处理(NLP)接口。
InstructGLM 框架涉及一个多任务、多提示的教学调优过程,用于优化大语言模型(LLM)并有效地将其与图结构结合。该方法旨在通过在图结构上利用自监督学*,并利用 LLMs 作为文本编码器,减少对标注数据的依赖,从而提升性能和效率。
InstructGLM 技术采用语言线索,阐明图中连接模式和节点特征。这些提示作为教学机制,指导 LLMs 理解图的复杂结构和内在含义。
如图 6 .1所示,InstructGLM 框架提出了一种复杂的多任务、多提示指令调优方法,适用于大型语言模型(LLMs):

图 6.1 – InstructGLM 多任务应用。来源:Ye 等,2024(https://arxiv.org/abs/2308.07134)
该图展示了 InstructGLM 的核心组件,展示了不同类型的提示及其应用:
-
1 跳提示与元节点特征:这种提示类型根据节点的直接连接对中心节点进行分类,如图左上角蓝色框所示。
-
3 跳提示与中间路径:如绿色框所示,此提示探索最多三跳的连接,为节点分类提供更广泛的上下文。
-
无结构提示:黄色框展示了 InstructGLM 如何基于节点的内在特征对其进行分类,而不依赖于结构信息。
-
2 跳提示与元节点特征及中间节点:如粉色框所示,这种提示类型用于链接预测任务,考虑最多两跳的连接。
-
1 跳提示无元节点特征:另一种链接预测提示,如橙色框所示,该提示关注节点的直接连接,而不包含额外的节点信息。
图 6 .1 同样强调了 InstructGLM 在节点分类和链接预测任务中的双重关注,正如由虚线分隔的这两个主要功能所示。
尽管将 LLMs 作为不透明预测器已经取得了有效的结果,但在处理更复杂的图任务时,它们的准确性下降,因为在这种任务中,结构的详细建模至关重要。因此,一些方法将 LLMs 与 GNNs 结合使用,其中 GNN 绘制图的结构,而 LLM 基于节点的文本描述,增强了对节点的深层语义理解。
接下来,让我们看看 LLMs 如何帮助我们进行图学*。
LLMs 在图学*中的应用
研究人员已经深入探讨了将 LLMs 融入图学*过程的各种策略。每种方法都有其独特的优势和潜在用途。让我们看看 LLMs 能发挥的几个关键功能。
LLMs 作为增强工具
传统的图神经网络(GNNs)依赖于初始节点特征的质量,通常这些特征的文本描述有限。而 LLMs 凭借其广泛的知识和语言理解能力,能够弥补这一差距。通过增强这些特征,LLMs 使得 GNNs 能够捕捉图中复杂的关系和动态,从而在节点分类或链接预测等任务中表现出色。
有两种主要方法可以利用 LLM 作为增强工具。第一种是 特征级增强,可以通过多种方式使用 LLM 来实现:
-
同义词与相关概念:LLM 通过识别同义词和语义相关的概念,超越了文本描述的表面层次。这有助于捕捉可能没有明确提到的更广泛的信息。例如,如果产品描述提到 防水 和 登山靴,LLM 可以推断该产品适合户外活动。
-
隐式关系:LLMs 可以从文本中提取隐式关系。这些关系对于理解图中节点的上下文至关重要。例如,在社交网络中,LLM 可能会根据两个节点之间频繁的互动推断出它们之间的友谊,即使词语 friend 从未明确提及。
-
外部知识集成:LLMs 可以访问并集成外部知识库,进一步丰富节点表示。这可能涉及将产品信息与用户评论关联,或将蛋白质描述(在生物网络中)与已知的蛋白质-蛋白质相互作用连接起来。
另一种方法是 文本级增强,可以用于为节点创建更丰富、更具信息性的文本描述。
该方法侧重于为节点创建全新的文本描述,尤其在原始描述有限或缺乏上下文时特别有益。LLM 作为内容生成器,利用关于节点及其在图中的上下文信息,创造出新的、更具信息量的描述。这个上下文可能包括以下方面:
-
原始文本描述
-
邻接节点的标签
-
图的结构(例如,连接到节点的边的数量)
LLM 利用这些信息生成丰富的文本描述,捕捉与邻接节点的关系、整体网络结构以及任何相关的外部知识。这个新生成的描述成为节点的增强特征,为 GNN 提供了对节点在图中作用的更全面理解。
LLM 增强的优势与挑战
基于 LLM 的增强为图学*提供了若干优势:
-
改进的特征表示:增强的节点特征捕捉了节点在图中上下文的更丰富、更细致的理解。这使得 GNN 能够学*更复杂的关系和模式,从而在节点分类、链接预测和社区检测等任务中提高性能。
-
处理有限数据:LLMs 可以解决节点描述稀缺或缺乏细节的情况。通过推断关系和利用外部知识,它们能够创建更具信息性的表示,从而缓解有限数据可用性带来的挑战。
-
识别隐含连接:LLMs 可以超越节点特征中的表层信息,基于它们对语言的理解识别出微妙的连接。这对于诸如揭示社交网络中隐藏社群或预测生物网络中节点之间存在链接等任务至关重要。
然而,虽然 LLM 增强提供了一条引人注目的前进道路,但也存在一些需要克服的挑战:
-
计算成本:训练和运行 LLMs 可能会耗费大量计算资源,尤其是在处理大规模图形时。需要谨慎优化策略以确保可伸缩性。
-
数据偏倚继承:LLMs 并不免于其训练数据中存在的偏见。关键在于确保用于增强的 LLM 是在高质量、无偏见的数据上训练的,以防止结果偏斜。
-
可解释性难题:理解 LLMs 如何生成增强特征可能具有挑战性。这种透明度不足可能使得解释使用这些特征的 GNN 结果变得困难。研究人员正在积极开发方法,使 LLMs 实现的增强过程更加透明。
真实世界应用
这里有多个真实世界的例子,展示了 LLMs 如何增强图学*过程。
-
药物发现与生物信息学:在药物发现中,预测不良药物-药物相互作用(DDIs)对患者安全至关重要。传统方法通常因为可能的药物组合和相互作用数量庞大而难以应对。GNNs 可以通过将药物表示为节点,已知相互作用表示为边来建模这些关系。当结合 LLMs 时,LLMs 会处理生物医学文献以提取有关药物机制、副作用和相互作用的信息,使得这些模型显著增强。LLMs 生成的嵌入丰富了 GNN 中的节点和边特征,从而更准确地预测潜在的 DDIs,最终实现更安全的药物管理。
-
社交网络分析:LLMs 可以增强 GNNs 在社交媒体上检测虚假信息的能力。GNNs 可以模拟社交网络,节点代表用户,边代表互动,如点赞、分享和评论。通过处理帖子内容,LLMs 可以提取主题、情感以及潜在误导信息,这些信息随后被整合到图中。这种丰富化使得 GNN 能够更好地识别虚假信息的群集,并预测哪些用户最有可能传播虚假信息,从而更有效地干预以维护信息的完整性。
-
金融欺诈检测:金融欺诈检测涉及在数百万笔交易中识别可疑模式。GNNs 可以将这些交易表示为图,其中 节点 代表账户,边 代表交易。LLM 可以分析交易描述和备注,提取出欺诈的关键词和模式,增强 GNN 的节点和边特征。这一集成使得 GNN 能够通过考虑交易模式和文本描述中的上下文信息,更准确地检测欺诈交易,从而构建出更强大的欺诈检测系统。
-
学术研究和协作网络:识别潜在的研究合作者对推动科学发现至关重要。图神经网络(GNNs)可以建模学术网络,其中 节点 代表研究人员,边 代表共同署名或引用关系。LLM 可以分析论文摘要、关键词和研究兴趣,将这些文本特征转换为嵌入并集成到图中。这一增强功能使 GNN 能够通过考虑结构关系和研究兴趣的语义相似性来推荐潜在合作者,从而促进更有效的科学合作。
-
知识图谱构建:构建全面的知识图谱涉及从各种来源(通常是非结构化的)集成信息。GNNs 可以通过 节点 代表实体,边 代表关系来建模知识图谱。LLM 可以从新闻文章、科研文献和网页等文本数据源中提取实体和关系,并利用这些信息来丰富知识图谱,增加额外的节点和边。这一增强功能使得 GNN 能够通过整合来自多种文本来源的详细和上下文丰富的信息,构建更完整、更准确的知识图谱,促进更好的知识表示和发现。
LLM 与 GNN 的集成为通过结合文本数据中的丰富上下文信息来增强各种应用提供了一种强大的方法。
LLM 作为预测器
随着语言理解的进步,得益于基于 Transformer 的大型语言模型(LLMs),研究人员正在探索如何最佳地将图数据在文本中呈现给 LLMs。一篇名为 语言模型能否解决自然语言中的图问题?(arxiv.org/html/2305.10037v3)的最新论文讨论了如何通过 LLM 从文本描述构建图,从而增强其图形理解能力。该论文展示了如何通过提示帮助 LLM 理解图结构,并通过提示中提供的一组指令(算法)给出结果。
图 6 .2 展示了通过提示技术进行图分析的三种不同方法:

图 6.2 – 使用提示理解图结构。来源:Wang 等,2024(arxiv.org/html/2305.10037v3)
注意
图示构建图提示与算法提示概述(arxiv.org/html/2305.10037v3)由 Wang 等(2024)发布,采用 CC BY 4.0 许可协议。
此插图展示了如何通过不同的提示策略引导 LLM 理解和解决与图相关的问题:
-
标准提示:第一列展示了标准提示方法。这里展示了一个简单的无向图,节点编号从 0 到 4。该提示通过描述图的结构,包括连接各节点的边的权重,来提供上下文。提出的问题是找出从节点 0 到节点 2 的最短路径,展示了一个基本的图遍历问题。
-
构建图提示:中间一列介绍了一种更复杂的方法,称为构建图提示。该方法首先指示 LLM 基于给定的信息构建图,然后引导模型通过识别节点 0 和节点 2 之间的所有可能路径并计算其总权重的过程。这个逐步的方法帮助 LLM 系统地分析图并确定最短路径。
-
算法提示:最右边一列展示了算法提示,这是所展示的最先进的技术。它概述了一个深度优先搜索(DFS)算法,用于在无向图中找到两个节点之间的最短路径。该方法详细说明了如何实现该算法,包括跟踪距离和回溯以识别最优路径。然后,提示将这个算法应用于相同的图问题,演示了如何使用更复杂的分析方法来解决图遍历问题。
GPT4Graph(arxiv.org/pdf/2305.15066)研究使用图标记语言和自我提示来改善 LLM 在生成最终输出之前的理解。主要策略是输入图数据,确保 LLM 理解它,然后进行查询。然而,由于上下文长度的限制,这种方法在处理大型图时存在可扩展性问题,并且需要为新任务提供新的提示。为了应对这些挑战并提升图学*能力,我们来探讨如何将 RAG 与图学*结合。
将 RAG 与图学*结合
RAG 是一个 AI 框架,它结合了 LLM 的强大功能和外部知识检索,以产生更准确、相关和最新的响应。其工作原理如下:
-
信息检索:当接收到查询时,RAG 会搜索知识库或数据库以找到相关信息。
-
上下文增强:检索到的信息随后被用来增强语言模型的输入,提供额外的上下文。
-
生成:LLM 利用这种增强的输入生成既流畅又基于检索信息的回答。
RAG 提供了几个令人信服的好处:
-
提高准确性:通过将回答基于检索到的信息,RAG 减少了幻觉现象,提升了事实准确性。
-
最新信息:知识库可以定期更新,使系统能够访问当前信息,而无需重新训练整个模型。
-
透明度:RAG 可以提供信息来源,从而增加可信度并支持事实核查。
虽然传统的 RAG 方法已经证明有效,但将 RAG 与图谱学*技术结合,提供了更强大的信息检索和生成能力。
图谱 RAG(GRAG)方法的优势
图谱学*利用数据中固有的结构和关系,可以显著提高检索到的信息的上下文和相关性。将图谱与 RAG(检索增强生成)结合的主要好处如下:
-
结构化上下文:图谱捕捉实体之间的复杂关系,提供比平面文本文档更丰富的上下文。
-
多跳推理:图谱结构使得可以跨多个连接实体检索信息,从而促进更复杂的推理任务。
-
改善相关性:通过考虑文本信息和拓扑信息,基于图谱的检索能够识别出更相关的信息,用于生成过程。
在接下来的章节中,我们将探讨几种特定方法的优势。
知识图谱 RAG
知识图谱 RAG利用结构化的知识图谱来增强检索和生成过程。这种方法具有几个关键优势:
-
精确的实体和关系检索:通过利用知识图谱的结构化特性,该方法不仅能检索到相关实体,还能检索到它们之间的关系。例如,生物医学知识图谱不仅能检索到特定药物,还能检索到其与其他药物的相互作用、副作用以及批准用途。
-
上下文丰富:检索到的信息包括图谱中实体的更广泛上下文。这使得大语言模型(LLM)能够理解实体在更大信息网络中的位置,从而提供更为细致和准确的回答。
-
层次化信息访问:知识图谱通常包含层次化关系(例如,是 和 一部分)。这种结构允许更灵活的检索,系统可以根据需要访问具体细节和更广泛的类别。
-
多跳推理:知识图 RAG 可以通过检索连接实体和关系的路径来促进多跳推理。这对于需要从多个来源获取信息并在图中拼凑起来的复杂查询尤为有用。
GNNs
正如我们所看到的,GNNs 是学*图结构数据表示的强大工具。在 RAG 的背景下,它们提供了几个优势:
-
学*图嵌入:GNNs 可以创建节点、边和子图的稠密向量表示(嵌入)。这些嵌入捕捉了局部和全局的结构信息,从而有效地检索相关的图组件。
-
捕获图拓扑:与传统神经网络不同,GNNs 明确建模图中实体之间的关系。这使它们能够捕捉图中理解信息的上下文和相关性的复杂拓扑特征。
-
可扩展性:GNNs 能够高效处理大规模图,使其适用于现实世界中的知识库,这些知识库通常包含数百万个实体和关系。
-
归纳学*:许多 GNN 架构支持归纳学*,使它们能够推广到未见过的节点,甚至是全新的图。这对于不断更新的动态知识库特别有用。
GRAG
图 RAG(GRAG)是一种先进的技术,它强调在检索和生成过程中子图结构的重要性:
-
子图感知检索:与检索单独的实体或关系不同,GRAG 专注于检索相关的子图。这种方法保留了感兴趣实体周围的局部结构,为生成过程提供了更丰富的上下文。
-
拓扑保持生成:GRAG 在生成过程中保持对图拓扑的意识。这确保生成的文本遵循在检索的子图中存在的结构关系,从而产生更连贯、事实一致的输出。
-
软剪枝:GRAG 通常采用软剪枝机制来优化检索到的子图。这个过程移除不太相关的节点和边,同时保持整体结构,有助于将 LLM 的焦点集中在最相关的信息上。
-
层次化文本转换:GRAG 通常包括将子图转换为层次化文本描述的方法。这种转换既保留了文本内容,又保留了图的结构信息,使得 LLM 可以处理丰富的结构化输入。
-
多跳推理支持:通过保持子图结构,GRAG 自然支持多跳推理任务。LLM 可以遍历检索到的子图,连接远距离的信息片段,从而实现更复杂的推理。
让我们考虑 GRAG 在一个技术公司客户支持系统中的应用,该系统使用结构化为知识图谱的知识库。该知识图谱包含有关产品、错误代码、故障排除步骤和用户手册的互联信息。
假设用户提交了以下查询:如何解决我的 SmartHome 路由器上的错误代码 E101?
传统方法可能会检索到孤立的实体,如产品名称或错误代码,这可能导致片段化或不完整的答案。GRAG 采用独特的方法,提供准确且富有上下文的回答:
-
GRAG 专注于子图感知的检索,提取与错误代码 E101和SmartHome 路由器相关的结构化、连贯的子图。该子图可以包括错误原因(例如,网络配置冲突)、故障排除步骤(例如,更新固件、重置路由器或更改网络设置),以及与路由器用户手册或固件更新页面的相关链接。
-
一旦子图被检索到,GRAG 会应用软修剪机制,以保持本地图结构的完整性。与问题无关的或次要的信息,如其他设备的故障排除步骤或不相关的错误代码,将被移除。
-
GRAG 将修剪后的子图转换为层次化的文本描述,保持图结构的同时,将信息转换为 LLM 可以顺利处理的形式。我们的子图被转换为文本层次结构,组织信息如下:
-
错误代码 E101 及其原因概述(网络配置冲突)
-
按逻辑顺序提供的故障排除步骤
-
在相关的情况下,提供额外的细节,包括用户报告将 E101 错误与*期固件更新相关联的情况。
-
-
GRAG 采用拓扑保持生成方法,确保子图中编码的关系和结构反映在响应中。系统现在可以生成详细的回复:
您的 SmartHome 路由器上的错误代码 E101 通常是由于网络配置冲突引起的。要解决此问题,请检查您的路由器固件是否已更新。如果已更新,请按住重置按钮 10 秒钟重置路由器。您还可能需要更新网络设置,以避免 IP 冲突。请注意,一些用户在*期固件更新后报告遇到此错误,因此,如果问题仍然存在,回滚到之前的版本可能会有所帮助。
如前所述,GRAG 的一大优势是其多跳推理支持。例如,系统可能会将错误代码 E101与网络配置冲突相连接,再从那里连接到用户手册中的具体故障排除步骤。这使得 LLM 能够推断复杂的关系,并提供全面的答案而不遗漏有价值的上下文。
这些方法在利用图结构进行 RAG 方面具有独特优势。选择哪种方法通常取决于应用的具体需求、知识库的性质以及所处理查询的复杂性。此外,由于存在诸如管理大型噪声图、保持低延迟以及使 LLM 能够处理结构化图输入等挑战,仔细实施所选方法至关重要。
将 LLM 与图学*相结合的挑战
值得注意的是,将 LLM 与图学*相结合涉及若干挑战:
-
效率与可扩展性:LLM 需要大量的计算资源,这在实际应用中,尤其是在资源有限的设备上,带来了部署挑战。知识蒸馏(即将 LLM(教师模型)的知识传递给更小、更高效的 GNN(学生模型))提供了一种有前景的解决方案。
-
数据泄露与评估:LLM 在大规模数据集上进行预训练,可能会面临数据泄露的风险,从而抬高性能指标。缓解这一问题需要新的数据集和仔细的测试数据抽样。建立公平的评估基准对于准确的性能评估也至关重要。
-
迁移性与可解释性:增强 LLM 在不同图领域之间迁移知识的能力,并提高其可解释性至关重要。诸如链式思维提示等技术可以利用 LLM 的推理能力,提供更好的透明度。
-
多模态集成:图通常包含多种数据类型,包括图像、音频和数值数据。将 LLM 集成到这些多模态环境中是一个激动人心的研究机会。随着 LLM 生成质量的快速提升,它将在增强图数据和学*中的智能方面发挥至关重要的作用。
总结
在本章中,我们探讨了将 LLM 与图学*相结合,重点介绍了 LLM 如何增强传统的 GNN。我们讨论了 LLM 的发展历程、其在图中处理文本数据的能力,以及其在改善节点表示和图相关任务中的潜力。你了解了多种在图学*中利用 LLM 的方法,包括特征层面和文本层面的增强,以及通过像 InstructGLM 这样的技术将 LLM 作为预测器使用。
我们还展示了在药物发现、社交网络分析和金融欺诈检测等领域的实际应用,以说明这种集成的实际效益。此外,你还了解了将 LLM 与图学*结合时面临的挑战,如计算成本、数据偏差和可解释性问题,同时学*了该领域未来可能的进展。
在下一章,我们将更深入地探讨将深度学*应用于图中的方法。
第三部分:实际应用与实施
本书的这一部分将带你深入探讨图深度学*在各个领域的实际应用。你将学*如何将基于图的方法应用于自然语言处理,构建推荐系统,并在计算机视觉应用中利用图结构。
本部分包含以下章节:
-
第七章,图深度学*实践
-
第八章,自然语言处理中的图深度学*
-
第九章,使用图深度学*构建推荐系统
-
第十章,计算机视觉中的图深度学*
第七章:图神经网络在实践中的应用
在前几章探讨了图深度学*的理论方面之后,现在是时候通过实际应用来深入了解它了。
社交网络已经成为我们数字生活的一个重要部分,生成了大量数据,可以提供有价值的关于人类行为、关系和社会动态的见解。图深度学*提供了强大的工具,可以分析和提取这些复杂网络中的有意义信息。在本章中,我们将使用PyTorch Geometric(PyG)探讨图深度学*技术在社交网络分析中的实际应用。
在这里,我们将专注于一个假设的数据集,代表大学生的社交网络。这个示例将展示图机器学*如何应用于现实场景,比如预测用户兴趣、推荐新连接以及识别社区结构。
我们的数据集包含以下元素:
-
节点:每个节点代表大学中的一个学生。
-
边缘:节点之间的边表示学生之间的友谊或连接。
-
节点特征:每个学生(节点)都有相关特征,包括以下内容:
-
年龄
-
学年
-
学术专业(编码为独热向量)
-
-
节点标签:每个学生被分配到五个兴趣组之一,我们将用这个进行节点分类任务。
本章中,我们将解决两个主要任务:
-
节点分类:我们将基于学生的特征和网络中的连接来预测学生兴趣。此任务展示了图神经网络(GNNs)如何利用节点属性和网络结构来预测单个节点的情况。
-
链接预测:我们将开发一个模型,通过预测图中的潜在边缘来推荐新朋友。这展示了图深度学*如何应用于推荐系统和网络增长预测。
我们将使用最先进的 GNN 架构来实现这些任务。此外,我们将可视化我们的结果,以便直观地了解网络结构和模型的性能。
到本章结束时,您将对如何将图深度学*技术应用于社交网络数据有实际的理解,能够解读结果,并将这些方法应用到自己的项目中。虽然我们使用合成数据集进行演示,但这里涉及的技术可以很容易地应用于现实世界的社交网络数据。
让我们开始进入图深度学*在社交网络分析中的实际应用世界吧!我们将深入探索以下主题:
-
设置环境
-
创建图数据集
-
节点分类 – 预测学生兴趣
-
链接预测 – 推荐新朋友
设置环境
在深入实现我们的图形深度学*模型之前,首先需要设置开发环境,安装必要的库和工具。在这一部分,我们将涵盖必需的导入,并解释它们在项目中的作用。
首先,让我们开始导入所需的库:
import torch
import torch_geometric
from torch_geometric.data import Data
from torch_geometric.nn import GCNConv, GAE
from torch_geometric.utils import train_test_split_edges
from torch_geometric.transforms import RandomLinkSplit
from sklearn.manifold import TSNE
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import networkx as nx
from sklearn.metrics import roc_auc_score
让我们分解这些导入及其用途:
-
torch :用于张量操作和构建神经网络的核心 PyTorch 库。
-
torch_geometric :PyG,是一个针对图形和其他不规则结构的深度学*扩展库,基于 PyTorch。
-
torch_geometric.data.Data :一个用于创建 PyG 中图形数据对象的类,包含节点特征、边索引和标签。
-
torch_geometric.nn.GCNConv :图卷积网络(GCN)层,用于节点分类。
-
torch_geometric.nn.GAE :图自编码器(GAE),用于链接预测。
-
torch_geometric.utils.train_test_split_edges :一个实用函数,帮助拆分图形数据,用于链接预测任务。
-
torch_geometric.transforms.RandomLinkSplit :一种用于通过将数据拆分为训练集、验证集和测试集来准备链接预测的变换。
-
sklearn.manifold.TSNE :t-分布随机邻居嵌入(t-SNE),用于在可视化节点嵌入时进行降维。
-
sklearn.cluster.KMeans :用于聚类节点嵌入,以识别社交群体。
-
matplotlib.pyplot :用于创建图形和结果可视化的库。
-
networkx :提供额外工具用于处理图形的库,用于一些可视化。
确保在 Python 环境中安装了所有这些库。你可以使用pip进行安装:
pip install torch torch_geometric scikit-learn matplotlib networkx
请注意,安装 PyG(torch_geometric)可能需要根据您的系统和 CUDA 版本进行额外的步骤。请参考官方文档以获取详细的安装说明:pytorch-geometric.readthedocs.io/en/latest/。
导入了这些库后,我们现在准备好开始使用我们的社交网络数据,并实现我们的图形深度学*模型。
创建图形数据集
下一步是创建一个合成的社交网络数据集,以展示我们的图形深度学*技术。虽然真实世界的数据理想,但使用合成数据可以让我们专注于算法的实现和理解,而不必担心数据获取和预处理的复杂性。
在这里,我们将创建一个代表大学生的社交网络数据集。完整代码可以在github.com/PacktPublishing/Applied-Deep-Learning-on-Graphs找到。
让我们分解这段代码,并解释每一部分。
-
我们设置一个随机种子以保证可复现性:
torch.manual_seed(42)这确保了每次运行代码时生成相同的“随机”数据。
-
我们定义我们的数据集参数:
num_nodes = 1000 num_features = 10 num_classes = 5-
num_nodes是我们网络中学生(节点)的数量。
-
num_features是每个学生的特征数。我们使用 10 个特征来表示年龄、年级和 8 个可能的学术专业。
-
num_classes是不同兴趣组的数量,它将作为我们进行节点分类的目标。
-
-
我们使用torch.randn()创建节点特征(x):
x = torch.randn((num_nodes, num_features))这生成了一个大小为(num_nodes, num_features)的张量,填充了来自标准正态分布的随机值。在实际的数据集中,这些特征将是学生的实际属性。
-
我们使用torch.randint()创建边(edge_index):
edge_index = torch.randint(0, num_nodes, (2, 5000))这将在节点之间生成 5,000 个随机边。edge_index张量的形状为(2, 5000),其中每一列表示一条边,格式为[源节点,目标节点]。
-
我们使用torch.randint()创建节点标签(y):
y = torch.randint(0, num_classes, (num_nodes,))这将每个节点(学生)随机分配到五个兴趣组中的一个。
-
我们创建一个 PyG 的Data对象,它有效地存储我们的图数据。我们传入节点特征(x)、边索引(edge_index)和节点标签(y):
data = Data(x=x, edge_index=edge_index, y=y) data.num_classes = num_classes -
最后,我们打印一些关于数据集的信息,以验证其结构:
print(f"Number of nodes: {data.num_nodes}") print(f"Number of edges: {data.num_edges}") print(f"Number of node features: {data.num_node_features}") print(f"Number of classes: {data.num_classes}")
这个合成数据集现在代表了一个社交网络:
-
每个node都是一个拥有 10 个特征(表示年龄、年级和专业等属性)的学生。
-
Edges代表学生之间的友谊。
-
每个学生属于五个兴趣组中的一个。
代码的输出将如下所示:
Number of nodes: 1000
Number of edges: 5000
Number of node features: 10
Number of classes: 5
在实际的场景中,你通常会从文件或数据库中加载数据并进行预处理,以适应这种结构。我们创建的Data对象现在可以与 PyG 的 GNN 模型一起使用。
在接下来的章节中,我们将使用这个数据集执行节点分类、链路预测和图聚类任务。
节点分类——预测学生兴趣
在这一部分,我们将实现一个 GCN,以根据学生的特征和社交网络中的连接预测学生的兴趣。这个任务展示了 GNN 如何利用节点属性和网络结构来做出关于单个节点的预测。
让我们从定义我们的 GCN 模型开始:
class GCN(torch.nn.Module):
def __init__(self, in_channels, hidden_channels, out_channels):
super().__init__()
self.conv1 = GCNConv(in_channels, hidden_channels)
self.conv2 = GCNConv(hidden_channels, out_channels)
def forward(self, x, edge_index):
x = self.conv1(x, edge_index).relu()
x = self.conv2(x, edge_index)
return x
# Initialize the model
model = GCN(in_channels=num_features,
hidden_channels=16,
out_channels=num_classes)
如你所见,我们的 GCN 模型由两个图卷积层组成。第一个层接收输入特征并生成隐藏表示,而第二个层则生成最终的类别预测。
现在,让我们来训练模型。你可以在github.com/PacktPublishing/Applied-Deep-Learning-on-Graphs查看完整的代码。我们来分解训练过程:
-
我们定义了一个优化器(Adam)和一个损失函数(CrossEntropyLoss)来训练我们的模型:
optimizer = torch.optim.Adam(model.parameters(), lr=0.01) criterion = torch.nn.CrossEntropyLoss() -
train()函数执行训练的一个步骤:
def train(): model.train() optimizer.zero_grad() out = model(data.x, data.edge_index) loss = criterion(out, data.y) loss.backward() optimizer.step() return loss-
它将模型设置为训练模式。
-
它计算模型的前向传播。
-
它计算预测结果与真实标签之间的损失。
-
它执行反向传播并更新模型参数。
-
-
test()函数评估模型的性能:
def test(): model.eval() out = model(data.x, data.edge_index) pred = out.argmax(dim=1) correct = (pred == data.y).sum() acc = int(correct) / int(data.num_nodes) return acc-
它将模型设置为评估模式。
-
它计算前向传播。
-
它计算预测的准确性。
-
-
我们训练模型200个周期,每10个周期打印一次损失和准确性:
for epoch in range(200): loss = train() if epoch % 10 == 0: acc = test() print(f'Epoch: {epoch:03d}, Loss: {loss:.4f}, \ Accuracy: {acc:.4f}') -
最后,我们再次评估模型,以获得最终的准确性:
final_acc = test() print(f"Final Accuracy: {final_acc:.4f}")
为了可视化我们的模型表现如何,让我们创建一个函数来绘制预测的兴趣组与真实兴趣组的对比:
def visualize_predictions(model, data):
model.eval()
out = model(data.x, data.edge_index)
pred = out.argmax(dim=1)
plt.figure(figsize=(10, 5))
plt.subplot(121)
plt.title("True Interests")
plt.scatter(
data.x[:, 0], data.x[:, 1], c=data.y, cmap='viridis')
plt.colorbar()
plt.subplot(122)
plt.title("Predicted Interests")
plt.scatter(
data.x[:, 0], data.x[:, 1], c=pred, cmap='viridis')
plt.colorbar()
plt.tight_layout()
plt.show()
visualize_predictions(model, data)
该函数创建两个散点图:一个显示真实的兴趣组,另一个显示预测的兴趣组。

图 7.1:模型性能:真实兴趣与预测兴趣
在图 7.1中,每个点代表一个学生,基于他们的前两个特征进行定位。可视化包括两个散点图,分别标记为真实兴趣和预测兴趣。这些图中的每个点都代表一个学生。这些图中的颜色从紫色(0.0)到黄色(4.0),表示不同的兴趣组。左图显示了学生的实际或“真实”兴趣组,而右图展示了模型对这些兴趣组的预测。这些分布之间的相似性传达了图学*技术在此类预测中的有效性。
在实际应用中,这个节点分类任务可以用于根据学生的个人信息和社交连接预测他们的兴趣。这对于个性化内容推荐、定向广告或提升学生在大学活动中的参与度具有重要价值。
请记住,虽然我们的合成数据集提供了一个干净的示例,现实世界中的数据往往需要更多的预处理、处理缺失值,并且在处理个人数据时需要仔细考虑隐私和伦理问题。
图学*的另一个方面是链路预测任务。这在许多现实场景中都会出现,特别是在我们尝试预测某些连接的情况下。
链路预测——推荐新朋友关系
在本节中,我们将实现一个用于链路预测的 GAE。该任务旨在预测网络中的潜在新连接,可用于推荐学生之间的新朋友关系。
首先,让我们定义我们的 GAE 模型:
class LinkPredictor(torch.nn.Module):
def __init__(self, in_channels, hidden_channels):
super().__init__()
self.encoder = GCNConv(in_channels, hidden_channels)
def encode(self, x, edge_index):
return self.encoder(x, edge_index).relu()
def decode(self, z, edge_label_index):
return (
z[edge_label_index[0]] * z[edge_label_index[1]]
).sum(dim=-1)
def forward(self, x, edge_index, edge_label_index):
z = self.encode(x, edge_index)
return self.decode(z, edge_label_index)
# Initialize the model
model = LinkPredictor(in_channels=num_features, hidden_channels=64)
我们的LinkPredictor模型使用 GCN 层将节点特征编码为嵌入,并使用简单的点积操作进行解码(预测链接)。
现在,让我们使用以下代码为链路预测准备数据:
from torch_geometric.transforms import RandomLinkSplit
# Prepare data for link prediction
transform = RandomLinkSplit(
num_val=0.1, num_test=0.1, is_undirected=True,
add_negative_train_samples=False
)
train_data, val_data, test_data = transform(data)
# Define optimizer
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
RandomLinkSplit变换将我们的图分成训练集、验证集和测试集,用于链路预测。它删除一些边以进行验证和测试,并生成负样本(不存在的边)。
现在,让我们定义训练和评估函数:
-
初始化训练过程,准备优化器,并对输入数据进行编码:
def train_link_predictor(): model.train() optimizer.zero_grad() z = model.encode(train_data.x, train_data.edge_index) -
现在,我们定义正向边并为训练生成负向边:
pos_edge_index = train_data.edge_index neg_edge_index = torch_geometric.utils.negative_sampling( edge_index=pos_edge_index, num_nodes=train_data.num_nodes, num_neg_samples=pos_edge_index.size(1), ) -
结合正向和负向边并创建相应的标签:
edge_label_index = torch.cat([ pos_edge_index, neg_edge_index], dim=-1) edge_label = torch.cat([ torch.ones(pos_edge_index.size(1)), torch.zeros(neg_edge_index.size(1)) ], dim=0) -
模型进行预测,计算损失,执行反向传播,并更新模型参数:
out = model.decode(z, edge_label_index) loss = torch.nn.BCEWithLogitsLoss()(out, edge_label) loss.backward() optimizer.step() return loss -
这开始了测试函数,设置模型为评估模式,并在没有梯度计算的情况下进行预测:
def test_link_predictor(data): model.eval() with torch.no_grad(): z = model.encode(data.x, data.edge_index) out = model.decode(z, data.edge_label_index) -
最后,我们将预测结果转换为 NumPy 数组,并计算接收者操作特征曲线下面积(ROC AUC)得分,以评估模型的表现:
y_true = data.edge_label.cpu().numpy() y_pred = out.cpu().numpy() return roc_auc_score(y_true, y_pred)
现在,让我们编写训练和预测模块:
-
我们训练模型 100 轮,每 10 轮打印一次损失和验证 AUC:
for epoch in range(100): loss = train_link_predictor() if epoch % 10 == 0:train_link_predictor() 函数编码节点特征,预测正负样本的链接,并计算二元交叉熵损失。
-
test_link_predictor() 函数使用 AUC 指标评估模型的性能:
val_auc = test_link_predictor(val_data) print(f'Epoch: {epoch:03d}, Loss: {loss:.4f}, \ Val AUC: {val_auc:.4f}') -
最后,我们在测试集上评估模型,得到最终的 AUC 评分:
test_auc = test_link_predictor(test_data) print(f"Test AUC: {test_auc:.4f}")这里是代码输出:
Epoch: 000, Loss: 0.6911, Val AUC: 0.5528 Epoch: 010, Loss: 0.6779, Val AUC: 0.5297 Epoch: 020, Loss: 0.6732, Val AUC: 0.5068 Epoch: 030, Loss: 0.6696, Val AUC: 0.5156 Epoch: 040, Loss: 0.6666, Val AUC: 0.5172 Epoch: 050, Loss: 0.6668, Val AUC: 0.5139 Epoch: 060, Loss: 0.6642, Val AUC: 0.5142 Epoch: 070, Loss: 0.6631, Val AUC: 0.5132 Epoch: 080, Loss: 0.6611, Val AUC: 0.5130 Epoch: 090, Loss: 0.6600, Val AUC: 0.5135 Test AUC: 0.4843
为了展示我们如何使用这个模型推荐新的友谊关系,我们创建一个函数,用于预测给定学生最可能的新连接:
-
定义函数,设置模型为评估模式,并编码图数据:
def recommend_friends(student_id, top_k=5): model.eval() with torch.no_grad(): z = model.encode(data.x, data.edge_index) -
这里,我们为给定学生与其他学生之间的所有可能连接创建一个边索引:
other_students = torch.arange(data.num_nodes) other_students = other_students[ other_students != student_id] edge_index = torch.stack([ torch.full_like(other_students, student_id), other_students ]) -
这段代码为所有可能的连接预测分数,并根据这些分数选择前 k 个推荐:
scores = model.decode(z, edge_index) top_scores, top_indices = scores.topk(top_k) recommended_friends = other_students[top_indices] -
最后,函数返回推荐的朋友及其相应的分数,以下是一个示例:
return recommended_friends, top_scores # Example usage student_id = 42 # Example student ID recommended_friends, scores = recommend_friends(student_id) print(f"Top 5 friend recommendations for student {student_id}:") for friend, score in zip(recommended_friends, scores): print(f"Student {friend.item()}: Score {score:.4f}")代码输出如下:
Top 5 friend recommendations for student 42: Student 381: Score 1.8088 Student 91: Score 1.6567 Student 662: Score 1.5878 Student 467: Score 1.5143 Student 870: Score 1.4449
这个 recommend_friends 函数接受学生 ID,并基于链接预测模型返回前 k 个推荐的新连接。
在实际应用中,这个链接预测模型可以用于为大学社交网络平台提供好友推荐系统。它可以帮助学生根据共享的特征和网络结构扩展他们的社交圈。
链接预测模型的应用远不止大学社交网络,它还涵盖了多个领域,例如职业社交平台(如 LinkedIn)用于职业连接和商业合作,学术研究网络用于寻找潜在的合著者和研究伙伴,商业应用用于供应链伙伴匹配和 B2B 网络,医疗保健网络用于患者转诊和提供者合作,通过兴趣小组推荐和活动参与者匹配来构建社区,以及内容推荐系统用于发现相似资源和专家内容匹配。这些应用展示了该模型在提升各行业和用例的连接性和合作机会方面的多功能性。
请记住,在使用真实用户数据实现此类系统时,必须考虑隐私问题,并可能需要将其他因素(如用户偏好或共同朋友)纳入推荐算法中。
总结
本章中,我们介绍了图深度学*在社交网络分析中的实际应用,使用了 PyG(PyTorch Geometric)。我们聚焦于一个假设的数据集,代表了大学生社交网络,展示了如何将基于图的机器学*应用于实际场景。
我们共同完成了两个主要任务:节点分类用于预测用户兴趣,链接预测用于推荐新连接。通过逐步的指导,你学会了如何创建一个合成数据集,实现 GCN(图卷积网络)进行节点分类,并使用 GAE(图自编码器)进行链接预测。我们将代码分解成多个片段,涉及数据准备、模型训练、评估和可视化,帮助你理解将图深度学*技术应用于社交网络数据的实际操作。
在接下来的章节中,我们将探讨图深度学*在多个领域的应用,从自然语言处理开始。
第八章:图深度学*与自然语言处理
语言本身天生就是结构化的和关系性的。词语组成句子,句子组成文档,这些文档包含了通过复杂方式相互关联的概念,以传达意义。图结构提供了一个理想的框架来捕捉这些错综复杂的关系,超越传统模型。通过将文本表示为图,我们可以利用图论的丰富表达力和深度学*的计算能力来解决挑战性的自然语言处理(NLP)问题。
在本章中,我们将深入探讨 NLP 中图表示的基本概念,探索各种类型的语言图,如依存树、共现网络和知识图。然后,我们将在此基础上,研究专门为语言任务适配的图神经网络(GNNs)的架构和机制。
我们将讨论以下主题:
-
图结构在 NLP 中的应用
-
基于图的文本摘要
-
使用 GNN 的信息提取(IE)
-
基于图的对话系统
图结构在 NLP 中的应用
自然语言处理(NLP)*年来取得了显著进展,基于图的方法作为一种强大的范式,开始在表示和处理语言信息方面崭露头角。在这一部分,我们介绍了 NLP 中的图结构概念,强调它们的重要性,并探讨了各种类型的语言图。
图表示在语言中的重要性
图表示在捕捉语言中的内在结构和关系方面起着至关重要的作用。它们相较于传统的顺序或词袋模型,提供了多个优势。词袋模型是一种简单的文本表示技术,它通过计算每个词的频率将文档转换为向量,忽略语法和词序:
-
结构信息:图结构可以明确表示语言的层级性和关系性,保留可能在线性表示中丢失的重要语言结构。
-
上下文关系:通过连接相关元素,图能够比顺序模型更有效地捕捉远程依赖和上下文信息。
-
灵活性:图结构可以表示不同层次的语言信息,从词级关系到文档级连接,甚至跨文档的链接。
-
可解释性:图表示通常与人类对语言结构的直观理解相符合,使得它们更具可解释性和可分析性。
-
外部知识的整合:图结构有助于将外部知识源(如本体论或知识库)整合进 NLP 模型。
-
多模态整合:图结构可以自然地表示不同模态之间的关系,例如文本、图像和语音。
语言图的类型
在自然语言处理中,常用几种图结构,每种结构捕捉语言信息的不同方面:
-
依赖树表示句子中词语之间的语法关系:
-
节点是词语,边表示句法依赖关系。
-
示例:在“The cat chased the mouse”中,根动词是“chased”,而“cat”和“mouse”是它的依赖词。图 8.1 展示了这个句子的依赖树表示,并说明了依赖树如何表示句子中词语之间的语法关系:
-

图 8.1 – 句子“The cat chased the mouse”的依赖树表示
图示将“chased”作为根动词,箭头表示与其他词的句法依赖关系,如“cat”(主语)和“mouse”(宾语)。它还包括每个词的词性标注,如DET(限定词)、NOUN(名词)和VERB(动词)。
-
共现图捕捉基于词语在语料库中共同出现的关联。它们在词义消歧和语义相似度等任务中非常有用。
-
节点表示词汇,边表示它们共同出现的频率。
-
示例:假设我们有以下句子:
-
“The cat and dog play.”
-
“The dog chases the cat.”
-
“The cat sleeps on the mat.”
-
在这个例子中,我们将创建一个共现图,其中出现在同一句子中的词语之间建立连接:
-

图 8.2 – 词汇共现图
-
知识图谱表示事实信息以及实体之间的关系:
-
节点是实体(例如,人、地点、概念),边是关系。
-
示例:一些例子包括 ConceptNet、Wikidata 和特定领域的本体。
-

图 8.3 – 电影行业知识图谱
图 8.3 展示了电影行业中各种元素之间的关系,包括导演、电影、类型和奖项。节点表示实体,如电影制片人(例如,克里斯托弗·诺兰、昆汀·塔伦蒂诺)、电影(例如,星际穿越、低俗小说)、类型(例如,科幻、犯罪)和奖项(例如,奥斯卡、英国电影和电视艺术学院奖)。这些节点之间的连接展示了创意人才、电影类别和行业认可之间复杂的相互作用,为电影及其关键人物的多面性提供了见解。
-
语义图 表示句子或文档的含义。它们用于语义分析和抽象意义表示等任务。在自然语言处理中,语义解析 是将自然语言表达转换为其含义的形式化、结构化表示的任务。它涉及将词语和短语映射到概念,识别关系,并生成捕捉输入文本潜在语义的逻辑形式或可执行代码。这一过程使得机器能够更准确和可操作地理解和处理人类语言。
-
节点 可以是概念、事件或命题,边 显示语义关系。
-
示例:图 8.4 中的语义图说明了句子 “John read a book in the library” 如何被分解成其组成部分和关系。图中的节点表示概念,边显示它们之间的语义关系:
-

图 8.4 – 语义图形表示
具体而言,该图显示了以下内容:
-
“John” 与 “Read” 通过 agent_of 标签连接,指示 John 是执行动作的人。
-
“Book” 与 “Read” 通过 object_of 标签连接,显示正在阅读的书籍。
-
“Library” 与 “Read” 通过 location_of 标签连接,指示阅读发生的地点。
-
“John” 也与 “Person” 通过 is_a 关系连接,将 John 归类为一个人。
-
对话图 表示更长文本或对话的结构,用于对话理解和文本连贯性分析等任务。
-
节点 可以是句子或话语,边 显示话语关系。
-
示例:图 8.5 描述了一个简单对话的语篇图,表示为一个简单对话。图中有七个节点(U0 到 U6),每个节点代表对话中的一句话,通过有向边连接,显示了话语之间的流动和关系。边上标有诸如 greeting-response、acknowledgment、question、response 和 acknowledgment-farewell 等话语关系。对话从问候开始(U0),接着是回应(U1),然后分支到承认(U2)和问题(U3)。对话继续以进一步的回应为特点,并以告别结束(U6)。图例提供了每个话语的简要片段,为对话流程提供上下文:
-

图 8.5 – 对话图:简单对话
这种可视化表示有效地展示了话语图如何用于分析对话的结构、一致性和进展,使其成为对话理解和文本一致性分析等任务的有价值工具。
现在,让我们来看看图学*在自然语言处理中的一些实际应用场景。
基于图的文本摘要
基于图的方法在文本摘要中变得越来越流行,因为它们能够捕捉文本元素之间的复杂关系。在这里,我们将探讨两大类基于图的摘要方法:抽取式和生成式。
使用图中心性进行抽取式摘要
抽取式摘要 涉及从原始文本中选择和排列最重要的句子,以形成一个简明的摘要。基于图的抽取式摘要方法通常遵循以下步骤:
-
构建文本的图表示。
-
应用中心性度量来识别重要的节点(句子)。
-
提取排名靠前的句子来构成摘要。
图构建
文本被表示为一个图,其中 节点 是句子,边 表示句子之间的相似性。常见的相似性度量包括以下几种:
-
词频-逆文档频率(TF-IDF)向量的余弦相似性
-
Jaccard 相似性 的词集
-
语义相似性 使用词嵌入
中心性度量
可以使用几种 图中心性 度量来对句子的 importance 进行排序:
-
度数中心性 衡量节点的连接数。
-
特征向量中心性 考虑邻居节点的重要性。
-
PageRank 是特征向量中心性的一种变体,最初由 Google 用于对网页进行排名。
-
超链接诱导主题搜索(HITS)计算节点的中心和权威分数。
示例 – TextRank 算法
TextRank,由 Mihalcea 和 Tarau 在 2004 年提出(aclanthology.org/W04-3252/),是一种受 PageRank 启发的流行图-based 抽取式摘要方法。
让我们来看一个简化的 Python 实现:
-
首先,我们导入必要的库——NetworkX 用于图操作,NumPy 用于数值计算,scikit-learn 用于 TF-IDF 向量化和余弦相似性计算:
import networkx as nx import numpy as np from sklearn.metrics.pairwise import cosine_similarity from sklearn.feature_extraction.text import TfidfVectorizer -
然后,我们定义 textrank 函数,它接受一个句子列表和要返回的前几个句子的数量。它从句子中创建一个 TF-IDF 矩阵,并使用余弦相似性计算相似性矩阵:
def textrank(sentences, top_n=2): tfidf = TfidfVectorizer().fit_transform(sentences) similarity_matrix = cosine_similarity(tfidf) -
我们从相似性矩阵中创建一个图,并在该图上计算 pagerank。每个句子是一个 节点,而相似性是 边的权重:
graph = nx.from_numpy_array(similarity_matrix) scores = nx.pagerank(graph) -
最后,我们根据 pagerank 分数对句子进行排序,并返回前 n 个句子作为摘要:
ranked_sentences = sorted((( scores[i], s) for i, s in enumerate(sentences) ), reverse=True) return [s for _, s in ranked_sentences[:top_n]]
这是textrank函数的示例用法。在此案例中,我们定义了一个示例文本,将其拆分为句子,应用textrank算法,并打印摘要:
text = """
Natural language processing (NLP) is a subfield of linguistics, computer science, and artificial intelligence concerned with the interactions between computers and human language. The ultimate objective of NLP is to read, decipher, understand, and make sense of human languages in a valuable way. NLP is used in many applications, including machine translation, speech recognition, and chatbots.
"""
sentences = text.strip().split('.')
summary = textrank(sentences)
print("Summary:", ' '.join(summary))
图到序列模型的抽象总结
抽象总结旨在生成新的句子,以捕捉原始文本的精髓。图到序列模型通过利用输入文本的结构信息,在这方面取得了有前景的结果。
对于抽象总结,图通常被构建来表示更细粒度的关系:
-
节点:单词、短语或概念
-
边:句法依赖关系、语义关系或共现
一个典型的图到序列模型用于抽象总结,通常包括以下内容:
-
图编码器使用 GNN(例如,图卷积网络(GCNs)或图注意力网络(GATs))来编码输入图。
-
序列解码器生成摘要文本,通常使用注意力机制来关注编码图的相关部分。
抽象意义表示(AMR)到文本的总结
抽象意义表示(AMR)是文本的语义图表示。AMR 到文本总结是图到序列抽象总结的一个例子。让我们考虑一个使用PyTorch的概念性示例:
-
我们导入了必要的库——PyTorch用于深度学*操作,PyTorch Geometric用于 GNN,以及用于神经网络层和功能的特定模块:
import torch import torch.nn as nn import torch.nn.functional as F from torch_geometric.nn import GCNConv from torch_geometric.data import Data -
然后,我们定义了AMRToTextSummarizer类,这是一个神经网络模块。它初始化了一个 GCN 层,一个门控循环单元(GRU)层,以及一个全连接层:
class AMRToTextSummarizer(nn.Module): def __init__(self, input_dim, hidden_dim, output_dim): super().__init__() self.graph_conv = GCNConv(input_dim, hidden_dim) self.gru = nn.GRU( hidden_dim, hidden_dim, batch_first=True) self.fc = nn.Linear(hidden_dim, output_dim) -
这是网络的前向传播。我们首先应用图卷积来编码图结构,然后使用 GRU 进行序列解码,最后应用全连接层生成输出:
def forward(self, data): # Graph encoding x, edge_index = data.x, data.edge_index h = self.graph_conv(x, edge_index) h = F.relu(h) # Sequence decoding h = h.unsqueeze(0) # Add batch dimension output, _ = self.gru(h) output = self.fc(output) return output -
我们设置模型参数并创建一个示例图以进行演示。在这里,我们定义了输入、隐藏层和输出的维度,并创建了一个包含三个节点的图:
input_dim = 100 # Dimension of input node features hidden_dim = 256 output_dim = 10000 # Vocabulary size edge_index = torch.tensor([ [0, 1, 2], [1, 2, 0]], dtype=torch.long) x = torch.randn(3, input_dim) data = Data(x=x, edge_index=edge_index) -
最后,我们实例化模型,使用示例数据进行前向传播,并打印输出 logits 的形状。输出形状为(1,3,10000),表示批次大小为 1,3 个节点,以及 10,000 个词汇的 logits:
model = AMRToTextSummarizer(input_dim, hidden_dim, output_dim) summary_logits = model(data) print("Summary logits shape:", summary_logits.shape)
这个示例演示了一个图到序列模型用于抽象总结的基本结构。实际上,将采用更复杂的架构、注意力机制和训练过程。
使用 GNN 的文本信息抽取(IE)
信息抽取(IE)是 NLP 中的一项关键任务,涉及从非结构化文本中自动提取结构化信息。GNN 在该领域取得了有前景的成果,特别是在事件抽取和开放信息抽取(Open IE)方面。在本节中,我们探讨了 GNN 如何应用于这些 IE 任务。
事件抽取
事件提取是识别和分类文本中提到的事件的任务,并确定其参与者和属性。由于 GNN 能够捕捉文档中实体和事件之间的复杂关系,因此在此任务中已被证明非常有效。
用于事件提取的图构建
在事件提取中,文档通常被表示为图,其中节点表示实体、事件和标记,而边表示各种关系,如句法依赖、共指链和时间顺序。
请考虑以下句子:“约翰·史密斯于周一辞去 TechCorp 首席执行官职务。”
图表示可能包括以下内容:
-
节点: 约翰·史密斯(人名)、TechCorp(公司名)、首席执行官(职位)、周一(时间)、辞职(事件)
-
边:(约翰·史密斯) -[AGENT]->(辞职),(辞职) -[ROLE]->(首席执行官),(辞职) -[ORG]->(TechCorp),(辞职) -[TIME]->(周一)
基于 GNN 的事件提取模型
基于 GNN 的事件提取模型通常包括以下内容:
-
使用预训练的词嵌入或上下文嵌入对初始节点特征进行编码。
-
通过应用多层图卷积来传播图中的信息。
-
使用最终的节点表示来分类事件及其论据。
图 8 .6 显示了一个示例架构:

图 8.6 – 基于 GNN 的事件提取模型架构和流程
一项最新研究(aclanthology.org/2021.acl-long.274/)表明,基于 GNN 的模型在超越传统的基于序列的模型方面表现优越,尤其在捕捉长程依赖关系和处理单一文档中的多个事件时表现突出。具体来说,基于图的的方法在处理跨句子事件和多事件场景方面取得了显著的改进,这得益于一个异构图交互网络,该网络捕捉了全局上下文,并且有一个追踪器模块,模型了事件之间的相互依赖关系。该模型的有效性在提取涉及多个散布在不同句子中的论据的事件时尤为明显,这验证了 GNN 在捕捉长程依赖关系方面相比传统序列模型的优越性。
开放信息提取
开放信息提取(OpenIE)旨在从文本中提取关系三元组(主语、关系、宾语),而不受预定义关系集的限制。GNN 已成功应用于此任务,利用了句子的图结构特性。
基于图的开放信息提取方法
在基于图的开放信息提取(OpenIE)系统中,句子通常被转换为依赖解析树,然后作为 GNN 的输入图。
例如,在句子“爱因斯坦提出了相对论”中,依赖解析可能如下所示:

图 8.7 – 使用依赖解析的基于图的 OpenIE 方法
GNN 处理 OpenIE
GNN 通过多个步骤处理图形:
-
节点编码:每个单词使用上下文嵌入进行编码。
-
图卷积:信息沿依赖边传播。
-
关系预测:模型预测节点对之间的潜在关系。
-
三元组形成:基于预测构建有效的主语-关系-宾语三元组。
使用我们之前的示例,输出将如下所示:(爱因斯坦,开发,相对论)。
基于 GNN 的信息提取的优势
基于 GNN 的信息提取方法提供了几个优势:
-
捕捉可能被顺序模型遗漏的长程依赖
-
将各种类型的语言信息(句法、语义、指代)整合到一个统一的框架中
-
处理具有复杂结构的文档,如科学论文或法律文档
该领域未来的研究可能会集中在将 GNN 与其他深度学*架构(如 transformers)结合,以创建融合两种方法优点的混合模型,从而实现更准确和全面的信息提取。
基于图的对话系统
对话系统是复杂的人工智能应用,旨在通过自然语言促进人机互动。这些系统采用各种 NLP 技术,如自然语言理解、对话管理和自然语言生成,来解释用户输入、维护上下文并生成适当的回应。现代对话系统通常结合机器学*算法,以提高其性能,并根据用户偏好和过去的互动进行自我学*和调整。它们在多个领域中都有应用,包括客户服务、虚拟助手、教育工具和互动故事讲述,不断发展以提供更自然和高效的人机沟通。
基于图的方法在提升对话系统的性能和能力方面展现了显著的前景。通过利用图结构来表示对话上下文、知识和语义关系,这些系统能够更好地理解用户意图、跟踪对话状态,并生成更连贯、上下文适当的回应。
使用 GNN 进行对话状态跟踪
对话状态跟踪(DST)是面向任务的对话系统中的一个关键组件,负责在整个对话过程中保持用户目标和偏好的最新表示。GNN 已成功应用于提高 DST 的准确性和鲁棒性。
在典型的基于 GNN 的 DST 方法中,对话历史被表示为图形,其中节点代表话语、槽位和数值,而边则捕捉这些元素之间的关系。随着对话的进行,图形会动态更新,GNN 层被应用于在图形中传播信息,从而实现更准确的状态预测。
例如,Chen 等人于 2020 年提出的图状态追踪器(GST)( doi.org/10.1609/aaai.v34i05.6250 )使用 GAT 来建模不同对话元素之间的依赖关系。该方法在基准数据集如 MultiWOZ 上表现出了优越的性能,特别是在处理复杂的多领域对话时。
基于图的响应生成
图结构还可以显著提高生成响应的质量和相关性,无论是在任务导向型还是开放领域的对话系统中。通过结合知识图谱或对话流图,这些系统可以生成更具信息性、连贯性和上下文适宜性的响应。
一种方法是使用图到序列模型,其中输入的对话上下文首先被转换为图形表示,然后图感知解码器生成响应。这使得模型能够捕捉对话历史中的长程依赖关系和复杂关系。
例如,Yang 等人于 2021 年提出的GraphDialog模型( doi.org/10.18653/v1/2020.emnlp-main.147 )构建了一个对话图,捕捉了局部上下文(最*的话语)和全局上下文(整体对话流程)。该模型随后使用图注意力机制生成更符合整个对话历史的响应。该方法将对话表示为结构化的图,其中节点代表话语,边捕捉它们之间的各种关系,如时间序列和语义相似性。图结构使得模型能够更好地理解对话中的长程依赖关系和主题联系,超越了传统顺序模型的局限性。此外,图注意力机制帮助模型在生成响应时专注于相关的历史上下文,即使它发生在对话的许多轮之前。
该架构在维持长时间对话中的连贯性以及处理需要整合对话不同部分上下文的复杂多主题对话中表现出了特别的效果。
使用图的知识驱动对话
将外部知识纳入对话系统对于生成信息丰富且引人入胜的响应至关重要。基于图的方法提供了一种有效的方式,在对话模型中表示和利用大规模知识库。
知识图谱可以通过多种方式集成到对话系统中:
-
作为事实信息源:系统可以查询知识图谱以检索相关事实,并将其融入响应中。
-
用于实体链接和消歧:图结构可以帮助解决歧义,并将对话中的提及链接到知识库中的特定实体。
-
引导响应生成:图结构可以为生成过程提供指导,确保生成的响应与已知事实和关系一致。
这种方法的一个例子是知识感知图增强 GPT-2(KG-GPT2)模型,该模型由 W Lin 等人提出(doi.org/10.48550/arXiv.2104.04466)。该模型将知识图谱集成到预训练的语言模型中,使其能够在开放领域的对话中生成更有信息量且事实正确的响应。
假设你正在使用虚拟助手规划伦敦之行。你首先询问关于酒店的信息,然后是餐厅,最后是交通工具。基于传统的 GPT-2 系统,可能难以在这些不同领域之间连接相关信息。例如,如果你提到想要“伦敦市中心的豪华酒店”,然后又询问“我酒店附*的餐厅”,系统需要理解你是在寻找伦敦市中心的高档餐厅。
上述论文中提出的模型通过使用图网络在相关信息之间建立连接来解决这个问题。它分为三个步骤:
-
首先,它通过 GPT-2 处理你的对话以理解上下文。
-
然后,它使用图注意力网络(GATs)来连接不同服务之间的相关信息(如位置、价格范围等)。
-
最终,它利用这种增强的理解来更好地预测你想要的内容。
研究人员发现,当面对有限的训练数据时,这种方法尤其有效。换句话说,这意味着系统即使没有见过许多类似的对话,也能够学会做出良好的推荐。例如,如果它学到预订豪华酒店的人通常也会预订高档餐厅和高级出租车,它可以将这种模式应用到新的对话中。
他们的方法在现有系统上显示了显著的改进,尤其是在理解不同服务(如酒店和餐厅)之间的关系并保持对话的一致性方面。这使得该系统在实际应用中(如旅行预订或餐厅预定系统)更加自然和高效。
基于图的对话策略学*
在任务导向的对话系统中,图结构也可以被用来改善对话策略学*。通过将对话状态、动作空间和任务结构表示为图,强化学*算法能够更有效地探索和利用动作空间。
例如,2021 年陈等人提出的基于图的对话策略(GDP)框架(aclanthology.org/C18-1107)使用 GNN 来建模不同对话状态和行动之间的关系。该方法可以更高效地进行策略学*,特别是在复杂的多领域场景中。
使用图形进行语言理解存在一个潜在的可扩展性问题,这与非线性记忆复杂度相关。基于图的自然语言处理中的二次记忆复杂度问题源于,当将文本转换为一个完全连接的图时,每个标记/词语都需要与其他每个标记连接,从而导致
的连接,其中
是序列长度。
例如,在一份 1,000 字的文档中,必须在内存中存储 100 万个边。对于类似于 Transformer 的架构,这尤其成问题,因为每个连接还存储了注意力权重和边特征。现代自然语言处理任务通常需要处理更长的序列或同时处理多个文档,这使得这种二次扩展在内存使用和计算资源方面变得不可持续。常见的缓解策略包括稀疏注意力机制、层次图结构和滑动窗口方法,但这些方法可能会丧失文本中的重要长程依赖性。有关可扩展性问题的更深入讨论,请参见第五章。
总结
本章涵盖了广泛的主题,从自然语言处理中的图表示基础概念开始,逐步深入到各种应用。包括基于图的文本摘要、使用 GNN 的信息抽取(IE)、开放信息抽取(OpenIE)、将自然语言映射到逻辑、基于知识图谱的问答和基于图的对话系统。
你已经了解到,基于图的方法为增强对话系统的各个方面提供了强大的工具,从状态跟踪到响应生成和策略学*。随着该领域研究的不断深入,我们可以期待看到更多利用图表示提供的丰富结构信息的更复杂、更强大的对话系统。
在下一章中,我们将探讨图学*在推荐系统中的一些非常常见的应用场景。
第九章:使用图神经网络构建推荐系统
推荐系统已经成为我们数字化生活的重要组成部分,深刻地影响了我们与各种内容、产品和服务的互动方式。从电商巨头亚马逊到流媒体平台 Netflix,再到社交媒体网络 Facebook,这些系统在提升用户体验、推动互动和提升业务成果方面发挥着至关重要的作用。当我们深入探讨使用图神经网络构建推荐系统时,了解这些系统的发展历程以及基于图的方法的变革潜力至关重要。
传统上,推荐系统依赖于协同过滤(CF)、基于内容的过滤和混合方法等技术。尽管这些方法在一定程度上取得了成功,但它们往往未能充分捕捉到用户-物品交互的复杂性和互联性,以及围绕这些交互的丰富上下文信息。这就是图神经网络进入的地方,它为我们处理推荐任务提供了一种范式转变。
基于图的推荐方法提供了诸多优势,包括能够为多种信息类型提供丰富的多模态表示,捕捉超越直接用户-物品交互的高阶关系,通过信息传播有效处理数据稀疏问题,具备解决冷启动问题的归纳学*能力,通过图结构分析增强可解释性,并且灵活地融入各种类型的辅助信息和异构数据。综合来看,这些特点使得基于图的方法能够通过利用用户-物品交互数据及相关上下文信息中固有的复杂关系和结构,提供更全面、准确和适应性强的推荐。
在本章内容中,我们将探讨以下主题:
-
推荐系统的基本原理
-
推荐系统中的图结构
-
基于图的推荐模型
-
训练图神经网络模型
-
基于图的推荐系统的可解释性
-
冷启动问题
推荐系统的基本原理
推荐系统,也称为 推荐引擎,是旨在预测和建议用户可能感兴趣或相关的项目或内容的智能算法。这些系统通过分析用户行为、偏好和项目特征中的模式,生成个性化的推荐。推荐系统的主要目的是通过提供相关内容来提升用户体验,增加用户参与度和留存率,推动电子商务平台的销售和转化,帮助在庞大的项目目录中发现内容,并在各个领域个性化服务。推荐系统在解决信息过载问题中发挥着至关重要的作用,通过根据用户偏好和行为过滤和优先排序内容。
推荐系统已经成为我们数字体验中不可或缺的一部分,影响着我们在电子商务、娱乐、社交媒体等各个领域的选择。本节将深入探讨推荐系统的核心概念、类型和评估指标,为理解其在现代应用中的作用奠定坚实的基础。
假设我们正在考虑一个流媒体服务,它正在为其用户构建一个推荐系统。该公司拥有用户与电影的交互数据以及每部电影的元数据。我们将探讨如何利用这些数据提供更好的推荐,并有效地提高用户的净推荐值和观看时长。
推荐系统的类型
推荐系统主要有三种类型,每种类型都有其独特的推荐生成方法:
-
协同过滤(CF) 基于这样一个前提:过去有相似偏好的用户,未来也会有相似的偏好。它利用用户与物品的交互数据来识别模式并做出预测。主要有两种方法:基于用户的协同过滤,它会推荐类似用户喜欢的物品;基于物品的协同过滤,它会推荐与用户过去喜欢的物品相似的物品。协同过滤的优势在于能够捕捉复杂的用户偏好,并且在数据稀疏的情况下表现良好。然而,它也面临一些挑战,如新用户或新物品的冷启动问题以及在大数据集中的可扩展性问题。
在我们的电影推荐系统中,假设有一位用户 Alice,她给几部电影打了很高的分数,包括 《肖申克的救赎》(5 星)、《低俗小说》(4 星)和 《教父》(5 星)。基于用户的协同过滤(CF)会找到与 Alice 有相似评分模式的用户,例如 Bob,他给这些电影打的分也很相似,并且给 《盗梦空间》 打了高分。因此,系统可能会根据 Bob 的高评分推荐 《盗梦空间》 给 Alice。而基于物品的协同过滤(CF)则会找到与 Alice 高评分的电影相似的电影。它可能会发现喜欢 《肖申克的救赎》 的用户也喜欢 《绿里奇迹》,从而向 Alice 推荐这部电影。
-
基于内容的过滤根据物品的特征和用户过去的偏好推荐物品。它为每个用户和物品构建一个基于其特征的档案,并使用用户档案与物品特征之间的相似度来生成推荐。这种方法的优点是能为推荐提供解释,并且对于小众物品效果良好。然而,它在扩展用户兴趣方面存在局限性,并且需要丰富的物品元数据。在我们的电影示例中,我们会分析 Alice 喜欢的电影特征,如《肖申克的救赎》(剧情片,由弗兰克·达拉邦特执导,蒂姆·罗宾斯和摩根·弗里曼主演,1994 年上映)和《教父》(犯罪/剧情片,由弗朗西斯·福特·科波拉执导,马龙·白兰度和阿尔·帕西诺主演,1972 年上映)。在这种情况下,系统可能会推荐其他 1970 年代或 1990 年代的剧情电影,或者推荐有摩根·弗里曼或阿尔·帕西诺出演的影片。
-
混合系统结合了多种推荐方法,利用它们的优势并减少其弱点。常见的混合策略包括加权方法,这些方法结合来自不同推荐系统的得分;切换方法,根据上下文选择不同的推荐系统;以及特征组合技术,利用来自不同来源的特征作为单一推荐系统的输入。混合系统通常能提供更好的性能,但在设计和实施方面带来了更大的复杂性。在我们的示例中,混合方法可能会结合协同过滤(CF)和基于内容的过滤。它可以使用 CF 来找到与 Alice 相似的用户,然后根据她偏好的内容特征,如偏爱某些年代的电视剧或电影,过滤这些推荐结果。
表 9.1 提供了不同类型的比较,突出了它们的关键特征、优点和局限性:
| 特征 | 协同过滤(CF) | 基于内容的过滤 | 混合系统 |
|---|---|---|---|
| 所需数据 | 用户-物品交互 | 物品特征和用户偏好 | 两种类型的数据 |
| 优点 | - 能很好地捕捉用户偏好 - 发现新兴趣 - 在物品信息最少的情况下有效 | - 物品无冷启动问题 - 可以解释推荐 - 适合小众物品 | - 更高的准确性 - 克服单一方法的局限性 - 更加稳健 |
| 缺点 | - 冷启动问题 - 稀疏性问题 - 对新物品有限制 | - 限制偶然性 - 需要详细的物品特征 - 过度专门化 | - 实现复杂 - 计算开销大 - 需要更多数据 |
| 最佳使用场景 | 电子商务、社交媒体 | 新闻文章、专业内容 | 大型平台、流媒体服务 |
表 9.1 – 不同推荐系统类型的比较
关键指标与评估
评估推荐系统的性能对于理解其有效性和指导改进至关重要。常用的几个指标和评估技术包括:
准确性指标
这是我们定义这些常用度量的方法:
-
精度衡量推荐项中相关项所占的比例:
- 精度 = (相关推荐项的数量) / (推荐项的总数)
-
召回率衡量成功推荐的相关项所占的比例:
- 召回率 = (相关推荐项的数量) / (相关项的总数)
-
F1 得分是精度和召回率的调和均值,提供一个平衡的衡量:
- F1 = 2 × (精度 × 召回率) / (精度 + 召回率)
-
均值平均精度(MAP)计算每个用户的平均精度分数的均值:
-
,其中我们有以下内容:-
是用户的数量。 -
是该用户的平均精度,
。 -
/ 相关项的数量 -
是截断点的精度,
。 -
是指示函数(如果项
相关则为 1,否则为 0)。
-
-
-
规范化折扣累积增益(NDCG)衡量排名的质量,同时考虑推荐列表中相关项的位置:
-
,其中我们有以下内容:-
![<mml:math >mml:miD</mml:mi>mml:miC</mml:mi>mml:miG</mml:mi><mml:mfenced separators="|">mml:mrowmml:miD</mml:mi>mml:mii</mml:mi>mml:mis</mml:mi>mml:mic</mml:mi>mml:mio</mml:mi>mml:miu</mml:mi>mml:min</mml:mi>mml:mit</mml:mi>mml:mie</mml:mi>mml:mid</mml:mi><mml:mi mathvariant="normal"> </mml:mi>mml:miC</mml:mi>mml:miu</mml:mi>mml:mim</mml:mi>mml:miu</mml:mi>mml:mil</mml:mi>mml:mia</mml:mi>mml:mit</mml:mi>mml:mii</mml:mi>mml:miv</mml:mi>mml:mie</mml:mi><mml:mi mathvariant="normal"> </mml:mi>mml:miG</mml:mi>mml:mia</mml:mi>mml:mii</mml:mi>mml:min</mml:mi></mml:mrow></mml:mfenced>mml:mo=</mml:mo><mml:mi mathvariant="normal">Σ</mml:mi><mml:mfenced separators="|">mml:mrowmml:mir</mml:mi>mml:mie</mml:mi>mml:msubmml:mrowmml:mil</mml:mi></mml:mrow>mml:mrowmml:mii</mml:mi></mml:mrow></mml:msub>mml:mo/</mml:mo>mml:mrowmml:mrowmml:msubmml:mrow<mml:mi mathvariant="normal">log</mml:mi></mml:mrow>mml:mrowmml:mn2</mml:mn></mml:mrow></mml:msub></mml:mrow>mml:mo</mml:mo>mml:mrow<mml:mfenced separators="|">mml:mrowmml:mii</mml:mi>mml:mo+</mml:mo>mml:mn1</mml:mn></mml:mrow></mml:mfenced></mml:mrow></mml:mrow></mml:mrow></mml:mfenced></mml:math>]()
-
是理想的
(最大可能的
)。 -
是位置
上项目的相关性得分。 -
是排名列表中的位置。
-
-
假设我们向爱丽丝推荐了五部电影,她最终喜欢了其中三部,那么精度将为 3/5 = 0.6 或 60%。如果爱丽丝总共会喜欢 10 部电影,那么召回率为 3/10 = 0.3 或 30%。F1 分数作为一种平衡度量,在这种情况下大约为 0.4 或 40%。
错误度量
错误度量通常衡量预测评分与实际评分之间的平均差异,例如以下情况:
-
均方误差(MAE)衡量预测评分与实际评分之间的平均绝对差异:
,其中
是预测的数量
-
均方根误差(RMSE)与 MAE 相似,但对大误差的惩罚更加严格:
例如,如果我们为五部电影预测了评分,且我们预测与 Alice 实际评分之间的平均差距为 0.42 星,这就是我们的 MAE。这表明,平均而言,我们的预测偏差大约是 0.42 星。
覆盖率、多样性和意外性
覆盖率指标评估系统推荐广泛物品的能力。物品覆盖率衡量系统能够推荐的目录中物品的百分比,而用户覆盖率则表示系统能够为多少用户生成推荐。在我们的电影系统中,我们可能会衡量我们能够推荐目录中 3,000 部电影的百分比(物品覆盖率),以及我们 1,000 个用户中有多少收到推荐(用户覆盖率)。
同时,多样性指标评估推荐项目之间的多样性(或不相似性),确保用户收到的建议是多样的,而不是相似的。另一方面,意外性则评估系统提供意想不到但相关的推荐的能力,为用户创造愉悦的惊喜。它结合了意外性和相关性两个元素,通常通过意外性得分和相关性评估来衡量。虽然两者相关,但多样性和意外性是不同的:多样化的推荐不一定总是意外的,意外的推荐通常会增加多样性,但反之则不然。
这些指标对于创建一个平衡的推荐系统至关重要,该系统能够为用户提供多样化、有趣且令人惊喜的推荐(更多内容请参见 doi.org/10.1145/2926720 )。
A/B 测试和用户反馈
尽管离线指标提供了有价值的见解,但实际表现最好通过A/B 测试和用户反馈来评估。A/B 测试涉及通过与真实用户比较两个版本的推荐系统,并衡量关键绩效指标,如点击率、转化率或用户参与度。用户反馈,无论是显式(通过评分或调查)还是隐式(通过点击或购买行为),对于持续改进和验证推荐系统至关重要。长期的用户满意度,通过用户留存率和参与度指标来衡量,也是评估推荐对用户信任和平台忠诚度影响的重要因素。
评估推荐系统需要一种整体性的方法,既考虑离线指标,也考虑实际表现。随着推荐系统的日益复杂,尤其是图深度学*技术的整合,评估方法不断发展,以捕捉推荐质量和用户满意度的细微方面。
推荐系统中的图结构
图结构已成为建模推荐系统中复杂关系的强大范式。通过将用户、项目及其交互表示为图中的节点和边缘,我们可以捕获传统基于矩阵的方法常常忽略的丰富、多维的信息。
用户-项目交互图
基于图的推荐系统的基础是用户-项目交互图。在这个结构中,用户和项目被表示为节点,而交互(例如评分、观看或购买)则形成它们之间的边缘。
对于电影推荐系统,图可能如下所示:
-
节点 :用户(U1,U2,U3……)和电影(M1,M2,M3……)
-
边缘 :评分或观看(例如,U1 -> M1,权重为 4 星)
这个简单的结构已经可以进行比传统用户-项目矩阵更细致的分析。例如,我们可以轻松识别以下内容:
-
流行电影(有许多入边的节点)
-
活跃用户(具有许多出边的节点)
-
相似的用户或电影(具有相似边缘模式的节点)
假设用户 U1 已观看并评价过电影 M1(4 星)、M2(3 星)和 M3(5 星)。为了向 U1 推荐新电影,我们可以遍历图,找到评分模式相似的用户,推荐他们喜欢但 U1 尚未观看的电影。
融入附加信息
现实世界的推荐系统通常可以访问超出用户-项目交互的数据。图结构擅长无缝地整合这些附加信息。在电影推荐中,我们可能会通过以下方面来增强我们的图:
-
电影属性:
-
类型(动作、喜剧、剧情等)
-
导演
-
演员
-
上映年份
-
-
用户属性:
-
年龄
-
性别
-
位置
-
-
社交连接:
- 用户之间的好友关系
这些额外的节点和边缘创建了一个异构图,其中不同类型的节点和关系共存。这种丰富的结构使得更复杂的推荐算法成为可能。让我们扩展一下之前的例子。现在,电影 M1 有了额外的连接:
-
类型:动作
-
导演:D1
-
演员:A1, A2
用户 U1 与以下方面相关联:
-
年龄 组:25-34
-
位置:纽约
通过遍历这个增强后的图,我们可以做出更细致的推荐。例如,我们可以推荐一部由 D1 导演的动作片,这部片子在 U1 所在的纽约地区的同龄人群体中很受欢迎,即使它与 U1 之前观看的电影没有直接关联。
时间图
时间是推荐系统中的一个关键因素,尤其是对于电影这样的领域,偏好变化可能非常迅速。时间图将时间信息融入图结构。
有几种方法可以在图中表示时间:
-
时间戳边缘:每个交互边缘都包含一个时间戳
-
基于时间的节点拆分:为同一用户或项目在不同时间点创建多个节点
-
动态图:图结构本身会演变,节点和边缘会出现或消失
对于电影推荐,时间图可以捕捉以下内容:
-
用户偏好的变化
-
电影流行度的生命周期
-
观看*惯的季节性趋势
假设用户 U1 在 2020 年主要观看喜剧片,但在 2021 年转向观看剧情片。时间图会保留这一信息,使推荐系统能够优先考虑用户最*的偏好,同时仍然考虑长期模式。
我们可能这样表示:
U1_2020 -> M1 (Comedy, watched Jan 2020)
U1_2020 -> M2 (Comedy, watched Jun 2020)
U1_2021 -> M3 (Drama, watched Jan 2021)
U1_2021 -> M4 (Drama, watched May 2021)
这种结构使得顺序推荐成为可能,系统可以根据用户最*的观看历史和整体趋势推荐下一部电影。
多关系图
在电影推荐等复杂领域中,不同类型的关系常常共存。多关系图使我们能够显式地表示这些多样化的连接。
对于电影,我们可能有以下几种关系:
-
用户-电影 : "已评分" , "已观看" , 和 "已加入心愿单"
-
用户-用户 : "是朋友" 和 "有相似的品味"
-
电影-电影 : "有相同的类型" , "有相同的导演" , 和 "是续集"
每种关系在推荐过程中可以具有不同的语义和重要性。以下是一个例子:
U1 --("rated", 5)-> M1
U1 --("is friends with")-> U2
U2 --("rated", 4)-> M2
M1 --("has same director")-> M2
这种多关系结构使得基于路径的推荐变得更加复杂。例如,我们可能会因为以下原因推荐 M2 给 U1:
-
U1 的朋友 U2 给予了高度评价。
-
它与 U1 喜欢的 M1 有相同的导演。
通过利用这些复杂的关系,多关系图使得推荐更加具备上下文性和可解释性。
图结构在捕捉复杂关系、整合多样化信息源和建模时间动态方面表现出色。正如我们在后续章节中所看到的,这些丰富的图结构为复杂的深度学*模型奠定了基础,能够生成高度个性化且精准的推荐。
基于图的推荐模型
基于图的推荐模型作为捕捉用户与项目之间复杂关系的强大工具,已在推荐系统中崭露头角。这些模型利用用户-项目交互图中固有的丰富结构信息,生成更加准确和个性化的推荐。在本节中,我们将探讨三种主要的基于图的推荐模型,从带有图正则化的矩阵分解(MF)开始。
带有图正则化的 MF
MF是 CF 中的一种基本技术,它与图结构的结合使得推荐质量得到了显著提升。图正则化在 MF 模型中的作用是帮助将用户-项目交互图的结构信息纳入学*过程中。
基本思路是向传统 MF 目标函数中添加一个正则化项,鼓励图中相连的节点具有相似的潜在表示。这种方法有助于捕捉用户-项目图的局部结构,并能产生更准确的推荐。
对于电影推荐,考虑一个场景,其中用户和电影是节点,评分是边。图正则化项会鼓励那些评分相似的用户拥有相似的潜在因素,并且那些被相似评分的电影也会拥有相似的潜在因素。
带有图正则化的 MF 的典型目标函数可能如下所示:

这里,
和
分别是用户的潜在因子
和物品的潜在因子
,
和
是用户-用户图和物品-物品图中的边集,而
和
是正则化参数。
该方法在传统的 MF(矩阵分解)方法上表现出更好的性能,特别是在数据稀疏的场景下,因为它能够利用图结构为交互较少的用户或物品做出更好的预测。
图神经网络模型
正如我们在第四章中看到的,图神经网络 (GNNs) 通过在图结构数据上进行直接学*,革命性地改变了基于图的推荐领域。以下模型能够捕捉高阶连接模式,并学*丰富的节点表示,结合了节点特征和图结构。
PinSage
PinSage 是由 Pinterest 开发的一个开创性 GNN 模型,用于大规模推荐系统。它采用GraphSAGE架构,有效地为 Web 规模图中的节点生成嵌入。
在电影推荐的背景下,PinSage 可以用来为用户和电影生成嵌入。该模型会聚合节点的局部邻域信息,不仅捕捉直接交互,还能捕捉更高阶的关系。例如,它可以识别出两个没有看过相同电影的用户,如果他们观看过相似的电影,可能仍然具有相似的口味。
PinSage 的关键步骤如下:
-
邻域采样:对于每个节点,采样固定数量的邻居,以使大规模图上的计算变得可行。
-
特征聚合:使用可学*的聚合函数从采样的邻居中聚合特征。
-
嵌入生成:将聚合的邻域信息与节点特征结合,生成最终的嵌入。
神经图协同过滤
神经图协同过滤 (NGCF) 显式地将用户-物品图结构融入到嵌入学*过程中。它在用户-物品交互图上传播嵌入,以捕捉协同信号。
对于电影推荐,NGCF 从用户和电影的初始嵌入开始,然后通过沿着用户-电影交互图的边传递信息,逐步更新这些嵌入。这个过程使得模型能够捕捉用户与电影之间的高阶连接性。
NGCF 中的嵌入更新过程可以描述如下:

这里,
是用户的嵌入,
,位于第
层。
是用户与之交互的项目集,
,而
和
是可学*的权重矩阵。
LightGCN
LightGCN 通过去除特征转换和非线性激活,简化了 NGCF 模型,专注于图卷积网络(GCNs)在协同过滤(CF)中的最核心部分:邻域聚合。
在电影推荐的背景下,LightGCN 将用户和电影表示为二分图中的节点。然后,该模型执行多层邻域聚合,以捕捉高阶连接性。最终的嵌入是所有层的嵌入的加权和。
LightGCN 中的嵌入传播规则如下:

LightGCN 的简单性使其在计算上非常高效,同时在许多推荐任务上仍能达到最先进的性能。
训练图深度学*模型
训练图深度学*模型以用于推荐系统是一个复杂的过程,需要仔细考虑多个因素。在本节中,我们将提供一个全面的训练指南。
数据预处理
有效的数据预处理对基于图的推荐模型的成功至关重要。让我们深入了解其中的步骤。
构建交互图
创建一个高质量的交互图是基于图的推荐系统的基础。让我们来看一下:
-
节点创建:
-
为每个用户和电影分配唯一的标识符。
-
创建节点属性以存储相关信息。
-
-
边创建:
-
根据用户-电影交互创建边。
-
考虑不同类型的交互(例如,评分、观看和点赞)。
-
-
边加权:
-
根据交互强度为边分配权重。
-
标准化权重,以确保不同交互类型之间的一致性。
-
-
处理 时间信息:
-
将交互的时间戳作为边的属性。
-
考虑为重复的交互创建多个边。
-
这是构建更详细图的示例伪代码:
import networkx as nx
from datetime import datetime
def build_movie_graph(interactions):
G = nx.Graph()
for user_id, movie_id, rating, timestamp in interactions:
# Add user node with type attribute
user_node = f"user_{user_id}"
G.add_node(user_node, type="user",
last_active=timestamp)
# Add movie node with type attribute
movie_node = f"movie_{movie_id}"
G.add_node(movie_node, type="movie")
# Add or update edge
if G.has_edge(user_node, movie_node):
G[user_node][movie_node]['weight'] += 1
G[user_node][movie_node]['last_interaction'] = timestamp
G[user_node][movie_node]['ratings'].append(float(rating))
else:
G.add_edge(user_node, movie_node,
weight=1,
last_interaction=timestamp,
ratings=[float(rating)])
return G
以下函数将图中的边权重标准化,以提供相对的交互强度度量:
def normalize_edge_weights(G):
for edge in G.edges():
ratings = G.edges[edge].get('ratings', [])
if ratings:
avg_rating = np.mean(ratings)
# Store average rating:
G.edges[edge]['rating'] = avg_rating
# Normalize to [0,1]:
G.edges[edge]['weight'] = avg_rating / 5.0
else:
G.edges[edge]['rating'] = 0
G.edges[edge]['weight'] = 0
特征工程
你可以通过丰富的特征来增强图的表现,以提升模型性能:
-
用户特征:
-
人口统计信息,如年龄、性别和位置
-
行为特征,如平均评分、类型偏好和活跃度
-
派生特征,如基于观看模式的用户细分
-
-
电影特征:
-
基本属性,如类型、发行年份和时长
-
制作细节,如导演、演员、预算和制作公司
-
性能指标,如票房收入和评论评分
-
派生特征,如流行度评分和类型嵌入
-
-
时间特征:
-
基于时间的用户特征,如观看频率和自上次活动以来的时间
-
基于时间的电影特征,如电影的年龄和季节性流行度
-
-
基于图的特征:
-
节点度数,如用户评分的电影数量或电影的评分数量
-
中心性度量,如 PageRank 和介数中心性
-
社区检测——例如,将社区标签分配给节点
-
这是一个高级特征工程的示例:
import numpy as np
from sklearn.preprocessing import StandardScaler
def engineer_user_features(G, user_data):
user_features = {}
for node, data in G.nodes(data=True):
if data['type'] == 'user':
user_id = node.split('_')[1]
# Add check if user exists in user_data:
if user_id in user_data:
user_info = user_data[user_id]
# Basic features
features = [
float(user_info['age']), # Convert to float
float(user_info['gender_encoded']),
float(user_info['location_encoded']),
]
# Behavioral features
# Get ratings directly from edges
ratings = [G[node][edge].get(
'rating', 0) for edge in G[node]]
avg_rating = np.mean(ratings) if ratings else 0
rating_count = G.degree(node)
features.extend([avg_rating, float(rating_count)])
# Add genre preferences
genre_preferences = calculate_genre_preferences(
G, node)
features.extend(genre_preferences)
user_features[node] = np.array(
features, dtype=np.float32)
return user_features
以下函数计算给定用户的类型偏好。这作为前述特征工程过程的一部分:
def calculate_genre_preferences(G, user_node):
genre_counts = {genre: 0 for genre in GENRE_LIST}
total_ratings = 0
# Iterate through neighboring movie nodes
for neighbor in G[user_node]:
if neighbor.startswith('movie_'):
movie_id = neighbor.split('_')[1]
if movie_id in movie_data:
genres = movie_data[movie_id]['genres']
rating = G[user_node][neighbor]['rating']
for genre in genres:
if genre in genre_counts:
genre_counts[genre] += rating
total_ratings += 1
# Normalize genre preferences
genre_preferences = []
for genre in GENRE_LIST:
if total_ratings > 0:
genre_preferences.append(
genre_counts[genre] / total_ratings)
else:
genre_preferences.append(0)
return genre_preferences
模型训练技巧
训练图深度学*模型用于推荐系统涉及多种先进技术,以提高性能和效率。
损失函数
您可以根据推荐任务选择和组合适当的损失函数:
-
二元交叉熵(BCE)可以用于隐式反馈:
def bce_loss(predictions, targets): return F.binary_cross_entropy_with_logits( predictions, targets) -
均方误差(MSE)可以用于显式反馈(评分预测):
def mse_loss(predictions, targets): return F.mse_loss(predictions, targets) -
贝叶斯个性化排名(BPR)损失可以用于成对排名:
def bpr_loss(pos_scores, neg_scores): return -F.logsigmoid(pos_scores - neg_scores).mean() -
边际排名损失是另一种用于成对排名的选项:
def margin_ranking_loss(pos_scores, neg_scores, margin=0.5): return F.margin_ranking_loss( pos_scores, neg_scores, torch.ones_like(pos_scores), margin=margin) -
损失函数组合可以结合多个损失函数进行多任务学*:
def combined_loss(pred_ratings, true_ratings, pos_scores, neg_scores, alpha=0.5): # Convert inputs to floating point tensors if they aren't already pred_ratings = pred_ratings.float() true_ratings = true_ratings.float() pos_scores = pos_scores.float() neg_scores = neg_scores.float() rating_loss = mse_loss(pred_ratings, true_ratings) ranking_loss = bpr_loss(pos_scores, neg_scores) return alpha * rating_loss + (1 - alpha) * ranking_loss
训练循环
您还可以实现一个高级训练循环,结合各种优化技巧:
-
梯度累积以获得更大的有效批次大小:这项技术通过在多个批次上累积梯度,允许更大的有效批次大小,然后再进行优化器步骤:
# Inside the training loop for batch_idx, batch in enumerate(generate_batches(train_graph)): # ... (model forward pass and loss calculation) # Gradient accumulation loss = loss / ACCUMULATION_STEPS loss.backward() if (batch_idx + 1) % ACCUMULATION_STEPS == 0: optimizer.step() optimizer.zero_grad() -
学*率调度:ReduceLROnPlateau调度器根据验证损失调整学*率,当损失趋于平稳时降低学*率:
scheduler = ReduceLROnPlateau( optimizer, mode='min', factor=0.5, patience=3 ) # Inside the training loop scheduler.step(val_loss) -
基于验证性能的早停:当验证损失在指定数量的训练轮次内没有改善时,这项技术会停止训练,防止过拟合:
# Inside the training loop if val_loss < best_val_loss: best_val_loss = val_loss no_improve_count = 0 torch.save(model.state_dict(), 'best_model.pth') else: no_improve_count += 1 if no_improve_count >= patience: print(f"Early stopping after {epoch} epochs") break # After training model.load_state_dict(torch.load('best_model.pth')) -
梯度裁剪防止梯度爆炸:梯度裁剪防止梯度过大,避免训练过程中出现不稳定:
# Inside the training loop, before optimizer step torch.nn.utils.clip_grad_norm_( model.parameters(), max_norm=1.0)
可扩展性和优化
处理大规模图形需要高级技术来提高训练和推理效率。我们在第五章中讨论了可扩展性问题;在这里,我们将查看一些实用的技术示例,帮助我们解决这一问题。
使用邻域采样的迷你批量训练
我们可以使用小批量训练与邻域采样来代替处理整个图:
-
采样一部分用户节点:
def create_mini_batch(G, batch_size, n_pos=5, n_neg=5, n_neighbors=10, n_hops=2): # Get all user nodes all_user_nodes = [n for n in G.nodes() if n.startswith('user_')] if not all_user_nodes: raise ValueError("No user nodes found in graph") # Randomly select users user_nodes = random.sample( all_user_nodes, min(batch_size, len(all_user_nodes)) ) # Create subgraph subgraph = G.subgraph(user_nodes).copy()这一步随机选择一部分用户节点来形成小批量。
-
对于每个用户,采样固定数量的正向和负向电影交互。这里,我们从用户的邻居中采样正向电影交互,从用户未交互过的电影中采样负向交互:
# Sample positive and negative movies pos_movies = [] neg_movies = [] all_movies = [n for n in G.nodes() if n.startswith('movie_')] for user in user_nodes: user_movies = [n for n in G[user] if n.startswith('movie_')] pos_sample = random.sample( user_movies, min(n_pos, len(user_movies)) ) if user_movies else [] available_neg = list(set(all_movies) - set(user_movies)) neg_sample = random.sample(available_neg, min( n_neg, len(available_neg)) ) if available_neg else [] pos_movies.extend(pos_sample) neg_movies.extend(neg_sample) return subgraph, user_nodes, pos_movies, neg_movies -
执行多跳邻域采样来创建一个包含相关节点及其邻居的子图:
def sample_neighbors(graph, nodes, n_neighbors, n_hops): sampled_nodes = set(nodes) for _ in range(n_hops): new_nodes = set() for node in sampled_nodes: neighbors = list(graph.neighbors(node)) sampled = random.sample( neighbors, min(n_neighbors, len(neighbors)) ) new_nodes.update(sampled) sampled_nodes.update(new_nodes) return list(sampled_nodes) # Inside create_mini_batch function all_nodes = user_nodes + pos_movies + neg_movies sampled_nodes = sample_neighbors( graph, all_nodes, n_neighbors, n_hops) -
最后,我们创建子图并在采样的子图中进行消息传递:
subgraph = graph.subgraph(sampled_nodes) return subgraph, user_nodes, pos_movies, neg_movies
分布式训练
对于极大的图,你可以实现分布式训练:
-
图划分:将图分割到多个机器上,以便进行分布式处理:
def partition_graph(graph, rank, world_size): # Implement graph partitioning logic here # This is a placeholder function num_nodes = graph.number_of_nodes() nodes_per_partition = num_nodes // world_size start_node = rank * nodes_per_partition end_node = start_node + nodes_per_partition if rank < \ world_size - 1 else num_nodes local_nodes = list(graph.nodes())[start_node:end_node] return graph.subgraph(local_nodes) # Usage in distributed_train function local_graph = partition_graph(graph, rank, world_size) -
分布式消息传递:为跨机器的分布式消息传递实现高效的通信协议:
import torch.distributed as dist def distributed_message_passing(local_graph, node_features): # Perform local message passing local_output = local_message_passing( local_graph, node_features) # Gather results from all processes gathered_outputs = [torch.zeros_like(local_output) for _ in range(dist.get_world_size())] dist.all_gather(gathered_outputs, local_output) # Combine gathered results global_output = torch.cat(gathered_outputs, dim=0) return global_output # Usage in model forward pass def forward(self, graph, node_features): # ... other layers node_features = distributed_message_passing( graph, node_features) # ... remaining layers -
参数服务器架构:使用DistributedDataParallel(DDP)将模型参数更新集中在所有进程中:
from torch.nn.parallel import DistributedDataParallel as DDP def distributed_train(rank, world_size, graph): setup(rank, world_size) # Create model and move it to GPU with id rank model = GraphRecommender(...).to(rank) model = DDP(model, device_ids=[rank]) optimizer = optim.Adam(model.parameters(), lr=0.001) # ... training loop cleanup()
通过实施本节中概述的所有策略,如高效的图构建、全面的特征工程、复杂的损失函数和可扩展的训练方法,你可以开发出强大且有效的基于图的推荐系统。
基于图的推荐的可解释性
随着推荐系统变得更加复杂,对可解释人工智能(XAI)的需求也在增加。基于图的模型为增强推荐的可解释性提供了独特的机会。
解释性机制的注意力
正如我们在第四章 中看到的,图注意力网络(GATs)可以被用来提供哪些节点或特征对推荐贡献最大的洞察。对于电影推荐,这可以揭示哪些演员、导演或类型对用户的偏好有最重要的影响。
设想一个用户,他经常观看由汤姆·克鲁斯主演的动作电影。注意力机制可能会突出显示汤姆·克鲁斯在电影演员图节点中的存在,在该用户的推荐过程中,这一因素的权重会比其他因素更高。
基于路径的解释
基于元路径的模型可以通过展示导致推荐的推理路径,提供直观的解释。
例如,电影推荐可以这样解释:我们推荐“盗梦空间”是因为你喜欢“黑暗骑士”(相同导演:克里斯托弗·诺兰)和“星际穿越”(相似类型: 科幻惊悚片)。
企业面临的主要挑战之一是缺乏数据。一款新产品可能没有足够的客户数据来构建这些复杂的推荐模型。这个挑战被称为冷启动问题,我们将探讨如何利用图算法来解决它。
冷启动问题
推荐系统中的冷启动问题是指为没有多少或没有交互数据的新用户或新项目做出准确推荐的挑战。在电影推荐系统中,当一个新用户加入平台并且没有观看历史,或者当一部新电影发布并且没有用户评分或互动时,就会发生这种情况。
冷启动问题在电影推荐系统中特别具有挑战性,尤其是对于新用户或新发布的电影。
图嵌入传递
解决冷启动问题的一种方法是图嵌入传递,这是一种在没有交互数据的情况下,用于初始化推荐图中新节点(电影或用户)表示的技术。以下是一般描述:
-
对于新项目(例如电影):
-
根据元数据或内容特征识别相似的现有项目。
-
使用这些相似项目的嵌入来初始化新项目的嵌入。
-
这为新项目在嵌入空间中提供了一个起始点,反映了其可能的特征。
-
-
对于新用户:
-
使用可用的人口统计或偏好信息来寻找相似的现有用户。
-
根据这些相似用户的嵌入初始化新用户的嵌入。
-
当新用户与系统交互时,他们的嵌入表示可以进行微调。
-
例如,当一部新的超级英雄电影上映时,我们可以通过对图中其他超级英雄电影的嵌入进行平均,来初始化它的嵌入表示:
def initialize_new_movie(movie_id, similar_movies, movie_embeddings):
if not similar_movies:
return np.zeros(next(iter(movie_embeddings.values())).shape)
similar_embeddings = [
movie_embeddings[m] for m in similar_movies if
m in movie_embeddings
]
if not similar_embeddings:
return np.zeros(next(iter(movie_embeddings.values())).shape)
return np.mean(similar_embeddings, axis=0)
基于内容的特征集成
另一种有效的减少冷启动问题的方法是利用来自可用元数据或项目描述的基于内容的特征。通过集成多种基于内容的特征,如文本属性、分类信息以及任何可用的数值数据,系统可以为没有交互历史的新项目或用户生成初步推荐。这种集成的特征表示可以用来计算项目相似性或训练机器学*模型,根据项目特征预测用户偏好。
例如,当一个新用户注册时,我们可以根据他们的偏好(如类型、演员和导演)创建与电影的边缘连接,即使他们还没有观看任何内容:
def create_initial_edges(user_id, preferences, movie_graph):
for pref in preferences:
similar_movies = [
m for m in movie_graph.nodes if
pref in movie_graph.nodes[m]['attributes']]
for movie in similar_movies:
movie_graph.add_edge(
user_id, movie, weight=0.5 # Initial weak connection
)
return movie_graph
# Usage
updated_graph = create_initial_edges(
'new_user_123', ['Sci-Fi', 'Tom Hanks'], movie_graph)
这些只是我们在利用图形的推荐系统中解决冷启动问题的几种方法。
总结
在本章中,我们介绍了图深度学*作为推荐系统的先进方法。你了解了推荐系统的基本概念,包括不同类型和评估指标。
然后,我们深入研究了用于表示用户-项目交互的图结构,结合了边信息,并捕捉了时间动态。我们探索了多种基于图的推荐模型,从带有图正则化的 MF 模型到先进的 GNN 模型。你还熟悉了各种训练技巧、可扩展性挑战以及图基推荐系统中的高级主题,如可解释性和冷启动问题。
在下一章,我们将探讨图学*在计算机视觉中的应用。
第十章:计算机视觉中的图深度学*
计算机视觉(CV)传统上依赖于基于网格的图像和视频表示,这些表示与卷积神经网络(CNNs)结合取得了很大的成功。然而,许多视觉场景和物体具有固有的关系和结构属性,这些属性不能轻易通过基于网格的方法来捕捉。这正是图表示发挥作用的地方,它提供了一种更灵活、更具表现力的方式来建模视觉数据。
图可以自然地表示场景中物体之间的关系、图像中的层次结构、非网格数据(如 3D 点云)以及视频中的长程依赖关系。例如,在街道场景中,图可以将汽车、行人和交通灯表示为节点,边表示它们的空间关系或相互作用。这种表示方式比像素网格更直观地捕捉了场景的结构。
本章将详细讨论以下主题:
-
传统的计算机视觉方法与基于图的方法
-
视觉数据的图构建
-
图神经网络(GNNs)用于图像分类
-
使用图神经网络(GNN)进行物体检测与分割
-
使用 GNN 进行多模态学*
-
限制与下一步发展
传统的计算机视觉方法与基于图的方法
传统的计算机视觉方法主要依赖于 CNN,它们在规则网格结构上进行操作,通过卷积和池化操作提取特征。尽管在许多任务中效果显著,但这些方法通常在处理长程依赖关系和关系推理时遇到困难。相比之下,基于图的方法将视觉数据表示为节点和边,利用 GNNs 处理信息。这种结构使得更容易融入非局部信息和关系性归纳偏置。
例如,在图像分类中,CNN 可能很难关联图像中遥远部分的关系,而基于图的方法可以将不同的图像区域表示为节点,它们之间的关系表示为边,从而促进长程推理。这种数据表示和处理的根本差异使得基于图的方法能够克服传统基于 CNN 的方法中固有的一些限制,可能在需要理解复杂空间关系或全局上下文的视觉数据任务中提高性能。
图表示在视觉数据中的优势如下:
-
灵活性 :图可以表示各种类型的视觉数据,从像素到物体,再到整个场景。
-
关系推理 :图显式地建模关系,使得推理物体之间的相互作用变得更加容易。
-
融入先验知识 :领域知识可以轻松地编码进图结构中。
-
处理不规则数据 :图特别适合处理如 3D 点云或社交网络图像等非网格数据。
-
可解释性:图结构通常与人类对视觉场景的理解更为一致。
例如,在面部识别任务中,基于图的方法可能将面部标志(面部上的特定点,通常对应眼角、鼻尖、嘴角等关键面部特征)表示为节点,它们的几何关系则表示为边。与基于网格的方法相比,这种表示对姿势和表情的变化更具鲁棒性。
下面是构建面部图的一个简单示例:
import networkx as nx
def create_face_graph(landmarks, threshold=2.0):
G = nx.Graph()
for i, landmark in enumerate(landmarks):
G.add_node(i, pos=landmark)
# Connect nearby landmarks
for i in range(len(landmarks)):
for j in range(i+1, len(landmarks)):
if np.linalg.norm(landmarks[i] - landmarks[j]) < \
threshold:
G.add_edge(i, j)
return G
# Usage
landmarks = np.array([[x1, y1], [x2, y2], ...]) # facial landmark coordinates
face_graph = create_face_graph(landmarks)
这个图形表示法捕捉了面部特征之间的空间关系,图神经网络(GNNs)可以利用这些关系执行面部识别或情感检测等任务。现在,让我们深入探讨如何专门为图像数据构建图。
视觉数据的图构建
从视觉数据构建图是将基于图的方法应用于计算机视觉(CV)任务的关键步骤。图的构建方法选择会显著影响下游任务的性能和可解释性。本节将探讨多种图构建方法,每种方法都适用于不同类型的视觉数据和问题领域。
像素级图
像素级图以最细粒度的方式表示图像,每个像素作为图中的一个节点。边通常形成在相邻的像素之间,创建出一种类似于网格的结构,反映了原始图像。这种方法保留了细粒度的空间信息,但对于高分辨率图像,可能会导致大型且计算量大的图。
例如,在一张 100x100 像素的图像中,我们将创建一个拥有 10,000 个节点的图。每个节点可能与其四个或八个最*的邻居相连,具体取决于是否考虑对角线连接。节点特征可能包括颜色信息(RGB 值)和像素坐标。这种类型的图特别适用于需要精确空间信息的任务,如图像分割或边缘检测。
下面是一个如何使用NetworkX构建像素级图的简单示例:
import networkx as nx
import numpy as np
def create_pixel_graph(image, connectivity=4):
height, width = image.shape[:2]
G = nx.Graph()
for i in range(height):
for j in range(width):
node_id = i * width + j
G.add_node(node_id, features=image[i, j], pos=(i, j))
if connectivity == 4:
neighbors = [(i-1, j), (i+1, j),
(i, j-1), (i, j+1)]
elif connectivity == 8:
neighbors = [(i-1, j), (i+1, j), (i, j-1),
(i, j+1), (i-1, j-1), (i-1, j+1),
(i+1, j-1), (i+1, j+1)]
for ni, nj in neighbors:
if 0 <= ni < height and 0 <= nj < width:
neighbor_id = ni * width + nj
G.add_edge(node_id, neighbor_id)
return G
这个函数创建了一个图像的图表示,其中每个像素都是一个节点,边根据指定的连通性(4或8)连接相邻像素。
我们调用这个函数:
image = np.random.rand(100, 100, 3) # Random RGB image
pixel_graph = create_pixel_graph(image, connectivity=8)
基于超像素的图
基于超像素的图提供了一种介于像素级表示和对象级表示之间的中间方式。超像素是具有相似特征的像素群,通常通过图像分割算法(如简单线性迭代聚类(SLIC))创建。在超像素图中,每个节点代表一个超像素,边则连接相邻的超像素。
这种方法减少了与像素级图相比的图大小,同时仍保持局部图像结构。例如,一张 1,000x1,000 像素的图像可能会缩减为一个包含 1,000 个超像素的图,每个超像素代表平均 1,000 个像素。节点特征可能包括平均颜色、纹理信息和超像素的空间位置。
超像素图对于语义分割或对象提议生成等任务特别有效。它们在图像中捕捉局部一致性,同时减少计算复杂性。例如,在场景理解任务中,超像素可能自然地将属于同一对象或表面的像素分组,从而简化后续的分析。
对象级图
对象级图在更高层次的抽象上表示图像,节点对应于检测到的对象或感兴趣区域。图中的边通常表示对象之间的关系或交互。这种表示对于涉及场景理解、视觉关系检测或关于图像内容的高层推理任务特别有用。
假设是一张客厅的图像。一个对象级图可能会有“沙发”、“咖啡桌”、“台灯”和“书架”等节点。边可能表示空间关系(例如,“台灯在桌子上”)或功能关系(例如,“人坐在沙发上”)。节点特征可能包括对象类别概率、边界框坐标和外观描述符。
对象级图在需要推理对象交互的任务中非常强大,例如视觉问答或图像标注。它们允许模型集中处理相关的高层信息,而不被像素级的细节所困扰。
场景图
场景图通过明确地建模对象之间的关系,将对象级别的表示进一步推进,将这些关系作为图中的独立实体。在场景图中,节点通常表示对象和属性,而边表示关系。这种结构化表示捕捉了图像的语义,以一种更接*人类理解的形式。
例如,在一张公园的图像中,场景图可能会有“人”、“狗”、“树”和“飞盘”等节点,关系边可能包括“人投飞盘”或“狗在树下”。属性如“树:绿色”或“飞盘:红色”可以作为额外的节点或节点特征。
场景图对于需要深入理解图像内容的任务尤其有价值,例如基于复杂查询的图像检索或生成详细的图像描述。它们提供了一种结构化的表示,弥合了视觉特征和语义理解之间的鸿沟。
比较不同的图构建方法
每种图构建方法都有其优点,适用于不同类型的计算机视觉任务。像素级图保留了细粒度的信息,但计算开销较大。超像素图在细节和效率之间提供了良好的平衡。对象级图和场景图捕捉了高级语义,但可能会错失细粒度的细节。
图构建方法的选择取决于具体任务、计算资源和所需的抽象层次。例如,图像去噪可能受益于像素级图,而视觉关系检测则更适合使用对象级图或场景图。
值得注意的是,这些方法并不是相互排斥的。一些高级模型使用分层图表示,结合了多个抽象层次,使其能够同时推理细粒度的细节和高级语义。
在不同层次的图构建(像素、超像素和对象)中,会面临与噪声和数据分辨率相关的不同挑战。在像素层次上,高频噪声和传感器伪影可能会创建虚假的连接,导致图结构不可靠。为了解决这个问题,可以在预处理阶段应用中值滤波或双边滤波,以保留边缘同时减少噪声。超像素层次的图则面临边界精度和分割大小变化的挑战,可以通过自适应分割算法(如 SLIC)或边界精细化技术来缓解这些问题。
对象级图面临分辨率相关的问题,其中对象边界可能不明确,或者对象可能出现在不同的尺度上。可以通过多尺度图构建方法或保持跨分辨率层次连接的分层图表示来解决这些问题。为了处理不同的数据分辨率,可以采用自适应图构建方法,其中边缘权重和邻域大小会根据局部数据特征动态调整。
另一种有效的解决方案是实现图池化策略,智能地在不同层次之间聚合信息,同时保持重要的结构关系。特征归一化和异常值去除等预处理技术也能提高图的质量。对于噪声严重的情况,采用加权图构建方法,通过在边缘权重中引入不确定性度量,已被证明是有效的,这使得模型能够在数据不完美的情况下学*到更强的表示。
现在,让我们来看一下如何具体利用 GNN 进行图像分类。
用于图像分类的 GNN
图像分类,作为计算机视觉中的一项基础任务,传统上一直由 CNN 主导。然而,GNN(图神经网络)正作为一种强有力的替代方案崭露头角,在捕捉全局结构和长程依赖方面具有独特优势。本节将探讨如何将 GNN 应用于图像分类任务,并讨论各种架构和技术。
图卷积网络在图像数据中的应用
图卷积网络(GCNs)是许多基于图的方法在图像分类中的核心。与传统的 CNN(卷积神经网络)在规则网格结构上操作不同,GCNs 能够处理不规则的图结构,使得它们在表示图像数据时更加灵活。
为了将 GCN 应用于图像,我们需要将图像转换为图结构。这可以通过上一节讨论的任何方法来完成,例如像素级图或超像素图。一旦我们得到图的表示,就可以应用图卷积来聚合来自邻居节点的信息。
例如,考虑一个基于超像素的图像图。每个节点(超像素)可能具有如平均颜色、纹理描述符和空间信息等特征。图卷积操作会根据节点本身的特征以及邻居节点的特征来更新每个节点的特征。这使得网络能够捕捉局部模式,并逐渐构建出更全局的表示。
这里有一个简单的例子,展示了如何使用PyTorch Geometric实现一个图卷积层:
import torch
from torch_geometric.nn import GCNConv
class SimpleGCN(torch.nn.Module):
def __init__(self, num_node_features, num_classes):
super(SimpleGCN, self).__init__()
self.conv1 = GCNConv(num_node_features, 16)
self.conv2 = GCNConv(16, num_classes)
def forward(self, x, edge_index):
x = self.conv1(x, edge_index)
x = torch.relu(x)
x = self.conv2(x, edge_index)
return x
# Usage
model = SimpleGCN(num_node_features=3, num_classes=10)
在这个例子中,模型将节点特征和边缘索引作为输入,应用两个图卷积层,并输出每个节点的类别概率。整个图像的最终分类可以通过对所有节点预测结果进行池化来获得。
基于图的图像分类中的注意力机制
注意力机制在各类深度学*任务中已被证明是非常有效的,在基于图的图像分类中应用时,尤其能发挥强大作用。图注意力网络(GATs)允许模型在聚合信息时为不同的邻居分配不同的重要性,这可能导致更有效的特征学*。
在图像分类的背景下,注意力机制可以帮助模型集中于图像中与分类任务最相关的部分。例如,在分类动物图像时,注意力机制可能会学会聚焦于耳朵的形状或毛发的图案等具有区分性的特征,即使这些特征在原始图像中空间上相距较远。
考虑一个基于对象的图表示。一个基于注意力机制的 GNN 可以学会赋予连接那些在特定图像类别中经常共同出现的物体的边更高的权重。例如,在分类“厨房”场景时,模型可能会学会更关注连接“炉灶”和“冰箱”节点的边,因为这些物体强烈表明是厨房环境。
用于多尺度特征学*的分层图表示
CNN 在图像分类中的一个优势是它们能够通过卷积和池化操作的层次结构在多个尺度上学*特征。GNN 也可以通过分层图表示来实现类似的多尺度特征学*。
一个分层的图方法可能从一个细粒度的图表示(例如,超像素级别)开始,并通过池化操作逐渐粗化图。每个层级捕捉不同尺度的特征,从局部纹理到更全球的形状和排列。
例如,在分类建筑风格时,层次结构的最低层可能捕捉局部纹理(如砖块图案和窗户形状),中间层可能代表更大的结构(如屋顶类型和立面布局),而最高层则可能捕捉整体建筑形状和布局。
这种分层方法可以通过图池化操作来实现。以下是一个在 PyTorch Geometric 中如何实现这一方法的概念性示例:
from torch_geometric.nn import GCNConv, TopKPooling
class HierarchicalGCN(torch.nn.Module):
def __init__(self, num_node_features, num_classes):
super(HierarchicalGCN, self).__init__()
self.conv1 = GCNConv(num_node_features, 64)
self.pool1 = TopKPooling(64, ratio=0.8)
self.conv2 = GCNConv(64, 32)
self.pool2 = TopKPooling(32, ratio=0.8)
self.conv3 = GCNConv(32, num_classes)
def forward(self, x, edge_index, batch):
x = self.conv1(x, edge_index)
x, edge_index, _, batch, _, _ = self.pool1(
x, edge_index, None, batch)
x = self.conv2(x, edge_index)
x, edge_index, _, batch, _, _ = self.pool2(
x, edge_index, None, batch)
x = self.conv3(x, edge_index)
return x
在这个示例中,模型应用了交替的卷积和池化操作,逐渐减少图的大小,并在不同尺度上捕捉特征。
GNN 与 CNN
尽管 GNN 在图像分类中提供了若干优势,但重要的是要与传统的基于 CNN 的方法进行比较。GNN 擅长捕捉长程依赖和全局结构,这对于某些类型的图像和分类任务是有益的。例如,GNN 可能在需要理解图像整体布局或远距离部分之间关系的任务中优于 CNN。
然而,CNN 在高效捕捉局部模式和优化网格数据方面仍然具有优势。许多最先进的方法现在结合了 GNN 和 CNN 的元素,利用它们各自的优势。
例如,你可以使用 CNN 从图像中提取初始特征,然后基于这些特征构建图,并应用 GNN 层进行最终分类。这种方法将 CNN 的局部特征提取能力与 GNN 的全局推理能力结合起来。
在实践中,基于 GNN 的方法与基于 CNN 的方法(或两者的混合)之间的选择,取决于数据集的具体特征和分类任务的性质。通常需要通过实证评估目标数据集,以确定最有效的方法。
物体检测是图像理解中最重要的任务之一。让我们看看图形如何在其中发挥作用。
使用 GNN 进行物体检测和分割
物体检测和分割是计算机视觉中的重要任务,应用领域从自动驾驶到医学图像分析。虽然卷积神经网络(CNN)一直是这些任务的主要方法,但图神经网络(GNN)作为一种强有力的替代或补充技术,正在崭露头角。本节将探讨如何将 GNN 应用于物体检测和分割任务,并讨论不同方法及其优势。
基于图的物体提议生成
物体提议生成通常是许多物体检测流水线中的第一步。传统方法依赖于滑动窗口或区域提议网络,但基于图的方法提供了一个有趣的替代方案。通过将图像表示为图形,我们可以利用 GNN 的关系归纳偏差来生成更有信息的物体提议。
例如,考虑将图像表示为超像素图。每个超像素(节点)可能具有如颜色直方图、纹理描述符和空间信息等特征。边缘可以表示超像素之间的邻接或相似性。然后,GNN 可以处理这个图,识别可能包含物体的区域。
下面是一个简化的示例,展示了 GNN 如何用于物体提议生成:
import torch
from torch_geometric.nn import GCNConv, global_mean_pool
class ObjectProposalGNN(torch.nn.Module):
def __init__(self, num_node_features):
super(ObjectProposalGNN, self).__init__()
self.conv1 = GCNConv(num_node_features, 64)
self.conv2 = GCNConv(64, 32)
self.conv3 = GCNConv(32, 1) # Output objectness score
def forward(self, x, edge_index, batch):
x = torch.relu(self.conv1(x, edge_index))
x = torch.relu(self.conv2(x, edge_index))
x = self.conv3(x, edge_index)
return x
# Usage
model = ObjectProposalGNN(num_node_features=10)
在这个示例中,模型处理图并为每个节点(超像素)输出一个“物体性”分数。然后可以使用这些分数通过将高分相邻超像素组合起来生成边界框提议。
面向物体检测的关系推理
使用 GNN 进行物体检测的一个主要优势是其进行关系推理的能力。图像中的物体通常具有彼此之间的有意义关系,捕捉这些关系可以显著提高检测的准确性。
例如,在街景中,知道“轮子”物体靠*“汽车”物体可以提高这两个物体的检测信心。同样,检测到一个“人”骑在“马”上可以帮助将该场景分类为马术赛事。GNN 可以通过物体提议之间的信息传递自然地建模这些关系。
考虑一种方法,在该方法中初步的物体提议通过传统方法或基于图的方式(如前所述)生成,然后使用 GNN 来优化这些提议:
class RelationalObjectDetectionGNN(torch.nn.Module):
def __init__(self, num_features, num_classes):
super(RelationalObjectDetectionGNN, self).__init__()
self.conv1 = GCNConv(num_features, 64)
self.conv2 = GCNConv(64, 32)
self.classifier = torch.nn.Linear(32, num_classes)
self.bbox_regressor = torch.nn.Linear(32, 4) # (x, y, w, h)
def forward(self, x, edge_index):
x = torch.relu(self.conv1(x, edge_index))
x = torch.relu(self.conv2(x, edge_index))
class_scores = self.classifier(x)
bbox_refinement = self.bbox_regressor(x)
return class_scores, bbox_refinement
在这个模型中,每个节点代表一个物体提议,边缘代表提议之间的关系(例如,空间邻*性或特征相似性)。GNN 根据每个提议与其他提议的关系来优化提议的特征,从而可能导致更精确的分类和边界框优化。
使用 GNN 进行实例分割
实例分割,结合了目标检测与像素级分割,也能从基于图的方法中受益。GNNs 可以通过考虑物体的不同部分或场景中不同物体之间的关系来优化分割掩膜。
一种方法是将图像表示为超像素或像素的图,其中每个节点的特征来自 CNN 主干网络。然后,GNN 可以处理此图并生成细化的分割掩膜。此方法对于形状复杂的物体或在全局上下文对准确分割至关重要的情况下,特别有效。
例如,在医学图像分析中,对复杂形状的器官(如大脑或肺部)进行分割,可以受益于考虑长程依赖关系和器官的整体结构,而 GNN 能有效捕捉这些信息。
下面是一个概念示例,展示了 GNN 如何用于实例分割:
class InstanceSegmentationGNN(torch.nn.Module):
def __init__(self, num_features):
super(InstanceSegmentationGNN, self).__init__()
self.conv1 = GCNConv(num_features, 64)
self.conv2 = GCNConv(64, 32)
self.conv3 = GCNConv(32, 1) #Output per-node mask probability
def forward(self, x, edge_index, batch):
x = torch.relu(self.conv1(x, edge_index))
x = torch.relu(self.conv2(x, edge_index))
mask_prob = torch.sigmoid(self.conv3(x, edge_index))
return mask_prob
该模型采用图像的图表示(例如,超像素),并为每个节点输出一个掩膜概率。然后,可以使用这些概率构建最终的实例分割掩膜。
使用图结构输出进行全景分割
全景分割,旨在对物体(如天空或草地等无定形区域)和事物(可计数的物体)进行统一的分割,提出了一个独特的挑战,基于图的方法非常适合解决这一问题。GNNs 可以建模图像中不同区域之间的复杂关系,无论它们代表的是独立的物体还是背景的一部分。
用于全景分割的图结构输出可能将每个区域(包括物体和事物)表示为图中的节点。该图中的边可以表示区域之间的邻接关系或语义关系。这种表示方法使得模型能够推理整体场景结构并确保分割的一致性。
例如,在街景中,基于图的全景分割模型可能学会“汽车”区域很可能与“道路”区域相邻,但与“天空”区域不相邻。这种关系推理有助于细化不同区域之间的边界,并解决歧义。
下面是一个简化的示例,展示了如何使用 GNN 进行全景分割:
class PanopticSegmentationGNN(torch.nn.Module):
def __init__(self, num_features, num_classes):
super(PanopticSegmentationGNN, self).__init__()
self.conv1 = GCNConv(num_features, 64)
self.conv2 = GCNConv(64, 32)
self.classifier = torch.nn.Linear(32, num_classes)
self.instance_predictor = torch.nn.Linear(32, 1)
def forward(self, x, edge_index):
x = torch.relu(self.conv1(x, edge_index))
x = torch.relu(self.conv2(x, edge_index))
semantic_pred = self.classifier(x)
instance_pred = self.instance_predictor(x)
return semantic_pred, instance_pred
在这个模型中,每个节点代表图像中的一个区域。该模型为每个区域输出语义类别预测和实例预测。实例预测可以用来区分同一语义类别的不同实例。
接下来,我们将探讨如何利用 GNNs 在多个模态上构建智能。
使用 GNNs 进行多模态学*
多模态学*涉及处理和关联来自多个数据源或感官输入的信息。在计算机视觉的背景下,这通常意味着将视觉数据与其他模态(如文本、音频或传感器数据)结合起来。GNN 为多模态学*提供了一个强大的框架,通过自然地表示不同类型的数据及其相互关系,在统一的图结构中处理这些数据。该部分将探讨 GNN 如何应用于计算机视觉中的多模态学*任务。
使用图来整合视觉和文本信息
在计算机视觉领域,最常见的多模态配对之一是视觉和文本数据的结合。这种整合对于图像描述、视觉问答和基于文本的图像检索等任务至关重要。GNN 提供了一种自然的方式来在单一框架中表示和处理这两种模态。
例如,考虑一个视觉问答任务。我们可以构建一个图,其中节点表示图像区域和问题中的单词。边可以表示这些元素之间的关系,例如图像区域之间的空间关系或单词之间的句法关系。通过对这个异质图应用图卷积,模型可以推理视觉和文本元素之间的关系,从而回答问题。
这是一个简化的示例,展示了这样的模型如何构建。我们从必要的导入开始:
import torch
from torch_geometric.nn import GCNConv, global_mean_pool
VisualTextualGNN 类定义了一个视觉-文本 GNN 模型,它可以处理图像和文本数据:
class VisualTextualGNN(torch.nn.Module):
def __init__(self, image_feature_dim,
word_embedding_dim, hidden_dim):
super(VisualTextualGNN, self).__init__()
self.image_encoder = GCNConv(
image_feature_dim, hidden_dim)
self.text_encoder = GCNConv(
word_embedding_dim, hidden_dim)
self.fusion_layer = GCNConv(hidden_dim, hidden_dim)
self.output_layer = torch.nn.Linear(
hidden_dim, 1) # For binary questions
forward 方法展示了模型如何通过各种层处理输入数据,最终产生输出结果:
def forward(self, image_features, word_embeddings, edge_index):
image_enc = self.image_encoder(
image_features, edge_index)
text_enc = self.text_encoder(
word_embeddings, edge_index)
fused = self.fusion_layer(
image_enc + text_enc, edge_index)
return self.output_layer(fused)
在这个示例中,模型使用独立的 GCN 层分别处理图像区域和单词,然后在后续层中融合这些信息。这使得模型能够捕捉跨模态交互,并推理视觉元素和文本元素之间的关系。
基于图表示的跨模态检索
跨模态检索任务,例如查找与文本描述匹配的图像或反之,也可以通过图表示获得极大的帮助。GNN 可以学*不同模态的联合嵌入,从而实现高效且准确的跨模态检索。
例如,我们可以构建一个图,其中节点表示图像和文本描述。该图中的边可能连接相似的图像、相似的文本描述,以及图像与其对应的描述。通过对这个图应用 GNN 层,我们可以学*捕捉模态内和跨模态的关系的嵌入。
这是一个基于 GNN 的跨模态检索模型如何构建的示例:
class CrossModalRetrievalGNN(nn.Module):
def __init__(self, image_dim, text_dim, hidden_dim):
super(CrossModalRetrievalGNN, self).__init__()
self.image_encoder = GCNConv(image_dim, hidden_dim)
self.text_encoder = GCNConv(text_dim, hidden_dim)
self.fusion = GCNConv(hidden_dim, hidden_dim)
def forward(self, image_features, text_features, edge_index):
img_enc = self.image_encoder(image_features, edge_index)
text_enc = self.text_encoder(text_features, edge_index)
fused = self.fusion(img_enc + text_enc, edge_index)
return fused
在这个模型中,图像和文本都被编码到一个共享的嵌入空间中。融合层使得信息能够在不同模态之间流动,帮助对齐嵌入。在检索过程中,我们可以使用这些嵌入来找到跨模态的最*邻。
用于视觉语言导航的 GNN
视觉语言导航是一项复杂的任务,要求理解并将视觉场景信息与自然语言指令进行整合。图神经网络(GNN)对于这项任务特别有效,通过将导航环境表示为图形,并将语言信息融入该图结构中。
例如,我们可以将导航环境表示为一个图,其中节点对应位置,边表示位置之间的可能移动。每个节点可以关联从该位置的图像中提取的视觉特征。自然语言指令可以通过添加额外的节点或节点特征来融入,表示指令中的关键元素。
这里是一个概念示例,展示了 GNN 如何用于视觉语言导航:
class VisualLanguageNavigationGNN(nn.Module):
def __init__(self, visual_dim, instruction_dim,
hidden_dim, num_actions=4):
super(VisualLanguageNavigationGNN, self).__init__()
self.visual_gnn = GCNConv(visual_dim, hidden_dim)
self.instruction_gnn = GCNConv(
instruction_dim, hidden_dim)
self.navigation_head = nn.Linear(
hidden_dim * 2, num_actions)
def forward(self, visual_obs, instructions,
scene_graph, instr_graph):
visual_feat = self.visual_gnn(visual_obs, scene_graph)
instr_feat = self.instruction_gnn(
instructions, instr_graph)
combined = torch.cat([visual_feat, instr_feat], dim=-1)
action_logits = self.navigation_head(combined)
return action_logits
在这个模型中,视觉场景信息和语言指令都通过 GNN 层进行编码和融合。融合后的表示随后用于预测导航序列中的下一个动作。
使用 GNN 的多模态学*为更加复杂且具有上下文感知的计算机视觉(CV)系统开辟了令人兴奋的可能性。通过在统一的图结构中表示不同的模态及其关系,GNN 能够捕捉到传统方法难以建模的模态间复杂互动。这可以为需要从多个来源整合信息的任务提供更强大、更易解释的模型。
随着该领域研究的不断推进,我们可以期待看到图架构在多模态学*中的进一步创新,可能会在像具身 AI、人机交互和高级内容检索系统等领域带来突破。
了解在计算机视觉任务中进行基于图的学*的当前挑战非常重要。让我们一起看看其中的一些挑战。
限制与下一步
随着图深度学*在计算机视觉领域的不断进展,几个挑战和有前景的研究方向已经开始显现。将图方法应用于计算机视觉的主要挑战之一是可扩展性。
大规模视觉数据集中的可扩展性问题
正如我们在第五章中看到的,随着视觉数据集规模的不断增长,构建和处理大规模图变得计算上昂贵。例如,将高分辨率图像表示为像素级图形可能包含数百万个节点,这使得高效执行图卷积变得具有挑战性。
研究人员正在探索各种方法来解决这个问题。一种有前景的方向是开发更高效的图卷积操作。例如,GraphSAGE 算法可以与基于采样的方法结合使用,以减少图卷积的计算复杂度。另一种方法是使用层次化图表示,通过逐步简化图形,允许对大规模数据进行高效处理。
考虑以下示例,一个可以用来处理大规模图像的层次化图神经网络(GNN):
class HierarchicalImageGNN(nn.Module):
def __init__(self, input_dim, hidden_dims=[64, 32, 16]):
super(HierarchicalImageGNN, self).__init__()
self.levels = len(hidden_dims)
self.gnns = nn.ModuleList()
self.pools = nn.ModuleList()
curr_dim = input_dim
for hidden_dim in hidden_dims:
self.gnns.append(GCNConv(curr_dim, hidden_dim))
self.pools.append(TopKPooling(hidden_dim, ratio=0.5))
curr_dim = hidden_dim
def forward(self, x, edge_index, batch):
features = []
for i in range(self.levels):
x = self.gnnsi
x, edge_index, _, batch, _, _ = self.poolsi
features.append(x)
return features
该模型逐步减少图形的大小,使其能够更高效地处理更大的初始图形。
实时应用中的高效图形构建和更新
许多计算机视觉(CV)应用,如自动驾驶或增强现实,需要实时处理。为这些应用程序即时构建和更新图形是一个巨大的挑战。未来的研究需要集中在开发快速图形构建和图形结构更新的方法,尤其是随着新视觉信息的到来。
一种潜在的方法是开发增量图构建方法,该方法能够高效地用新信息更新现有的图形结构,而不是从头开始重建整个图形。例如,在视频处理任务中,我们可能希望随着新帧的到来更新场景图。考虑一个自动驾驶车辆在城市交通中的导航系统。该系统需要维护一个动态的场景图,表示各种物体之间的关系,如车辆、行人、交通标志和道路基础设施。随着每秒 30 帧(FPS)的新帧到来,系统必须高效地更新图形结构,而不影响实时性能。
例如,当一辆新车进入场景时,采用增量方法只需添加代表该车辆及其与现有物体关系的新节点和边,而不是重建整个图形。如果行人从一个位置移动到另一个位置,仅需更新表示空间关系的边,而核心节点属性保持不变。与完全重建图形相比,这种选择性更新显著降低了计算开销。
该系统可以采用层次化图结构,其中高层次关系(例如车辆之间的互动)更新的频率低于低层次细节(如精确的物体位置)。这种多尺度方法在保持关键准确性的同时,能够高效地分配资源。例如,停车车辆的相对位置可能每隔几帧更新一次,而过马路行人的轨迹则需要逐帧精确更新。
为了进一步优化性能,系统可以实现基于优先级的更新机制。与车辆距离较*或以较高速度移动的物体将比远离或静止的物体更频繁地进行更新。这个方法可以通过预测模型来补充,这些模型能够预测物体的运动,并预先计算可能的图更新,从而减少新帧到来时的处理负载。
可以采用先进的数据结构,如空间索引和高效的内存管理方案,加速节点和边的更新。例如,使用 R 树或八叉树来组织空间信息,可以显著减少定位和更新相关图形组件所需的时间。此外,维护一个最*修改过的图形区域的缓存,可以帮助优化动态场景部分的频繁更新。
这些优化策略必须与内存限制以及保持图形一致性的需求之间进行仔细平衡。系统还应足够健壮,能够处理一些极端情况,例如光照条件的突然变化或遮挡,这可能会暂时影响用于图形更新的视觉信息的质量。
将基于图的方法与其他深度学*方法相结合
虽然基于图的方法在计算机视觉任务中具有独特的优势,但它们并不能取代其他深度学*技术。未来可能在于将基于图的方法与其他方法(如卷积神经网络(CNNs)、变压器(transformers)和传统计算机视觉算法)有效结合。例如,我们可能会使用 CNN 从图像中提取初步特征,根据这些特征构建图形,然后应用 GNN 层进行进一步处理。
新的应用和研究机会
随着基于图的深度学*在计算机视觉(CV)领域的成熟,新的应用和研究机会不断涌现。以下是一些未来研究的激动人心的方向:
-
基于图的少样本学*和零样本学*:利用图结构提升在有限或没有样本的情况下对新类别的泛化能力
-
通过图可视化进行可解释的 AI:利用图结构为模型决策提供更具可解释性的解释
-
基于图的 3D 视觉:将图神经网络(GNN)应用于 3D 点云数据,进行 3D 物体检测和分割等任务
-
用于视频理解的动态图学*:开发方法,随着时间推移学*和更新图结构,用于视频分析任务
-
基于图的视觉推理:使用 GNN 在视觉数据上执行复杂的推理任务,如解决视觉难题或回答多步骤的视觉问题
随着这些领域的发展,我们可以预期会看到新的架构、训练方法和理论见解,进一步推动基于图的深度学*在计算机视觉领域的进展。
总结
图深度学*作为计算机视觉中的一种强大范式,提供了在各种任务中捕捉关系信息和全局上下文的独特优势,从图像分类到多模态学*。在本章中,我们展示了通过提供更结构化和灵活的视觉数据处理方法,基于图的方法解决了传统卷积神经网络(CNN)方法的局限性,擅长建模非网格结构数据,并增强了多模态信息的融合。
你已经了解到,随着该领域的发展,图深度学*有望在自动驾驶、医学影像、增强现实、机器人技术和内容检索系统等现实世界应用中产生深远影响。尽管仍面临诸多挑战,尤其是在可扩展性和实时处理方面,但图论与深度学*的协同作用有望塑造计算机视觉的未来,推动更复杂的视觉推理和人类级别的理解。
在接下来的章节中,我们将探讨图学*在自然语言处理、计算机视觉和推荐系统之外的应用。
第四部分:未来方向
在书的最后部分,你将发现图学*在核心领域之外的更多应用,并探索未来的发展方向。你将了解最新的当代应用,并深入了解图学*领域未来面临的挑战与机遇。
本部分包括以下章节:
-
第十一章,新兴应用
-
第十二章,图学*的未来
第十一章:新兴应用
图神经网络深度学*在众多领域展示了惊人的多样性,远远超出了其在自然语言处理(NLP)、推荐系统和计算机视觉(CV)中的广泛应用,正如我们在第八章、第九章和第十章中所看到的那样。在这里,我们将探讨基于图的方式在多个领域所取得的重要影响或展现出的潜力。
随着我们深入探讨这些应用,我们将看到图神经网络深度学*技术如何适应不同的情境,常常为长期存在的挑战提供创新解决方案。例如,在城市规划中,这些方法已被用于优化公共交通网络和预测交通流量,推动了更智能、更高效城市的发展。在材料科学领域,研究人员正在利用基于图的模型来预测材料的性质,并设计具有特定特征的新化合物,可能加速在可再生能源和先进制造等领域的创新。
本章中我们将审视的应用不仅展示了图神经网络深度学*的广泛影响,也突显了这些技术的可迁移性。许多为某一领域开发的方法常常在其他领域意外找到应用,促进了思想和方法论的跨领域交流。在每个应用的讨论中,我们将讲解它们所面临的独特挑战、所采用的具体图神经网络技术以及所取得的成果。
在本章结束时,您将全面理解图神经网络深度学*在各个行业和科学领域的深远影响,包括以下内容:
-
生物学与医疗健康
-
社交网络分析
-
金融服务
-
网络安全
-
能源系统
-
物联网(IoT)
-
法律治理与合规
生物学与医疗健康
图结构数据在生物学和医疗健康中无处不在,从分子相互作用到大脑连接组。图神经网络(GNNs)已成为在这些复杂关系结构上进行学*的强大工具。
蛋白质-蛋白质相互作用网络
蛋白质-蛋白质相互作用(PPI)网络表示细胞内蛋白质之间的物理接触。这些相互作用对理解细胞过程和开发新疗法至关重要。图神经网络(GNNs)可以有效地对 PPI 网络进行建模和分析,达到以下目的:
-
预测新的相互作用:GNNs 可以通过学*已知相互作用中的模式来推断新的蛋白质-蛋白质相互作用(PPIs)。例如,Gainza 等人(2020 年)(
doi.org/10.1093/bioinformatics/btab154)开发了一种 GNN 模型,通过学*蛋白质表面的几何特征和化学特征来预测 PPIs。另一个例子是张和陈(2018 年)的子图神经网络用于链接预测(SEAL)模型(arxiv.org/pdf/1802.09691),该模型在人类蛋白质参考数据库(HPRD)上的 PPI 预测中取得了最先进的性能。它通过学*蛋白质对周围的局部子图来预测相互作用。 -
识别功能模块:通过基于学*到的嵌入对蛋白质进行聚类,GNNs 可以发现功能性蛋白质复合物。Xing 等人(
doi.org/10.1093/bioinformatics/btac088)使用了图注意力网络(GAT)来识别与疾病相关的蛋白质模块。 -
预测蛋白质功能:GNNs 可以通过 PPI 网络传播已知的功能注释来预测未注释蛋白质的功能。例如,Kulmanov 和 Hoehndorf(
doi.org/10.1093/bioinformatics/btaa763)的DeepGOPlus 模型结合了序列信息和 PPI 网络,以提高功能预测的准确性。
药物发现与开发
基于图的模型正在革新药物发现管道的各个阶段:
-
分子性质预测:GNNs 可以通过分子图学*来预测如溶解度、毒性和结合亲和力等性质。Gilmer 等人(
arxiv.org/abs/1704.01212)的消息传递神经网络(MPNN)开创了这一方法。 -
新药设计:生成型 GNN 模型可以创建具有期望性质的新分子结构。例如,Shi 等人(
arxiv.org/abs/2001.09382)的GraphAF 模型采用基于流的方法,逐原子生成分子。 -
药物-靶标相互作用预测:GNNs(图神经网络)可以将药物和蛋白质建模为图形,以预测它们之间的相互作用。Nguyen 等人(
doi.org/10.1093/bioinformatics/btaa921)的研究使用了GraphDTA 模型来完成这一任务。 -
多药物副作用预测:GNNs 可以通过在知识图中建模药物-药物相互作用,预测药物组合的副作用。Zitnik 等人(
doi.org/10.1093/bioinformatics/bty294)的Decagon 模型就是一个典型的例子。
疾病预测与进展建模
基于图的模型可以整合多种生物医学数据,提升疾病预测和理解的能力:
-
电子健康记录(EHR)分析:患者记录可以被建模为时间图,GNN 捕捉诊断、药物和实验室测试之间的复杂关系。Choi 等人提出的GRAM 模型(
pubmed.ncbi.nlm.nih.gov/33717639)采用基于图的注意力机制对医学本体进行建模,以提高风险预测。 -
疾病基因预测:GNN 可以整合蛋白质相互作用、基因表达和已知的疾病关联,以识别新型疾病基因。Li 等人(
www.ncbi.nlm.nih.gov/pmc/articles/PMC8275341)的模型使用了异质性的图卷积网络(GCN)来完成这一任务。 -
癌症亚型分类:图形模型可以整合多组学数据(例如基因表达、突变、拷贝数变异),以提高癌症亚型的预测。Zhang 等人(
doi.org/10.1016/j.engappai.2023.106717)的工作使用了多视角 GCN 来实现这一目的。
脑连接组学分析
GNN 特别适合分析大脑连接数据:
-
脑部疾病分类:GNN 可以通过学*结构或功能连接组来分类神经和精神疾病。Li 等人提出的BrainGNN 模型(
doi.org/10.1016/j.media.2021.102233)使用层次化的 GNN 进行自闭症谱系障碍的分类。 -
认知状态预测:图形模型可以将大脑连接模式映射到认知状态或行为上。Wang 等人(
www.ncbi.nlm.nih.gov/pmc/articles/PMC7935029)的工作使用了动态 GCN 来预测来自功能性磁共振成像(fMRI)数据的认知状态。
基因组学和基因调控网络
图形深度学*方法正在推进我们对基因调控和基因组结构的理解:
-
增强子-启动子相互作用预测:GNN 可以建模染色质的三维结构,以预测长距离的调控相互作用。Sun 等人(
genomebiology.biomedcentral.com/articles/10.1186/s13059-023-02916-x)的模型使用了 Hi-C 数据上的 GCN 来完成这一任务。 -
变异效应预测:GNN 可以建模遗传变异对基因调控和表型的影响。Zhou 等人提出的ExPecto 模型(
www.ncbi.nlm.nih.gov/pmc/articles/PMC6094955)采用了一种深度学*方法,结合了调控语法来预测变异对基因表达的效应。
图深度学*方法在生物学和医疗健康等各个领域产生了重大影响。通过有效地建模复杂的关系数据,这些方法推动了我们对生物系统的理解,并改善了临床决策。
社交网络分析
社交网络提供了丰富的关系数据,可以自然地表示为图,其中用户为节点,用户之间的连接为边。图深度学*技术已经成为分析和提取社交网络数据洞察力的强大工具。
社区检测
社区检测旨在识别社交网络中密切连接的用户群体,如图 11.1所示。传统的社区检测算法,如模块化优化或谱聚类,通常在大规模网络中表现不佳。图神经网络(GNNs)通过学*能够捕捉局部和全局网络结构的节点嵌入,提供了一个有前景的替代方案:

图 11.1 – 社区检测
例如,Wang 等人(2024)(doi.org/10.1016/j.neucom.2024.127703)提出了一种图自编码器(GAE)方法用于社区检测。该模型通过图卷积层将节点编码到低维潜空间中,然后尝试从这些嵌入表示中重构图结构。通过在重构任务上训练,嵌入表示能够自然地将属于同一社区的节点聚集在一起。解码器随后可以用来分配社区标签。
影响传播建模
理解信息和影响如何在社交网络中传播,对于病毒营销和公共健康活动等应用至关重要。GNNs 可以通过学*节点属性和网络结构如何影响传播模式,从而建模复杂的扩散动态。
Qiu 等人提出的DeepInf 模型(dl.acm.org/doi/10.1145/3219819.3220077)使用图注意力网络(GAT)预测用户是否会受到影响并采纳某种行为,基于其本地网络邻域。注意力机制使得模型在进行预测时能够聚焦于最具影响力的邻居。
用户行为预测
预测用户行为和偏好是推荐系统和定向广告的关键任务。GNNs 通过融入社交上下文和网络效应,能够提高预测精度。
例如,Fan 等人提出的GraphRec 模型(arxiv.org/abs/1902.07243)使用图卷积网络(GCN)从用户-物品互动图中学*用户和物品的嵌入表示,应用于社交推荐。该模型还融合了社交聚合层,用于捕捉用户社交连接的影响力。
假新闻检测
社交媒体上的虚假信息传播已经成为一个重大的社会挑战。基于图的深度学*模型可以通过分析内容特征和传播模式,帮助检测假新闻。
例如,Lu 和 Li 提出的GCAN 模型(aclanthology.org/2020.acl-main.48)使用图感知共注意力网络(CAN)来联合建模新闻内容和用户参与模式。该模型学*新闻文章、用户资料和用户与新闻互动的表示,以进行预测。
通过捕捉复杂的关系结构并学*丰富的节点表示,GNN 可以提高社交网络分析任务的表现。
金融服务
基于图的深度学*模型已经成为分析金融数据中复杂关系和模式的强大工具。通过将金融实体及其相互作用表示为图中的节点和边,这些模型能够捕捉传统方法常常遗漏的复杂依赖关系。
交易网络中的欺诈检测
基于图的深度学*在金融领域最具影响力的应用之一是检测交易网络中的欺诈活动。传统的欺诈检测系统通常依赖于基于规则的方法或孤立地分析交易。然而,欺诈行为往往涉及多个实体之间复杂的互动模式,且通常是随时间变化的。
GNN 可以建模整个交易网络,其中节点表示账户或用户,边表示交易或实体之间的关系。通过在图结构中传播和聚合信息,GNN 可以识别那些在单独查看交易时可能看不见的可疑模式。
例如,阿里巴巴的一个团队开发了一个基于 GNN 的欺诈检测系统,名为GraphConsis,其表现显著超过传统方法。该模型将用户、商家和设备表示为异构图中的节点,边则表示各种类型的交互。通过学*捕捉本地和全局图结构的节点嵌入,GraphConsis 能够识别协调的欺诈团伙,并检测交易模式中的细微异常。
信用风险评估
评估信用 worthiness 是金融机构的一个关键任务。基于图的模型可以通过整合多种数据源并建模借款人、他们的财务活动及外部因素之间的复杂关系,从而增强信用评分。
例如,研究人员提出了多个基于图的信用评分模型。这些方法构建了一个图,其中节点代表贷款申请人,边代表基于各种特征的申请人之间的相似性。模型随后使用 GCN 传播信用信息,跨相似的申请人进行传播,从而得到更准确、可靠的信用评分。这类模型还可以在学*过程中引入领域知识作为约束,确保模型的预测符合既定的金融原则。
基于公司关系图的股市预测
股市是一个复杂的系统,其中公司业绩往往因供应链关系、竞争以及更广泛的经济因素而相互关联。基于图的模型能够捕捉这些复杂的关系,从而提高股价预测和投资组合管理的效果。
一项由研究人员进行的研究提出了长短期记忆图卷积神经网络(LSTM-GCN)模型,用于股市预测(arxiv.org/abs/2303.09406)。该模型构建了一个公司的动态图,其中边代表价值链关系和历史股价的相关性。LSTM-GCN 模型随后学*从邻*公司及历史时间段的信息中进行聚合,以预测未来的股价。
反洗钱系统
洗钱通常涉及复杂的交易网络,旨在掩盖非法资金的来源。基于图的深度学*模型特别适用于反洗钱(AML)应用,因为它们能够分析整个交易网络,从中识别出可疑的模式。
例如,研究人员开发了一种基于 GNN 的 AML 系统,称为GCN-AML,该系统在比特币交易图上运行(arxiv.org/abs/1908.02591)。该模型将比特币地址表示为节点,将交易表示为边,构建一个大规模的图结构。通过将 GCN 应用于该结构,GCN-AML 能够学*识别洗钱活动的指示模式,如资金的分层和整合。该系统在检测已知的洗钱案件方面表现出高度准确性,同时也揭示了先前未被识别的可疑活动。
个性化金融推荐
基于图的模型还可以通过建模客户、产品和金融行为之间的关系来增强个性化金融服务。
例如,一家主要银行实施了基于 GNN 的个性化金融产品推荐系统。该系统构建了一个异构图,包含 客户节点、产品节点 和各种 互动边(例如,过去的购买、查询和人口统计相似性)。通过学*捕捉客户偏好和产品特征的嵌入,GNN 可以生成高度相关和个性化的产品推荐,从而提高客户满意度和产品采纳率。
系统性风险评估
监管机构和中央银行越来越感兴趣于使用基于图的模型来评估金融网络中的系统性风险,特别是在 2008 年金融危机之后。
例如,研究人员提出使用 GNN 来建模银行间借贷网络并预测系统性风险。通过将银行表示为节点,将其借贷关系表示为边,GNN 可以学*识别金融系统中脆弱的机构和潜在的传播路径。这种方法相比传统的压力测试方法,能够实现更为动态和数据驱动的系统性风险评估。
基于图的深度学*模型为分析金融系统复杂、互联的特性提供了强大的工具。随着这些技术的不断发展,我们可以预见到会出现更多利用金融数据丰富关系结构的复杂应用,旨在改善决策、风险管理和金融服务行业中的客户体验。
网络安全
GNN(图神经网络)已成为网络安全应用中的一种强大工具,利用许多安全相关数据集的固有图结构来检测威胁和异常。
为什么选择图用于网络安全?
许多网络安全数据集和问题自然适合图表示:
-
网络流量和通信可以建模为图,其中设备作为 节点,连接作为 边。
-
系统调用追踪形成进程交互的时间图。
-
用于欺诈检测的社交网络本质上是图结构的。
-
软件依赖图表示代码组件之间的关系。
通过使用基于图的模型,我们可以捕捉和分析复杂的关系和模式,而这些可能被传统的机器学*(ML)方法忽视。
网络入侵检测
GNN 在通过分析流量模式来检测网络入侵和异常方面显示出潜力。在这个应用中,以下几点是相关的:
-
节点 代表设备或 IP 地址。
-
边 表示网络连接或数据传输。
-
节点特征 可能包括设备类型、操作系统等。
-
边特征 可能包括协议、端口号、数据量等。
GNN 可以学会识别可能表明正在进行的攻击或受损设备的可疑通信模式。例如,基于 GNN 的入侵检测系统(IDS)可能会标记出不常通信的节点之间的异常数据传输,或者发现某个节点突然建立了许多新连接:

图 11.2 – 使用图学*进行入侵检测
恶意软件检测
程序行为的图表示,如系统调用图或控制流图,可以通过 GNN 进行分析,从而检测恶意软件。在这种情况下,注意以下几点:
-
节点表示系统调用或代码块。
-
边表示时间顺序或控制流。
-
节点特征可能包括调用类型、参数、返回值等。
GNN 可以学会区分良性和恶意的行为模式。例如,GNN 可能会识别出具有勒索病毒文件加密操作特征的系统调用序列。
让我们来看一个高级持续威胁(APT)检测的例子。APT 是复杂的长期网络攻击,特别难以检测。让我们考虑一个假设的基于 GNN 的 APT 检测系统:
-
图构建
-
节点表示网络实体(设备、用户、IP 地址)。
-
边表示通信或访问事件。
-
节点特征包括设备类型、已安装的软件和用户角色。
-
边特征包括通信协议、数据量和时间戳。
让我们看一个例子:
def construct_graph(network_data): # devices, users, IP addresses nodes = create_nodes(network_data) # communications, access events edges = create_edges(network_data) for node in nodes: # device type, software, user role node.features = extract_node_features(node) for edge in edges: # protocol, data volume, timestamp edge.features = extract_edge_features(edge) return Graph(nodes, edges)
-
-
GNN 架构
-
使用 GAT 来学*节点嵌入。
-
时间边通过递归机制处理(例如,门控递归单元(GRU)单元)。
-
多个 GNN 层捕捉多跳关系。
这可能是如何工作的:
class APTDetectionGNN(nn.Module): def __init__(self, in_features, hidden_features, num_layers): super().__init__() self.gat_layers = nn.ModuleList([ GATConv(in_features if i == 0 else hidden_features, hidden_features )for i in range(num_layers) ]) self.gru = nn.GRU(hidden_features, hidden_features) self.output = nn.Linear(hidden_features, 1) def forward(self, x, edge_index, edge_attr): for gat in self.gat_layers: x = F.relu(gat(x, edge_index, edge_attr)) x, _ = self.gru(x.unsqueeze(0)) return self.output(x.squeeze(0)).squeeze(-1)
-
-
训练
下面是我们为 APT 事件检测编写模型训练代码的方法,使用历史标签数据。
def train_model(model, labeled_data, unlabeled_data, num_epochs=10): optimizer = torch.optim.Adam(model.parameters()) for epoch in range(num_epochs): model.train() # Supervised learning optimizer.zero_grad() x, edge_index, edge_attr, y = labeled_data out = model(x, edge_index, edge_attr) loss = F.binary_cross_entropy_with_logits(out, y) loss.backward() optimizer.step() # Print training progress if epoch % 2 == 0: print(f"Epoch {epoch}, Loss: {loss.item():.4f}") -
检测
-
GNN 为每个节点输出异常分数。
-
高异常分数的节点会被标记以供调查。
-
可以分析注意力权重,以解释哪些连接对异常分数做出了贡献。
让我们采用以下方法:
def detect_apts(model, graph, threshold=0.5): model.eval() with torch.no_grad(): x, edge_index, edge_attr, _ = graph anomaly_scores = torch.sigmoid(model( x, edge_index, edge_attr)) suspicious_nodes = ( anomaly_scores > threshold ).nonzero().flatten() results = [] for node in suspicious_nodes: attention_weights = model.get_attention_ weights( node) results.append({ 'node': node.item(), 'score': anomaly_scores[node].item(), 'attention': attention_weights }) return results这种方法通过将看似无关的事件(如异常的登录时间、非典型的系统访问和低量的数据外泄)连接起来,从而形成一个连贯的正在进行中的攻击图景,能够检测微妙的 APT 模式。然后,可以分析模型的注意力权重,解释哪些连接对异常分数做出了贡献,为安全团队提供有价值的洞察。
-
能源系统
基于图的深度学*模型可以作为分析和优化复杂能源系统的强大工具。通过将能源网络表示为图,这些模型能够捕捉不同组件之间错综复杂的关系和依赖关系,从而实现更准确的预测、更高效的控制策略和更好的决策制定。
能源系统的图表示
能源系统可以自然地表示为图形,其中节点通常表示发电机、变压器、输电线路和负载等物理组件,而边表示这些组件之间的连接和交互。这种图结构使我们能够建模以下内容:
-
组件之间的功率流
-
网络中的相互依赖关系
-
空间和时间关系
-
系统拓扑和连接性
负载预测
基于图的深度学*模型在预测电力网络中的电力需求方面表现出优越性能。通过整合电网拓扑和负载之间的空间相关性,这些模型能更有效地捕捉复杂模式,而不是传统的时间序列方法。
例如,可以在城市电网中使用 GCN-LSTM 混合模型进行短期负荷预测,其中每个节点表示一个变电站,边表示输电线路。该模型从相邻变电站和历史负荷数据中聚合信息,以进行准确的预测。
故障检测和定位
GNN 可以分析异常在电力网络中的传播,实现快速检测和故障定位。
例如,可以使用基于 GAT 的模型来识别输电网络中的故障组件。注意机制使模型在检测异常时能够集中关注最相关的邻*节点,从而提高准确性和可解释性。
最优功率流
GNNs 可以比传统方法更高效地学*解决诸如最优功率流(OPF)等复杂优化问题。
例如,可以训练基于 GNN 的模型来*似 OPF 解决方案,考虑网络约束和可再生能源的不确定性。该模型可以在毫秒内生成接*最优的解决方案,实现电力调度的实时优化。
可再生能源预测
时空 GNNs(STGNNs)特别适用于预测可再生能源发电,因为它们能捕捉空间相关性(例如附*风电场之间)和时间模式。
例如,STGNN 模型可用于预测跨越光伏(PV)安装网络的太阳能发电。该模型可以整合天气数据、历史发电量和站点之间的空间关系,以提高预测精度。
能量存储管理
基于图的强化学*(RL)模型可以优化分布式能量存储系统的运行,考虑网络约束和市场条件。
例如,可以使用图强化学*(GRL)代理来协调微电网中的电池能量存储系统网络。该代理可以学*如何最优化地充电和放电电池,平衡可再生能源的整合、峰值削减和电力市场参与。
脆弱性评估
GNNs 可以分析电力网对各种扰动的韧性,并识别关键组件。
例如,基于 GCN 的模型可用于评估电力网对级联故障的脆弱性。该模型可以学*预测故障在网络中的传播,并识别对系统稳定性至关重要的最关键节点。
物联网
基于图的深度学*模型可用于分析物联网系统中复杂的相互连接关系。通过将物联网设备、传感器及其交互作用表示为图结构中的节点和边,这些模型能够捕捉到重要的关系信息和依赖关系,这对于各种物联网应用至关重要。
设备交互建模
物联网系统中的一个基本挑战是建模异构设备和传感器之间的复杂交互。GNNs 提供了一种优雅的解决方案,通过自然地将设备表示为节点,并将它们的通信或依赖关系表示为图中的边。
GCNs 在这项任务中尤其有效。在 GCN 中,每个节点通过卷积操作从其邻居汇聚信息,使得模型能够学*到包含节点特征和图结构的表示。这使得 GCN 能够捕捉到物联网设备之间复杂的交互模式。
例如,在智能家居环境中,GCN 可以建模各个智能电器、环境传感器和用户设备之间的关系。该模型可以学*一个设备(例如,运动传感器)的激活如何影响其他设备(例如,灯光或恒温器)的行为。然后,可以利用这种学*到的表示来执行任务,如预测设备状态或优化整体系统性能。
传感器网络中的异常检测
检测物联网传感器网络中的异常对于识别故障、安全漏洞或异常事件至关重要。基于图的深度学*模型通过利用传感器读数之间的空间和时间相关性,能够在这一任务中表现出色。
GATs 在这个领域已经显示出了有希望的成果。GATs 使用注意力机制为相邻节点分配不同的权重,使模型能够专注于最相关的信息进行异常检测。这在大规模物联网部署中尤其有用,因为并非所有传感器交互都是同等重要的。
实际应用中,基于 GAT 的异常检测系统可能如下工作:
-
将传感器表示为图中的节点,其边根据物理接*度或逻辑关系建立。
-
使用历史传感器读数作为节点特征。
-
应用图注意力层来学*捕捉正常行为模式的表示。
-
使用这些学*到的表示来识别可能表明异常的偏差。
这种方法已成功应用于检测城市水分配网络、工业控制系统(ICS)和智能电网基础设施中的异常。
预测性维护
预测性维护是工业物联网(IIoT)环境中的一个关键应用,其中意外的设备故障可能导致巨大的成本和安全风险。基于图的深度学*模型可以通过整合工业系统不同组件之间的复杂相互依赖性来增强预测性维护。
时间图神经网络(TGNN)特别适合于这一任务,因为它们可以同时建模组件之间的空间关系和它们的时间演变。一个用于预测性维护的 TGNN 可能实现以下目标:
-
将设备组件表示为节点,并将它们的物理或功能连接表示为边。
-
使用传感器读数和操作数据的时间序列作为动态节点特征。
-
应用 GCN 和循环神经网络(RNN)层以捕捉空间和时间模式。
-
预测未来组件状态或故障概率。
这种方法已被证明在预测制造厂、风力涡轮机和飞机发动机中的设备故障方面优于传统的机器学*方法。
智能家居应用
在智能家居环境中,基于图的深度学*可以通过建模设备、用户和环境之间的复杂互动来增强各种应用。
例如,智能家居自动化的基于图的推荐系统可能使用如下的异构图结构:
-
设备、用户和房间被表示为不同类型的节点。
-
边表示交互(例如,用户与设备的交互)或关系(例如,设备的位置)。
-
节点特征 包括设备特征、用户偏好和环境数据。
通过应用图嵌入或图卷积矩阵补全等技术,系统可以生成个性化的自动化规则或设备使用推荐,这些规则和推荐考虑到智能家居生态系统的完整上下文。
法律治理和合规性
GNN(图神经网络)可以成为法律和合规领域的有用工具,为解决复杂挑战提供创新解决方案。通过利用图结构来表示法律实体、文档和法规之间的复杂关系,这些技术正在彻底改变法律专业人士和合规人员处理工作的方式。
法律和监管数据的知识图谱构建
深度学*在法律领域中图谱应用的主要之一是构建和利用知识图谱。这些图谱作为法律和监管信息的全面存储库,捕捉法律、法规、法院案件和法律概念等各种实体之间的复杂关系:
-
实体提取与关系映射:深度学*模型,特别是基于自然语言处理(NLP)技术的模型,广泛应用于自动提取法律文本中的实体和关系。然后,可以使用图神经网络(GNNs)来优化和扩展这些关系,创建一个丰富、互联的法律知识网络。
-
多语言集成:在多个官方语言的地区,例如欧盟(EU),基于图的深度学*有助于跨不同语言集成法律信息。这使得创建支持跨境合规和法律研究的多语言法律知识图成为可能。
-
动态更新:法律环境不断变化。深度学*模型可以被训练以持续更新知识图,包括新的立法、判例法和监管变动,确保图保持最新并具有相关性。
自动化合规监控与风险评估
基于图的深度学*为自动化合规流程和评估监管风险提供了强大的工具:
-
复杂法规中的模式识别:GNNs 可以分析作为图形表示的监管文本结构,识别传统文本分析方法可能忽视的模式和关系。这一能力对于理解新法规对不同业务领域的影响尤为重要。
-
实时合规检查:通过将组织的操作和监管要求表示为图形,深度学*模型可以执行实时合规检查。这些模型可以标记潜在的违规行为并建议纠正措施,从而显著减少不合规的风险。
-
预测风险分析:通过分析历史合规数据和以图形形式呈现的当前监管趋势,深度学*模型能够预测未来的合规风险。这使得组织能够在潜在问题变成严重问题之前,主动解决可能出现的风险。
法律文件分析与合同管理
基于图的深度学*正在改变法律文件的分析和管理方式:
-
法律文件的语义理解:通过将法律文件表示为互联概念和条款的图,深度学*模型能够更细致地理解文件内容。这使得文件分类、比较和信息检索变得更加准确。
-
自动化合同审查:GNNs 可以被训练用于分析合同图,识别关键条款、潜在风险和不一致之处。这大大加快了合同审查过程并提高了准确性。
-
法律先例分析:通过将判例法表示为一个互联的裁决图,深度学*模型能够更有效地分析法律先例。这有助于案件准备和预测法律争议的潜在结果。
监管智能与政策影响评估
图上的深度学*正在提升组织对规制变动的理解和应对能力:
-
监管变动管理:通过将监管框架表示为图,深度学*模型可以分析某一规制变动对其他相关规制的影响。这有助于组织全面理解监管变化的影响,并相应调整其合规策略。
-
政策影响预测:GNN(图神经网络)可以用来建模拟议的规制或政策变动的潜在影响。通过分析不同领域的法律与商业操作之间的联系,这些模型能够预测新政策可能如何影响各方利益相关者。
总结
在本章中,我们探讨了图深度学*在各个领域的多样化应用。你了解了基于图的 approaches 是如何革新生物学与医疗保健、社交网络分析、金融服务、网络安全、能源系统、物联网和法律治理与合规等领域的。
我们还强调了 GNN 及其他基于图的模型如何捕捉复杂的关联数据结构,从而在药物发现、欺诈检测、网络优化和预测性维护等领域取得突破。通过展示这些技术的适应性和可迁移性,我们解释了图深度学*在跨行业和学科解决复杂现实问题中的深远影响。
在下一章中,我们将探讨图深度学*的未来发展,并揭示哪些领域将深受这些强大模型的影响。
第十二章:图学*的未来
本书涵盖了图学*的广泛主题,从基础概念到前沿应用。现在你已经具备了坚实的基础,可以应对复杂的基于图的问题,并为这一快速发展的领域做出贡献。
图学*领域正处于革命性时代的风口浪尖,准备转变我们理解和与复杂、相互关联数据互动的方式。展望未来,几个关键的趋势和进展正在塑造这一动态领域的发展轨迹。
在本章最后,我们将讨论以下主题:
-
新兴的趋势和方向
-
高级架构和技术
-
与其他人工智能(AI)领域的集成
-
潜在的突破与长期愿景
新兴的趋势和方向
图学*的新趋势反映了基于图的模型日益增强的能力以及它们在应用领域的广泛扩展。从模型架构的进展到新颖的训练技术,以下发展处于图学*研究和实践的前沿。
可扩展性和效率
正如我们在第五章中看到的那样,随着数据量的指数级增长,处理日益庞大和复杂的图已经成为一个关键挑战。研究人员正在开发创新的方法来应对这一挑战。
处理更大、更复杂的图
新的算法正在被设计,用于高效地处理包含数十亿节点和边的图(有关节点级和边级学*的更多详细信息,请参见第二章)。这些方法通常利用现实世界图的稀疏性和局部性特征。例如,基于采样的方法,如GraphSAGE(参见第四章)和FastGCN,已经在通过操作节点子集而非整个图来扩展图神经网络(GNNs)到大规模图中表现出前景。另一个方向是开发更高效的聚合方案,如Cluster-GCN方法(也在第四章中讨论),该方法将图预处理为较小的聚类以降低计算复杂度。
分布式和并行图学*算法
技术如图分割和分布式训练使得可以在多个机器或图处理单元(GPU)上处理大规模图。这使得我们能够扩展到以前无法处理的问题规模。分布式 GNN 框架,如DistDGL(arxiv.org/abs/2010.05337)和AliGraph(arxiv.org/abs/1902.08730),使得在包含数十亿节点和边的图上训练模型成为可能。这些系统通常采用复杂的分割策略,以最小化通信开销,同时保持模型的准确性。
图压缩技术
出现了新方法,用于在保留重要拓扑信息的同时压缩图结构。这些技术减少了内存需求和计算复杂性,使得在有限硬件上处理巨大的图变得可行。诸如图稀疏化和节点剪枝的方法,可以显著减少图的大小,同时保持基本的结构属性。此外,量化和低秩*似等技术也正在应用于 GNN 模型,以减少其内存占用。
可解释性与可解释性
随着图学*模型变得更加复杂,解释性需求也在增加。
开发理解 GNN 决策的方法
研究人员正在开发技术,以可视化并解释 GNN 的决策过程。这包括诸如注意力可视化和特征重要性分析等方法。例如,GNNExplainer 提供了一种识别个别预测中重要子图和特征的方法。其他方法,如PGExplainer,则专注于生成易于理解的 GNN 预测解释。
图学*模型的可视化技术
正在开发先进的可视化工具,帮助研究人员和从业者理解图模型的内部工作原理。这些工具可以揭示节点嵌入中的模式(我们也在第三章中探讨了这一点),突出显示重要的子图,并展示信息如何在图中流动。诸如GraphViz和NetworkX等项目正在扩展,以支持可视化 GNN 架构及其学*到的表示。
图结构中的因果推断
对图中的因果关系的理解兴趣日益增长。这涉及到开发方法,以区分图数据中的相关性和因果性,这对于许多实际应用至关重要。针对图的因果发现算法,如有向无环图-图神经网络(DAG-GNNs),正被开发用于从观测数据中推断因果结构。这些方法在医疗保健和社会科学等领域具有潜在的应用。
动态与时序图
许多现实世界中的图是动态演化的,这需要新的方法来应对。
学*关于演变的图结构
正在开发处理节点和边随时间出现或消失的图的方法。这对于社交网络分析和金融欺诈检测等应用尤其重要。像EvolveGCN和DynGEM这样的模型能够随着图结构的变化有效更新节点表示。这些方法通常使用递归架构来捕捉时间依赖关系。
在图模型中融合时间信息
研究人员正在探索将时间相关的信息直接嵌入图模型的方法。这使得复杂的时间依赖关系和模式可以在动态图中被捕捉。时间图神经网络(TGNNs)(见第十一章)和时间感知图神经网络(TA-GNNs)是为处理连续时间动态图而设计的架构示例。
预测未来的图状态
正在创建高级模型来预测图的演变。这在交通预测、流行病建模和推荐系统等领域有广泛应用(我们在第九章中进行了详细探讨)。像Graph WaveNet、时空图神经网络(STGNNs)(见第十一章)和时空图卷积网络(STGCNs)等方法将图卷积与时间卷积结合,以捕捉空间和时间的依赖关系,从而进行预测任务。
异质和多模态图
现实世界中的图通常包含多种类型的节点和边,以及多种数据模态。
处理多样化的节点和边类型
新的架构正在被设计,用于有效处理具有异质节点和边类型的图谱。这对于知识图谱和生物网络等应用至关重要。异质图神经网络(HGNNs)(见第四章)和关系图卷积网络(R-GCNs)是能够处理多种节点和边类型的模型示例。
将多种数据模态与图结合
研究人员正在开发将图数据与其他模态(如文本、图像和音频)结合的方法。这使得图谱能够表示更丰富的信息,并构建更强大的模型。例如,Graph-BERT结合了图结构和文本信息,采用了变换器架构。在我们在第十章中讨论的计算机视觉领域,方法如 STGNNs 将视觉和图数据结合,用于动作识别等任务。
图谱上的跨模态学*
现在正在出现跨模态知识转移技术,这使得图学*模型更加健壮和多功能。例如,图跨模态注意力网络(graph cross-modal attention networks)可以在不同模态之间交换信息,增强在需要多模态推理的任务上的表现。
高级架构和技术
从先进的变压器架构到前沿的生成模型,再到创新的强化学*策略,图学*在各种任务中展现出巨大的潜力。
图变换器和注意力机制
在自然语言处理(NLP)中,变压器架构的成功(我们在第八章中讨论过)正在激发图学*的新方法。
为图数据适配变压器架构
研究人员正在修改变压器模型,使其能够有效地处理图结构数据。这使得图中能够捕捉到长程依赖关系和全局上下文。图变换器网络(GTNs)调整自注意力机制,以便在图结构数据上操作,使模型能够学*节点之间的复杂关系。这些模型可以在学*过程中动态调整图结构,可能会发现原始图中未显式呈现的隐藏关系。
图学*的自注意力机制
专门为图设计的新型注意力机制正在开发。这些机制使得模型能够专注于图中与给定任务最相关的部分。图注意力网络(GATs)(见第四章)引入了注意力系数,在聚合步骤中对不同邻*节点的重要性进行加权。这使得模型能够为不同的节点分配不同的重要性,从而提升在各种图任务中的表现。
图中的长程依赖关系
新技术正在出现,以高效地捕捉图中远距离节点之间的关系。这对于需要理解全局图结构的任务尤为重要。方法如自适应图卷积网络(AGCNs)和图小波正在开发,以捕捉图中的多尺度信息,允许模型同时考虑局部和全局图结构。
AGCNs 旨在在学*过程中动态调整图结构。这种自适应特性使其能够捕捉并建模在原始图结构中可能没有直接连接的节点之间的关系。通过这种方式,AGCNs 可以有效地建立远距离节点之间的连接,从而解决传统 GCNs 经常难以应对的长程依赖问题。
图生成模型
生成逼真图结构的能力正在开启新的可能性。
生成逼真的图结构
高级生成模型,如图变分自编码器(GVAE)和图生成对抗网络(GraphGAN),正在被开发用于创建模拟真实网络属性的合成图。这些模型能够学*生成具有特定特征的图,如度分布、聚类系数和社区结构。这一能力特别适用于模拟复杂系统和生成基准数据集。
药物发现和材料科学的应用
图生成模型正在被用于设计具有所需属性的新分子和材料,可能会加速科学发现。像MolGAN和GraphAF这样的模型可以生成具有特定化学属性的新型分子结构,有助于新药物和材料的发现。这些方法有潜力显著减少传统实验方法所需的时间和成本。
GVAEs 和 GANs
这些模型正在不断改进,以生成越来越逼真和多样的图结构,应用范围从社交网络模拟到蛋白质设计。最*的进展包括条件图生成,在这种方式下,模型可以生成具有特定属性或约束的图。这在网络设计等领域具有应用价值,其中需要具有特定结构属性的图。
图上的少样本和零样本学*
少样本学*在图上的应用是指模型能够在只有少量标注示例的情况下学*并对图结构数据进行预测。这种方法在处理大规模图数据集时尤其有用,因为获取标注数据既昂贵又耗时。
另一方面,零样本学*在图上的应用更进一步,使模型能够对训练过程中未见过的全新类别或任务进行预测。这是通过利用与图中节点或边相关的语义信息或属性来实现的。
知识迁移到新的图任务
正在开发的技术可以将一个图领域的知识应用到另一个领域,从而实现快速适应新问题。图的元学*框架,如Meta-GNN,允许模型通过学*一个可以通过最少数据进行微调的元模型,快速适应新任务。这在标注数据稀缺或获取成本高的领域尤为有用。
图的元学*方法
研究人员正在探索可以快速适应新图任务并进行最小调整的元学*框架。像图少样本学*(GFL)这样的方式旨在跨不同的图数据集和任务学*可转移的知识。这些方法通常涉及学*一个基础模型,可以通过少量示例快速适应新任务。
处理图领域中的有限标注数据
正在创造新的半监督和自监督学*技术,以有效利用大量未标注的图数据。像图对比学*(GraphCL)和深度图信息最大化(DGI)这样的自监督方法,通过从未标注的图数据中学*有用的表示,然后可以使用有限的标注数据进行微调,以适应特定任务。
图上的强化学*
将图学*与强化学*(RL)结合正在开辟新的应用领域。
基于图的强化学*在决策制定中的应用
研究人员正在开发能够直接在图结构状态空间上运行的强化学*算法,从而在复杂环境中实现更高效的决策制定。图卷积强化学*(GCRL)(arxiv.org/abs/1810.09202 )将 GNN 与强化学*结合,处理具有图结构状态表示的环境。这一方法在交通信号控制和复杂网络中的资源分配等任务中显示出了前景。
在机器人技术和自主系统中的应用
基于图的强化学*(RL)正在应用于机器人导航和多智能体协调等任务,在这些任务中,理解空间关系至关重要。例如,针对去中心化多机器人路径规划的图神经网络(GNN)已经被开发出来,用于协调复杂环境中的多个机器人。这些方法使得机器人能够更有效地推理其环境和其他智能体。
将图神经网络(GNN)与强化学*(RL)算法结合
正在探索将图神经网络(GNN)融入强化学*框架的新型架构,这使得在图结构环境中能够更有效地进行学*。像关系强化学*(RRL)这样的 approaches 利用 GNN 来建模环境中实体之间的关系,从而实现更高效的样本学*,尤其是在复杂的结构化领域中。这一方法在战略游戏和复杂系统优化等领域具有潜在应用。
与其他人工智能领域的整合
不同人工智能领域的整合已成为解决复杂问题和提升系统性能的关键策略。这一协同方法在将图学*与大语言模型(LLMs)、联邦学*和量子计算技术相结合时尤为明显。
图学*与大语言模型(LLMs)
正如我们在第六章 中学到的,图学*与大语言模型(LLMs)之间的协同作用是一个快速发展的领域。让我们一起探讨这种关系的未来。
使用图结构知识增强大语言模型(LLMs)
研究人员正在探索将图结构化知识纳入 LLM 的方法,以提高其推理能力和事实准确性。一种方法是将知识图谱作为 LLM 的外部记忆,使其在推理时可以访问结构化信息。例如,知识图谱语言模型(KGLM)将知识图谱与 LLM 集成,从而实现更准确且具有上下文相关性的文本生成。
另一种方向是对图结构化数据与文本一起进行 LLM 的预训练。像带有信息实体的增强语言表示(ERNIE)这样的模型在预训练过程中结合了来自知识图谱的实体嵌入,从而在与实体相关的任务上提升了表现。
基于图的语言模型推理
新技术正在被开发,以使 LLM 能够对图结构化知识进行显式推理,从而增强其回答复杂问题的能力。像Graph2Seq这样的图到文本模型可以生成图结构的自然语言描述,架起了结构化知识与人类可读文本之间的桥梁。
研究人员还在开发使用 LLM 进行多跳推理的方法。例如,图推理增强语言模型(GREASELM)框架(arxiv.org/abs/2201.08860)允许语言模型在知识图谱上执行逐步推理,从而提高在复杂问答任务中的表现。
使用 LLM 进行知识图谱的补充和更新
LLM 正在被用来自动扩展和更新知识图谱,创造文本与图结构化知识之间的共生关系。像GPT-3这样的模型已显示出生成可以用来填充知识图谱的合理事实的能力。然而,确保这些生成事实的准确性仍然是一个挑战。
像零-shot 关系抽取这样的技术正在被开发,用于自动识别文本中的新关系并将其添加到现有的知识图谱中。这使得我们能够基于从文本中提取的最新信息,持续更新知识图谱。
联邦图学*
联邦图学*(FGL)是一种创新方法,它将联邦学*原则与基于图的数据结构和算法结合在一起。它使多个参与者能够在分布式图数据上协同训练机器学*模型,而无需直接共享敏感信息。FGL 解决了涉及互联数据(如社交网络或金融系统)场景中的隐私问题。该方法允许在保持数据本地性和隐私的同时分析图结构数据,使其在数据敏感性和合规性至关重要的领域具有特别重要的价值。
分布式学*在去中心化图数据上的应用
联邦学*方法正在被适应于图数据,允许多个方在无需共享原始数据的情况下共同训练模型。联邦图神经网络(FedGNNs)允许在多个去中心化的图数据集上训练 GNN,仅在各方之间共享模型更新。
垂直联邦学*等技术正在被探索,用于处理同一实体的不同特征分布在多个方的场景。这使得即使图的不同部分由不同组织持有,也能进行图数据的协作学*。
隐私保护图分析
正在开发新技术,以在保护敏感信息的同时执行图分析,这对医疗和金融领域的应用至关重要。图的差分隐私方法,如边缘差分隐私,可以在提供正式隐私保证的同时发布图统计数据。
安全的多方计算(MPC)技术正在适应图数据,允许多个方共同分析图数据而不相互泄露敏感信息。这在不同组织希望共同进行图分析而不共享原始数据的场景中尤为有用。
医疗和金融领域的应用
FGL 正在推动在数据隐私至关重要的敏感领域(如医疗和金融)中进行协作研究和模型开发。在医疗领域,FGL 可以用于分析跨多家医院的患者互动网络,而无需共享敏感的患者数据。这有助于改进疾病预测和治疗推荐模型。
扩展我们在第十一章中讨论的内容,在金融领域,FGL 可应用于交易网络中的欺诈检测等任务,允许多家金融机构在无需共享机密客户数据的情况下进行模型开发。
量子图神经网络(Quantum GNNs)
量子计算与图学*的交集是一个令人兴奋的前沿领域。
利用量子计算解决图问题
研究人员正在探索量子算法如何比经典算法更快地解决某些图问题。量子*似优化算法(QAOA)在解决图上的组合优化问题(如最大割问题)方面表现出了潜力。
最大割问题是一个基本的图优化任务,其目标是将图的顶点划分为两组,使得两组之间的边数最大化。通过利用量子叠加和干涉,QAOA 可以同时探索多个图的划分,从而可能更快地收敛到接*最优的解。
此外,基于量子行走的算法正在开发中,适用于图同构测试和中心性计算等任务,可能在某些图结构上提供比经典方法显著的加速。
量子启发的经典算法用于图
来自量子计算的洞察正在启发新的经典算法,以解决图问题,可能带来显著的加速。受量子多体物理学启发的张量网络方法正被应用于图问题,如社区检测和链接预测(参见 第七章)。
此外,基于量子退火的量子启发式采样技术正被调整为适用于经典计算机,以更高效地解决图优化问题。
图学*任务中的潜在加速
量子 GNN 正被开发中,一旦量子硬件成熟,它们可能为某些图学*任务提供巨大的加速。变分量子电路正在设计中,以实现图卷积操作,这可能使得在量子硬件上更高效地处理图结构数据成为可能。
混合量子-经典方法也在探索中,在这种方法中,图学*流程的某些部分在量子硬件上执行,而其他部分保持经典计算。这可能使得量子和经典计算范式的优点能够相互补充。
潜在的突破和长期愿景
在我们探索人工智能的前沿时,考虑可能的突破和长期愿景至关重要,这些突破和愿景可能会塑造该领域的未来。
人工通用智能与图
图表示可能在人工通用智能(AGI)的发展中发挥关键作用。
图表示在 AGI 中的作用
研究人员正在探索图结构的知识和推理如何有助于更通用和灵活的 AI 系统。图表示提供了一种自然的方式来建模复杂的关系和层次结构,这对于类人推理至关重要。例如,神经符号概念学*器将 GNN 与符号推理相结合,从视觉场景中学*概念和关系,展示了朝着更通用 AI 系统发展的潜力。
基于图的世界模型正在开发中,以使 AI 系统能够建立和维持其环境的内部表示。这些模型能够捕捉因果关系,并允许在复杂动态环境中进行规划和推理,这对于 AGI 至关重要。
基于图的推理和常识知识
图形表示正在被用于捕捉和推理常识知识,这是人工智能中的一个关键挑战。像ConceptNet和ATOMIC这样的项目正在构建大规模的知识图谱,编码常识事实和关系。这些图谱可以与神经模型整合,以增强其推理能力,并将其理解基于现实世界的知识。
研究人员还在开发基于图形的推理引擎,能够在常识知识图上进行多跳推理。这使得人工智能系统能够做出逻辑推理,并回答需要将多个信息片段结合起来的复杂查询。
通过图形集成符号和神经方法
图形正在作为符号人工智能和神经网络之间的桥梁,可能促成更强大的混合系统。神经-符号集成方法,如逻辑张量网络,利用图形结构将神经网络(从数据中学*)的优势与符号逻辑(显式推理)的优势相结合。
基于图形的神经-符号架构正在被探索用于视觉问答和自然语言理解等任务。这些系统可以同时利用神经网络的模式识别能力和符号系统的显式推理能力,有可能导致更强大且更具可解释性的人工智能。
神经形态计算与图形
启发自大脑的计算架构正在被探索用于图形处理。
启发自大脑的图形架构
研究人员正在开发更贴*大脑图形结构的神经网络架构。脉冲神经网络(SNNs)正在被适应于图形处理任务,提供在能效和生物学合理性方面的潜在优势。这些模型能够以更事件驱动的方式处理信息,类似于大脑中神经元的沟通方式。
受生物神经网络动态启发的水库计算方法正在被应用于图形学*任务。这些模型能够高效处理时序图数据,并在预测动态图演变等任务中展现出潜力。
图形学*的硬件加速
专用硬件正在被设计以加速图形学*算法,有可能带来显著的速度提升。神经形态芯片,如英特尔的 Loihi,正在被开发用于高效处理图形结构化数据并运行 SNNs。这些芯片可能在某些图形学*任务中提供数量级的能效提升。
专门为图形计算设计的 GPU 正在被研发。这些专用处理器旨在克服传统架构在处理大型稀疏图形时的内存带宽限制。
高能效的图形处理
正在探索新的方法,以提高图学*的能源效率,这些方法受到大脑低功耗消耗的启发。*似计算技术正在应用于图算法,通过牺牲一些准确性来换取显著的能效提升。这对于边缘计算应用尤为重要,因为功耗是一个关键约束。
研究人员还在探索用于图处理的模拟计算方法,这些方法可能为某些图操作提供极高的能效。这些方法包括使用忆阻器设备直接在硬件中实现图神经网络操作。忆阻器是一种电子组件,即使在断电后也能记住其先前的电阻状态,模拟生物突触的行为。这些纳米尺度设备在推动类脑计算方面具有巨大的潜力,能够实现更高效、更类似大脑的人工智能系统。
元宇宙中的图学*
随着虚拟世界的普及,图学*将发挥至关重要的作用。
从虚拟世界图谱中表示和学*
正在开发用于建模和分析虚拟环境中复杂交互网络的技术。基于图的虚拟世界表示能够捕捉空间关系、物体互动和用户行为。这些图模型可用于高效渲染、物理仿真和智能非玩家角色行为等任务。
研究人员正在探索实时学*和更新虚拟环境图谱表示的方法,从而实现动态响应的虚拟世界。这包括在线图学*和增量图更新的技术。
数字空间中的基于图的社交互动
图学*正在被应用于理解和促进虚拟世界中的社交动态。社交网络分析技术正在被调整以适应虚拟环境,用于研究用户互动、社区形成和信息传播。这有助于设计更加引人入胜、社交丰富的虚拟体验。
正在开发基于图的推荐系统,用于虚拟世界,根据用户在虚拟环境中的互动模式和偏好,推荐连接、活动或内容。
图学*的增强现实应用
基于图的模型正在被用于理解和增强增强现实(AR)应用中的物理世界。场景图被用来表示现实世界中物体之间的空间和语义关系,从而实现更复杂的增强现实体验。图神经网络(GNN)可用于推理这些场景图,并预测虚拟物体如何与现实环境互动。
研究人员还在探索基于图的方法用于同时定位与建图(SLAM)在增强现实中的应用,通过图优化技术提高空间映射和跟踪的准确性。
跨学科应用
正如我们在接下来的章节中将看到的那样,图学*正被广泛应用于不同领域。
气候科学与可持续性中的图学*
基于图的模型正在被用来理解复杂的气候系统,并优化资源配置以实现可持续性。气候网络中,节点代表地理位置,边代表气候相互作用,正在通过图学*技术进行分析,用以研究如厄尔尼诺现象等现象,并预测极端天气事件。
在可持续性领域,图学*正被应用于优化智能电网、管理水资源以及设计更高效的交通网络。例如,图神经网络(GNNs)被用来预测能源需求并优化可再生能源的分配。
社会科学与人文学科的应用
研究人员正在应用图学*来分析社交网络,研究历史文本,并理解文化现象。在社会学中,图学*技术被用来研究信息和行为如何通过社交网络传播。这对于理解如假新闻传播或新技术采用等现象具有应用价值。
在数字人文学科中,图学*正被应用于分析大量历史文本语料库,揭示概念、作者和历史事件之间的关系。这可能为文学分析和历史研究等领域带来新的见解。
经济学和金融领域的基于图的方法
图学*正在被用来建模经济网络、预测市场趋势并检测金融欺诈。在经济学中,研究人员正在使用 GNNs 来建模供应链网络,并预测扰动的影响。这在最*全球供应链挑战的背景下尤为重要。
在金融领域,正在开发基于图的异常检测技术,以识别交易网络中的复杂欺诈模式。图学*还被应用于分析金融市场,建模不同金融工具之间的关系,并预测市场动向。
这些跨学科应用展示了图学*在应对各个领域复杂问题中的广泛潜力,可能会带来我们理解和管理复杂系统的重大突破。
总结
在本章中,我们探讨了图学*的激动人心的未来,重点介绍了塑造这一动态领域的关键趋势和进展。我们讨论了可扩展性和效率方面的未来发展,着重介绍了可以用来处理更大、更复杂图的技术,分布式学*算法和图压缩方法。我们深入探讨了图模型中可解释性和可解释性的重要性日益增加的现象,以及处理动态和时序图的进展。我们还讨论了异构和多模态图带来的挑战与机遇,并探讨了图变换器和生成模型等先进架构。
然后,我们考察了图学*与其他人工智能领域的结合,如 LLMs 和 RL,以及 FGL 中的隐私保护技术。此外,我们还简要讨论了量子 GNN 的潜力以及图学*在 AGI 中的作用。最后,我们讨论了图学*在气候科学、社会科学和经济学等领域的跨学科应用,展示了这一技术在各个领域的广泛影响和潜力。
由于这是我们的最后一章,我们想提醒你本书中所学到的所有技能,以及如何将它们应用于从理解为何需要图到使用图深度学*进行现实应用的各个方面。为了继续你的学*旅程,我们建议深入探索你最感兴趣的专业领域的进一步研究,无论是 GNN、知识图谱还是基于图的推荐系统。你还可以考虑参加图学*竞赛或为开源图学*项目做贡献,从中积累实践经验。
请记住,图学*领域正在不断发展,因此保持关注最新的研究论文并参加相关的会议或研讨会,将有助于你保持在这个激动人心的领域的前沿。


个互不重叠的子集。在 K-路划分问题中,我们需要在每个
。将
添加到集合
开始,而不是
,并将其添加到
中。重复此过程,直到你的集合中有足够的条目为止。
和当前节点表示
。
(
) 是一个神经网络层,它将聚合的消息和当前节点表示作为输入,并生成更新后的表示:
是第
层的表示,且满足条件
。其中,
表示一个实值向量空间,维度为
。
是一个可学*的函数,通过基于节点先前的表示和从邻居聚合的消息来更新节点表示。
是一种置换不变的聚合函数,结合了相邻节点的表示。常见选择包括求和、平均值和最大值。
表示图
中节点
是层
中节点表示的矩阵,其中
是输入节点特征。
是添加了自环的邻接矩阵
是单位矩阵。
是
的对角度矩阵,其中
.
是一层的可学*权重矩阵
是一个非线性激活函数,例如修正线性单元(ReLU)函数或 sigmoid 函数。
是连接操作,而
是泄漏 ReLU 激活函数。
和
分别表示节点
的学*到的节点嵌入表示。
,其中我们有以下内容:
是用户的数量。
是该用户的平均精度,
/ 相关项的数量
是截断点的精度,
。
是指示函数(如果项
相关则为 1,否则为 0)。
,其中我们有以下内容:
是理想的
(最大可能的
)。
是位置
上项目的相关性得分。
,其中 
浙公网安备 33010602011771号