想象你翻出一本落满灰尘的家族相册。相册里贴着几十张泛黄的照片,每张照片下还用手写标签标着关系:“王大明是王小明他爸”“王小明是王小美他哥”。可惜相册被虫蛀了,不少照片被撕掉、标签也模糊了——你只知道“王大明”和某张照片有关系,却不知道具体是什么关系。要还原这本相册的全貌,只能靠已有的照片和标签去推断缺失的部分。 知识图谱补全(Knowledge Graph Completion)做的正是这件事:把现实世界里的“照片”称为实体(entity),把“标签”称为关系(relation),一张完整的“照片—标签—照片”组合叫做三元组(triple)。当三元组缺失了一角——比如缺了尾实体、头实体甚至整条关系——补全算法就像一位细心的家谱整理员,借助图中已有的大量三元组,推算出最可能被补上的那一块。无论是社交软件的好友推荐、药物研发中的新靶点发现,还是智能问答中的关系推理,背后都有这位“整理员”的身影。

岗位关联

学会知识图谱补全,你将掌握链接预测、嵌入表示、负采样与评估指标等一整套“配方”,能够为知识库自动补缺、挖掘新关系,是知识工程与推荐系统方向面试与实战的硬核技能。

目录
  1. 可视化演示
  2. 相册里的照片、标签与关系卡片(图谱基础知识)
  3. 找出缺失的关系卡片(链路预测任务)
  4. 把人物摆进“家庭坐标系”(嵌入表示方法)
  5. 用尺子量关系的可信度(相似度评分)
  6. 别让模型“乱认亲戚”(负采样策略)
  7. 如何验收补全的族谱(评估指标体系)
  8. 从零到一搭建补全流水线(训练流程蓝图)
  9. 补全的族谱能做什么事(实战应用场景)
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

展示知识图谱三元组补全、TransE链接预测嵌入空间、负采样训练数据构造,理解缺失关系预测的核心机制。

本节配有交互动效(进入视口后自动加载,约 3KB)。

知识图谱三元组补全 (头实体,关系,尾实体)三元组存储知识 缺失尾实体通过链接预测补全 (h, r, ?) → predict t 自动发现和填充缺失关联

相册里的照片、标签与关系卡片(图谱基础知识)

翻开那本家族相册,每一张照片上是一个活生生的人——在知识图谱的世界里,这些人叫实体(Entity),比如“王大明”“王小明”“北京”;照片之间的手写标签,比如“父子”“居住于”“出生于”,叫作关系(Relation)。一张完整的“照片—标签—照片”组合(“王大明—父子—王小明”)就是三元组(Triple),它是相册最小的装订单元,也是知识图谱最基本的存储单位。

机器并不认识照片里的人脸,它认识的是关系卡片集合。我们把相册中所有三元组装订成一本大书,记作图谱 \(G\)。补全算法的全部素材都来自这里面:哪些人已经通过什么关系连在一起、哪些关系尚未浮现。你可以把每个三元组想成一张“被虫蛀过的卡片”,卡片上可能缺失了左边的人、右边的标签,或最右边的照片——补全任务的第一步,就是先厘清这本相册的“馆藏清单”。

相册里的每一张卡片都不是孤岛。家人之间的血缘像蛛网一样交织,知识图谱同样如此:一个实体往往通过多条关系卡片与许多其他实体相连。理解这份“馆藏清单”,是后续一切推断的地基。

G={(h,r,t)∣h∈E, t∈E, r∈R}G = \{(h, r, t) \mid h \in E,\ t \in E,\ r \in R\}
图谱 G 是所有合法关系卡片的集合:h 和 t 来自实体集合 E,r 来自关系集合 R。
  1. 集合符号 G整个知识图谱就是一张装订好的“关系卡片集”,用花括号把所有卡片框在一起。
    G={…}\mathrm{G} = \{ \ldots \}
  2. 三元组 (h, r, t)一张完整的关系卡片由三部分组成,顺序固定:头实体(照片 A)、关系(标签)、尾实体(照片 B)。
    (h,r,t)(h, r, t)
  3. 集合约束条件头实体 h 和尾实体 t 必须在实体集合 E 中,关系 r 必须在关系集合 R 中,相当于“相册里的人名都得在人物名单里找得到”。
    h∈E, t∈E, r∈Rh \in E,\ t \in E,\ r \in R

