斯坦福-CS520-知识图谱课程笔记-全-
斯坦福 CS520 知识图谱课程笔记(全)


课程 P1:L1 - 知识图谱简介 🧠
在本节课中,我们将要学习知识图谱的基本概念,了解它为何在当今的计算领域重新受到关注,并探讨其在搜索引擎、数据集成和人工智能等领域的应用。

研讨会概述
本次春季知识图谱研讨会由纳伦和迈克共同组织。
我们组织这次研讨会的动机,是我们看到知识图谱被用于许多不同的应用,包括网络搜索、问答和数据集成。在自然语言处理和计算机视觉领域的许多领先会议上,知识图谱常被用作算法输出的表示形式,以及机器学习算法的输出。我们希望通过这次研讨会,传达知识图谱的基本思想、概念、理论和应用。
这个主题的重要性去年也得到了国家自然科学基金会的承认。他们资助了大约20个不同的知识图谱项目,作为其“收敛加速器”计划的一部分。我们将在后续课程中听到关于这些项目的介绍。
课程结构
尽管这是一个研讨会系列,但它有清晰的结构。前几节课的重点是:什么是知识图,它的数据模型是什么。然后我们会讨论如何创建知识图,以及知识获取的不同技术。一旦知识图被创建,我们将探讨如何对其进行推理,以及它如何与现代人工智能算法一起使用。在系列课程快结束时,我们会讨论当前知识图研究的应用前沿。
今年的课程设计有所不同。我们在星期二和星期四进行两次课程。星期二的课程是基于去年系列讲座要点的综合。我们把关键信息写成了一组笔记,可在课程网站上查阅。一些周二的会议可能有特邀嘉宾,但大部分材料是基于去年的内容综合而成。星期四的特邀会议将邀请来自学术界和工业界的嘉宾,每次会议通常有两场30分钟的专题介绍,并伴有问答环节。会议将被录音并发布在网站上。
对于斯坦福大学选修此课程的学生,要求是完成周二所有十节课的小测验,并为十个星期四会议中的任意八个提交书面摘要。
什么是知识图?
有了简短的介绍,让我们进入今天的主题:什么是知识图。我们将首先定义一个知识图,然后讨论为什么人们对这个话题重新产生了兴趣。为了讨论,我们将考虑三种不同的应用:搜索引擎、数据集成和人工智能。我也想向你传达,关于知识图,什么是新的和不同的。
知识图的定义
我们可以把知识图定义为有向标记图,其中节点和边具有明确定义的含义。
有向标记图是一个很好理解的数学概念,通常在离散数学入门课程中教授。我们在这里教授的内容与知识图谱应涵盖的内容之间的主要区别,在于特别注意定义节点和边的含义。我们将在本节课和整个系列中讨论定义意义的不同方法。
有许多数据模型使用有向标记图作为核心数学表示。它们可能用不同的名称来指代节点和边。我们将在下周的讲座中讨论数据模型,但现在我只想传达的是,在一些数据模型中,它们将节点和边称为主语-谓语-宾语的三元组。在其他一些数据模型中,它们将其称为实体-关系-实体三元组。你们中的许多人可能已经看到了类层次结构,在类层次结构中,节点是类,边由子类或子集关系标记。在这三个例子中的每一个,有向标记图都是底层表示的数学表征,而与节点和边相关联的名称则依赖于数据模型、预期用途或应用程序上下文。

定义意义
现在让我们举一个有向标记图的具体示例,我们在其中捕捉到了阿特和鲍勃之间的友谊。这个小知识图说“阿特是鲍勃的朋友”。
出现的第一个问题是,我们如何将意义与这些节点和边联系起来。关于节点,我们可以说阿特和鲍勃代表现实世界中的人。关于“朋友”关系,我们可以通过简单的英语描述来定义其含义,或者我们也可以说,我们将把阿特和鲍勃之间的朋友联系定义为:如果在Facebook等社交网络上,阿特向鲍勃发送了一个好友请求并且鲍勃接受了这个请求,那么这种关系就成立。这是定义意义的一种方式。

在子类关系的情况下,节点是抽象概念,它们不是现实世界中的个体。在这些情况下,大多数情况下,含义是使用文档定义的。如果你想更深入,你可以使用某种逻辑语言,对这些节点中每个节点的含义以及它们之间的关系进行逻辑规范。
这里的要点是,有许多不同的方法来定义节点和边的含义。含义可以根据现实世界中发生的事情来定义,它们可以被捕捉在用人类可理解的语言写的解释中(例如语言资源或WordNet)。含义可以使用一组公理或规则作为逻辑规范来定义。我们还可以用一组例子来定义意义。例如,在我们的知识图中,我们有一个叫做“猫”的概念,我们可以把很多猫的图像和那个节点联系起来,并说这个概念的意义是这些图像中传达的东西。
最近,人们对使用嵌入来捕捉意义很感兴趣,这是基于语料库统计。我们将在稍后的讲座中讨论嵌入。但我想在这里传达的主要是,有许多不同的方法来捕捉意义。事实上,计算捕捉意义的不同方法是计算机科学许多领域(包括人工智能和数据库系统)问题的一部分。我在这里列出的每一种方法都是不同的捕捉意义的方法,它们有一定的用途,在某些情况下是有用的。这些方法是不完整的,它们加在一起也不能完全理解意义。
毫不奇怪,在计算机科学中,特别是在知识表示和数据库系统中,有丰富的工作历史来研究捕捉意义的不同方法。在知识表示方面,最早的方法是使用一种叫做语义网络的符号,它本质上是一个有向标记图。语义网络进一步演变成描述逻辑,同时也有一种叫做概念图的表示技术的平行发展。在数据库系统的并行轨道上,早期的数据库系统具有网络结构,最终演变成今天很流行的关系数据库系统。也许与知识图最相关的工作是关于三元组存储的工作,当数据模型本质上是一组三元组时,人们试图研究相关技术。
所以这里的重点是,捕捉意义或将信息存储为三元组的企业,它有着丰富的历史,这本身并没有什么新鲜事。

为何兴趣重燃?
我希望接下来解释这个领域的新情况,以及为什么人们的兴趣死灰复燃。我将举三个例子来做到这一点:搜索引擎、数据集成和人工智能。

搜索引擎中的应用
为了解释知识图在搜索引擎中的应用,我举一个由丹尼·雷奇介绍的例子。我称之为“冬季旅游”的例子。
我们打开最喜欢的搜索引擎,键入“苏黎世冬季之旅”,我们得到一组结果。第一个结果碰巧是一个维基百科页面,然后有一组图像。我们可以点击第一个结果,这将把我们带到冬季之旅的实际维基百科页面。现在,搜索结果有趣的地方在于,在某个区域,它们也展示了一些事实。事实证明这些事实来自维基百科。如果你去冬季之旅的维基百科页面,你将能够看到这些事实直接来自维基百科中所谓的信息框。所以在这种情况下,搜索引擎足够聪明,意识到这类结构化信息是人们感兴趣的,它能够提取这些信息,并将其作为搜索结果的一部分显示出来。用这种方式,搜索结果正在使用维基百科中可用的结构化数据进行增强。
然而,这个例子只是使用结构化数据实际可能发生的事情的冰山一角。现在让我们来看看冰山。
让我们在维基百科页面向下滚动冬季之旅,在页面底部有一个部分提到了“双子镇”,列出了四个双子镇。现在,与冬季旅游完全无关,如果你在维基百科搜索一个叫“加州安大略”的小镇,在它的页面上,我们看到这个地区被称为“友好城市”。这里提到了冬季之旅。现在到底发生了什么?如果我们理解“友好城市”和“双子镇”的含义,我们知道它们是相同的概念。但是安大略省页面上提到的冬季之旅,并没有来自冬季之旅页面本身的后退指针。没有简单的方法来自动解决这个差异。理想情况下,我们希望这个参考资料是对称的。这是一个问题。
解决这个问题的一个可能的方法是Wikidata,这是一个巨大的公共策划的知识图。让我们看看Wikidata是如何解决这个问题的。如果我们搜索冬季旅游的信息,我们得到这样的页面。如果我们向下滚动,会发现一个称为“孪生管理机构”的关系,其中提到了安大略省。另一方面,如果你去安大略省的维基数据页面,有一个类似的部分“孪生行政机构”,这表明冬季之旅的关系是系统的。
现在到底发生了什么?下面有一个有向标记图表示,其中冬季之旅和安大略省是节点,两者之间有“孪生行政机构”的联系。它本身并不那么有趣,但更有趣的事实是,冬季之旅和安大略省都与许多其他事情联系在一起。例如,它是苏黎世大都市区的一部分,它在瑞士;安大略省在美国,它是北美的一部分,等等。
但冰山不止于此。原来网上还有很多其他组织使用Wikidata标识符发布数据。其中一个碰巧是国会图书馆,他们发布了很多关于维克多·图尔的信息。因为他们使用相同的标识符,我们很容易把这些信息与Wiki数据中可用的信息联系起来。网上还有很多其他来源在做同样的事情,它们链接到维基数据,并在它们之间建立联系。这是一个日益增长的运动。

真正强大的是,结构化数据可以对其运行查询。例如,如果你有一个查询,比如“在地图上显示在冬季旅游中死去的人的出生城市”,只使用一个地方的可用信息运行此查询并不容易。它要求我们在Web上查询多个数据源,要求我们理解它们的模式。为理解模式所做的一种努力被称为Schema.org,它致力于创建一个可用于在Web上发布数据的共享词汇表。借助来自Schema.org的共享词汇表,在网上查询这些来源的信息要容易得多,并将结果呈现在网上。这在今天是不可能的,但这个例子的全部意义是,如果我们能够利用知识图,将能够提高出现在Web上的搜索结果的质量。
现在你可能会问这有多真实。我没有关于Wikidata的确切最新数据,但一年前,它有超过8000万个对象,超过十亿的关系,它链接到超过4800个不同的公共目录。维基数据是当前链接到的目录之一。
在给出这个例子后,让我退后一步,强调这个知识图的一些独特之处,也指出今天可用的这些知识图有什么新的东西。
首先,这是一张规模空前的知识图表。我们从来没有交涉过Wikidata中存在的有向标记图表示的规模。第二,这个图表不是由一个人创建的,它是通过社区努力创建的。Wiki Data有一个帮助创建这些数据的策展人社区。还有其他组织,如国会图书馆,正在发布连接到Wiki数据的数据。维基数据中的数据很多都是手工制作的,也有很多是自动创建的(例如来自维基百科的解析或其他提取工具)。有多种方法可以将数据放入Wiki数据中。
然后是对意义的明确关注。通过Schema.org,有一项明确的努力正在进行中,以确保正在使用的标签有明确的含义。当然,肯定有一些正在使用的关系没有明确的含义,但是我们必须认识到,我们必须能够理解、同意并指定我们正在使用的关系的含义,这样我们就可以用它们来推断。
最后,这个知识图中的数据有一个明确的引人注目的用例。在这种情况下,碰巧是网络搜索,拥有数十亿用户和数十亿次查询。这本身就足以证明其存在和发展的必要性。但是Wikidata还有其他用例,有一些组织正在将Wikidata中的信息用于多种目的。
数据集成中的应用

接下来,我将讨论知识图在数据集成上下文中的使用。我举一个例子,我称之为“360度的顾客视角”。
有很多组织有成千上万的客户,许多公司拥有数百万客户,并希望有效地管理这些关系。他们想有一个关于他们客户的完整视图。其中一些信息在他们内部的IT系统中,但其中一些存在于外部。现在有很多以商业方式出售此信息的数据提供者。

这里有一个例子,Pitch Book是一种数据提供商服务,它整理关于谁在资助哪个初创公司、资助了多少钱等信息。FactSet是另一个数据源,它管理关于供应链网络的信息,比如哪个供应商向哪个客户供货。
现在考虑一个应用程序,例如风险分析,在那里你正在做出一些贷款决定。知道特定公司的客户或供应商的情况如何,这种信息可能非常有用。但是要有效利用这些信息,他们必须能够将外部信息与他们内部现有的信息关联起来。类似地用于商业智能目的,如果他们想进行定向营销,例如针对最近筹集了大量资金的初创企业,他们需要宣传册上的信息,但他们必须能够将它与他们对内部客户的了解结合起来。
所以解决这个问题需要进行数据集成,他们必须能够结合来自这些不同来源的信息。
数据集成是一个已经存在很长时间的问题,人们已经在这方面工作了几十年。解决数据集成问题的核心挑战是,我们必须在这些多个来源之间进行数据转换,我们必须能够找出一个模式的哪些元素映射到不同模式中的哪些元素,我们必须能够定义那些映射,或者我们必须有一个共享的模式,所有这些源都被映射到其中。
但是为什么知识图因成为数据集成而变得流行或有趣?它们变得有趣的一个原因是,它们提供了一种无模式的数据集成方法。所以你要做的就是,从多个源获取关系数据,把它转换成三元组,将其存储在图形数据库中,你就有了集成的第一个版本。有些人甚至把这种简单的翻译称为知识图。但严格地说,这意味着你还没有真正解决问题,你只是将数据从一种格式转换为另一种格式。
但有趣的是,在本例中,定义延迟映射的艰苦工作,直到你真正需要它。这是更普遍的主张,即“按需付费”的基础数据集成。当你有一个特定的商业问题时,你去你的三元组存储看看你需要什么新的联系,让你经历建立这些联系的痛苦和代价,然后一旦你建立了这些联系,你就有即时价值。
那么,知识图或无模式的数据集成方法所做的,是降低了进入的门槛,你可以很快开始。有些人会说,当你使用知识图进行数据集成时,数据可视化更容易,它为图遍历优化。这些论点有一些可取之处,我们将在本系列的后面更深入地研究这些方面。但现在重要的是要明白,知识图已经成为数据集成的一种流行方法,因为它们减少了进入的障碍。

人工智能中的应用
现在我们来谈谈知识图是如何在人工智能中使用的。我将把它分解为使用知识图来表示输出,以及将知识图用于机器学习的输入。

首先,我们将以自然语言处理为例。给定一个简单的句子:“爱因斯坦是德国出生的理论物理学家,他发展了相对论。”我们可以在上面运行实体提取任务并识别像阿尔伯特·爱因斯坦、相对论等实体。当然,实体提取比这更普遍,因为它还可以提取数字、日期、时间间隔等。但在大多数情况下,实体提取最常见的是提取名词短语。
显然我们不仅想做实体提取,我们还想要提取实体之间的关系。所以给了这样一句话,我们可以提取关系,例如“爱因斯坦出生于德国”、“职业是理论物理学家”、“他发展了相对论”。考虑到这些关系,将提取的信息表示为知识图是很自然的。
现在我们不想只是构建这个知识图,我们想用它来推断。我们想把意义和标签关联起来,这样我们就可以做问题回答,可以做常识性推理并得出结论,比如“阿尔伯特·爱因斯坦是物理学家”、“阿尔伯特·爱因斯坦开发了物理学新知识”等。我知道有些在NLP领域的人说,我们不需要指定这些标签的含义。但真正的问题是,你想用它们来做推理,所以不管怎样,你必须描述这些标签的含义,以及使用图形表示可以或不能得出什么结论。
接下来,让我们来看看计算机视觉问题。给定一张照片,我们想看看这张图片中存在什么对象,这是标准的对象检测任务。接下来我们想看看这些物体是如何相互关联的。所以在这张照片中我们可以看到一个男人戴着眼镜,一个人在喂马,马正在桶里吃东西,等等。计算机视觉在识别像这样的关系方面越来越好。但就像在NLP案例中一样,我们对仅仅用这样的图表示这些信息不感兴趣,我们希望能够用它来进行推理或视觉问答。对我们来说,能够进行系统的视觉问答,我们要担心这些标签的含义是什么,以及我们可以或不能用它们得出什么推论。

现在让我们把注意力转向知识图是如何用于机器学习的输入的。当前的机器学习算法需要数字输入。例如,你把某些数据输入回归模型或神经网络,你需要给它一组数字。但如果你要使用这些模型中的任何一个进行实体提取或关系提取,我们得给它们数字,但我们有的是文字。所以我们需要想出一些方法把我们的符号词转换成数字,这样它们就可以喂进这些学习模型。
所以单词嵌入和图形嵌入是已经变得非常流行的技术,用于将符号表示转化为数值表示,作为机器学习模型的输入。我会试着给你这些的直觉。
最初,单词嵌入发展到提供计算单词相似性的工具。例如,如果你想看“喜欢”和“享受”是否相似,我们需要一些方法来自动计算这个。但在一段时间内,人们发现这些单词嵌入通常对于各种语言理解任务是有用的。单词嵌入背后的关键思想是通过计数一个词出现在其他单词旁边的频率来捕捉单词的含义。
让我们把它具体化。假设我们有一个语料库,只有这三句话:“我喜欢知识图”,“我喜欢数据库”,“我喜欢跑步”。从这个语料库,我可以像这样计算数字。例如,在第一行,第二列,这个数字是2,因为“喜欢”在“我”旁边出现了两次。“享受”这个数字是1,因为“享受”只出现在“我”旁边一次。我可以类似地计算其他位置的数字,并创建你在这里看到的表单的矩阵。给定这样的矩阵,我们通常把它叫做共现计数矩阵。我们说一个词的意思是由对应于每一行共现计数的向量捕获的。所以在这种情况下,“我”的意思是由这第一行数字捕获的。如果你想计算两个单词之间的相似性,我们简单地计算两个向量之间的距离。
这里的关键洞察力是,我们已经把符号文字变成了数字,现在我们有了数字,可以输入我们的学习算法。现实当然比这个故事复杂得多,因为我们的文本语料库不会只有三个句子,它将有数十亿字。如果你用我刚刚解释的朴素方法,存储需求会激增。在实践中,你必须进行降维。典型的字向量表示大小通常在两百维左右。还有其他技术,如奇异值分解,以及自动学习如何选择我们要代表一个词的那200个数字的技术。有一整条航线致力于如何很好地完成不同形式的单词嵌入。在实践中大量使用单词嵌入,例如,如果你进入搜索引擎开始打字,它开始预测你接下来可能键入的东西,这本质上是由单词嵌入驱动的语言模型。
现在让我们把注意力转向图嵌入。图嵌入的一个流行应用领域是推荐。所以如果你在电子商务网站上,这些公司对向顾客推荐他们应该买的其他东西感兴趣。他们有很多类似客户购买的历史数据。在过去,这些数据以图形形式存在。在这个图中,每个节点都是一个产品,两个产品之间有一条边,如果这些产品往往是被一起购买或互相推荐的。但本质上这是一个象征性的结构。机器学习非常擅长预测事情,但你必须给它数字输入。但如果你想利用这种存在于符号形式的历史趋势,用机器学习来做预测,我们得把它转换成某种数字形式。
所以这里的问题和目标与我们的NLP案例类似。我们必须能够把这个离散的符号结构转换成向量,这样我们就可以计算节点相似性,计算节点之间的差异,并把它们作为输入进入机器学习算法。
要理解这一点,我要打个比方。既然我们已经明白了我们是如何计算单词嵌入的,我们可以说,我们处理的句子可以看作是一个线性图,其中每个节点是一个词,词与词之间有一个边缘。我向你展示的单词嵌入计算可以被视为在这个线性图上的嵌入。所以这个类比真的很有帮助,因为它帮助我们立即看到如何将离散图变成一条线性路径。我们所要做的就是随机地在图上行走,每次我们随机走图表,我们会得到一个线性路径。然后在线性路径上,我们可以数出哪些节点彼此共存的频率,我们可以建立一个共现计数矩阵,就像我们做单词嵌入那样。

鉴于这种方法,我们可以计算图嵌入,实际上是节点的嵌入,它们被称为节点嵌入。给定这些节点嵌入,我们可以很容易地计算出节点相似性以及它们之间的接近程度。正如我提到的,图嵌入这个词通常指整个图的嵌入。如果要计算整个图的嵌入,一个简单的方法是取单个节点嵌入的总和,它给出了整个图的嵌入。
现在,我应该说,我呈现给你的是一幅天真简单的画面,因为我想在这里传达直觉
课程 P10:L7 - 如何从结构化数据中构建知识图谱 🗂️
在本节课中,我们将要学习如何从结构化数据源(如数据库表格)中构建知识图谱。我们将重点探讨两个核心问题:模式映射和记录链接,并了解解决这些问题所需的技术和挑战。
概述
大型组织通常拥有大量内部结构化数据,例如客户档案、产品信息和交易记录。同时,外部也存在许多结构化数据源,如财经新闻摘要或供应链关系数据。为了获得关于某个实体(如客户)的完整视图(即“360度视图”),我们需要将这些内外部信息整合到一个统一的知识图谱中。这个过程本质上是一个数据集成问题,其核心挑战在于如何将不同来源的数据在语义和实例层面关联起来。
模式映射
上一节我们介绍了从结构化数据构建知识图谱的整体挑战。本节中,我们来看看第一个核心问题:模式映射。模式映射是指将不同数据源的模式(即数据结构定义)与目标知识图谱模式进行对齐的过程。
面临的挑战
在实际操作中,模式映射面临诸多挑战:
- 数据模式可能非常复杂且难以理解,表名和列名可能含义不清。
- 原始系统的开发者可能已离职,导致无人完全理解数据的含义。
- 映射关系可能不是简单的一对一,需要应用特定的业务逻辑进行转换。
- 虽然人们希望自动化此过程,但在模式层面,可用于训练机器学习模型的数据非常稀缺,因此完全自动化非常困难。
一个具体示例
假设我们有两个关于产品的数据源:
- 源1 (Cookware):包含
ID,Type,Material,Price。 - 源2 (Product):包含
ProdID,ProdName,ProdType,Cost。
我们的目标是将它们集成到以下知识图谱模式中:
- 节点类型:
产品、供应商。 - 属性:产品有
类型、价格;供应商有名称。 - 关系:
有供应商连接产品与供应商。
为了完成这种映射,我们可以使用 Datalog规则 来声明转换逻辑。Datalog规则由头部和体部组成,用 :- 分隔。
以下是示例规则,用于将源1的数据映射为知识图谱的三元组:
产品类型(ID, 大写类型) :- Cookware(ID, 类型, _, _), 大写类型 = upper(类型).
产品价格(ID, 价格) :- Cookware(ID, _, _, 价格).
有供应商(ID, ‘供应商_1’) :- Cookware(ID, _, _, _).
类似地,我们可以为源2编写映射规则。通过规则引擎执行这些规则,即可自动将数据加载到知识图谱中。
模式映射的技术
编写映射规则通常需要人工参与,但有一些技术可以辅助和加速这个过程:
以下是几种常见的模式映射启发式方法:

- 基于语言的方法:利用名称的相似性进行匹配。例如,进行词干提取(如“customer_name”与“cust_name”)、使用同义词库(如“car”与“automobile”)、利用公共子字符串(如“AmtReceivable”与“ReceivableAmt”)甚至比较字段的文档说明。
- 基于实例的方法:观察数据的特征。例如,如果两个字段的值都符合邮政编码或电话号码的格式,则它们可能指向同一类属性。
- 基于约束的方法:检查数据值遵守的约束。例如,如果两个字段的值范围都在100到200之间,这可能暗示它们语义相似。
请注意:这些技术本质上是启发式的猜测,其建议的映射最终需要人工验证。自动化程度取决于应用对准确性的要求。


记录链接

在解决了模式映射问题,建立了统一的数据视图之后,我们面临下一个挑战:记录链接(也称实体解析)。记录链接旨在判断来自不同数据源的记录是否指向现实世界中的同一个实体。


问题与挑战
例如,源A中有一条记录“Acme Corp, 123 Main St”,源B中有一条记录“Acme Corporation, 123 Main St.”。记录链接需要判断它们是否代表同一家公司。主要挑战在于:
- 推断不精确:缺乏唯一标识符(如D-U-N-S编号)时,判断具有模糊性。
- 计算规模巨大:可能需要比较数百万甚至数十亿对记录,计算开销难以承受。


记录链接算法:分块与匹配
为解决规模问题,记录链接通常采用两步流程:分块 和 匹配。
- 分块:使用一种快速、粗略的启发式方法,将可能匹配的记录分组到同一个“块”中,从而大幅减少需要详细比较的记录对数量。例如,可以按“州”字段进行分块,这样只需比较同州的公司。
- 匹配:在分块产生的候选记录对中,使用更精确(也可能更耗时)的方法进行详细比较,最终决定它们是否匹配。
分块和匹配步骤在算法结构上类似,核心区别在于所使用的比较规则的复杂度和成本。
基于主动学习与随机森林的方法
一种有效的方法是使用 随机森林 作为匹配规则,并通过 主动学习 来构建它。
- 随机森林:由多个决策树规则组成。每条规则基于一组相似度度量(如编辑距离、Jaccard相似度、余弦相似度)的组合来判断两条记录是否匹配。
- 示例规则:
IF 编辑距离(公司名A, 公司名B) < 3 AND Jaccard相似度(地址A, 地址B) > 0.8 THEN 匹配。
- 示例规则:
- 主动学习流程:
- 系统随机选择少量记录对,由用户标注它们是否匹配。
- 系统计算这些记录对的各种相似度特征,并训练一个初始的随机森林模型。
- 模型用于预测未标注的记录对,系统挑选出模型最不确定或预测结果可能最有价值的样本,再次请求用户标注。
- 重复迭代此过程,直到模型性能达到稳定。最终规则集仍需用户验证。
实现效率
为了处理海量数据,必须高效应用分块和匹配规则。这通常依赖于巧妙的索引技术。例如,如果一条规则要求“产品名称的Jaccard相似度>0.7”,我们可以预先计算并索引产品名称的长度或单词数,快速过滤掉不可能满足条件的记录对,从而避免不必要的详细计算。

结构化数据清理 🧹


在讨论了数据集成(模式映射与记录链接)之后,我们转向另一个密切相关且至关重要的问题:结构化数据清理。真实世界的数据往往充满错误,如拼写错误、缺失值、异常值以及违反业务规则(完整性约束)的情况。高质量的知识图谱构建依赖于干净的数据。

数据清理的挑战

为什么自动化数据清理如此困难?
- 数据稀疏性:与图像、视频等高冗余数据不同,结构化数据(尤其是知识图谱)的维度高、数据点稀疏,机器学习模型难以从中学习稳健模式。
- 错误多样性:错误类型繁多(如拼写、交换、缺失),且标注数据(即已知的错误示例)极少,难以训练监督模型。
- 依赖背景知识:修复数据通常需要理解领域约束和数据间的复杂关系。
全息清理:一种生成式模型方法
“全息清理”方法将数据清理视为一个推断问题。其核心思想是:我们观测到的脏数据是由一个干净的“真实”数据,经过一个“噪声信道”引入错误后产生的。我们的目标是反向推断出最有可能的干净数据。
该方法通过概率图模型(如因子图)实现:
- 将知识图谱中的每个属性(或关系)视为一个随机变量。
- 将领域知识(如完整性约束、函数依赖)作为“因子”引入模型,这些因子定义了变量间应该如何关联(例如,“城市相同则邮编应相同”)。
- 通过机器学习学习这些因子的权重,从而得到一个能理解数据如何生成的生成模型。
- 推理时,模型可以回答诸如“给定上下文,这个缺失的邮政编码最可能是什么?”或“这个观测值是否很可能是错误的?”等问题,从而实现数据修复、缺失值填补和错误检测。
结合深度学习的上下文表示
为了更有效地捕捉上下文信息,现代方法会引入基于注意力的神经网络模型:
- 模型学习为数据表中的每个值(单元格)生成一个表示向量。
- 在模式级别学习注意力机制,以判断在预测某个目标属性(如“县”)时,其他属性(如“城市”、“邮编”、“年龄”)的重要性各是多少。
- 通过聚合加权的上下文表示,模型能够对缺失或可疑的值做出更准确的预测。
实际应用与优势
这类生成式预测模型的应用超越了传统清洗:
- 知识补全:预测知识图谱中缺失的关系或属性。
- 错误检测:通过比较模型的预测值与实际观测值,发现潜在错误。
- 优先级排序:模型对其预测不确定的案例,可标记出来供人工优先审查,优化质检资源分配。
其优势在于能够将领域知识(约束)与数据中的统计模式相结合,在数据稀疏的情况下仍能进行合理推断,并将清洗、修复、补全任务统一在同一个框架下。
总结
本节课我们一起学习了从结构化数据构建知识图谱的核心流程与挑战。
- 模式映射:解决了如何将不同来源的数据模式对齐到统一的知识图谱模式的问题。虽然存在自动化辅助技术,但高精度映射通常需要结合领域知识进行人工设计或验证。
- 记录链接:解决了如何判断不同数据源中的记录是否指向同一实体的问题。采用“分块+匹配”的两步策略来应对海量数据规模,并利用主动学习和随机森林等技术学习匹配规则。
- 数据清理:是构建可靠知识图谱的基础。我们介绍了一种基于生成式模型(如全息清理)的前沿方法,它将清洗、修复和知识补全视为统一的概率推断问题,通过结合数据规律与领域约束来提升数据质量。

构建知识图谱是一个系统工程,涉及数据集成、质量管理和语义理解等多个层面。理解这些基础问题和技术,是成功从结构化数据中提炼出有价值知识的关键第一步。

课程 P11:L8.1 - 自监督实体识别与消歧 🧠

在本节课中,我们将学习如何从文本中识别并消歧实体,特别是针对那些在训练数据中不常见的“长尾”实体。我们将重点介绍一种名为“Pirate”的系统,它通过利用知识图谱中的关系和类型信息,而非仅仅依赖文本记忆,来提升对罕见实体的识别性能。

概述
实体识别与消歧是从文本字符串映射到知识库中具体对象的过程。这对于下游应用(如智能助理、搜索引擎和关系抽取)至关重要。然而,传统方法在处理训练数据中罕见的“长尾”实体时面临巨大挑战。本节课将探讨如何利用结构化的知识图谱信号来克服这一难题。
实体消歧的挑战
上一节我们概述了实体消歧的重要性,本节中我们来看看其面临的核心挑战。实体可以根据其在训练数据中的出现频率,大致分为“头部实体”和“长尾实体”。
- 头部实体:如“华盛顿特区”,在训练数据中频繁出现,现有基于BERT等语言模型的方法能较好处理。
- 长尾实体:如某些小众歌曲或人物,在训练数据中极少甚至从未出现,传统方法难以消歧。
在工业场景中,大多数用户查询恰恰涉及这些罕见实体。即使在维基数据这样的知识库中,也只有约13%的实体在维基百科中有对应文本描述,这使得依赖文本记忆的方法效果有限。
公式:模型性能与实体出现频率的关系可以近似表示为:性能 ≈ f(出现频率),其中对于长尾实体,f(出现频率) 趋近于0。
消歧系统的核心模式
要理解如何改进对长尾实体的消歧,我们需要了解系统可以依赖的几种推理模式。
以下是三种关键的推理模式:
- 文本记忆模式:关联特定实体与共现的文本短语。例如,“史蒂文·斯皮尔伯格的电影”强烈指向电影《林肯》。这种模式判别性强,但无法推广到未见过的实体。
- 知识图谱关系模式:利用实体间结构化关系进行推理。例如,已知“维多利亚·米切尔”与“大卫·米切尔”存在“配偶”关系,可以帮助在上下文中确定具体指代。这种模式具有可推广性。
- 类型模式:利用实体的类别信息。例如,“高度”通常描述“人”,“价格”通常关联“公司”。了解类型常识有助于消歧,同样具有可推广性。
这些模式构成了一个层次结构,其中文本记忆判别力最强但泛化性最弱,而类型和知识图谱关系模式则能更好地支持对罕见实体的推理。
Pirate 系统架构
上一节我们介绍了消歧依赖的几种模式,本节中我们来看看 Pirate 系统如何具体实现对这些模式的利用。Pirate 系统的工作流程遵循标准的实体链接管道,但在实体表示和模型设计上进行了创新。
系统主要流程如下:
- 候选生成:从知识库中检索与句子相关的实体候选集。
- 实体表征构建:为每个候选实体构建包含其唯一标识符、类型和知识图谱关系的“实体负载”。
- 神经模型消歧:模型结合句子上下文和实体负载进行推理,输出最可能的实体。
实体负载的构建
Pirate 系统的关键在于如何构建实体的向量化表示(实体负载),以编码类型和关系信息。
代码:实体负载的构建可以概念化地表示为:
# entity_embedding: 实体ID -> 向量
# relation_embedding: 关系 -> 向量
# type_embedding: 类型 -> 向量
def construct_entity_payload(entity_id):
payload = []
payload.append(entity_embedding[entity_id]) # 实体本身嵌入
for rel in get_relations(entity_id): # 添加所有关系嵌入
payload.append(relation_embedding[rel])
for typ in get_types(entity_id): # 添加所有类型嵌入
payload.append(type_embedding[typ])
return combine(payload) # 合并为一个实体负载向量
通过共享的关系和类型嵌入,模型可以将从常见实体上学到的模式,迁移到具有相同关系或类型的罕见实体上。
神经模型与知识图谱模块
Pirate 使用基于 Transformer 的架构,并引入了一个特殊的知识图谱模块。
模型接收句子嵌入和实体负载作为输入,通过两个Transformer块分别学习实体间共现模式和实体-句子间的文本模式。随后,知识图谱模块允许在知识图中直接相连的实体之间传递表示。例如,如果模型确信句子中的“Seal(歌手)”是正确的,那么这个高置信度的表示可以传递给与其在知识图谱中相连的配偶“Heidi”,从而提高后者的得分。
训练技巧与数据
为了让模型更好地学习可推广的模式,Pirate 采用了两项关键训练技巧。
1. 基于流行度的正则化
为了防止模型过度依赖判别力强但泛化性弱的实体特定嵌入,我们引入了一种正则化方法:以与实体流行度成反比的概率,将该实体的嵌入向量置零。这意味着:
- 对于常见实体,嵌入较少被置零,模型可以继续利用其丰富的文本信息。
- 对于罕见实体,嵌入更常被置零,从而迫使模型更多地依赖共享的关系和类型嵌入进行推理。
这项技巧显著提升了对未见实体的消歧性能。
2. 训练数据精炼
我们利用维基百科的“内部链接”作为自动标注的训练数据。此外,通过弱监督方法(如利用页面内自指提及的启发式规则)自动标注更多提及,将训练数据规模扩大了约1.7倍,进一步增强了模型对结构模式的学习。
实验与评估
我们通过实验验证 Pirate 系统的有效性,特别关注其在长尾实体上的性能。
在标准基准测试中,Pirate 达到了具有竞争力的性能。然而,真正的优势体现在对“未见实体”的消歧上:相比仅依赖文本记忆的基线语言模型,Pirate 在 F1 分数上取得了超过40个百分点的巨大提升。
为了更细致地评估,我们进行了基于子群体的分析:
- 知识图谱关系子集:Pirate 表现远超基线,证明了其利用关系进行推理的能力。
- 类型子集:同样观察到显著提升。
- 实体特定子集:优势主要来自对头部实体的更好处理。
此外,将 Pirate 学习到的实体嵌入应用于关系抽取任务,也能帮助模型更好地理解实体间的语义关系,证明了其表征的有效性。
总结
本节课中我们一起学习了自监督实体识别与消歧的核心挑战与解决方案。我们了解到:
- 处理“长尾”罕见实体是现实应用中的关键难题。
- 利用知识图谱中的关系和类型等结构化信息,而非仅仅依赖文本记忆,是实现泛化的关键。
- Pirate 系统通过构建融合结构信息的实体负载、设计特殊的知识图谱模块,以及采用基于流行度的正则化等训练技巧,有效提升了对罕见实体的消歧能力。
- 该方法不仅是有效的,而且易于扩展,能够形成从文本中构建和丰富知识图谱的闭环。

通过本节课,希望你能够理解如何利用结构化知识来增强自然语言处理模型,特别是在数据稀疏场景下的鲁棒性。
注:本教程内容整理自相关讲座,Pirate 系统为开源项目,更多细节可通过其官方渠道获取。

课程 P12:L8.2 - 网络知识图谱中的指代消解 🧠

在本节课中,我们将要学习网络知识图谱中的指代消解问题。我们将探讨其核心概念、面临的挑战、现有的解决方案以及未来的研究方向。课程内容将涵盖从链接数据的基本原理到实现大规模实体解析的完整技术栈。

