TransR 论文阅读 19年记录的

论文题目

Learning Entity and Relation Embeddings for Knowledge Graph Completion——AAAI2015

论文链接

https://www.aaai.org/ocs/index.php/AAAI/AAAI15/paper/view/9571/9523https://www.aaai.org/ocs/index.php/AAAI/AAAI15/paper/view/9571/9523

文章背景:    

    近年来,一些模型像TransE和TransH通过把关系作为从head实体到tail实体的翻译来建立实体和关系嵌入。这些模型仅仅简单地假设实体和关系处于相同的语义空间。事实上,一个实体是多种属性的综合体,不同关系关注实体的不同属性,仅仅在同一个空间下对它们进行建模是不够的。

解决问题:      

  TransE和TransH都假设实体和关系嵌入在相同的空间Rk中。然而,一个实体是多种属性的综合体,不同关系关注实体的不同属性。直觉上一些相似的实体在实体空间中应该彼此靠近,但是同样地,在一些特定的不同的实体在对应的关系空间中应该彼此远离。

创新点:      

为了解决这个问题,提出了一种新的方法,将实体和关系投影到不同的空间中,也就是实体空间和多元关系空间(也即是特定关系的实体空间),在对应的关系空间上实现翻译。    

解决方案:      

提出了TransR,分别在实体空间和关系空间构建实体和关系嵌入。然后,学习嵌入,首先将实体投影到对应的关系空间中,然后在建立从头实体到尾实体的翻译关系,在对应的关系空间上实现翻译。

以及通过将不同的头尾实体对聚类成组来扩展TransR,并为每个组学习不同的关系向量,称为基于聚类的TransR(C-TransR)。

 1. transR:      

 基本思想如图所示。对于每个元组(h,r,t),首先将实体空间中的实体通过映射矩阵Mr(每个关系都会构建一个Mr)向关系r投影得到hr和tr,然后使hr+r≈tr。特定的关系投影(彩色的圆圈表示)能够使得头/尾实体在这个关系下真实的靠近彼此,使得不具有此关系(彩色的三角形表示)的实体彼此远离。

 

对每个元组(h,t,r),实体嵌入设置为 关系嵌入设置为 对每个关系,构建映射矩阵Mr:

利用映射矩阵,将实体的投影向量定义为

分数函数: 

2. CTransR:

此外,在一个特定的关系下,头-尾实体对通常展示出不同的模型。仅仅通过单个的关系向量还不足以建立实现从头实体到尾实体的所有翻译。例如,具有关系“location location contains”头-尾实体有很多模式,如country-city,country-university,continent-country等等。沿着分段线性回归的思想,通过对不同的头-尾实体对聚类分组和学习每组的关系向量,进一步提出了基于聚类的TransR(CTransR)。

做法:

(1)对于一个特定的关系r,训练数据中的所有实体对(h,t)被聚为多个组,并且每个组中的实体对被期望呈现相似的r关系。

(2)所有实体对(h,t)用它们的向量偏移量(h-t)表示,以便进行聚类,其中h和t用TransE表示。

(3)分别为每个簇和每个关系分别学习了一个独立的关系向量rc和矩阵Mr。

(4)                                                         

   确保聚类特定关系向量rc离原始关系向量r不太远。 

训练目标

 总结与思考:

本文提出了一种新的知识图嵌入模型TransR。TransR将实体和关系嵌入在不同的实体空间和关系空间中,并通过投影实体之间的翻译来学习嵌入。此外,还提出了基于分段线性回归思想的CTransR,其目的是对每种关系类型内的内部复杂相关性进行建模。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值