trans系列模型

1…trans系列模型
模型比较
必看(以下模型描述均摘自此篇文章)

2.transE Translating Embeddings for Modeling Multi-relational Data

link
transE假设关系是向量而不是距离
TransE的直观含义,就是TransE基于实体和关系的分布式向量表示,将每个三元组实例(head,relation,tail)中的关系relation看做从实体head到实体tail的翻译。
在这里插入图片描述

直观上,我们要前面的项(原三元组)变小(positive),后面的项(打碎的三元组)变大(negative)。就跟喂小狗一样,它做对了,就给骨头吃;做错了,就打两下。前面的项是对的(来自于训练集),后面的项是错的(我们随机生成的)。不同时打碎主体和客体,随机挑选一个打碎,另一个保持不变,这样才能够有对照性。

transE也是如此(SVM是这样),我们尽可能将对的和错的分开。

3.transH translating on hyperplanes(超平面)

对知识库中的实体关系建模,特别是一对多,多对一,多对多的关系。设计更好的建立负类的办法用于训练。( TransE 对复杂关系建模不好,假定我们存在多个关系三元组,其中关系和尾实体都是固定不变的,而头实体对应多个,这就是N-1的关系,那么根据 TransE 的思想(上图a)建模,多个头实体将会得到非常相近的向量表示,可能近乎为统一含义,这对于不同业务下的不同场景是不合理的。)

transH 的动机就是解决这种复杂关系,那么它具体是怎么解决的呢?

在这里插入图片描述
TransH 的核心思想是对于关系每一个 r,有一个超平面 Wr 和一个关系向 dr表示,而不是和实体在同一个嵌入空间。具体来说,在每个三元组中,将头实体 h 和尾实体 t 都映射到这个超平面上得到向量h⊥和t⊥,训练使 h⊥+dr ≈ t⊥。目的是为了能够使得同一个实体在不同关系中有不同的意义,因为不同的关系有不同的法平面。

回到我们上面的N-1的复杂关系问题,对于三元组(h, r, t)和(h1, r, t),根据 TransE 的思想, h1 = h。而 对于TransH 来说,只需要满足 h 和 h1 在关系 r 的超平面上的投影相同就行啦,这样就可以区分出 h 和 h1,两个的向量表示是不同的。

TransH 的头尾实体映射的向量计算以及损失函数。
在这里插入图片描述
4.transR R 代表的是 Relation Space
TransE 和TransR 虽然多取得了很大的进步,但是他们实体和关系都是映射在同一语义空间中,然而实体包含多种属性,不同的关系对应不同的实体属性,因此,在实体空间中,有些实体是相似的,因而彼此接近,但某些特定实体属性却有相当大的不同,因而在相关的关系空间中彼此相距甚远,TransR 的提出缘起于此。

所谓 TransR 是指将实体和关系映射到不同的语义空间,并且关系不再是单一的,而是多个关系空间,头尾实体的翻译也是在相应的关系空间中完成。这个 R 代表的是 Relation Space

在这里插入图片描述
对于每一个三元组(h, r, t),将头尾实体表示在实体空间,将关系表示在关系空间,并且,对于每一个关系 r,存在一个映射矩阵Mr,通过这个矩阵将 h, t 映射到关系 r 所在空间,得到 hr 和 tr,使 hr + r = tr。在这种关系的作用下,具有这种关系的头/尾实体彼此接近(彩色的圆圈),不具有此关系(彩色的三角形)的实体彼此远离。
在这里插入图片描述
6.TransD D 代表的是 dynamic mapping matrix
TransD 方法的提出是在 TransR 的基础之上,虽然 TransR 相对于前两种方法有显著的效果,但是也存在明显的缺点,如下:

(1) 在同一关系 r 下, 头尾实体共用相同的投影矩阵,然而,一个关系的头尾实体存在很大的差异,例如(美国,总统,奥巴马),美国是一个实体,代表国家,奥巴马是一个实体,代表的是人物。

(2) TransR 仅仅让给投影矩阵与关系有关是不合理的,因为投影矩阵是头尾实体与关系的交互过程,应该与实体和关系都相关。

