用知识蒸馏构建大规模知识图谱

让我从杀死大多数知识图谱项目的计算开始。

你有1亿个网页。你的目标说得简单得令人困惑:将这片非结构化HTML和散文的海洋转化为一个知识图谱——一个结构化的、可查询的实体及其关系网络。你想从这样的段落:"Marie Curie,在巴黎工作,发现了钋,后来获得了两次诺贝尔奖",得到干净的、机器可读的三元组:

(Marie Curie, worked_in, Paris) (Marie Curie, discovered, Polonium) (Marie Curie, won, Nobel Prize)

2025年最明显的方法是把一个前沿模型扔给它。拿像DeepSeek-R1这样的东西——一个强大的推理模型,正好擅长这种结构化提取——然后喂给它每个页面。礼貌地请它给出三元组。它会做得真的很好。

现在算术。假设单个页面平均2000个令牌的输入和500个令牌的输出,假设你的总成本在每页1到3美分左右,一旦你考虑推理令牌、重试和偶尔的巨本文档。假设每个页面通过API需要3到8秒的墙钟时间。

乘以1亿。

你现在看到的账单在100万到300万美元之间,而且——即使有数百个并发工作者的激进并行——运行时间也以周到月来衡量。这是快乐路径,在速率限制之前,在模式变更强制重新运行之前,在你的财务部门介入之前。

没有理智的工程组织会批准这个。所以项目死了,或者它被缩减到"让我们只做100万页并称之为概念验证",全面图谱的愿景蒸发了。

本文是关于拒绝这个虚假选择的。有一个成熟的模式——教师-学生知识蒸馏结合半监督标签传播——让你在所有1亿页面上获得前沿质量的提取,同时只为大约10%支付前沿价格。其他90%由一个更便宜的学习模型处理,该模型被教导模仿昂贵的那个。

核心问题,简单地说: 如果你只用昂贵的模型标注1000万页,并教导一个更便宜的图神经网络在剩下的9000万页上模仿那个模型的判断呢?

这就是整个想法。这篇(非常长的)文章的其余部分是关于如何实际构建它——包括所有在架构图中看起来微不足道,然后在三个月后悄悄摧毁你项目的部分。

1、解决方案的形状

在我们深入之前,这里是整个管道压缩成的四个动作:

教师标注。选择一个代表性的1000万页面子集,并在其上运行DeepSeek-R1以产生高质量的"金"三元组。这是你的基本事实和教师正确行为的演示。

特征制造。通过PySpark管道运行所有1亿页面,提取便宜的、可扩展的信号——命名实体、嵌入、共现统计、超链接结构。这产生了一个巨大的稀疏特征矩阵,关键是,图的原材料。

学生训练。组装一个统一的候选图,并在1000万金三元组上训练一个图神经网络,教导它将页面/实体特征映射到图结构——具体来说,预测哪些实体相关以及如何相关。

推理和合并。在剩下的9000万页面上运行训练好的GNN,按置信度过滤其预测,可选地将困难案例循环回教师,解析重复实体,并将所有内容合并到一个连贯的1亿页面知识图谱中。

这里是餐巾纸图:

1亿网页
    |
    +-----------------+------------------+
    |                                    |
  1000万子集                        所有1亿页面
(分层采样)                            |
    |                              PySpark集群
DeepSeek-R1                       (分布式特征提取)
(教师/推理)                           |
    |                                    |
金三元组                         稀疏特征矩阵
(头、关系、尾、                      + 实体提及
置信度、来源)                       + 嵌入
    |                              + 共现
    |                              + 超链接边
    |                                    |
    +-----------------+------------------+
                          |
              构建统一候选图
              节点 = 规范实体
              边 = 候选关系
              特征 = PySpark信号
                          |
              训练GNN(R-GCN / CompGCN)
              由1000万金边监督
                          |
              在9000万区域推理
              为每个候选边预测关系+置信度
                          |
              置信度过滤(保持精确度)
                          |
              自训练循环(可选)
              用R1重新标注最弱案例
                          |
              实体解析/规范化
                          |
              完整的1亿页面KG

它适合放在餐巾纸上。但餐巾纸通过省略撒谎——它让一些东西看起来像单个框,而实际上它们是整个子项目。这篇文章的大部分内容致力于这些框。

2、教师——为什么哪1000万比多少重要得多

