transE(Translating Embedding)详解+简单python实现
表示学习旨在学习一系列低维稠密向量来表征语义信息,而知识表示学习是面向知识库中实体和关系的表示学习。当今大规模知识库(或称知识图谱)的构建为许多NLP任务提供了底层支持,但由于其规模庞大且不完备,如何高效存储和补全知识库成为了一项非常重要的任务,这就依托于知识表示学习。
transE算法就是一个非常经典的知识表示学习,用分布式表示(distributed representation)来描述知识库中的三元组。想象一下,这类表示法既避免了庞大的树结构构造,又能通过简单的数学计算获取语义信息,因此成为了当前表示学习的根基。
1 transE算法原理
我们知道知识图谱中的事实是用三元组 (h,l,t)(h,l,t)(h,l,t) 表示的,那么如何用低维稠密向量来表示它们,才能得到这种依赖关系呢?transE算法的思想非常简单,它受word2vec平移不变性的启发,希望h+l≈th+l≈th+l≈t(此为归纳偏差?)。
光有这一个约束可不够。想让h+l≈th+l≈th+l≈t,如何设置损失函数是个关键。我们发现表示学习都没有明显的监督信号,也就是不会明确告诉模型你学到的表示正不正确,那么想要快速收敛就得引入“相对”概念,即相对负例来说,正例的打分要更高,方法学名“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实现相关推荐
- python main传参args,详解用Python处理Args的3种方法
1. sys 模块 Python 中的 sys 模块具有 argv 功能.当通过终端触发 main.py 的执行时,此功能将返回提供给 main.py 的所有命令行参数的列表.除了其他参数之外,返回列 ...
- 2022年全国大学生数学建模竞赛E题目-小批量物料生产安排详解+思路+Python代码时序预测模型(三)
目录 前言 一.六种物料挑选 二.周数处理 三.时序预测模型 模型预测结果 建模的部分后续将会写出,想要了解更多的欢迎加博主微信,免费获取更多细化思路+模型! 点关注,防走丢,如有纰漏之处,请留言指教 ...
- 一文读懂NLP之隐马尔科夫模型(HMM)详解加python实现
一文读懂NLP之隐马尔科夫模型(HMM)详解加python实现 1 隐马尔科夫模型 1.1 HMM解决的问题 1.2 HMM模型的定义 1.2.1HMM的两个假设 1.2.2 HMM模型 1.3 HM ...
- 详解一个Python库,用于构建精美数据可视化web app,练习做个垃圾分类app
点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 醉卧沙场君莫笑,古来征战几人回? ...
- 排序算法(五)——堆排序算法详解及Python实现
本文目录 一.简介 二.算法介绍 三.代码实现 排序算法系列--相关文章 一.简介 堆排序(Heap Sort)算法,属于选择排序类,不稳定排序,时间复杂度O(nlogn). 堆排序由Floyd和Wi ...
- kmeans算法详解和python代码实现
kmeans算法详解和python代码实现 kmeans算法 无监督学习和监督学习 监督学习: 是通过已知类别的样本分类器的参数,来达到所要求性能的过程 简单来说,就是让计算机去学习我们已经创建好了的 ...
- 用python写管理系统局域网_详解用python -m http.server搭一个简易的本地局域网
工作时同事间几mb小文件的传输,一般使用QQ或者微信就足够了,但当传输文件几百MB或者几十G时,这种方法的效率就显得不足了.本篇就是简单说明一个python小功能,让大家能利用python方便的搭建一 ...
- 编辑距离算法详解和python代码
编辑距离(Levenshtein Distance)算法详解和python代码 最近做NLP用到了编辑距离,网上学习了很多,看到很多博客写的有问题,这里做一个编辑距离的算法介绍,步骤和多种python ...
- CART分类决策树、回归树和模型树算法详解及Python实现
机器学习经典算法详解及Python实现–CART分类决策树.回归树和模型树 摘要: Classification And Regression Tree(CART)是一种很重要的机器学习算法,既可以用 ...
- python直线拟合_RANSAC算法详解(附Python拟合直线模型代码)
之前只是简单了解RANSAC模型,知道它是干什么的.然后今天有个课程设计的报告,上去讲了一下RANSAC,感觉这个东西也没那么复杂,所以今天就总结一些RASAC并用Python实现一下直线拟合. RA ...
最新文章
- Web开发常规调试方法与常见问题分析
- 匿名内部类与Lambda表达式
- 第四十三期:2020年企业面临的20大数据安全风险
- Python笔记-获取某贴吧页面所有的贴吧id
- Postgresql修改字段的长度
- 快视频:剽窃了B站的数据库?360的常规操作了。
- Google与GitHub 结盟,为保护软件供应链而战
- 梦里看到你为我写的情书
- JS--我发现,原来你是这样的JS:面向对象编程OOP[3]--(JS继承)
- 深度学习和拓扑数据分析的六大惊人之举
- __cdecl operator new(unsigned int) (??2@YAPAXI@Z) 已经在 LIBCMT.lib(new.obj) 中定义
- okhttp post php,Android OkHttp 结合php 多图片上传实例
- decklink linux 驱动下载,Blackmagic Design DeckLink采集卡驱动
- 计算广告学中的GFP、GSP和VCG对比
- 340-写一个银行转账死锁问题并且解决
- 腾讯云轻量应用服务器怎么用?配置搭建网站教程
- 四川跃恒云启网络科技有限公司:拼多多推广花费高怎么调整
- 怎么把应用隐藏到计算机里,怎么把桌面上的软件隐藏起来
- outlook2010签名设置 怎麼用html 设置名片,windows10系统下Outlook2010如何设置邮箱签名...
- 攻防世界-MISC-练习区-06(坚持60s)
热门文章
- 微软补丁日安全公告|11月份
- 关于航模的几点总结积累
- 计算机录入技术五笔输入法教案,五笔打字教案
- html鼠标点击事件代码,HTML onmousedown事件用法及代码示例
- xy的联合概率密度函数怎么求_X Y的联合密度函数
- FFmpeg —— MP4文件提取h264文件
- 联想小新air13装双系统_联想小新Pro 13黑苹果详细安装教程
- ibook软件java_Ibookv1.11 塞班版下载 - 手机阅读 - 非凡手机软件
- 计算机c盘内部图片,C盘爆满?教你如何释放系统盘空间,瞬间多出10个G!
- 数据库系统工程师考点笔记