TransR: 实体和关系分开嵌入(Learning Entity and Relation Embeddings for Knowledge Graph Completion)
问题:一个实体是多种属性的综合体,不同关系关注实体的不同属性。直觉上一些相似的实体在实体空间中应该彼此靠近,但是同样地,在一些特定的不同的方面在对应的关系空间中应该彼此远离。
方案:将实体和关系嵌入到不同的空间中,在对应的关系空间中实现翻译。
损失函数
训练集的格式
杭州,中国,省会
重庆,中国,省会
台湾,中国,省会
加州,美国,省会
杭州电子科技大学,杭州,大学
浙江大学,杭州,大学
北京大学,北京,大学
复旦大学,上海,大学
磁器口,重庆,景点
西湖,杭州,景点
故宫,北京,景点
头实体字典构造
{'unk': 0, '台湾': 3, '西湖': 10, '加州': 4, '北京大学': 7, '故宫': 11, '磁器口': 9, '复旦大学': 8, '重庆': 2, '杭州电子科技大学': 5, '杭州': 1, '浙江大学': 6}
尾实体字典构造
{'重庆': 6, '美国': 2, '中国': 1, '杭州': 3, '北京': 4, 'unk': 0, '上海': 5}
关系字典构造:
{'景点': 3, '省会': 1, '大学': 2, 'unk': 0}
data -> id
[[[1], [1], [1]],
[[2], [1], [1]],
[[3], [1], [1]],
[[4], [2], [1]],
[[5], [3], [2]],
[[6], [3], [2]],
[[7], [4], [2]],
[[8], [5], [2]],
[[9], [6], [3]],
[[10], [3], [3]],
[[11], [4], [3]]]
关键程序代码:
def __trans(self):
with tf.variable_scope("trans") as scope:
self.Mr = tf.get_variable(
name="Mr",
shape=[self.size_of_entity, self.size_of_relation]
) #Mr矩阵的大小[实体维度的大小,关系维度的大小]
self.head = tf.reshape(self.head, shape=[-1, self.size_of_entity])
self.tail = tf.reshape(self.tail, shape=[-1, self.size_of_entity])
self.relation = tf.reshape(self.relation, shape=[-1, self.size_of_relation])
self.hr = tf.matmul(self.head, self.Mr)
self.tr = tf.matmul(self.tail, self.Mr)
self.r = self.relation
fr = self.hr + self.r - self.tr
self.logits = tf.reduce_sum(fr * fr, axis=1)
self.loss = tf.reduce_sum(self.logits)