概述:从链接文档到链接数据 🌐
我们正在经历一个转变:从传统的链接文档网络,转向一个链接数据的网络。这并不意味着文档网络被取代,而是数据网络与之并存。一个关键的例子是谷歌知识图谱,但在此之前的2011年,已有“链接开放数据”运动兴起。
链接开放数据运动发展迅速,从最初的12个RDF数据集,发展到如今涵盖数千个数据集、数百万个节点的庞大网络,领域横跨媒体、出版物、生命科学等。
蒂姆·伯纳斯-李在2001年发表于《科学美国人》的论文中,提出了“语义网络”的愿景,这可以被视为从文档网络到数据网络转变的蓝图。
什么是链接数据?🔗
链接数据并非指数据本身,而是在网络上发布和连接结构化数据的一套最佳实践。其中一项核心原则是:在网络上发布数据时,必须将其连接到现有的数据集。这看似是常识,但在实践中,许多数据集发布时并未与网络上的其他数据建立连接。
为了便于理解,我们将使用一个贯穿全课的示例:
- 在左侧,我们有来自 Freebase 的知识图谱片段,描述了“微软”由“保罗·艾伦”共同创立。
- 在右侧,我们有来自 DBpedia 的对应片段。
- 两者之间存在差异,例如类型(“公司” vs “组织”)、属性(“共同创立者” vs “组织”)等。这个例子将帮助我们理解后续讨论的许多问题。
RDF:网络知识图谱的数据模型 📊
RDF(资源描述框架)是语义网社区中用于在网络上发布知识图谱的重要数据模型。
一个RDF数据集是一组三元组的集合,可以可视化为一个有向标记图。每个三元组具有 (主语, 谓语, 宾语) 的结构。
- 主语 和 谓语 必须是 URI(统一资源标识符)。
- 宾语 可以是 URI 或字面量(如字符串、数字)。
这种设计使得知识图谱能与网络文档明确连接(点击URI可跳转到描述页面)。链接数据的最佳实践之一就是以RDF等标准格式发布知识图谱。
在表示上,freebase:Microsoft 这样的前缀是完整URI的简写形式。
实体解析:核心问题与挑战 ⚙️
上一节我们介绍了知识图谱的数据模型,本节中我们来看看如何将不同来源的知识连接起来。
实体解析 的核心算法问题是:识别并连接那些指向相同底层实体的实体对。例如,将 Freebase 中的“Microsoft”与 DBpedia 中的“Microsoft (company)”连接起来。
在语义网中,我们可以使用 owl:sameAs 这样的谓词来声明两个资源是相同的。这种声明是对称的,并且推理引擎可以利用它进行推导。
然而,实体解析在术语上存在“实体解析问题”:它也被称为实例匹配、实体匹配、记录链接、重复数据删除等。这些术语来自不同社区(NLP、数据库),但本质上描述的是同一个基本问题。
我们为何需要实体解析?🎯
我们有一个宏大的愿景:构建一个 实体名称系统。这类似于互联网的DNS(域名系统),但作用于更高级别的实体概念。
理想情况下,对于网络上的每个实体(如“保罗·艾伦”),我们都有一个唯一的标识符,并将网络上所有指向该实体的不同描述链接起来。这不会消除其他描述,而是将它们关联起来,从而将整个网络视为一个全局数据库。这是实现蒂姆·伯纳斯-李“语义网络”愿景的关键,能解锁大量应用。
为了实现这个愿景,我们需要满足一系列要求。这些要求也构成了我们评估进展的路线图。
实体解析的四大核心要求 🎯
观察我们的运行示例,我们可以提炼出在Web规模上实现实体解析必须满足的四个核心要求:
-
处理异质性:知识图谱在元数据层面存在差异。
- 类型异质性:例如,一个图谱用“公司”,另一个用“组织”。这需要子类型或超类型匹配。
- 属性异质性:例如,“共同创立者”与“组织”属性,其语义需要被理解和匹配。
-
领域独立性:解决方案应能应用于任何领域(如出版物、生物医学),而不仅限于像维基百科这样覆盖广泛的跨领域数据集。许多领域存在“长尾”实体,没有维基百科页面。
-
自动化:由于数据量巨大,完全人工标注不可行。我们需要最小化人工劳动,实现(半)自动化。
-
可扩展性:算法必须能够处理包含数百万甚至数十亿节点的知识图谱,这意味着计算复杂度必须是可控的。
关键挑战在于同时满足这四个要求。文献中的许多方案可能满足其中一两个,但很难找到能同时处理三到四个的方案,因为这其中存在真实的权衡(例如,复杂自动化算法可能难以分布式扩展)。
实现实体解析的技术步骤 🛠️
上一节我们明确了目标和挑战,本节中我们来看看解决实体解析问题通常需要哪些具体步骤。
以下是处理Web规模知识图谱实体解析的关键步骤:
-
类型对齐:首先需要匹配不同知识图谱中的类型(如“企业家”和“发明家”)。可以使用无监督方法,例如基于类型所涵盖实体的嵌入进行聚类。
-
属性对齐:在匹配的类型对中,进一步识别匹配的谓词(属性)。这比类型对齐更复杂,因为属性间的关系可能是“相同”、“子集”或“重叠”。
-
分块:为了避免在N个和M个节点间进行N*M次昂贵的两两比较,需要先进行分块。分块函数(如基于名称的哈希)将可能匹配的实体分组到同一个块中,后续只需在块内进行详细比较。这能将比较次数从
O(N*M)降至O(N+M)级别。 -
相似度计算与链接:在每个块内,使用复杂的相似度函数(可能结合字符串相似度、图结构等)计算实体对的相似度,最终输出匹配对(链接)。

从监督到无监督的演进之路 📈

最初的基线系统采用监督学习方法:
- 输入:一组已标注的匹配和非匹配实体对作为训练集。
- 过程:系统学习属性对齐、分块键和相似度函数。
- 问题:训练集获取成本高,且模型难以迁移到新领域。
为了减少对训练数据的依赖,我们演进到少样本/自监督方法:
- 输入:仅需极少量(如数十个)种子样本。
- 过程:系统学习初步的属性对齐和分块,产生初步链接结果;然后利用这些结果作为反馈信号,重新训练和优化相似度函数,形成自监督循环,逐步提升性能。
最终目标是实现完全无监督。挑战在于如何自动生成初始的(带噪声的)训练集。我们提出了“自动种子生成器”的概念,它能从两个知识图谱自身生成一套有噪声的种子对。虽然初始噪声很大,但通过精心设计的算法循环,可以逐步消除噪声,最终获得高质量的链接。该方法已在多个领域验证有效。
在可扩展性方面,该架构可以迁移到 MapReduce 或 Spark 等分布式计算框架上运行,从而以较低成本(例如,处理百万级节点图谱仅需数百美元)实现Web规模的实体解析。
知识图谱的完整生态系统 🌳
实体解析只是知识图谱庞大生态系统中的一个环节。理解全景有助于定位不同技术的作用。
以下是构建和应用知识图谱的完整流程:
- 领域建模:设计或复用本体(如OWL),定义领域概念和关系。
- 数据来源:原始数据可能来自文本、表格、社交媒体等。
- 信息抽取:从非结构化数据中抽取实体、关系、事件。
- 实体链接:将抽取的实体链接到现有知识库(如维基数据)。
- 指代消解:在文本内链接共指提及。
- 知识图谱构建:形成初始的知识图谱。
- 实体解析:(本课重点) 合并来自不同来源的相同实体。
- 知识补全:使用嵌入学习、概率推理等技术预测缺失关系。
- 知识存储与查询:使用图数据库(如Amazon Neptune, Neo4j)存储和查询知识图谱。
- 应用层:基于知识图谱构建问答、推荐、可视化等最终应用。
总结与未来展望 🔭
本节课我们一起学习了网络知识图谱中的指代消解(实体解析)问题。
我们首先了解了从链接文档到链接数据的网络演进趋势,以及RDF数据模型。然后,我们深入探讨了实体解析的核心定义、其服务于“实体名称系统”的宏大愿景,以及同时满足异质性处理、领域独立性、自动化和可扩展性这四大要求的挑战。
接着,我们梳理了解决该问题的技术步骤:类型对齐、属性对齐、分块和相似度计算。我们回顾了从监督学习到少样本学习,再到无监督学习的技术演进路径,并看到了如何通过分布式计算实现可扩展性。
最后,我们将实体解析置于知识图谱完整的生态系统中审视,理解了它与其他环节(如信息抽取、知识补全)的关系。
未来的研究方向包括:
- 构建端到端、可扩展的完整知识图谱管道。
- 开发更好的知识图谱可视化与交互工具。
- 在系统层面(而非单一算法层面)进行整体性能评估与提升。
- 推动更多易用的开源工具开发。
实体解析是构建大规模、高质量、互联知识网络的关键技术,仍在不断发展和完善中。

📚 课程 P13:L9 - 如何从文本数据中构建知识图谱

在本节课中,我们将要学习如何从非结构化的文本数据中自动构建知识图谱。我们将首先概述从文本中提取信息以构建结构化知识表示所面临的挑战,然后介绍用于实体提取和关系提取的核心方法,特别是当前流行的语言模型技术。最后,我们将通过一个“智能教科书”的具体应用案例,来探讨这些方法在实际项目中的应用效果与面临的挑战。
🧠 第一部分:从文本构建知识图谱的方法
上一节我们概述了课程目标,本节中我们来看看从文本构建知识图谱的具体方法。我们将从问题概述开始,然后介绍一种通用的技术——语言模型,它可用于实体提取和关系提取任务,最后对本部分内容进行总结。
众所周知,大量有用信息存在于非结构化文本中,例如美国证券交易委员会文件、华尔街日报和金融新闻。如果我们能自动处理这些信息并构建知识图谱,就能在其上进行许多有趣的分析。进行此类处理的明显技术来自自然语言处理领域,特别是信息提取领域。但需要明确的是,本节课的重点不是深入讨论NLP,而是将其视为一个可用的工具,服务于构建知识图谱这一核心目标。
在第一节课中,我们展示了如何从句子中提取信息并用知识图谱表示。例如,给定句子“Albert Einstein was a German born theoretical physicist who developed a theory of relativity”,我们会提取诸如“Albert Einstein”、“Germany”、“theoretical physicist”等实体,以及“born in”、“occupation”和“developed”等关系,并用有向图将它们连接起来。
在从文本提取信息的整体范围内,我们面临实体提取和关系提取的问题。此外,还有实体消歧的问题,即同一实体在文本中可能以多种不同方式被指代。本节课将不涵盖实体消歧,部分原因是为了限定范围,部分原因是当前实体提取和关系提取任务本身在复杂问题上已足够困难。
对于这两项任务,当前的流行趋势是使用称为语言模型的技术。因此,我将首先简要描述什么是语言模型,然后在介绍实体提取和关系提取技术时,讨论语言模型目前如何被用于这些过程。
语言模型背后的核心概念是,它是一个能预测在单词序列中下一个应出现什么单词的工具或模型。例如,给定文本片段“students open their …”,语言模型的任务是填充“…”处的下一个单词,例如“books”、“laptops”或“exams”,并为每个预测的单词关联一个出现的可能性概率。
更正式地说,语言模型也可以被视为一个概率分布,给定一组单词 x1 到 xn-1,我们想要预测下一个单词 Xn。语言模型应用广泛,例如搜索引擎的查询补全和手机输入法的单词预测。如今,这些语言模型通常使用深度学习模型创建,循环神经网络是创建这些语言模型的流行方法。
有多种预训练语言模型的变体,其差异取决于训练数据、是单向还是双向模型以及所使用的特定神经网络架构。对于本课程,我们假设可以获取现成的语言模型,并能将其适配到我们手头的任务——构建知识图谱。
了解单向和双向语言模型之间的区别很有用。我之前给出的例子是单向语言模型,我们给定一个单词序列并预测下一个单词。在双向模型中,我们给定一个完整的句子,其中省略了一个特定单词,现在我们拥有该单词左右两侧的信息,并预测中间的单词。
近年来一个备受关注的语言模型是BERT,它最初由谷歌开发。最近,一个名为GPT-3的新语言模型引起了大量关注。
🔍 实体提取方法
现在,让我们专注于实体提取的具体问题。我将首先给出一个运行示例,然后概述进行实体提取的各种方法,并讨论使用自动实体提取时出现的挑战。
以这个句子为例:“Cecilia Love, 52, a retired police investigator who lives in Massachusetts, said she paid around $370 a ticket with tax for nonstop United Airlines flight to Sacramento from Boston for her niece‘s high school graduation in June 2020.” 给定这个句子,我们希望提取命名实体,其定义包括地点、公司、人物等,这里的实体定义通常也扩展到包括日期、时间和数字表达式,例如“$370”和“June 2020”。
任务是将上面的输入句子转换为如下所示的带标注版本。例如,“Cecilia Love”被标记为“PERSON”,“Massachusetts”被标记为“LOCATION”,“$370”被标记为“MONEY”,“United Airlines”被标记为“ORGANIZATION”。
通常,我们使用一组标签来标记句子中的实体,因为实体可能由多个单词组成。定义了五个标签来标记边界:B表示实体中的第一个单词,E表示实体中的最后一个单词,I表示实体中的内部单词,O表示非实体单词,S表示单单词实体。
在实体提取的广义方法上,主要有三种:序列标注方法、基于神经模型(即语言模型)的方法和基于规则列表的方法。我将对每种方法进行简要概述。
在序列标注方法中,我们采用标准的机器学习类型算法,例如条件随机场。我们为其提供训练数据,这些数据使用诸如词性、是否出现在命名实体主列表、词嵌入、单词前缀以及是否以全大写形式出现等特征。可以看出,如果使用任何类型的机器学习方法,都需要大量的特征工程。
现在,让我们谈谈使用神经模型进行实体提取。这里,我们将采用一个现成的语言模型,如BERT,并将其应用于我们手头的问题。这涉及两种步骤:任务无关训练和任务相关训练。
我们从现成获取的这些语言模型是在非常广泛的语料库上训练的。但通常,我们总是对特定领域或解决特定问题感兴趣。因此,任务无关训练的第一步是在我们感兴趣的领域上重新训练我们已有的模型,使其理解该特定领域的特殊性、词汇或出现的单词。
第二步是任务相关训练。在这种情况下,任务是实体提取。接下来我们要做的是在实体提取任务上训练我们的模型。具体做法是,我们将在句子中引入特殊标记。例如,在我们之前处理的句子中,我们有一个名为[CLS]的标记,表示实体的开始,以及[SEP],表示实体的结束。当我们训练一个包含这些标记的语言模型时,它将学习如何预测这些标记。我们可以通过现在要求它预测下一个标记是[CLS]还是[SEP]来重新调整语言模型的用途以用于实体提取任务。如果我们让它预测这些特殊标记,我们就知道实体边界在哪里,并可以利用这些信息来标记句子中的实体位置。
现在,让我们谈谈基于规则的实体提取。其基本思想是,我们将编写一组规则,告诉我们应如何提取实体。这些规则可以基于非常简单的正则表达式,或基于字典查找,或调用自定义提取器。但归根结底,就像在特征工程中一样,我们必须进行规则工程,必须对我们的领域有足够的了解以确定实体是什么,并且必须能够指定有助于提取实体的相关规则。
做好实体提取的困难之处显而易见。首先是歧义性,例如“Louis Vuitton”可以指公司、人物或产品。其次是训练数据获取、特征工程或规则工程是做好此过程的瓶颈。此外,某些领域存在非常特殊的变体,例如在生物学中,实体可能是很长的短语。在某些领域,必须提取非常通用的术语作为实体,例如“attach”或“bind”。最后,实体具有多种形式,例如单复数、缩写和形态变体。除非我们拥有大量的词汇知识,否则我们将无法确定它们都指向同一实体。如果希望实体提取器具有非常高的性能,我们还需要该领域有一个非常好的词典,以便准确区分实体的不同变体是否实际指向同一事物。
🔗 关系提取方法
上一节我们介绍了实体提取,本节中我们来看看关系提取的方法。同样,我将首先给出一个提取任务的示例,然后概述进行关系提取的各种技术,并讨论关系提取的难点。
示例与实体提取考虑的句子相同,现在我们希望提取诸如“Cecilia Love lives in Massachusetts”(“lives in”是关系)和“United Airlines flies from Boston”(“flies from”是关系)等信息。
一个非常流行的任务是提取维基百科中的信息,因为这对增强搜索结果非常有用。从维基百科提取事实大多是直接的,但存在许多边缘情况。例如,拉里·金的维基百科页面显示他结婚多次,每次婚姻都有时间跨度。如果一个人只结过一次婚,那么提取配偶关系就很简单,但当一个人结婚多次,有时甚至与同一个人结婚两次时,将适当的时间信息与你提取的事实关联起来很快就会变得非常复杂。
我在谈论实体时提到了特定领域的提取系统,关系提取同样存在这种情况。例如,在医学领域,他们主要对诸如什么事物导致什么疾病、什么药物可以治疗什么症状、什么酶或化学物质破坏什么过程等信息感兴趣,这些含义及其定义方式非常特定于生物学领域。
对于关系提取,也有三种广义方法:基于规则的方法、监督学习方法以及开放信息提取。即使在监督学习中,人们也做了许多细分,例如半监督或完全监督。但就我的讨论目的而言,只要方法是监督式的,我都将其归在监督方法的同一标题下。
开放信息提取方法是一种提取信息的方式,它不特别关注标签的含义,只是从文本中提取三元组。例如,给定句子“Dante passed away in Ravenna”,开放信息提取方法会简单地将此文本片段转化为一个三元组:“Dante passed away in Ravenna”。相比之下,在知识图谱中,我们有一个具有明确定义语义的关系词汇表。例如,在右侧的属性图中,我们有一个“Person”节点和一个“City”节点,以及一个名为“deathPlace”的关系,该关系可能定义了域和范围约束,对其可以或不可以取的值有一些规则和约束。每当我们谈论一个人在哪里去世时,我们都会使用相同的关系。因此,这里发生了细致的知识工程和知识表示,而这在开放信息提取中是不会做的。开放信息提取只是以完全无监督的方式处理文本。对于某些类型的问题来说,这是一个流行且非常有吸引力的方案,但使用以开放信息提取方式提取的信息进行推理和分析变得非常困难。因此,就本讲座的目的而言,我决定将其排除在范围之外,因为我们主要关注知识图谱,并且对有助于我们在知识图谱中填充具有明确定义的节点和标签含义的表示技术感兴趣。
因此,在我的其余讨论中,我将主要讨论基于句法模式和监督学习的信息提取或关系提取。
句法模式最初由Marti Hearst引入,为纪念她,这些模式也被称为Hearst模式。我通过一个取自该主题原始论文的例子来说明。以这个句子为例:“The bolu such as bambbaran d is plucked and has an individual curved neck for each string.” 即使从未见过“bolu”,不知道“bambbaran”和“dang”是什么,我们也可以仅从句子的句法结构推断出“marin D”一定是“boat loop”的一种。这就是Marti Hearst的关键见解,她指出我们可以定义这样的句法模式,基于句子的结构方式,可以为我们提供它们之间可能存在什么关系的强烈指示。在她的原始论文中有几个例子,例如,如果我们有“works by authors such as Ericrick Goldsmith and blah, blah, blah”这样的句子,我们知道“Herrick”和“Goldsmith”是作者。然后,如果你有“bruises, wounds, broken bones or other injuries”这样的句子,那么我们知道在这个句子中,“bruises”和“wounds”一定是“injuries”的一种。
当这个想法最初被引入时,人们认为这非常酷,如果能这样提取,这难道不是一种非常可扩展的方式吗?但事实证明,推广它并不那么容易。因此,即使在原始论文中,也有关于如何将其推广到未见过的关系的部分。建议的一般方法是,如果你想提取某种关系,你需要收集大量描述该关系的句子示例,然后从中找出一般模式,并为这些一般模式定义句法模式。然而,对于某些关系,如“has part”,很难找到关于如何从文本中提取它的非常通用的模式,我将在讲座的第二部分给你更多这方面的例子。
有些人已经进行研究,试图自动学习这些模式,而不是必须使用示例手动设计这些模式,并从这些关系在句子中的示例实例中反向工作。这在有限领域取得了一些成功,但并非以非常通用的方式。
现在让我们转向关系提取的监督学习方法。首先,它需要大量的训练数据。虽然可能不需要为句子中的示例出现定义模式,但仍然必须找到那些关系出现的句子。有些人会使用Marti Hearst风格的句法模式,并利用这些模式生成大量的训练数据。相反,鉴于这些训练数据、这些句法模式并不非常通用且并非总是有效,最近出现了一个称为“近似标注”的想法,这是我们系的Chris Ré率先提出的。其基本思想是,虽然我们无法找到明确的方法来确定特定关系是否存在于句子中,但我们将拥有大量不同的句法模式,这些模式可能暗示该关系可能存在于句子中。然后我们将使用所有这些模式,并通过训练过程学习每个模式的好坏,并将它们提供给我们的学习算法的输入或信号结合起来。
接下来,让我们谈谈如何使语言模型适应关系提取任务。这里的基本思想与我们用于实体提取的技巧没有太大不同。本质上,我们做的是:我们获取输入句子,并在句子中放入这些特殊标记,表示每个术语的开始和结束。例如,“term1_start”和“term1_end”表示第一个实体,“term2_start”和“term2_end”表示第二个实体。在我们的训练数据中,我们将训练我们的语言模型,当它遇到这样的句子时,其输出应该是我们试图预测的关系,例如“lives in”。同样,基本思想保持不变:增强输入数据以添加与您要执行的任务相对应的标记,向模型提供大量数据,并使其学习您试图产生的输出。
在这种情况下可以预期的挑战首先是训练数据,即如何获得大量关系示例的训练数据,这是任何这些技术工作所必需的。鉴于所有这些技术都是近似的,它们不会在所有情况下都有效,如果最终目标是获得高精度的知识图谱,我们仍然需要在最后进行人工验证。我在这里主要讨论了针对实体的关系提取,但在尝试提取事件的关系或尝试提取关于实体的时间信息时,还有专门的方法。我在本讲座中没有涵盖它们,但我只是想让大家知道,除了我在这里介绍的内容之外,还有更多内容。
📝 第一部分总结
至此,我们完成了第一部分关于方法的讨论。总结来说,实体提取和关系提取是如果我们想从文本创建知识图谱所面临的基本问题。方法的整体情况是,人们仍然更喜欢使用基于学习的方法来做到这一点,但基于规则的方法和句法模式是非常强大的范式。人们正在利用它们来创建或引导他们学习算法所需的训练数据。目前的技术水平仍然是我们仍在努力做好实体提取和关系提取,而实体消歧是一个极其困难的问题,我将其排除在本讲座之外只是为了限定范围。但最终,我认为一旦实体提取和关系提取得到很好的解决,实体消歧将变得越来越重要。
💡 第二部分:具体应用案例——智能教科书
上一部分我们介绍了从文本构建知识图谱的通用方法,本节中我们将通过一个名为“智能教科书”的具体应用,来探讨这些方法在实际项目中的应用效果与面临的挑战。
我将首先讨论什么是智能教科书,我们实际上需要什么样的知识图谱,然后讨论如何提取实体和关系,最后谈谈我们的经验、我们取得了多少成功,以及我认为在知识图谱构建调查中使用自动提取方法的前进方向。
我喜欢将智能教科书定义为由在书中发现的概念和关系的知识图谱增强的传统教科书。一旦我们将传统书籍与知识图谱结合起来,我就称之为智能教科书。当然,对于智能教科书可能有其他定义,但这就是我为本次讲座目的所定义的方式。
现在,这里出现的第一个问题是:谁需要它?为什么你应该关心?我们在创建智能教科书中要解决什么问题?我认为,我们所思考的这种智能教科书有助于让学生更容易学习复杂的新概念。一个有这种问题的学生例子是大学一年级生物学学生。如果你与这些有朝一日想成为医生的学生交谈,当他们走进生物课堂时,我们会递给他们这些厚厚的教科书,如果他们想继续学业,就必须掌握这些书。这些学生普遍的感受是生物学非常复杂,有大量的新词汇,他们感到迷茫。为了帮助这样的学生,我们认为智能教科书可能是一项强大的技术,并且我们已经构建了这种教科书的具体原型,我将向你演示这本书,以便你可以具体地看到我在谈论什么。

它具有五种不同的功能来帮助学生。首先,对于出现的任何困难词汇,如“proteins”、“polysaccharides”和“nucleic acids”,学生只需点击即可获得快速定义。其次,它有助于交叉链接来自书中不同部分的内容,包括图表,无论这些图表可能在哪一章定义。第三,它为书中的每个概念提供知识图谱可视化,学生可以交互式地探索此可视化,以确保他们学到了正在学习的内容。第四,当学生阅读书籍并突出显示一段文字时,它会向学生提问。例如,在这种情况下,学生隐约记得血红蛋白携带氧气,但不确定。因此,他们决定点击那个问题,通过将自己的答案与书返回的答案进行比较,他们重新获得了信心,确信自己真正理解了材料。因此,它是一个很好的自我测试设备。最后,他们可以向书本提问,例如,学生问“比较蛋白质与多糖”。作为对此类问题的回应,本书将系统地比较这两个概念,并将结果以组织良好的表格形式呈现。
利用这五种由知识图谱驱动的新功能,学生能够更有效地与这个复杂的知识体系进行互动和参与。
这不仅仅是一个演示,它实际上是一个可工作的原型,我们已经在一些社区学院、瑞典的一所大学校园以及哈佛大学的多个教室中进行了测试,我们发现,我刚才在演示中展示的这些功能普遍受到学生喜爱,它们还能带来更好的学习成果,并且也有助于表现不佳的学生。
创建此类智能教科书的真正挑战实际上是构建图谱,如何为大量书籍以可扩展的方式实际构建图谱。接下来人们可能会问的问题是:但实际需要什么样的知识图谱?我们试图创建什么,才能实现我刚才展示的那种演示?
让我们更仔细地看一下,因为这个例子与我在讲座第一部分中考虑的Cecilia Love例子更加不同。以这个句子为例:“On the outer surface of the plasma membrane, carbohydrate side chains are found attached to proteins in lipid.” 由此,我们希望构建一个如右侧所示的图谱,其中我们有“plasma membrane”、“carbohydrate side chain”等,但“protein”和“lipid”不是以“protein”和“lipid”出现,而是以“glycoprotein”和“glycolipid”出现,它们是更特殊种类的蛋白质。这些蛋白质并没有在这个句子中明确提到,它们可能是在教科书中谈论这些更特殊种类蛋白质的其他部分提到的。但是,当我们提取信息并希望构建这个知识图谱时,我们希望构建这种有凝聚力的全局知识图谱。在这种情况下,要构建这样的东西,我们还必须将这个“lipid”实体与图谱中已经存在的“glycolipid”实体进行消歧,同样,“protein”实体与“glycoprotein”实体进行消歧。
我认为需要指出的另一点是这个图谱的实际含义是什么?这是一个我们在本课程中定义的那种直接标记图,但它到底在说什么?如果我阅读这个图谱的逻辑含义,它大致是说:对于每个质膜,存在一个糖蛋白,存在一个碳水化合物侧链,使得该侧链是糖蛋白的一部分。你在这里会注意到的第一件事是,我们在这个知识图谱中的节点是类,而不是像Cecilia Love或Boston或United Airlines那样的东西,这些是我们在讲座第一部分看到的那种东西,但这里我们有类对象,如质膜、糖蛋白等。因此,我们想用这个图谱做的实际含义严格来说远不止实体
课程 P14:L10.1 - 构建用于语言理解的因果知识图谱 🧠


在本节课中,我们将学习如何从非结构化文本中构建用于自然语言理解的因果知识图谱。我们将探讨如何通过众包收集高质量的常识知识,并利用先进的神经模型动态生成因果规则,最终将这些规则集成到神经符号推理系统中,以实现更深刻、可解释的语言理解。
概述
本次课程的核心是介绍一种超越传统浅层文本理解的方法。我们旨在构建能够显式表达文本背后逻辑和因果关系的知识模型。课程将分为几个部分:首先介绍叙事理解任务及其挑战,然后讲解如何通过众包平台收集因果知识数据,接着展示如何利用预训练模型动态生成规则,最后探讨如何将这些动态规则集成到推理系统中。
叙事理解任务与挑战
上一节我们概述了课程目标,本节中我们来看看一个具体的自然语言处理任务:叙事理解。
叙事理解的一个特殊变体是“故事结尾预测”任务。例如,给定一个短篇故事和两个可能的结局,系统需要选择最合理的结局。这项任务需要丰富的常识知识来理解故事背景并预测后续发展。
人类在此任务上可以达到近乎完美的准确率。然而,在2016年,人工智能系统在此任务上的准确率仅约65%,远低于人类的100%。这揭示了AI在深度语言理解上的不足。
预训练语言模型的兴起与局限
上一节我们看到了AI在叙事理解上的早期挑战,本节中我们来看看一项重要的技术发展:预训练语言模型。
2017年底,Transformer架构的提出彻底改变了自然语言处理领域。与之前的循环神经网络不同,Transformer能并行处理整个文本序列,并通过“注意力机制”学习词语在上下文中的含义。
基于Transformer的模型(如GPT、BERT)在大规模语料库上进行预训练后,可以在各种下游NLP任务上通过微调达到顶尖水平。例如,在故事结尾预测任务上,微调后的GPT模型准确率提升到了86%。
尽管这些模型在许多基准测试上表现出色,但它们存在两个主要问题:
- 它们是“黑盒”模型,难以解释其预测过程和原因。
- 它们缺乏真正的常识知识,其表现严重依赖训练数据的分布,泛化能力弱。
葡萄糖数据集:收集因果知识
上一节我们讨论了预训练模型的局限性,本节中我们来看看如何系统地收集常识知识来解决这些问题。
我们提出了“葡萄糖”数据集项目,旨在从文本中收集特定于上下文的因果解释规则。我们定义了十个理解维度,涵盖事件的前因后果、角色动机、空间状态等。
以下是收集数据的十个维度:
- 维度一:什么事件直接导致了X?
- 维度二:什么情绪或动机促使了X?
- 维度三:什么位置状态使X成为可能?
- 维度四:什么属性使X成为可能?
- 维度五:什么先决条件使X成为可能?
- 维度六至十:分别是前五个维度的对偶,关注X导致的结果。
我们设计了一个高效的多阶段众包平台来收集数据。参与者需要先通过资格测试,然后在给定故事和焦点句子的情况下,为相关维度生成具体的和一般的因果规则。
通过这种方法,我们收集了约62万条高质量的常识推理规则,覆盖了大量新的、隐含的知识,这些知识在现有知识库(如ConceptNet, ATOMIC)中很少出现。
动态规则生成模型
上一节我们介绍了如何收集因果知识数据,本节中我们来看看如何利用这些数据让机器学会“动态”生成规则。
我们不满足于构建一个静态的知识库,而是希望训练一个模型,使其能够针对新的故事和问题即时生成相关的因果规则。我们将此任务构建为一个机器学习问题:输入一个故事、一个焦点句子和一个目标维度,模型需要输出相应的具体规则和一般规则。
我们测试了多种模型:
- K最近邻模型:在训练集中寻找最相似的例子,效果不佳。
- 预训练GPT-2:直接使用,缺乏相关常识知识,效果很差。
- 微调GPT-2:在葡萄糖数据上微调后,效果有所提升。
- 编码器-解码器模型:我们采用了T5模型,将故事、句子和维度作为输入,将规则作为输出进行训练。这种方法取得了最佳效果,其生成的规则质量接近人类水平。
实验表明,即使在这个极具挑战性的常识推理任务上,只要用高质量的数据对强大的预训练模型进行微调,它们就能在未见过的数据上生成合理的因果规则。
神经符号推理:集成动态规则
上一节我们展示了模型可以动态生成规则,本节中我们来看看如何将这些规则用于实际的推理任务。
我们构建了一个神经符号推理系统。与传统系统仅依赖静态知识库不同,我们的系统在推理过程中可以动态调用规则生成模型来填补知识空白。
例如,回答“费尔南多为什么要买薄荷植物?”这个问题时,系统会从故事中提取事实,并结合以下规则进行推理:
- 核心理论规则(手动编码的通用规则):
如果一个对象有一个部分,而该部分有一个属性,那么对象可能也有该属性。(植物有叶子,叶子有薄荷味 → 植物可能有薄荷味) - 动态生成规则1:
如果一个智能体喜欢某物的某个属性,那么他可能喜欢该物本身。(费尔南多喜欢叶子的薄荷味 → 他可能喜欢这种植物) - 动态生成规则2:
如果一个人喜欢某样东西,他就会有购买的动机。(费尔南多喜欢这种植物 → 他有动机购买它)
通过这种结合,系统不仅能给出答案,还能提供一个清晰、可追溯的逻辑解释链。我们将此系统应用于故事结尾预测任务,取得了接近最先进水平的性能,同时具备了可解释性。
总结
本节课中我们一起学习了构建用于语言理解的因果知识图谱的完整流程。
我们首先指出了深度语言理解需要显式的因果和常识模型。接着,我们介绍了通过众包收集高质量因果知识数据(葡萄糖数据集)的方法。然后,我们展示了如何利用这些数据训练模型,使其能够针对新上下文动态生成因果规则。最后,我们探讨了如何将这些动态生成的规则集成到神经符号推理系统中,从而结合了符号推理的精确性、可解释性与神经模型的灵活性和知识获取能力。
这种方法为解决传统知识表示系统(知识获取瓶颈)和端到端深度学习模型(缺乏可解释性)的固有缺陷提供了一条有希望的途径。


🖼️ 课程 P15:L10.2 - 可用于图像理解的场景图谱

在本节课中,我们将学习如何设计能够理解图像中复杂关系的计算机视觉模型。我们将重点介绍一种名为“场景图谱”的表示方法,它借鉴了人类认知的原理,能够帮助模型更好地推广到训练数据中从未见过的新颖组合。

尽管计算机视觉在识别物体方面取得了巨大进步,例如通过ImageNet项目,但我们的世界不仅仅是物体的集合。世界是丰富多彩且充满活力的。人们不断以新的方式使用物品,创造出意想不到的场景。动物也展现出令人惊讶的自主行为。我们在世界上遇到的这些新情况很平常,人类可以相对轻松地对其进行解释和推理。
然而,尽管深度学习在过去十年取得了惊人进步,但驱动当今视觉技术的模型仍然难以真正理解视觉世界。先前的研究多次注意到,当视觉模型看到新颖的物体组合时,它们很难进行概括,即使它们已经单独见过这些概念。例如,即使模型见过消防栓和人的例子,它们也可能学会“作弊”,忽略图像的某些区域,错误地预测一个人坐在椅子上,而不是坐在消防栓上。这些错误源于模型继承了数据中的偏见,因为大多数“人坐着”的例子都是坐在椅子上。
事实上,即使是OpenAI发布的最新拥有120亿参数的模型,使用了超过4亿个训练数据点,仍然难以概括这些新颖的组合。这更多是一个表示问题,而不仅仅是数据问题。相比之下,人类认知可以从先前看到的有限概念集合中,构造出无限多的新表示。人类利用过去的经验归纳地发展了对世界的组合模型,这使我们能够理解新情况并快速学习新任务。
因此,要让机器拥有视觉智能是一个挑战,它要求我们从根本上修改计算机视觉的表示方式。目前,大多数任务只使用物体表示。受人类学习的启发,今天我们将探讨如何设计能够推广到新颖组合的模型。我们将从比德曼的种子感知模型和杰里米·沃尔夫的视觉记忆与认知科学模型开始,设计一种新的视觉表示。然后,我们将展示如何利用这种正确的表示,让模型从有限的训练情况中学习,并推广识别出由已见概念组成的全新情况。
本节课首先介绍场景图谱,这是一种密集的、组合式的通用视觉智能表示。然后,我们将利用场景图谱设计更善于识别新奇组合的模型。最后,我们将展示如何利用场景图谱,仅用五个训练示例就完成整个下游计算机视觉任务。

🧠 当前范式的局限性
当前训练计算机视觉模型的主导范式是:首先在大量网络抓取数据或ImageNet等大型数据集上预训练潜在表示或物体表示,然后将这些学习到的表示应用于下游任务,如图像字幕或视觉问答。

不幸的是,这些潜在或物体表示往往难以概括。它们倾向于学习“捷径”并忽略视觉输入的整个区域,以在数据集上最大化性能。因为这些习得的表征最终变得不完整,所以使用这些表示的下游模型需要更多数据才能达到合理的性能。
我们的主要见解是引入一种新的表示,我们称之为“场景图谱”。我们将证明,在场景图谱上预训练的模型将帮助模型推广到完全新颖的组合,例如“一个人坐在消防栓上”。因为这种表示以组合的方式捕捉了更多信息,下游模型将需要更少的训练示例来获得合理的性能。


📊 设计场景图谱表示

首先,让我们思考为什么物体表示作为计算机视觉中最常见的预训练形式,不足以完成各种下游任务。

请看以下两张图片。物体特征或物体检测会告诉我们图像中有两个人,以及他们的位置。仅凭这些信息,我们可能会认为这两张图像包含相似的语义内容。但有时,相同的物体检测特征可能有非常不同的解释。例如,在一张照片中,一个人愤怒地对另一个人大喊;在另一张中,一个人在关注另一个人。
因此,当我们将这些物体表示用于下游任务时,难怪模型难以概括,并且需要大量数据来支持像图像字幕这样的任务。

这就引出了一个后续问题:什么是好的视觉表现?我们从人类视觉中知道,人们非常擅长适应新颖的组合。为了建立视觉智能的表示,我们转向计算神经科学与心理学,希望为人们如何处理视觉刺激找到灵感。

