使用Facebook Pytorch BigGraph从知识图谱中提取知识

导读

本文从经典算法开始介绍了知识图谱中结点的嵌入表示,学习嵌入的过程及各类属性,探索了PGB在知识图谱表示中的表现和作用。

作者 | Sergey Zelvenskly 

编译 | Xiaowen 

原文链接: 

https://towardsdatascience.com/extracting-knowledge-from-knowledge-graphs-e5521e4861a0


机器学习使我们能够训练模型,模型可以将数据转换为标签,使类似的数据映射到相似或相同的标签。

例如,我们正在为电子邮件消息构建垃圾邮件过滤器。我们有很多电子邮件,其中一些标记为垃圾邮件,一些标记为收件箱。我们可以构建一个模型,学习识别垃圾邮件。要标记为垃圾邮件的消息在某种程度上类似于已标记为垃圾邮件的消息。

相似性的概念对机器学习至关重要。在现实世界中,相似的概念是非常具体的主题,它取决于我们的知识

另一方面,大多数数学模型假设定义了相似性的概念。通常,我们将数据表示为多维向量并测量向量之间的距离。

https://www.quora.com/Why-do-we-use-cosine-similarity-on-Word2Vec-instead-of-Euclidean-distance

特征工程是将我们关于现实世界对象的知识转换为这些对象的数字表示的过程。我们认为相似的对象表示为附近的向量。

例如,我们正在估算房价。我们的经验告诉我们,房子的定义是由卧室的数目,浴室的数目,年龄,平方。地点等位于同一社区、大小和年龄相似的房屋,其价格应大致相同。我们把对住房市场的了解转化为描述房屋的数字,并利用它来估计房屋的价格。 

遗憾的是,如上所述,手动特征工程在我们将知识转换为描述性特征方面具有局限性。

有时,知识仅限于相似性原则,而不是使对象相似的确切特征。通常,我们对现实世界的了解比以简单的表格格式表示的要复杂得多。它通常是相互关联的概念和关系的图表。

嵌入模型允许我们获取原始数据并根据我们对原理的了解自动将其转换为特征。

Word2Vec

Word2Vec可能是最著名的嵌入模型,它为单词构建相似性向量。在这种情况下,我们对世界的认识以叙事的形式呈现,其表示为文本,是文本的序列。

经过几十年的努力,人们试图用手工定义的特征来描述单词,但效果有限。这些解决方案通常无法扩展到全部知识,或仅在有限的情况下发挥作用。 

当Tomas Mikolov和他的Google团队决定建立一个基于众所周知的相似原则的模型时,一切都发生了变化。在类似的上下文中使用的词通常是相似的,在这种情况下,上下文由位于附近的单词定义。

单词序列的图形表示

我们所看到的是,考虑到这些原则,我们可以通过简单地将每个单词与其邻居在预定义窗口(通常为5个单词)内连接起来,从文本中构建图形。

现在我们有一个基于我们的知识连接到图形中的真实单词对象(单词)的图形。

最简单/复杂的单词表示

我们仍然无法构建任何模型,因为单词不以表格或向量表示。

如果我们只需要将单词转换为数字,那么就有一个简单的解决方案。让我们拿字典并将每个单词分配给字典中的位置。

例如,如果我有三个词:猫,毛毛虫,小猫。

我的矢量表示如下:cat- [1],caterpillar- [2]和kitten- [3]。

不幸的是,这没什么用。通过分配这样的数字,我们隐含地引入了单词之间的距离。猫和毛虫之间的距离是1,猫和小猫之间的距离是2.我们说猫更像毛毛虫而不是小猫,这与我们的知识相矛盾。

有一种替代的表示,也称为one-hot编码执行此操作:

猫 - [1,0,0]

毛毛虫 - [0,1,0]

小猫 - [0,0,1]

该模式表明所有单词彼此正交。我们承认没有先入为主的词语相似性概念。我们将依赖我们的知识图谱(如上所述),它结合了我们的词汇相似原则来构建嵌入。

在现实世界中,字典大小远远大于3。典型的维度从数万到数百万。不仅这些矢量并不真正代表我们的相似概念,而且这些矢量也非常庞大笨重,不能在实践中真正使用。

建立词嵌入

我们的知识图谱为我们提供了大量的图形边,每条边可以解释为输入数据作为边的起点,标签作为边的末端。我们正在建立一个模型,它试图用它周围的单词作为标签来预测这个词。 我们要么从它的邻居之和重建单词向量,要么通过尝试从单词中预测邻居来做相反的事情。