(3) TransR 模型的参数急剧增加,计算的时间复杂度大大提高。
在这里插入图片描述
TransD 的模型思想,给定一个三元组(h, r, t),TransD 将头尾实体分别投影到关系空间得到投影矩阵 Mrh 和 Mrt ,这样得到的投影矩阵便与实体和关系都有关系。获取投影矩阵之后,和 TransR 一样,计算头尾实体的投影向量。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
6.TransA TransA: An Adaptive Approach for Knowledge Graph Embedding 。
TransA模型认为前述的模型都存在以下两个问题,(1) 损失函数中的距离度量太过简单,不具备灵活性(2)由于损失函数过于简单,实体和关系向量的每一维都等同对待,但是不同维度的重要度不一样,有些维度效果好,有些维度可能是噪音。

实点表示正确匹配,空心点表示错误匹配,箭头表示某种关系(HasPart),我们来看一个例子,在图(a)中采用欧式距离得到的结果中有一个三元组(Sleeping,HasPart, Appliance),但是它是错误的,正确的三元组是(Sleeping,HasPart, Dreaming)。TransA 为了不等同对待向量的每一维,对向量维度加权,赋予不同的权重,在图(b)中对 xy 轴进行了拆解,对 y 轴加权,对 x轴降权,这样x轴就有一个较小的loss,会向正确的三元组方向学习。
在这里插入图片描述
7.TransG TransG : A Generative Mixture Model for Knowledge Graph Embedding。
TransD 模型的提出是为了解决关系的多种语义问题,和上面的 TransR 解决的问题类似,一种关系可能存在多种语义表达。

TransG认为既然一种关系存在多种语义表达,那么将每种语义采用高斯分布来刻画。具体的公式定义如下,Mr代表的是潜在语义关系数量
在这里插入图片描述
在这里插入图片描述
8.TranSparse Knowledge Graph Completion with Adaptive Sparse Transfer Matrix。

实体库中实体和关系的 异质性(heterogeneous) 和 不平衡性(unbalanced) 是知识表示学习的两个难题。
异质性(heterogeneous):关系链接实体的数量不一致,有的很多,有的很少。
不平衡性(unbalanced):某些关系头尾实体的种类和数量可能差别巨大。

TranSparse 模型是在 TransR 的模型基础之上,采用稀疏矩阵代替了 TransR 中的稠密矩阵,因为采用稀疏矩阵 Mr,所以命名为 TranSparse,针对异质性问题提出TranSparse(share),针对不平衡性提出 TranSparse(separate)

TranSparse(share):对于每一个关系,有翻译向量 r 和稀疏矩阵 Mr,稀疏矩阵的稀疏度由关系链接的实体对数量决定,稀疏度 θr 的定义如下,其中 Nr 表示关系链接的实体对的数量,Nr* 表示最大实体对的数量(关系链接最多的实体对),θmin 为稀疏度超参数,取值在 [0, 1] 之间,根据下面的公式(2)可以得到头尾实体的投影矩阵。
在这里插入图片描述
在这里插入图片描述
TranSparse(separate):对于每一个关系,设置两个投影矩阵,分别为头实体 Mrh 和尾实体 Mrt,两者的稀疏度 θrl 和上面的有所改动,具体如下,其中 Nrl 表示关系 r 在位置 l 处链接的实体的数量,Nr*l 表示 Nrl 中最大的数,θmin 为稀疏度超参数,取值在 [0, 1] 之间,根据下面的公式(4)可以得到头尾实体的投影矩阵。
在这里插入图片描述
以上两个方法的损失函数均为如下定义:
在这里插入图片描述
9.8.KG2E Learning to Represent Knowledge Graphs with Gaussian Embedding。

以前的方法都是将实体和关系嵌入到点向量空间中,这些模型总是以同样的方式看待所有的实体和关系,而作者认为实体库中的实体和关系本身就就存在不确定性,以前的方法模型忽略了这一不确定性。

KG2E,与以往不同的是不再采用点空间,而是基于密度,采用高斯分布表示实体和关系,其中均值表示其所处的中心位置,而协方差可以恰当的表示其不确定度