回到80年代,欧文·比德曼,以及90年代的杰里米·沃尔夫等人探索了这个问题。比德曼从他的实验中得出结论:除了对物体和场景进行分类,人们还会同时处理物体的属性以及物体之间的关系(如人的互动)。例如,将“透明”属性归于第一个图像中的人,或者“邮箱顶部的消防栓”这种违反常规的关系,都会减慢测试对象对物体进行分类的速度。他从实验中得出结论,物体处理的减慢可能意味着我们正在并行处理物体的属性和关系,这干扰了我们理解图像中存在哪些物体的能力。

在一组类似的人类记忆实验中,杰里米·沃尔夫也得出结论:物体不足以解释人类的视觉表征。他也指出,我们必须编码这些对象之间的关系或相互作用,并且这与物体识别是并行进行的。
基于几十年来对人类认知基础的多项研究,我们设计了一种新的视觉表示,称之为“场景图谱”。场景图谱表示将每张图像编码为一组以边界框定位的物体。每个框都与描述物体不同特征的属性相关联。物体之间也通过关系相互连接。这是一个解释图像一小部分的图结构。

为了真正研究场景图谱的效果,我们启动了一个名为“视觉基因组”的项目,旨在用场景图谱绘制视觉世界。我们最终注释了一个相当大的数据集,以研究在各种计算机视觉测试中使用场景图谱的效用。
⚙️ 场景图谱预测的挑战
我们已经看到了图谱设计并收集了数据集,我们开始训练模型来预测场景图谱。我们发现这些场景图谱确实更善于概括新颖的组合。然而,用模型来预测这些场景图谱是一个相当困难的挑战。
让我正式解释一下这个挑战是什么。我们可以训练场景图谱模型,期望图像作为输入,并使用图像中检测到的物体生成图结构,包括与每个物体相关联的属性以及成对物体之间的关系。在接下来的讨论中,我将忽略属性,因为它们可以与物体非常相似地建模。相反,我将专注于物体和关系之间的结构化预测任务。
在这里,我们想检测“人”、“帽子”、“田野”、“马”作为图像中不同种类的物体。我们还希望能够分类成对物体之间的关系。例如,我们可能想说“人”和“马”之间的关系是“站在”,因为那个人站在马上。
是什么让场景图谱预测如此困难?是它的长尾分布。即使是一对物体之间的关系,也有十几种互动方式。一些互动,比如“骑马”,比其他方式(如“站在马上”)更常见。
如果把每对物体及其关系作为一个单独的类别,会导致可能类别数量的二次增加。如果我们有 n 个物体类别和 k 种关系类型,我们需要建立 n^2 * k 个输出类别。因为这些组合中的大多数只有几个训练例子,模型最终会预测最常见的组合(如“骑马的人”),而忽略那些不频繁的组合(如“站在马上的人”)。
为了防止这种过度拟合,我们分解了问题。我们不再一起预测物体和关系,而是独立于关系来预测物体。关系现在直接从图像特征中预测出来,不与物体一起预测。我们的分解是基于比德曼的结论,即人类的视觉处理与物体并行处理关系。同样,我们的模型现在也使用一个单独的分支来独立于物体处理关系。
除了认知基础,这种分解也缓解了长尾问题。因为即使“人站在马上”在数据集中很少发生,物体探测器也会在各种不同背景下看到足够多的“人”和“马”的例子来识别这些物体。同样,关系探测器也会看到足够多的“物体站在其他物体上”的例子来正确预测关系。
一旦这些关系和物体被独立预测,我们可以通过做一个朴素的贝叶斯假设,用叉积把这些单独的预测组合起来,产生 n^2 * k 个预测,但现在我们只需要 n + k 个类别数来训练模型。
有了这个将视觉处理分解为独立物体和关系分支的新方法,我们的模型现在可以推广到完全新颖的组合。例如,通过看“骑马的人”和“戴帽子的人”的例子,模型现在可以组合并预测“马戴帽子”这个训练数据中完全没有的组合。
同样,回到最初的例子,通过观察“人坐在椅子上”和“地上有消防栓”的例子,模型现在可以结合这些片段,预测“人坐在消防栓上”这个训练数据中完全缺失的示例。

我们的模型能够将检测物体和关系的平均精度提高约三倍,与使用物体特征训练的变体相比。虽然这个结果令人鼓舞,但我们想看看是否能将性能推得更远,于是我们开始分析常见的错误来源。

🔄 引入高阶推理与图卷积
我们发现了一种不断出现的错误。考虑这张图像:模型预测两个人都在“扔飞盘”。它没有进行更高阶的推理:如果一个人在扔飞盘,那么第二个人不可能扔出同一个飞盘,而应该是试图“抓住”或“伸手拿”飞盘。
发生此错误是因为关系预测是以前馈方式进行的。相比之下,我们从人类视觉中知道,我们的处理充满了反馈联系,我们在其中分享信息并纠正不正确的预测,做出更全面连贯的预测。
因此,我们可以使用类似机制改进模型。我们开始探索实现这一点的方法,开发了一种进行这种更高层次推理的技术。我们用一个新的图卷积层扩展了原始模型。在我们的工作中,我们将传统的图卷积公式扩展到三维可视化表示上,包含两种特殊节点:物体节点和关系节点。
物体节点学习一个我们使用小型卷积神经网络参数化的函数,从它所连接的关系中传递信息。同样,关系节点也学习合并来自它连接到的两个物体节点的信息。通过迭代更新物体节点和关系节点,经过多次迭代,我们可以有效地在整个图形中传递信息。最后,当我们的模型从这些单独的节点做出关系预测时,它现在可以拥有所有必要的信息来做出正确的预测:第二个人不是在扔飞盘。
通过图卷积,我们能够在平均精度上再增加五个点。除了数量上的改进,将关系建模为这些转换物体和关系表示的函数,也允许我们开发上下文物体表示,就像自然语言处理中的上下文词表示一样流行。
与可以对词表示进行算术操作类似,我们现在可以使用上下文化的物体表示来执行相同类型的操作。我们的操作是由关系在这些物体上执行的转换定义的。例如,我们现在可以在“人”集群上应用“饮食”关系转换。通过应用这种转变,我们可以得到像披萨、冰淇淋和面条等食物的分类位置。
你可以在左上角看到,有一堆东西可以“书写”。不像语义编码会把“马”和“滑雪板”分开很远,而是因为这两种类型的物体都提供了“书写”关系,它们现在在某些维度上靠得更近了。这允许我们使用“书写”转换,并得到这些基于启发的表示。
拥有这种上下文化的物体表示的好处是什么?我们现在可以用很少的训练示例来训练识别新关系和新物体的模型。例如,仅从“一个人拿起汉堡”这个例子中,模型现在可以了解到妇女和儿童也可以拿起其他食物,因为它知道汉堡是可以拿起来的东西。因此,其他食物也可以被拿起,因为一个男人可以把它捡起来,一个女人和一个孩子也可以把它捡起来。它正在学习建立这些联想。

当然,图卷积只是我们可以使用的许多潜在框架之一,用于对图像中的关系产生高阶推理。计算机视觉社区一直在我们最初的框架上构建,开发了数百个场景图生成模型,包括许多最近的基于Transformer的模型。但在所有这些模型中,有一件事保持了相当一致:即我们引入的、受比德曼工作启发的原始分解。唯一真正改变的是,在这数百个模型中,我们是如何设计这些反馈连接的。
🚀 利用场景图谱实现下游任务
最后,让我谈谈我们如何利用这些可以从图像中预测并推广到新颖组合的场景图谱,来实现整个核心计算机视觉任务。
下游任务,如动作检测,通常非常渴望数据。这些模型很难在可能有数百帧的视频中找到有意义的信号,以对实际发生的动作做出正确预测。但是,如果你有一个场景图谱模型,你现在可以将每一帧表示为场景图谱。现在,你可以学习动作检测或动作识别,作为跨越这些不同帧的物体之间关系的转换。
例如,我们的模型可以了解到“在床上醒来”这个动作,是由于人和床之间关系的改变:最初这个人“躺在床上”,后来“坐在床上”,暗示他们正在执行“醒来”的动作。如果你有这样的数据来创建这些表示,我们最近发现,你可以使用五到十个训练示例,并提高场景图谱模型预训练的动作检测的平均精度,性能提升约五个平均精度点。
除了动作检测,我们还利用场景图谱作为连接语言和视觉的中间表示。这使我们能够通过在这两者之间诱导一种图形表示,来分解各种不同的语言视觉任务。例如,我们很早就展示了,当使用场景图谱时,我们可以改进图像检索:先分解你在场景图谱中寻找的东西的长查询,然后使用场景图谱并将其与从图像中提取的场景图谱进行匹配。这个图形匹配过程允许我们检索与语言描述最匹配的图像。
视觉社区的其他人也一直在使用场景图谱来改进各种各样的其他任务,如图像字幕。有各种各样不同的模型利用场景图谱来改进字幕。我们看到的一种常见模式是,在将图像转换为标题的过程中,有一个诱导的场景图谱层。首先将图像转换为场景图谱表示,然后从中产生标题。这个诱导层的好处是,一旦我们产生了一个标题,我们可以再现场景图谱并创建循环一致性损失,它允许我们验证生成的标题与从图像中提取的场景图谱一致。这提供了额外的训练信号和良好的结构,还允许人们从提取的场景图谱中提取子图,并生成聚焦于图像中不同区域的各种标题。
另一个令人兴奋的领域是思考我们如何将图谱视为外部知识的一种形式,在回答关于图像的问题时使用。我们最近看到人们做的是:拿图像的例子,从这些图像中转换和提取关系,然后利用这些关系,就好像你得到了一个关于图像中可能发生的事情的外部知识库。现在你可以推理不仅仅是原始像素,还可以通过这种提取的关系集来回答问题。这类模型被用来让问题不仅关注像素,还在回答时关注这种提取的关系。
最后,我们也看到了很多人们利用场景图谱作为构建创意工具来生成图像的方式。我们可以显式地指定不同类型的物体应该如何相互关联。当我们生成图像时,这使得我们可以创造足够多的信号,模型可以识别图像的哪些区域应该包含什么物体,以及它们应该满足什么样的关系。然后我们现在可以从非常指定的输入生成图像。
社区一直在利用场景图谱来完成各种各样的任务,从我提到的图像生成(首先将文本转换成结构化的场景图谱),到改进视觉导航(利用场景图谱先验进行三维理解),甚至将场景图谱扩展到整个3D区域、房间和房子。我们也看到了场景图谱可以用来通过在这些图形结构上使用符号方法来回答问题的例子。当然,我们已经开始在HCI社区看到例子,场景图谱对创造像素描这样的创意工具非常有用,在那里你可以定义你想要绘制的草图,然后模型把它转换成场景图谱,再转换成笔画。
📝 课程总结
本节课中,我们一起学习了场景图谱,这是一种基于人类认知的表示方法,以及如何利用它来设计各种可以轻松推广到新颖组合的模型。最后,我们讨论了场景图谱如何用于各种对计算机视觉非常核心的下游任务,并且它是一种通用的、任务无关的表示。
好的,谢谢大家,这就是我今天分享的全部内容。

知识图谱课程 P16:L11.1 - 知识图谱推理算法介绍 🧠

在本节课中,我们将要学习知识图谱中的推理算法。推理是知识图谱的核心能力之一,它允许我们从已有的明确信息中,推导出新的、隐含的知识。
到目前为止,我们已经定义了什么是知识图谱,并讨论了如何从结构化和非结构化数据中创建知识图谱。现在,我们将进入课程的新阶段,重点研究如何利用知识图谱进行推理和访问。本周我们将聚焦于推理算法,在后续课程中,我们将讨论用户如何与知识图谱交互,以及知识图谱如何随时间演变。
今天的课程分为两个部分。第一部分是理论或算法部分,我将描述各种知识图谱推理算法。第二部分,我将举例说明其中一些算法如何用于解决实际业务用例中的分析问题。
推理算法概览
在课程早期,我介绍了作为查询语言的SPARQL和Cypher。当时给出的查询示例相当简单,主要说明了如何检索或查找知识图谱中已经存在的信息。
在知识图谱推理中,我们感兴趣的是得出知识图谱中没有明确说明的新结论。实现这一点有很多不同的方法。在最高层面上,我们将研究两大类推理算法:基于图的推理算法和基于本体的推理算法。
基于图的算法主要源于纯粹的抽象图算法。基于本体的推理算法则来自知识表示与推理领域。
基于图的推理算法
有各种各样的图算法可以用于图结构数据。为了本次讲座,我选择专注于三个系列的图算法:寻路、中心性检测和社区检测。我将详细介绍每一个。
寻路算法
寻路是对图的基本操作。给定一个图,其中边用数字标记(数字表示从一个节点到另一个节点的成本),寻路问题就是要找出从一个节点到另一个节点的最便宜方式。
例如,如果我们在节点A,想计算到节点C的最短路径。我们可以直接从A到C,成本是5;或者我们可以从A到D,再从D到C,成本是4。在这种情况下,我们更倾向于选择A->D->C的路径。这种计算在交通规划等应用中有明显用途。
寻路问题可以用很多不同的方式表述。一种表述是:给定一个单一的起始节点,找出从该节点到图中所有其他节点的最短路径。这被称为单源最短路径问题。
寻路问题的另一个变体是最小生成树,有时也被称为旅行计划或旅行推销员问题。其目标是从一个节点开始,以总成本最小的方式访问其他节点。
有许多寻路方法,但我将介绍一个解决寻路问题的经典算法:A*算法。这是一个非常基础的算法,最初是在人工智能规划的背景下发展起来的,但显然适用于图中的寻路。
该算法最基本的方法是维护一棵从起始节点开始的路径树。这些路径树会不断延伸,直到满足终止标准。延伸是基于路径的长度来计算的。
路径长度的计算方式是:f(n) = g(n) + h(n)。其中:
g(n)是从起始节点到当前节点n的实际成本。h(n)是从当前节点n到目标节点的估计成本(启发值)。
h(n) 是一个估计值,因为我们还没有到达结束状态,不知道确切的成本。这就是为什么它被称为启发式。我们对一类特定的启发式感兴趣,即可采纳启发式。可采纳启发式是一种从不高估成本的启发式,它可能会低估成本,但绝不会高估。有证据表明,只要我们的启发式是可采纳的,我们将在搜索过程结束时得到一条最优路径。
为了说明算法的工作原理,我们用一个简单的例子,假设启发式 h(n) 为零。显然,如果假设达到目标状态的成本为零,这不会高估成本。当把启发式设置为零时,A*算法就退化或简化为更广为人知的广度优先算法。
为了说明这个算法的工作原理,我们将演示计算从节点A到节点E的最短路径的过程。
- 从节点A开始,首先枚举所有可能的选择:A->B, A->C, A->D。在这三个选择中,成本最小的是从A到D。
- 第一步,我们选择A->D。
- 在节点D,我们探索所有选择:D->C, 或 D->E。即使E是我们的目标状态,但从D到C的成本是4,比从D到E的成本5要少。所以我们必须探索C,因为有可能经过C再到E的总成本会小于5。
- 我们发现,如果沿着D->C->E的路径,成本实际上是6。
- 因此,我们已经找到的路径A->D->E是最短的从A到E的路径。
这是A算法在启发式设置为零的情况下如何工作的快速演示。A算法是一个非常著名的寻路算法,有大量的应用。
中心性检测算法
中心性检测算法背后的基本思想是帮助我们理解网络中节点的重要性。给定一个图或图结构,我们想弄清楚哪些节点最重要,或者哪些节点在某种意义上是桥梁,使它们突出(例如,它们连接了许多其他节点)。这些分析或洞察在识别复杂图结构中的瓶颈和脆弱性方面非常有用。
为了说明检测中心性的不同方法,一个简单的方法是简单地计算节点的度。度指的是一个给定节点连接到多少其他节点。在我们看到的图表中,节点A连接到最多的其他节点,因此,在这个网络中,节点A是基于度中心性度量的中心节点。
计算中心性的另一种方法是介数中心性。如果一个节点有最多的最短路径穿过它,那么它就具有很高的介数中心性。在整个网络结构中,节点B处于一个独特的位置,如果要计算所有不同节点之间的最短路径,穿过节点B的最短路径数量将是最大的。因此,节点B具有最高的介数中心性。
计算中心性的另一个度量称为接近中心性。具有最高接近中心性的节点是与网络中所有其他节点平均距离最近的节点。在示例中(仅考虑图的一个片段),节点C具有最高的接近中心性,因为它最接近该片段图中的所有节点。
第四个也是最后一个用于中心性检测的度量称为PageRank。PageRank最初是在信息检索的背景下开发的,谷歌是最大的用户。它被用来计算哪些网页在网络上最突出。鉴于互联网上的文档网络定义了一个图结构,这种排名可以应用于任何图结构。这个算法的好处在于,它考虑了节点的重要性:如果一个节点连接到许多有影响力的节点,那么它可能比一个连接到许多琐碎节点的节点更中心。
PageRank算法是迭代的,它围绕以下公式建立:
PR(u) = (1-d) + d * Σ (PR(t) / C(t)),其中求和是针对所有链接到节点u的节点t。
PR(u)是节点u的PageRank。d是阻尼因子,通常设置为0.85,表示直接访问节点与通过链接访问节点的可能性。PR(t)是链接到u的节点t的PageRank。C(t)是节点t的出链数量。
该算法的工作方式是:首先将所有节点的PageRank设置为某个任意值(例如,节点总数的倒数)。在每一步,我们都根据公式更新PageRank值,并持续迭代,直到算法稳定。这是一个迭代算法,在网络搜索和识别复杂图结构中的中心节点方面效果很好。
社区检测算法
社区检测的基本思想或要求,是识别图中根据某些标准紧密相关的、作为一个组的节点。一般来说,同一个社区内的节点之间的关系,会比它们与社区外节点之间的关系更多。很多时候,社区检测也被用作两阶段分析过程的第一步:首先,给定一个图,找出其中的社区;然后,将分析重点集中在每个社区内部。
我们现在来看看一些用于社区检测的算法技术。社区检测有两大类算法:标准图算法和自下而上的算法。
作为一个标准图算法的例子,我们可以识别连通分量。对于无向图,连通分量本质上是一组节点,使得你可以从每个节点到达组内的任何其他节点。这是一个非常基础的识别社区的方法。
第二个非常常见的标准图算法是强连通分量。强连通分量是针对有向图计算的。有向图中的一组节点是强连通的,如果对于每对节点A和B,都有可能从A到B,再从B回到A。在示例图中,我们可以看到有两组彼此强连接的节点,我们可以将这两组节点视为社区。
现在我们来谈谈自下而上的算法。在自下而上的算法中,有两种常见的方法:标签传播和Louvain算法(也称为模块度优化算法)。
以下是这些算法的快速概述,以便你了解它们的工作原理:
在标签传播算法中:
- 首先将图中的每个节点分配到一个不同的社区。
- 确定一个检查所有节点的顺序。
- 按照该顺序一次检查一个节点,并根据其邻居所属的社区来更新它所属的社区(例如,选择其大多数邻居所属的社区)。如果出现平局(例如,邻居分别属于两个不同的社区),则随机打破平局。
- 重复这个过程,直到满足条件:每个节点所在的社区与其大多数邻居共享。
这是一个自下而上的过程,也是一种沉浸式算法,因为我们开始时并不知道最终会得到什么社区。这种算法对于进行图分析非常有吸引力,因为它倾向于揭示我们可能没有想到的模式。
另一种非常流行的技术是Louvain算法。其基本思想是通过优化模块度来识别社区。模块度是衡量网络社区结构强度的一种指标。
- 初始化时,每个节点都在一个单独的社区中。
- 检查每个节点及其邻居,测试如果将该节点移动到邻居的社区,图的总体模块度得分是否会提高。模块度得分可以通过一个公式计算,例如考虑社区内边数与总边数的比例,以及社区内节点度数与总度数的比例。
- 如果模块度得分提高,则进行移动;否则,不移动。
- 重复此过程,直到稳定。
- 然后进入算法的第二阶段:创建一个新图,其中新图中的每个节点代表第一阶段的一个社区。如果第一阶段中两个社区的节点之间有边,则在第二阶段图中用边(或自环)表示。
- 在这个压缩后的新图上,重复第一阶段的过程。
- 继续迭代,直到无法再优化。
以上就是对基于图的算法的一次快速概览。
基于本体的推理算法
我认为,通用图系统与知识图谱系统的关键区别实际上在于基于本体的入口。因为到目前为止讨论的所有算法甚至可以应用于抽象的“图”,而不一定是“知识图谱”。当通用图开始变成知识图谱时,是因为我们开始通过将类与节点关联,或者定义节点如何相互连接的语义以及定义关系的语义属性,来添加应用领域的语义。
当你开始向图中添加这种语义知识或领域知识时,有一些算法可以应用。我选择将其标记为基于本体的推理。在这一点上,我进一步区分了两种类型:基于类的推理(或分类学推理)和基于规则的推理。
基于类的推理和基于规则的推理之间的区别并不总是非常明显。有时这主要是一个实现选择的问题。但我想指出的是,在许多基于类的推理系统的实现中,它们倾向于更直接地使用前面讨论的基于图的算法。例如,在进行分类学推理时,可能会进行图遍历。当然,你也可以使用规则进行图遍历,但在基于分类学或基于类的系统中,它们会更直接地利用图算法。
现在让我们更详细地看看这两种推理。
分类学推理
分类学推理在将知识组织成一组类是有用的时候适用。例如,如果你想对维基百科或维基数据中的关系图建模,将事实组织成一组类就变得更有趣。类只不过是类型或类别。
当我们有类时,我们可以定义类成员资格、类特化(子类)等。让我们更详细地看看这些特性。
在属性图数据模型中,节点类型本质上起着类的作用。在RDF数据模型中,RDF模式层允许你定义类,还可以在关系中定义定义域和值域限制。
为了本次讲座的讨论,我选择独立于这些具体模型来呈现推理的基本原理。它们与使用哪种数据模型无关。显然,当深入模型细节时,可能会有一些具体的差异,但为了课程目的,我认为深入这些差异并不重要。
让我们举一个简单的例子:我们有“人”这个类,以及“男性”和“女性”两个子类。我们有实例Art(男性)和Bob(男性)。我们可以用两种不同的方式表示它们:作为一元关系(如 Male(Art)),或者说Art是类Male的一个实例。两者在逻辑上是等价的。
给定这种非常简单的例子,我们可以将知识组织成一个层次结构。我们可以做出断言,例如“女性是人的一个子类”,“男性是人的一个子类”。当知识图谱中有这些子类关系时,我们可以进行推理。
我们能做的第一个非常简单的推理是传递性推理。例如,如果A是B的子类,B是C的子类,那么我们可以推断A也是C的子类。子类和实例也是相互关联的。规则 如果 i 是 A 的实例,且 A 是 B 的子类,那么 i 也是 B 的实例 捕获了这种关系。这个推论很自然地从子类的定义中得出。
我们可以声明类是不相交的。例如,我们可以说男性和女性是不相交的。如果两个类不相交,那么它们不能有任何共同的实例。这可以用于知识图谱中的各种推断,最基本的形式是确保事物被正确定义,这样我们就不会把同一个东西放在两个不相交的类里。
我们可以引入类定义。类定义通常有两个组成部分:必要属性和充分属性。
- 类的必要属性是该类所有实例共享的属性。例如,我们可以说“棕发人类”的所有实例的头发颜色都是棕色。使用规则,我们指定了棕发人类所有实例的属性。
- 类的充分属性让我们得出结论,某个特定实例是该类的成员。例如,我们可以说“任何有棕色头发的人必须是棕发人类的一个实例”。从规则的逻辑句法来看,主要区别在于:在必要属性中,实例出现在规则体(条件部分);在充分属性中,实例出现在规则头(结论部分)。
我们之前讨论过定义知识图谱中关系的语义。要为这些关系定义的基本语义是对第一个参数和第二个参数的约束。
- 对第一个参数的约束通常称为定义域。
- 对第二个参数的约束通常称为值域。
例如,如果我们有“父母”关系,我们可以声明:如果x是y的父母,那么x必须是“人”类的一个实例(定义域),y也必须是“人”类的一个实例(值域)。
除了这些类型约束,我们也可以定义基数限制,即限制一个关系可以取的值的数量。例如,我们可以限制一个人最多有两个父母(不能更多)。我们也可以定义数值限制,例如一个人的年龄不能超过125。
在分类学系统中被大量使用的一种推理叫做继承。这基本上意味着一旦定义了类层次结构和关系,关系值就会被“继承”到类的实例中。我们以前见过一个例子:如果Art是“棕发人类”的一个实例,那么我们就可以推断Art有棕色头发,无论我们的数据中是否明确说明了这一点。
更广泛地说,在分类学系统中,有四类推论,就执行它们的复杂性而言,每一种都有不同的难度:
- 包含检查:给定两个类A和B,弄清楚A是不是B的子类。这主要是在类描述的层面上进行推理。
- 实例检查:给定一个实例i,弄清楚i是不是类A的一个实例。这里我们有一个具体的实例,并试图将其与类的描述进行比较。
- 一致性检查:检查知识库是否一致,没有矛盾。例如,检查“Art是否有棕色的头发”是真还是假。
- 查询回答:给定一个查询,找出查询中变量的不同值,使得查询为真。
基于规则的推理
正如前面提到的,分类推理和基于规则的推理之间的界限不是很清晰。我在这节课中做了区分,主要是出于教学目的。但如果你要出去构建一个系统,你可以选择很多不同的路径,不一定非要做出这种区分。
为了解释基于规则的推理,我要举一个例子。我选择这个例子是为了捕捉比仅仅定义分类法、关系和约束更复杂的推理。
在这个例子中,我们有一个属性图,表示一个领域。我们有一个节点类型“人”,那个人参与了一项关于化学物质的研究。我们还说一家公司生产一种产品,而这种产品含有某种化学物质。此外,还有一条从公司到人的边,标签是“资助”。
给定这个模型,以及填充它的实例,我们想弄清楚参与研究的人中是否存在利益冲突。为了捕捉利益冲突,规则是一个很好的工具。
示例规则如下:
- 第一条规则定义“公司对化学物质的兴趣”:
公司X对化学物质Z有兴趣,如果 公司X生产产品Y,且 产品Y含有化学物质Z。 - 第二条规则定义“利益冲突”:
参与研究Y的人X与公司Z存在利益冲突,如果 人X参与研究Y,且 研究Y是关于化学物质P的,且 人X由公司Z资助,且 公司Z对化学物质P有兴趣。
这是一个相当复杂的关系,用于计算图中的利益冲突。规则提供了一种自然的方法来捕获这些关系。
如果你使用基于规则的方法进行推理,产生的利益冲突事实不一定非要存在于知识图谱中。但有些人可能希望查询结果也是一个知识图谱。对于熟悉课程前面内容的人,我们知道在知识图谱中,关系必须是二元的。在这种情况下,规则的头(结论)“利益冲突”不是一个二元关系。因此,如果你想在知识图谱中捕获利益冲突,你必须以某种方式表示它。
在多次讲座中,我们谈到了物化的概念。如果我们想把利益冲突纳入图谱,我们必须物化这种“利益冲突”关系。物化的基本思想是,对于任何非二元关系,我们必须创建一个新的对象。在这种情况下,我们通过在规则的头部引入一个存在量词来引入这个新对象(例如,一个新的节点C代表利益冲突)。然后,对于那个新对象,我们引入一组关系来捕获该关系的不同组成部分(例如,hasConflict(C, X), hasConflictReason(C, Y), hasConflictWith(C, Z))。
这只是我们如何实际应用规则的概述。一般来说,有两种策略来对知识图谱应用规则:自底向上策略和自顶向下策略。
- 在自底向上策略中,我们对数据应用规则,得到新的事实,将这些新事实添加到我们的数据库中,然后继续,直到不能得到更多新事实。这种方法的一个复杂之处是必须确保计算会终止。自底向上策略的好处是,一旦应用了所有规则,我们就有了所有派生数据,然后可以对派生数据使用传统的查询处理算法来回答查询。
- 在自顶向下策略中,我们从查询开始,只应用那些为回答问题所必需的规则,不会推导出所有结论。这种方法需要在规则引擎和查询评估引擎之间进行更紧密的集成。自顶向下策略的好处是显然需要更少的空间,因为我们不会推导出所有东西。
今天有许多高效和可扩展的规则引擎可用。
总结

本节课中,我们一起学习了知识图谱推理算法。它们在最高层次上分为两大类:
- 传统的图算法,如寻
知识图谱课程 P17:L11.2 - 高价值应用案例介绍 📊
在本节课中,我们将学习知识图谱在现实世界,特别是在金融领域中的高价值应用案例。我们将看到知识图谱如何通过图算法、基于规则的推理和本体论推理来解决复杂的实际问题。
应用领域概览
知识图谱如今被广泛应用于各个领域。一个有趣的例子是漫威漫画,他们为其电影宇宙创建了一个知识图谱。图谱中的节点可以是角色或电影,边则代表语义关系,例如两个角色是否在同一部电影或场景中出现。他们利用这个图谱来更好地理解现有电影,并设计新电影,寻找当前知识图谱中缺失的连接以构思新的故事线。

国际调查记者协会也构建了一个非常有趣的知识图谱,基于泄露的新闻数据。他们将这个知识图谱提供给记者,帮助他们更快地挖掘出不同参与者之间隐藏的联系或可疑行为。
自去年疫情爆发以来,也出现了许多专注于创建COVID-19知识图谱的努力,无论是基于学术出版物还是感染数据。
金融领域的应用
在接下来的讨论中,我们将聚焦于知识图谱在金融领域的应用。我们的讨论综合了去年系列讲座中多位演讲者的观点,将简明地总结知识图谱目前在金融领域的三种主要应用类别:分析、金融计算和财务报告。
分析部分将展示图算法的应用,金融计算部分将展示基于规则的推理,而财务报告部分则将展示基于本体论的推理。
1. 分析应用
以下是金融机构高度重视的一些分析性问题:
- 哪些客户是某家陷入财务困境公司的供应商?
- 在供应链网络中,是否存在一家公司连接着一组公司?
- 哪些初创公司吸引了最有影响力的投资者?
我们将逐步探讨其中一些问题,并联系我们在第一部分学到的算法,看看它们如何应用于解答这些问题。
问题:哪些客户是陷入财务困境的公司X的供应商?
要回答这个问题,首先需要供应商的信息。FactSet是一家商业数据供应商,专门管理供应链关系数据。你可以购买这些数据,然后利用我们在第四讲中学到的技术(例如如何从结构化数据创建知识图谱),将FactSet数据与你公司内部的客户数据整合起来。
一旦整合了数据,要回答这个问题,你会使用路径查找算法。你基本上会在供应链网络上进行一定距离的路径查找,以找出哪些公司和供应商是相互连接的。
问题:在供应链网络中存在一家公司连接着一组公司吗?
这是一个教科书级别的中介中心性例子。如果你的供应链网络中有一个节点具有非常高的中介中心性,这通常表明这家公司向许多其他组织供货。如果这家公司发生任何好坏事件,你都会希望提前知晓并关注其动态。
问题:哪些初创公司吸引了最有影响力的投资者?
要回答这个问题,我们需要风险投资公司或天使投资人投资了哪些公司的数据。PitchBook是另一家专门管理此类信息的商业数据提供商。与FactSet案例类似,我们可以购买这些数据,将其与公司内部的结构化数据整合,创建一个知识图谱。
在这个图谱中,如果我们想找出最有影响力的投资者,我们会使用类似PageRank的算法。我们会在那个网络中找出哪些节点最具影响力。
另一个相关的问题是:哪些投资者群体倾向于共同投资?要回答这个问题,你可以使用社区检测算法,因为它们会考虑这些风险投资或投资公司相互关联的多种方式。
问题:哪些公司与给定公司最相似?哪些公司可能成为我们未来的好客户?
要回答这类问题,人们使用的是我们目前尚未涵盖的算法。用于回答此类问题的典型算法基于图神经网络,它是知识图谱与神经网络算法的结合。在我们周四的讲座中,第二场演讲将专注于图神经网络,届时将介绍用于解答本幻灯片上这类问题的技术。
2. 金融计算应用

这部分综合了目前Intuit公司正在进行的工作。众所周知,Intuit是TurboTax软件的制造商,每年有数百万人使用该软件来准备所得税申报。他们有一项艰巨的任务:必须将税法相关部分、成千上万的表格编码成一个可用的产品,这个产品必须准确、合规,并且能够年复一年地保持这种状态。
随着税法的不断增长,他们的工作并未变得更容易。他们正在使用一个基于规则的系统来编码税法,但在这个系统中,他们非常有趣地利用了图或知识图谱。
其应用的基本思想是利用规则内部的图结构来自动生成用户访谈和对话,然后使用这些规则进行税务计算。计算部分很有趣,可以进行讨论,但我只想从他们的演示中抽取一个非常简单的例子,展示他们如何利用图结构来生成访谈和对话。
让我们考虑一个非常简单的例子:如果一个人是加利福尼亚州的居民并且年龄大于18岁,那么这个人就有资格获得某项税收优惠。给定这样一条英语规则,我们可以用规则语言对其进行编码,并从中生成你在这里看到的图。
从这个图中,我们可以得出结论:如果一个人的年龄小于18岁,那么他们无论如何都没有资格获得这项福利。因此,如果我们知道他们的年龄小于18岁,我们甚至不需要费心询问他们的居住地。这是一个非常玩具化且简单的例子,仅限于单条规则。但想象一下,你拥有的不是一条规则,而是成千上万条以多种不同方式连接的规则。那么,利用这种图连接方式(规则之间如何相互连接),你就可以确定应该向用户提出哪些访谈问题。
需要说明的是,有些人可能会争论你在这个屏幕上看到的是否真的是知识图谱。它确实是一个有向标记图,但在捕获应用语义方面,它实际上捕获的是一组规则的执行过程,而不是数据图或应用的本体结构。但他们将其作为一种进行税务计算的知识图谱方法进行了介绍。他们正在将这项技术作为其TurboTax系列产品核心的一部分。
3. 财务报告应用
所有金融机构都有特定的报告要求。以衍生品合约为例,有各种类型的衍生品合约,如期权、期货和远期。有一套复杂的法律体系来规范这些合约的订立、执行以及在违约情况下的处理方式。同时也有相当严格的报告要求,必须向监管机构报告,也必须向从事这些合约买卖的不同交易商报告。
因此,如果一家金融机构开始以多种不同格式报告这些衍生品合约的信息,对于监管机构和不同的交易组织来说,工作将变成一场噩梦。因此,金融行业内部一直在努力探索是否有办法标准化这些报告。业界已经联合起来,开发了这个共享的本体,称为FIBO。
这是一个多方利益相关者共同参与的社区努力,他们的目标是看是否能就这些衍生品合约报告中将要出现的数据的语义达成一致并进行规范。


在本幻灯片上,我展示了FIBO的一个快照。在这个快照中,他们给出了看涨期权买方的语义或定义,并定义看涨期权买方可以是自主代理、独立方或法人。这正是我在介绍分类推理部分时描述的那种定义域和值域约束。

衍生品合约只是FIBO的一个用例,他们还有许多其他正在开发中的用例。希望在未来,这种用于数据交换的标准化将变得越来越重要。
总结
本节课中,我们一起探讨了知识图谱在金融领域的多种高价值应用。
我们首先概述了知识图谱在漫威宇宙、新闻调查和疫情研究等广泛领域的应用。随后,我们深入聚焦于金融领域,详细分析了三大类应用:
- 分析应用:我们学习了如何利用路径查找、中介中心性、PageRank和社区检测等图算法,来解答诸如寻找关键供应商、识别有影响力的投资者以及发现公司集群等商业问题。对于更复杂的相似性分析和潜在客户挖掘,则需要借助图神经网络技术。
- 金融计算应用:以Intuit的税务计算为例,我们看到了如何将业务规则表示为图结构,并利用这种结构来智能地驱动用户访谈流程,实现高效、准确的自动化计算。
- 财务报告应用:通过金融行业业务本体论FIBO的例子,我们了解了如何利用本体论来标准化和定义金融数据的语义,从而实现不同机构间高效、无歧义的数据交换,满足严格的监管报告要求。

这些案例表明,知识图谱通过结合图结构、规则推理和本体语义,正在成为解决金融行业复杂数据分析、自动化计算和标准化报告等核心挑战的强大工具。

课程 P18:L12.1 - 图谱关系学习与管理 🧠