2.1 诱惑性的、致命的捷径

这是几乎每个人第一次尝试时做的事情:他们抓取爬虫中的前1000万页面,或者解析最干净的1000万页面,然后标注那些。感觉很好。这是慢动作的灾难。

原因是这个概念将困扰这个管道的每个阶段:分布偏移

学生模型只能和教师演示的分布一样好。如果你的1000万标注页面都是干净的、结构良好的、百科全书式的文章——因为那些是容易解析的——但你的9000万未标注页面包括论坛帖子、产品列表、机器翻译的博客垃圾、政府PDF和Reddit争论,那么你的GNN是在一个不像它将被要求操作的世界的世界中训练的。

它踏出舒适文章邻域的那一刻,它外推。而外推,对于模型来说,意味着自信地编造。你会得到一个充满看似合理、高置信度、完全错误的三元组的图——这比明显破碎的图更糟,因为没有人注意到,直到它承重。

2.2 修复:分层采样

补救措施是朴素的、不可协商的。你的1000万页面教师集必须是完整1亿页面语料库的缩小照片——而不是其最佳角度的讨人喜欢的肖像。

具体来说,这意味着分层采样。在你标注任何东西之前:

分析整个语料库。沿对提取难度和内容类型重要的维度将所有1亿页面分桶:

  • 源域名类型(新闻、电子商务、论坛、wiki、学术、博客、政府、社交)
  • 语言以及文本是否看起来是机器翻译的
  • 文档长度(200字的列表与10000字的文章表现完全不同)
  • 结构丰富度(重HTML表格与流动散文)
  • 主题领域(体育、生物医学、金融、娱乐等)

计算比例。如果你语料库的22%是电子商务产品页面,那么你的1000万教师集中大约22%应该是电子商务产品页面。如果4%是机器翻译的葡萄牙语,包括那4%。

在每个层内按比例采样,在桶内随机以避免排序偏差。

如果你将教师集在所有这些维度上的分布绘制出来,它应该几乎完美地叠加在完整语料库的分布上。如果做到了,GNN后来的外推实际上是插值——它是在填补它见过的点之间的空白,这正是学习模型擅长的。如果没有,你是在要求模型在它没有证据的区域幻觉结构。

2.3 提示教师获取结构

一旦你选择了哪些页面,你需要从每个昂贵的R1调用中获得最大价值。不要要求散文。要求结构化的、可解析的输出,带有你以后需要的元数据。

一个健壮的提取提示要求R1每页返回这样的JSON:

{
  "triples": [
    {
      "subject": "Marie Curie",
      "subject_type": "Person",
      "relation": "discovered",
      "object": "Polonium",
      "object_type": "ChemicalElement",
      "confidence": 0.97,
      "source_sentence": "Marie Curie discovered polonium in 1898.",
      "source_char_span": [412, 448]
    }
  ],
  "page_language": "en",
  "extraction_notes": "..."
}

每个字段都有其位置:

  • subject_type / object_type 给你一个类型化的图,这显著改善了下游链接预测(Person和ChemicalElement之间的发现关系是合理的;两个城市之间是无意义的)
  • confidence 让你加权训练示例,后来校准学生
  • source_sentence 和 source_char_span 是纯金。你将用它们进行验证、调试、溯源("为什么图声称这个?")和构建高质量评估集

如果你的预算允许,也保留R1的推理痕迹。当你后来发现一类错误时,能够阅读教师为什么做出这个决定值得大量的调试时间。

2.4 第1阶段的产出

可交付物是你的金三元组集:大约数千万个(头、关系、尾)事实——从1000万页面中现实地得到5000万-1.5亿三元组,取决于文档密度——每个都链接回特定页面和句子,每个都有类型和置信度分数。这是所有下游内容锚定的基本事实。将其视为珍贵的、版本化的资产。你为它支付了真金白银。

3、特征工厂:1亿规模的PySpark

这里有一个概念上的绊脚石,让许多原本有经验的工程师措手不及。计划说"将9000万页面传递给图神经网络"。但图神经网络,根据定义,在图上操作——一组由边连接的节点,每个节点携带特征向量。它在连接节点之间执行消息传递。

9000万网页不是图。它们是一堆文档。没有固有的节点和边结构供GNN传播。在发生任何神经操作之前,你必须制造图本身。这种制造是PySpark阶段的全部意义。它不仅仅是"特征提取"作为事后想法——它是图构建,可以说与运行在其上的GNN一样重要。

