ConvE——二维卷积知识图谱横空出世

2024-03-16 04:10

本文主要是介绍ConvE——二维卷积知识图谱横空出世,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Convolutional 2D Knowledge Graph Embeddings》论文理解+代码复现

本论文理解不再翻译原文,只写上我对于论文原生态的理解,应该会比较详细,请读者放心。

一.作者为什么要提出ConvE?

传统的R-GCN和DistMult的参数量过大,并且模型深度不够深,只能处理较小的知识图谱,所以作者将CNN引入到图神经网络中。

二.一维卷积与二维卷积的对比

2.1一维卷积

当a,b特征简单一维concat时,使用的是一维卷积横向滑动:
在这里插入图片描述
但是这样有一个弊端,其实一维卷积不能提取出来很多a和b之间的关系(即a和b交界的位置),因此横向移动的意义变得十分微小。

2.2二维卷积

作者想到在构造特征时就使用2D的方式(即使用二维的拼接方式),这样便可以方便使用二维卷积来更好地提取a和b各自以及交互的特征。
在这里插入图片描述
特别的(如下图),当a,b特征交互排列时,二维卷积的作用将会更大:
在这里插入图片描述

三.目标

在链接预测任务中,分为编码部分评分部分

编码部分的工作是将每个实体(如人、地点或事物)和关系(如“位于”或“朋友”)从知识图谱中映射到向量空间中的嵌入。

评分部分则根据事实三元组中的实体和关系的嵌入来计算分数。分数反映了一个给定的事实三元组(例如,一对实体和它们之间的关系)为真的可能性。

训练中的参数更新主要就是这两部分。
在这里插入图片描述
现在我们只看ConvE的评分函数(如上图红色框)

  • f:一个非线性函数,比如ReLU激活函数。
  • vec:将矩阵展平成向量的操作。
  • [es​;r]:实体嵌入 es和关系嵌入 r 的拼接。
  • ∗ω:与卷积核ω 进行卷积操作。
  • W:权重矩阵,用于在卷积后将特征映射到目标空间。
  • eo:目标实体的嵌入。

整个表达式的含义是:首先将源实体嵌入和关系嵌入进行拼接,然后与卷积核做卷积操作,并应用非线性函数。之后,将结果展平成向量,与权重矩阵 W 相乘,最后与目标实体嵌入eo的内积,得到预测的评分。这个评分反映了给定三元组作为真实事实的可能性。

此外,该训练的过程最后的损失函数是二元交叉熵损失函数。

四.评分函数详细解释

在这里插入图片描述
在这里插入图片描述
以上是完整的评分函数定义。

下面是流程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
计算速度的提升就在于1-N Scoring的提出,那为什么ConvE可以同时对多个尾部实体进行预测呢?下面是答案:
在这里插入图片描述

五.实验部分与结论

5.1实验部分

在对比实验部分,作者主要将ConvE与DistMult作为比较。
可以看出,在相同参数量时,ConvE的性能就已经超过DistMult了,当然随着参数的增大,ConvE的性能并没有得到质的提升。
在这里插入图片描述
对于其他的超参设置, 作者在论文中指出, 大的卷积核效果不如多个小卷积核效果好(这点与CV中结论一致, 基本已经成常识了)。

inverse model(如下图)检测部分,ConvE表现得非常良好。在这里插入图片描述

消融实验部分(如下图),各种Dropout似乎对ConvE的影响很大, 1 - N Scoring的增益也不小, 标签平滑倒是不怎么重要
在这里插入图片描述

5.2结论与展望

作者引入了ConvE,一个使用2D卷积和多层非线性特征来建模知识图谱的链接预测模型。ConvE参数少,评分速度快,通过非线性特征的多层表示抵抗过拟合,并在多个数据集上取得了良好结果。此外,我们调查了WN18和FB15k数据集中通过逆关系泄露测试集的问题,并确保所有调查数据集都有健壮的版本。尽管ConvE与计算机视觉中的卷积架构相比还是较浅,但未来的工作可能会涉及更深层次的卷积模型,以及如何在嵌入空间强化大规模结构以增加交互。

六.代码复现


