知识图谱-KGE-语义匹配-双线性模型(打分函数用到了双线性函数)-2011:RESCAL【双线性模型的开山之作】【把每个关系对应的邻接矩阵进行了矩阵的分解】

news2024/12/29 10:21:36

【paper】 A Three-Way Model for Collective Learning on Multi-Relational Data

【简介】 这篇文章应该算是双线性模型的开山之作。是德国的一个团队发表在 ICML 2011 上的工作,比较老了,主要思想是三维张量分解。

想研究啥,啥就很重要
Relational learning is becoming increasingly important in many areas of application.
直接本文做了啥(总)
Here, we present a novel approach to relational learning based on the factorization of a three-way tensor.
本文做了啥(分)
We show that unlike other tensor approaches, our method is able to perform collective learning via the latent components of the model and provide an efficient algorithm to compute the factorization.
实验怎么弄
We substantiate our theoretical considerations regarding the collective learning capabilities of our model by the means of experiments on both a new dataset and a dataset commonly used in entity resolution.
效果怎么样
Furthermore, we show on common benchmark datasets that our approach achieves better or on-par results, if compared to current state-of-the-art relational learning solutions, while it is significantly faster to compute.

模型

定义了一个 tensor,m 是关系数,n 是实体数,每个关系对应于 tensor 中的一个 slice,即一个矩阵,每个矩阵相当于表示图的邻接矩阵。位置元素为 1 代表两个实体之间存在这种关系,为 0 表示不存在。

对 tensor 进行分解:

AA 是 n×r 的矩阵,表示每个实体的隐性表示(latent-component representation),RkRk 是 r×r 的非对称矩阵,建模第 k 个属性/关系中的实体 latent component 的交互。

矩阵 AA 和 RkRk 通过约束最小化问题来计算:

特别要提的是 RkRk 是非对称矩阵,这样可以建模非对称关系,在同一个实体作为头实体或尾实体时会得到不同的 latent component representation。

其中,

更具体地,

(其实贴图时可以不用定义高度)

这样的分解机制可以利用相关实体提供的信息进行表示,类似推荐里的协同过滤,这里称为 collective learning,举了一个栗子:

以上就是 Rescal 的核心思想了,后面有几个小节讲和其他方法的联系以及计算 factorization 的方法,没有仔细看。

实验

collective classification

该实验使用自建的政党数据集,包括 93 个实体和 3 个关系,因此构建了 93×93×5 的 tensor。政党分类效果如下。

collective 实体消歧

实体消歧可以视为 isEqual 关系的链接预测,在 Cora 数据集上进行了实验:

除了上述两个实验,还在 Kinships, Nations 和 UMLS 数据集上进行了链接预测,并在 Nations 数据集上进行了聚类实验。并在各个数据集上进行了与其他两个算法的运行效率的比较,不再贴图了。

代码

文章中说 Rescal 是用不超过 120 行的 Python/Numpy实现的,但没有给出代码。Pykg2vec 实现了 Rescal,但我没有看明白,实现的比较巧妙。因为也没有打算做这块,就不继续花时间研究了。

