3、三元组与嵌入空间的概念归纳总结
好,到了第三章。前两章我们把知识图谱和TransE的来龙去脉捋了一遍,你觉得“嗯,大概知道是干什么的了”。但真正上手写代码之前,有几个底层概念必须掰开揉碎讲清楚——三元组和嵌入空间。这俩是TransE的根基,搞不懂它们,后面看公式两眼一抹黑。
我个人习惯在学任何模型前,先把“数据长什么样”、“数据要变成什么样子”想清楚。说白了,三元组就是知识图谱的原子单位;嵌入空间就是我们要把原子单位翻译过去的目标世界。今天我们就干一件事:把这两块彻底整明白。
3.1 三元组:知识图谱的最小单元
你在建药物知识图谱时,会看到类似下面这些事实:
- 阿司匹林(head)→ 治疗(relation)→ 头痛(tail)
- 二甲双胍(head)→ 靶向(relation)→ AMPK(tail)
- 头痛(head)→ 表现症状(relation)→ 持续性钝痛(tail)
每个事实就是一个三元组(triple)。符号上我们记作 (h, r, t),其中h是头实体,r是关系,t是尾实体。注意,这里的“头”和“尾”只是方向标记,不代表优先级。嗯,这里要注意:关系是有向的。比如“治疗”这个关系从药物指向疾病,反过来一般不成立(疾病不能治疗药物)。
我在项目中遇到过有人把关系理解成无向边,结果模型怎么训都不收敛。后来排查发现,框架里默认关系是有向的,但原始数据里关系写反了。所以方向性是三元组的第一条铁律。
| 三元组元素 | 含义 | 药物KG示例 |
|---|---|---|
| head (h) | 头实体 | 阿司匹林、二甲双胍 |
| relation (r) | 关系 | 治疗、靶向、副作用 |
| tail (t) | 尾实体 | 头痛、AMPK、胃出血 |
你想想看,药物知识图谱里动辄几十万条三元组,但它们本质上都服从同一个模式:(实体 A) — 关系 R → (实体 B)。这就是TransE要喂进去的“食材”。
3.2 嵌入空间:把符号变成向量
三元组是符号化的——阿司匹林是个字符串,治疗也是个字符串。计算机没法直接理解“阿司匹林”和“头痛”之间那层语义。怎么办?把它们映射到低维连续向量空间里。这个空间我们叫嵌入空间(embedding space)。
举个例子,假设嵌入维度是100,那么每个实体用一个100维的浮点数向量表示,每个关系也用100维的向量表示。这就好比给每个概念发了一张身份证,身份证号码不是数字,而是一串有几何含义的坐标。
嵌入空间有几个关键特性:
- 低维:通常50~200维,远小于实体总数(几万到几百万)。这迫使模型把语义浓缩到紧凑表示里。
- 连续:向量分量是浮点数,可以做加减法和距离计算。这才是TransE能工作的前提。
- 语义对齐:在好的嵌入空间里,语义相近的实体向量距离近,关系向量代表“一种平移操作”。
核心要点:Embedding space is where symbols become vectors, and relationships become arithmetic operations.
(嵌入空间就是把符号变成向量、把关系变成算术运算的地方。)
3.3 TransE的核心假设:h + r ≈ t
现在我们把三元组和嵌入空间串起来。TransE做了一个极其大胆的假设:
如果三元组 (h, r, t) 为真,则 h 的嵌入向量 + r 的嵌入向量 ≈ t 的嵌入向量
换句话说,头实体顺着关系方向平移一下,就应该落到尾实体附近。这个假设简洁到令人怀疑——但它确实有效。我记得第一次看到这个公式时还嘀咕:“就这?能行?”后来在药物相互作用预测任务上跑出来的结果,AUC直接干到0.85以上。嗯,简单就是美。
那么问题来了:怎么度量“≈”?我们通常用距离函数,比如L1或L2范数:
f(h, r, t) = || h + r - t ||²₂
如果 f 很小,说明三元组成立;
如果 f 很大,说明假三元组。
训练过程就是不断调整所有h、r、t的向量,让真的三元组距离小,假的三元组距离大。
⚠️ 曾经有学员问我:“为什么不用余弦相似度?”注意,TransE用的是平移假设,核心是向量加法后的差值,而不是方向对齐。余弦相似度更适合文本语义相似,但在这里会丢失平移的尺度信息。
3.4 概念关系图:三元组 → 嵌入空间 → 距离计算
为了让你一眼看清这三块怎么咬合的,我画了张图。它展示了从原始三元组到嵌入空间再到判断是否成立的完整链路。
3.5 一个实例带你看懂全部
假设我们有下面这个三元组:
- head = 阿司匹林(已嵌入为向量 h)
- relation = 治疗(已嵌入为向量 r)
- tail = 头痛(已嵌入为向量 t)
如果这个三元组是真事实,那么理想情况是:
h + r ≈ t
# 比如(简化示意)
h = [0.2, -0.5, 0.8]
r = [0.3, 0.1, -0.2]
t = [0.5, -0.4, 0.6] # 注意:h+r = [0.5, -0.4, 0.6],正好等于t
但如果换成假三元组(比如“阿司匹林→治疗→胃炎”),模型会给它算出一个大分数,比如 ||h+r-t||² = 5.7,从而判定为假。
实战小技巧:刚开始调模型时,可以随机挑几个已知的真三元组,手动打印出 h+r 和 t 的向量差。如果差向量的范数比假三元组小一个数量级,说明训练正常。我曾靠这个trick揪出过一个bug——原来实体ID和向量初始化顺序没对齐,导致所有“真”三元组的分数都乱蹦。
3.6 总结:这个章节你该记住什么
- 三元组 (h, r, t) 是知识图谱的数据根基,每个事实都是一个有向符号表达式。
- 嵌入空间 是把符号变成向量的桥梁,维度由你设定(一般50~200),所有实体和关系共享这个空间。
- TransE的核心假设:h + r ≈ t。这不只是一个公式,它背后是“关系是一种平移操作”的哲学。
- 判断真假的评分函数 f = ||h + r - t||² 越小越好。