import torch
from torch.nn import functional as F,Parameter
from torch.autograd import Variable
from torch.nn.init import xavier_normal_,xavier_uniform_
from torch.nn.utils.rnn import pack_padded_sequence,pad_packed_sequence
class ConvE(torch.nn.Module):def __init__(self,args,num_entities,num_relations):"""Args:args (string*): 参数设置num_entities (int): 知识图谱中实体的数量num_relations (int): 知识图谱中关系的数量"""super(ConvE,self).__init__()self.emb_e=torch.nn.Embedding(num_entities,args.embedding_dim,padding_idx=0) #将单词转化为args.embedding_dim规定的向量self.emb_rel=torch.nn.Embedding(num_relations,args.embedding_dim,padding_idx=0)self.inp_drop=torch.nn.Dropout(args.input_drop)self.hidden_drop=torch.nn.Dropout(args.hidden_drop)self.feature_map_drop=torch.nn.Dropout2d(args.feature_drop)self.loss=torch.nn.BCELoss()self.emb_dim1=args.embedding_shape1#self.emb_dim1: 是重塑后矩阵的一个维度,它由模型的参数 args.embedding_shape1 直接给定self.emb_dim2=args.embedding_dim//self.emb_dim1#self.emb_dim2: 是计算得出的另一个维度,由嵌入向量的总维度 args.embedding_dim 除以 self.emb_dim1 得到self.conv1=torch.nn.Conv2d(1,32,(3,3),1,0,bias=args.use_bias)self.bn0=torch.nn.BatchNorm2d(1)self.bn1=torch.nn.BatchNorm2d(32)self.bn2=torch.nn.BatchNorm1d(args.embedding_dim)self.register_parameter('b',Parameter(torch.zeros(num_entities)))self.fc=torch.nn.Linear(args.hidden_size,args.embedding_dim)print(num_entities,num_relations)def init(self):xavier_normal_(self.emb_e.weight.data)xavier_normal_(self.emb_rel.weight.data)def forward(self,e1,rel):e1_embedded=self.emb_e(e1).view(-1,1,self.emb_dim1,self.emb_dim2)#reshaperel_embedded=self.emb_rel(rel).view(-1,1,self.emb_dim1,self.emb_dim2)#reshapestacked_inputs=torch.cat([e1_embedded,rel_embedded],2)stacked_inputs=self.bn0(stacked_inputs)x=self.inp_drop(stacked_inputs)x=self.conv1(x)x=self.bn1(x)#从1维升至32维x=F.relu(x)x=self.feature_map_drop(x)x=x.view(x.shape[0],-1)#除了第一个维度,其他展平x=self.fc(x)x=self.hidden_drop(x)x=self.bn2(x)x=F.relu(x)x=torch.mm(x,self.emb_e.weight.transpose(1,0)) #(batch_size,emb_size)×(emb_size,num_entities)=(batch_size,num_entities)x+=self.b.expand_as(x)pred=torch.sigmoid(x)return  pred  

以上代码只涉及ConvE的模型核心构建,并没有涉及其应用。还请点赞收藏为我助力催更hh

这篇关于ConvE——二维卷积知识图谱横空出世的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/814259

相关文章

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

poj2576(二维背包)

题意:n个人分成两组,两组人数只差小于1 , 并且体重只差最小 对于人数要求恰好装满,对于体重要求尽量多,一开始没做出来,看了下解题,按照自己的感觉写,然后a了 状态转移方程:dp[i][j] = max(dp[i][j],dp[i-1][j-c[k]]+c[k]);其中i表示人数,j表示背包容量,k表示输入的体重的 代码如下: #include<iostream>#include<

hdu2159(二维背包)

这是我的第一道二维背包题,没想到自己一下子就A了,但是代码写的比较乱,下面的代码是我有重新修改的 状态转移:dp[i][j] = max(dp[i][j], dp[i-1][j-c[z]]+v[z]); 其中dp[i][j]表示,打了i个怪物,消耗j的耐力值,所得到的最大经验值 代码如下: #include<iostream>#include<algorithm>#include<

sqlite3 相关知识

WAL 模式 VS 回滚模式 特性WAL 模式回滚模式(Rollback Journal)定义使用写前日志来记录变更。使用回滚日志来记录事务的所有修改。特点更高的并发性和性能;支持多读者和单写者。支持安全的事务回滚,但并发性较低。性能写入性能更好,尤其是读多写少的场景。写操作会造成较大的性能开销,尤其是在事务开始时。写入流程数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。数据在开始

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

HDU 2159 二维完全背包

FATE 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能

【Python知识宝库】上下文管理器与with语句:资源管理的优雅方式

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、什么是上下文管理器?二、上下文管理器的实现三、使用内置上下文管理器四、使用`contextlib`模块五、总结 前言 在Python编程中,资源管理是一个重要的主题,尤其是在处理文件、网络连接和数据库

dr 航迹推算 知识介绍

DR(Dead Reckoning)航迹推算是一种在航海、航空、车辆导航等领域中广泛使用的技术,用于估算物体的位置。DR航迹推算主要通过已知的初始位置和运动参数(如速度、方向)来预测物体的当前位置。以下是 DR 航迹推算的详细知识介绍: 1. 基本概念 Dead Reckoning(DR): 定义:通过利用已知的当前位置、速度、方向和时间间隔,计算物体在下一时刻的位置。应用:用于导航和定位,

【H2O2|全栈】Markdown | Md 笔记到底如何使用?【前端 · HTML前置知识】

Markdown的一些杂谈 目录 Markdown的一些杂谈 前言 准备工作 认识.Md文件 为什么使用Md? 怎么使用Md? ​编辑 怎么看别人给我的Md文件? Md文件命令 切换模式 粗体、倾斜、下划线、删除线和荧光标记 分级标题 水平线 引用 无序和有序列表 ​编辑 任务清单 插入链接和图片 内嵌代码和代码块 表格 公式 其他 源代码 预

二维旋转公式

二维旋转公式 ros的tf工具包可以很方便的实现任意坐标系之间的坐标转换。但是,如果只是想简单的测试想法,而又不想编写过于庞杂的代码,考虑自己写二维旋转的函数。而与二维旋转问题对偶的另一个问题便是二维坐标系旋转变换。这两个问题的形式基本一样,只是旋转的角度相差一个负号。就是这个容易搞混,所以做个笔记,以备查用。 1. 二维旋转公式(算法) 而(此文只针对二维)旋转则是表示某一坐标点 ( x