在本节课中,我们将学习知识图谱的高效推理算法,特别是当存储层为关系型系统时。课程将涵盖如何利用关系模型表示和管理知识图谱,以及如何通过声明性语言和优化算法进行高效推理。
关系模型与知识图谱表示 📊
上一节我们介绍了知识图谱推理的背景,本节中我们来看看如何用关系模型来表示各种知识图谱数据。
关系模型使用“关系”来表示所有数据。其核心目标是将物理数据表示、索引选择与应用程序逻辑分离。应用程序逻辑完全独立于系统实现,系统可以最优方式执行逻辑。
SQL是关系模型的一种查询语言,但并非唯一。现代应用面临的挑战不应归咎于关系模型本身,而可能在于查询语言。因此,改进查询语言是关键。
以下是使用关系表示不同数据模型的方法:
- 有向图:可以用一个名为
Arc的二元关系表示。例如,图中的一条边A -> C表示为Arc("A", "C")。 - 属性图:顶点属性可用二元关系表示。例如,电影
m的标题是“127小时”,可表示为title(m, "127 hours")。顶点标签可用一元关系表示,如Movie(m)。边上的属性则成为三元关系(超边),例如plays(j, m, "Aaron Ralston")表示James Franco在电影中扮演了Aaron Ralston。 - RDF:每个三元组可视为一个元组,其中谓词作为关系名。例如,
type(p, Painting)和name(p, "Mona Lisa")。 - SQL表:传统SQL表通常表示为单一关系。但在知识图谱视角下,可以将其结构重塑得更像图,例如将订单表拆分为订单实体及其属性(如客户、日期)的关系集合。
关系模型可以捕获上述所有数据模型。构建基于关系模型的系统,就能统一处理这些不同模型。
知识定义与推理 🔍
上一节我们了解了数据的表示,本节中我们来看看如何在系统中定义知识并进行推理。
推理意味着使用逻辑来推导出新的边、标签和顶点。以下是几个推理示例:
- 模式匹配(如三角形查询):寻找导演了某部电影,且其孩子也在同部电影中出演的导演。其逻辑类似于:
directed(d, m) ∧ child(a, d) ∧ acted_in(a, m)。 - 派生对称关系:可以定义配偶关系是对称的。例如:
spouse(x, y) = spouse(y, x)。 - 派生新标签:可以根据现有属性定义新标签。例如,若某人国籍是荷兰,则可为其添加
Dutch标签:Dutch(x) ← citizen_of(x, "Netherlands")。 - 聚合计算:支持对图进行聚合操作。
- 计算图中总边数:
count[edge]。 - 计算每个节点的出度:
out_degree[x] = count[y: Arc(x, y)]。 - 计算每个团队的总薪资:
team_salary[t] = sum[s: member_salary(t, s)]。
- 计算图中总边数:
对于图算法,递归至关重要。例如,可达性(传递闭包)是基础递归查询:
reachable(x, y) = Arc(x, y)
reachable(x, y) = reachable(x, z) ∧ Arc(z, y)
系统支持任意用户定义的相互递归规则,递归中也可包含聚合。系统还能缓存并增量维护这些推理结果,以支持动态图更新。
完整性约束与深层知识 ⚖️
推理用于推导新事实,但确保数据质量同样重要。本节我们讨论如何使用完整性约束来保证数据一致性。
完整性约束用于防止非法数据进入,而非自动修复。系统会报告违反约束的情况。
以下是完整性约束的示例:
- 类型约束:每个演员都必须是“人”。可写为:
Actor ⊆ Person。若试图使非人的实体成为演员,将被阻止。 - 函数依赖:每个人应只有一个生日。可使用“函数”抽象来确保:
birthday: Person -> Date。 - 关系属性:配偶关系必须对称。可定义为:
spouse(x, y) ⇒ spouse(y, x)。
这些深层知识不仅用于保证数据质量,后续还将看到它们如何用于优化查询执行。
图语言的关键特性:模式与数据统一查询 🗺️
本节我们探讨图查询语言与SQL的一个关键区别:内在支持同时对数据模式和数据进行查询。
在知识图谱应用中,探索存在哪些关系类型(即模式)与查询具体数据同样重要。SQL难以优雅地将目录(模式)查询结果直接用于数据查询。
在REL等图语言中,这很容易实现。例如,可以查询“Danny Boyle”和“James Franco”之间存在的所有关系类型,这本身就是一个模式级查询,能发现他们通过电影“Steve Jobs”合作。
这种能力使得编写通用图算法(如PageRank)成为可能,因为算法需要泛化地遍历图结构,而SQL模式难以动态反映这一点。
模块化与抽象 🧩
为了支持泛化查询和算法复用,系统支持模块化。
可以将关系分组到模块中,类似于命名子图。例如,可以创建一个包含所有电影相关关系的 movie_graph 模块。
这使得通用算法库成为可能。例如,可以定义一个通用的 page_rank 函数,它接受一个图模块作为参数进行计算。同样,推理规则也可以被抽象和复用,例如自动为任何国家的公民打上对应国籍标签的规则。
高效执行:最坏情况最优连接算法 ⚡
声明性查询需要高效执行。本节介绍为何传统连接算法对图查询低效,以及新的“最坏情况最优连接算法”如何解决该问题。
传统SQL系统使用二元连接,一次连接两个表。但在知识图谱的多关系连接查询(如三角形查询)中,任何二元连接顺序都可能产生巨大的中间结果,导致性能低下。
最坏情况最优连接算法(如WCOJ)采用不同的策略。它通过同时考虑所有连接关系,逐步绑定变量,避免过早产生大量中间结果。
算法思想示例(三角形查询):
- 首先,只关注
directed(d, m)和child(a, d),找出那些既是导演又有孩子的d集合,这比所有导演的集合小。 - 接着,在上一步的
d基础上,结合acted_in(a, m),寻找那些孩子也是演员的导演,这个集合通常更小。 - 最后,通过电影
m完成三角形闭合。
这种算法在处理涉及多个关系和标签的图查询时特别有效。系统使用其即时编译变体(如“Datalog联机”技术)来执行。
利用知识进行语义优化 🧠➡️🚀
系统不仅能利用算法优化,还能利用用户定义的深层知识(语义)进行优化,将高级声明式规范转化为高效算法。
优化器可以应用数学知识(如结合律、分配律)和用户指定的约束(如函数依赖)来重写查询。
示例1:最短路径优化
用户可能声明性地计算图中所有路径长度,然后取最小值来求最短路径。这非常低效。语义优化器识别到“最小值”操作可以在递归中分配,从而将逻辑优化为等效的Dijkstra算法。
示例2:特定源点优化(需求转换)
当使用所有对最短路径算法只查询单一源点(如计算所有演员的“培根数”)时,优化器通过“需求转换”技术,将其特化为单一源点最短路径算法,大幅提升效率。
这体现了声明式编程的优势:用户关注“做什么”,系统利用知识决定“如何高效地做”。
机器学习支持与特征工程 🤖
现代数据应用离不开机器学习。本节简要介绍系统如何支持机器学习工作流,特别是特征工程。
REL语言也是一种强大的特征转换语言。其标准库包含许多标准转换,如Z-score归一化、三角形计数等。
这些特征转换受益于之前提到的语义优化和增量维护。当输入数据微调时,系统只增量重新计算受影响部分。
库也定义了预测和损失函数(如MSE),这些都用声明式数学定义。系统可以自动计算梯度并执行梯度下降训练。
示例:线性回归
可以声明式地定义线性模型和损失函数,系统自动求解最优权重。更酷的是,这一切直接在关系结构上操作,无需显式创建特征矩阵。
未来,系统旨在将这种声明式方法扩展到神经网络,实现从逻辑描述到高效训练的完整闭环。
总结 📝
本节课我们一起学习了基于关系模型的知识图谱管理系统。
- 统一表示:关系模型可以灵活表示属性图、RDF等多种知识图谱模型。
- 声明式推理与约束:通过声明性语言(如REL)可以方便地进行逻辑推理、定义完整性约束,确保知识质量。
- 关键特性:图语言支持模式与数据的统一查询,以及模块化抽象,这是其区别于传统SQL的重要优势。
- 高效执行:采用最坏情况最优连接算法处理图查询,克服了传统二元连接的性能瓶颈。
- 语义优化:系统利用用户定义的深层知识进行自动优化,将高级声明式查询转化为高效算法。
- 机器学习集成:支持声明式的特征工程和模型训练,并能受益于增量计算和语义优化。

这种将强大声明能力与深度优化相结合的方法,为构建和管理大规模知识图谱提供了新的思路和工具。


课程 P19:L12.2 - 知识图谱介绍 🧠

在本节课中,我们将要学习图神经网络(GNN)的基本概念、工作原理及其在知识图谱等领域的应用。我们将从为什么需要图神经网络开始,逐步深入到其核心机制,并探讨其在节点、边、子图和图级别上的实际应用案例。


为什么需要图神经网络? 🤔
许多类型的数据本质上都是图结构。你可能见过知识图谱的例子,其他现实世界的数据也可以用图来表示,例如生物调控网络、代码图、分子(其中原子和键是节点和边)或三维网格。我们面临的主要问题是:如何利用图的结构来帮助我们做出更好的预测?我们将通过机器学习的视角来讨论这个问题。
我们知道这些复杂的领域可以表示为关系图。显式地建模这些关系,可以实现更好的性能。
什么是图神经网络? 🧩
我们知道,不同的工具箱是为简单的序列或网格数据设计的。例如,我们可以用卷积神经网络(CNN)来处理图像数据,用于人脸检测;我们可以用循环神经网络(RNN)或转换器来处理文本或语音数据,它们看起来像序列。
但对于更复杂的网络或图,情况则不同。具体来说,图可以具有任意大小和复杂的拓扑结构,并且它不像网格或序列那样具有固定的空间局部性。


我们将讨论的关键概念是节点嵌入。其直觉是,我们可以将节点映射到一个D维的嵌入空间,使得图中相似的节点在嵌入空间中更接近。
更具体地说,我们会有一个输入图,我们想学习一个嵌入函数 f,这样我们就可以把图嵌入到一些低维节点嵌入空间中。稍后我们将讨论如何学习这个映射函数 f。
我们的目标是定义两件事:
- 首先,定义一个编码器,它可以将输入网络编码成D维嵌入空间。
- 然后,定义输入网络中的一些相似性,这样我们就可以训练嵌入来近似这种节点相似性。
正如我们刚才讨论的,有两个关键组件:
- 第一个是将每个节点映射到低维向量的编码器。输入是输入图中的一个节点,输出是D维向量嵌入。
- 第二个概念是相似性函数,它指定了向量空间中的关系如何映射到原始网络空间中的关系。相似性可能很简单,比如点积。
编码器的一个简单例子是所谓的浅嵌入或浅编码器。这里的编码器只是一个嵌入查找表。假设我们有一个嵌入矩阵 Z,每一行对应一个嵌入维度,每一列对应一个节点。如果我们想嵌入图中的第五个节点,我们只需查看这个嵌入矩阵的第五列,该向量就是该特定节点的节点嵌入。
知识图谱通常只是一个浅编码器加上一些相似性解码器。知识图谱中的边通常以三元组 (头实体,关系,尾实体) 的形式存在。因此,学习知识图谱嵌入就是学习头、尾实体和关系的嵌入。人们通常首先定义一个浅编码器,在嵌入空间中建模实体和关系。每个实体和每个关系都与一个浅嵌入相关联。然后,人们会使用基于相似性的解码器。给定一个真实的三元组 (h, r, t),目标是使头部 h 的嵌入加上关系 r 的嵌入,接近尾部 t 的嵌入。
一个著名的例子是 TransE 模型。这里人们使用了“翻译”的直觉。在嵌入空间中,他们希望 h + r ≈ t 如果该三元组成立。如果该事实不存在于知识图谱中,它们则不相等。我们如何学习这样的关系?这通常通过一个评分函数来完成。我们想最小化 (h + r) 和 t 之间的距离。例如,如果我们从一个节点“奥巴马”开始,朝着嵌入“国籍”的方向前进,最终我们可以到达另一个节点“美国人”。
这种浅层编码器非常适合知识图谱应用,但它确实有一些局限性:
- 首先,这里我们需要
O(节点数)级别的参数。原因是节点之间没有参数的权重共享,所以我们需要为每个节点分配一个唯一的嵌入。 - 其次,它本质上是不可归纳的。这意味着它不能为训练中未见的节点生成嵌入。想象一下你有一个知识图谱,然后有一些新的实体和新的关系,通常你必须重新训练你的系统来学习它们的嵌入。
- 最后,此方法不能合并节点特征。通常节点和边总是用ID表示,不清楚如何直接使用节点或边的特征。然而在现实生活中,许多图确实有一些特征,比如用户配置文件特征或关系特征。
今天我要介绍一些深度图编码器。我们将展示,事实上,这种基于图神经网络的方法可以克服这些局限性。更具体地说,我们将介绍一类节点编码器,它由基于图结构的多层非线性变换组成。所有这些深度编码器实际上可以组合在一起,结合知识图谱方法中定义的节点相似性函数。
从视觉上看,过程是这样的:我们会有一个非常复杂的输入图,这个图会经过不同的图卷积层,然后输出将是节点嵌入。同时,我们也可以在同样的过程中嵌入子图。


图神经网络的工作原理 ⚙️
我们刚刚谈到了为什么需要图神经网络,现在我来介绍什么是图神经网络。


这是我们的设置:假设我们有一个输入图 G,其中 V 是顶点集,A 是邻接矩阵(通常是一个0/1二进制矩阵),X 是节点特征的矩阵。v 是图中的一个特定节点,N(v) 定义了给定节点的邻居集。
这里我们假设节点可能有一些特征。例如在社交网络中,用户配置文件将是一些有用的特征;在生物网络中,我们可以有一些基因表达图谱或基因功能信息。这些是一些有用的节点特征。有些情况下我们没有任何节点特征,在那里我们可以使用一些简单的替代方案,比如指示向量(对每个节点进行独热编码),或者我们只是为所有节点分配一些常数向量。


一个天真的方法真的只是拼接这个邻接矩阵和这个节点特征矩阵,然后我们可以把这样的组合表示输入到一个深度神经网络(比如一个非常简单的线性多层感知器)中。这个想法的问题是,这将需要 O(节点数) 级别的参数,不适用于不同大小的图,并且它对节点排序也很敏感。
图神经网络的想法实际上是受到了流行的卷积神经网络(CNN)的启发。想象一下人们如何将CNN应用于图像:人们会定义一些卷积滤波器,然后将卷积滤波器在整个图像中滑动卷积。我们在这里的目标是将这种由图像定义的卷积推广到一些更一般的设置中。同时,我们希望利用节点的特性和属性。


我们的图表看起来和图像很不一样,它只是一个非常复杂的形状,而且在图上没有固定的局部性或滑动窗口的概念,与从网格图像中学习相比,它有点难定义。

以下是我们的关键观察,它可以帮助我们将图像转化为图形:这里我展示了一个卷积神经网络的例子,使用三乘三的过滤器。你可以看到输出像素实际上取决于其周围的邻居像素。这种直觉也可以推广到图。因此,如果你想学习给定节点的嵌入,我们可以利用它的局部社区,即使用其相邻节点的信息。



这里的想法是,我们可以在邻居处转换信息,然后组合它,这样我们就可以得到节点嵌入。更具体地说,我们先从节点邻居传递信息 h_i,经过一些线性变换,然后把它们加起来,这将是最后的节点嵌入。
现在我要介绍具体的图卷积神经网络(GCN)或图神经网络(GNN),它实际上只包括两个步骤:
- 首先,我们要基于节点的邻域确定节点的计算图。
- 然后,根据计算图,我们将在整个图形中传播和转换信息。
这里有一个更具体的例子:假设我们有这个输入图,我们的目标是学习目标节点 A 的嵌入。我们将首先生成基于其本地邻居网络的嵌入。A 有邻居 B、C 和 D。然后对于每个节点,我们将查看它们的邻居,例如 B 将有邻居 A 和 C,以此类推。

我们在这里的直觉是,我们想在这个聚合过程中应用一些神经网络,这样我们就可以计算嵌入。这里有一个非常有趣的观察是,每个节点都将基于自己的邻域定义一个不同的计算图。例如,A、B、C、D 的计算图都很不一样,这样我们就可以学习不同节点的不同嵌入。
这种计算确实发生在许多层。因此节点可以在每一层都有嵌入。一开始,在第0层,节点特性将只是它的输入特性 x_u。然后我们将应用几轮消息传递进行聚合。根据第0层特性,通过一跳聚合获得第1层嵌入,然后我们将继续进行这个聚合,最终我们可以得到我们要学习的节点 A 的嵌入。你可以看到,第 k 层嵌入实际上从距离 k 跳远的节点获得信息。所以 A 通过一层能够从一个跳跃的邻居那里获得信息,通过两层计算,你可以从他的两个跳跃邻居那里获得信息。
接下来我要谈谈我们如何真正定义这个黑匣子。这里的一个基本方法是,我们将邻居的信息平均,然后应用一个神经网络。所以你可以看到第一步是平均来自邻居的消息,然后使用平均信息应用一些神经网络。
这是正在发生的具体过程:
- 首先,我们将使用输入的原始节点特性初始化第0层嵌入
h_v^0。 - 然后每一层
l,输入将是上一层的节点嵌入h_u^{l-1}。我们把邻居上一层的嵌入平均一下,以计算此层的消息。 - 在计算之后,我们将应用一些矩阵变换
W和偏置b,其中W和b是图神经网络的权重矩阵,它们是可以训练的。 - 经过计算这些信息后,最终会应用一些非线性激活函数(如ReLU)来增加GNN的表达能力。
- 我们将重复这个过程进行
L轮,其中L是层的总数。最终我们会得到节点v的最终节点嵌入h_v^L,这是通过这些L层GNN计算得到的。
下一个问题是我们如何训练GNN。我们知道这个GNN为我们提供了节点嵌入 h_v。训练GNN有两个一般设置:
- 第一个是监督设置。我们想最小化节点嵌入和一些目标标签
y_v之间的损失。我们想要优化在这个图中定义的神经网络的参数。可能的标签可能有一些节点级标签、边级标签和图级标签。这个标签通常来自一些外部来源。我将在下一节给出一些具体的例子。损失函数是相当标准的:如果y是实数,我们会用一些L2损失;如果y是类别,会使用一些交叉熵分类损失。 - 另一个设置是无监督学习环境。我们不是使用一些外部监督标签,而是使用图形结构本身作为监督。例如,我们可以在随机游走的基础上定义一些节点相似性,或者我们甚至可以使用一些知识图谱目标定义,比如TransE或RotatE等。
以下是我们已经讨论过的概述和总结,这就是图神经网络的工作原理:
- 首先,我们将定义邻域聚合函数。
- 然后,我们将在嵌入上定义一个损失函数。
- 我们将基于一组节点(比如一批计算图)训练这些嵌入。
- 然后在测试时,得到一个训练有素的模型,将根据需要为节点生成嵌入。
这里很酷的是,我们甚至可以生成我们从未训练过的节点的嵌入。这真的解决了非归纳性问题。
图神经网络的应用 🚀
现在我在最后一节介绍了什么是图神经网络,我将谈谈图神经网络的一些很酷的应用。
有几个重要的任务可以在网络上定义。使用图神经网络,我们将能够:
- 进行节点分类,目标是预测给定节点的一些标签。
- 定义链接预测任务,目标是预测两个节点是否会在图中链接在一起。
- 做一些社区检测任务,我们得到一个输入图,想定义图中一些有趣的群落结构。
- 最后,我们可以做一些图分类任务,目标是对不同的图进行分类,比如对不同的分子进行分类。
节点级任务示例:蛋白质折叠 🧬
蛋白质链从氨基酸序列中获得了天然的三维结构。我们有一系列氨基酸序列的信息,最后它会折叠成一个三维结构。蛋白质折叠的问题是,我们想通过计算完全基于氨基酸序列来预测蛋白质的三维结构。
这里有一些非常酷的预测是由DeepMind的AlphaFold团队做出的。他们的预测非常接近真实的三维结构。他们是怎么做到的?他们利用了图神经网络技术。他们的主要想法是建立一个空间图,其中节点是蛋白质序列中的氨基酸,边是氨基酸在三维空间中的接近度。定义了这样一个空间图后,他们将应用一些类似于图神经网络的技术来做出预测。
边级任务示例:推荐系统 🛍️
一个非常重要的应用是推荐系统。可以考虑建立一个用户-物品交互图的推荐系统。例如,用户可以看一些电影、买一些商品、听音乐等。其中节点是用户和物品,边是它们的用户-物品交互。我们的目标是推荐用户可能喜欢的项目。
这里一个非常成功的方法叫做 PinSage,它使用图神经网络建立一个成功的推荐系统。这里的任务是向用户推荐相关的Pins。例如,我们可以有一个图,其中包含一个“蛋糕”节点和一个“毛衣”节点。一个好的推荐将推荐另一个蛋糕,一个糟糕的推荐会说推荐这件毛衣。我们的目标是,在嵌入空间中,两个蛋糕的嵌入应该靠近,而蛋糕和毛衣的嵌入应该远离。如果我们用边级别预测任务训练图神经网络,模型将能够预测图中的两个节点是否相关,这是推荐系统的核心组成部分。
子图级任务示例:交通预测 🚗
另一个成功的应用是将GNN应用于交通预测。假设你想从斯坦福大学到UC伯克利。底层表示也是一个图,因为你可以把道路网络看作一个图表,其中节点是路段,边是这些路段之间的连接性。人们将能够根据道路网络进行交通预测。这里的技术也是图神经网络,这项技术已经部署在谷歌地图上,表现得很好。
图级任务示例:药物发现 💊
这里的例子是药物发现。分子可以表示为图,其中节点是原子,边是化学键。人们已经成功地使用图神经网络来发现抗生素。他们把这个问题表述为一个图分类任务,目标是预测来自现有候选药物池中有希望的药物分子。
另一个有趣的方向是做分子或图形生成,我们将生成新的分子,这些新分子有可能用于药物。会有一些非常酷的用例,比如我们可以生成与现有分子具有非常高相似性的新分子,或者我们可以优化一些现有的分子,使其具有一些理想的性质。这里的底层模型都是图神经网络。
总结 📝
本节课中我们一起学习了图神经网络。
- 我们首先讨论了为什么需要图神经网络,因为许多复杂数据本质上是图结构,利用图结构可以提升预测性能。
- 接着,我们深入探讨了什么是图神经网络。其核心在于定义一个节点邻域聚合函数来生成节点嵌入,并通过定义损失函数和训练程序来优化模型。GNN能够克服浅层嵌入方法的局限性,具有更强的表达能力和归纳性。
- 最后,我们探索了图神经网络的一些很酷的应用,它们覆盖了节点级别(如蛋白质折叠)、边级别(如推荐系统)、子图级别(如交通预测)和图级别(如药物发现)等多种任务。
图神经网络为处理复杂的、非欧几里得结构的数据提供了强大的工具,并在众多领域展现出巨大的潜力。
课程 P2:L2 - 知识图谱的What和Why 🧠
概述

在本节课中,我们将要学习知识图谱的基本概念及其重要性。我们将从数据管理的历史演变开始,探讨为何在当今大数据时代需要知识图谱,并了解其核心构成、应用场景以及面临的挑战。

数据管理的演变:从存储到关联

上一节我们介绍了课程概述,本节中我们来看看数据管理思想的演变过程。

早期的商业计算主要关注如何有效地存储和处理数据。人们很早就意识到,许多应用中的数据可以用节点和边构成的图来表示。例如,教授、课程和课程安排之间就存在复杂的关联关系。


然而,当时的焦点更多在于如何将这些逻辑关系高效地物理存储在磁盘上,逻辑表达与物理存储之间缺乏透明度。

到了20世纪70年代中期,实体-关系模型(E-R模型)的出现标志着一次进步。这个模型更侧重于概念建模,用于捕捉现实世界应用中的实体和关系,而不必直接映射到具体的物理存储方式。
进入20世纪90年代,面向对象模型开始流行。人们认识到对象之间存在着多种不同类型的关系,例如类之间的继承、组合以及一对多、多对多等关联,这使得数据模型变得更加丰富。

大数据时代的挑战与语义网的兴起

上一节我们回顾了数据模型的发展,本节中我们来看看大数据和互联网带来的新挑战。
计算能力的提升和互联网的普及导致了数据量的爆炸式增长。网络上的信息高度异构且相互关联,包括非结构化文本、图像、个人数据、科学数据等。我们面临的挑战是:如何以一种合理的方式搜索、管理和利用这些海量且关联的数据?

这引出了语义网的概念。语义网不仅关注网络数据的链接结构,还强调使用标准化的词汇和本体来定义信息的含义及其相互关系。另一个相关概念是关联开放数据,它倡导使用标准网络协议和RDF等框架来发布和链接数据。

以下是语义网技术栈的核心组成部分:
- 标准化词汇与本体:用于定义概念和关系。
- 资源描述框架:即RDF,一种用于描述资源的简单数据模型。
- 查询与推理:通过规则和推理系统挖掘深层关联。
什么是知识图谱?

上一节我们了解了数据关联的背景,本节中我们正式定义知识图谱。
我们不对“知识”进行哲学层面的讨论,而是采用一种数据驱动的视角。知识图谱是一种用于表示现实世界实体及其关系的图结构。它由“节点”(实体)和“边”(关系)构成。

一个完整的知识图谱系统通常包含以下部分:
- 知识库:存储实体和关系数据本身。
- 本体:定义数据的结构、概念层次和关系约束。
- 推理引擎:支持查询和基于关系的逻辑推理。
本体的角色与构建

上一节我们介绍了知识图谱的构成,本节中我们深入探讨其中的核心——本体。
本体是对领域内概念及其关系的正式表述。它有两个主要作用:一是帮助形式化地表达数据内容的结构;二是帮助定义领域本身的概念体系。
构建本体主要有两种方法:
- 人工设计:由领域专家根据经验共同讨论和定义。
- 从数据中推导:利用自然语言处理等技术,从非结构化文本中自动提取实体和关系,再经专家校验形成。

从数据到结构:RDF与Schema
上一节我们讨论了本体的构建,本节中我们看看如何用具体的技术表示这些结构。

现实世界中存在大量结构化和非结构化数据。知识图谱致力于从这些数据中提取结构。RDF是一种基础且强大的表示模型,它使用“主语-谓语-宾语”的三元组形式来描述事实。
为了表达比简单三元组更复杂的约束和关系,我们需要模式。schema.org是一个成功的例子,它提供了一套共享的词汇表,允许网站用结构化数据标记其内容,从而被搜索引擎更好地理解和展示。这种模式具有高度可扩展性,能够快速适应新需求(例如,在COVID-19疫情期间迅速扩展了相关词汇)。
为何需要知识图谱?

上一节我们介绍了知识图谱的技术基础,本节中我们探讨其应用价值。
在商业和互联网领域,知识图谱已广泛应用于:
- 增强搜索:如Google、Bing,能理解查询意图并展示关联实体信息。
- 智能推荐:如电商平台,利用关系网络实现“购买此商品的人也购买了...”。
- 智能助手:如Siri,提供更精准的答案。

在科学领域,知识图谱同样至关重要:
- 数据发现与探索:帮助科学家在海量数据中快速找到所需信息。
- 异构数据集成:将来自不同学科、不同格式的数据关联起来,支持跨领域研究。
- 连接数据与模型:建立科学数据与机器学习模型之间的关联,追踪数据来源和模型适用范围。
实践中的知识图谱项目

上一节我们了解了知识图谱的用途,本节中我们通过几个实际项目来加深理解。

美国国家科学基金会的“融合加速器”计划资助了多个知识图谱项目,以下是其中几个例子:
- 城市洪水应对:整合电网、道路、公共卫生、社会经济等孤立数据,结合洪水预测模型,构建城市洪灾知识图谱,为不同用户(市民、市政管理者)提供定制化视图。
- 生物医学研究:集成基因、疾病、组织表达等多源生物医学数据,构建知识图谱以发现疾病间的相互作用,并探索药物重用的新可能。
- 法庭记录开放化:处理PDF格式的公共法庭记录,提取法官、案件类型、当事人等实体,构建法律领域本体,使公众能自由查询和分析司法数据。
- 知识图谱编程环境:开发类似IDE的工具,提升构建知识图谱系统的抽象层次,内置数据质量调试和溯源功能,并支持团队协作开发。
- 地理空间知识增强:改进知识图谱对地理空间信息的处理能力,使其能理解复杂的空间关系(如邻接、包含),并与ArcGIS等专业工具集成。

此外,像Google的datacommons.org等项目,通过将公共数据集转化为知识图谱,提供了强大的数据探索工具。
挑战与未来方向
上一节我们看了一些前沿项目,本节中我们总结知识图谱面临的主要挑战。
尽管知识图谱前景广阔,但仍存在诸多挑战:
- 系统实现与性能:如何高效存储和查询超大规模图数据。
- 动态性与版本控制:知识本身不断演化,图谱需要支持动态更新、版本管理和一致性维护。
- 用户视角与数据质量:需要根据不同用户的需求提供不同粒度和可信度的信息视图。数据质量评估和不确定性处理是关键。
- 团队协作:构建高质量的知识图谱需要领域专家、本体工程师、数据科学家和技术人员的紧密合作。
总结
本节课中,我们一起学习了知识图谱的核心概念。我们从数据管理的历史出发,理解了在大数据时代,知识图谱作为关联和整合异构数据的关键技术的重要性。我们探讨了其以RDF三元组和本体为基础的技术原理,并看到了它在商业搜索、科学发现等多个领域的强大应用。最后,我们也了解了构建和维护知识图谱所面临的动态性、协作性等现实挑战。知识图谱正在成为驱动未来数据智能不可或缺的基础设施。
注:本教程根据陈巴尔博士的讲座内容整理,旨在为初学者提供清晰的知识图谱入门指引。

📚 课程 P20:L13.1 - 知识图谱交互方式
在本节课中,我们将学习用户如何与知识图谱进行交互。我们将从概述用户与知识图谱交互的不同模式开始,探讨可视化设计的一般原则和最佳实践,并简要介绍结构化查询与自然语言查询这两种关键技术。最后,我们将通过一个实际案例来加深理解。
🎯 用户为何需要知识图谱?
知识图谱通常以节点和边的图形形式展示。这种模式图(Schema)的表示非常清晰,例如在供应链网络中,我们可以清晰地看到“产品”、“供应商”等实体及其关系。
然而,当知识图谱包含数百万个实例数据时,直接将复杂的图结构呈现给最终用户可能并非最佳方式。用户消费知识图谱内容的方式需要更细致的设计。
🔄 用户与知识图谱的交互模式
用户与知识图谱的交互主要可以分为四种模式:
- 推送模式:由系统(如IT或分析部门)进行批处理,将处理后的结果主动呈现给用户。用户不直接操作图谱。
- 拉取模式:用户通过界面主动查询知识图谱,心中已有明确的问题需要解答。
- 已知问题探索:用户带着固定的、预先定义好的问题来使用系统。
- 未知问题探索:用户没有特定问题,旨在通过系统浏览和分析数据,以发现意想不到的洞察。
每种模式都需要设计不同的用户界面。
🖥️ 交互技术组合
访问知识图谱的交互技术通常是多种方法的组合,而非单一技术。常见的组合包括:
- 关键词搜索
- 结构化查询
- 表格形式的结果展示
- 可视化结果展示
接下来,我们将深入探讨可视化设计的原则。
📊 可视化设计:核心原则与目标
可视化的核心目标是扩大用户对数据的理解。当数据量庞大时,有效的可视化能帮助用户更容易地获取洞察。
以下是实现该目标的六种关键技术:
1. 一次性呈现超出记忆范围的信息
通过将大量数据点置于有意义的上下文中呈现,帮助用户获得整体概览。例如,在地图上同时显示所有待租公寓的位置和通勤关键点。
2. 减轻信息寻找的负担
提供过滤、排序等交互控件,让用户能快速缩小关注范围。例如,通过租金、卧室数量等过滤器筛选公寓。
3. 将相关数据并列呈现
将关键数据置于对比语境中,以揭示其真实含义。例如,将COVID-19病例数与其他主要死因的数据并列展示。
4. 跟踪用户注意力
在界面中明确指示用户当前在整体信息空间中所处的位置。例如,电商网站的商品分类导航面包屑。
5. 通过信息抽象提供概览
初始时隐藏细节,提供高层次的数据抽象视图(如地图上的点)。用户可在此基础上按需深入查看细节。
6. 支持交互与操作
允许用户与可视化图表进行交互,如缩放、平移、动态过滤等,以主动探索数据。
🎨 可视化设计选择
在设计可视化界面时,我们有五个关键的设计选择:
- 选择合适的空间基底:根据数据特性选择布局,如地理数据用地图,层次数据用树状图。
- 使用标记区分数据点:利用点、线、面、体等图形元素来代表不同类别的数据。
- 利用连接与外壳表示关系:使用连线表示实体间的关系,用区域包裹表示集合或层次。这是知识图谱可视化的常用手段。
- 选择合适的视网膜属性:通过颜色、大小、纹理、透明度等视觉变量来编码数据的不同维度。
- 对时变数据使用动画:如果数据随时间变化,动画能有效展示其演变过程。
🏗️ 可视化类型与设计流程
可视化主要有四种类型:
- 简单可视化:将数据静态映射到最多三个维度。
- 组合可视化:将多个简单视图组合在一起。
- 交互式可视化:用户可通过控件操作视图。
- 主动式可视化:系统预测用户兴趣,主动推荐或高亮相关信息。
一个有效的设计流程可以遵循以下五个步骤:
- 确定需要映射到空间维度的核心变量。
- 尝试通过组合映射增加信息维度。
- 选择颜色来强调和突出关键信息。
- 为用户交互和过滤添加控制控件。
- 遵循“概览优先,细节可选”的模板:先提供整体概览,再支持缩放、过滤和详情查询。
🔍 结构化查询接口
结构化查询要求用户的查询符合预定义的语法。系统可以利用该语法实现查询的自动完成和问题建议。
工作原理:
给定一个知识图谱模式(例如:国家包含州,州有首府城市,山位于国家),我们可以定义一套语法规则。当用户输入“面积最大的城市”时,系统能将其解析为符合语法的结构:地理区域 -> 城市 -> 聚合函数(最大) -> 属性(面积)。
优势与局限:
这种方法在领域有限、模式明确的场景下非常高效,因为语法工程的范围可控。然而,它难以处理自然语言中大量的表达变体,扩展性较差。
💬 自然语言查询接口
为了处理更灵活的自然语言提问,我们需要更先进的技术——语义解析。
系统组件:
一个典型的语义解析系统包含五个部分:
- 执行器:将逻辑形式转化为可执行的查询(如SQL、SPARQL)。
- 语法:一组将自然语言片段映射到可执行形式的规则。
- 模型:为不同可能的解析结果分配概率。
- 解析器:分析输入语句,并选择概率最高的解释。
- 学习器:利用训练数据来优化模型参数,有时也能扩展语法。
核心挑战:
构建高性能的自然语言查询接口极其困难,最大的瓶颈在于需要大量高质量的标注数据进行模型训练。虽然初期可以较快达到一定准确率,但要实现实用化需要巨大的工程投入。
✅ 课程总结
本节课我们一起探讨了知识图谱的交互方式。核心要点如下:
- 用户与知识图谱的交互有推送、拉取、已知问题探索和未知问题探索等多种模式。
- 图形可视化并非知识图谱的唯一或最佳界面,它只是众多呈现方式中的一种。
- 可视化设计的根本目标是扩大用户对数据的理解,应遵循一系列设计原则和最佳实践。
- 查询接口主要有结构化查询和自然语言查询两种。前者在受限领域内高效,后者更灵活但实现难度大。
- 理想的用户界面应是多种技术(如搜索、过滤、可视化、查询)的组合,其设计应始终以帮助用户高效获取洞察和解答问题为核心驱动。


记住,知识图谱本身可能隐藏在后台,而前台呈现给用户的,应该是一个为其特定任务和目标量身定制的高效界面。

课程 P21:L13.2 - 为搜索引擎构建知识面板 🧠

