第34回 图上的推理——图神经网络基础

邻里消息层层递,一步传来万步知。
不靠天眼看全局,只把周边揉成诗。

第33回我们把图压进空间:每个点有一个向量,关系有一套几何。
但那套向量多半是“静态”的:训练完就定了。

可现实图谱里,点的含义常常来自“邻居是谁”:

  • 一个人是不是医生,看他和哪些医院、科室、论文连着
  • 一个公司是不是供应商,看它和哪些订单、合同、产品连着

于是图神经网络(GNN)登场。
它的核心只有一句话:

每个节点把邻居的信息“聚合”进来,反复几层,就学会了结构语义。

在“LLM 时代的图学习”综述里,GNN 依旧是理解与利用图结构的基础积木——无论你是要把图送进 LLM,还是让 LLM 帮你改图。1


一、GNN 的骨法:消息传递(Message Passing)

把节点向量记作 hᵢ。
一层消息传递大致做三步:

  1. 收集邻居:N(i)
  2. 聚合邻居:把 {hⱼ | j∈N(i)} 合成一个向量
  3. 更新自己:把“自己 + 邻居摘要”揉成新的 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

  1. 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