https://papers.nips.cc/paper/5021-distributed-representations-of-words-and-phrases-and-their-compositionality.pdf


从根本上说,上述模型使用基本的编码器/解码器模型来学习从高维空间(数百万维度)到有限维度空间(通常为300)并返回高维空间的投影。训练的目标是在压缩过程中尽可能多地保留信息(最小化交叉熵)。

http://mccormickml.com/2016/04/19/word2vec-tutorial-the-skip-gram-model/

这种从稀疏正交数据集学习低维投影到更密集的低维空间的概念是许多其他嵌入训练模型的基础。

该模型通常在google crawl,twitter dataset或Wikipedia等资源上进行训练。我们正在消耗知识并从中构建我们的词汇嵌入。

Word2Vec嵌入的属性

Word2Vec的重要属性是保持关系揭示结构等价的能力。

下图显示了国家和首都之间的联系,或其他不同的概念。

https://www.tensorflow.org/tutorials/representation/word2vec

基本上它允许对这样的单词进行代数运算:

国王 - 男人+女人=女王。

使用Word嵌入

Word嵌入大大改善了文本分类,命名实体识别,机器翻译等任务。

以下是更多信息:http://www.wildml.com/2015/11/understanding-convolutional-neural-networks-for-nlp/

Node2Vec

Node2Vec是由A. Grover和J. Leskovec撰写的模型,它通过扩展Word2Vec的思想来分析同质加权图。本文背后的想法是,我们可以通过探索其周围环境来表征图形节点。我们对世界的理解基于两个原则 - 同质性和结构等价性

同质性

类似的节点位于附近

例子:

  • 社交网络 - 我们与像我们这样的人联系更紧密。

  • 商业地点 - 金融公司,医生办公室或营销公司似乎通常位于同一条街道上

  • 组织结构 - 同一团队中的人具有相似的特征

结构等价性

不同的社区共享相同的结构:

  • 组织结构 - 虽然团队的连接能力较弱,但团队的结构(经理,高级成员,新成员,初级成员)会在团队之间重复出现。

  • https://arxiv.org/pdf/1607.00653.pdf

为了将这两个原则融入我们的嵌入表示中,Node2Vec论文的作者提出了一种随机游走方法,结合广度优先采样来捕获同质性和深度优先采样以捕获结构等价性。

我们可以看到,节点(u)充当组内的中心(s1,s2,s3,s4),类似于s6是(s7,s5,s8,s9)的中心。我们通过BFS发现(s1,s2,s3,s4)社区,并通过DFS发现(u)< - >(s6)相似性。

我们通过探索周围环境来了解每个节点。这种探索将图形转换为由随机游走产生的大量序列(句子),其结合了BFS和DFS探索。BFS和DFS混合由图形边的权重以及模型的超参数控制。

一旦我们拥有完整的序列(句子),我们就可以像应用于文本一样应用Word2Vec方法。它产生的图形节点嵌入,是基于我们定义的原则以及图的知识。

Node2Vec属性

Node2Vec表示改进了用于节点的聚类和分类的模型。嵌入的学习相似性将有助于欺诈检测等任务。

由node2vec生成的LESMISérables共形网络的互补可视化,标签颜色反映了同质性(顶部)和结构等价性(底部)。 https://arxiv.org/pdf/1607.00653.pdfhttps://arxiv.org/pdf/1607.00653.pdf

Node2vec显示了连接预测方面的显著改进。它能够提高重建图形的能力,其中一些边被删除。本文还对连接预测评价过程进行了深入的探讨。 

知识图谱(Knowledge Graph)

下面我们将讨论PYTORCH-BIGGRAPH:一个大型图谱嵌入系统(PBG)。

知识图谱是特殊类型的图,它包含已知实体以及不同类型的边,它代表结构知识。

在知识图谱中,节点通过不同类型的关系连接。

https://arxiv.org/pdf/1503.00759.pdf


训练的目标是生成代表我们知识的嵌入表示。一旦我们有了节点的嵌入,就应该很容易通过特定的关系类型确定相应的节点是否在我们的知识图谱中有连接(或应该连接)。

不同的模型提出了比较嵌入矢量的不同方法。最简单的模型使用余弦或矢量乘积距离比较嵌入矢量。更复杂的模型在比较之前对矢量的元素应用不同的加权方案。加权方案表示为矩阵,具体到特定的关系类型。作为训练的一部分,我们可以学习加权矩阵。


