OpenKE实现转移距离模型trans系列代码
前言
前段时间学习了知识图谱表示的转移距离模型trans系列大礼包,编辑这篇博客的起因是一个学妹找我要trans系列的代码,所以就在周日的下午来回忆一下自己之前用虚拟机和openKE跑trans系列代码的过程。
简要介绍
转移距离模型(trans系列)
假设我们现在要完成的任务是根据知识图谱中已存在的实体去预测缺失事实(即链接预测),一个思路是将知识图谱实体与实体之间的关系解释为为空间内的几何变换,比如用向量去表示实体,再通过向量之间的计算就可以完成链接预测,而trans系列就可以实现上述思路。
思想: 拥有同一种关系的头实体和尾实体,在向量空间的表示可能具有平移不变性。例如:vec(king)-vec(queen)=vec(man)-vec(woman),”king”和”queen”在语义上的关系与”man”和”woman”之间的关系近似。
过程:
- 划分数据集为训练集、测试集、验证集
- 指定向量维度,初始化实体和关系向量表示
- 构造负样本,随机替换正样本的头实体或尾实体
- 正负样本经过打分函数,|h+r-t| 头实体+关系-尾实体如果趋近于0,则关系存在
- 优化向量表示,(正loss-负loss)/2 趋近于小,即正loss趋近于大,负loss趋近于小,即通过使正样本的距离不断接近,负样本的距离不断增大来优化实体和关系的向量表示。
; TransE
如果事实(h,r,t)存在,则存在f r ( h , t ) = − ∣ ∣ h + r − t ∣ ∣ 1 / 2 f_{r}(h,t)=-||h+r-t||_{1/2}f r (h ,t )=−∣∣h +r −t ∣∣1 /2
问题: 难以处理一 对多(1-N)、多对一(N-1)以及多对多(N-N)关系的问题。
举例:h:张艺谋 r:导演 t1:《英雄》 t2:《十面埋伏》t3:《金陵十三钗》t4:《满城尽带黄金甲》如果h+r-t趋近于0,—> h+r不变——> t1,t2,t3,t4无限趋近
TransH
h,r,t在一个向量空间,不在一个向量平面。关系r有一个超平面,关系超平面由平面的法向量 wr和平面上的平移向量dr来决定,相当于 关系由一个超平面来表示,不同的h和t对应不同的dr, h和t投影到r的超平面上,利用投影向量进行三元组得分的计算。具体公式如下:
h ⊥ = h − w r T h w r h_{\perp }=h-w_{r}^{T}hw_{r}h ⊥=h −w r T h w r
t ⊥ = t − w r T t w r t_{\perp }=t-w_{r}^{T}tw_{r}t ⊥=t −w r T t w r
f r ( h , t ) = − ∣ ∣ h ⊥ + r − t ⊥ ∣ ∣ 2 2 f_{r}(h,t)=-||h_{\perp }+r-t_{\perp}||_{2}^{2}f r (h ,t )=−∣∣h ⊥+r −t ⊥∣∣2 2
TransR
在 不同的向量空间分别表示实体和关系,假定所有的计算都在关系的表示空间里进行,所以先将实体向量通过关系矩阵投影到关系表示空间,再计算三元组得分。
h ⊥ = M r h h_{\perp }=M_{r}h h ⊥=M r h
t ⊥ = M r t t_{\perp }=M_{r}t t ⊥=M r t
f r ( h , t ) = − ∣ ∣ h ⊥ + r − t ⊥ ∣ ∣ 2 2 f_{r}(h,t)=-||h_{\perp }+r-t_{\perp}||_{2}^{2}f r (h ,t )=−∣∣h ⊥+r −t ⊥∣∣2 2
TransD
用一个与实体相关的向量以及一个与关系相关的向量通过外积计算,动态的得到关系投影矩阵。
优点: 显著减少 关系数量较大且实体数量不多的数据参数。
; OpenKE
清华大学自然语言处理实验室发布了 OpenKE 平台,涵盖了常见的表示学习模型,整合了 TransE、TransH、TransR、TransD、RESCAL、DistMult、HolE、ComplEx 等算法的统一接口高效实现,以及面向 WikiData 和 Freebase 预训练知识表示模型,提供了多个知识表示学习的工具包。
要求在Linux环境下运行使用
借鉴了VM中的Ubuntu踩坑这篇博客,里边说的很详细,需要在虚拟机中装好ubuntu并配置好Pytorch环境。不同的是,我没有用GPU,自然也就没有遇到博主所说的在安装NVIDIA驱动崩溃的困扰。
步骤:
- ubuntu中Git安装
- ubuntu中Git配置
- 生成本地SSH Key
- 在Github上配置SSH
- 下载Pytorch版代码到本地
- 进入目录,编译make.sh文件
- 拷贝训练所需要的模型
以上全部按照前面所提的那篇博客操作(在此对博主表示诚挚的感谢!)
- 修改这里为false ,即不用GPU进行训练
时间隔得久了,可能当时还遇到了很多其他的问题,但是都解决了。
之后如果想用trans系列的算法代码,可直接把自己的数据集放入指定目录,修改代码中的数据集目录即可。
一定要注意数据集的格式!!!
Original: https://blog.csdn.net/qq_44921435/article/details/124078603
Author: straawberry
Title: OpenKE实现转移距离模型trans系列代码
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/556013/
转载文章受原作者版权保护。转载请注明原作者出处!