所以工厂生产什么?四样东西。

3.1 实体:候选节点

对于1亿页面中的每一个,运行命名实体识别以提取提及的实体:人员、组织、地点、产品、日期、化学物质,无论你的本体论关心什么。这些提及成为图的候选节点。

在这个规模上,你需要一个快速的NER模型——一个蒸馏的transformer甚至一个精心调优的spaCy管道——在Spark UDF内运行,以便在集群中分布。你是在用每个实体的一点准确性换取在这个十年内完成的能力。

3.2 嵌入:语义特征

每个节点,理想情况下,上下文中的每个实体提及都获得一个密集嵌入向量。这些是GNN实际学习的特征。两个具有相似嵌入的实体,出现在相似的上下文中,更有可能参与相似的关系——这是网络利用的信号。

你通常会在每个实体提及周围的句子上运行句子/段落嵌入模型,同样在分布式Spark作业内,并存储结果向量。这是PySpark阶段计算最密集的部分,所以值得使用一个小而快的嵌入模型,并在每个执行器内积极批处理。

3.3 共现:候选边

这是候选边诞生的地方。两个出现在彼此附近的实体——同一句子、同一段落、由链接动词或依赖路径连接——是具有关系的候选。你还不知道是什么关系(那是GNN的工作),只是关系足够合理值得考虑。

你计算整个语料库的统计信息,如:实体A和B多久共现一次?在什么距离?有什么干预令牌?这些成为带有弱特征的边候选。

这里的关键设计决策是候选生成策略,因为它决定了GNN甚至必须考虑多少边。太宽松(每个曾经共享页面的实体对)你会淹没在不可能数量的候选中。太严格(只有同一句子中已知动词之间的实体)你会错过跨句子表达的真实关系。大多数实际系统使用分层方法:同句对是强候选,同段对是较弱候选,基于嵌入相似性的对捕获共现遗漏的关系。

3.4 超链接:免费的、预先存在的边

不要忽视这一点。网页已经相互链接。这些超链接是编码现实世界关系的预先存在的、免费的图结构——公司页面链接到其子公司,传记链接到相关人物,产品链接到其制造商。收获链接图以零提取成本给你一个强大的结构先验。忽略它就是将整个管道中最容易的信号留在桌上。

3.5 产出:巨大的稀疏特征矩阵

PySpark阶段的组合输出是一个稀疏特征矩阵——数百万行(实体及其提及上下文),每个由高维但大部分为空的特征向量描述,加上一个伴随的候选关系边列表及其自己的特征。

"稀疏"这个词做了巨大的工作,它直接导致整个事业中最重要的架构约束。

4、房间里的大象:你无法构建1亿×1亿的邻接矩阵

4.1 不可能的算术

描述目标为"为所有1亿页面产生三元组邻接矩阵"是诱人的——许多此类项目的原始框架正是这样做的。请不要这样想,因为它会导致你尝试构建一个物理上无法存在于你的硬件上的对象。

1亿实体上的密集邻接矩阵有100,000,000 × 100,000,000个单元格。那是10^16个单元格——十千万亿。每个单元格一个字节,那就是十PB来存储一个绝大部分是零的矩阵。添加关系类型(真正的KG有数百种)你会进一步乘以它。没有你可能租用的集群能容纳这个,即使能,你也会花所有计算来读写空洞。

4.2 图本质上是稀疏的

这里是救星:知识图谱本质上是、彻底地稀疏的。真实知识图谱中的平均实体与少数其他实体相关——也许几十个——而不是所有1亿个。Marie Curie与Pierre Curie、钋、镭、诺贝尔奖、巴黎、索邦大学等几十个有关系。她与图中99.9999%的其他实体没有关系,存储所有这些零是疯狂的。

所以命令是:从头到尾保持稀疏。你永远、永远不要物化密集矩阵。每个表示——特征矩阵、邻接结构、你可以保持稀疏的中间GNN激活——都存储为边列表或稀疏张量(COO或CSR格式),只触及非零条目。

4.3 使一切成为可能的重新表述:链接预测

密集矩阵框架意味着不可能的任务:"填写每个单元格。"正确的框架完全不同且完全可处理:

对于每对候选实体,预测是否存在关系,如果存在,是哪种类型。

