TransR的实体链接代码解析

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)

TransR算法是一种用于知识图谱表示学习的算法,它是在TransE算法的基础上发展而来的,通过引入关系空间嵌入来解决TransE算法中的限制性问题。 在TransE算法中,每个实体和关系都用一个低维向量来表示,但是这种表示方式存在一定的限制:同一关系下的不同实体之间的向量是相同的,这会导致实体的向量表示可能被关系的限制所束缚。为了解决这个问题,TransR算法将实体和关系分别嵌入到不同的空间中,并通过定义一个投影矩阵来将实体实体空间投影到关系空间中,从而避免了TransE算法中的限制性问题。 具体来说,TransR算法的流程如下: 1. 将实体和关系分别嵌入到实体空间和关系空间中,并定义一个投影矩阵将实体实体空间投影到关系空间中。 2. 对于每个三元组$(h,r,t)$,计算$h$和$r$的投影向量,然后通过计算$t$与$h$和$r$的投影向量之间的距离来判断是否满足该三元组。 3. 使用负例采样来训练模型,并通过最小化损失函数来优化模型参数。 下面是TransR算法的官方代码: ```python class TransR(KnowledgeGraphEmbedding): def __init__(self, model_params): super(TransR, self).__init__(model_params) self.ent_embeddings = nn.Embedding(self.ent_total, self.ent_dim) self.rel_embeddings = nn.Embedding(self.rel_total, self.rel_dim) self.projection = nn.Embedding(self.rel_total, self.ent_dim * self.rel_dim) nn.init.xavier_uniform_(self.ent_embeddings.weight.data) nn.init.xavier_uniform_(self.rel_embeddings.weight.data) nn.init.xavier_uniform_(self.projection.weight.data) self.criterion = nn.MarginRankingLoss(self.margin, reduction='sum') self.optimizer = optim.Adam(self.parameters(), lr=self.learning_rate) def _calc(self, h, t, r): h_e = self.ent_embeddings(h) t_e = self.ent_embeddings(t) r_e = self.rel_embeddings(r) M_r = self.projection(r).view(-1, self.ent_dim, self.rel_dim) h_e = torch.mm(h_e, M_r).view(-1, self.rel_dim) t_e = torch.mm(t_e, M_r).view(-1, self.rel_dim) return h_e, t_e, r_e def forward(self, pos_h, pos_t, pos_r, neg_h, neg_t, neg_r): pos_h_e, pos_t_e, pos_r_e = self._calc(pos_h, pos_t, pos_r) neg_h_e, neg_t_e, neg_r_e = self._calc(neg_h, neg_t, neg_r) pos = torch.sum((pos_h_e + pos_r_e - pos_t_e) ** 2, dim=1, keepdim=True) neg = torch.sum((neg_h_e + neg_r_e - neg_t_e) ** 2, dim=1, keepdim=True) return pos, neg def predict(self, h, t, r): h_e = self.ent_embeddings(h) t_e = self.ent_embeddings(t) r_e = self.rel_embeddings(r) M_r = self.projection(r).view(-1, self.ent_dim, self.rel_dim) h_e = torch.mm(h_e, M_r).view(-1, self.rel_dim) t_e = torch.mm(t_e, M_r).view(-1, self.rel_dim) return torch.sum((h_e + r_e - t_e) ** 2, dim=1, keepdim=True) def regul(self, h, t, r): h_e = self.ent_embeddings(h) t_e = self.ent_embeddings(t) r_e = self.rel_embeddings(r) M_r = self.projection(r).view(-1, self.ent_dim, self.rel_dim) h_e = torch.mm(h_e, M_r).view(-1, self.rel_dim) t_e = torch.mm(t_e, M_r).view(-1, self.rel_dim) pos = torch.sum(h_e ** 2) + torch.sum(t_e ** 2) + torch.sum(r_e ** 2) neg = torch.sum(self.projection.weight ** 2) return pos, neg def forward2(self, h, t, r, M_r): h_e = self.ent_embeddings(h) t_e = self.ent_embeddings(t) r_e = self.rel_embeddings(r) h_e = torch.mm(h_e, M_r).view(-1, self.rel_dim) t_e = torch.mm(t_e, M_r).view(-1, self.rel_dim) return torch.sum((h_e + r_e - t_e) ** 2, dim=1, keepdim=True) ``` 这段代码实现了TransR算法的前向传播过程、预测过程和正则化过程,其中使用torch.nn中的Embedding层来定义实体和关系的嵌入向量以及投影矩阵,使用torch.nn中的MarginRankingLoss来定义损失函数,使用torch.optim中的Adam来定义优化器。在前向传播过程中,通过计算投影向量和距离来判断是否满足三元组,正则化过程则通过计算实体和关系向量的平方和来进行约束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值