找出缺失的关系卡片(链路预测任务)

相册翻到最后一页,你发现一行潦草的批注:“王大明的父亲是谁?待考证。”这正是图谱补全的核心场景:链路预测(Link Prediction)。某张关系卡片缺失了一角,可能是缺头实体、缺尾实体,甚至整根关系标签都模糊了。算法要做的,是看着其他完好的卡片,推测这个“待考证”的位置最可能填上谁。

链路预测任务通常分三类:尾实体预测(给定头和关系,猜尾巴)、头实体预测(给定关系和尾,猜头)、关系预测(给定头尾,猜关系)。其中尾实体预测最常见,因为它在推荐系统里可以直接转化为“给用户猜下一个喜欢的商品”。算法并不直接输出一个答案,而是给候选实体逐一打分排序,把最像的一个推到榜首。

补全的价值不止于修复相册,更在于“从旧关系中发现新关系”。比如由“王大明是王小明父亲”与“王小明是王小美哥哥”,可以推断“王大明也是王小美的父亲”——这些新推断会源源不断地丰富图谱,让它从一本残破相册升级为完整的家族史。

t∗=arg⁡max⁡t′∈E Score(h,r,t′)t^{*} = \arg\max_{t' \in E} \ \mathrm{Score}(h, r, t')
在全部候选实体中,找出让打分函数最满意的那一个,就把它当作缺失的尾实体。
  1. 最优答案 t\*带星号的上标表示“我们最终选中的那个人”,就像家谱整理员最终落笔填上的名字。
    t∗t^{*}
  2. arg max 的含义“从所有候选人里挑出分数最高的那一位”——不是输出分数本身,而是输出分数最高者的名字。
    arg⁡max⁡t′∈E\arg\max_{t' \in E}
  3. 打分函数 Score(h, r, t')对任意一个候选实体 t',用打分函数衡量它与“头实体 + 关系”的契合程度,得分越高越像正确答案。
    Score(h,r,t′)\mathrm{Score}(h, r, t')

把人物摆进“家庭坐标系”(嵌入表示方法)

现在问题来了:机器如何比较“王大明—父子—王小明”和“王大明—父子—李四”哪个更像真的?一个巧妙的思路是:像摆棋子一样,把每个实体映射到向量空间中的一个坐标点,每个关系映射成一个“移动向量”。这就是嵌入表示(Embedding)——用一串数字(向量)给每个实体和关系“定位”。

TransE 是这类方法中最简单也最经典的一个。它的核心假设只有一句话:头实体向量加上关系向量,应该约等于尾实体向量。翻译成家族相册的语言:从“王大明”的坐标出发,沿着“父子关系”这个固定的方向迈出一步,走到的位置应该恰好是“王小明”的坐标。就像你在城市里从家(h)出发,沿着“去学校”的方向(r)走固定的一段路,终点(t)就该是学校。

这套“家庭坐标系”有个妙处:一旦所有实体和关系都被摆到合适的位置,相似的人会自然聚在一起,相似的关系会共享方向。于是,补齐相册缺失卡片这个难题,就转化成一道直觉的几何题——走完关系向量那一步,看哪个棋子落在终点附近。

h+r≈t\mathbf{h} + \mathbf{r} \approx \mathbf{t}
头实体向量和关系向量相加,结果落在尾实体向量附近。越接近,说明这条关系越可信。
  1. 粗体符号 h, r, t带粗体的变量表示“向量”,也就是一串坐标数字,比如王大明在坐标系里的位置 (3, 5)。
    h,r,t\mathbf{h}, \mathbf{r}, \mathbf{t}
  2. 加法运算向量加法就像“按方向走一段路”,从 h 的位置出发,沿着 r 的方向和长度移动。
    h+r\mathbf{h} + \mathbf{r}
  3. 约等于号理想情况下两者完全相等,但由于现实关系复杂,只要求非常接近即可。
    ≈t\approx \mathbf{t}

用尺子量关系的可信度(相似度评分)

有了坐标系,还需要一把“尺子”来精确测量“接近”的程度。这把尺子就是打分函数(Scoring Function)。TransE 的打分函数写为 \(f_r(h, t)\),它计算的是“从头实体出发、沿关系向量走一步后”,偏离尾实体坐标有多远。偏离越少,得分越低,这条三元组就越可信——注意,这里的分数是“距离”,距离越小越好。

尺子有两种常见刻度:L1 距离(曼哈顿距离)把坐标差的绝对值相加,像在棋盘上只能横竖走;L2 距离(欧氏距离)计算直线距离,像两点间飞行的路径。无论用哪种,本质都是衡量“平移后是否精准落地”。预测时,把候选实体的坐标逐一放入公式求距离,按距离从小到大排序,排在最前面的就是最可能的答案。

有了尺子,原本见仁见智的“像不像亲戚”变成了精确的数值比较。整理员只需量出所有候选人与“平移落点”的距离,最短的那个落笔填上即可。打分函数是整个补全模型的心脏,后面的训练、评估、预测,全都围绕这把尺子展开。

fr(h,t)=∥h+r−t∥L1/L2f_r(h, t) = \lVert \mathbf{h} + \mathbf{r} - \mathbf{t} \rVert_{L1/L2}
打分等于平移后的位置与尾实体真实位置之间的距离。距离越小,说明这个三元组越像真实存在的卡片。
  1. 打分函数 f_r(h, t)给定头实体 h 和尾实体 t,在关系 r 下算出“可信度分数”。
    fr(h,t)f_r(h, t)
  2. 表达式 h + r − t先做向量加法得到“预测落点”,再减去尾实体坐标,得到“偏离向量”。
    h+r−t\mathbf{h} + \mathbf{r} - \mathbf{t}
  3. 双竖线范数把偏离向量压缩成一个非负数值,表示偏离的总量;下标 L1 或 L2 表示用哪种方式计算这个总量。
    ∥⋅∥L1/L2\lVert \cdot \rVert_{L1/L2}

别让模型“乱认亲戚”(负采样策略)

如果只给模型看真实的家族关系,它会很快学会懒惰的套路:把所有可能的组合都判成“一家人”。就像一个人只见过“父子”的正面例子,从没见过“陌生人”的例子,会把路边的陌生人当作亲爹。因此需要负采样(Negative Sampling)——主动制造一些“明显不是亲戚”的假卡片,让模型学会说“不”。

最经典的负采样方法是均匀随机替换:随机挑一个真实三元组,把它的头实体或尾实体替换成实体集合中任意一个其他实体。“王大明—父子—王小明”是正例,把它换成“王大明—父子—李四”就成了负例。替换时注意避开原实体,否则会生成一个正例造成混淆。更高级的困难负例策略则故意选那些“看着很像、其实不是”的替换对象,强迫模型学得更精细。

负采样让人想起“相亲踩坑”的智慧:光看理想对象不够,还得见过各种不合适的人才能珍惜对的人。模型在正例与负例的反复对比中,渐渐学会把真亲戚的卡片贴得紧密,把假亲戚的卡片推得远远的。

P((h′,r,t′)∣(h,r,t))=1∣E∣P((h', r, t') \mid (h, r, t)) = \frac{1}{|E|}
均匀采样时,每个实体被选为替换对象的概率是相等的,分母是实体总数。
  1. 条件概率符号竖线左边是生成的负例三元组,右边是原始正例——表示“在给定真实三元组的条件下,抽到某个假组合的概率”。
    P((h′,r,t′)∣(h,r,t))P((h', r, t') \mid (h, r, t))
  2. 等号右侧 1/|E||E| 是实体集合的大小,例如相册中有 100 人,那么随机抽到某一个人的概率就是 1/100。
    1∣E∣\frac{1}{|E|}
  3. 替换规则负例中的头尾实体至少有一个与正例不同,且替换后组合不能是图谱中已有的真实三元组。
    (h′,r,t′)≠(h,r,t)(h', r, t') \neq (h, r, t)

如何验收补全的族谱(评估指标体系)

族谱补完了,怎么知道补得准不准?整理员必须接受“家庭会议”的检验。最常用的两类验收指标,都基于一个朴素的实验:把每个真实三元组中要预测的实体遮住,让模型对所有候选实体排序,看正确答案排在第几位。

MRR(Mean Reciprocal Rank,平均倒数排名) 是所有测试样本“正确排名倒数”的平均值。正确答案排第 1,记 1 分;排第 2,记 1/2 分;排第 5,记 1/5 分。分数越高越好,满分是 1。Hits@K 则统计“正确答案排进前 K 名”的占比,比如 Hits@10 的含义是:“猜 10 次至少有一次把真正亲戚列进前十”的比例。还有一个直白的老指标 MR(Mean Rank),直接计算平均排名位置,数值越小越好。

家庭会议上,光看一个指标容易偏信。MRR 看重整体排名质量,Hits@K 看重“是否进短名单”,MR 则对极端坏排名极为敏感。三者结合,才能全面判断这份族谱是真靠谱还是偶尔蒙对。

MRR=1N∑i=1N1ranki\mathrm{MRR} = \frac{1}{N} \sum_{i=1}^{N} \frac{1}{\mathrm{rank}_i}
对 N 条测试卡片,算出每条正确实体的排名倒数,再取平均。MRR 越接近 1,补全效果越好。
  1. 求和符号与 1/N把 N 条测试样本的结果加在一起再除以 N,这是“取平均”的数学写法。
    1N∑i=1N\frac{1}{N} \sum_{i=1}^{N}
  2. 排名倒数 1/rank_i第 i 条样本中正确答案的排名取倒数,排名越靠前,这个值越大。
    1ranki\frac{1}{\mathrm{rank}_i}
  3. 整体含义MRR 关注“平均来看,正确答案排得有多靠前”;Hits@K 则关注“排进前 K 名的情况占多大比例”,两者搭配使用更全面。
    MRR∈[0,1]\mathrm{MRR} \in [0, 1]

从零到一搭建补全流水线(训练流程蓝图)

知道了原理与尺子,接下来就是整套流水线作业:把一本残缺相册训练成一位专业整理员。第一步是数据准备——把图谱中的三元组划分为训练集、验证集和测试集,训练集用于学习,验证集用于调参,测试集用于最终验收。第二步是负采样——为每个正例生成对应负例,组成训练对。第三步是定义损失函数,让模型明确“什么该学、什么该改”。

TransE 使用的损失叫铰链损失(Margin Loss):要求正例的距离至少比负例的距离小一个“安全间隔” \(\gamma\)。如果正例分数已经足够低、负例分数足够高,损失为零,模型不更新;否则按差距大小进行梯度修正。优化时用随机梯度下降,不断微调实体与关系向量,让正例的三元组距离变小、负例的距离变大,如同一遍遍向族谱整理员演示“这个对、那个错”,直到他形成肌肉记忆。

整套流水线就像办培训班:准备教材(数据)、布置反例(负采样)、设定及格线(margin)、反复测验(迭代优化)。当训练损失收敛,验证集指标不再上升,这份族谱补全系统就可以正式上岗了。

L=∑(h,r,t)∈Smax⁡(0, γ+fr(h,t)−fr(h′,t′))\mathcal{L} = \sum_{(h,r,t)\in S} \max\left(0,\ \gamma + f_r(h,t) - f_r(h',t')\right)
损失值 = 安全间隔 + 正例距离 − 负例距离,并把负数截断为 0。正例不够好或负例不够差时,模型就领到“作业”去更新参数。
  1. 累计求和对训练集 S 中的每一条真实三元组都计算一次损失,全部加起来作为这一轮的总体损失。
    ∑(h,r,t)∈S\sum_{(h,r,t)\in S}
  2. 括号内差值 \(\gamma + f_{pos} - f_{neg}\)正例距离加上安全间隔,再减去负例距离。若正例距离已经比负例小很多,整体会变成负数。
    γ+fr(h,t)−fr(h′,t′)\gamma + f_r(h,t) - f_r(h',t')
  3. max(0, ·) 截断负数统一按 0 处理,意思是“已经达标,不必再改”。铰链损失因此只惩罚不合格的样本。
    max⁡(0,⋅)\max(0, \cdot)

补全的族谱能做什么事(实战应用场景)

学完补全技术,这本家族相册的价值远不止“寻亲”。第一个最典型的落地场景是社交平台的好友推荐:把用户看作实体,“关注”“好友”“同学”看作关系,图谱补全能推断出“你可能认识的人”——这正是朋友圈里“可能认识的人”背后的逻辑。第二个场景是药物研发:把蛋白质、药物、疾病都建模为实体,关系建模为“抑制”“治疗”“相互作用”,补全算法可以在海量已知药品关系中发现新靶点,加速候选药物筛选。

第三个场景是智能问答与搜索引擎:当用户问“朗朗的老师是谁”时,系统先确定头实体“朗朗”、关系“老师”,再用链接预测找出最可能的尾实体,然后组织成自然语言回答。无论哪个场景,补全问题的数学形式都统一为“给定部分条件,给候选排序,取 TopK”。

从好友推荐到新药发现,“补全族谱”的思想一以贯之:世界是无数实体与关系的网络,而空缺之处,正是知识与价值诞生的地方。谁能把缺失的关系填得又准又快,谁就掌握了从数据中挖掘新知识的钥匙。

TopK(h,r)=top-Kt′∈E fr(h,t′)\mathrm{TopK}(h, r) = \mathrm{top}\text{-}K_{t' \in E}\ f_r(h, t')
给定头实体与关系,按打分函数从所有候选实体中挑出分数最高的前 K 个,作为推荐的答案列表。
  1. TopK 记号表示“返回前 K 名”的排名列表,K 是用户指定的数量,例如推荐 5 个好友就令 K=5。
    TopK(h,r)\mathrm{TopK}(h, r)
  2. 投影符号 top-K在候选实体集合上按打分函数值排序,取出排名最高的 K 个。
    top-Kt′∈E\mathrm{top}\text{-}K_{t' \in E}
  3. 排序依据 f_r(h, t')打分的标准依旧是平移距离——距离越小,越像真正的关联,越应该排进前 K。
    fr(h,t′)f_r(h, t')

AI 应用场景

社交平台:“可能认识的人”

阶段:链接预测与推荐排序

解决的问题:传统好友推荐依赖共同好友数或联系人导入,冷启动时效果差;利用图谱补全,把用户与兴趣、学校、公司等实体连成知识图谱,直接预测缺失的“好友”关系边,覆盖完全没交集但兴趣重合的用户。

具体案例:某社交 App 将 3 亿用户及其签到地点、点赞内容建模为图谱,训练 TransE 模型预测用户之间的“关注”关系,将好友推荐点击率提升了 23%。

药物研发:发现药物—靶点新关联

阶段:关系发现与候选排序

解决的问题:传统药物筛选需要做大量湿实验,成本极高;知识图谱补全可将药物、蛋白质、疾病、基因作为实体,将“抑制”“激活”“治疗”作为关系,用打分函数对药物—靶点缺失边进行候选排序,缩小实验范围。

具体案例:某生物医药团队构建包含 20 万实体的药物知识图谱,用负采样 + 嵌入方法补全出 500 条未被标注的“药物—靶点”候选关系,其中 30 条在文献中被后续验证。

智能问答:回答关系类问题

阶段:知识推理与查询补全

解决的问题:用户问“周杰伦的妻子是谁”这类关系问题时,传统问答需要图谱中恰好存在该三元组,一旦缺失就答不上来;利用链接预测,系统可在问答时动态推断缺失关系,并给出带置信度的答案。

具体案例:某电商客服机器人在商品属性图谱上做链接预测,对“这款手机支持无线充电吗”这类缺失三元组的问题,给出 Top3 候选答案与置信度,转人工率降低 18%。

Python 演示

python100 行
import mathimport random  def vec_add(a, b):    return [x + y for x, y in zip(a, b)]  def vec_sub(a, b):    return [x - y for x, y in zip(a, b)]  def vec_norm(v):    return math.sqrt(sum(x * x for x in v))  def vec_normalize(v):    n = vec_norm(v)    if n < 1e-9:        return v    return [x / n for x in v]  class TransE:    """极简版 TransE: 用向量平移预测缺失的三元组关联."""     def __init__(self, entities, relations, dim=8, lr=0.02, margin=1.0):        self.ent = {e: vec_normalize([random.gauss(0, 0.1) for _ in range(dim)])                    for e in entities}        self.rel = {r: vec_normalize([random.gauss(0, 0.1) for _ in range(dim)])                    for r in relations}        self.lr = lr        self.margin = margin     def score(self, h, r, t):        """打分函数: ||h + r - t||^2, 越小越可信."""        diff = vec_sub(vec_add(self.ent[h], self.rel[r]), self.ent[t])        return sum(x * x for x in diff)     def corrupt(self, h, r, t):        """负采样: 随机替换头实体或尾实体, 制造假三元组."""        keys = list(self.ent.keys())        while True:            if random.random() < 0.5:                h_neg = random.choice(keys)                if h_neg != h:                    return h_neg, r, t            else:                t_neg = random.choice(keys)                if t_neg != t:                    return h, r, t_neg     def train_step(self, triple):        h, r, t = triple        h_neg, r_neg, t_neg = self.corrupt(h, r, t)        pos = self.score(h, r, t)        neg = self.score(h_neg, r_neg, t_neg)        loss = max(0.0, self.margin + pos - neg)        if loss <= 0:            return loss        err = vec_sub(vec_add(self.ent[h], self.rel[r]), self.ent[t])        g = 2.0 * self.lr        for key, s in ((h, 1), (t, -1)):            self.ent[key] = [v - s * g * e for v, e in zip(self.ent[key], err)]        self.rel[r] = [v - g * e for v, e in zip(self.rel[r], err)]        for key in (h, t, r):            self.ent[key] = vec_normalize(self.ent[key])        return loss     def predict_tail(self, h, r, candidates, top_k=3):        """给定头实体和关系, 返回最可能的尾实体候选列表."""        ranked = sorted(candidates, key=lambda t: self.score(h, r, t))        return ranked[:top_k]  def main():    entities = ["Alice", "Bob", "Cathy", "Dan", "Eve", "Frank"]    relations = ["Friend", "Parent", "Teacher"]    triples = [        ("Alice", "Parent", "Bob"),        ("Bob", "Friend", "Cathy"),        ("Cathy", "Teacher", "Dan"),        ("Dan", "Friend", "Eve"),        ("Eve", "Parent", "Frank"),    ]    model = TransE(entities, relations, dim=6)    for epoch in range(200):        total = 0.0        random.shuffle(triples)        for tr in triples:            total += model.train_step(tr)        if epoch % 40 == 0:            print("epoch", epoch, "loss", round(total, 4))    candidates = [e for e in entities if e != "Alice"]    print("Alice -> Friend -> ?")    print(model.predict_tail("Alice", "Friend", candidates))  if __name__ == "__main__":    main()
目的:用约 100 行代码实现一个可训练的 TransE 模型,演示从数据准备、负采样、损失计算到尾实体预测的完整补全流程。
  1. class TransE:定义图谱补全模型类,相当于给“整理族谱的实习生”建立工作手册。
  2. self.ent = {e: vec_normalize([random.gauss(0, 0.1) ...])}为每个实体随机初始化坐标向量,并做归一化防止向量模长失控。
  3. def score(self, h, r, t):打分函数,计算 h + r 与 t 的欧氏距离平方,距离越小越可信。
  4. def corrupt(self, h, r, t):负采样核心:等概率地随机替换头实体或尾实体,且保证替换后组合不会恰好是原三元组。
  5. loss = max(0.0, self.margin + pos - neg)铰链损失:正例距离加上安全间隔后如果仍比负例小,就无需更新。
  6. err = vec_sub(vec_add(self.ent[h], self.rel[r]), self.ent[t])计算平移误差,作为梯度更新的方向依据。
  7. def predict_tail(self, h, r, candidates, top_k=3):推理阶段按分数对所有候选尾实体排序,返回最可能的 TopK。

常见误区

误区我总觉得负例越多模型学得越好,所以把每个正例配上几十个负例,结果训练变得又慢又差。

正解负例太多会让训练集严重失衡,模型把大量精力用于区分“明显错误的陌生人”,反而忽略了精细关系的建模。就像补族谱时,如果整天被灌输“街上的路人不是亲戚”,你会变得草木皆兵,连真正亲戚的特征都记不住。负采样比例通常控制在每个正例 1~5 个负例,并配合验证集调参。

为何常见:“见多看广”的生活经验让人下意识认为数据越多越准,忽略了负样本质量与训练成本的平衡。

误区TransE 这么简单好用,那 1 对 N、N 对 1 的复杂关系它也能轻松搞定吧。

正解TransE 假设 h + r ≈ t,当同一头实体 + 同一关系对应多个尾实体时(如“王小明—老师—张三”和“王小明—老师—李四”),一个落点难以同时贴近多个真实坐标,向量会被“拉扯”得面目全非。这时候需要更复杂的模型如 TransH、TransR 来处理超平面投影。补全不是“一招鲜”,要根据关系模式选模型。

为何常见:初学者往往先学最简单的模型,又缺乏对关系模式多样性的感知,容易把模型的适用范围无限放大。

误区模型在测试集上 MRR 到了 0.9,我觉得补全效果已经很完美,可以放心上线了。

正解MRR 反映的是“平均排名倒数”,一个模型可能在大部分样本上排名中上,却对少数关系类型完全失效。真正验收要同时看 Hits@1(首次命中率)、Hits@10 和分关系类型的细粒度指标。就像族谱整体补得不错,但“远房亲戚”全补错了,平均分掩盖了结构性问题。

为何常见:单一数字指标具有强大的心理暗示,人会本能地用一个分数简化复杂的评估问题。

误区实验时不小心把部分要预测的三元组也放进了训练集,感觉模型分数还挺高,应该没事吧?

正解这是典型的数据泄漏。模型在训练时已经“见过”正确答案,测试分数虚高,无法反映真实泛化能力。就像面试官把考题答案提前给了考生,考试分数再高也不能说明能力。补全任务中,所有评估用的三元组必须严格排除在训练集之外,且负采样不能与测试正例重叠。

为何常见:数据处理流水线中训练集、验证集、测试集划分混乱,人们又容易对“高分”产生盲目乐观,忽视了分数来源的合法性。

面试题

Q1. 知识图谱最基本的组成单元是什么?

单选题 · easy

  • A.实体、关系与属性构成的三元组← 正确答案
  • B.节点与边构成的简单图结构
  • C.大规模稀疏矩阵形式的数据表
  • D.统计学中的概率分布模型

答案:A。知识图谱的最小存储单位是三元组 (h, r, t),由头实体、关系和尾实体构成,就像相册里一张“照片—标签—照片”的关系卡片。B 描述的是通用图结构而非三元组单元,C、D 与知识图谱的基本表示无关。

Q2. 知识图谱补全(链路预测)的核心目标是什么?

单选题 · easy

  • A.删除图谱中重复冗余的实体
  • B.计算图谱所需的内存占用量
  • C.预测实体之间缺失的关联边← 正确答案
  • D.将图谱数据压缩成图形文件

答案:C。链路预测的目标是预测图谱中缺失的三元组,即推断实体间最可能存在的关联边,相当于补全相册中缺失的关系卡片。A 是实体消歧,B、D 是工程问题,均不属于补全任务。

Q3. TransE 模型最核心的假设是什么?

单选题 · mid

  • A.头实体向量等于尾实体向量加噪声
  • B.头实体向量加关系向量近似尾实体← 正确答案
  • C.所有实体向量彼此完全独立
  • D.关系向量由随机初始化直接决定

答案:B。TransE 的核心假设是 h + r ≈ t,即从头实体出发沿关系向量平移,落点应接近尾实体。A 描述的是噪声模型而非平移,C 违背了图谱中实体相互关联的本质,D 忽略了训练过程中关系向量会被不断优化。

Q4. 构建负样本的主要作用是什么?

单选题 · mid

  • A.扩大训练数据集的整体规模
  • B.提升实体向量的初始化速度
  • C.降低模型对超参数的敏感程度
  • D.让模型学会拒绝虚假的三元组← 正确答案

答案:D。负采样的核心价值是给模型提供“反例”,让它能区分真实关系与虚假组合,避免把所有三元组都判真。虽然负样本客观上增加了数据量,但那只是副产品。B、C 与负采样的原理无关。

Q5. 在 TransE 中,打分函数值 \( \lVert \mathbf{h} + \mathbf{r} - \mathbf{t} \rVert \) 越小说明什么?

单选题 · mid

  • A.该三元组成立的可信度越低
  • B.实体向量之间的夹角必然更大
  • C.关系向量的模长会变得越小
  • D.该三元组成立的可信度越高← 正确答案

答案:D。打分值表示平移后的落点与尾实体坐标的距离。距离越小,说明“头实体 + 关系”越贴近尾实体,三元组越可能是真的,类似从家出发沿关系方向走一步正好踩到目的地的门口。A 说反了,B、C 与距离语义没有直接关系。

Q6. 下列哪些是知识图谱补全常用的评估指标?

多选题 · mid

  • A.平均倒数排名 MRR 指标← 正确答案
  • B.正确答案排进前 K 的 Hits@K← 正确答案
  • C.Accuracy 精确率是最核心指标
  • D.正确实体的平均排名 MR 值← 正确答案

答案:ABD。链接预测是排序任务,MRR、Hits@K、MR 都是基于“正确答案排名位置”的标准指标。Accuracy 需要设定阈值,在开放候选集排序任务中不常用,故不选 C。

Q7. 关于负采样策略,下列说法正确的有哪些?

多选题 · hard

  • A.替换后的实体不应与原实体相同← 正确答案
  • B.负例必须真实存在于知识图谱中
  • C.负例组合大概率不在图谱中出现← 正确答案
  • D.每次负采样都要保持实体类别一致

答案:AC。替换实体时若仍取原实体,会生成一个正例而非负例,故 A 对。负例必须“不存在于图谱中”才能作为反例,B 说反了。随机替换后组合大概率是图谱外的假卡片,C 对。保持实体类别并非负采样的通用要求,D 错。

Q8. TransE 在哪种关系模式下表现最差?

单选题 · extreme

  • A.一对多与多对一的复杂关系← 正确答案
  • B.一对一且对称的简单关系
  • C.实体数量较少的稀疏图谱
  • D.关系类型非常丰富的图谱

答案:A。一对多或多对一关系中,同一个头实体和关系需要对应多个不同的尾实体,但 h + r 的平移落点只有一个,无法同时贴近多个真实尾实体,导致向量冲突。对称简单关系反而容易学习,B 排除;C、D 取决于数据质量而非关系模式,不是 TransE 最核心的短板。

Q9. 知识图谱补全可以应用在哪些实际场景?

多选题 · hard

  • A.社交平台推荐“可能认识的人”← 正确答案
  • B.药物与靶点相互作用的推断← 正确答案
  • C.电商评论的情感倾向分类
  • D.智能问答系统回答关系类问题← 正确答案

答案:ABD。好友推荐本质是预测用户间缺失的“关注/好友”关系,药物—靶点推断是补全生物知识图谱中的关系,智能问答需要动态推理缺失关系来作答,三者都是链接预测的典型应用。C 情感分类是文本分类任务,不涉及图谱关系补全。

Q10. 已知三元组缺失了尾实体,补全任务应当预测什么?

单选题 · easy

  • A.同时预测图谱中的全部实体
  • B.给定头实体与关系预测尾实体← 正确答案
  • C.随机猜测一个候选实体
  • D.给定尾实体与关系反推头实体

答案:B。尾实体预测的标准做法是给定 (h, r),从候选实体中挑出打分最高的 t,即“根据头与关系填尾巴”。D 描述的是头实体预测任务,A、C 没有利用已知条件,无法得到可靠结果。