这是链接预测(也称为关系预测)。你不是在填充矩阵。你在为一组可管理的候选边评分——你的PySpark共现和嵌入相似性步骤标记为合理的那些——并决定每个是真实关系以及什么类型。

相反于10^16个单元格,你可能有几十亿候选边——仍然很大,但可分布、稀疏且有限。这个单一重新表述将项目从"物理上不可能"转变为"大型但普通的分布式ML工作"。如果你从整篇文章中吸取一个架构教训,就是这个。

5、学生:图神经网络实际学到了什么

5.1 精确地构建任务

现在是智力上令人满意的部分。你有一个候选图:节点是(规范化的)实体,边是候选关系,每个节点和边都携带来自PySpark工厂的特征。你有价值1000万页面的金三元组,告诉你这些边子集的正确关系。你训练一个GNN来复现教师的判断并将其推广到教师从未见过的边。

精确地说明模型在做什么。它正在执行关系链接预测:给定两个实体及其周围的图上下文,预测它们之间的关系类型——包括"无关系"选项。它通过观察DeepSeek-R1如何在1000万标注页面上连接实体来学习这一点,然后将该学习模式推广到它从未见过标注的9000万页面。

5.2 消息传递如何传播监督

这是使图上半监督学习工作的机制,没有含糊其辞。

GNN通过从其邻居聚合信息来精炼每个节点的表示,反复进行。在第一层,每个实体的向量使用其直接邻居的向量进行更新。在第二层,它结合其邻居的邻居。依此类推。信息沿着边流动。

现在考虑一个仅出现在未标注页面上的实体——教师从未描述过它。孤立地,你根本没有它的监督。但它连接到确实出现在标注页面上的实体。通过消息传递,来自那些标注实体的信号流过连接边并通知未标注实体的表示。监督通过图结构泄漏。

这就是监督仅10%的数据有用地约束对其他90%的预测的方式。图是管道。记住序言中的短语——通过结构传播监督——这就是它,被机械化了。

5.3 选择模型:R-GCN、CompGCN和嵌入头

并非每个GNN都适合这项工作。标准图卷积网络假设单一边类型。知识图谱有许多关系类型,整个要点是区分它们。你需要多关系架构:

R-GCN(关系图卷积网络)。规范选择。它通过学习每种关系类型的单独变换来扩展图卷积,因此节点接收的消息取决于它到达的边的类型。它原生处理多关系结构。其主要成本是当你有数百种关系时的参数爆炸,R-GCN通过基分解(跨关系共享参数)来缓解。

CompGCN(基于组合的GCN)。通常是更好的现代默认值。它联合学习实体和关系嵌入,并使用组合操作(减法、乘法、循环相关)来组合它们,这使其在具有许多关系类型的图上比R-GCN更参数高效。如果你有丰富的关系词汇,从这里开始。

KG嵌入评分头(RotatE、TransE、ComplEx、DistMult) 安装在GNN之上。这些通过嵌入空间中的几何合理性对候选三元组进行评分——例如,TransE希望头 + 关系 ≈ 尾作为向量。用作GNN产生的嵌入之上的最终评分层,它们给出一个强大、便宜、易于理解的目标。RotatE(将关系建模为复空间中的旋转)是一个特别强大的通用选择,因为它可以表示对称、反对称、反转和组合。

务实的架构: 一个产生上下文感知实体嵌入的CompGCN编码器,馈送到一个评分候选(头、关系、尾)三元组的RotatE风格解码器。编码器捕获图上下文;解码器捕获关系几何。

5.4 训练设置的概要

在PyTorch Geometric或DGL中,骨架大致如下(说明性的,非生产):

import torch
import torch.nn.functional as F
from torch_geometric.nn import CompGCNConv  # 概念性的

class KGStudent(torch.nn.Module):
    def __init__(self, num_entities, num_relations, dim):
        super().__init__()
        self.entity_emb = torch.nn.Embedding(num_entities, dim)
        self.relation_emb = torch.nn.Embedding(num_relations, dim)
        self.conv1 = CompGCNConv(dim, dim, num_relations)
        self.conv2 = CompGCNConv(dim, dim, num_relations)

    def encode(self, edge_index, edge_type):
        x = self.entity_emb.weight
        x = F.relu(self.conv1(x, edge_index, edge_type, self.relation_emb.weight))
        x = self.conv2(x, edge_index, edge_type, self.relation_emb.weight)
        return x  # 上下文感知的实体嵌入

    def score(self, h_idx, r_idx, t_idx, ent_emb):
        # RotatE风格的复空间评分(示意性的)
        h, t = ent_emb[h_idx], ent_emb[t_idx]
        r = self.relation_emb(r_idx)
        return -torch.norm(complex_rotate(h, r) - t, dim=-1)