在本节课中,我们将学习如何为搜索引擎构建知识面板。知识面板是搜索结果页面右侧的信息摘要卡片,它从知识图谱中提取关键信息,为用户提供快速、准确的概览。我们将重点介绍如何利用维基百科和维基数据等公开数据源,通过一系列数据处理和转换步骤,高效地构建并呈现知识面板。
项目背景与目标
首先,我们来了解一下项目的背景。Neeva 是一个全新的搜索引擎,其核心理念是不依赖广告收入,从而确保其激励机制与最终用户保持一致。这意味着我们需要从头开始构建许多功能。
在用户测试过程中,我们发现用户非常依赖知识面板。知识面板是当用户搜索某个实体(如“阿尔伯特·爱因斯坦”)时,出现在搜索结果右侧的信息摘要。它通常包含该实体的关键事实、图片和简介。
不同的搜索引擎对事实的优先级不同。例如,谷歌的知识面板可能优先显示“子女”和“配偶”信息,而其他搜索引擎可能更关注“身高”或“兄弟姐妹”。我们的目标是构建一个能够灵活定制、快速响应的知识面板系统。
数据源选择:维基百科与维基数据
为了尽快构建知识面板,我们需要从可靠的数据源开始。最直接的选择是维基百科,因为它已经为许多实体提供了结构化的“信息框”。
维基百科的信息框包含了实体的摘要信息,例如出生日期、国籍等。其内部表示是维基标记语言,其中包含复杂的模板和类型层次结构。然而,直接解析这些信息框存在挑战:一是缺乏优秀的解析器,二是我们最终需要构建自己的表示层以支持灵活的定制和本地化(例如,按用户偏好格式化日期)。
因此,我们决定同时使用维基百科和维基数据。维基数据是维基媒体基金会维护的开放知识图谱,它以“主体-谓词-客体”三元组的形式存储结构化数据。我们使用维基百科来获取实体的摘要文本和缩略图,而使用维基数据来获取需要渲染的具体事实。
核心架构:预处理与服务
我们的首要设计目标是低延迟。研究表明,搜索结果页面的加载时间越长,用户流失的可能性就越高。因此,我们必须尽可能快地向用户呈现知识面板。
最初的设想是将所有三元组加载到图数据库中,并在服务时执行 SPARQL 查询。但问题在于,有些查询很简单(单跳查询),有些则很复杂(多跳查询),难以预估查询时间。
鉴于我们的数据相对静态,我们决定将尽可能多的工作转移到构建时进行预处理。具体流程如下:
- 构建时:我们将从维基数据获取的实体“扁平化”为一种中间表示(Intermediate Representation, IR)。
- 服务时:当用户搜索一个实体时,我们的搜索引擎会判断顶部结果是否来自维基百科。如果是,则使用维基百科的 URL 作为键,从键值存储(我们使用 ScyllaDB)中获取该实体的中间表示。
- 渲染时:根据用户的区域设置等信息,将中间表示转换为最终的显示格式(如 HTML 或 React Native),然后呈现给用户。
通过这种方式,我们将复杂的计算和转换工作提前完成,从而保证了服务时的极速响应。
规则定义与数据处理
我们需要一种方法来指定如何为不同类型的实体提取和呈现事实。例如,对于“人”这类实体,我们可能关心“出生日期”、“国籍”、“知名作品”等属性,并且希望按特定顺序展示。
为此,我们构建了一个内部工具。工程师可以在工具中为特定类型的实体定义规则。每条规则对应维基数据中的一个谓词,并指定如何提取和转换该谓词的值。
以下是定义规则的核心要素:
- 规则名称:例如
human。 - 目标类型:例如“是
human(Q5) 的实例”。 - 提取规则:指定要提取的谓词,以及值是单数(
singleton,如出生日期)还是列表(list,如曾效力球队)。 - 转换器:将原始值(如日期字符串、计量单位)转换为适合渲染的格式。
这个工具的输出是一个用 YAML 描述的程序,它定义了如何处理数据。然后,我们使用 PySpark 作业来执行这个“程序”:读取维基数据的 JSON 转储文件,应用转换规则,最终生成每个实体的中间表示文件,并存储到 ScyllaDB 中。
处理复杂关系:反向查找
大多数事实是“一跳”关系,即直接关联到当前实体。但有些需要展示的信息隐含在多跳关系中。例如,我们想展示“加利福尼亚州的参议员是黛安·范斯坦”。维基数据中没有直接从“加利福尼亚州”到“黛安·范斯坦”的边。
维基数据中存储的是:黛安·范斯坦 (subject) 通过谓词“担任职位” (position held) 关联到客体“美国参议员” (United States Senator),而这个关系有一个限定词“选区” (constituency),其值为“加利福尼亚” (California)。
为了处理这种情况,我们进行了额外的预处理:
- 在构建时,我们运行另一个 PySpark 作业,专门查找满足“担任职位 → 美国参议员 → 选区 → 某个州”这类路径的实体。
- 当找到这样的路径时,我们建立一个“反向查找”数据库。例如,记录“加利福尼亚州”有一个反向属性“参议员”,其值是“黛安·范斯坦”。
- 在服务时,如果渲染规则要求获取“州”的“参议员”,系统会查询这个内存中的反向数据库,并将结果像普通事实一样渲染出来。
这再次体现了我们的设计哲学:用构建时的计算复杂度换取服务时的速度和简单性。
增强数据:图片、摘要与地图
仅仅使用维基数据有时不够。例如,维基数据中“阿甘”实体的图片可能是一个蜡像,而维基百科文章中的图片则是更合适的电影海报。因此,我们转而从维基百科的 HTML 转储中提取信息框内的图片,并进行优化(如缩放)以加快加载速度。
对于实体摘要,我们直接采用维基百科文章的第一段(它通常是全文的简明概述),并移除发音指南、脚注等无关内容。
用户还希望为城市、州等地理实体显示地图。维基数据只提供边界框坐标,不足以渲染精确形状。为此,我们引入了 OpenStreetMap 数据集,它包含地理实体的精确边界形状和中心点,并且其数据条目也关联了维基数据实体 ID,便于我们进行匹配和整合。
未来规划:P2 特性
在完成核心功能(P0)和上述增强功能(P1)后,我们规划了下一阶段(P2)的工作:
- 实时更新:监听维基数据的编辑流,在数据发生变化(如名人去世、选举结果更新)时,异步触发对应实体的重新处理和索引,确保知识面板信息的时效性。
- 实体列表:支持对“史蒂文·斯皮尔伯格电影”或“阿拉巴马州知名人士”这类查询,返回并渲染一个实体列表,而不仅仅是单个实体的知识面板。
总结
本节课我们一起学习了为 Neeva 搜索引擎构建知识面板的全过程。我们总结一下其中的关键策略:
- 延迟优先:通过将大量工作从服务时转移到构建时预处理,我们确保了极低的用户端延迟。
- 数据驱动:我们主要依赖维基百科和维基数据这两个高质量、开放的数据源,并在必要时(如图片、地图)用其他数据集进行补充。
- 灵活定义:通过内部工具,允许工程师以声明式的方式定义不同实体类型的渲染规则,实现了高度的可定制性。
- 渐进增强:我们从最简单的核心功能(P0)开始,逐步添加图片、摘要、地图等增强功能(P1),并规划了实时更新等更复杂的特性(P2)。
- 系统整合:构建的知识图谱不仅用于知识面板,也用于提升搜索引擎对查询意图的理解(如地域消歧)。
最终,我们成功构建了一个能够快速、准确、美观地呈现实体信息的知识面板系统,为搜索引擎用户提供了出色的体验。


课程 P22:L14.1 - 逻辑语言(英语)计算 🧠➡️💻
在本节课中,我们将学习一种名为“逻辑英语”的计算机语言。它是一种基于逻辑编程的语言,但使用类似英语的语法,目标是让没有数学或逻辑背景的人也能轻松阅读和理解。我们将探讨它的基本概念、特点、应用以及与知识图谱的关系。


概述

逻辑英语被视为一种计算机语言,本质上是逻辑程序的“语法糖”。它非常接近逻辑程序,可以轻松翻译成逻辑程序。同时,它的设计灵感很大程度上来源于法律文件的语言。逻辑英语的主要优点是,无需数学、计算或逻辑训练即可阅读。它有可能成为一种未来的通用计算机语言,让受计算机程序影响的人能够理解程序在做什么。
逻辑英语的背景与发展

上一节我们介绍了逻辑英语的基本概念,本节中我们来看看它的发展背景和相关工作。

逻辑英语的研究可以追溯到1982年,当时的工作涉及向儿童教授逻辑作为一种计算机语言。我们从语义网络开始,这是一种很好的知识图形表示方法,并展示了如何扩展语义网络以包含规则。
除了逻辑编程,相关的工作领域还包括“受控自然语言”。特别是,Attempto Controlled English (ACE) 等项目试图控制英语的语法。最近,许多专门建立在逻辑编程基础上的发展出现,它们使用加糖的语法,但重点不是作为通用语言,而是作为领域特定语言。

最接近今天展示作品的是“Roe”,它是逻辑编程语言“应答集编程”(ASP)的语法糖。它使得常规的ASP语法变得冗余,因为可读性强的英文版本随处可得。

逻辑英语的核心特点与表示
了解了背景后,本节我们深入探讨逻辑英语的核心特点及其表示知识的方式。
逻辑英语的基本形式是使用子句,就像在逻辑编程中一样,有一个单一的结论和多个条件。我们使用中缀、前缀或后缀形式来书写这些子句。
以下是逻辑英语的一些核心特点:

- 变量与类型:在逻辑程序中,变量的量化是隐式的。逻辑英语使用不定冠词(a/an)引入变量,并使用普通名词(如“部分”、“账户”)给出变量的类型。例如:
a part X of Y。 - 介词表示角色:介词(如“of”)给出了谓词的角色。例如,“part of”中的“of”就是介词。
- 无代词:逻辑英语中没有“他”、“她”或“它”这样的代词,这是为了避免普通语言中最大的歧义来源之一。
- 单数与现在时:所有名词和动词都是单数,并且使用现在时态。时间概念通过具体化时间变量来处理,这比涉及模态和可能世界语义的相关逻辑要简单得多。

我们可以用逻辑英语来表示知识图谱中的关系。例如,对于“一个人参与一项研究”和“一项研究是关于一种化学物质的”这样的关系,我们可以用以下方式声明谓词:

a person participates in a study.
a study is about a chemical.

从语义网络到逻辑规则


上一节我们看到了如何表示事实,本节我们来看看如何用逻辑英语表达规则,进行推理。

逻辑英语可以轻松地将语义网络中的关系扩展为规则。例如,假设我们有一个知识:“一家公司生产一种产品”和“该产品含有一种化学物质”。我们可以推导出一条规则:“该公司对该化学品有兴趣”。


在逻辑英语中,这条规则可以写成:
a company has an interest in a chemical
if the company produces a product that contains the chemical.
在这个规则中:
- 首次引入的变量(如“a company”、“a chemical”)使用不定冠词。
- 在同一句子中再次提及的变量使用定冠词“the”。
- 结论中的“an interest”是一个存在量词,表示“存在一种兴趣关系”。
这种表示方法使得复杂的推理链条可以用接近自然语言的方式清晰地表达出来。

处理时间与存在量词

逻辑英语如何表达时间这种复杂概念?变量量化又有哪些细微之处?本节我们来探讨这些技术主题。
处理时间:通过将时间具体化为变量,我们可以用现在时态谈论过去或未来的事件。例如,关于账户余额变化的规则可以这样写:
the balance in an account is an amount B at a time T2
if an amount A is transferred to the account from another account at an earlier time T1,
and T1 is before T2,
and the balance in the account is an amount B1 at the time T1,
and B is the sum of A and B1.
这里,时间点T1和T2是变量,使得整个规则能用现在时陈述。

存在量词:这是一个需要特别注意的技术点。
- 在逻辑英语中,所有出现在条件部分的变量都是全称量词,其范围仅限于该句子。
- 然而,如果变量出现在原子句子(事实) 或规则的结论部分,并且不在条件中,那么它通常是存在量词,并且具有更广的范围,可以在其他句子中被引用。

例如:
An amount is transferred from Bob’s account to Mary’s account.(这是一个事实,其中的“An amount”是存在量词,指某个特定的金额。)An amount is transferred from Bob’s account to Mary’s account if today is the first day of the month.(这是一个规则,结论中的“An amount”是存在量词,它是月份的函数。我们可以另写一句:The amount transferred is greater than or equal to ten pounds.来引用这个特定的金额。)

复杂领域应用示例
为了展示逻辑英语处理复杂现实问题的能力,我们来看一个来自法律金融领域的挑战性例子。

以下是国际掉期和衍生品协会主协议中关于“提前终止”条款的一段简化逻辑英语翻译:
A party has the right to designate an early termination date
if an event of default occurs with respect to the other party.
However, the party does not have the right to designate an early termination date
if automatic early termination is specified to apply in the schedule.
An early termination date occurs automatically at the time an event of default occurs
if automatic early termination is specified to apply in the schedule.


这个例子展示了逻辑英语如何清晰地表达法律条文中的逻辑结构:
- 每个句子都有结论和条件。
- “However”这样的转折词被翻译为对前句条件的否定(
if automatic early termination is specified...),这是逻辑编程中处理例外情况的标准方式。 - 结论中的“an early termination date”是存在量词,它是违约事件和当事方的函数。

总结与展望

本节课中,我们一起学习了“逻辑英语”这种独特的计算机语言。

我们了解到,逻辑英语是逻辑程序的语法糖,旨在成为一种人类可读且可执行的规范语言。它的核心特点包括:使用类似英语的子句、通过冠词和名词表示变量与类型、用介词表示角色、避免代词和使用单数现在时。它能够处理时间推理和存在量化等复杂概念,并已应用于法律合同等专业领域。

逻辑英语不仅是一种比许多形式逻辑更简单的逻辑体系,也是一种可以明确表达句子意图的英语形式。它未来有潜力成为一种能被广大利益相关者(而不仅仅是软件工程师)理解、辩论和解释的通用计算机语言。

感谢鲍勃·科瓦尔斯基教授对逻辑英语的精彩概述。


课程 P23:L14.2 - 问答系统中基于语言模型和知识图谱的知识推理 🧠

在本节课中,我们将学习如何结合预训练语言模型和知识图谱,构建一个更强大的问答系统。我们将探讨两种知识来源的互补性,并详细介绍一种名为 QA-GNN 的新型混合模型。
概述
问答是自然语言处理中的一个基本任务。一个优秀的问答系统需要获取相关知识并进行推理。通常,知识可以编码在两种形式中:
- 大型预训练语言模型(如 BERT、GPT-3),它们从海量非结构化文本中学习,拥有广泛的知识覆盖。
- 结构化知识图谱(如 Freebase、ConceptNet),其中实体是节点,关系是边,支持结构化和可解释的推理。
这两种来源各有优劣:语言模型知识面广但可能不擅长逻辑推理;知识图谱结构清晰但可能覆盖不全且有噪声。本课程的目标是探索如何结合两者,以提升问答系统的性能。
预备知识:语言模型与图神经网络
在深入主要工作之前,我们先简要回顾两个重要的构建模块:语言模型和图神经网络。
语言模型 (Language Models)
语言模型的目标是:给定一段文本的部分序列,预测文本的其余部分。主要有两种类型:
- 自回归语言模型:预测下一个词,给定前面的一系列单词。
- 例如:给定 “狗追逐”,预测下一个词可能是 “飞盘”。
- 掩码语言模型:预测一个序列中被掩码的单词。
- 例如:在 “斯坦福大学位于 [MASK]” 中,预测 “[MASK]” 可能是 “加利福尼亚”。
为了做好预测,语言模型需要掌握各种技能,包括事实知识、语法知识和常识。现代语言模型通常是基于 Transformer 架构的大型神经网络,并在海量文本(如维基百科、书籍)上进行预训练,从而获得广泛的知识。BERT、RoBERTa、GPT-3 等都是著名的例子。
预训练后的语言模型可以通过微调,适应各种下游任务,例如问答。一种常见的方法是:将问题和每个候选答案连接成一个句子,输入语言模型,再通过一个线性层得到每个答案的概率得分。
语言模型的优势在于其广泛的知识覆盖,这得益于大规模语料库的预训练。它们可以处理各种问答问题,包括一些难以用知识图谱查询直接回答的常识性问题。
图神经网络 (Graph Neural Networks, GNNs)
GNN 的基本思想是:通过让图中相邻节点相互传递信息,来更新每个节点的表征(嵌入)。
假设节点 v 当前的表征是 h_v^(k-1)。其更新规则通常包括两个步骤:
- 聚合 (Aggregate):收集来自邻居节点
u的信息。- 例如,对邻居表征求和:
a_v = SUM( h_u )
- 例如,对邻居表征求和:
- 组合 (Combine):结合自身表征和聚合信息,更新当前节点。
- 例如,使用线性变换:
h_v^k = σ( W * CONCAT(h_v^(k-1), a_v) )
- 例如,使用线性变换:
通过多层这样的操作,GNN 可以学习到图中节点更好的表示。在本课程中,我们将使用 GNN 来学习知识图谱中节点的表示。
挑战与动机
为什么结合语言模型和知识图谱进行问答既困难又有趣?
假设系统遇到一个常识问题:“圆刷是以下哪项的一个例子?”,并提供选项“发刷”和“艺术用品”。系统需要:
- 从一个庞大的、可能有噪声的知识图谱中,检索出与当前问题相关的子图。
- 理解问题的含义(包括否定等复杂逻辑),并结合知识图谱的结构(实体间关系)进行联合推理。
这两点构成了本课题的核心研究挑战。
QA-GNN 模型介绍
为了应对上述挑战,我们提出了 QA-GNN,一种结合语言模型和知识图谱的新型混合模型。以下是其核心流程概述:
- 编码:给定问答上下文(问题+候选答案),我们使用预训练语言模型将其编码为向量表示。
- 检索:使用标准方法(如实体链接)从知识图谱中检索出一个相关的子图。
- 核心创新一:语言条件化的 KG 节点评分:为了更好地识别哪些图谱节点与问题相关。
- 核心创新二:联合推理:将问题文本和知识图谱连接成一个统一的图进行推理。
- 预测:结合语言模型和知识图谱的表示,预测最终答案。
接下来,我们将详细解释两个核心创新点。
核心创新一:语言条件化的 KG 节点评分 🎯
动机:传统的知识图谱检索方法是识别问题中的主题实体,然后提取其多跳邻居。这可能会引入大量语义上无关的节点,特别是当主题实体增多或跳数增加时。
方法:我们提出使用预训练语言模型,以当前问题为条件,对知识图谱中每个节点的相关性进行评分。
具体而言,我们将问答上下文与知识图谱中的每个实体连接起来,输入语言模型,计算该实体在给定上下文下的概率。得分高的实体(如图中的“抢劫”、“安全”)被认为与问题更相关,得分低的实体(如“河岸”)则相关性较低。


应用:这个相关性分数有两种用途:
- 剪枝:用于修剪知识图谱,使输入模型的图谱更小,提高效率。
- 加权:作为知识图谱的附加注释特征,为图谱提供权重信息。在 QA-GNN 中,我们采用了后一种方式。
核心创新二:联合推理与工作图 🔗
为了给两种知识来源设计一个联合推理空间,我们显式地将它们连接到一个公共的图结构中。
我们引入一个 QA 上下文节点 Z,并将其连接到知识图谱中的每个主题实体。这个统一的图直观地提供了推理的“工作记忆”,因此我们称之为 工作图。
工作图中的节点有四种类型:
- 紫色:QA 上下文节点。
- 蓝色:问题中出现的实体。
- 橙色:答案选项中出现的实体。
- 灰色:其他实体。
QA 上下文节点的初始表示来自语言模型的编码,其他节点的初始表示则使用预训练的实体嵌入。
基于注意力的图神经网络推理:在工作图上,我们使用基于注意力的 GNN 进行推理。GNN 的基本思想是让相邻节点通过多层相互传递信息来更新表示。
在我们的模型中,节点 t 的更新规则可以表示为:
h_t^k = UPDATE( h_t^(k-1), AGGREGATE( α_{s,t} * m_s ) )
其中,m_s 是来自邻居节点 s 的信息向量,α_{s,t} 是源节点 s 和目标节点 t 之间的注意力权重。
我们让计算注意力权重所需的查询(Query)和键(Key)向量以节点的相关性分数为参数,并使用内积来计算注意力权重。这样,模型在传播信息时会更加关注那些被语言模型判定为相关的节点。
实验与评估
实验设置
我们使用两个需要知识推理的流行 QA 基准进行评估:
- CommonsenseQA:测试常识知识的多项选择题数据集。
- OpenBookQA:测试基础科学知识的多项选择题数据集。
对于知识图谱,我们使用 ConceptNet(一个包含近百万实体的开放域知识图谱)。我们比较了以下系统:
- 微调的语言模型(如 RoBERTa)。
- 之前的语言模型+知识图谱模型(如关系网络)。
- 我们提出的 QA-GNN。
所有系统都使用相同的预训练语言模型 RoBERTa 作为基础。
主要结果
QA-GNN 在两个 QA 基准上都取得了优于之前系统的性能。
消融研究
为了验证两个核心创新的效果,我们进行了消融实验:
- 移除联合图:如果不形成文本和知识图谱的联合图并进行相互更新的表示传递,性能会下降约 2%,结果接近于之前的 LM+KG 模型。
- 移除 KG 节点评分:如果不使用语言模型对 KG 节点进行相关性评分,性能会下降约 1%。
- 节点评分的帮助场景:当问题中实体数量较多,或检索到的知识图谱子图很大时,KG 节点评分往往更有帮助。
- 联合推理的帮助场景:当问题包含否定等需要丰富推理的情况时,联合图表示和消息传递往往更有帮助。
案例分析
我们通过追踪 QA-GNN 中注意力流的路径,尝试解释模型的推理过程。
例1:对于问题“电梯服务于建筑物中的什么?”,模型关注“电梯”和“地下室”,并通过知识图谱中的路径(电梯->建筑物->办公楼)推理出答案。
例2:对于问题“盐水是海洋的一部分,那么淡水是什么的一部分?”,模型关注问题实体“淡水”和“盐水”,并在知识图谱上找到桥接实体(如“湖泊”、“河流”)来推理答案。
鲁棒性测试:QA-GNN 能够处理一些需要鲁棒推理的情况,如否定和实体替换。
- 否定翻转:在“圆刷是没有用处的例子”中,模型关注“艺术用品”;当否定词被移除,问题变为“圆刷是有用的例子”时,模型转而关注“发刷”。
- 实体替换:将原问题中的实体进行替换,模型能根据上下文调整答案。
相比之下,像 RoBERTa 这样的纯语言模型在这些测试中容易失败。
知识源互补性分析
我们分析了知识图谱和语言模型分别在什么情况下更有帮助。
知识图谱有帮助的场景:
- 当答案依赖于具体的知识(如事实、反义词、否定)时。
- 例子:问题“如果你有拖延工作的倾向,为了按时完成,你必须做什么?” 知识图谱提供了从“延迟”到“加速”(反义词)的明确路径。
- 当知识图谱路径能为推理提供支持时。
- 例子:问题“黄鼠狼一直钻进鸡蛋里,农民用什么来阻止它?” 知识图谱提供了从“黄鼠狼”到“鸡”到“鸡蛋”再到“栅栏”的多种路径。
语言模型有帮助的场景:
- 当问题需要微妙的语言细微差别和常识,而简单地依赖知识图谱路径可能导致错误时。
- 例子:问题“詹姆斯抬起头,看见星星在黑暗中闪烁,他对它们的什么感到惊讶?” 语言模型能根据常识选择“宇宙的大小”,而知识图谱感知方法可能错误地关联到“夜空”。
- 例子:问题“如果在混合液体餐中加入盐和胡椒粉,你会得到什么?” 语言模型能正确预测“汤”,而知识图谱方法可能错误关联到“水”。
启示:语言模型和知识图谱具有互补的优势。在一个“预言机”实验中(如果语言模型或知识图谱方法中任何一个答对即算成功),性能远高于单独的 RoBERTa 或 QA-GNN。这暗示了一个有趣的未来研究方向:让模型学会动态决定在何时依赖哪种知识源。
总结
本节课我们一起学习了如何结合预训练语言模型和知识图谱来构建更强大的问答系统。我们介绍了 QA-GNN 模型,其核心创新在于:
- 语言条件化的 KG 节点评分:使用语言模型评估知识图谱节点与问题的相关性,为图谱提供软权重或检索依据。
- 联合推理:将文本和知识图谱连接成统一的工作图,通过图神经网络让两种知识源的表示相互更新、共同推理。
通过实验和分析,我们发现:
- 当检索到的知识图谱很大或有噪声时,节点评分方法更有帮助。
- 当问题需要处理否定等复杂推理时,联合图上的消息传递更有帮助。
- 语言模型和知识图谱在问答任务中具有显著的互补性。
未来的工作可以探索更模块化的架构,让模型能更智能地选择和融合不同的知识源。

课程 P24:L15.1 - 从0到亿的产品知识图谱构建之路 🚀
在本节课中,我们将学习如何构建一个大规模、高质量的产品知识图谱。我们将跟随亚马逊的实践,了解从零开始,到处理数以亿计产品数据所面临的独特挑战、技术策略与解决方案。


概述
产品知识图谱旨在以结构化的方式表示产品及其属性、类别和关系,以提升搜索、推荐和购物体验。构建此类图谱面临数据稀疏、领域复杂、规模庞大等独特挑战。本节将系统性地介绍应对这些挑战、实现从零到亿级规模扩展的技术路径。
通用知识图谱 vs. 产品知识图谱
上一节我们介绍了知识图谱的基本概念,本节中我们来看看通用知识图谱与产品知识图谱的区别。
通用知识图谱涵盖广泛领域的实体和关系,例如人物、地点、事件等。以下是一个关于歌曲的通用知识图谱示例:
- 节点:代表实体,如“一段录音”、“一个流派”。
- 边:代表关系,如“录音-属于-流派”。
产品知识图谱则专注于商品领域。其核心是产品实体及其变体(如不同尺寸、口味)和属性(如品牌、功能)。
核心区别:两者是重叠关系。通用图谱包含部分产品(如书籍、电影),而产品图谱则包含大量零售领域特有的品类(如家具、电子产品、服装、消耗品),这些通常不在通用图谱中。
产品知识图谱的构建目标与挑战
构建产品知识图谱的目标是回答关于产品的任何问题,并改进搜索、推荐和语音购物等体验。
然而,在产品领域构建图谱面临几大独特挑战:
以下是构建过程中面临的主要挑战:
- 数据稀疏且噪声大:零售商提供的数据结构化程度低,关键信息埋藏在标题和描述中,且现有结构化信息可能不准确或无关。
- 领域极其复杂:存在数百万种产品类型,需要构建清晰的产品分类树,并协调卖家分类与买家视角。
- 属性与价值多样:不同产品类型拥有不同的属性,同一属性在不同品类下的价值表达方式差异巨大。
- 规模化扩展困难:需要将系统扩展到数千属性、百万类别、数百种语言,但可用于训练的标注数据却非常有限。
从零到亿:四步构建策略
面对“百年工程”般的挑战,我们采用分步推进的策略来实现规模化构建。
第一步:从零到一 🎯 - 追求高精度
这是最关键的一步,目标是开发高精度模型以抽取准确的知识。我们以“属性值填充”任务为例。
任务:从产品标题中抽取如“形态”(液体/粉末)、“口味”等属性值。
解决方案:采用序列标注模型(如BiLSTM + Attention + CRF)。我们将输入文本(如“牛肉粉和牧场饲养羊肉食谱”)中的目标值标注为B(开始)、I(内部)、E(结束)标签。
# 序列标注示例:抽取“口味”
输入: “牛肉粉 和 牧场 饲养 羊肉 食谱”
标签: B-口味 I-口味 O B-口味 I-口味 I-口味 E-口味 O
此模型为“开放标签”模型,能识别训练数据中未出现过的新值。初期构建流程依赖大量人工进行数据标注、模型调优、后处理规则编写和发布前评估,以确保达到生产环境要求的精度(如90%)。
第二步:从一到千 ⚙️ - 构建自动化管道
为了降低建模成本并处理更多数据,我们需要建立端到端的自动化管道。
以下是自动化管道的核心改进点:
- 训练数据生成:应用远程监督和数据编程技术,自动生成训练数据,减少人工标注。
- 数据清洗:开发基于Transformer的深度学习模型,自动识别并清理模型抽取的错误值。
- 评估规模化:通过分层抽样等方法,用更少的样本实现统计意义上可靠的评估。
- 自动机器学习:引入AutoML,让数据工程师也能通过端到端管道训练和部署模型,减少对数据科学家的依赖。
第三步:从千到百万 🔄 - 实现迁移学习
要覆盖百万级类别,必须大幅减少需要训练和维护的模型数量。我们采用迁移学习,训练通用模型。
关键技术一:类别感知的注意力机制
将产品类别信息作为输入,通过注意力机制让模型感知当前文本所属的品类,从而更准确地抽取属性。这使模型F1值提升了10个百分点。
关键技术二:多任务学习与参数共享
- 多任务学习:让模型同时学习属性值抽取和产品分类,帮助模型识别标题中的关键信息。
- 参数共享:通过属性嵌入层和混合专家网络,让模型为不同属性动态生成CRF层参数。只需训练一个模型,即可处理多个属性,其效果甚至优于为每个属性单独训练的模型。
第四步:从百万到亿 📈 - 提升召回率与多模态融合
为实现高覆盖率(高召回率),我们需融合多源信息。
多模态信息抽取:除了文本,利用产品图片中的视觉信息和OCR识别文本。通过多模态Transformer模型融合图像特征、OCR文本和商品描述文本,共同预测属性值。实验表明,融合多模态信息比仅用文本将F1值提升了11%。
网页信息提取:从外部电商网站、品牌官网等渠道提取产品信息,进一步丰富和补充知识图谱的数据。
工业实践中的成功经验与展望
根据工业界实践,知识图谱的以下子领域较为成功:
- 实体链接:判断产品是否相同。
- 知识抽取与清洗:从文本中抽取信息并纠正错误。
- 基于知识的问答。
成功的领域通常具备两个条件:业务上不可或缺(如处理数十亿产品必须自动化)和技术已准备就绪(达到生产可用的精度与召回率)。
目前挑战较大、尚未大规模成功的领域包括:
- 大规模模式映射:自动对齐不同数据源的模式。
- 开放信息抽取:不预先定义关系类型进行抽取。
- 知识融合:解决多源数据的冲突。
- 知识推理:利用嵌入模型推断新关系。
这些领域仍需技术突破和更强的业务需求驱动。
总结


本节课我们一起学习了构建亿级产品知识图谱的完整路径。我们首先明确了产品图谱的独特性和挑战,然后系统性地介绍了四个关键发展阶段:从追求高精度的启动阶段,到建立自动化管道以提升效率,再到利用迁移学习实现大规模扩展,最后通过多模态融合提升数据覆盖率和召回率。工业实践表明,结合坚实的业务需求与成熟的技术,是知识图谱项目成功的关键。


📚 课程 P25:L15.2 - 构建可持续知识图谱
概述
在本节课中,我们将学习如何设计和构建一个高质量、可持续的知识图谱。我们将探讨从明确需求、复用现有术语到建立更新和维护策略的全过程,目标是构建一个不仅满足当前项目需求,也能被他人长期使用和维护的知识图谱。

1. 知识图谱与本体论简介
知识图谱本质上是连接实体的网络。图中的节点代表实体,边代表实体间的关系,并且这些关系通常使用人类和计算机都能理解的术语进行标注。


构建高质量的知识图谱不仅需要连接数据,还需要设计一套清晰的术语体系(即本体),以便知识图谱能够有效地服务于其设计目标,并具有长久的生命力。
当我们将数据的表示从单纯的“字符串”提升到具有明确含义的“事物”时,本体论是实现这一目标的核心工具。本体可以是一组带定义的术语,也可以是使用如 OWL 等标准语言描述的结构化知识。
核心公式/概念:
- 知识图谱 ≈ 实体 + 关系(使用明确术语标注)
- 本体 = 术语及其含义的形式化规范
2. 构建知识图谱的关键需求
上一节我们介绍了知识图谱和本体的基本概念。本节中,我们来看看要构建一个能被他人使用和维护的知识图谱,具体需要满足哪些关键需求。
要让他人愿意使用一个知识图谱,它至少需要满足以下几点:
- 解决核心问题:能够回答项目利益相关者认为重要的问题。
- 有效集成内容:能够以有用的方式整合来自不同来源的数据。
- 内容透明可信:用户需要清楚知识图谱包含什么内容,以及这些内容是如何进入图谱的。
- 合规的访问权限:需要具备正确的访问控制和数据许可机制。
而要让他人愿意长期维护一个知识图谱,则需要考虑:
- 领域知识支持:维护者需要具备相关领域的专业知识,以便进行内容策展和质量评估。
- 工具链受益:知识图谱能为其工具或方法(如机器学习训练)提供价值。
- 支持扩展性:允许用户根据自身需求对知识图谱进行扩展。
- 满足质量与时效性:提供符合用户要求的数据质量,并能进行定期更新。
核心概念:
- 质量评估:知识图谱的质量标准取决于其是否满足特定用途的需求。
3. 知识图谱开发流程与实践案例
明确了需求后,我们进入实践环节。一个系统的开发流程是项目成功的基石。我们将通过一个环境健康领域的案例来具体说明。
一切始于用例。我们需要明确:想要回答什么问题?回答这些问题的难点是什么?需要哪些信息?之后,寻找并复用现有的词汇表和本体作为起点至关重要,这可以避免重复造轮子。如今,在 BioPortal 等资源库中可以找到许多领域的成熟本体。
以下是开发流程的关键步骤:
- 定义用例与能力问题:明确项目目标和需要回答的具体问题,以此确定范围。
- 发现与评估现有本体:寻找可能复用的本体,评估其覆盖范围和适用性。
- 策略性复用:对于大型本体(如 ChEBI),通常只导入所需的最小部分(MIREOT原则)。
- 建立并记录流程:制定本体选择、术语映射、内容更新的标准化流程并详细记录。
- 迭代式术语改进:采用经验驱动的方法,随着新数据的出现,逐步识别和集成新术语。
- 构建语义数据字典:帮助领域专家将原始数据(如Excel列标题)映射到统一的术语体系。
- 启用智能应用:利用构建好的本体和知识图谱,支持分面搜索、复杂查询和数据分析等应用。
核心概念:
- MIREOT:最小信息引用外部本体术语,是一种复用大型本体的策略。
- 语义数据字典:连接原始数据模式和标准本体的桥梁,便于数据映射与集成。
4. 确保知识图谱的可持续性
构建知识图谱只是第一步,如何让它持续产生价值并不断进化同样重要。本节我们将探讨确保知识图谱长寿和可复用的关键策略。


首先,在初始设计阶段就要为更新做好准备。这包括对模式(本体)、实例数据以及依赖它们的应用程序(如SPARQL查询)制定更新计划。
其次,建立并遵循风格指南至关重要。一致性是本体易于理解、使用和维护的秘诀。在可能的情况下尽量复用现有资源,但要注意不同来源的本体可能存在建模冲突,需要进行权衡。
最后,积极利用各种评估工具和环境(如 Chimera、 OOPS!)来检查本体的质量。同时,始终考虑知识图谱未来可能出现的意外用途,在设计时保持一定的灵活性。
核心建议总结:
- 始于用例,明确范围。
- 设计时即考虑更新需求。
- 力求一致,建立风格指南。
- 积极复用,但权衡冲突。
- 模块化设计,便于维护与扩展。
- 全面记录所有流程和决策。
- 利用工具进行评估。
- 为未来的重用和扩展预留空间。
5. 问答与讨论精要
在课程最后的讨论环节,演讲者与嘉宾就一些实践中的关键问题进行了深入交流。
关于产品知识图谱的本体:
在亚马逊等电商场景中,产品知识图谱的本体通常从现有分类法(产品类型)和目录(产品属性)开始。由于产品领域复杂且快速演变,完全手动开发本体不现实。策略是确保核心本体正确且约束较少,易于扩展;对于外围部分,则结合自动化方法(如从查询日志中挖掘关系)来捕捉现实世界的变化。
关于本体与知识图谱的区别:
两者没有绝对清晰的界限。一种实用的观点是:本体定义了术语、类别、关系及其约束(即“模式”或“TBox”);知识图谱则包含了使用这些术语的具体实体实例和关系实例(即“数据”或“ABox”)。在实践中,一个知识图基础设施通常同时包含本体层和数据层。
关于实例的粒度:
在像产品知识图谱这样的应用中,通常不会为每一个具有独立序列号的物理物品(如某一罐可乐)创建独立节点,除非上层应用有特殊需求(如追溯)。更常见的做法是在“产品型号”这个类别层级进行描述,以服务于搜索、推荐等主要业务目标。
总结
本节课我们一起学习了构建可持续知识图谱的完整思路与方法。我们从明确需求出发,介绍了以用例驱动的开发流程,强调了复用现有本体和建立标准化流程的重要性。最后,我们探讨了通过制定更新策略、风格指南和模块化设计来确保知识图谱长期生命力的关键策略。记住,优秀的知谱图谱不仅是数据的连接,更是通过精心设计的术语和可持续的流程,成为能够不断生长、适应变化并服务于多元目标的知识基础设施。

课程 P26:L16.1 - 如何拓展知识图谱 📈

在本节课中,我们将学习如何发展和维护一个知识图谱。知识图谱并非一成不变,它需要随着现实世界的变化、业务需求的演变以及新数据的出现而不断更新和拓展。我们将探讨在知识图谱演化过程中面临的技术挑战,并介绍几种核心的变更管理技术。

概述:知识图谱为何需要演化 🌍

生命中唯一不变的就是变化。现实世界在持续变化,业务需求也在不断更新。作为软件制品,知识图谱必须随之改变以适应这些变化。
知识图谱的变更主要源于两方面:
- 模式(Schema)的修改:例如更改关系的语义、引入新关系或重命名关系。
- 基础事实(Ground Facts)的修改:即知识图谱中具体数据的变化。
应对这些变化时,我们既要考虑技术问题(如算法和工具),也要考虑社会问题(如确保变更不会破坏现有功能或影响用户)。本节课我们将主要聚焦于技术挑战和解决方法。

现实世界中的变更动机 🛒

为了理解知识图谱为何需要演化,让我们看几个来自真实场景的例子。
示例一:亚马逊产品图谱
在亚马逊的产品图谱中,世界在不断变化:
- 新产品和新产品类别不断涌现。
- 制造商为产品引入新功能。
- 部分产品会停产。