class Rescal(PairwiseModel):
    """
        `A Three-Way Model for Collective Learning on Multi-Relational Data`_ (RESCAL) is a tensor factorization approach to knowledge representation learning,
        which is able to perform collective learning via the latent components of the factorization.
        Rescal is a latent feature model where each relation is represented as a matrix modeling the iteraction between latent factors. It utilizes a weight matrix which specify how much the latent features of head and tail entities interact in the relation.
        Portion of the code based on mnick_ and `OpenKE_Rescal`_.

        Args:
            config (object): Model configuration parameters.

        .. _mnick: https://github.com/mnick/rescal.py/blob/master/rescal/rescal.py

        .. _OpenKE_Rescal: https://github.com/thunlp/OpenKE/blob/master/models/RESCAL.py

        .. _A Three-Way Model for Collective Learning on Multi-Relational Data : http://www.icml-2011.org/papers/438_icmlpaper.pdf

    """
    def __init__(self, **kwargs):
        super(Rescal, self).__init__(self.__class__.__name__.lower())
        param_list = ["tot_entity", "tot_relation", "hidden_size", "margin"]
        param_dict = self.load_params(param_list, kwargs)
        self.__dict__.update(param_dict)

        self.ent_embeddings = NamedEmbedding("ent_embedding", self.tot_entity, self.hidden_size)
        self.rel_matrices = NamedEmbedding("rel_matrices", self.tot_relation, self.hidden_size * self.hidden_size)
        nn.init.xavier_uniform_(self.ent_embeddings.weight)
        nn.init.xavier_uniform_(self.rel_matrices.weight)

        self.parameter_list = [
            self.ent_embeddings,
            self.rel_matrices,
        ]

        self.loss = Criterion.pairwise_hinge

    def embed(self, h, r, t):
        """ Function to get the embedding value.

            Args:
                h (Tensor): Head entities ids.
                r (Tensor): Relation ids of the triple.
                t (Tensor): Tail entity ids of the triple.

            Returns:
                Tensors: Returns head, relation and tail embedding Tensors.

        """
        k = self.hidden_size

        self.ent_embeddings.weight.data = self.get_normalized_data(self.ent_embeddings, self.tot_entity, dim=-1)
        self.rel_matrices.weight.data = self.get_normalized_data(self.rel_matrices, self.tot_relation, dim=-1)

        emb_h = self.ent_embeddings(h)
        emb_r = self.rel_matrices(r)
        emb_t = self.ent_embeddings(t)
        emb_h = emb_h.view(-1, k, 1)
        emb_r = emb_r.view(-1, k, k)
        emb_t = emb_t.view(-1, k, 1)

        return emb_h, emb_r, emb_t


    def forward(self, h, r, t):
        h_e, r_e, t_e = self.embed(h, r, t)
        # dim of h: [m, k, 1]
        #        r: [m, k, k]
        #        t: [m, k, 1]
        return -torch.sum(h_e * torch.matmul(r_e, t_e), [1, 2])


    @staticmethod
    def get_normalized_data(embedding, num_embeddings, p=2, dim=1):
        norms = torch.norm(embedding.weight, p, dim).data
        return embedding.weight.data.div(norms.view(num_embeddings, 1).expand_as(embedding.weight))

在 FB15k 数据集上尝试运行了一下,效果很差:


【小结】 本文用三维张量分解进行三元组嵌入。

双线性模型(一)(RESCAL、LFM、DistMult) - 胡萝不青菜 - 博客园

第十二周.直播.DGL-KG, LifeSci讲解_oldmao_2000的博客-CSDN博客

RESCAL:A Three-Way Model for Collective Learning on Multi-Relational Data - 知乎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/71509.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Activity7-流程初体验

流程符号详解: 创建Activiti工作流的主要步骤包含以下几步: 1. 定义流程。按照BPMN的规范,使用流程定义工具,将整个流程描述出来。 2. 部署流程。把画好的BPMN流程定义文件加载到数据库中,生成相关的表数据。 3. 启动流程。使用…

基于粒子群优化算法的微电网调度(光伏、储能、电动车、电网交互)(Matlab代码实现)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清…

目标检测3

还是目标检测相关~这次是Box Size置信度偏差会损害目标检测器 检测器的置信度预测在目标大小和位置方面存在偏差,但目前尚不清楚这种偏差与受影响的目标检测器的性能有何关系。 无数应用依赖于目标检测器的可靠置信度估计的准确预测。然而,众所周知&am…

[附源码]Python计算机毕业设计Django在线招聘网站

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

突破40%!新能源汽车L2级辅助驾驶搭载率创新高

新能源汽车正在成为智能化的主力军。 高工智能汽车研究院监测数据显示,2022年1-10月中国市场(不含进出口)新能源汽车前装标配搭载L2级辅助驾驶交付上险167.51万辆,前装搭载率首次突破40%,达到41.93%;同期&…

[Java反序列化]CommonsBeanutils1利用链学习

0x01 前篇shiro的利用,需要动态字节码 ,而这种方式需要我们自己添加依赖,所以很局限,而CommonsBeanutils 是shiro的依赖, CommonsBeanutils 是应用于 javabean 的工具 javabean的定义 类必须是具体的和公共的&#…

传统服务器与云服务器

传统服务器 传统服务器即物理服务器,是指独立服务器,也就是指物理上的单独服务器,物理服务器的构成包括处理器、硬盘、内存、系统总线等,和通用的计算机架构类似。 裸机物理服务器(BMS) 裸机服务器的官方定义是:裸机…

【嵌入式硬件芯片开发笔记】4-2 mADAC芯片AD5421配置流程