# 训练:金三元组是正边;采样损坏的
# (头、关系、尾)三元组作为负例。优化边际排名
# 或二元交叉熵损失,使真实三元组的评分高于损坏的。

两个细节比它们看起来更重要:

负采样。你的金三元组都是正例。模型需要看到负例——看似合理但错误的三元组——否则它会学会对所有事情都说"是"。标准做法是通过交换头或尾为随机(或者更好的,硬/相似)实体来损坏真实三元组,并训练模型将真实三元组排在损坏的三元组之上。

对不适合内存的图进行小批量处理。你不能将十亿边的图加载到一个GPU上。你使用邻居采样(如GraphSAGE)或子图采样:对于每个批次,在目标边周围采样一个可管理的本地邻域,在该子图上运行消息传递,并更新。这就是让GNN训练扩展到远大于任何单台机器内存的图的方式。

6、推理、置信度过滤和自训练循环

6.1 在9000万区域运行学生

有了训练好的学生,你在9000万页面区域的所有候选边上运行推理。对于每个候选边,GNN发出预测的关系类型和置信度分数。与R1相比,这又快又便宜——这是整个管道存在的原因。

6.2 不要接受一切

这是将有用图与无用图区分开的纪律:应用置信度阈值,只保留模型真正确定的预测。

知识图谱的价值中存在深刻的不对称性。高精度、低召回率的图——包含较少事实但对其包含的事实是正确的——几乎总是比充满幻觉边的完整图更有价值。下游消费者信任干净的图并在此基础上构建。他们在嘈杂的图中遇到少量垃圾事实,失去信心,并完全放弃它。精确度购买信任;信任是整个产品。

所以你设置一个阈值(在保留数据上校准——稍后会讲更多关于校准的内容),丢弃低置信度预测。是的,你会丢失一些真实事实。这是在规模上正确的权衡。

6.3 闭合循环:主动学习风格的自训练

管道通过一个更多的想法变得显著更好,它是整个设计中最优雅的部分。

推理之后,你的预测分为三个波段:

  • 高置信度:保留它们,添加到图中。
  • 低置信度:丢弃它们。
  • 中置信度——不确定的中间地带:这些是学生困惑的案例,这意味着它们正是它最能学习的地方。

所以你这样做:

  1. 取中置信度、不确定预测的一个切片。
  2. 将这些特定页面发送回DeepSeek-R1进行权威标注。
  3. 将R1的新金标签添加到你的训练集中。
  4. 重新训练学生。

这是戴着自训练帽子的主动学习。你不是在语料库上均匀地喷洒你昂贵的教师预算,而是用手术精度在学生最弱的精确示例上花费它。经过两到三轮,学生准确性稳步攀升,而你的R1支出保持紧密受限——因为你只为解决真正的困惑付费,从不为重新确认学生已经知道的事情付费。

学生推理
    |
    +----+----+----------------+
    |         |                |
  高       低            中(不确定)
  置信度   置信度         置信度
    |         |          采样并发送给R1
  保留     丢弃              新金标签
    |                          重新训练学生
    |                          (重复2-3次)

每个循环都收紧图。当每个R1美元的边际准确度增益低于你的关心阈值时,你停止。

7、没有人画出的隐藏难题——实体解析

7.1 霓虹灯警告

如果我能将一句话烧进读者的记忆,那就是:实体解析将比你的图神经网络更难。

它在餐巾纸图上作为标题框无处可寻,它将比GNN、PySpark管道和R1提示加在一起消耗更多的工程痛苦。原因如下。

7.2 问题,具体化