https://www.sysml.cc/doc/2019/71.pdf


我们需要找到一种方法来测量边之间的相似性得分,并使用此分数来估计这些节点连接的可能性。

知识图谱的表示

知识图谱可以表示为邻接张量。为了构建它,我们将为每种类型的关系提供一个方阵。每个矩阵具有与图中的节点一样多的列或行。矩阵的值为1,这些节点中有1个是通过这种关系连接的,如果没有,则为0。很明显,这个矩阵将非常大,非常稀疏。 

要学习我们的嵌入表示,我们需要将每个节点转换为固定大小的向量。我们来讨论讨论“好”嵌入的属性。

好的嵌入代表了我们以图谱边的形式表达的知识。位于“附近”的嵌入向量应代表更可能连接的节点。基于这种观察,我们将以这样的方式训练我们的模型:在邻接张量中标记为1的连接节点的相似性得分将更高并且在邻接张量中标记为0的连接节点的相似性得分将更低。

https://arxiv.org/pdf/1503.00759.pdf

我们正在训练嵌入表示,以便从节点嵌入中重建知识图谱的边,同时最小化信息损失。

负采样

我们的训练方法有点问题。我们正在尝试使用图数据来区分1(节点已连接)和0(节点未连接)。然而,我们实际拥有的唯一数据是连接的节点。这就像通过只看猫来学习区分猫和狗。

负抽样是一种扩展我们的数据集并通过非常简单的观察提供更好的训练数据的技术。任何随机选择的节点(未作为图的一部分连接)将代表标签为0的样本数据。出于训练目的,PBG论文建议读取图的每个边,然后提出负样本,其中一个用随机选择的节点来替换。

对于每个边,我们可以指定正相似度得分和负相似度得分。基于节点嵌入和边关系类型权重计算正相似度。负相似度的计算方法相同,但边的一个节点被破坏,并被随机节点替换。

排序损失函数将在训练期间进行优化。它是为了在图中的所有节点和所有关系类型的正、负相似度之间建立一个可配置的边界。排序损失是节点嵌入和特定关系权重的函数,通过寻找最小排序损失来学习。 

训练

现在我们拥有训练嵌入模型所需的一切:

  • 数据 - 负边和正边

  • 标签 - (1或0)

  • 函数优化(可以是排序损失,更传统的逻辑回归损失或word2vec中使用的交叉熵softmax损失)

  • 我们的参数,即嵌入以及相似性得分函数的权重矩阵。

现在,使用微积分来找到参数 - 嵌入,优化我们的损失函数。

随机梯度下降

随机梯度下降的本质是逐渐调整损失函数的参数,使损失函数逐渐减小。为此,我们以小批量读取数据,使用每个批次来计算损失函数参数的更新以最小化它。

有多种方法可以进行随机梯度下降。PB论文使用ADAGrad,它是随机梯度下降的一种类型,可以找到参数从而最大限度地减少损失函数。我强烈推荐大家阅读这个博客了解所有梯度下降的类型:

http://ruder.io/optimizing-gradient-descent/index.html#adagrad

像tensorflow和pytorch这样的软件包提供了不同类型的实现。

梯度下降的关键因素是多次更新模型参数的过程,直到我们最小化损失函数。在训练结束时,我们希望拥有嵌入和评分功能,以满足我们的知识整合目标。

HogWild - 分布式随机梯度下降

随机梯度下降分布是一个挑战。如果我们通过调整参数来同时训练以最小化损失函数,则需要某种锁定(Locking)机制。在传统的多线程开发中,我们通过悲观或乐观方式来锁定更新期间的数据。锁定会减慢进度,但会确保结果的正确性。

幸运的是,hogwild论文证明我们不需要锁定机制。我们可以简单地批量读取数据,计算参数调整,只需将它们保存在共享参数空间中,而不考虑正确性。HogWild算法就是这样做的。可以分布式训练,每个HogWild线程都可以更新我们的参数,而无需考虑其他线程。

我推荐阅读这个博客来获取有关HogWild的更多信息:

https://medium.com/@krishna_srd/parallel-machine-learning-with-hogwild-f945ad7e48a4

分布式训练

当图跨越数十亿个节点和数万亿个边时,很难将所有参数都放在一台机器的内存中。如果我们在开始另一批次之前等待每批次结束完成计算,也需要花费很多时间。我们的图谱非常大,能够并行训练并同时学习参数是相当有用的。Facebook团队发布了PBG论文,解决了这个问题。

