第34回 图上的推理——图神经网络基础
邻里消息层层递,一步传来万步知。
不靠天眼看全局,只把周边揉成诗。
第33回我们把图压进空间:每个点有一个向量,关系有一套几何。
但那套向量多半是“静态”的:训练完就定了。
可现实图谱里,点的含义常常来自“邻居是谁”:
- 一个人是不是医生,看他和哪些医院、科室、论文连着
- 一个公司是不是供应商,看它和哪些订单、合同、产品连着
于是图神经网络(GNN)登场。
它的核心只有一句话:
每个节点把邻居的信息“聚合”进来,反复几层,就学会了结构语义。
在“LLM 时代的图学习”综述里,GNN 依旧是理解与利用图结构的基础积木——无论你是要把图送进 LLM,还是让 LLM 帮你改图。1
一、GNN 的骨法:消息传递(Message Passing)
把节点向量记作 hᵢ。
一层消息传递大致做三步:
- 收集邻居:N(i)
- 聚合邻居:把 {hⱼ | j∈N(i)} 合成一个向量
- 更新自己:把“自己 + 邻居摘要”揉成新的 hᵢ′
听着玄乎,其实很像班级学习小组:
- 你先听同桌怎么想
- 再听组里怎么想
- 你把这些想法消化成自己的新理解
叠两层,就相当于“听到邻居的邻居”;
叠三层,就能看更远的结构。
二、三种常见门派:GCN、GraphSAGE、GAT(直觉版)
不同门派的差别主要在“怎么聚合邻居”:
- GCN:像“平均分”——邻居都算一份(但会做归一化)
- GraphSAGE:像“抽样+总结”——邻居太多就抽一些再聚合
- GAT:像“加权投票”——给不同邻居不同注意力权重
看官不必急着背公式,
你只要记住:
聚合器决定你学到的是“平均观点”还是“重点观点”。
三、极简可跑代码:一层“邻居平均”的消息传递
下面代码实现一个最小的“GCN 风格一层更新”:
- 每个节点有一个初始向量
- 每个节点把邻居向量取平均,再与自己相加
- 得到新的节点向量
import random
def mean(vs):
if not vs:
return None
d = len(vs[0])
out = [0.0] * d
for v in vs:
for i, x in enumerate(v):
out[i] += x
return [x / len(vs) for x in out]
def add(a, b):
return [x + y for x, y in zip(a, b)]
def rand_vec(d, seed):
rnd = random.Random(seed)
return [rnd.uniform(-1.0, 1.0) for _ in range(d)]
if __name__ == "__main__":
nodes = ["张三", "清华", "北京", "中国"]
edges = {
"张三": ["清华"],
"清华": ["北京"],
"北京": ["中国"],
"中国": [],
}
h = {u: rand_vec(4, i + 1) for i, u in enumerate(nodes)}
print("h0[张三] =", [round(x, 3) for x in h["张三"]])
h1 = {}
for u in nodes:
neigh = [h[v] for v in edges[u]]
m = mean(neigh)
h1[u] = add(h[u], m) if m is not None else h[u]
print("h1[张三] =", [round(x, 3) for x in h1["张三"]])
print("h1[清华] =", [round(x, 3) for x in h1["清华"]])
你会看到:
- “清华”的新向量被“北京”的信息拉动
- “张三”的新向量被“清华”的信息拉动
这就是消息传递的最小直觉:
图结构决定了信息怎么流动。
四、GNN 与知识图谱、GraphRAG 的关系
把第30–34回串起来看:
- 第30回:图的语言(点边与走路)
- 第33回:图的几何(嵌入与相似)
- 第34回:图的信息流(邻居聚合与结构学习)
在 GraphRAG 里,GNN 常见的用法是:
- 帮你做更聪明的子图检索(不只按 k-hop,还按“结构语义相关”)
- 帮你做子图重排(把候选路径/候选社区排序)
- 帮你做实体/关系表示,提升对齐与消歧质量
你会发现:
GNN 不是取代检索,而是给检索一把更好的“结构启发式”。
五、小结:图神经网络是“让图自己会说话”
这回你记住三句话就够:
- GNN 的本质是消息传递
- 不同门派差在聚合器
- 叠层数=看多远的邻域
下一回(第35回)我们把本篇主线推到 2024–2026 的前沿:
LLM 与图的协同——
- 把图喂给 LLM(图线性化、伪代码提示)
- 让 LLM 帮你改图(补边、去噪、构图)
欲知后事如何,且听下回分解。
幻觉核查
- “GNN 仍是 LLM-Graph 结合的基础积木”这类归纳:可核对相关综述对融合范式的分类(如 GNNs as Prefix 等)。1
- 本回对 GCN/GraphSAGE/GAT 的描述为高二直觉版,精确定义以原论文为准。
- 本回代码是教学玩具:仅展示一层邻居平均更新,不包含权重矩阵、非线性、归一化、自环与训练目标。
逻辑审计
- 与第33回衔接:第33回给点一个向量,第34回让向量随邻居更新。
- 与导读一致:导读强调“慢思考=多步迭代”,GNN 的层叠本质就是“多步信息整合”。
- 为第35回铺路:理解了消息传递,才看得懂“把图结构注入 LLM”的各种融合招式。
引用与溯源
Footnotes
-
Ren, X., et al. A Survey of Large Language Models for Graphs arXiv:2405.08011 (v3: 2024-09-11) https://arxiv.org/abs/2405.08011 ↩ ↩2