跨越1亿个网页,同一个现实世界实体以完全不同的方式被提及:

  • "Apple"、"Apple Inc."、"AAPL"、"the Cupertino company"、"$AAPL"、"Apple Computer"——都是一个节点。
  • 但"apple"(水果)和"Apple Records"(Beatles的标签)是共享表面形式的不同节点。
  • 同一表面形式指代不同的现实世界实体:
  • "Michael Jordan"是篮球运动员、伯克利机器学习教授、演员,以及成千上万的普通人。
  • "Paris"是法国的城市、德克萨斯的城市,以及人名。
  • "Mercury"是行星、元素、罗马神、汽车品牌和唱片标签。

如果你在解析这些之前构建图边,你会在两个方向上得到灾难:

  • 碎片化:真正的"Apple Inc."节点碎成几十个近乎重复的节点("Apple"、"Apple Inc."、"AAPL"……),每个都持有一部分真实关系。你的图看起来很大,实际上是一堆碎片。每个"Apple有多少关系?"查询都返回无意义。
  • 合并:两个Michael Jordan合并成一个弗兰肯斯坦节点,"在NBA打球"和"推进变分推断",你的图现在一本正经地断言荒谬。

7.3 为什么它真的很难

1亿规模的实体解析是一个分布式的、模糊的、依赖上下文的聚类问题:

如果天真的话它是二次的。将每个提及与每个其他提及进行比较又是10^16次比较。你需要阻塞——廉价地将提及分区到候选组中(通过规范化名称、通过嵌入空间局部敏感哈希),以便你只在块内比较。

它依赖上下文。决定这里的"Michael Jordan"是否等于那里的"Michael Jordan"需要阅读周围的上下文——体育vs学术——这意味着嵌入和消歧模型,而不仅仅是字符串匹配。

它从锚点中受益匪浅。将提及链接到现有的、策划的知识库——Wikidata是通常的选择——给你规范的ID来聚类。针对Wikidata的"实体链接"将开放式聚类问题转化为(仍然困难但有界的)分类问题:这个提及指的是哪个Wikidata实体,如果有的话?

7.4 务实的操作手册

一个现实的实体解析堆栈如下:

  1. 规范化表面形式(大小写、标点、常见后缀如"Inc.")。
  2. 使用名称嵌入上的局部敏感哈希进行阻塞,以生成候选匹配组,而没有二次爆炸。
  3. 使用上下文和提及嵌入进行消歧,基于周围文本将模糊表面形式解析为不同实体。
  4. 尽可能链接到Wikidata以获取规范ID和免费的结构先验。
  5. 使用嵌入相似性加上保守的合并规则聚类剩余内容(不在任何知识库中的实体)。
  6. 分配规范节点ID并重写所有候选边以指向这些规范ID——在GNN运行之前。

为此预算真实的、认真的工程时间。它不吸引人。它不会让架构评审中的任何人印象深刻。而且它比任何其他单一组件更能决定你的最终图是连贯的资产还是昂贵的碎片堆。

8、如何知道它有效?诚实的评估

训练损失下降几乎不能告诉你知识图谱是否好。模型可以将其损失驱动到地板,同时产生一个你会尴尬地发布的图。真实地评估。

8.1 保留金三元组

在训练之前,隔离你R1标注的三元组的一个切片——比如5%——GNN在训练期间永远不会看到。训练后,测量学生在恢复这些保留金三元组时的精确度、召回率和F1。这是你的主要、定量的质量信号。因为保留集是由教师标注的,它是你最好的"前沿质量正确"的代理。

分别报告精确度和召回率,而不仅仅是F1,因为——根据之前的论证——你对精确度的关心不成比例。跟踪跨置信度阈值的精确度-召回率曲线,以便你可以有意地选择你的操作点。

8.2 手动抽查:没有替代品

采样几百个预测三元组——跨关系类型和置信度波段分层——并用人类的眼睛阅读它们。这捕获了聚合指标平滑过的系统性失败模式:一个持续反转的关系类型(parent_of vs child_of),一个模型悄悄崩溃的领域,一类长期被错误解析的实体。聚合F1会愉快地隐藏影响"仅"3%关系的灾难——直到那3%正是下游用户依赖的切片。

8.3 跟踪校准

校准问:当模型说它90%自信时,它实际上90%的时间是对的吗?校准良好的模型是其置信度分数意味着其声称的含义的模型。这非常重要,因为你的整个置信度过滤策略——购买精确度的东西——依赖于这些分数是可信的。如果模型说0.9但只有60%的时间正确,你的阈值是谎言,你的"高精度"图不是。

