DisenE: Disentangling Knowledge Graph Embeddings

解耦知识图谱嵌入

创新点:本文利用注意力机制将实体的表示分解为了多个部分

1 动机

  • 以往对知识图谱嵌入的研究,通常是基于黑盒模型的,这导致很难对学习到的表示进行解释
  • 于是本文引入注意力机制,根据实体之间的关系,使模型显式集中在实体嵌入的几个component(我将其称为组成部分),简单来说,学习的实体表示可以解耦为多个向量

2 举例

在这里插入图片描述

  • 实体 “David Beckham” 可能包括几个组成部分,例如,“Characteristic”、“Work”、“Family”、"Places"等
  • 对于关系 “country”、“live_city”,实体 “David Beckham” 应该集中在"Places";对于关系"team_of",实体 “David Beckham” 应该集中在"Work"。

注意:从这个例子,我们就可以看出一个实体可能包含多个组成部分,也就是可以将实体嵌入分为多个独立的部分

3 模型架构

在这里插入图片描述

该示意图给出的 l=4 K=3 l表示关系嵌入维度,K表示组成的个数

简单理解:首先根据关系,计算出每一部分(component)的注意力系数,然后和对应部分的表示相乘后相加,就得到了最终的分数

3.1 part one

在这里插入图片描述

符号介绍:l表示关系嵌入的维度,d表示实体嵌入的维度,K表示component的个数,l=d/K

公式理解:第一个公式就是将头实体的第k个部分、关系和尾实体的第k个部分拼接在一起,然后和W1(训练参数)相乘,最后利用relu函数激活,得到的应该就是一个标量;第二个公式就是softmax

大家肯定存在一个疑问,这样做到底有什么用?

用通俗的话解释一下,一个实体有K个部分,此处的注意力系数算的是什么呢?算的是关系r和K个部分的相关性,如果更相关,我们应该给关系r很高的权重,也就是注意力系数

3.2 part two

在这里插入图片描述在这里插入图片描述

第一个是TransE模型学习的公式;第二个是ConvKB模型的公式(如果不懂可以去看一下这篇论文,非常值得一读)

根据part one得到的注意力系数,然后和TransE或者ConvKB计算得到的表示相乘后相加,W2(训练参数),可以得到最终的分数

3.3 train

在这里插入图片描述

loss分为以下三部分
其中 β 和 η 表示对应部分的权重

在这里插入图片描述

在这里插入图片描述

第一个公式 当三元组存在时,y=1,反之,y=-1 ;loss要尽可能的小,所以当y=1时,f要尽可能的小

第二个公式说 一个关系应该关注不同实体的相同component ,N=50时训练效果最好

第三个公式说 一个关系关注的component应该少一点,m=2时训练效果最好

### Program of Thoughts Prompting 方法中的计算与推理分离 在数值推理任务中,Program of Thoughts (PoT) Prompting 方法通过生成可执行的编程代码来表示逻辑推理步骤,而不是直接提供完整的解决方案或计算路径。这种方法允许将复杂的推理过程分解成更易于管理和验证的小部分[^1]。 具体而言,在处理数值推理问题时,PoT 提出了一个框架,其中推理被编码为一系列可以由外部工具(如Python解释器)执行的具体操作指令。这意味着实际的算术运算和其他类型的数值处理是由专门设计用于此类任务的语言特性来承担的,而模型本身则专注于构建正确的算法结构和流程控制语句[^2]。 这种做法不仅简化了模型内部的工作负载,还使得整个系统的灵活性大大增加——因为只要改变所使用的脚本语言或者引入新的库函数就可以轻松扩展功能范围。此外,由于最终产生的是一段清晰易读且能够独立运行的源码文件,因此也便于后续的人工审查以及错误排查工作。 ```python def calculate_interest(principal, rate, time): """Calculate compound interest using the formula A=P(1+r)^t""" amount = principal * ((1 + rate) ** time) return round(amount, 2) # Example usage demonstrating separation between logic and computation logic_description = """ Given a principal P=1000 dollars at an annual interest rate r=0.05 over t=3 years, we want to find out how much money will accumulate after this period. """ print(f"{logic_description}\nThe accumulated value is ${calculate_interest(1000, 0.05, 3)}.") ``` 上述例子展示了如何利用 Python 函数 `calculate_interest` 来封装具体的利息计算细节,而在描述性的字符串变量 `logic_description` 中仅保留高层次的任务说明。这种方式体现了 PoT 如何有效地实现了计算过程同推理表述之间的解耦合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值