知识图谱表示 | TransE原理简介与代码解读
表示学习-TransE
原理介绍
核心理念
在平面直角坐标系中,向量表示三元组知识(h,r,t)(h,r,t)(h,r,t)。其中hhh表示的是头实体的向量表示;rrr表示的是关系的向量表示;ttt指代的是尾实体的向量表示,如果三元组(h,r,t)(h,r,t)(h,r,t)在向量空间中满足下图关系:
当我们通过如上图的形式表示三元组时,可以从两个方面对已有知识图谱中的知识做处理:
- 使用词向量对知识图谱已经有的三元组进行表示;
- 对可能潜在的三元组关系进行预测,即在使用词向量表示当前知识图谱的基础上,预测潜在的三元组;
主要流程
TransE的主要方法流程为:
知识图谱(KG)中现存的关系构成关系集,实体构成实体集,模型抽取两个集合来构成三元组。
按照h+r≈th+r\approx th+r≈t规则做向量运算。
如果近似达到要求,则可以在两个实体间建立联系来补充完善知识图谱,通过这样的方法挖掘、发现实体间的关系,扩大知识网络,实现连接预测。
得分函数
表示学习中,得分函数是比较重要的一部分,TransE的得分函数为:
f(h,r,t)=∣∣h+r−t∣∣L1/L2f(h,r,t) = ||h+r-t||_{L1/L2}f(h,r,t)=∣∣h+r−t∣∣L1/L2
代码实现
本实验使用的OpenKE库来实现,这里对OpenKE中TransE代码进行解读。
OpenKE包clone
git clone -b OpenKE-PyTorch https://github.com/thunlp/OpenKE
通过git下载OpenKE的github仓库。
TransE代码解读
TransE以及其他多种知识表示模型的模型结构都是存储在 OpenKE/openke/module/model 路径下。
TransE initialize部分
该部分是根据TransE算法,初始化知识图谱的实体集和关系集。
对应代码为:
def __init__(self, ent_tot, rel_tot, dim = 100, p_norm = 1, norm_flag = True, margin = None, epsilon = None):super(TransE, self).__init__(ent_tot, rel_tot)# 初始化一些基本参数self.dim = dim # 深度self.margin = margin # 边缘self.epsilon = epsilonself.norm_flag = norm_flag #正则化标签self.p_norm = p_norm# 初始化实体和关系的embedding参数self.ent_embeddings = nn.Embedding(self.ent_tot, self.dim)self.rel_embeddings = nn.Embedding(self.rel_tot, self.dim)# 如果margin/epsilon为None,则随机初始化为权重值,否则根据算法更新实体、关系的embeddingif margin == None or epsilon == None:nn.init.xavier_uniform_(self.ent_embeddings.weight.data)nn.init.xavier_uniform_(self.rel_embeddings.weight.data)else:self.embedding_range = nn.Parameter(torch.Tensor([(self.margin + self.epsilon) / self.dim]), requires_grad=False)nn.init.uniform_(tensor = self.ent_embeddings.weight.data, a = -self.embedding_range.item(), b = self.embedding_range.item())nn.init.uniform_(tensor = self.rel_embeddings.weight.data, a= -self.embedding_range.item(), b= self.embedding_range.item())if margin != None:self.margin = nn.Parameter(torch.Tensor([margin]))self.margin.requires_grad = Falseself.margin_flag = Trueelse:self.margin_flag = False
TransE 评分函数
OpenKE代码实现的评分函数,在论文上基础上实现了L1/L2范式的一个选择在里面。
def _calc(self, h, t, r, mode):# 如果norm_flag为True,则计算机h、r、t的L2范数if self.norm_flag:h = F.normalize(h, 2, -1)r = F.normalize(r, 2, -1)t = F.normalize(t, 2, -1)# 如果mode不是正则化mode,则将向量复原if mode != 'normal':h = h.view(-1, r.shape[0], h.shape[-1])t = t.view(-1, r.shape[0], t.shape[-1])r = r.view(-1, r.shape[0], r.shape[-1])# 根据是不是首次进入batch,不懂得score计算if mode == 'head_batch':score = h + (r - t)else:score = (h + r) - t# 按需求维度将score展开score = torch.norm(score, self.p_norm, -1).flatten()return score
TransE训练步骤
TransE的反向传播流程主要是:获取embedding、计算评分函数、返回分数。
def forward(self, data):# 获取当前batch的数据三元组batch_h = data['batch_h']batch_t = data['batch_t']batch_r = data['batch_r']mode = data['mode']# 就batch转化为矩阵以便计算h = self.ent_embeddings(batch_h)t = self.ent_embeddings(batch_t)r = self.rel_embeddings(batch_r)# 计算评分函数score = self._calc(h ,t, r, mode)if self.margin_flag:return self.margin - scoreelse:return score
TransE预测
预测就是调用forward函数实现,并计算分数返回结果。
def predict(self, data):score = self.forward(data)if self.margin_flag:score = self.margin - scorereturn score.cpu().data.numpy()else:return score.cpu().data.numpy()
参考博客与文献
[1] https://angxiao.blog.csdn.net/article/details/122223457
[2] https://zhuanlan.zhihu.com/p/508508180
[3] https://blog.csdn.net/minggelin1997/article/details/109024359
/article/details/122223457
[2] https://zhuanlan.zhihu.com/p/508508180
[3] https://blog.csdn.net/minggelin1997/article/details/109024359
[4] TransE paper
知识图谱表示 | TransE原理简介与代码解读相关推荐
- 知识图谱——TransH模型原理
知识图谱--TransH模型原理 1 从TransE到TransH模型 在之前的文章知识图谱--TransE模型原理中,我们介绍了TransE模型的基本原理,对于TransE模型而言,其核心思想为: ...
- 【python】psnr原理简介及代码实现
写在前面 psnr作为图像质量评价指标,在很多图像领域如图像超分辨率.图像压缩.图像去噪等都有广泛的应用. PSNR(峰值信噪比) 简介 Peak signal-to-noise ratio(简称PS ...
- 【论文笔记】 知识图谱 之 TransE算法(Translating Embedding)
最近对知识图谱比较感兴趣,觉得这会是未来整个人工智能领域的发展方向.知识图谱是对人类知识的结构化总结,试想以后所有我们知道的不知道的事情都能通过知识图谱串在一起,形成一个云图书馆.那么知识图谱是如何建 ...
- 知识图谱:Konwledge Graph简介
一.概念 Konwledge Graph来源于2012年谷歌提出的,用于增强其搜索引擎功能的知识库. 本质上,知识图谱是一种揭示实体之间关系的语义网络,可以对现实世界的事物及其相互关系进行形式化地描述 ...
- 知识图谱最新论文清单(附论文解读)
精选 6 篇来自 EMNLP 2018.ISWC 2018.NAACL 2018.ACL 2018 和 IJCAI 2018 的知识图谱相关工作,带你快速了解知识图谱领域最新研究进展. EMNLP 2 ...
- STM32学习心得三十四:外部SRAM原理及实验代码解读
记录一下,方便以后翻阅~ 主要内容: 1) IS62WV51216简介: 2) FSMC简介及相关寄存器介绍: 3) 相关实验代码解读. 参考手册: <STM32中文参考手册_V10>-第 ...
- 编译原理语义分析代码_Pix2Pix原理分析与代码解读
原理分析: 图像.视觉中很多问题都涉及到将一副图像转换为另一幅图像(Image-to-Image Translation Problem),这些问题通常都使用特定的方法来解决,不存在一个通用的方法.但 ...
- BART原理简介与代码实战
写在前面 最近huggingface的transformer库,增加了BART模型,Bart是该库中最早的Seq2Seq模型之一,在文本生成任务,例如摘要抽取方面达到了SOTA的结果. 本次放出了三组 ...
- 知识图谱之NELL数据集简介
1 NELL数据集简介 来源:NELL 1.1 目录结构 train_tasks.json dev_tasks.json test_tasks.json ent2ids relation2ids pa ...
最新文章
- 2019年一线大厂20个长问mongo面试题和答案
- php mysql 修改密码_设置及修改MySQL root用户密码
- TObject简要说明-对象的创建流程
- 如何使用spring配合mybatis配置多个数据源并应用?
- iView 实战系列教程(21课时)_2.iView 实战教程之导航、路由、鉴权篇
- Mongodb 分片与副本集
- 2019入门级云主机选型测试报告
- 软件外包的话居然会有这样的后果...
- Jquery 屏蔽右键菜单,识别右键事件
- pycharm快捷键之①“上下移动某一行“②参数提示
- 剑指offer系列之五十四:按之字形顺序打印二叉树
- HFSS15.0 安装破解说明
- 华为Metn40有没有鸿蒙系统,华为matex2测评_华为matex2上手测评
- .glusterfs_如何在Ubuntu 20.04上使用GlusterFS创建冗余存储池
- 非常完美的PDF转换成Word转换器完全免费破解版(亲测好用)
- LHG 弹层问题汇总
- 一种获取公网ip地址并发送邮件至指定邮箱的实现方法
- 混沌图像加密matlab,基于复合混沌系统的彩色图像加密算法及Matlab实现
- 豆瓣9.1分:软件开发的201个原则
- 怎样翻译文本?这三种翻译方法我经常使用