绘制可靠性图(预测置信度vs观察到的准确度,分组)。如果它偏离对角线,在你信任阈值之前应用校准方法——温度缩放是简单、有效的标准。

8.4 结构和一致性检查

除了三元组级别的准确性,对图进行健全性检查:

  • 是否有荒谬的循环(A出生于B,B出生于A)?
  • 类型约束是否成立(每个发现关系是否链接合理的发现者类型到合理的发现类型)?
  • 度分布是否健全,或者你是否有可疑的超级节点在尖叫"实体解析合并"?

这些检查经常浮出三元组级别指标完全遗漏的实体解析失败。

9、粗略的成本和规模模型

让我们用故意四舍五入的、说明性的数字来使经济论证具体化(你的真实数字会不同,但比例是重点)。

朴素的全R1方法:

  • 1亿页面 × ~$0.02/页 ≈ $2,000,000
  • 墙钟时间:即使高度并行化也需要数周到数月。

蒸馏管道:

  • 教师标注:1000万页面 × ~$0.02 ≈ $200,000
  • 自训练循环:~200-300万额外针对性R1调用 ≈ $40,000-60,000
  • PySpark跨1亿页面的特征提取:集群时间,称之为$20,000-50,000,取决于嵌入
  • GNN训练+推理:GPU集群时间,$10,000-30,000
  • 总计:大约$300,000-350,000

你花费了天真成本的约15-18%,并在墙钟时间的一小部分内完成。如果你正确执行了采样、解析和校准,质量差距是适度的——你在9000万区域恢复了教师精确度的大部分,你有意地为此交易了一些召回率。

这个比例——大约六分之一成本和一小部分时间的前沿质量——是该架构的整个商业理由。它是一个被批准的项目和一个在算术中死去的项目之间的区别。

10、失败模式汇总

对于想要验尸的读者,以下是这个管道最常失败的方式,每一种都在本文中被论证过:

  1. 非代表性教师集。你标注了容易的1000万;学生在混乱的9000万上脸着地。修复:分层采样。
  2. 试图构建密集矩阵。你在运行任何ML之前耗尽存储。修复:一切稀疏;重新表述为链接预测。
  3. 没有图供GNN运行。你忘记了特征不是图,没有什么可进行消息传递的。修复:PySpark阶段中的显式节点/边构建。
  4. 跳过实体解析。你的图碎片化并合并成不连贯。修复:真正的实体解析堆栈,在边构建之前运行。
  5. 接受所有预测。你的图充满了自信的幻觉并失去用户信任。修复:置信度阈值,偏爱精确度。
  6. 未校准的置信度。你的阈值毫无意义,因为分数撒谎。修复:可靠性图和温度缩放。
  7. 在训练损失上评估。你认为它有效;它没有。修复:保留金F1、手动抽查、结构检查。
  8. 均匀教师支出。你浪费R1预算重新确认简单案例。修复:主动学习自训练,针对不确定的中间地带。
  9. 错误的GNN系列。你在多关系问题上使用了单关系GCN。修复:R-GCN / CompGCN。
  10. 全图训练。你试图在单个GPU上拟合十亿边的图。修复:邻居/子图采样。

11、为什么这种模式远不止适用于网络

我专注于网络是因为它使数字具体化(1亿页面,10%标注),但这个模式——教师-学生蒸馏通过结构传播监督——适用于任何你有:

  • 昂贵但高质量的判断(教师)
  • 廉价但丰富的特征(PySpark等价物)
  • 稀疏的底层关系结构(图)
  • 一种通过图结构传播少量昂贵监督的方法

这包括:

  • 生物医学知识提取:从PubMed论文中提取蛋白质-蛋白质相互作用
  • 金融风险图谱:从监管文件中提取公司-所有权-人员关系
  • 法律知识图谱:从案例法中提取判例-引用-法规关系
  • 科学文献图谱:从arXiv中提取论文-引用-概念关系

模式是相同的:用昂贵的教师标注一小部分,训练一个便宜的学生在图上传播该监督,用置信度过滤和主动学习闭合循环。

核心见解是通用的:当你有一个稀疏的关系结构时,你不需要标注一切;你需要标注正确的东西,并让图结构做传播的工作。


原文链接: Knowledge Distillation for Knowledge Graphs: turning 100 million web pages into a knowledge graph by labeling only 10%

汇智网翻译整理,转载请标明出处