第一章 图神经网络基础回顾

各位同学,咱们开始上课。

图神经网络,简称GNN。说实话,这玩意儿刚火起来的时候,我还在做传统的推荐系统。那时候总觉得图数据离自己很远,直到有一次处理社交网络数据,发现用户之间的关系根本没法用表格表示——嗯,从那以后我就彻底入了GNN的坑。

这一章,咱们把基础打牢。我会带着大家回顾三个核心问题:图数据怎么表示、消息怎么传递、以及三种主流模型到底有啥区别。别嫌基础,我见过太多调参调得飞起、但连消息传递方向都搞反的同学。

1.1 图数据表示:从邻接矩阵到特征矩阵

图数据,说白了就是「节点+边」。节点是实体,边是关系。

举个例子,一个社交网络里,用户是节点,好友关系是边。一个分子结构里,原子是节点,化学键是边。你想想看,是不是所有图都能拆成这两样东西?

那计算机怎么理解图呢?两个矩阵搞定:

  • 邻接矩阵 A:表示节点之间有没有边。A[i][j]=1 表示节点 i 和 j 相连。
  • 特征矩阵 X:表示每个节点自己的属性。比如用户的年龄、性别、兴趣标签。

核心公式:图 = (X, A)

X 是 N×F 矩阵,N 是节点数,F 是特征维度。

A 是 N×N 矩阵,通常是对称的(无向图)。

我个人习惯,拿到一个图数据集,第一件事就是检查 A 矩阵是不是稀疏的。为什么呢?因为真实世界的图,大部分节点只跟少数节点相连。如果 A 是稠密的,那八成是数据有问题。

小技巧:用 scipy.sparse 存储邻接矩阵,能省下 90% 的内存。我在处理百万节点级别的图时,这个习惯救了我好几次。

1.2 消息传递机制:GNN 的灵魂

图神经网络为什么能工作?核心就四个字:消息传递

每个节点,先看看自己的邻居都有谁。然后从邻居那里「收集」信息,再「聚合」起来,最后「更新」自己的表示。这个过程,跟人类社交很像——你朋友的观点会影响你,对吧?

消息传递的通用公式长这样:

h_v^(k+1) = UPDATE( h_v^(k), AGGREGATE( { h_u^(k) for u in N(v) } ) )

解释一下:

  • h_v^(k) 是节点 v 在第 k 层的表示
  • N(v) 是节点 v 的所有邻居
  • AGGREGATE 是聚合函数,比如求和、平均、取最大值
  • UPDATE 是更新函数,通常是一个神经网络层

我曾经犯过一个低级错误:在聚合时忘了考虑节点自身的信息。结果模型训练出来,每个节点都只看到邻居,看不到自己。嗯,这就像你只听朋友的意见,完全忽略自己的想法——肯定出问题。

避坑指南:消息传递时,一定要加上自环(self-loop)。也就是把节点自身也当作邻居之一。GCN 里默认会做这件事,但如果你自己实现消息传递,千万别漏了。

为什么会这样?因为如果没有自环,节点在第 k 层的表示只依赖于邻居在第 k-1 层的表示,自己的历史信息就丢了。这会导致梯度消失,深层网络根本训不动。

1.3 GCN / GAT / GIN 核心原理对比

好,基础打完了。咱们来看看三种最主流的模型。我按时间顺序讲,这样你能理解 GNN 的进化脉络。

1.3.1 GCN:图卷积网络

GCN 是开山之作。它的思路很简单:把邻居的特征做个加权平均,然后过一层线性变换。

公式:

h_v^(k+1) = σ( W * ( Σ ( A_hat * h_u^(k) ) ) )

其中 A_hat 是归一化后的邻接矩阵。为什么要归一化?因为如果不归一化,度数大的节点(朋友多的人)特征值会特别大,度数小的节点(朋友少的人)特征值会特别小。这不公平。

GCN 的缺点也很明显:所有邻居的权重是一样的。你想想看,在社交网络里,你最好的朋友和普通朋友,对你的影响能一样吗?GCN 说:一样。这显然不合理。

模型 聚合方式 邻居权重 表达能力
GCN 加权平均 固定(由度数决定) 中等
GAT 加权平均 可学习(注意力机制) 较高
GIN 求和 可学习(MLP) 最高(理论上)

1.3.2 GAT:图注意力网络

GAT 解决了 GCN 的痛点。它引入了一个注意力机制,让模型自己学习每个邻居的重要性。

公式:

α_ij = softmax( LeakyReLU( a^T [ W h_i || W h_j ] ) )
h_i' = σ( Σ α_ij * W h_j )

这里 α_ij 就是节点 i 对节点 j 的注意力系数。说白了,就是模型自己判断:谁更重要,谁就多听谁的。

我个人特别喜欢 GAT 的一点是,它支持多头注意力。你可以用多个「头」同时计算注意力,然后拼接起来。这就像你同时问好几个朋友的意见,综合判断——结果通常更稳健。

实战经验:我在做蛋白质相互作用预测时,GAT 比 GCN 提升了将近 8 个点的准确率。原因很简单:蛋白质之间的相互作用强度差异很大,GAT 能自动捕捉这种差异。

1.3.3 GIN:图同构网络

GIN 是理论派的最爱。它要解决一个根本问题:GNN 的表达能力到底有多强?

结论是:GCN 和 GAT 的表达能力,最多跟 1-WL 图同构测试一样强。而 GIN 可以达到这个上限。

GIN 的核心改动有两个:

  • 用求和代替平均或最大池化
  • 用 MLP 代替简单的线性变换

公式:

h_v^(k+1) = MLP( (1+ε) * h_v^(k) + Σ h_u^(k) )

这里的 ε 是一个可学习的参数,或者固定为 0。我建议你把它设成可学习的,因为这样模型能自己决定「自身信息」和「邻居信息」的比例。

注意:GIN 虽然理论上表达能力最强,但实际训练时收敛速度比 GCN 和 GAT 慢。我在分子性质预测任务上试过,GIN 需要多训练 30% 的 epoch 才能达到同样的效果。所以别盲目追求理论最优,要看具体场景。

1.4 本章知识体系总览

下面这张图,是我自己画的。它把这一章的核心逻辑串起来了。你保存好,后面调参的时候随时回来对照。

图神经网络基础回顾 · 知识体系 图数据表示 邻接矩阵 A 特征矩阵 X 图 = (X, A) 消息传递机制 收集邻居信息 聚合(求和/平均) 更新(MLP/线性) 加入自环(重要!) GCN / GAT / GIN 对比 从数据表示 → 消息传递 → 模型选择,层层递进

这张图里,从上到下就是咱们的学习路径。先搞清楚图数据怎么表示,再理解消息传递怎么运作,最后对比三种模型各自的特点。每一步都是下一步的基础。

好了,第一章的内容就到这里。记住:图数据表示是地基,消息传递是框架,模型选择是装修。地基没打好,后面调参再努力也白搭。

下一章,咱们开始动手调参。我会带着大家从学习率、隐藏层维度这些最基础的参数开始,一步步把模型调出最佳效果。


专注资料整理