一句话理解 GNN
GNN 是 Graph Neural Network 的缩写,中文通常叫作图神经网络。它是一类专门处理图结构数据的神经网络。
所谓图结构数据,是指数据不只有一个个孤立的对象,对象之间还存在连接关系。GNN 的核心任务,就是让每个对象在更新自己的表示时,同时参考与它相连的对象。
用一句最简单的话说:
普通神经网络主要学习单个样本的特征,GNN 还会学习样本之间的关系。
例如,在社交网络中,每个用户是一个节点,关注关系是边;在论文引用网络中,每篇论文是一个节点,引用关系是边;在分子中,每个原子是一个节点,化学键是边。
在理解 GNN 之前,先弄清楚什么是图
一个图通常写成 。
- 表示节点集合,例如用户、论文、商品或原子。
- 表示边集合,用来描述节点之间的关系。
- 节点可以拥有特征,例如用户年龄、论文关键词或原子类型。
- 边也可以拥有特征,例如关系类型、距离、权重或时间。
假设有三篇论文 A、B、C。A 引用了 B,B 又引用了 C,那么三篇论文就是三个节点,引用关系就是边。即使 A 和 C 没有直接相连,信息仍然可以经过 B 在它们之间传播。
这正是图数据与普通表格数据的重要区别:一个样本的含义,往往同时取决于它自身和周围的结构。
为什么不能直接使用普通神经网络
传统的全连接网络通常要求固定长度的输入;卷积神经网络擅长规则网格,例如图像中的像素;循环神经网络擅长有顺序的序列。
图却具有三个特殊之处:
- 每个节点的邻居数量可能不同。
- 邻居通常没有天然的先后顺序。
- 不同图的节点数和连接方式可能完全不同。
因此,GNN 不能简单地把“第一个邻居、第二个邻居”拼接起来处理。它需要一种不受邻居排列顺序影响、又能适应不同邻居数量的方法。这个方法就是邻居聚合。
GNN 的核心:消息传递
大多数 GNN 都可以用 Message Passing,也就是消息传递框架来理解。一次消息传递通常包含三个步骤。
第一步:收集邻居信息
节点 先查看自己的邻居集合 ,收集每个邻居在当前层的表示。
邻居信息 = AGGREGATE({邻居节点的表示})
AGGREGATE 可以是求和、平均、最大值,也可以是带注意力权重的加权求和。关键要求是:交换邻居的排列顺序后,聚合结果不应该随意改变。
第二步:更新自身表示
节点把聚合得到的邻居信息与自己的旧表示结合,生成新的表示。
新表示 = UPDATE(自身旧表示, 邻居聚合信息)
经过这一层后,节点的表示就包含了自己和一阶邻居的信息。堆叠两层后,节点通常可以接收到二阶邻居的信息;堆叠三层后,可以继续看到更远的结构。
第三步:产生任务输出
更新后的节点表示可以用于不同任务:
- 节点分类:判断一篇论文属于哪个研究方向。
- 链接预测:判断两个用户未来是否可能建立关系。
- 图分类:判断一个分子是否具有某种性质。
- 聚类:根据节点属性和连接结构发现群体。
如果任务需要对整个图做预测,模型还会用 READOUT 将所有节点表示汇总成一个图表示。
一个直观例子:判断论文主题
假设要判断一篇新论文属于机器学习、数据库还是计算机视觉。只看论文自己的关键词可能不够,因为有些词在多个领域都会出现。
GNN 会同时查看它引用了哪些论文、又被哪些论文引用。如果它大量连接到图神经网络和表示学习论文,即使摘要中没有直接出现“GNN”,周围的引用结构仍能提供很强的主题信号。
一层 GNN 相当于问:“我的直接邻居都在研究什么?”
两层 GNN 相当于继续问:“我的邻居所连接的论文又在研究什么?”
模型最终学到的节点向量,不再只是论文文本的压缩,还融合了它在引用网络中的位置。
GNN 到底学习哪些参数
邻居关系本身通常不是训练出来的,而是数据给定的。GNN 真正学习的主要是下面这些参数:
- 将输入特征变换到隐藏空间的权重矩阵。
- 合并自身信息和邻居信息时使用的参数。
- 注意力模型中计算邻居重要性的参数。
- 最终分类器或预测头的参数。
训练时,模型先进行前向传播,得到分类概率、链接分数或图级预测;再根据真实标签计算损失;最后通过反向传播调整这些参数,使预测误差逐渐减小。
因此,GNN 不是简单地“把邻居平均一下”。邻居聚合只是信息流动方式,模型仍然要通过数据学习什么特征重要、不同信息应该如何组合。
常见 GNN 模型有什么区别
GCN
GCN 是 Graph Convolutional Network。它对邻居信息进行经过度数归一化的加权聚合。它的结构简洁,是理解图卷积和半监督节点分类时最常见的起点。
GraphSAGE
GraphSAGE 强调邻居采样和归纳学习。面对很大的图时,它不一定读取全部邻居,而是抽取一部分邻居参与计算,因此更适合大规模场景和未见过的新节点。
GAT
GAT 是 Graph Attention Network。它使用注意力机制为不同邻居分配不同权重。直观上,它允许模型学习“哪些邻居对当前节点更重要”。
GIN
GIN 是 Graph Isomorphism Network。它强调对图结构的区分能力,常用于图分类任务,也是理解 GNN 表达能力时的重要模型。
这些模型的具体公式不同,但共同骨架基本一致:传播邻居信息、更新节点表示,再用学到的表示完成任务。
GNN 可以用在哪里
GNN 的应用并不限于社交网络。只要问题中的对象和关系都重要,就可能适合图建模。
- 推荐系统:用户、商品及其交互关系。
- 风险控制:账户、交易和资金流向。
- 生物医药:分子、蛋白质和相互作用网络。
- 交通预测:道路、路口和车流关系。
- 知识图谱:实体、属性和语义关系。
- 代码分析:变量、函数及调用关系。
- 论文分析:作者、论文、机构和引用网络。
不过,能画成图并不代表一定要用 GNN。只有当关系结构确实能提供额外信息时,GNN 才可能比普通模型更有价值。
GNN 的常见问题
过平滑
层数太深时,相连节点的表示可能越来越相似,最后难以区分。这叫作 over-smoothing。
过压缩
大量远距离信息被压进固定维度的节点向量时,重要信息可能丢失。这叫作 over-squashing。
大图计算成本
真实图可能包含数百万甚至数十亿条边。完整聚合全部邻居会带来很高的显存和计算开销,因此常常需要采样、分区或小批量训练。
图结构并不总是可靠
边可能存在噪声,也可能随时间变化。如果连接关系本身质量很差,GNN 会传播错误信息。
相连节点不一定相似
很多基础 GNN 假设相邻节点更可能相似,但在欺诈网络、竞争网络等场景中,相邻节点可能恰好不同。这类异配图需要更有针对性的模型。
读 GNN 论文时应该看什么
看到一个新的 GNN 模型,可以先用下面六个问题拆解:
- 节点、边和特征分别代表什么?
- 每一层从哪些邻居收集信息?
- 邻居信息使用什么方法聚合?
- 自身信息是否被保留,是否存在残差连接?
- 模型最终解决节点级、边级还是图级任务?
- 实验提升来自更合理的结构,还是更大的参数量和计算量?
只要能回答这些问题,大多数 GNN 论文的主干就已经被抓住了。
最后总结
GNN 是处理图结构数据的神经网络。它最核心的思想不是某一个固定公式,而是让节点通过连接关系交换信息。
一个节点先收集邻居信息,再与自身信息结合,形成新的表示;多层传播后,表示中逐渐包含更大范围的结构和属性信息;最后,这些表示被用于分类、预测、聚类或推荐。
记住这一句话就够了:
GNN 让每个节点在认识自己的同时,也通过邻居理解自己所处的关系网络。