表示学习旨在学习一系列低维稠密向量来表征语义信息,而知识表示学习是面向知识库中实体和关系的表示学习。当今大规模知识库(或称知识图谱)的构建为许多NLP任务提供了底层支持,但由于其规模庞大且不完备,如何高效存储和补全知识库成为了一项非常重要的任务,这就依托于知识表示学习。

transE算法就是一个非常经典的知识表示学习,用分布式表示(distributed representation)来描述知识库中的三元组。想象一下,这类表示法既避免了庞大的树结构构造,又能通过简单的数学计算获取语义信息,因此成为了当前表示学习的根基。

1 transE算法原理

我们知道知识图谱中的事实是用三元组 (h,l,t)(h,l,t)(h,l,t) 表示的,那么如何用低维稠密向量来表示它们,才能得到这种依赖关系呢?transE算法的思想非常简单,它受word2vec平移不变性的启发,希望h+l≈th+l≈th+lt(此为归纳偏差?)。

光有这一个约束可不够。想让h+l≈th+l≈th+lt,如何设置损失函数是个关键。我们发现表示学习都没有明显的监督信号,也就是不会明确告诉模型你学到的表示正不正确,那么想要快速收敛就得引入“相对”概念,即相对负例来说,正例的打分要更高,方法学名“negative sampling”。损失函数设计如下:

其中(h′,l,t′)(h',l,t')(h,l,t)称为corrupted triplet,是随机替换头或尾实体得到(非同时,其实也可以替换relation)。γ\gammaγ为margin。细看发现这就是SVM的soft margin损失函数,所以可以说,transE针对给定三元组进行二分类任务,其中负例是通过替换自行构造的,目标是使得最相近的正负例样本距离最大化。

论文中给出了详细的算法流程:

其中距离度量方式有L1范数和L2范数两种。在测试时,以一个三元组为例,用语料中所有实体替换当前三元组的头实体计算距离d(h′+l,t)d(h'+l,t)d(h+l,t),将结果按升序排序,用正确三元组的排名情况来评估学习效果(同理对尾实体这样做)。度量标准选择hits@10和mean rank,前者代表命中前10的次数/总查询次数,后者代表正确结果排名之和/总查询次数。

还有一点值得一提,文中给了两种测试结果raw和filter,其动机是我们在测试时通过替换得到的三元组并不一定就是负例,可能恰巧替换对了(比如(奥巴马,总统,美国)被替换成了(特朗普,总统,美国)),那么它排名高也是正确的,把当前三元组挤下去也正常。(存疑:这样的话训练时是否也应当过滤corrupted triplet呢) 所以测试时在替换后要检查一下新三元组是否出现在训练集中,是的话就删掉,这就是filter训练方法(不检查的是raw)。

2 transE算法的简单python实现

为了更好地理解(其实是因为看不懂别人的),用python简单实现了transE算法,使用数据集FB15k。这里记录一些细节和几个小坑。完整代码见github。

1. 训练transE

  • Tbatch更新:在update_embeddings函数中有一个deepcopy操作,目的就是为了批量更新。这是ML中mini-batch SGD的一个通用的训练知识,在实际编码时很容易忽略。
  • 两次更新:update_embeddings函数中,要对correct triplet和corrupted triplet都进行更新。虽然写作(h,l,t)(h,l,t)(h,l,t)(h′,l,t′)(h',l,t')(h,l,t),但两个三元组只有一个entity不同(前面说了,不同时替换头尾实体),所以在每步更新时重叠的实体要更新两次(和更新relation一样),否则就会导致后一次更新覆盖前一次。
  • 关于L1范数的求导方法:先对L2范数求导,逐元素判断正负,为正赋值为1,负则为-1。
  • 超参选择:对FB15k数据集,epoch选了1000(其实不需要这么大,后面就没什么提高了),nbatches选了400(训练最快),embedding_dim=50, learning_rate=0.01, margin=1。

2. 测试

  • isFit参数:区分raw和filter。filter会非常慢。

3 transE算法的局限性

transE效果很好且非常简单,后续大量的工作都是在此基础上的改进(简称trans大礼包),传统方法已经基本不用了(有些思想还是值得借鉴的,比如矩阵分解、双线性模型)。改进大体针对以下几个问题:

  • 复杂关系建模效果差。对1-N,N-1,N-N关系,会出现冲突映射,一个实体在不同三元组内的表示融合,导致不明确甚至错误的语义信息。
  • 多源信息融合。 如何充分利用知识库中的额外信息(如实体类型、实体描述)。
  • 关系路径建模。 对relation之间的依赖进行建模。

理解或实现有错误欢迎指出!

参考文献:

[1] Bordes A, Usunier N, Garcia-Duran A, et al. Translating embeddings for modeling multi-relational data[C]//Advances in neural information processing systems. 2013: 2787-2795.

[2] 刘知远, 孙茂松, 林衍凯, et al. 知识表示学习研究进展[J]. 计算机研究与发展, 2016, 53(2):247-261.

transE(Translating Embedding)详解+简单python实现相关推荐

  1. python main传参args,详解用Python处理Args的3种方法

    1. sys 模块 Python 中的 sys 模块具有 argv 功能.当通过终端触发 main.py 的执行时,此功能将返回提供给 main.py 的所有命令行参数的列表.除了其他参数之外,返回列 ...

  2. 2022年全国大学生数学建模竞赛E题目-小批量物料生产安排详解+思路+Python代码时序预测模型(三)

    目录 前言 一.六种物料挑选 二.周数处理 三.时序预测模型 模型预测结果 建模的部分后续将会写出,想要了解更多的欢迎加博主微信,免费获取更多细化思路+模型! 点关注,防走丢,如有纰漏之处,请留言指教 ...

  3. 一文读懂NLP之隐马尔科夫模型(HMM)详解加python实现

    一文读懂NLP之隐马尔科夫模型(HMM)详解加python实现 1 隐马尔科夫模型 1.1 HMM解决的问题 1.2 HMM模型的定义 1.2.1HMM的两个假设 1.2.2 HMM模型 1.3 HM ...

  4. 详解一个Python库,用于构建精美数据可视化web app,练习做个垃圾分类app

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 醉卧沙场君莫笑,古来征战几人回? ...

  5. 排序算法(五)——堆排序算法详解及Python实现

    本文目录 一.简介 二.算法介绍 三.代码实现 排序算法系列--相关文章 一.简介 堆排序(Heap Sort)算法,属于选择排序类,不稳定排序,时间复杂度O(nlogn). 堆排序由Floyd和Wi ...

  6. kmeans算法详解和python代码实现

    kmeans算法详解和python代码实现 kmeans算法 无监督学习和监督学习 监督学习: 是通过已知类别的样本分类器的参数,来达到所要求性能的过程 简单来说,就是让计算机去学习我们已经创建好了的 ...

  7. 用python写管理系统局域网_详解用python -m http.server搭一个简易的本地局域网

    工作时同事间几mb小文件的传输,一般使用QQ或者微信就足够了,但当传输文件几百MB或者几十G时,这种方法的效率就显得不足了.本篇就是简单说明一个python小功能,让大家能利用python方便的搭建一 ...

  8. 编辑距离算法详解和python代码

    编辑距离(Levenshtein Distance)算法详解和python代码 最近做NLP用到了编辑距离,网上学习了很多,看到很多博客写的有问题,这里做一个编辑距离的算法介绍,步骤和多种python ...

  9. CART分类决策树、回归树和模型树算法详解及Python实现

    机器学习经典算法详解及Python实现–CART分类决策树.回归树和模型树 摘要: Classification And Regression Tree(CART)是一种很重要的机器学习算法,既可以用 ...

  10. python直线拟合_RANSAC算法详解(附Python拟合直线模型代码)

    之前只是简单了解RANSAC模型,知道它是干什么的.然后今天有个课程设计的报告,上去讲了一下RANSAC,感觉这个东西也没那么复杂,所以今天就总结一些RASAC并用Python实现一下直线拟合. RA ...

最新文章

  1. Web开发常规调试方法与常见问题分析
  2. 匿名内部类与Lambda表达式
  3. 第四十三期:2020年企业面临的20大数据安全风险
  4. Python笔记-获取某贴吧页面所有的贴吧id
  5. Postgresql修改字段的长度
  6. 快视频:剽窃了B站的数据库?360的常规操作了。
  7. Google与GitHub 结盟,为保护软件供应链而战
  8. 梦里看到你为我写的情书
  9. JS--我发现,原来你是这样的JS:面向对象编程OOP[3]--(JS继承)
  10. 深度学习和拓扑数据分析的六大惊人之举
  11. __cdecl operator new(unsigned int) (??2@YAPAXI@Z) 已经在 LIBCMT.lib(new.obj) 中定义
  12. okhttp post php,Android OkHttp 结合php 多图片上传实例
  13. decklink linux 驱动下载,Blackmagic Design DeckLink采集卡驱动
  14. 计算广告学中的GFP、GSP和VCG对比
  15. 340-写一个银行转账死锁问题并且解决
  16. 腾讯云轻量应用服务器怎么用?配置搭建网站教程
  17. 四川跃恒云启网络科技有限公司:拼多多推广花费高怎么调整
  18. 怎么把应用隐藏到计算机里,怎么把桌面上的软件隐藏起来
  19. outlook2010签名设置 怎麼用html 设置名片,windows10系统下Outlook2010如何设置邮箱签名...
  20. 攻防世界-MISC-练习区-06(坚持60s)

热门文章

  1. 微软补丁日安全公告|11月份
  2. 关于航模的几点总结积累
  3. 计算机录入技术五笔输入法教案,五笔打字教案
  4. html鼠标点击事件代码,HTML onmousedown事件用法及代码示例
  5. xy的联合概率密度函数怎么求_X Y的联合密度函数
  6. FFmpeg —— MP4文件提取h264文件
  7. 联想小新air13装双系统_联想小新Pro 13黑苹果详细安装教程
  8. ibook软件java_Ibookv1.11 塞班版下载 - 手机阅读 - 非凡手机软件
  9. 计算机c盘内部图片,C盘爆满?教你如何释放系统盘空间,瞬间多出10个G!
  10. 数据库系统工程师考点笔记