当这些变化发生时,知识图谱必须与之一同更新,以保持同步。
示例二:谷歌知识图谱的约束变化
在谷歌知识图谱中,曾有一个限制:艺术家必须是人。然而,随着数据源中出现新的示例,如“声码器(一个计算机程序)是某首歌的艺术家”,这个限制就需要被修改。为了接纳这些第三方数据,图谱的约束必须更新,甚至允许计算机程序成为艺术家。

示例三:信息融合与推论失效
有时,知识图谱需要融合来自多个来源的信息。例如,确定一张专辑的所有艺术家名单可能需要整合不同数据源。当这些源数据发生变化时,整合数据的程序也必须随之调整。
此外,基于图谱属性所做的推论也可能失效。例如,如果图谱中有“电影院只放映电影”的约束,但现实中某个电影院开始放映歌剧,那么所有基于旧约束缓存的信息都需要被重新审视和修改。

示例四:模式本身的变更
有时,图谱的模式本身也需要改变。例如,最初可能将公司的CEO定义为一个简单的属性(如ceoName)。后来,为了记录更丰富的信息(如任期起止日期),可能需要将CEO升级为一个独立的对象类型。这种模式变更后,所有遵循旧模式存储的数据也需要相应更新。

知识图谱变更管理技术 🛠️
面对上述变化,我们需要系统性的技术来管理知识图谱的演化。这些技术主要可分为三类:

1. 模式进化 (Schema Evolution)
在关系数据库中,类似的操作被称为“数据库重组”,例如添加/删除列或重命名属性。在知识图谱中,模式变更可能更复杂,包括:
- 添加或删除类(Class)
- 添加或移除超类(Superclass)
- 添加或删除属性(Property)
- 添加或删除约束(Constraint)
模式进化技术的核心原则是维持系统的不变量(Invariants),即确保图谱在变更后仍保持某些关键特性。以下是一些常见变更的处理方式:
以下是处理类层次结构变更的几种情况:

- 添加新类:如果不指定其位置,一个常见的做法是将其作为系统预定义根类的子类,以保持层次结构的连通性。
- 删除类:情况更为复杂。假设要删除类
B,其直接子类是C。- 情况A:如果
C还有其他超类D,那么删除B后,C仍然是D的子类,结构保持完整。 - 情况B:如果
C只有B这一个超类,删除B会使C成为“孤儿”。此时,系统可能需要强制将C提升为根类的子类,或者(在更极端但较少见的情况下)连同C一起删除。
- 情况A:如果
- 添加冗余的超类链接:例如,已知
C是B的子类,B是A的子类。如果用户试图直接添加C是A的子类,就会产生冗余(因为通过B可以推断出此关系)。不同系统对此处理方式不同:有的会禁止这种冗余链接,有的则允许。 - 处理循环:类层次结构必须是一个有向无环图(DAG)。大多数系统会直接拒绝任何可能引入循环的变更操作。
2. 视图维护 (View Maintenance)
在数据库系统中,视图(View)是对一个查询的命名。如果我们将查询结果存储下来,就得到了物化视图(Materialized View)。当基础数据发生变化时,物化视图也需要更新。
这一概念完全适用于知识图谱。许多知识图谱是通过从多个数据源提取并整合信息而构建的,这本质上就是创建了一个覆盖所有源的统一视图。当任何一个底层数据源发生变化时,都必须更新这个合成后的知识图谱视图。
虽然可以通过完全重新计算来更新视图,但当数据量非常庞大时,增量式的视图维护技术(即只更新受影响的部分)则更为高效。这正是我们下一节要深入探讨的内容。
3. 真相维护 (Truth Maintenance)
真相维护(TMS)是一种源自基于规则系统的技术。它跟踪每一个新结论是如何通过特定的事实和推理规则得出的,并记录下这种依赖关系(称为“理由”)。


在知识图谱的上下文中,这意味着系统会记录每个衍生事实或关系的推导路径。当底层的事实或规则发生任何变化时,系统可以利用这个“理由”网络,高效地找出哪些衍生结论会因此失效或需要重新计算,从而实现精确的增量更新。

尽管在知识图谱领域讨论相对较少,但真相维护为处理复杂的逻辑依赖和推理结果的更新提供了强大的理论基础。
总结 📝

本节课我们一起学习了知识图谱演化的必要性和核心管理技术。
我们首先了解到,由于现实世界和业务需求的持续变化,知识图谱必须不断更新。这种更新可能涉及模式(Schema)的变更,也可能涉及具体事实(Facts)的更新。
接着,我们介绍了三种关键的变更管理技术:
- 模式进化:处理类、属性、约束等模式层面的变更,核心是维持系统不变量。
- 视图维护:当知识图谱作为从多源数据整合而成的视图时,需要在其底层数据变化时进行高效更新。
- 真相维护:通过记录结论的推导依赖关系,实现当事实或规则变化时,对衍生结论的精准、增量式更新。


掌握这些技术,对于构建和维护一个健壮、可扩展的知识图谱系统至关重要。在接下来的部分中,弗兰克·麦克雪里将为我们详细讲解增量式视图维护的具体方法与实践。

📚 课程 P27:L16.2 - 针对递归查询的增量视图维护
概述
在本节课中,我们将要学习增量视图维护技术,特别是在处理递归查询(如图形遍历)时,如何高效地更新计算结果,而无需在每次数据变化时都重新进行完整的计算。我们将通过一个名为差分数据流的编程框架来理解其核心思想和工作原理。
1. 动机:实时更新的挑战
上一节我们介绍了知识图谱和图形计算。本节中我们来看看一个具体的挑战:如何实时更新复杂的图形查询结果。
想象一个社交网络场景,数据不断变化(如用户发布新推文、关注关系改变)。我们想持续追踪“通过社交关系图连通分量传播的最热门标签”。传统方法需要定期重新运行整个查询,这在数据量大或更新频繁时效率极低。增量视图维护的目标就是:当输入数据发生微小变化时,只计算输出结果中相应的变化部分。
2. 增量视图维护的核心抽象
增量视图维护系统旨在为用户提供这样的体验:编写针对静态数据集的查询程序,而由系统自动、高效地处理数据变化后的视图更新。
系统的输入和输出不再是完整的数据快照,而是数据变化的流。每次变化用一个三元组描述:
- 数据:具体的事实内容(例如,一条边
(A, B))。 - 时间:变化发生的逻辑时间。
- 差异:变化的性质,通常用整数表示,如
+1表示添加,-1表示删除。
公式表示:
collection(t) = Σ_{t' ≤ t} (data, t', diff)

系统会接收输入变化流,运行用户定义的查询逻辑,并产生一个对应的输出变化流,而不是每次都输出完整的结果集。

3. 差分数据流框架简介
差分数据流是一个用于描述数据计算并增量维护其结果的编程框架。它特别擅长处理包含迭代(递归)的查询。
以下是该框架中的一些核心运算符:
- 连接:将两个数据集合中相关联的条目匹配起来。
- 去重:确保集合中元素的唯一性。
- 迭代:重复应用某个操作,直到达到稳定状态(例如,图的遍历)。
通过将这些基础运算符组合,可以构建复杂的查询。
代码示例(概念性伪代码):
// 定义变化的输入集合
let nodes: Collection<(Node, Time, Diff)> = ...;
let edges: Collection<(Edge, Time, Diff)> = ...;
// 查询:从起始节点集出发,沿着边进行一步可达性查询
let one_step = nodes.join(edges).distinct();
// 查询:通过迭代,计算从起始节点集出发的传递闭包(所有可达节点)
let reachable = nodes.iterate(|reach| {
reach.join(edges).distinct()
});
4. 实现原理:从数据流图到增量计算
为了实现增量更新,程序被编译成一个有向数据流图。图中的节点是运算符(连接、去重等),边是数据流动的路径。
当输入变化(三元组)流入这个数据流图时,每个运算符都需要能够:
- 根据输入变化,计算出正确的输出变化。
- 维护必要的内部状态(例如,连接运算符需要缓存之前的输入以便快速匹配)。
关键在于,许多运算符的工作可以按数据键进行分区并行处理。这意味着,当只有部分数据发生变化时,系统只需更新受影响的分区,而不必处理全部数据。


5. 处理迭代计算的挑战与解决方案
对于包含迭代(递归)的计算,简单的增量更新策略会失效。例如,在计算连通分量时,如果删除了一条关键边,简单的“只添加新事实”的推导无法自动收回已推导出的、但现在无效的事实。
差分数据流的解决方案是引入多维时间。传统增量计算只沿一个时间维度(逻辑时间)推进。对于迭代计算,我们将时间扩展为 (逻辑时间, 迭代轮次) 的二维偏序。
核心洞察:当输入在某个逻辑时间发生变化时,我们不仅计算它对当前迭代轮次的影响,还精确计算它对未来所有迭代轮次的“涟漪效应”。通过在这个二维网格上进行类似“积分”的操作,系统可以精确地推导出每次变化在所有迭代轮次中应产生的输出变化,从而正确且高效地维护迭代查询的结果。
6. 性能与总结
本节课中我们一起学习了增量视图维护,特别是针对递归查询的差分数据流方法。
总结其优势:
- 效率:处理时间与数据变化量成正比,而非与总数据量成正比。对于变化稀疏的大数据集,优势明显。
- 实时性:能够以毫秒级延迟响应数据变化。
- 表达能力:能优雅地处理包含迭代、递归的复杂图形查询。
- 简化编程:开发者只需关注静态数据上的查询逻辑。

这项技术对于构建需要实时响应的知识图谱应用、社交网络分析、欺诈检测系统等具有重要价值。它改变了我们处理动态数据的方式,从“定期批量重算”转向了“持续流式更新”。
课程 P28:L17.1 - 知识图谱工业实践应用 🧠
在本节课中,我们将学习知识图谱在工业界的实际应用。我们将从产品和技术两个视角,探讨知识图谱如何构建、如何解决大规模问题,以及在实际应用中需要考虑的关键因素。
知识图谱的愿景与背景 📚
上一节我们介绍了课程概述,本节中我们来看看知识图谱的愿景与背景。
大多数研究和产品工作的起点,是希望建立一个能够捕捉人类所有知识的存储库。其核心原则是:如果人类已经学到了某些知识,我们就不必重新学习,而应将其编码、共享、讨论和查询。这类似于建立一个结构化的“亚历山大图书馆”。
知识图谱旨在以机器可读的形式表示知识,并支持大规模推理。它与非结构化的万维网形成对比:结构化知识更离散、约束更强,而非结构化文本则更连续、依赖上下文。结构化知识通常更客观、更通用。
知识图谱的产品视角 🎯
上一节我们了解了知识图谱的愿景,本节中我们来看看其产品视角。
从产品角度看,知识图谱能创造连接不同知识领域的流畅用户体验。例如,在搜索引擎中,用户查询“本周末圣何塞有什么活动”,系统可以展示结构化的活动列表(如Lady Gaga演唱会),并允许用户进一步探索相关电影、歌曲、场馆或附近餐馆。
这表明,知识图谱通过编码实体间的连接,能够支持跨领域的探索和连贯的用户旅程。这种体验不仅限于搜索,还能扩展到地图、媒体播放器等多种设备与界面。例如,通过图像识别技术,拍摄一座建筑或电影海报,系统能利用知识图谱识别实体并提供相关信息。
核心产品功能与构建模块 ⚙️
上一节我们看到了知识图谱如何提升用户体验,本节中我们来剖析其核心功能与构建模块。
以下是知识图谱支持的几个关键子功能:
- 信息聚合与摘要:针对一个实体(如电影《肖申克的救赎》),聚合来自不同来源的信息(演员、剧照、预告片、放映地点、评论),生成一个摘要视图。
- 问答与交互:通过语音或文本界面进行自然语言问答。例如:“《肖申克的救赎》中谁扮演了安迪?”或“海岸线餐厅几点开门?”。这需要将自然语言查询映射到知识图谱中的结构化表示。
- 探索与推荐:基于图谱中的结构化关系,发现相关或相似的内容。例如,从一部电影推荐同导演或同类型的其他电影,从一家餐厅推荐相似的菜系或其他夫妻店。
要实现这些功能,需要以下关键技术构建模块:
- 查询理解:将用户的自然语言查询(如“给我看看《星际穿越》里的歌”)翻译成结构化的表示。这可以视为一个编码器-解码器的翻译问题,模型学习将不同的表面形式(不同电影名、不同语言)映射到相同的规范理解表示。
# 概念性代码:将自然语言查询映射到结构化表示 structured_representation = model.encode("给我看看《星际穿越》里的歌") # 输出可能类似于: (意图: 查询歌曲, 实体: 电影《星际穿越》, 关系: 包含) - 用户兴趣建模:根据用户活动,构建其兴趣的低维向量表示。例如,用户可能对
[《绝命毒师》, 金州勇士队, 某政治家]等实体感兴趣。通过命名实体识别从用户活动中提取实体,并将其投射到知识图谱的分类体系中,可以进行分层理解和基于图谱的协同过滤推荐。 - 上下文理解:区分用户对同一实体的不同兴趣上下文。例如,两个用户都查询“迈阿密”,但一个关注投资新闻,另一个关注本地市场和外卖服务。结合文本理解和知识图谱,可以捕捉这种细微差别。
大规模构建的挑战与策略 🌐
上一节我们探讨了核心技术与功能,本节中我们来看看如何应对大规模构建的挑战。
工业级知识图谱涉及巨大规模。例如,可能包含数亿实体和数千亿关系。数据来源多样,包括:
- 购买或聚合的数据源
- 网页中通过Schema.org等模式标记的结构化数据
- 从非结构化文本和表格中提取的信息
- 人工整理的数据
以下是几种关键的知识获取与构建策略:
- 利用模式标记:网站使用标准化的模式(如
JobPosting)在HTML中嵌入结构化数据,便于机器直接读取。 - 信息提取:从非结构化内容(如维基百科表格)中提取结构化知识,涉及命名实体识别和关系抽取。
- 多源融合与协调:将来自不同来源的知识整合到一个统一的规范视图中。这个过程称为“协调”,需要解决模式差异和实体链接问题。
在实际操作中,还需考虑以下因素:
- 人工整理的价值:并非所有过程都能完全自动化。数据标注、模式映射、质量评估和纠错都需要人工参与。
- 政策与本地化:知识并非总是普适的。例如,不同地区对争议领土的地图显示有不同政策。产品必须遵守当地法规,支持知识的变体。
- 处理破坏与错误:需要制定策略来处理从网上提取信息时可能遇到的错误或恶意破坏内容。

总结 📝




本节课中,我们一起学习了知识图谱在工业界的实践应用。我们从其构建人类知识库的愿景出发,探讨了如何通过连接实体来创造跨领域的优质产品体验。我们分析了信息聚合、智能问答和探索推荐等核心功能,并深入了解了查询理解、用户建模等关键技术模块。最后,我们审视了构建大规模知识图谱面临的挑战,包括数据来源的多样性、多源融合的复杂性,以及人工整理、政策合规等实际考量。知识图谱是连接非结构化数据与智能应用的关键桥梁,其构建是一项融合了技术、产品和运营的综合性工程。

课程 P29:L17.2 - 工业大规模知识图谱:实时观察与预估 🚀

在本节课中,我们将学习如何利用大规模知识图谱技术,对全球新闻、图像、音频和视频等实时数据进行处理与分析,构建一个关于世界动态的开放数据目录。我们将探讨其核心技术、应用场景以及面临的挑战。
概述

知识图谱不仅是静态事实的集合,更是动态观察世界的窗口。通过实时处理多模态数据(如文本、图像、音频、视频),我们可以构建一个反映社会实时动态的开放数据目录。本节课程将深入解析这一过程。
从新闻开始:社会的实时目录
我们首先从新闻数据入手。新闻本质上是社会的实时目录,它跨越时间,帮助我们理解当前发生的不寻常事件。


上图展示了项目监控的全球地点在过去数年里的事件分布。这种全局视角揭示了世界的复杂性,但要获得地球的局部视角,我们必须理解世界上的多种语言。
跨越语言障碍:机器翻译的力量



多语言处理非常困难。在数字可访问的新闻中(无论是广播还是网络),我们覆盖了约97%到99%的内容。我们为152种语言提供支持,并对其中65种语言进行实时翻译。

这种能力至关重要。例如,在2014年埃博拉病毒爆发初期,我们收到了几内亚森林地区的法语广播,但由于当时缺乏大规模翻译能力,我们无法及时处理。现在,机器翻译使我们能够放眼全球。


当世界各地发生事件时,我们希望能够看到当地的报道。特别是在争议性或专制国家,我们需要通过多语言信息进行三角定位,了解全球反应。机器翻译消除了语言障碍,让我们能够看到世界各地的本地观点,但这增加了额外的复杂性。



上图以也门为例,蓝色区域表示内战期间被讨论的地点。对比英语和阿拉伯语的报道,真正证明了跨语言查看的重要性。
构建数据集:从数据流到知识图谱
上一节我们介绍了如何获取和翻译多语言新闻流,本节中我们来看看如何将这些数据流转化为结构化的知识。我们与互联网档案馆等伙伴合作,处理电视、广播和网站内容,创建了一系列不同的数据集,试图实时编目社会。
以下是核心的数据集构建流程:
- 事件数据集:观察世界各地的物理事件。例如,BBVA等团体用它来实时绘制难民的流入和流出。
- 叙事分析:分析实体(如人物、地点)共同出现的频率、背景、情绪(积极/消极、焦虑、对未来恐惧等)。
- 大规模图分析:我们在谷歌BigQuery平台上构建了包含万亿条边的共现图。云计算的强大之处在于,即使BigQuery并非专为图数据库设计,我们也能在其上高效地构建和分析超大规模图表。
- 共现图可视化:例如,可以构建一个共现图,展示在特定上下文(如CCS)中所有被共同提及的人。





多元化的数据集集合
除了上述图表,我们还创建了多种数据集来多角度编目新闻。

以下是主要的数据集类型:

- 事件数据集:追踪全球物理事件。
- 全球知识图谱:我们的核心数据集,包含人物、组织、地点等约200万个主题,以及约4000种情绪维度。
- 视觉知识图谱:基于图像分析构建。
- Schema.org数据集:提取新闻文章中嵌入的Schema.org元数据块。现代新闻网站会使用这种结构良好的模式来描述文章及其组成部分(如视频、图像)。
- 数字图谱:从152种语言的新闻中提取所有对数字的引用。这可用于对比不同媒体对同一事件规模的描述差异。
- 引语图:将新闻中的引语视为节点,关联发言人、发生地点和上下文(如谴责或赞扬)。这能将语句与人物、地点及发表声明的场合联系起来。




全球媒体情绪地图示例:透过媒体报道分析全球各地对某个地点(如巴黎)的情绪倾向。


深入文本:实体、依赖与演变


当我们思考知识图谱时,通常会想到编码关系,例如“某人的父母是谁”或“乔·拜登是美国总统”。但我们将图的概念看得更广。
我们每天通过谷歌的自然语言API对文章进行随机抽样处理。这能实现多种功能:


- 依赖解析与实体提取:提取11种语言中的所有实体,每个实体都关联到谷歌知识图谱中的一个唯一编码(如
/m/0cqt90)。 - 词性标注与演变分析:提取所有词性,分析动词和名词如何关联。我们与语言学家合作,研究词语角色随时间的演变。例如,“影响”一词从名词演变为动词的用法变化。


全球知识图谱:核心与上下文


我们的全球知识图谱是核心数据集之一。我们提取人物、组织、地点等实体,并关联约4000种情绪维度。
这种关联上下文的能力非常强大。例如,福奇博士的一句声明,可以被一篇谴责的文章引用,也可以被一篇赞扬的文章引用。知识图谱不仅能建立联系,还能确定这些联系的上下文及其随时间的变化。
此外,我们还构建了“变化图谱”。我们抓取的每篇新闻文章,会在24小时和一周后重新检查并编目所有更改。新闻不仅仅是信息流,文章会被悄悄重写或删除。例如,政府可能迫使媒体修改或删除批评性文章。因此,我们需要记录信息在时间线上的状态变化,这与维基百科等相对稳定的平台不同。


从文本到多模态:图像与视频分析

当然,文本只是信息的一部分,图像和视频也包含强大的信息。


图像分析

我们每天对约一半的新闻图像进行随机抽样,并通过谷歌云视觉API进行处理。我们已经分析了约5亿张图像,进行OCR、地理编码、提取EXIF元数据以及反向图像搜索。


代码示例:图像标签共现查询
-- 在BigQuery中查询图像标签的共现关系
SELECT tag1, tag2, COUNT(*) as co_occurrence_count
FROM image_annotations
WHERE tag1 != tag2
GROUP BY tag1, tag2
ORDER BY co_occurrence_count DESC
LIMIT 10;
通过将图像视为标签图,我们可以分析哪些视觉标签更常共同出现,比较不同媒体(如商业媒体与主流媒体)的视觉叙事差异。



视频分析
对于视频,我们进行两项主要处理:
- 文本分析:利用封闭字幕。
- 视觉与语音分析:使用自动语音识别(ASR)和谷歌云视频智能API进行逐帧注释,识别屏幕上出现的物体、场景、文字(Chyron)、人物等。
机器转录的准确性现已超过人工转录,这是一个重大变化。云视频API提供帧级注释,比人眼感知的秒级细节丰富得多。例如,一秒的广播画面可能包含多个快速切换的场景,机器能一帧不落地识别出来。

通过结合视觉、OCR和语音文本,我们可以构建一个丰富的多模态图谱。例如,我们可以:
- 扫描屏幕文字,匹配特朗普的推文,并关联该推文是否被标记为错误信息或被删除。
- 识别讲述COVID-19故事的医生或事实核查人员。
- 通过视觉相似性分析广播内容的结构。
应用实例:公共卫生叙事分析
我们与媒体数据研究联盟合作,通过分析电视和广播新闻,量化COVID-19公共卫生媒体叙事。
我们将每种疾病爆发(如COVID-19、寨卡、埃博拉)的报道视为一个实体随时间演变的图谱。这有助于理解不同疾病故事讲述方式的差异,以及公共卫生信息如何被传达。

挑战与未来:关系图谱与事实核查
我们持续推动的一项工作是:阅读每日新闻,提取所有事实主张,并审视有争议的叙述。
例如,在COVID-19早期,欧洲媒体关于戴口罩的建议与美国公共卫生当局的说法存在矛盾。我们的目标是构建机器系统,能够自动检测此类矛盾的声明,并向事实核查人员、记者或卫生当局发出警报。
在实时网络环境中,我们目睹了关于“事实”的编辑战,这与维基百科通过共识和锁定页面达成的“单一真相”不同。知识图谱有趣的部分在于识别这些并存的不同主张。
总结与资源
本节课中,我们一起学习了如何构建和利用工业级大规模知识图谱来实时观察和预估全球动态。
核心要点总结:
- 多语言与多模态:通过机器翻译和视觉/语音API,打破语言和模态壁垒,整合全球信息。
- 从流数据到图谱:将连续的新闻、图像、视频流转化为结构化的实体、事件、情绪图谱。
- 上下文与动态性:知识图谱不仅存储关系,还捕捉关系的上下文、情绪以及随时间的变化。
- 大规模处理:利用云平台(如Google BigQuery, Cloud Vision, Video AI)处理万亿级别的图数据。
- 应用驱动:应用于疾病监测、叙事分析、事实核查、舆情洞察等多个领域。
我们所展示的所有数据都是公开的。这是一个庞大的公共数据集,包含文本、图像、音频、视频、Schema.org数据、知识图谱、地理分析等不同部分。
公式示例:简单的共现关联度
对于实体A和B,其共现关联度可简化为:
关联度(A, B) = count(A与B在同一文档中共现) / sqrt(count(A) * count(B))
您可以访问GDL项目网站和我们的博客,下载所有这些数据集进行实验。这是一个巨大的资源库,希望它能激励您进行更多探索。
感谢Caleb和Sahir的分享。知识图谱的下一步在于更深度地融合结构化知识与非结构化数据,以及让机器更好地理解、推理和整合现实世界中复杂且常存争议的信息。这是一个充满机遇的广阔领域。


📚 课程 P3:L3 - 图数据模型

在本节课中,我们将学习两种主流的图数据模型:资源描述框架(RDF)和属性图(Property Graph)。我们将了解它们的基本概念、查询语言,并比较它们之间的异同,同时探讨它们与传统关系型数据模型的关联与区别。


🌐 资源描述框架(RDF)概述
资源描述框架最初是为在万维网上表示信息而设计的。如果你希望在网络上发布数据,并希望这些数据易于被他人发现和使用,RDF 数据模型是一个很好的选择。为此,万维网联盟(W3C)投入了大量精力对其进行标准化,以确保人们使用统一的方式发布数据。

RDF 数据模型的基本构造


RDF 数据模型的基本构造是三元组,即主体(Subject)- 谓词(Predicate)- 客体(Object)。这与我们在上一讲中定义知识图谱的方式完全一致。例如,在“Art 认识 Bob”这个陈述中,“Art”和“Bob”分别成为主体和客体,“认识”则是谓词。
因此,RDF 数据模型非常忠实于我们为知识图谱给出的抽象定义,即它是一个有向标签图。

RDF 中的节点类型
在 RDF 数据模型中,有三种不同的节点类型:国际化资源标识符(IRI)、字面量(Literal)和空白节点(Blank Node)。

- 国际化资源标识符(IRI):一种在互联网上唯一标识数据对象的机制,类似于网站的 URL。
- 字面量(Literal):特定类型的值,例如整数、字符串等。
- 空白节点(Blank Node):RDF 模型中的一种特殊节点,没有标识符,无法在其最初引入的上下文之外被引用。

关于 IRI 的进一步说明
IRI 是统一资源标识符(URI)的泛化。URI 的字符集仅限于 US-ASCII,而 IRI 可以使用包含外语字符在内的通用字符集。这使得 IRI 更适合在互联网上使用。

在 RDF 中表示对象时,我们通常使用对应的 IRI,而不是简单的名称。例如,Art 可能对应一个 IRI:http://example.org/art。这样,任何需要在网络上使用这些对象的人都可以通过这些 IRI 来引用,而提供这些 IRI 的数据源也可能提供关于这些对象的额外详细信息。
为了简化冗长的 IRI,RDF 允许定义前缀。例如,定义前缀 foaf: 对应 http://xmlns.com/foaf/0.1/ 后,就可以使用 foaf:name 这样的缩写形式。


关于字面量(Literal)的说明

字面量是特定类型的值。例如,陈述“一个名叫 Bay 的人年龄是 23 岁”中,23 被理解为整数。我们也可以显式指定类型,例如使用 XML 模式定义(XSD)中的标准类型,如 xsd:integer。

关于空白节点(Blank Node)的说明


空白节点的一个用例是表示结构化信息。例如,如果我们想捕获一个地址的各个组成部分(街道、城市、州),但又不需要单独引用整个地址字符串,就可以引入一个匿名对象(空白节点)来表示这个地址,然后为其各个组成部分定义属性。这些匿名对象不能在其最初引入的上下文之外使用。

RDF 词汇表与数据集

RDF 词汇表定义了一组用于描述数据的 IRI。RDF 数据定义了世界在某一时刻的静态视图。RDF 数据集由一个 RDF 图集合组成,每个数据集恰好有一个默认图和一个或多个命名图。命名图可以用于对数据集中的不同部分进行分组,查询时可以指定针对哪个图进行。

🔍 RDF 查询语言:SPARQL
SPARQL 是 RDF 的查询语言,全称是 SPARQL 协议和 RDF 查询语言。与其他查询语言相比,SPARQL 的一个显著特点是能够跨多个数据源进行查询,这得益于它可以通过对象的 IRI 引用不同网站定义的数据。
SPARQL 是一个功能齐全的查询语言,支持必需参数、可选参数、结果过滤等,查询结果可以是数据,也可以是图。
以下通过几个例子来感受如何编写 SPARQL 查询。

基础图模式匹配
一个简单的查询是询问“Art 认识哪些人”。对应的 SPARQL 查询如下:
SELECT ?person WHERE {
art knows ?person .
}
其中,art knows ?person 是一个图模式,?person 是一个变量。查询引擎会在数据集中寻找所有匹配该模式的绑定。
多变量与多三元组查询

查询可以包含多个变量和图模式。例如,要查询“Art 认识的人所认识的人”,可以使用以下查询,这相当于在图中遍历两层:
SELECT ?person ?person1 WHERE {
art knows ?person .
?person knows ?person1 .
}



使用前缀和过滤
与定义 RDF 数据时一样,SPARQL 查询也可以使用前缀来缩写 IRI。此外,SPARQL 支持使用 FILTER 子句对结果进行过滤,例如基于正则表达式或数值约束进行筛选。
# 查找标题以“Spark”开头的书籍
SELECT ?book WHERE {
?book title ?title .
FILTER regex(?title, "^Spark")
}

# 查找价格低于30的书籍
SELECT ?book WHERE {
?book price ?price .
FILTER (?price < 30)
}
除了 SELECT 子句,SPARQL 还支持 CONSTRUCT 子句,其查询结果本身可以是一个 RDF 图。SPARQL 还提供了消除重复、计数、聚合等操作的功能。

🏷️ 属性图(Property Graph)数据模型

属性图数据模型被许多图数据库使用,例如 Neo4j。该模型适用于无模式(schema-free)的应用程序,我们不需要预先定义完整的模式,可以直接基于简单的结构开始存入数据。属性图模型特别适用于需要频繁遍历图的应用场景。
属性图模型的基本构造
属性图模型的基本构造是节点(Node)、关系(Relationship)和属性(Property)。
- 每个节点和关系都有一个标签(Label)。
- 每个节点和关系都可以关联一组属性(Property),属性是键值对,键是字符串,值可以是任何数据类型。
- 关系具有方向性,因此属性图是有向图。
让我们看一个“Art 认识 Bay”的例子在属性图中的表示:
- 有两个标签为
Person的节点。 - 它们通过一个标签为
KNOWS的有向边连接。 - 左边的节点有一个属性
name: “Art”。 - 右边的节点有属性
name: “Bay”、age: 30、basedIn: “Seattle”。 - 边
KNOWS可以有一个属性since: 2005。
在设计属性图模型时,一个关键决策是决定什么应该成为节点,什么应该成为边或属性。这将在后续课程中详细讨论。

🗣️ 属性图查询语言:Cypher
Cypher 是一种最初为查询图数据而设计的查询语言,目前正在被考虑采纳为 ISO 标准。Cypher 与 SPARQL 的一大区别在于,它不仅支持查询(Read)操作,还支持完整的增删改查(CRUD)操作。本节我们主要关注查询操作。
以下是几个 Cypher 查询的例子:
基础查询

查询“Art 认识哪些人”:
MATCH (a:Person {name: ‘Art’})-[:KNOWS]->(p:Person)
RETURN p
这里使用了 ASCII 艺术风格的表示法,括号 () 表示节点,箭头 --> 表示有向边。

带约束的查询
查询“Art 自 2010 年以来认识的人”:
MATCH (a:Person {name: ‘Art’})-[r:KNOWS {since: 2010}]->(p:Person)
RETURN p
如果查询“Art 在 2010 年及之前认识的人”,则需要引入变量并在 WHERE 子句中添加约束:
MATCH (a:Person {name: ‘Art’})-[r:KNOWS]->(p:Person)
WHERE r.since <= 2010
RETURN p

Cypher 同样支持计数、分组、聚合等丰富的操作。
⚖️ RDF 与属性图的比较
现在我们来比较 RDF 和属性图模型的异同。需要说明的是,RDF 是一个更大家族语言(如 RDF Schema、本体语言)的基础,而属性图也有其扩展。此处我们仅比较两者最基本的核心图表示能力。
主要差异


- 边属性:属性图模型直接支持边属性,而 RDF 模型不直接支持。在 RDF 中,如果需要为边(即三元组)添加属性,需要使用具体化(Reification) 技术,即创建一个代表该语句的新资源,然后为其添加属性。这使得 RDF 的表达更为冗长。
- 标识符:RDF 模型与 IRI 紧密绑定,旨在用于网络。属性图模型没有强制要求使用 IRI。
- 空白节点:RDF 有明确的空白节点概念,而属性图模型目前没有对等的显式处理。

模型间的转换
- 从属性图到 RDF:节点属性可以直接转换为 RDF 三元组。边可以转换为三元组,边属性则需要通过具体化转换为额外的三元组。这个过程相对直接。
- 从 RDF 到属性图:基本方法是将每个三元组的主客体转为节点,谓词转为边。更优的方法是只为 IRI 和空白节点创建新节点,将字面量转为节点属性。此外,还需要将 RDF 中通过具体化表示的边属性“反具体化”为属性图中的边属性。这个过程更具挑战性。

总的来说,两种模型可以相互转换,从属性图到 RDF 的转换相对容易一些。

🗄️ 图模型 vs. 关系模型
本节旨在阐明图模型和关系模型之间的差异和适用场景,而非评判优劣。



双方的论点
- 图模型支持者认为:图模型更直观,查询(尤其是涉及对象间关系遍历的查询)更简洁,执行更快。图的可视化形式与存储形式一致。
- 关系模型支持者认为:关系模式也可以通过合适的工具(如实体关系图)进行可视化。图查询可以被编译成关系查询并在关系引擎中高效执行。


一个具体例子
考虑一个简单的场景:查询在“IT”部门工作的员工。
- 在关系模型中,可能涉及
Employee、Department和WorksIn三张表,SQL 查询需要执行连接操作。 - 在属性图模型中,查询可以写为更紧凑的 Cypher 语句,直观地表达了“员工-工作于-部门”的图遍历模式。
虽然可以写出更紧凑的 SQL 版本,但图查询在表达涉及多步遍历的复杂关系时,其简洁性和直观性优势更为明显。图数据库引擎通常针对这类遍历查询进行了优化。

关系模型作为图数据的存储
关系模型支持者指出,属性图数据可以用关系表来存储(例如,用一张表存储所有三元组,另一张表存储四元组形式的边属性),然后利用现有的关系数据库 machinery。对于拥有大量遗留关系数据,同时又希望获得图查询优势的用例,有些系统提供了将图查询(如 Cypher)翻译并优化为底层 SQL 查询的能力,甚至可以混合查询关系数据和图数据。
关于哪种存储和查询方式更优,目前仍是一个开放的研究和实践问题。两种路径都有成功的系统。
⚠️ 图模型的局限性
图模型并非万能。存在一些场景,其他数据模型可能更为合适:
- 非二元关系:例如,“B 位于 A 和 C 之间”是一个三元关系。虽然可以通过具体化用多个二元关系来模拟,但这不够自然和直接。
- 以数值计算为主:例如,跟踪一个国家多年的人口数据,主要是数值序列。这种情况下,使用关系表进行处理可能比构建知识图谱更简单高效。
因此,了解图模型的边界很重要,不应试图将所有问题都强行套用图模型来解决。
📝 课程总结
本节课我们一起学习了两种主流的图数据模型:RDF/SPARQL 和属性图/Cypher。

- RDF/SPARQL 主要面向网络数据建模和发布,是 W3C 标准,强调通过 IRI 进行唯一标识和跨数据源查询。
- 属性图/Cypher 作为通用图数据库的数据模型,适用于无模式应用,直接支持边属性,查询语言也支持完整的 CRUD 操作。
- 两者核心都是有向标签图,可以相互转换,但在边属性、标识符使用等方面存在差异。
- 与关系模型相比,图模型在表达涉及对象间多步关系的查询时更为简洁直观,其存储形式与可视化形式一致。然而,关系模型在存储非图结构数据和处理特定类型的数值计算时可能更具优势。选择哪种模型取决于具体的应用需求、数据特征和生态系统。
图模型的独特价值在于其针对关系遍历查询的优化能力,以及数据表示与可视化的一致性。

📊 课程 P30:L18.1 - 因果图


在本节课中,我们将学习一种特殊类型的知识图谱——因果图。我们将探讨其核心概念、构建方式以及在金融等领域的实际应用。通过本节课,您将理解如何从文本中自动构建因果图,并利用它进行推理和预测。

🎯 概述:什么是因果图?
上一节我们介绍了知识图谱的基本概念,本节中我们来看看一种专注于表示因果关系的新型知识图谱——因果图。
因果图是一种特殊的知识图谱,其核心在于表示事物之间的因果关系,而不仅仅是关联关系。它由信号节点和因果边构成,旨在对现实世界中的驱动因素和结果进行建模。
📈 因果图的核心构成
因果图可以清晰地分为两个核心概念:信号和因果边。
信号
信号是因果图中的节点,代表附有数值的时间序列数据。例如:
- 不同国家的GDP
- 通货膨胀率
- 外汇汇率
- 公司收入、需求、市场情绪等参数
这些节点的定义必须非常精确。例如,“特斯拉的收入”是一个节点,而“特斯拉Model 3车型在中国的收入”是另一个更具体的节点。这种精确性是为了支持后续的聚合推理。
因果边
因果图中的边比传统知识图谱中的边更简单,它通常只带有单一的推理标签,表示驱动信号对目标信号的弹性影响。

