TransX算法详解【代码学习系列】【知识图谱】【表示学习】

这篇博客详细介绍了基于TensorFlow实现的TransE、TransH、TransR和TransD算法,通过代码学习和分析,探讨了这些知识图谱表示学习算法的差异,尤其是如何解决1-N、N-1、N-N问题。
摘要由CSDN通过智能技术生成

研究完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
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>