TransR

目录

一、summary

二、method

三、experiment

1.Dataset

2.link predition

3.triple classification

总结


一、summary

TransE和TransH简单地将实体和关系映射到相同语义空间, 但是不同的关系关注实体的不同方面,不能简单地在一个公共空间进行建模。故提出了TransR将实体和关系嵌入建立在分离的实体空间和关系空间。基于分段线性回归思想提出了CTransR,聚类不同头尾实体对一个集合到中并且为每一个集合学习不同的关系向量。

二、method

 

对于(h,r,t),实体嵌入到实体空间,关系嵌入到关系空间,对每个关系r,设置映射矩阵\small M_r将实体从实体空间映射到关系空间

 CTransR:对于特定关系r,基于实体偏移量h-t进行聚类,对每个关系的每个聚类分别学习\small r_c\small M_r

\small \alpha控制\small r_c\small r距离不太远。

三、experiment

1.Dataset

2.link predition

 

3.triple classification

总结

TransR将实体和关系分别嵌入到实体空间和关系空间中,通过矩阵投影实现表示。CTransR基于分段线性回归对每种关系类型内部的复杂相关性进行建模。

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、付费专栏及课程。

余额充值