【嵌入式硬件芯片开发笔记】4-2 mADAC芯片AD5421配置流程 16位、串行输入、环路供电、4 mA至20 mA DAC 可用于HART协议相关电路 同AD5700配合使用 AD5421的SPI和普通的不一样 回读时要发两段 CS中间拉高一次 数据在SCLK上升沿逐个输出,而且在 SCLK下降沿有效 固CPO…

微服务框架 SpringCloud微服务架构 26 数据聚合 26.2 DSL 实现Bucket聚合

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构26 数据聚合26.2 DSL 实现Bucket聚合26.2.1 DSL 实现Bucket聚合26.2.2 Buc…

【设计模式】享元模式(Flyweight Pattern)

享元模式属于结构型模式,主要解决系统需要使用大量相似对象(细粒度对象)而消耗大量内存资源的问题。享元模式运用共享技术有效地支持大量细粒度的对象,其通过提取对象共同的信息抽象出享元对象,实现共享功能&#xff0…

mysql详解之B树的查询时间复杂度

前言 本文是我在看了这篇文章之后(这篇文章对b树的时间复杂度总结的很全面),关于B树(或B树)时间复杂度做的进一步思考(如果对解题过程不感兴趣,可以直接看最后的总结)。 正题 在这…

Java继承(extends)简明教程

继承是面向对象的三大特征之一。继承和现实生活中的“继承”的相似之处是保留一些父辈的特性,从而减少代码冗余,提高程序运行效率。 Java 中的继承就是在已经存在类的基础上进行扩展,从而产生新的类。已经存在的类称为父类、基类或超类&…

物联网和大数据可应用在哪些领域?

物联网和大数据可应用在哪些领域?物联网和大数据是近年来最受媒体和企业关注的两大宏观技术趋势。两者也并驾齐驱,物联网旨在特定组织或环境中创建一个互联网络,使用该网络来收集数据并集中执行特定功能。物联网部署会生成大量以前未开发的数…

【MR】C++ bullet客户端基于MR的动力学仿真

程序基于(A minimal example showing how to use PyBullet from C over shared memory.一个展示如何在共享内存上从c使用PyBullet的最小示例。https://github.com/erwincoumans/pybullet_cpp_sharedmemory_example)实现与pybullet服务器通信交互。加上MR…

MySql按条件插入数据,MySQL插入语句写where条件,MySQL在插入时做幂等

文章目录写在前面根据条件插入数据1、先准备测试数据2、正常的插入语句3、有条件的插入语句(重点)4、查看最终结果总结分析写在前面 使用MySQL的删、改、查功能时,我们都可以根据where条件来对指定数据进行操作。 插入语句如何通过where条件…

Git —— 关于创建多对非对称公钥时对不同服务器的匹配问题

Git —— 关于创建多对非对称密钥时对不同服务器的匹配问题 《工欲善其事,必先利其器》—— 既然点进来了,麻烦你看下去,希望你有不一样的收获~ 《 前言 》 大概是半年前,我写过一篇关于 git 连接托管平台提示 permission denied…

经典算法冒泡排序之标志位优化版

前言 今天总结一下优化版的经典算法——冒泡排序,不同于以往的暴力二重for循环,这里的冒泡排序增加了一个标志位。我们要理解该冒泡排序的概念,算法流程与算法思想,探讨时间复杂度。 冒泡排序算法解析 一、理解冒泡排序思想 1…

Selenium4+Python3系列(十一) - Page Factory设计模式

写在前面: Page Object模式,目的是将元素定位和元素操作分层,只接触测试内容,不写基础内容,便于后续对自动化测试用例体系的维护,这是中心思想,也是核心。 那么我们继续将简洁延续&#xff0c…

Allegro如何铺网格铜详细操作指导

Allegro如何铺网格铜的三种方法操作指导 在做PCB设计的时候,时常需要铺网格铜,尤其是对于绕性有要求的时候,Allegro可以快捷铺出网格铜,类似下图 具体操作如下 直接铺网格铜 选择Shape add Rect命令 Option Type选择Static Crosshatch 画出需要的图形 鼠标右击done,…

详解go语言包管理方式(go mod), 分析多目录多文件下的管理,不同工程下包的相互调用

先明白一个点, 想要成功运行一个go程序, 有两种模式 一: 以前的默认模式,必须将项目放在gopath/src下 二:使用go mod 包管理方式, 项目可以放到任意位置,这样目录下需要有go.mod文件 下边我会分…