例如:
- “美国GDP在2020年因新冠疫情而下降” 可以转化为一条边:
新冠疫情 -> (负面影响) -> 美国GDP - “销售额每增加5%,利润就会增加10%” 这条边中的弹性系数(2倍)可能来自一个财务分析模型。
这些陈述需要自然语言处理系统来理解并提取其中的因果关系和影响强度。
🔗 因果图的构建与聚合
因果图可以从大规模文本中自动构建。以下是构建过程中的一个关键能力:

跨维度聚合 是因果图中的基本推理要素。通过对节点进行聚合,我们可以从分散的数据中获得更高层次的洞察。
例如:
- 可以聚合所有电动汽车在中国市场的销量。
- 可以聚合特斯拉在全球的所有车型收入。
- 可以聚合影响航空公司需求的所有负面言论。

这种聚合能力使得我们能够将成千上万条分散的因果关系陈述,整合成具有预测性的合成信号。
💡 因果图的应用实例
通过实际案例,我们可以更好地理解因果图的价值。
案例一:航空公司需求预测
我们为联合航空公司构建了一个因果图模型。其中,蓝色合成信号(聚合了就业、收入、预订量等子组件)在股市下跌前一个月就显示出下降趋势。而驱动该信号的红色元素(来自新闻文本的负面趋势陈述)则精准地对应了疫情初期边境关闭等事件。这展示了因果图在领先指标预测方面的潜力。

案例二:公司动态分析
以电动汽车公司NIO为例,其因果图显示:
NIO收入 -> (积极影响) -> NIO股价芯片短缺 -> (消极影响) -> NIO生产
通过分析作用于不同节点的所有因果力量,我们可以理解公司股价波动的背后动因,并判断哪些力量的影响最大。
案例三:国家宏观经济建模
我们同样可以为国家构建因果图。例如,塞内加尔的GDP受到疫情(消极影响)、人权状况(积极影响)等多重因素的共同作用。这提供了一个前所未有的、能够刻画所有作用于国家不同参数的因果力模型。

🧠 从因果图到贝叶斯网络
因果图可以进一步转化为贝叶斯网络,这是一种纯数学工具,可用于模拟和概率分布传播。
然而,金融领域的因果关系常存在双向影响(如油价影响需求,需求也影响油价),这会形成环,不符合贝叶斯网络必须是有向无环图的要求。因此,需要从因果图中选择最强的一环来生成DAG。
我们通过与专家合作,实现了从大规模因果知识图谱中全自动生成贝叶斯网络,这通常是一项需要多名专家数日协作才能完成的任务。
🚀 未来展望与总结
因果图代表了人工智能发展的几个重要趋势:
- 集体智慧:AI不应仅从数据中学习,还应致力于聚合和利用散落在全球文本中的人类知识,使其变得可解释、可访问。
- 因果推理的稳定性:因果关系(如供需关系)比具体信号(如油价)变化更慢、更稳定,这使得因果模型具有更长的生命周期和参考价值。
- 动态演化:理解因果图本身随时间的演变(哪些力量被激活,哪些新关系出现)是一个迷人的课题。
- 真相的集体裁决:如何集体判定一个因果关系的真伪(是深刻洞见还是阴谋论)将是AI未来需要帮助人类解决的重要问题。

本节课中我们一起学习了因果图的定义、构成要素(信号与边)、关键能力(聚合)、实际应用以及其向贝叶斯网络的转化。因果图作为一种强大的知识表示和推理工具,正在金融分析、宏观经济建模等领域展现出巨大潜力,并指向了AI未来发展的一个重要方向——利用集体智慧构建可解释的因果模型。
课程 P31:L18.2 - 金融数据预测计算建模:应用本体作为金融数据预处理工具 📊
在本节课中,我们将学习一个结合了本体、图数据库和机器学习引擎的通用计算模型,用于金融数据预测。我们将通过一个具体的破产预测用例,来理解如何利用本体对金融数据进行结构化预处理,并通过反馈循环优化机器学习模型。
概述
我们的目标是构建一个通用的预测计算模型。该模型的核心思想是:利用本体对原始金融数据进行语义化建模和结构化,将其导入图数据库,然后提取特征来训练机器学习模型。模型的输出(如特征权重)会反馈回图数据库,通过迭代优化预测性能。
上一节我们介绍了通用模型的理念,本节中我们来看看如何将其应用于具体的金融预测场景。
通用方法架构 🏗️
该方法涉及几个核心部分,其核心是本体。
你可能听说过很多关于知识图谱的内容。本体是图谱的一部分,它非常强调我们所说的等级关系。人们常将本体与知识图谱进行比较:本体提供了领域的结构化概念模型,而知识图谱则是基于此模型的具体实例化数据集。
我们遵循这种方法:首先创建与给定领域相关的本体,然后基于此本体构建具体实现的知识图谱(以图数据库形式)。为什么需要图数据库?因为我们需要一个能够进行计算的引擎。
基于此,我们将能够构建一种类型的本体。整个过程分为三步。
一旦完成,我们就有了通用的构造。我们可以用图数据库进行“游戏”。游戏的本质是:我们管理着用选定特征喂养整个机器学习模型的场景。机器学习模型将与任务和数据类型相关。
今天我们将给出一个用例,它依赖于专门的处理。我们目前正在处理的另一个用例是关于时间序列的,因此会使用不同的引擎。但总的来说,在这个阶段,整个想法是:我们称之为模型的第一种RAM,我们用选定的特征填充模型并训练它。
现在关键环节来了:一旦训练结束,我们查看这个过程的输出,并以某种方式将其反馈给图数据。然后我们切换嵌入式设施(嵌入式引擎本身)。我们希望确保机器学习的结果是有意义的。
这些结果是什么?我们希望那些作为机器学习引擎输入的特征,现在会带有调整后的权重。这套新的、带有调整权重的特征集将被反馈到图形数据库。我们会让内部引擎再运行一次,与图形数据库一起提出一组新的特征,并调整权重,然后再反馈给模型运行一次。
你可以看到,我们预计模型会在某种意义、某种感觉上,经过几次运行后达到理想状态。因为每次运行的输入都是通过反馈循环机制进行的。
本体开发与形式化定义 📐
有各种各样的本体开发方法。这里我们采用一种偏形式和逻辑的方法。
本体的形式化定义是:一个标记图。标记图是具有结构的正规概念的图,有顶点和边。我们使用语言来标记节点。
我们以一种简单的方式操作:使用两个通用参数——价值和重量。如果价值和重量是重要的或相关的,它们就工作;如果它们不重要或不相关,我们就把它们设为零。否则,它们将从给定的数据集中获取。这将指导我们如何构建有针对性的本体。
实际上,我们分阶段进行:
- 首先导出本体模板图。
- 然后移动到中间结构,即带有值但没有权重的图。
- 最后我们用权重填充它,得到目标图。
这就是拥有形式化定义的本体的想法。
反馈循环与大数据考量 🔄
现在,我们想推进所有这些结构和移动反馈循环。整个想法是:我们使用图数据库来提取一组特征(当然,最初由专家裁定)。一旦完成,等待调整权重的输出。这些调整后的权重被反馈到图形数据库,我们在这里启用“洗牌”功能。
我们看看那些在整个场景中真正扮演重要角色的特征,它们可能会变得更加重要。非正式地说,那些不重要的特征,会被次要考虑。这就是机器学习的反馈循环。

我们确实关注数据。数据往往具有“大数据”的特征:大量、高速、多样。在金融领域,数据量可能不是最重要的,但关系的正确性至关重要,因为财务数据包含许多复杂关系。

在构建本体的过程中,我们像上楼梯一样,对领域的概念层面进行越来越专门的分析。从受控词汇表的定义开始,到结构化词汇,到单一层次结构,也许是多重层次结构,最终我们想得到一些被称为“按需类的组合构造”的东西,这涉及描述逻辑等高级分析。
为什么需要这么多?因为本体使我们能够建立知识的实现,以知识图的形式在图数据库中具体化。
图数据库与机器学习引擎集成 🤖
如果你查看图数据库的构造,它会有几个步骤,从将数据从专用格式(从本体)传输到图形数据库开始。这里真正核心的是:提供来自本体(图谱结构)和外部来源的真实数据的过程。
一旦我们到达那里,我们就能够推进到机器学习引擎。记住,这里说的是通用方法。
以下是机器学习引擎的通用框架思路:
- 输入:来自图数据库的特征。
- 过程:经过训练周期。
- 输出:生成特征权重。
- 反馈:权重以反馈循环的形式回到图形数据库。
图数据库的输出,就是学习引擎的输入。然后我们进行第二次循环。因此,这种方法具有通用性。
破产预测用例详解 🏦
现在,我们使用这个通用模型来创建一个具体的用例:破产预测模型。
我们用于测试的财务数据来自四家中型私营公司的财务记录,从Fame数据库中获取。我们知道这些公司的财务状况:其中一些破产了,一些没有,有些财务状况稳定。我们将这些公司分为两组。
以下是关于我们用于此用例的本体的详细信息:
- 基础:基于英国和国际立法,是一套与破产预测和一般财务分析相关的概念。
- 灵感:受到FIBO(金融业商业本体)的启发,但我们的本体更专注于财务分析标准,可以作为FIBO的扩展。
- 开发工具:使用Protégé环境开发。
- 结构:主要类别是财务报表要素和财务比率。我们定义了等级关系(子类关系)。
- 关系类型:定义了两种类型的关系,将财务比率与财务报表要素连接起来。
- 属性:例如,财务比率包含规范值等附加属性。
为了在此用例中使用本体,我们实际上简化了本体并将其一分为二:
- 一个简单的本体分类法:财务报表要素的分类法。
- 公司财务比率的分类法。
我们将这些本体保存为RDF/OWL文件。在此用例中,我们有两个独立的OWL文件,其中一个包含了关于公司特定比率的选集。
我们使用两种类型的数据文件:
- 训练数据:一个包含45家英国公司财务比率的CSV文件,以及一个包含这45家公司破产状态(破产级别)的单独文件。
- 测试数据:从特定公司的传统数据库中获得的原始数据CSV文件,以及机器学习引擎的实际输入/输出文件。
图数据库构建过程 🗃️
我们将这些本体(OWL文件)转移到Neo4j环境中来构建图数据库。我们不需要从头开始构建骨架。
- 传输与连接:传送这些OWL文件,并在两个OWL文件之间建立无层次的连接(因为我们有分类法)。
- 匹配与填充:现在我们有一个没有标签的空图。我们需要获取特定公司的输入数据。我们使用来自传统数据库的CSV文件(包含资产负债表、现金流量表、损益表数据)。首先,需要匹配图中节点的标签与CSV文件的列标题,以便后续模块知道特定数据的位置。
- 计算与填充:下一步是为特定节点填充值,这些值从CSV文件中获取。我们需要计算公司财务记录中没有列出的比率。Cypher查询语言允许使用内置数学函数进行计算。
- 保存:对于机器学习组件,我们将图形保存为CSV文件。在第一次迭代后,图不仅填充了节点组件的值,还有权重。这些CSV文件保存在Neo4j环境中。
机器学习引擎与反馈 ⚙️
在这个特定的用例中,作为机器学习引擎,我们使用具有误差反向传播的经典神经网络。这对于此类数据是理想的,因为它产生0或1的结果(0表示公司稳定,1表示公司破产风险高)。
我们的机器学习引擎产生在此特定迭代中使用的特征的权重。我们把包含权重的CSV文件转移回图数据库。这样,图数据库保留了上一次迭代的记录和特征的基础,这有助于提高下一次迭代的效率。这些权重将用于特征选择,从而减少噪声数据。
我开发了通用模块以及破产预测模型。这个特殊的计算模型具有通用性:任何本体、任何图形数据库和任何机器学习引擎都可以作为这种特殊架构的组成部分。
总结
本节课中,我们一起学习了一个用于金融数据预测的通用计算建模方法。该方法的核心是利用本体对领域知识进行形式化建模,通过图数据库实现知识的实例化和计算,并集成机器学习引擎进行预测。关键的创新在于建立了反馈循环,将机器学习输出的特征权重反馈至图数据库,用于优化下一次迭代的特征选择,从而提升模型性能。
我们通过一个具体的破产预测用例,详细演示了从本体构建、图数据库填充、特征提取、模型训练到反馈优化的完整流程。这种方法强调数据的语义结构化和迭代优化,为处理复杂的、关系密集的金融数据提供了一种有前景的解决方案。

课程 P32:L19.1 - 构建知识图谱的开源工具调研 🛠️

概述
在本节课中,我们将要学习构建知识图谱时可以使用的一系列开源工具。我们将从数据连接与提取开始,到图数据库存储,再到图计算引擎,为您提供一个全面的工具概览,帮助您了解如何启动一个知识图谱项目。
现代软件架构理念
上一节我们介绍了课程的整体目标,本节中我们来看看现代软件架构与传统有何不同。
今天的软件架构非常不同,其核心是关于代码的重用,而非从头开始编写。对于知识图谱这种高度处理的结构化数据,通常需要经过多个步骤:您需要连接多个数据源,有时连接列表,有时从非结构化文本(如网页、新闻文章)中提取信息。在处理大量数据后,您将其存储在图形数据库或检索系统中。此外,还有一类软件或图形计算引擎,非常适合进行大规模图计算。
总体策略是将一个高层次问题分解为更小的部分,然后将每个子组件映射到现有的软件包上。您需要了解如何配置并将这些部分粘合在一起。由于开源软件包选项众多,您需要根据流行度、社区支持等指标做出明智的决定。
数据连接:从列表合并开始
构建知识图谱时,一个非常常见的任务是合并来自不同来源的列表。例如,我们希望全面了解“苹果公司”,需要从不同来源获取或创建列表,然后匹配这些列表。问题在于,通常没有完美的键来连接这些列表(例如“Apple”和“Apple Computer”可能指代同一实体)。当您加入更多信息(如地址)时,匹配的信心才会增加。
以下是处理此类记录链接任务的开源工具:
- Dedupe:这是一个原生的Python包,提供了非常好的编程访问接口。您首先用数据类型(如文本、短文本、日期时间,以及更语义化的类型如价格、地址)定义所有列。它提供了多种模糊匹配选项,您甚至可以定义自己的数据类型和匹配算法。该包内置了多种匹配技术(如考虑地球曲率的Haversine距离用于地址匹配),并支持阻塞技术。如果您有正负样本,它还能学习逻辑分类器,并可通过主动学习模块加速学习过程。
- 规则与词典:在某些情况下,机器学习并非最佳选择,编写规则或使用预建词典可能更简单。例如,人名匹配可以使用一个全面的西方名字昵称词典。对于拼写差异大的名字,可以使用Soundex或Metaphone等算法的实现,将名字转换为语音表示进行匹配。
信息提取:从非结构化文本到图谱
世界上大部分信息以非结构化文本形式存在,如新闻文章、报告、电子邮件等。从文本中提取信息并转化为知识图谱是一项挑战。
以下是处理非结构化文本信息提取的工具:
- spaCy:这是一个为构建现实世界软件而优化的NLP软件包。它提供了许多预构建的模型(如词性标注、命名实体识别),您也可以为特定领域(如生物医学、法律)创建自己的定制模型。它包含一个名为Prodigy的UI工具,可以快速构建和迭代模型,并包含主动学习组件,能优先选择模型不确定的示例进行标注,从而加速学习过程。
- 实体链接:spaCy包含一个实体链接框架,但它本身不链接到具体数据库。有第三方项目(如
spacy-entity-linker)创建了链接到Wikidata的链接器,可以开箱即用。 - 依赖解析与关系提取:spaCy提供了依赖解析功能,能将句子解析为带标签的有向图结构。这为提取“主语-谓语-宾语”三元组提供了基础。社区中有基于spaCy依赖解析进行三元组提取的项目。
- spaCy projects:这是一个用于知识提取的端到端spaCy管道集合,包含从非结构化文本到构建图谱(如Wikigraph)的所有组件,是一个很好的参考应用。
图数据库:存储知识图谱
在完成数据清洗、提取和处理后,您需要将知识图谱存储在专门的图数据库中。图数据库类似于SQL数据库,但更侧重于在线事务处理。
选择图数据库时,需要考虑多个维度:是否支持分布式、是否支持ACID事务、查询语言是什么、是否有管理服务、定价、生态系统和社区支持等。
以下是两个图数据库的例子:
- Neo4j:这是非常流行的图数据库。它采用属性图模型,支持水平扩展,具有访问控制功能,是Cypher查询语言的主要推动者之一。它提供社区版(开源)和企业版,支持多种编程语言的驱动程序,并拥有一个用户界面。
- Amazon Neptune:这是一个云托管的图数据库服务。它支持属性图和RDF图模型,提供Gremlin和SPARQL查询接口,支持ACID事务、持续备份到Amazon S3、跨区域自动复制以及静态和传输中加密。AWS还基于Neptune设计了针对身份图谱、个性化推荐和欺诈检测等常见用例的解决方案模板。
图计算引擎:进行大规模图分析
图计算引擎与图数据库略有不同,主要用于对图进行繁重的计算分析,例如PageRank或社区检测。
以下是两个图计算引擎的例子:


- NetworkX:这是一个非常流行的Python包。它在内存中操作,提供了一个Python接口(无查询语言),非常灵活。您可以将任何Python对象作为节点和边。它包含了极其丰富的图算法库。对于适合单机内存的数据集,这是一个绝佳选择。有人曾用NetworkX对小说《悲惨世界》的角色共现矩阵进行社区检测,并使用D3.js库实现了精彩的可视化动画,展示了社区发现和矩阵重排序的过程。
- Apache Spark GraphX:如果您的数据集非常大,无法放入单机内存,则需要像Apache Spark这样的分布式计算引擎。Spark的GraphX模块非常适合创建图应用程序。它定义了许多图操作符(如属性操作符、结构操作符),并提供了并行化、高效的算法实现(如PageRank)。不过,其内置的图算法数量远少于NetworkX。如果您的图规模巨大,可能就需要依赖此类工具。
总结
本节课中,我们一起学习了构建知识图谱的现代软件架构思路,并快速浏览了各个环节的关键开源工具:
- 数据连接:我们介绍了如何使用Dedupe等工具进行列表的模糊匹配与连接。
- 信息提取:我们探讨了如何使用spaCy及其生态系统从非结构化文本中提取实体、关系和三元组。
- 图数据库:我们了解了Neo4j和Amazon Neptune等图数据库,它们用于高效存储和查询知识图谱。
- 图计算引擎:我们介绍了NetworkX(适用于单机内存计算)和Apache Spark GraphX(适用于分布式大规模图计算),它们用于在图谱上进行复杂的分析运算。
这是一次旋风式的工具之旅,涵盖了构建知识图谱的典型步骤。希望这次调研能帮助您在实际项目中做出合适的技术选型。

问答环节精选
问:如何提取公司间的关系(例如“Cirrus Logic是苹果的供应商”)?该用Dedupe、spaCy、实体链接还是Wikidata?
答:这更像是一个关系提取问题,而不是链接问题。您需要从新闻、公司文件等来源寻找陈述此关系的证据。可以运行spaCy进行关系提取,并结合多份文档的证据来增强置信度。Dedupe或实体链接可能用于前期处理,但核心是关系提取。spacy提供了构建块(如依赖解析),但没有关系提取的交钥匙解决方案,通常需要在自己的数据集上训练模型。
问:能否将AWS Neptune、NetworkX和GraphX结合使用,构建端到端系统?是否有现成模板?
答:可以。这些工具都提供编程API(如REST API),可以相对容易地将它们集成在一起,构建一个复合系统。目前可能没有完全现成的端到端模板,需要自行集成。
问:构建知识图谱最耗时、最令人沮丧的方面是什么?
答:数据连接和信息提取过程非常耗时,且无法保证100%准确。如何建立反馈循环、让用户参与修正、处理数据噪声和规模问题,都是持续的挑战。此外,一些解决方案宣称全自动化,但实际上仍需要大量人工工作。
问:图数据库与图计算引擎(OLTP vs OLAP)能否混用?
答:图数据库(OLTP)针对读写事务进行了优化,确保数据一致性。图计算引擎(OLAP)针对复杂的只读分析查询进行了优化。虽然可以用OLTP系统进行OLAP分析,但性能可能不是最优。反之,在需要频繁更新的场景中使用OLAP系统也不合适。应根据主要工作负载选择。
问:对于非专家,有什么好的工具集来构建知识图谱?
答:这取决于“非专家”的具体背景和数据源。例如,一些数据连接工具提供了用户界面,非技术用户可以通过UI操作来合并列表。设计图谱模式可能需要一些专业知识,但也有可视化工具可以帮助。没有一套适合所有非专家的通用工具。
问:是否有知识图谱构建的通用基准?
答:大多数基准都是任务特定的,例如实体链接、关系提取等各有自己的数据集和基准。对于知识图上的推理性能,则有另一类基准。目前没有一个统一的、覆盖全流程的通用基准。

课程 P33:L19.2 - 从知识图谱到AI,两者如何关联 🧠➡️🔗
在本节课中,我们将探讨知识图谱与人工智能(AI)之间的双向关系,分析知识图谱如何作为AI的试验台,并展望图数据科学这一新兴领域。我们还将回顾知识表示在AI中的历史角色,并讨论当前构建大规模知识图谱的新方法。
概述
知识图谱与人工智能之间存在紧密且双向的关联。一方面,知识图谱能够显著提升许多AI应用的性能;另一方面,AI技术也被广泛用于构建和增强知识图谱。此外,海量数据的出现催生了“图数据科学”这一新学科。本节课将深入探讨这三个核心观点。
1. 知识图谱与AI的双向关系 🤝
上一节我们概述了课程的整体框架,本节中我们来看看知识图谱与AI之间具体的相互作用。这种关系是双向且互惠的。
-
知识图谱赋能AI应用:知识图谱为许多AI应用提供了结构化的背景知识,使其表现更佳。
- 智能助手:如Alexa、Siri和Google Assistant都利用知识图谱来理解世界和用户查询,从而提供更准确的回答和更丰富的功能。
- 推荐系统:例如亚马逊的产品知识图谱,通过理解商品间的复杂关系,能够实现更精准的商品推荐。
- 搜索引擎:像维基数据这样的知识图谱可用于增强搜索结果的准确性和相关性。
-
AI技术助力构建知识图谱:AI算法是构建和维护知识图谱的关键工具。
- 实体链接与模式映射:使用主动学习等AI技术来融合不同数据源中的实体。
- 信息抽取:利用自然语言处理(NLP)和语言模型从非结构化文本中自动提取实体和关系。
- 数据质量与推理:应用异常检测、推理和问答等AI技术来清理数据、发现新知识并更好地利用图谱。
这种“AI构建知识图谱,知识图谱增强AI”的循环,是现代数据驱动应用的核心特征。
2. 图数据科学的兴起 📈
在理解了双向关系后,我们来看看一个由此催生的新领域。现代组织拥有海量互联数据,渴望从中挖掘价值,这推动了“图数据科学”的出现。
图数据科学融合了三个关键领域的技能:
- 图分析:应用机器学习算法在图结构上进行预测和分类。
- 特征工程:需要领域知识和算法理解,以确定模型中应包含哪些图特征(节点、边、路径等属性)。
- 数据探索与可视化:设计有效的用户体验,帮助用户在海量图数据中导航并发现洞察。
以下是其核心组成部分的示例:
# 伪代码示例:使用图神经网络进行节点分类
import torch_geometric
model = GCN(in_channels, hidden_channels, out_channels)
# 模型利用图中的连接关系学习节点表示,用于分类等任务
虽然图算法、查询和可视化等技术已存在数十年,但与大规模数据、机器学习及用户体验设计的结合,构成了这个需求旺盛的新兴交叉学科。

3. 知识表示在AI中的演进与现状 🕰️
最后,我们将视角拉远,回顾知识在AI中的历史角色。知识图谱的核心理念——有向标签图——在AI早期就以“语义网络”的形式存在。
后续发展主要围绕为其添加更严格的语义:
- 描述逻辑与规则:为语义网络添加形式化逻辑,以支持可判定的推理。
- 概率图模型:如贝叶斯网络,用于处理现实世界中的不确定性。
然而,当前的知识图谱与早期工作相比,有三个显著差异:
- 规模:现代知识图谱(如维基数据)包含数千万实体和数十亿关系,规模空前。
- 构建方式:从早期的“自上而下”手工设计(知识工程),转向更多“自下而上”的数据驱动自动化构建(如使用NLP抽取)。
- 混合构建模式:结合了手工建模、自动化学习和众包等多种方式。
这并不意味着小规模知识或自上而下的设计不再重要。许多需要深度推理的“小数据”智能任务依然至关重要。当前基于知识图谱的AI系统(如搜索、推荐)虽已非常有用,但距离能够进行高水平认知(如设计实验、提供深层解释)的“强AI”愿景仍有差距。
总结
本节课我们一起学习了知识图谱与人工智能的紧密关联。我们明确了二者间的双向促进关系,认识了由图数据驱动产生的“图数据科学”新领域,并回顾了知识表示从传统AI到现代大规模应用的演进。当前的知识图谱以其前所未有的规模、数据驱动的构建方式和混合方法,正在为许多现代AI应用提供强大支持,同时也面临着向更高层次认知能力迈进的挑战。
课程内容基于 ShowMeAI 系列讲座 P33:L19.2 整理。

知识图谱课程 P34:L20.1 - 用于扩展知识图谱的 Hendler 语义 🧠

在本节课中,我们将学习 Jim Hendler 教授关于知识图谱互操作性的核心观点。我们将探讨如何让不同的知识图谱协同工作,以及实现这一目标所需的关键技术与历史背景。

概述 📋


本次课程的核心是知识图谱的互操作性。我们将回顾语义网的发展历程,理解从数据网络到知识图谱的演变,并探讨如何利用现有标准和技术(如 RDF、OWL 和 URI)来实现不同知识图谱之间的连接与协作。
从语义网到知识图谱的演变
上一节我们介绍了课程的主题。本节中,我们来看看知识图谱概念的发展脉络。
早期的网络基于超链接连接文档。大约在 2000 年,随着网络增长,出现了许多孤立的搜索引擎和应用。当时,人们设想通过一个模型,让机器能够发现并处理网络内容,这就是语义网愿景的起源。
2001年,Tim Berners-Lee 等人发表文章,提出了一个全球数据空间的愿景,这可以说是现代知识图谱概念的雏形。其核心思想是通过推理事物间的联系来实现互操作性。
然而,网络数据的增长远超预期。大约在 2003 年至 2004 年,焦点从“语义网”转向了“数据网络”,即如何以机器可读的形式访问和链接网络上的数据库。随后,开放数据运动和关联数据(Linked Data)概念兴起,旨在将数据集以机器可读的方式描述并链接在一起,形成了“关联开放数据云”(LOD Cloud)。
深度学习在 2013-2014 年左右兴起,带来了强大的数据处理工具,但这些工具需要大量数据。知识图谱作为数据密集型应用,也随之发展。但此时,知识图谱往往在“孤岛”中构建,例如亚马逊知识图谱、谷歌知识图谱等,它们之间的互操作性成为一个关键挑战。
因此,我们当前的阶段可以看作是“网络上的知识图谱”,重点是如何让这些图谱协同工作。
实现互操作性的关键技术
上一节我们回顾了发展历程,本节中我们来看看实现知识图谱互操作性需要哪些具体技术。
起点是重用我们已经掌握的技术,而不是重新发明轮子。RDF(资源描述框架)和 OWL(Web 本体语言)中的优秀部分仍然是基础。
基于 URI 的命名方案
RDF 的一个关键优势是提供了基于 URI(统一资源标识符)的命名方案。这至关重要,但它的重要性有时被忽视。
在传统网络中,一个 URI 指向另一个 Web 资源(如网页、文档)。在 RDF 模型中,一个 URI 通过另一个 URI(作为谓词)指向目标 URI。这为链接赋予了无限的可能性和明确的含义。

核心机制:
<主体URI> <谓词URI> <客体URI>
例如:<http://example.com/PersonA> <http://schema.org/worksFor> <http://example.com/CompanyX>
这种机制的好处是可解引用性。你可以跟随这些 URI,访问它们指向的系统,查看具体信息。如果我们有共同的语法和简单的语义,就能将不同来源的信息连接起来。
词汇表重用与本体映射
为了实现互操作,我们需要重用广泛使用的词汇表(如 Schema.org)。OWL 的一个重要功能是声明等价性(例如 owl:sameAs),这可以将不同来源中指向同一实体的 URI 关联起来。
例如,DBpedia 中的一个实体可以和 Wikidata 中的对应实体通过 owl:sameAs 关联,从而将不同知识图谱的数据整合在一起。
处理外部数据与过程

一个我们过去忽视的重要方面是“程序性附件”。知识图谱需要能够与外部数据库和计算过程对话。这意味着能够执行查询、运行特定过程来获取或生成数据。虽然历史上因专利等问题曾被搁置,但这种能力对于构建实用的、可互操作的知识图谱系统是必需的。
当前模型的对比:RDF 与属性图
属性图模型在企业中应用广泛,有其优势(例如更容易处理时间模型、不确定性)。但其主要缺点在于互操作性:它通常不提供基于 Web 的简单解引用能力,也不鼓励使用指向外部资源的全局标识符(如 URI)。因此,在构建开放、可互操作的知识图谱生态时,需要融合不同模型的优点。
构建可互操作的知识图谱:方法与案例
以下是构建可互操作知识图谱的几个关键方法与思路:
- 从成功的实践开始:例如 Schema.org,它虽然从严格的语义学角度看并不完美,但已被数十亿网页使用,为谷歌知识图谱等提供了海量的标记数据,在实践中证明了简单语义的巨大价值。
- 强调连接大小图谱:将大型通用知识图谱(如 Wikidata)与特定领域知识图谱(如医疗健康图谱)或个人知识图谱连接起来,能创造巨大价值。例如,在医疗领域,结合临床记录、基因信息和个人健康设备数据,可以构建个性化的健康知识图谱,同时通过互操作性协议保障隐私。
- 解决缺失环节:除了数据,还需要在知识图谱中融入对时间、不确定性、隐私和安全控制的考虑,这些都是实现深度互操作和实际应用的必要条件。
总结与展望 🎯
本节课我们一起学习了 Jim Hendler 教授对知识图谱互操作性的深刻见解。
我们回顾了从语义网、关联数据到现代知识图谱的发展路径,认识到互操作性是释放知识图谱潜力的关键。我们探讨了实现互操作性的核心技术,包括基于 URI 的全局命名、词汇表重用、本体映射以及处理外部数据的能力。最后,我们了解了构建开放、可互操作知识图谱生态的实用方法和挑战。

核心在于,我们需要借鉴历史经验,避免过度标准化,积极重用现有标准(如 RDF、OWL),并从已经成功的商业模式和技术实践中学习,推动知识图谱从封闭的“孤岛”走向开放的、协同的全球数据空间。
课程内容基于 Jim Hendler 教授的演讲整理。

课程 P35:L20.2 - 知识图谱的局限与超越 🧠
在本节课中,我们将学习知识图谱(Knowledge Graph)在人工智能项目构建过程中的局限性,以及如何通过更具表现力的表示方法和架构设计来克服这些挑战。课程内容基于一个长期AI项目的经验教训,旨在为初学者提供一个清晰、直白的理解。
概述 📋
知识图谱是一种强大的知识表示工具,但它并非万能。在构建复杂的AI系统(如心理AI项目)时,我们发现仅依赖知识图谱会遇到诸多瓶颈。本节课程将探讨知识图谱的不足,并介绍如何通过高阶逻辑、上下文感知和多层表示等方法,构建更强大、更灵活的知识系统。
早期错误与核心教训
在20世纪80年代初,我们专注于将纸质文本(如百科全书)的内容转化为结构化表示。然而,我们很快意识到一个关键问题:文本中蕴含的“常识”远比文章明确陈述的内容更重要。作者假设读者已经了解世界如何运作,从而能够消除语言歧义、理解言外之意并进行推理。
对上层本体论的过度关注
我们早期的一个错误是过度纠结于构建“完美的”上层本体论(Upper Ontology),即试图为所有知识定义一个绝对正确的顶层分类体系。许多项目都将大量精力耗费于此。
核心教训:真正重要的是本体论的“充分性”,而非其顶层分类的绝对正确性。即使分类方式不同(例如,按“有无灵魂”来划分事物),只要所做的区分足够,系统仍然能够有效工作。这本质上是一个效率问题。如果你的本体论区分不足,就像大部分名词和动词都用“蓝精灵”代替一样,你需要更冗长的表述才能传达相同的意思。
本体论并非越大越好
我们学到的另一个教训是,本体论并非越大越好。




核心教训:过大的本体论会导致“用多种方式说同一件事”的问题。例如,“太阳是黄色的”可以有多种表述(“它是一个黄色物体”、“它具有黄色”、“它的颜色是黄色”)。如果你在知识图谱中定义了所有这些词汇,就需要编写大量的公理(n² 级别的关联)来连接它们,这增加了系统的复杂性。因此,有些概念(如“黑白相间的猫”)可能不值得在知识图谱中拥有独立的术语。
为何需要超越知识图谱?
上一节我们讨论了知识图谱在构建时的效率与充分性问题。本节中,我们来看看为什么简单的知识图谱(主要表现为二元关系)在表达能力上存在根本局限。


表达能力的限制
我们最初使用的表示法(如框架、槽、关联三元组)本质上等同于今天的知识图谱。但我们逐渐被需求推动,必须使用更具表现力的表示方法。

原因一:需要表达多元关系
许多事实不仅仅是两个事物之间的关系。例如,“A在圣何塞和圣地亚哥之间的1号公路上”这个事实涉及多个参数。如果被迫用多个二元三元组来表示,那么这些三元组本身没有独立意义,只有组合起来才有意义。在这种情况下,不如直接使用多元关系。
原因二:需要表达复杂逻辑
自然语言和真实推理涉及大量逻辑连接词,而这是基础知识图谱难以直接表达的。
- 否定、量词与嵌套:我们需要区分“每个国王都有母亲”和“有一个母亲是所有国王的母亲”。在一阶逻辑中,这两者看起来完全不同。
- 传递性与集合论:我们需要区分传递关系和非传递关系,以及处理集合概念(如“1到10的整数集合”是有限集,但“1到10之间的整数”是无限个有限集中的一个)。
- 变量与元级别推理:我们需要使用变量提问(如“X和Y是什么关系?”),甚至进行元推理(如“谁告诉我这个信息?我为什么要相信它?”)。
- 情态与反事实:我们需要表示信念、欲望、可能性以及反事实条件(如“如果……会怎样?”)。
这些元素在新闻报道和日常对话中无处不在。试图将这类内容仅表示为三元组集合,会丢失绝大部分的语义信息和推理潜力。
表现力与效率的权衡
显然,在表示语言的表达能力和推理效率之间存在权衡。
- 一个极端是自然语言/高阶逻辑,表现力极强但难以直接计算。
- 另一个极端是机器学习/机器语言,效率高但表现力受限。

核心解决方案:借鉴电影《战争游戏》的启示——“赢得游戏的唯一方法就是不玩”。我们将系统“应该知道什么”(认识论问题)与“如何高效地推理它知道的东西”(启发式问题)分离开。这意味着我们需要多种表示语言以及它们之间的翻译器。
在我们的系统中,我们使用至少两种主要表示:
- EL (Epistemological Level - 认识论层):干净、富有表现力的高级表示(如高阶逻辑),由“哲学家”维护。
- HL (Heuristic Level - 启发式层):高效、专门化的低级表示和推理模块,由“程序员”优化。
实际上,我们现在拥有超过1000种不同的HL表示和模块。很多工作在于寻找概括性的方法,将知识压缩到少数公理中,而不是海量的特定规则。
提升效率的关键策略
以下是我们在实践中总结出的、能显著提升系统效率的一些关键策略:
- 明智地使用元知识:通过元规则(关于规则的规则)甚至元元规则,系统可以花费少量时间进行元级推理,从而在大部分时间里极大地提升问题解决效率。
- 定义规则宏谓词:将频繁出现的复杂模式定义为一个新的、简单的谓词。这样,复杂的推理模式就被“打包”成一个原子公式,使得推理更加高效。
- 优化推理参数:我们曾拥有约150个控制推理过程的参数(如推理步数限制)。后来发现,只需其中6个特定的参数组合,就能在历史问题上获得几乎相同的答案。这大大简化了系统配置。
效率演示示例
为了直观展示系统的能力,我们可以进行快速问答演示。系统可以实时生成复杂的逻辑表达式来回答“为什么”类问题,或处理涉及信念、反事实的复杂情景。
例如,询问“如果蒙太古和凯普莱特两家不是世仇,蒙太古勋爵会对罗密欧与朱丽叶的婚礼有何看法?”,系统能够基于修改后的上下文(移除世仇前提)进行推理并给出不同答案(可能变为赞同)。
这展示了系统在保持丰富表现力的同时,也能实现高效推理。一个有趣的轶事是:由于一个通用定理证明器模块速度极慢,我们在十年前悄悄关闭了它,而用户从未察觉。这说明大多数问题并不需要最通用但最低效的推理器。
其他重要教训与未来方向
除了上述核心内容,我们还总结了其他一些关键教训:
- 共享知识时,仅共享本体/图谱是不够的:必须共享支撑推理的“常识”和上下文。知道“人”、“睡眠”、“夜晚”这些概念,不如知道“人通常在夜晚闭眼躺着睡觉数小时且不喜欢被吵醒”这条知识有用。
- 上下文是第一公民:我们放弃了“全局一致知识”的概念,转向“局部一致知识”。知识仅在特定上下文中为真,就像地球局部是平的,但整体是球形的。这通过在高阶逻辑中将上下文作为一等对象来实现。
- 几乎没有绝对事实:几乎所有事实都只在上下文中成立。因此,系统在回答问题时,应寻找支持和反对每个答案的论据,而不是假设只有一个正确答案。
- 需要连接异构系统:过去一二十年,一个重要的工作是将不同的本体、数据库、网络服务和机器学习系统映射和连接起来。
未来的挑战与愿景
如何让这种更具表现力的方法被更广泛地接受和应用?
- 迈向知识效用:理想的未来是建立一种“知识公用事业”,像电力或网络一样,具有巨大的规模经济效应,使得个人获取知识的成本变得极低。这可能需要一种知识经济模型,用户可以通过贡献微小的知识来获取查询信用。
- 降低使用门槛:开发更好的工具,让即使不懂逻辑或知识图谱的领域专家,也能帮助系统调试和扩展知识。例如,当系统答错时,能自动生成一系列可能的缺失公理供专家选择确认。
- 互操作性的推动力:大公司开放其知识图谱以实现互操作性,往往源于众多小公司通过协作形成的挑战(如同电商比价),或出于企业间数据整合的实际商业需求。
总结 🎯
本节课我们一起学习了知识图谱在构建高级AI系统中的局限性。我们认识到,仅依赖二元关系图谱不足以表达复杂的逻辑、情态和上下文。通过采用多层表示架构(如EL和HL分离),将富有表现力的认识论层与高效特化的启发式层结合,并重视上下文和局部一致性,我们可以构建出更强大、更灵活的知识系统。未来的方向在于创建知识公用事业、降低构建门槛,并通过经济和技术手段促进大规模知识共享与互操作性。
(注:本教程根据提供的演讲内容整理,保留了原文每一句话的核心含义,并按照要求进行了结构化、简化和格式调整。)

