研究完TransE之后,继续研究了一下TransH、TransR、TransD算法,想搜搜相关代码比较一下,但搜索后发现,没有直接实现的python代码,大部分是基于TensorFlow,或者是C语言的。本来想着算了,后来想想还是写一篇关于TensorFlow,简单比较一下,记录一下自己的学习过程。
1 代码来源
本代码来源于github项目地址,项目基于TensorFlow框架,实现了TransE、TransH、TransR、TransD算法。TransE、TransH、TransR、TransD主要在距离计算上存在差异,其他基本相同。
2 TransE算法
TransE算法直接把首尾实体和关系用向量表示,通过三元关系的约束实现向量的优化,但是它并不能处理1-N,N-1, N-N的问题。因为如何H、R相同,那么按照TransE算法,T基本上是相同或相差不大的,这应会导致1-N中的N是近似,虽然实际上他们没什么关系。
// TransE算法
#实体对应的表示矩阵n*k,n表示实体个数,k为表示向量的维度,也是模型需要优化的参数
self.ent_embeddings = tf.compat.v1.get_variable(name="ent_embedding", shape=[self.entity_total, self.hidden_size],
initializer=tf.contrib.layers.xavier_initializer(uniform=False))
#关系对应的表示矩阵m*k,m表示关系个数,k为表示向量的维度,也是模型需要优化的参数
self.rel_embeddings = tf.compat.v1.get_variable(name="rel_embedding", shape=[self.relation_total, self.hidden_size],
initializer=tf.contrib.layers.xavier_initializer(uniform=False))
self.pos_h = tf.compat.v1.placeholder(tf.int32, [None]) #训练或预测输入,正样本H实体对应的ID
self.pos_t = tf.compat.v1.placeholder(tf.int32, [None]) #训练或预测输入,正样本T实体对应的ID
self.pos_r = tf.compat.v1.placeholder(tf.int32, [None]) #训练或预测输入,正样本R关系对应的ID
self.neg_h = tf.compat.v1.placeholder(tf.int32, [None]) #训练或预测输入,负样本H实体对应的ID
self.neg_t = tf.compat.v1.placeholder(tf.int32, [None]) #训练或预测输入,负样本T实体对应的ID
self.neg_r = tf.compat.v1.placeholder(tf.int32, [None]) #训练或预测输入,负样本R关系对应的ID
#根据ID,获取正负样本(h,t,r)对应的表示向量
pos_h_e = tf.nn.embedding_lookup(self.ent_embeddings, self.pos_h)
pos_t_e = tf.nn.embedding_lookup(self.ent_embeddings, self.pos_t)
pos_r_e = tf.nn.embedding_lookup(self.rel_embeddings, self.pos_r)
neg_h_e = tf.nn.embedding_lookup(self.ent_embeddings, self.neg_h)
neg_t_e = tf.nn.embedding_lookup(self.ent_embeddings, self.neg_t)
neg_r_e = tf.nn.embedding_lookup(self.rel_embeddings, self.neg_r)
#计算样本的三元距离
if self.L1_flag: #如果L1范数
pos = tf.reduce_sum(abs(pos_h_e + pos_r_e - pos_t_e), 1, keepdims=True)
neg = tf.reduce_sum(abs(neg_h_e + neg_r_e - neg_t_e), 1, keepdims=True)
self.predict = pos
else: #如果L2范数
pos = tf.reduce_sum((pos_h_e + pos_r_e - pos_t_e) ** 2, 1, keepdims=True)
neg = tf.reduce_sum((neg_h_e + neg_r_e - neg_t_e) ** 2, 1, keepdims

这篇博客详细介绍了基于TensorFlow实现的TransE、TransH、TransR和TransD算法,通过代码学习和分析,探讨了这些知识图谱表示学习算法的差异,尤其是如何解决1-N、N-1、N-N问题。
最低0.47元/天 解锁文章
1545

被折叠的 条评论
为什么被折叠?



