知识图谱嵌入模型
在PyKEEN中,知识图谱嵌入模型的基础类是pykeen.models.ERModel。
它将实体和关系表示与交互函数结合起来。 在非常高的层次上,三元组分数是通过首先提取与头实体、尾实体和关系(作为整数索引给出)相对应的表示,然后使用交互函数从中计算出一个标量分数来获得的。
本教程对这些组件进行了高层次的概述,并解释了如何扩展和修改它们。
表示
一个pykeen.nn.representation.Representation模块提供了一种方法来获取给定整数索引的表示,例如向量。这些索引可能对应于实体或关系索引。通过向参数提供适当的输入来选择表示。
entity_representations / entity_representations_kwargs 用于实体表示,或
relation_representations / relation_representations_kwargs 用于关系表示。
这些输入随后用于通过pykeen.nn.representation_resolver.make_many()实例化表示。请注意,模型类pykeen.models.ERModel负责将max_id参数填充到…_kwargs中。默认情况下,使用单个pykeen.nn.Embedding来表示实体和关系,这在许多出版物中都有所体现。
以下示例适用于实体表示,但同样可以用于关系表示。
一个单一的
pykeen.nn.Embedding,维度为64,适用于例如pykeen.nn.TransEInteraction或pykeen.nn.DistMultInteraction等交互。model = ERModel( # the default: # entity_representations=None, # equivalent to # entity_representations=[None], # equivalent to # entity_representations=[pykeen.nn.Embedding], entity_representations_kwargs=dict(shape=64), ..., )
两个具有相同维度64的
pykeen.nn.Embedding,适用于例如pykeen.nn.BoxEInteraction等交互model = ERModel( entity_representations=[None, None], # note: ClassResolver.make_many supports "broad-casting" kwargs entity_representations_kwargs=dict(shape=64), # equivalent: # entity_representations_kwargs=[dict(shape=64), dict(shape=64)], ..., )
注意
如果您不确定选择实体表示的方式,请查看pykeen.nn.Representation的子类。
注意
在内部,使用了class_resolver库来支持各种替代参数化,例如,表示类的字符串名称、class对象或pykeen.nn.Representation类的实例。您还可以将自己的类注册到解析器中。详细信息可以在包的文档或使用解析器中找到。
交互功能
交互函数从头、关系和尾表示中计算标量分数。 这些分数可以解释为三元组的合理性,即分数越高,三元组越合理。 因此,好的模型应该为真实的三元组输出高分,为虚假的三元组输出低分。
在 PyKEEN 中,交互是通过 pykeen.nn.Interaction 的子类提供的,它是一个
torch.nn.Module,也就是说,它可以持有额外的(可训练的)参数,并且也可以在 PyKEEN 之外使用。
它的核心方法是 pykeen.nn.Interaction.forward(),该方法接收头、关系和尾表示的批次,并计算相应的三元组分数。
与表示形式一样,传递给pykeen.models.ERModel的交互被解析,这次使用
pykeen.nn.interaction_resolver.make()。因此,我们可以提供例如对应于交互
函数的字符串,而不是实例化的类。更多信息可以在使用解析器中找到。
注意
交互函数可能需要不同数量或形状的实体和关系表示。可以通过pykeen.nn.Interaction.entity_shape和pykeen.nn.Interaction.relation_shape访问预期的表示数量及其形状的符号描述。