KG2E使用 h-t 表示头尾实体之间的关系,实体可以用一个概率分布表示,如下:
在这里插入图片描述
关系 r 也同样是一个高斯分布:
在这里插入图片描述
KG2E考虑了两种计算概率相似度的方法:KL-距离(KL-divergence)和期望概率(expected likelihood)。
KL距离是一种不对称相似度,得分函数定义如下:
在这里插入图片描述
期望概率是一种对称相似度,得分函数如下:
在这里插入图片描述

首先,需要安装TransE、TransH、TransR、TransD等知识图谱嵌入模型的Python包,可以使用pip install命令安装相应的包。 以下是TransE知识图谱嵌入模型的Python实现代码: ```python import numpy as np import tensorflow as tf class TransE: def __init__(self, entity_num, relation_num, dim, margin, learning_rate): self.entity_num = entity_num self.relation_num = relation_num self.dim = dim self.margin = margin self.learning_rate = learning_rate self.ent_embeddings = tf.get_variable(name="ent_embeddings", shape=[self.entity_num, self.dim], initializer=tf.contrib.layers.xavier_initializer(uniform=False)) self.rel_embeddings = tf.get_variable(name="rel_embeddings", shape=[self.relation_num, self.dim], initializer=tf.contrib.layers.xavier_initializer(uniform=False)) self.ent_input = tf.placeholder(dtype=tf.int32, shape=[None]) self.rel_input = tf.placeholder(dtype=tf.int32, shape=[None]) self.ent_output = tf.placeholder(dtype=tf.int32, shape=[None]) self.pos_h = tf.nn.embedding_lookup(self.ent_embeddings, self.ent_input) self.pos_t = tf.nn.embedding_lookup(self.ent_embeddings, self.ent_output) self.pos_r = tf.nn.embedding_lookup(self.rel_embeddings, self.rel_input) self.neg_h = tf.placeholder(dtype=tf.int32, shape=[None]) self.neg_t = tf.placeholder(dtype=tf.int32, shape=[None]) self.neg_pos_h = tf.nn.embedding_lookup(self.ent_embeddings, self.neg_h) self.neg_pos_t = tf.nn.embedding_lookup(self.ent_embeddings, self.neg_t) self.predict = tf.reduce_sum(tf.abs(self.pos_h + self.pos_r - self.pos_t), axis=1, keepdims=True) self.loss = tf.reduce_sum(tf.maximum(self.predict - tf.reduce_sum(tf.abs(self.neg_pos_h + self.pos_r - self.pos_t), axis=1, keepdims=True) + self.margin, 0)) self.train_op = tf.train.GradientDescentOptimizer(self.learning_rate).minimize(self.loss) self.sess = tf.Session() self.sess.run(tf.global_variables_initializer()) def train(self, batch_h, batch_t, batch_r, batch_nh, batch_nt): _, loss = self.sess.run([self.train_op, self.loss], feed_dict={ self.ent_input: batch_h, self.rel_input: batch_r, self.ent_output: batch_t, self.neg_h: batch_nh, self.neg_t: batch_nt }) return loss def test(self, h, t, r): return self.sess.run(self.predict, feed_dict={ self.ent_input: h, self.rel_input: r, self.ent_output: t }) ``` 其中,entity_num表示实体的数量,relation_num表示关系的数量,dim表示嵌入维度,margin表示损失函数中的边际值,learning_rate表示学习率。 TransE模型中的实体和关系都被嵌入到dim维空间中,损失函数通过最小化正样本和负样本之间的距离来学习嵌入向量。 batch_h、batch_t和batch_r分别表示一批训练数据中的头实体、尾实体和关系,batch_nh和batch_nt分别表示一批负样本中的头实体和尾实体。 使用以下代码可以创建一个TransE模型的实例并进行训练: ```python model = TransE(entity_num, relation_num, dim, margin, learning_rate) for epoch in range(num_epochs): for i in range(num_batches): batch_h, batch_t, batch_r, batch_nh, batch_nt = generate_batch(batch_size) loss = model.train(batch_h, batch_t, batch_r, batch_nh, batch_nt) print("Epoch:", epoch, "Loss:", loss) ``` 其中,generate_batch函数用于生成一个batch的训练数据和负样本。训练过程中,每个epoch会迭代num_batches次,每次迭代使用一个batch的数据进行训练。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值