OpenKE 的使用(二)— TransX 系列论文复现

OpenKE 的使用(二)— TransX 系列论文复现


前言: 之前踩了VM中ubuntu不能使用Nvidia驱动的坑,于是我在安装好Windows+Ubuntu双系统,并在Ubuntu 20.04子系统中配置好深度学习环境后,终于得以成功使用OpenKEKGE模型进行复现,本篇主要是关于TransX系列模型的实现,如下是我实验的环境,论文原文,我对论文的理解和OpenKE的GitHub地址

Environment: 联想R7000P,Ubuntu 20.04(子系统),Pytorch,cuda 11.5,cuDNN,OpenKE

Paper: TransHTransRTransD

Paper Understanding:TransX 系列,知识图谱嵌入(KGE)论文阅读

Download from Github:

git clone -b OpenKE-PyTorch https://github.com/thunlp/OpenKE

说明: git clone -b OpenKE-PyTorch https://github.com/thunlp/OpenKE命令如果执行出错,可以参考OpenKE 的初步探索(VM 中的 Ubuntu 踩坑)准备工作:VM 中 Ubuntu 20.04 系统 git 的配置及与 github 的连接部分,虽然是在VM中Ubuntu系统中的配置,但是原理和操作都是一样的


OpenKE中各种模型的统一评价指标:
在这里插入图片描述


TransH

数据集:FB15K237

手动复制examples文件夹中的train_transh_FB15K237.py到OpenKE目录下,并在此处打开终端

使用的命令如下:

python train_transh_FB15K237.py

在这里插入图片描述


TransR

数据集:FB15K237

手动复制examples文件夹中的train_transr_FB15K237.py到OpenKE目录下,并在此处打开终端

使用的命令如下:

python train_transr_FB15K237.py

报错:FileNotFoundError: [Errno 2] No such file or directory: './result/transr_transe.json'

在这里插入图片描述
解决:在 OpenKE 目录下建立 result 文件夹:

在这里插入图片描述
重新运行,报错,应该是显存不够用:

RuntimeError: CUDA out of memory. Tried to allocate 10.54 GiB (GPU 0; 5.80 GiB total capacity; 234.79 MiB already allocated; 4.64 GiB free; 286.00 MiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation.  See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF

在这里插入图片描述解决:在网上找了许多方法,最后更改nbatches的大小,我将其值从100逐渐调整到900(800-900之间应该刚好可以,再小估计不行),最终才跑出来结果
在这里插入图片描述
在这里插入图片描述


TransD

数据集:FB15K237

手动复制examples文件夹中的train_transd_FB15K237.py到OpenKE目录下,并在此处打开终端

使用的命令如下:

python train_transd_FB15K237.py

把TransD的模型也跑一下吧,万一以后用到,日后若有缘,可以研究一下此模型的对抗攻击

在这里插入图片描述

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来定义优化器。在前向传播过程中,通过计算投影向量和距离来判断是否满足三元组,正则化过程则通过计算实体和关系向量的平方和来进行约束。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白白净净吃了没病

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值