第33回 图上的推理——知识图谱嵌入

路标不只写在纸,还可刻进几何中。
点与边若能成坐标,走到哪都算得通。

第32回我们在图上走路:k-hop、路径、子图。
可图一大,光靠走路会遇到两类难题:

  • 图太大:走路要扩得很远才碰到答案
  • 图太稀:你要找的边根本没写出来,但“按常识”它应该存在

于是江湖里出现一门武功:把图压进向量空间
这就是知识图谱嵌入(Knowledge Graph Embedding, KGE)。

一句话说透:

让实体与关系都变成向量(或复数/旋转),用“几何打分”判断三元组像不像真的。

KGE 的系统性综述从“表示空间”角度总结了各种套路:空间选得不同,能表达的关系结构也不同。1


一、为什么要嵌入:为了“泛化”与“可计算”

图谱是离散的:有边就有,没有就没有。
可现实知识永远不完备。

嵌入的目标有两条:

  1. 链接预测(补边):猜测(h, r, t)是否可能成立
  2. 相似度与聚类:找相近实体、相近关系

你可以把它理解为“从死记硬背”走向“举一反三”。


二、TransE:最朴素的几何直觉——关系像“平移”

TransE 的想法像初中几何:

  • 实体是点:向量 h、t
  • 关系是箭头:向量 r
  • 如果(h, r, t)是真的,就希望:h + r ≈ t

所以它用一个距离来打分:

  • 距离越小,越像真三元组
  • 距离越大,越像假三元组

这门功夫简单、直觉强,但也有短板:
它对“一对多、多对一、复杂对称/反对称关系”不够灵活。


三、RotatE / ComplEx:关系不只会平移,还会“旋转”

为了解决复杂关系结构,后来的方法把表示空间升级:

  • ComplEx:把实体与关系放在复数空间,用复数乘法表达更丰富的匹配模式
  • RotatE:把关系理解为“在复数平面上旋转”,对对称、反对称、组合关系更自然

你不需要现在就会复数乘法推导,
只要抓住直觉:
换一种空间,就换一套几何规则;规则更丰富,能表达的关系也更丰富。


四、极简可跑代码:用 TransE 打分“像不像真”

下面代码是一个最小的 TransE 演示:

  • 每个实体、关系都是一个小向量
  • 对一个三元组算 score(距离)
  • score 小表示更可信
import random
import math


def l2(a, b):
    return math.sqrt(sum((x - y) ** 2 for x, y in zip(a, b)))


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)]


def transe_score(h, r, t):
    return l2(add(h, r), t)


if __name__ == "__main__":
    d = 4
    ent = {
        "张三": rand_vec(d, 1),
        "清华": rand_vec(d, 2),
        "北京": rand_vec(d, 3),
    }
    rel = {
        "就读于": rand_vec(d, 10),
        "位于": rand_vec(d, 11),
    }

    triples = [
        ("张三", "就读于", "清华"),
        ("清华", "位于", "北京"),
    ]

    for h, r, t in triples:
        s = transe_score(ent[h], rel[r], ent[t])
        print((h, r, t), "score=", round(s, 4))

这段代码没有训练,只是示意“打分函数”长什么样。
真训练时要做的事是:

  • 让真三元组 score 变小
  • 让假三元组 score 变大

你会发现它与第二篇强化学习的味道很像:
都是在用一个目标,把系统推向“更像真的”那一边。


五、嵌入与 GraphRAG 的关系:一手走路,一手算相似

GraphRAG 有两种检索味道:

  • 走路:BFS、路径、社区发现
  • 算相似:在嵌入空间找近邻、做重排、做补边

当图很大、关系很稀时,嵌入能帮你:

  • 先用嵌入找一小片“可能相关的子图”
  • 再在子图上做走路与证据链构造

这就是“几何与结构”的双刀合璧。


六、小结:把图压进空间,是为了让推理会“泛化”

你现在有两套推理工具:

  • 离散推理:沿边走路,路径可解释(第30、32回)
  • 连续推理:在空间里算相似,能补边泛化(第33回)

下一回(第34回)我们更进一步:
不只给每个点一个向量,还让点之间“传话”,一层层聚合邻居信息——
图神经网络登场。

欲知后事如何,且听下回分解。


幻觉核查

  • KGE 的“表示空间视角”分类:可核对综述对不同空间与模型家族的总结。1
  • 本回对 TransE/ComplEx/RotatE 的直觉描述为教学化抽象,细节以原论文与综述为准。
  • 本回代码仅示意 TransE 的打分函数形态,不包含训练与负采样等关键工程细节。

逻辑审计

  • 与第32回衔接:第32回强调“沿图取证”,第33回强调“在空间里找可能的边与邻居”,两者互补。
  • 与导读一致:导读主线是“慢思考=搜索”,嵌入提供的是“搜索的启发式”(先猜哪里更像)。
  • 为第34回铺路:KGE 给每个点一个静态向量,GNN 则让向量随邻居信息更新,适合更复杂的图任务。

引用与溯源

Footnotes

  1. Cao, J., et al. Knowledge Graph Embedding: A Survey from the Perspective of Representation Spaces arXiv:2211.03536 (v2: 2023-10-15; published as ACM Computing Surveys 2024) https://arxiv.org/abs/2211.03536 2