图神经网络是一类直接以图结构数据为输入的深度学习模型,它能够捕捉节点之间复杂的连接关系,从而完成节点分类、链接预测、图分类等任务。传统的卷积网络或全连接网络擅长处理欧式空间数据,例如图像像素网格或文本序列,但面对社交网络、分子结构和知识图谱这类非欧式数据时就显得力不从心。图神经网络通过消息传递机制,让每个节点不断聚合邻居信息来更新自身表示,从根本上解决了结构信息难以利用的问题。

要理解图神经网络,首先得弄清楚什么是图结构数据。在数学上,图通常由节点集合和边集合组成,节点代表实体,边代表实体之间的关系。比如在一个微信社交图中,每个用户是一个节点,好友关系就是一条无向边;在化学反应式中,原子是节点,化学键是边并且可能有方向或者类型区分。除了拓扑连接,节点和边往往还带有特征,例如用户年龄、帖子内容,或者原子的元素种类和键能。这些特征会和图的结构一起送进模型。
为什么普通深度学习模型处理不了这样的数据?核心难点在于图没有固定的排列顺序,同一个图如果把节点编号打乱,它表达的关系完全不变,但矩阵形式却不同。如果直接用全连接层,模型会把节点编号当作信号,学到无意义的东西。图神经网络采用的方法是:不关心节点叫什么编号,只关心它和谁相连。这种置换不变性让模型在图数据上具备泛化能力,也是它和普通网络最本质的区别。
消息传递:GNN的核心机制
目前主流的图神经网络都建立在消息传递神经网络框架之上。每一层网络里,节点会做三件事:先从邻居收集信息,也叫聚合;再把收集到的信息和自己原来的特征做组合;最后经过一个变换和激活函数得到新的节点表示。这个过程可以想象成开会:每个人先听周围人发言,再结合自己原本的想法,形成新一轮观点。随着层数增加,一个节点能间接接收到更远邻居的消息,就像八卦传了三度人脉。
具体公式上,第l+1层节点v的表示等于对邻居u在l层的表示做某种求和或均值,再乘上权重矩阵并经过ReLU之类的非线性函数。聚合方式有很多种,最简单的图卷积网络GCN采用对称归一化的邻居均值,而GraphSAGE则先采样固定数量邻居再做拼接,GAT则引入注意力分数决定哪个邻居更重要。选择哪种聚合,往往要看图是否稀疏、是否有权重以及计算资源是否充足。
常见GNN模型对比
下面用一张表列出三种入门常遇到的图神经网络模型,方便你建立直观认识。它们都遵循消息传递思想,但在聚合和采样策略上有明显差异。
| 模型名称 | 聚合方式 | 是否采样 | 适用场景 |
|---|---|---|---|
| GCN | 归一化邻居均值 | 否 | 小规模全图训练 |
| GraphSAGE | 采样后拼接或均值 | 是 | 大规模工业图 |
| GAT | 注意力加权求和 | 否 | 邻居重要性差异大 |
GCN最为简洁,它把图结构直接变成固定的归一化邻接矩阵,训练时整个图一次性送进显存,因此只适合几千到几万节点的图。GraphSAGE为了应对淘宝级别的用户图,设计了邻居采样,每次只随机抽若干邻居做聚合,使内存占用可控。GAT则在聚合时学习每个邻居的权重,能自动忽略噪声连接,但计算量随邻居数平方增长,在稠密图上要谨慎使用。
训练时的关键问题
新手在跑通第一个GNN代码时,经常会遇到过度平滑现象。所谓过度平滑,是指网络层数堆到四五层以后,所有节点的表示变得几乎一样,分类准确率不升反降。原因在于每聚合一次,节点特征就被邻居平均一次,多层之后大家的信息来源趋同。缓解办法包括控制层数、加入残差连接,或者使用允许跳过连接的模型如APPNP。
另一个容易忽略的点是边和节点的特征缺失。很多公开数据集只给了连接,没给节点属性,这时可以用独热编号或者度作为初始特征,也可以通过DeepWalk之类的方法先无监督生成节点向量。如果边有类型,例如转账和聊天是两种边,就要使用异构图神经网络,把不同边分开处理,否则模型会把诈骗交易和正常交谈混为一谈。
入门学习路线建议
如果你准备动手实践,建议先安装PyTorch Geometric或者DGL这类成熟库,它们已经实现了上面提到的模型。第一步可以用Cora引文数据集,它只有两千多篇论文、五千多条引用边,十行代码就能训一个GCN。先观察训练集和验证集准确率曲线,再试着把层数改成三层和一层,体会过度平滑。
之后可以找一份中等规模图,例如某电商用户行为子集,用GraphSAGE做节点分类,重点理解采样大小对结果的影响。最后再读原始论文,弄懂公式里归一化系数从哪里来。整个过程不必死磕数学推导,多画图、多打印中间张量形状,就能建立稳固直觉。当你能用图神经网络从关系里挖出普通模型看不到的信号时,入门就算真正完成了。