课程 P4:L4.1 - 应用Cypher进行图谱查询 🗺️

在本节课中,我们将要学习知识图谱查询语言Cypher。课程将首先回顾属性图数据模型,然后深入介绍Cypher查询语言的核心概念与语法,特别是其强大的模式匹配功能。我们还将了解Cypher的标准化进程以及未来的扩展方向。
属性图数据模型回顾
上一节我们介绍了知识图谱的两种主要数据模型。本节中,我们来看看属性图数据模型的具体构成。
属性图数据模型主要由三个结构组成。
以下是其核心组成部分:
- 节点:表示图中的实体。一个节点可以有零个或多个标签,也可以有零个或多个属性(即键值对)。两个标签集完全相同的节点,其属性集可以完全不同。
- 关系:表示连接节点的有向边。一条关系必须有且仅有一种类型,并且具有方向(从起始节点指向结束节点)。关系也可以拥有零个或多个属性。关系必须连接一个起始节点和一个结束节点(允许自环)。
- 属性:是附着在节点和关系上的键值对,用于存储具体数据。属性名通常是字符串,属性值可以是整数、浮点数、字符串、列表等多种数据类型。
Cypher查询语言介绍
了解了数据模型后,本节我们来看看专为属性图设计的查询语言——Cypher。
Cypher由Neo4j在2010年开发,并于2015年开源。它深受SQL和Spark的影响,具有声明式、直观的特点。其核心优势在于将图形模式作为一等公民,使得表达复杂的关系遍历和路径查询变得非常简单。
Cypher的主要特性包括用于查询的MATCH子句、用于数据操作的DML语句,以及用于管理约束和索引的DDL语句。它特别适用于需要深度探索实体间关系、发现路径或处理高度连接数据的场景。
Cypher核心:模式匹配
Cypher跳动的心脏是图形模式匹配。其语法采用了一种类似ASCII艺术的形式,使得写在白板上的图形能直接转换为查询语句。
在MATCH子句中,我们用圆括号 () 表示节点,用箭头 --> 或 -- 表示关系。
以下是模式的基本写法:
- 节点模式:
(variable:Label {key: value})。其中variable是变量名,Label是节点标签,{key: value}是属性过滤条件。 - 关系模式:
-[variable:Type {key: value}]-。箭头方向表示关系方向。
一个基础的查询结构通常为:MATCH ... WHERE ... RETURN ...。MATCH用于描述要查找的图形模式,WHERE用于添加过滤谓词,RETURN用于定义返回的结果投影。
高级模式匹配功能
掌握了基础模式后,本节中我们来看看Cypher更强大的高级匹配功能,这是它与SQL的重要区别之一。
1. 可变长度路径
允许匹配长度不固定的路径,这对于查找多度关系至关重要。
(a)-[:FRIEND*]->(b):匹配任意长度的FRIEND关系路径。(a)-[:FRIEND*2..4]->(b):匹配长度为2到4的FRIEND关系路径。(a)-[:LIKES|:KNOWS+]->(b):匹配由LIKES或KNOWS关系构成的一条或多条边。
2. 返回路径
Cypher可以返回整个路径,而不仅仅是节点或关系。
MATCH p = (a)-[:FRIEND*]->(b)
RETURN p, nodes(p), length(p)
3. 线性组合与WITH子句
WITH子句用于将查询分阶段执行,实现中间结果的传递和聚合,类似于管道。
MATCH (person:Person)
WITH person, count{(person)-[:FRIEND]->()} AS friendCount
WHERE friendCount > 10
RETURN person.name, friendCount
开放Cypher项目与标准化
随着图数据库的普及,出现了多种查询语言。为了推动行业标准化,开放Cypher项目应运而生,并催生了GQL(图形查询语言)标准。
开放Cypher项目提供了语言规范、形式语义和测试套件,以促进不同实现之间的兼容性。与此同时,ISO组织正在推动两项标准:
- GQL:一种全新的、独立的属性图查询语言标准。
- SQL/PGQ:SQL标准的属性图查询扩展,允许在关系数据库上虚拟化并查询图数据。
这两项标准共享核心的图形模式匹配能力,并计划在未来支持更复杂的特性,如多图查询、图模式和图计算。
未来扩展方向
最后,我们简要展望一下Cypher和GQL未来的发展方向。
未来的扩展将包括更强大的路径模式,允许重复复杂的子模式而不仅仅是单一边标签。此外,还将增强对匹配语义的控制(如同构、同态),提供更多的路径结果修饰符(如所有最短路径),引入丰富的图形数据类型,以及支持多命名图的操作和图组合功能,以构建复杂的数据处理工作流。
总结
本节课中我们一起学习了属性图数据模型和Cypher查询语言。我们从数据模型的基本构成开始,深入探讨了Cypher以模式匹配为核心的查询范式,包括基础语法、可变长度路径、返回路径和WITH子句等高级特性。最后,我们了解了Cypher通过开放项目推动标准化,以及未来GQL和SQL/PGQ的发展方向。掌握Cypher是高效查询和分析知识图谱数据的关键技能。





课程 P5:L4.2 - 分布式RDF数据管理与查询 🗄️
概述
在本节课中,我们将要学习如何管理和查询大规模分布式RDF数据。随着RDF数据集的快速增长,传统的集中式处理方法已无法满足需求,因此分布式解决方案变得至关重要。我们将探讨几种主流的分布式RDF数据处理方法,包括查询分区系统、部分查询评估以及基于云的解决方案,并了解联邦查询系统如何整合多个独立的数据源。
RDF与SPARQL基础回顾
上一节我们介绍了RDF的基础知识,本节中我们来看看对后续讨论至关重要的两个概念:SPARQL语义和查询形状。
首先,我们专注于SPARQL的一个子集,称为基本图模式。一个仅由三元组模式集合构成、不含UNION、OPTIONAL等操作的查询,就是一个BGP。其语义是子图同态匹配。你可以将其理解为:在RDF数据集中,为查询中的每个三元组模式找到所有匹配的具体三元组,然后对这些匹配结果进行连接操作。
例如,对于一个包含变量?s和?o的查询,其核心操作是执行主语-主语连接和主语-宾语连接。
# 一个基本的图模式查询示例
SELECT ?s ?o WHERE {
?s :predicate1 ?o .
?s :predicate2 ?x .
?x :predicate3 ?o .
}
其次,SPARQL查询具有特定的形状,这在分布式处理中扮演重要角色。大多数查询是星形的,即一个中心顶点通过多个谓词边连接到其他顶点。此外,还有链形、树形、环形以及更复杂的形状。复杂的查询通常是多个星形查询的互连。
图分区技术
在深入分布式系统之前,我们需要理解数据是如何被分布的。图分区的目标是将一个大型RDF图分割成多个部分,并分配到不同的工作节点上,以实现并行查询处理。
以下是两种主要的图分区方法:
- 顶点不相交分区:每个顶点只属于一个分区。这会导致边被“切割”,即一条边的两个端点可能位于不同分区。我们的目标是最小化这种边切割,因为跨分区的边会导致节点间的通信开销。简单的哈希分区虽然平衡性好、速度快,但会产生大量的边切割和中间结果。更高级的算法如 METIS 通过对图进行粗化、分区再细化的过程来获得更好的切割效果,但其计算开销较大。
- 边不相交分区:每条边只属于一个分区。这会导致顶点被复制到多个分区中。在RDF这种简单的图模型中,顶点更新问题不突出,因此这种方法被广泛用于基于云的系统中。其优势在于,可以将具有相同谓词的边分组到同一个文件,从而在查询时最小化需要扫描的数据量。
核心问题在于,对于RDF图,真正影响连接性能的往往不是最小化边切割,而是最小化谓词切割。我们稍后会看到这一点。
分布式RDF系统分类
现在,我们来看看三种主流的分布式RDF数据处理方法。
1. 查询分区系统
这类系统从已分区的RDF数据集出发。核心思想是将一个SPARQL查询也分解成多个子查询,目标是让每个子查询能够在一个数据分区上独立执行,从而避免昂贵的跨分区连接操作。
这种方法与关系数据库中的分布式查询处理非常相似。关键在于如何协同设计数据分区和查询分解策略,以最小化分区间连接。
以下是两种代表性策略:
- N跳复制:首先使用如METIS等方法对图进行基础分区。然后,将每个分区边界内
N跳可达的顶点复制到该分区中。对于一个查询,如果其半径(最远距离)小于等于N,则可以在单个分区内完整执行;否则,需要将查询分解为多个半径更小的子查询。 - 语义哈希:根据三元组中主语、谓语或宾语的相同性,将三元组分组。然后使用哈希函数将这些组分配到不同机器,并允许有策略的复制。通过扩展分区的边界,可以使更多查询能在本地独立处理。
我们的一项研究工作提出,与其最小化边切割,不如有选择地最小化关键谓词上的切割,即使这增加了总边切割数,也能显著增加可独立执行的查询类别。我们采用了一种基于弱连通分量的贪婪算法来选择“超级顶点”进行粗化分区。
总结:查询分区方法性能很高,特别适合在分区的RDF数据上实现并行化。但查询分解本身是一个难题,且与数据分区策略紧密耦合。目前,还缺乏像关系代数那样成熟的查询优化框架。
2. 部分查询评估
这类系统同样使用分区的RDF数据,但不对查询进行分解。相反,它们采用部分求值技术。
其原理是:将一个函数f(x)重写为f'(s, d),其中s是已知输入,d是未知输入。先基于已知输入s执行f'得到部分结果,再结合未知输入d计算最终结果。
在我们的场景中:
- 已知输入:查询本身 + 分区内的数据 + 跨分区的“边界”信息。
- 执行过程:将查询发送到每个数据分区,各分区基于本地数据和已知的边界信息计算部分结果。由于缺少跨边界的完整匹配,这些不是最终答案。最后,需要一个组装阶段来合并所有部分结果,这个阶段可以是集中式的,也可以是分布式的。
总结:部分查询评估避免了复杂的查询分解,通过并行计算部分结果再合并来实现高效查询。但它要求底层的RDF系统能够支持这种部分求值操作。
3. 基于云的解决方案
在这种方案中,RDF数据被分区存储在分布式文件系统(如HDFS)上,SPARQL查询被转换为一系列的 MapReduce作业 来执行。
这是一种典型的数据并行执行模型。通常采用边不相交分区,特别是按谓词进行分区。例如,所有具有“姓名”谓词的三元组存储在一个文件中,所有具有“出生地”谓词的三元组存储在另一个文件中。
查询处理流程大致如下:
- 对于查询中的每个三元组模式,选择一个对应的数据文件。
- 为每个三元组模式启动一个MapReduce作业,进行模式匹配。
- 最后,启动另一个MapReduce作业,对所有中间结果进行连接操作。
总结:基于MapReduce的系统天生具有高可扩展性和容错性。但其性能受限于MapReduce框架本身,大量的中间结果需要读写HDFS,多个作业间的衔接也会带来额外开销。


联邦查询系统
上一节我们讨论了如何拆分单个大数据集,本节中我们来看看如何整合多个独立的数据源。联邦系统用于处理分布在多个SPARQL端点(即能执行SPARQL查询的数据源)上的RDF数据。
其核心思想是数据集成。通常有一个控制站点维护所有数据源的元数据(如访问模式、能力描述)。当收到一个查询时:
- 控制站点将查询分解成多个子查询。
- 根据元数据,为每个子查询选择最合适的数据源。
- 将子查询发送到对应的SPARQL端点执行。
- 从各端点取回部分结果,在控制站点进行连接和组装,得到最终答案。
例如,一个查询可能部分需要在GeoNames端点上执行,另一部分需要在DBpedia端点上执行。
挑战:
- 源选择:如何知道哪些数据源包含查询所需的信息,这本身是一个未完全解决的难题。
- 可靠性:研究表明,多达64%的公共SPARQL端点可能随时离线,因此需要容错处理机制。
- 中介负担:对于非SPARQL端点,需要构建“中介器”来模拟SPARQL查询能力,这增加了系统复杂性。
总结与展望
本节课中我们一起学习了分布式RDF数据管理与查询的几种关键技术。
我们回顾了图分区的基础,并深入探讨了三种扩展型系统:查询分区系统通过协同分解查询与数据来最小化跨节点连接;部分查询评估系统通过并行计算部分结果再合并来避免复杂分解;基于云的系统利用MapReduce框架实现大规模数据并行处理。此外,我们还了解了联邦系统如何集成多个独立的SPARQL端点。
然而,该领域的技术远未像分布式关系数据管理那样成熟。目前大多数工作只处理基本的图模式,对完整的SPARQL特性(如OPTIONAL、聚合)支持不足。一个活跃的研究方向是为SPARQL定义更完善的查询代数,以支持基于成本的优化、视图优化等高级功能。此外,对动态RDF图的增量查询处理也是一个重要的开放问题。
随着知识图谱和数据集的不断增长,对这些可扩展、高效、鲁棒的分布式处理技术的需求将日益迫切。

课程 P6:L5 - 如何设计知识图谱schema 🧠

在本节课中,我们将要学习如何设计知识图谱的schema。这是知识图谱创建系列的第一部分,我们将重点关注设计阶段需要考虑的核心原则和权衡。
创建知识图谱大致分为两个步骤:图式设计,以及用一组实例填充该模式。严格来说,知识图可以是一种无模式的方法,它只是一组三元组。但如果我们希望定义关系的含义、进行推理或确保数据可被理解,那么前期进行模式设计将非常有帮助。
在接下来的两节课中,我们将重点讨论如何填充知识图。信息可以来自结构化数据源、半结构化数据源,也可以通过NLP从文本中提取或使用计算机视觉技术获得,甚至可以通过手工输入。今天,我们将主要关注知识图谱模式的设计。
设计RDF图 🔗
RDF知识图的设计指南可以总结为所谓的“链接数据原则”。这些原则最初由蒂姆·伯纳斯-李爵士提出,非常简单但非常强大。
以下是主要原则:
- 使用URI命名事物。
- 使用HTTP URI,以便人们可以查找这些名字。
- 当有人查找URI时,使用标准(RDF、SPARQL)提供有用的信息。
- 在数据中包含指向其他事物的链接,以便人们可以发现新事物。
接下来,我们将更详细地研究每一个原则。
原则一:使用URI命名事物
在网络上,我们习惯使用URL(如网站地址)来命名事物。在RDF数据模型中,我们将其推广,使用URI(统一资源标识符)来命名一切,包括非信息资源(如现实世界中的一个人)。其背后的意图是提供一种独特的方式来引用我们正在创建的对象。
URI设计的基本准则是保持简短和便于记忆。虽然计算机程序可以使用URI,但为了让人类更容易理解数据,我们应该让URI有意义。另一个重要准则是确保URI具有持久性,因为其他人可能会使用它们来链接数据,频繁更改会导致链接失效。
原则二:使用HTTP URI以便查找
设计原则是,我们应该明确偏好使用http访问方法的URI。这样,当计算机程序遇到一个URI时,它知道去哪里找到更多关于它的信息。这个过程称为“解引用”。
对于传统的信息资源(如网页),解引用会返回该资源的当前表示(如一个网页)。对于非信息资源,解引用应该返回一组关于该对象的RDF事实。
原则三:提供有用的信息
当我们发布RDF事实时,必须能够说明这些事实的实际含义。通过使用标准词汇表,可以使数据更有用。例如,W3C发布了一些标准词汇(如组织本体),Schema.org社区也在开发共享词汇表。使用这些标准词汇,可以使其他人更容易理解和使用你的数据。
示例:描述英国内阁
@prefix org: <http://www.w3.org/ns/org#> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
<http://example.org/cabinet-office> a org:Organization ;
skos:prefLabel "Cabinet Office" .
在这个例子中,我们使用了org:和skos:这两个标准词汇中的类和属性。
如果所需词汇不存在,创建新词汇表的原则包括:应该被记录、应该是自我描述的、应该有版本控制策略、应该有多种语言版本,并且应该由可信的来源持久地发布。
原则四:包含链接以发现新事物
这与在文本文档中创建超链接类似,但这里是在数据集中建立链接。在RDF数据集中,可以区分三种链接:
- 关系链接:连接两个不同数据集中的对象。
- 示例:
:DaveSmith foaf:knows dbpedia:Colin_Birmingham .
- 示例:
- 身份链接:将两个不同数据集中的对象等同起来。
- 示例:
:me owl:sameAs :DaveSmith .
- 示例:
- 词汇链接:将数据连接到术语的定义。
- 示例:
:SME rdfs:subClassOf dbpedia:Company .
- 示例:
这些链接可以被视为传统HTML超链接的泛化,它们连接的是对象而非文档。
遵循这四个基本原则发布数据,将使数据网络能够像文档网络一样被探索,并催生新的服务和能力。
上一节我们介绍了RDF图的设计原则,本节中我们来看看属性图的设计考虑。
设计属性图 📊
在属性图数据模型中,设计问题包括:节点、标签和属性应该是什么?是否应该引入新的节点标签或属性?是否应该引入新的关系?是否应该将某些信息作为关系属性?如果遇到无法用三元组捕捉的情况该怎么办?
这些都是简单的软件工程问题。我们将通过一些简单的例子来讨论。
节点标签 vs 节点属性
最简单的例子是表示“人”。我们有两个对象:John和Mary。在属性图模型中,我们会有两个节点,每个节点都有一个标签Person。标签的作用类似于“类”。
进一步的问题是:如何建模“性别”?我们有几种选择:
- 引入新标签(类):为John创建标签
Male,为Mary创建标签Female。标签应该是自然、简短的名词短语,并且不随时间变化。这种方法的优点是,大多数图数据库会对标签(类)建立索引,因此基于标签的查询访问速度很快。 - 作为节点属性:在
Person节点上添加一个属性gender,其值为“male”或“female”。从纯粹的信息内容角度看,这与第一种设计是等价的。但缺点是,大多数图数据库不会对节点属性建立索引,因此基于属性值的查询可能较慢。 - 作为关系对象:创建一个
Gender对象(节点),然后在Person节点和Gender节点之间建立hasGender关系。这种方法适用于需要跟踪随时间变化的属性(虽然性别通常不变),或者需要为关系本身附加其他信息(如开始日期)。缺点是这会显著增加图的规模。
权衡:第一种方法最简单且访问快;第二种方法避免了创建可能无意义的类;第三种方法在需要处理时变属性或关系属性时非常有用。
访问效率示例:电影与流派
考虑如何为电影及其流派建模。
- 方法一(作为属性):电影节点有一个
genres属性,值为列表[“Action”, “Superhero”]。 - 方法二(作为关系):创建
Genre节点,电影节点通过hasGenre关系连接到流派节点。
查询“具有相同流派的电影”:
- 在方法一中,查询需要比较两个节点的属性列表(集合交集),由于属性未索引,这可能开销较大。
- 在方法二中,查询通过遍历
hasGenre关系来寻找共同连接的Genre节点。图数据库通常对关系遍历进行了高度优化,因此这种查询会快得多。
结论:如果你需要频繁基于某个属性进行查询或计算,将其建模为对象和关系(从而利用索引和优化遍历)通常是更好的选择。
何时使用关系属性
我们已经看到关系属性的一个用例:记录时变信息(如关系的开始日期)或出处信息。大多数图数据库不会对关系属性建立索引。
因此,如果查询需要大量基于关系属性进行筛选,那么使用关系属性可能不是最佳选择。在这种情况下,唯一的方法是将这种关系“具体化”(Reification),即将关系本身也转换为一个节点,并将属性附加到这个新节点上。
具体化(Reification)技术
具体化对于处理非二元关系(如“X位于Y和Z之间”)是必要的。工作方式是:创建一个表示关系本身的节点(例如Between),然后为关系的每个参数(X, Y, Z)创建节点,并用二元关系(如hasObject, hasSubject)将这些对象连接到关系节点。
这与在RDF中处理非二元关系的方法在概念上是相同的,只是使用的关系名称可能不同。
总结 📝
在本节课中,我们一起学习了知识图谱设计中的核心考虑。
知识图设计中有共同的考虑,例如:什么应该是一个类?应该是什么关系?何时以及如何进行具体化?这些问题对于RDF数据模型和属性图数据模型都是常见的。
也存在一些不同的侧重点:
- 在RDF图设计中,重点在于在Web上发布和链接数据的能力,强调使用标准词汇和建立跨数据集的链接。
- 在属性图设计中,更多强调索引和查询性能优化,因为属性图数据库通常用于需要高效图遍历和分析的场景。
最后需要指出,本节课介绍的是设计指南而非硬性规则。在许多情况下,存在多个同等优秀的选择。这些原则旨在帮助我们最大限度地利用所构建的系统,我们应该在可能的程度上遵循它们,同时也认识到设计的灵活性。


下一次课程将在周四,主题仍然是“如何设计知识图谱”。我们将听到关于将Wikidata转化为机器更易理解的“Wiki知识”的新语言,以及向Wikidata中添加关于Covid信息的实践案例。这将是关于模式设计和演化的非常激动人心的会议。
课程 P7:L6.1 - 把维基百科数据构建成维基知识库 📚
在本节课中,我们将学习如何将维基百科数据构建成一个真正的知识库。我们将探讨维基数据(Wikidata)的现状、其作为知识图谱的潜力,以及如何通过逻辑增强使其从“数据”转变为“知识”。
什么是维基数据?🔍
维基数据是一个大型的、社区驱动的知识存储库。它拥有超过9300万个实体,涵盖各种主题。任何人都可以访问和编辑维基数据,其数据遵循CC0协议,完全免费开放。
以下是维基数据的一些关键特点:
- 它是一个庞大的社区驱动存储库。
- 包含超过9300万个实体。
- 数据完全免费开放(CC0协议)。
- 提供图形界面和查询界面(如SPARQL)进行访问。
维基数据的界面与查询 🖥️
维基数据的页面类似于维基百科,但展示的是结构化的数据。例如,“伊丽莎白·泰勒”的页面会列出她的各种属性信息。
此外,维基数据提供了SPARQL查询接口。用户可以通过编写查询语句来获取特定信息。例如,查询伊丽莎白·泰勒的子女:
SELECT ?child ?childLabel WHERE {
wd:Q296830 wdt:P40 ?child. # wd:Q296830 是伊丽莎白·泰勒的ID,P40是“子女”属性
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
}
然而,查询时需要直接使用数字ID,这对用户不太友好。
维基数据的优势与用途 ✅
维基数据非常有用,主要体现在以下几个方面:
- 规模庞大:包含约13亿个事实陈述,且持续增长。
- 质量较高:社区努力确保了信息的准确性和完整性。
- 连接广泛:作为语义枢纽,链接了大量外部数据库(如VIAF、ISNI等)。
- 本质是图谱:数据以节点(实体)和边(属性/关系)的形式组织,可以可视化展示。
- 描述现实世界:涵盖人物、地点、事件等各种现实世界概念。
- 拥有模式(Schema):定义了类(如“人类”)和属性(如“配偶”、“子女”)的层次结构。
例如,“人类”(Human)在维基数据中的类层次结构为:实体 -> 事物 -> 个体 -> 人 -> 人类。这构成了一个基本的本体。
维基数据的局限:从数据到知识的差距 ⚠️
尽管维基数据拥有丰富的数据和模式,但它是否真正构成了“知识”呢?根据“知识是组织好并随时可用的信息”这一定义,维基数据仍有差距。
上一节我们介绍了维基数据的优势,本节中我们来看看它作为知识库的局限性。
以下是维基数据存在的一些关键问题:
- 缺乏机器可读的推理逻辑:类(如“女性”)通常只有自然语言描述,而没有机器可读的“识别条件”。因此,无法通过简单查询
实例 of 女性来获得所有女性实例,必须手动编写复杂的查询来模拟定义。 - 上下文信息处理困难:许多事实(如婚姻)带有时间、地点等限定符。但系统没有明确规则说明如何利用这些限定符来回答“某人在某时刻的配偶是谁”这类上下文相关的问题。机器难以自动构建正确的查询上下文。
- 缺少常识性约束检查:知识图谱中可能存在明显错误(如历史人物拥有现代职业),因为缺乏基本的逻辑约束来防止这种不一致。
- 信息获取不直观:要获取准确、完整的信息,用户必须深入了解数据模型并精心设计查询,而不是直接询问。这意味着“知识”并未准备好被程序直接使用。
因此,维基数据目前更接近一个丰富的“数据库”,而非一个可直接推理的“知识库”。
如何将维基数据转化为维基知识? 🛠️
要将维基数据提升为真正的知识库,我们需要为其增加逻辑推理能力,从而能够自动推导出隐含的知识和正确处理上下文。
核心思路是:为维基数据设计并实现一套逻辑系统。这套系统需要能够:
- 将自然语言描述转化为逻辑表达式。
- 定义类和属性的逻辑规则(如传递性、对称性)。
- 处理限定符(如时间、地点)的组合与推理。
- 执行一致性约束检查。
例如,我们可以添加规则:
- 子类传递性:
如果 (X 子类 Y) 且 (Y 子类 Z),则 (X 子类 Z) - 属性对称性:
如果 (A 配偶 B),则 (B 配偶 A) - 类识别规则:
如果 (X 实例 人类) 且 (X 性别 女性),则 (X 实例 女性)
通过一个支持前向链推理的规则引擎,我们可以将这些规则应用到维基数据的事实上,自动推导出所有隐含的陈述,从而形成一个完整的“知识库”。
面临的挑战与总结 🎯
实现上述愿景主要面临两大挑战:
- 技术实现:需要开发或适配一个能够高效处理维基数据规模、并支持所述逻辑规则的推理系统。
- 社区与协作:维基数据是社区项目,任何重大改动都需要社区的共识和支持。推动这种根本性的模式增强需要巨大的协调努力。


本节课中我们一起学习了维基数据的潜力与局限。总而言之,维基数据是一个极具价值的数据图谱,但要成为真正的知识图谱,它需要超越当前的分类法模式,融入能够定义识别条件、支持推理和约束检查的逻辑层。这不仅是技术上的升级,更是对知识图谱“模式”设计理念的深化——真正的模式应使机器能够理解并运用其中的知识。

课程P8:L6.2 - 给维基数据添加Covid信息 📚



在本节课中,我们将学习如何向维基数据(Wikidata)中添加关于Covid-19的结构化信息。我们将了解其背后的动机、使用的工具(如基因维基项目)以及具体的实施步骤。
概述
本次课程将介绍一个用于向维基数据添加数据的协议,特别是以Covid-19信息为例。我们将探讨为何需要结构化数据、如何利用现有项目(如基因维基项目)以及创建和使用模式(如形状表达式)的具体流程。
背景与动机 🎯
上一节我们介绍了课程的整体目标,本节中我们来看看为何需要向维基数据添加Covid-19信息。
在当前的疫情中,产生了大量的科学论文和知识。同时,也存在错误信息传播的风险。因此,我们需要可靠的方法来整合和验证这些信息,确保能够回溯到经过证实的文献和数据。
例如,通过分析PubMed中关于不同病毒的论文数量,可以观察到特定事件(如疫情爆发)会导致相关研究激增。这突显了高效管理和整合科学数据的必要性。
基因维基项目 🤖
上一节我们了解了数据整合的需求,本节中我们来看看一个关键的工具——基因维基项目。
基因维基项目始于2008年,旨在为每个人类基因创建维基百科文章。它从各种数据库中捕获结构化数据(如标识符),并通过众包方式总结知识。
随着维基数据的出现,该项目将工作重心从维基百科转移到了维基数据上。维基数据与维基百科类似,但专注于存储结构化数据而非文本。它基于相同的MediaWiki框架,完全免费开放,并支持强大的查询功能。
基因维基项目维护着一组机器人,定期从公共数据源(关于基因、化合物、蛋白质、文献、代谢途径等)查找信息,并更新维基数据中的内容。
以下是整合数据的关键步骤:
- 模式协调:确定如何在维基数据中表示特定实体(如基因)以及使用哪些属性和语句。
- 模式创建:参考维基数据中已有的类似项目,或使用形状表达式等工具来定义数据模式。
- 机器人实施:编写机器人程序,根据定义的模式检查和更新维基数据中的信息。
实施流程:以Covid-19为例 🛠️
上一节我们介绍了基因维基项目的工作方式,本节中我们具体看看如何应用它来添加Covid-19信息。
在相关推文的推动下,我们为病毒基因创建了第一个维基数据模式。这个模式使用一种名为形状表达式的机器可读格式来描述。
形状表达式定义了每个病毒基因条目在维基数据中应包含的特定属性信息。例如,一个病毒基因条目可能需要包含以下属性:
P351(Entrez Gene ID)P594(Ensembl Gene ID)P688(编码蛋白质)P703(发现于物种)
通过这种结构化的模式,我们可以确保添加到维基数据中的Covid-19相关信息是完整、一致且易于查询的。
总结

本节课中我们一起学习了如何向维基数据添加关于Covid-19的结构化信息。我们了解了这样做的必要性,认识了基因维基项目作为关键工具的角色,并探讨了使用形状表达式定义数据模式的具体流程。这套方法不仅适用于疫情数据,也可作为整合其他领域科学资源的通用协议。

课程 P9:L6.3 - 维基数据中的实体Schema与形状语言 🧠

在本节课中,我们将要学习维基数据(Wikidata)中用于描述和验证数据的核心机制——实体Schema与形状表达式语言(ShEx)。我们将了解它们为何被创建、如何工作,以及在实际项目中的应用。
概述 📋
知识图谱常与RDF(资源描述框架)关联。RDF在数据集成、知识表示和上下文适应方面具有优势,并拥有丰富的工具生态。然而,RDF在消费和生产数据时,对开发者不够友好,文档和内容描述有时也不够清晰。
为了解决这些问题,2013年提出了形状表达式语言(ShEx)。它的目标是成为一种人类可读且机器可处理的模式语言,用于描述和约束RDF数据的内容结构,从而辅助验证、生成用户界面和优化查询。


形状表达式(ShEx)简介 🛠️

上一节我们提到了RDF的挑战,本节中我们来看看形状表达式(ShEx)如何作为解决方案。

形状表达式语言有两大主要目标:
- 人类可读:其语法受Turtle和SPARQL启发,面向了解知识图谱但不必是计算机专家的领域专家。
- 机器可处理:具有形式化语义,有JavaScript等开源实现。


一个简单的ShEx模式示例如下:
:User {
:name xsd:string ;
:knows @:User*
}
这个模式定义了一个 :User 类,它必须有一个字符串类型的 :name 属性,以及零个或多个指向其他 :User 的 :knows 属性。


假设我们有以下RDF数据(Turtle格式):
:Alice a :User ;
:name "Alice" ;
:knows :Bob .
:Bob a :User ;
:name "Robert" .
以及对应的ShEx模式。验证过程会检查 :Alice 是否符合 :User 形状。由于 :Alice 的 :knows 属性指向了 :Bob,而 :Bob 也被声明为 :User,因此验证通过。

这只是对ShEx的简要介绍。更多细节可查阅相关书籍《Validating RDF Data》或在线教程。





维基数据与形状表达式 🔗

了解了ShEx的基本概念后,我们来看看它如何与维基数据结合。

维基数据采用了形状表达式,并将其命名为 实体Schema。它们使用独立的命名空间,例如:
E代表实体Schema(如E42代表“作者”的Schema)。- 其他常用命名空间包括
Q(实体)、P(属性)、L(词位)等。

在维基数据中,你可以访问实体Schema,并使用在线工具验证具体实体是否符合某个Schema。例如,可以针对“作者”Schema运行验证,工具会执行SPARQL查询并返回验证结果,指出哪些数据符合、哪些不符合。这反映了维基数据的现状:并非所有数据都完全正确,Schema有助于识别和修复问题。



工具与应用案例 🧰

上一节我们介绍了ShEx在维基数据中的角色,本节中我们来看看围绕它的工具和实际应用。
以下是基于ShEx开发的一些实用工具:
- YASHE:一个编辑器,支持在编写ShEx时自动补全维基数据的实体(如
E42),使编辑体验更流畅。 - RDFShape 游乐场:一个集成的ShEx与SPARQL在线实验环境。
- Wikishape:专为维基数据设计的ShEx工具。
- 从数据推断形状:根据已有的RDF数据,自动推导出可能的ShEx模式。
- 从形状生成表单:根据ShEx模式自动生成数据输入表单。例如,一个“演员”的Schema可以生成包含对应字段的表单,方便用户提交结构化数据。
这些工具源于用户的实际需求,展示了ShEx在数据生产和消费两端的实用性。
维基数据中的Schema生态系统与合作 🌱
工具提升了效率,而Schema本身的创建与管理则涉及社区协作。
维基数据中实体Schema的采用率持续增长。存在一个 实体Schema目录,汇集了社区创建的各种Schema,例如针对“医院”、“基因”等概念的Schema。
这种协作模式带来了新的挑战和机遇:
- 挑战:在开放的协作中,不同人创建的Schema可能存在重叠或矛盾。
- 机遇:它促进了数据质量与编辑自由之间的权衡,并推动了来自不同学科领域专家之间的合作。
实践项目:基因维基与COVID-19数据 🧬
理论需要实践验证。让我们通过一个具体项目,看如何将上述流程应用于实际领域。
这里展示的是“基因维基”项目的工作流程,特别是在整合COVID-19相关数据时的应用:
- 社区参与:首先与领域专家社区互动,讨论可用的公开数据,并就待描述的关系达成共识。
- 模式提取:将共识转化为纸面模型,并提交给维基数据社区讨论。
- 转换为形状表达式:将确定的模式用ShEx语言正式描述。
- 应用Schema:生成的ShEx模式可用于多种用途:
- 文档:作为领域专家共识的正式记录。
- 客户端检查:在数据提交前进行验证。
- 服务器端检查:在数据摄入时进行验证。
- 数据同步:编写机器人程序,定期将外部数据库(如基因数据库)的数据与维基数据同步,并利用ShEx模式确保数据质量。
- 持续集成:整个流程被嵌入持续集成工作流,实现定期自动更新。
通过这个管道,项目成功创建并维护了疾病、病毒毒株、蛋白质、基因等一系列实体Schema,将维基数据与专业数据库的努力结合起来。
结论与展望:我们致力于构建一个与维基数据对齐的实体Schema生态系统。维基数据不仅是一个优秀的数据协作中心,也正在成为底层模式(Schema)的协作平台。
总结 🎯
本节课中我们一起学习了:
- 形状表达式(ShEx) 作为一种描述和验证RDF数据的人类可读模式语言,解决了直接使用RDF的一些痛点。
- ShEx在 维基数据 中以 实体Schema 的形式被采纳和应用,用于描述数据预期结构。
- 围绕ShEx有一系列 工具,支持编辑、验证、推断和表单生成。
- 维基数据中的Schema发展是一个 社区协作 过程,带来了管理上的挑战和机遇。
- 通过 基因维基 等实际项目,我们看到了从社区共识到ShEx模式,再到数据验证和同步的完整应用流程。
这套方法不仅有助于整理和理解维基数据中的内容,也为其他领域构建结构化的公共知识图谱提供了可复用的协议。


浙公网安备 33010602011771号