节点按实体类型拆分,然后组织成分区:

https://torchbiggraph.readthedocs.io/en/latest/data_model.html

https://torchbiggraph.readthedocs.io/en/latest/data_model.html

https://www.sysml.cc/doc/2019/71.pdf


  1. 节点被划分为P个部分,边被划分为PxP部分。具有小基数的实体类型不必进行分区。

  2. 训练与以下约束并行完成:

对于除第一个之外的每个边部分(p1; p2),重要的是在先前的迭代中训练边(p1; *)或(*; p2)。 
只要多个边部分在不相交的分区集上操作,就可以并行训练多个边部分。 

https://www.sysml.cc/doc/2019/71.pdf

在多台机器上并行进行训练,每台机器都有多个线程。每个线程根据分配的存储和批量数据计算参数更新。Locker服务器根据建立的约束分配训练。请注意,Locker服务器仅控制跨hogwild线程的数据批处理,而不控制参数更新。

PBG嵌入的特征

知识嵌入可以通过两种方式使用:

  • 连接预测 Link Prediction
    连接预测通过查找可能已连接或即将连接的节点来帮助填补我们的知识空白。 
    示例:该图表代表客户和客户购买的产品。边是定购单。嵌入可以用来形成下一个购买建议。

  • 学习节点的属性
    嵌入可以用作特征向量,作为各种分类模型的输入。学习的类可以填补我们关于对象属性的知识空白。

使用MRR / Hits10评估连接预测

该过程在论文“Learning Structured Embeddings of Knowledge Bases ”中有介绍,后来被用作衡量嵌入模型质量的方法,包括Facebook PBG在内的许多其他论文中。

该算法采用测试边的子集并执行以下操作:

  1. 通过用负采样边替换边的开头或结尾来破坏边

  2. 在部分损坏的数据集上训练模型

  3. 计算测试数据集边的聚合MRR和Hits10指标

Mean reciprocal rank

MRR或平均倒数排名是衡量搜索质量的指标。我们采用一个未损坏的节点,找到距离定义为相似度得分的“最近邻居”。我们通过相似性得分对最近邻居进行排名,并期望连接的节点出现在排名的顶部。如果节点没有在顶部,MRR会降低准确度分数。

替代指标是Hits10,我们期望损坏的节点出现在前10个最近邻居中。

https://www.sysml.cc/doc/2019/71.pdf

PBG论文表示,在我们将资源分配到训练中时,在许多数据集上,MRR指标逐渐增加。并行性不会影响排名的质量,但能节省大量时间。

可以通过简单地探索和可视化图来执行进一步的评估。

https://ai.facebook.com/blog/open-sourcing-pytorch-biggraph-for-faster-embeddings-of-extremely-large-graphs/


上图是从Freebase知识图谱构建的嵌入的二维投影。我们可以看到,类似的节点被组合在一起。国家,数字,科学期刊专业似乎甚至在精心准备的二维投影上也有集群。

知识图谱模型的局限性

如上所述的知识图谱仅表示我们知识的“静态快照”。它并不反映知识建立的过程。在现实世界中,我们通过观察时间模式来学习。虽然可以了解节点A和节点B之间的相似性,但很难看到节点A和节点C三年之前的相似性。

例如,如果我们在森林中观察一天,我们将看到两棵大型红杉树之间的相似性。然而,如果没有对森林的长期观察,很难理解哪棵树苗会长成一棵大的红杉树。

理想情况下,我们需要探索在不同时间点构建的一系列知识图谱,然后构建嵌入表示,这将增长的相似性(generational similarities)。


-END-

专 · 知

专知,专业可信的人工智能知识分发,让认知协作更快更好!欢迎登录www.zhuanzhi.ai,注册登录专知,获取更多AI知识资料!

欢迎微信扫一扫加入专知人工智能知识星球群,获取最新AI专业干货知识教程视频资料和与专家交流咨询!

请加专知小助手微信(扫一扫如下二维码添加),加入专知人工智能主题群,咨询技术商务合作~

专知《深度学习:算法到实战》课程全部完成!530+位同学在学习,现在报名,限时优惠!网易云课堂人工智能畅销榜首位!

点击“阅读原文”,了解报名专知《深度学习:算法到实战》课程

展开全文
Top
微信扫码咨询专知VIP会员