(NeurIPS,2022)Knowledge-CLIP:使用知识图谱进行CLIP

文章目录

  • Contrastive Language-Image Pre-Training with Knowledge Graphs
    • 相关资料
    • 摘要
    • 引言
    • 回顾CLIP
    • Knowledge-CLIP
      • 数据准备
      • 模型架构
      • 训练目标

Contrastive Language-Image Pre-Training with Knowledge Graphs

相关资料

论文:Contrastive Language-Image Pre-Training with Knowledge Graphs (nips.cc)

摘要

近年来,大规模预训练框架的发展迅速,这些框架能够以统一的形式提取多模态表征,并在转移到下游任务时展现出有希望的性能。然而,现有的方法主要关注简单的图像-文本对的预训练,而忽略了不同模态概念之间的语义联系。在本文中,我们提出了一个基于知识的知识预训练框架,称为Knowledge-CLIP,它将语义信息注入到广泛使用的CLIP模型中。通过在预训练过程中引入基于知识的目标,并使用不同类型的知识图谱作为训练数据,我们的模型能够在视觉和语言中以更高的质量对表征进行语义对齐,并增强跨场景和模态的推理能力。在各种视觉-语言下游任务上的广泛实验证明了Knowledge-CLIP与原始CLIP和具有竞争力的基线相比的有效性。

引言

请添加图片描述
用于预训练的数据对是以最简单的方式组织的,即仅使用匹配和不匹配的描述来表示给定图像和文本对之间的关系。这通常会导致一种退化的情况,即模型倾向于依赖输入的共同出现而非其语义

我们遵循CLIP的结构,并使用两个基于Transformer的模型分别作为图像和文本编码器。这两个编码器以知识图谱中的实体和关系为输入,提取实体和关系的原始特征。值得注意的是,实体可以是图像/文本的形式,而关系则始终由语言标记描述。然后,采用多模态Transformer编码器来融合基于关系的实体特征。通过这种方式,预训练模型被推动集中于理解视觉和文字概念之间的语义关系,从而在视觉和语言模态之间建立强大的语义连接。

为进一步提高训练效率并避免预训练过程中的大量计算成本,我们采用了一种简单的持续学习策略,基于CLIP的预训练权重来训练我们的模型。这为使用低训练资源有效提升CLIP模型性能提供了可能性。

回顾CLIP

CLIP使用两个独立的模型分别作为图像编码器和文本编码器。
请添加图片描述

  • 对于文本输入,采用了一个12层的Transformer,宽度为512,注意力头为8。原始文本首先使用字节对编码技术在49,152的词汇量下进行转换。文本序列长度限制在76,并在输入文本编码器之前添加位置编码。
  • 另一方面,CLIP有基于ResNet和基于Vision Transformer的不同版本的图像编码器架构。由于后续研究表明Vision Transformer模型的性能更好,本文只考虑基于Transformer的图像编码器。与文本输入类似,图像首先被转换为块,并添加位置编码。

在两个编码器的最后阶段,采用全局池化函数将特征图压缩成单个特征,作为整个图像/文本序列的表示。计算图像和文本特征的余弦距离作为数据对的相似性。在训练监督中,采用对比损失来最大化匹配对的相似性,同时最小化不匹配对的相似性。

Knowledge-CLIP

请添加图片描述

我们提出了一个基于知识图谱的新型预训练框架,从几个角度解决了原始CLIP模型的限制:

  1. 我们将知识图谱引入训练数据集中,其中图结构数据概念之间的语义关系使模型能够提取语义特征,并在输入之间建立语义连接;
  2. 在当前的图像和文本编码器之上增加了一个多模态编码器,以融合不同模态的特征,并建模输入之间的联合分布;
  3. 采用了基于CLIP预训练模型的持续学习策略,避免了预训练过程中的大量计算成本,并有效地增强了模型的泛化能力。

数据准备

请添加图片描述

与原始CLIP中使用的原始图像-文本对不同,我们的模型采用知识图谱作为输入。知识图谱可以定义为一个有向图G = {ξ, R, TR},其中ξ, R分别对应实体和关系集,TR表示关系三元组的集合。三元组(h, r, t) ∈ TR表示实体h ∈ ξ与实体t ∈ ξ之间存在关系r ∈ R。如图3所示,我们在三种类型的知识图谱上预训练我们的模型,包括多模态知识图谱、场景图谱和基于语言的知识图谱。

模型架构

我们首先使用模态特定的分词器将输入处理成标记序列。对于语言输入,我们采用了BPE分词器,而图像输入则被切成不重叠的块,并按照ViT的方式转换成块序列并添加了可学习的位置编码。

然后,我们采用了两个独立的图像编码器 f I ( ⋅ ) f_I(·) fI()和文本编码器 f T ( ⋅ ) f_T(·) fT()来从原始输入中提取特征。对于给定的三元组(h, r, t),实体h和t根据它们的模态(图像或文本)被发送到相应的编码器。关系r由语言标记表示,与文本实体类似,被发送到文本编码器。

与CLIP中的模型结构相比,我们引入了一种修改,以更好地适应我们的框架。具体来说,普通的CLIP模型在两个编码器的最后一层使用池化函数,将特征图压缩成全局表示。也就是说,对于输入 u ∈ R L × d i u ∈ R^{L×d_i} uRL×di,其中 L L L d i d_i di分别表示序列长度和特征维度,编码器的输出可以表示为:
在这里插入图片描述

我们去掉了原始CLIP模型中图像和文本实体的池化函数,以保留局部信息,并使用 x u ∈ R L × d o x_u ∈ R^{L×d_o} xuRL×do作为提取的特征。另一方面,关系通常在有限的序列长度下,例如一个或两个词标记,其中信息密度小于实体。因此,我们保留了关系输入的池化函数,并使用 x ˉ u ∈ R d o \bar{x}_u ∈ R^{d_o} xˉuRdo作为提取的特征。

通过这种方式,我们提取了定义为 ( x h , x ˉ r , x t ) (x_h, \bar{x}_r, x_t) (xh,xˉr,xt)的特征,它们对应于输入三元组 ( h , r , t ) (h, r, t) (h,r,t)中的元素。为了建模三元组中不同元素的联合分布,我们考虑了一个多模态编码器TransEncoder(·)来融合来自不同来源的特征。具体来说,我们首先将三元组中的所有特征连接成单个序列,并在序列的开头使用一个头部标记。为了强调序列中标记的状态,我们考虑了三元组中每个元素h, r, t的额外可学习编码:

在这里插入图片描述

经过多模态编码器处理后,头部标记的特征最终作为整个序列的表示:

在这里插入图片描述

同时,关系表示从相应的标记中提取:

在这里插入图片描述

训练目标

考虑到知识图谱独特数据结构,我们框架主要采用两种类型的训练目标,包括基于三元组的损失和基于图的损失。此外,由于我们框架采用了持续学习策略,我们还考虑了知识蒸馏损失。

  • 基于三元组的损失

对于在输入中缺少某些元素的不完整三元组,可以通过掩蔽相应特征的方式,如等式3中所述,得到类似的连接序列。例如,输入(h, r, -)的连接序列可以表示为:

在这里插入图片描述

在此基础上,给定一组输入 D = { ( h i , r i , t i ) } i = 1 N D = \{{(h_i, r_i, t_i)}\}^N_{i=1} D={(hi,ri,ti)}i=1N,我们首先对一个实体,即ti被掩蔽时的分布进行建模,并通过最小化负对数似然来推导实体-实体(E2E)损失:

在这里插入图片描述

我们还对三元组中关系被掩蔽时的分布进行建模,并类似地推导实体-关系(E2R)损失:

在这里插入图片描述

  • 基于图的损失

我们还利用知识图谱数据集中的图结构,并采用图神经网络提取实体间的更深层次结构信息。我们通过图中连接的边传播信息,并用聚合特征更新实体表示。最后,我们通过计算图中传播前后实体特征的余弦相似度来定义图-实体(G2E)损失:

在这里插入图片描述

  • 知识蒸馏损失
  1. 除了知识图谱数据集,我们还训练我们的模型在几个广泛采用的图像-文本数据集上,这些数据集与CLIP训练数据具有相似的数据分布。为了更好地适应我们的预训练框架,我们将原始的图像-文本对转换为三元组形式,具有专门设计的关系“image of”和“caption of”。

  2. 我们还使用原始的CLIP模型作为教师,并使用辅助损失LKD来衡量CLIP输出与我们模型输出之间的KL距离。

总损失为:

专门设计的关系“image of”和“caption of”。

  1. 我们还使用原始的CLIP模型作为教师,并使用辅助损失LKD来衡量CLIP输出与我们模型输出之间的KL距离。

总损失为:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“Numpy数据分析与挖掘:高效学习重点技能“

目录 # 开篇 # 补充 zeros & ones eye 1. numpy数组的创建 1.1 array 1.2 range 1.3 arange 1.4 常见的数据类型 1.5 astype 1.6 random.random() & round 2. numpy数组计算和数组计算 2.1 reshape 2.2 shape 2.3 将一维数组变成多维数组 2.4 指定一维…

计算给定数字的阶乘

1 问题 计算给定数字的阶乘. 2 方法 使用while循环。使用for循环。使用函数。 通过实验、实践等证明提出的方法是有效的&#xff0c;是能够解决开头提出的问题。 代码清单 1 使用while循环numberint(input(请输入一个数字:))factorial1i1while i<number: factorialfactor…

【问题记录】VsCode中以管理员权限运行Powershell

问题展示 今天在尝试运行nodemon命令的时候出问题&#xff0c;显示没法识别&#xff0c;经过分析发现是管理员权限的问题&#xff0c;由于是在vscode里面进行开发&#xff0c;因此特此进行配置。 方法一 直接在vscode命令行中输入如下命令&#xff1a; Start-Process powers…

【Linux】vim详解

1.什么是vi/vim? 简单来说&#xff0c;vi是老式的文本编辑器&#xff0c;不过功能已经很齐全了&#xff0c;但是还是有可以进步的地方。vim则可以说是程序开发者的一项很好用的工具&#xff0c;就连 vim的官方网站&#xff08; http://www.vim.org&#xff09;自己也说vim是一…

SpringBoot:SpringBoot中如何实现对Http接口进行监控

一、前言 Spring Boot Actuator是Spring Boot提供的一个模块&#xff0c;用于监控和管理Spring Boot应用程序的运行时信息。它提供了一组监控端点&#xff08;endpoints&#xff09;&#xff0c;用于获取应用程序的健康状态、性能指标、配置信息等&#xff0c;并支持通过 HTTP …

使用OpenCV的absdiff函数报错

1.absdiff用法 absdiff函数用于计算两个输入图像之间每个像素的差异&#xff0c;并返回结果图像。 void cv::absdiff ( InputArray src1,InputArray src2,OutputArray dst ) //eg&#xff1a;比较两图像的差异 /*cv::Mat diff;cv::absdiff(depLeft32, imDepth, diff…

CentOS6禁止锁屏

在电源中设置后还是会锁屏, 原因是有屏幕保护程序 电源管理都 “从不” 一些AI的回答 在CentOS 6系统中&#xff0c;如果你想要禁用锁屏功能&#xff0c;可以编辑/etc/kbd/config文件。这个文件通常包含了键盘相关的设置&#xff0c;包括密码策略和屏幕锁定选项。 首先打开终…

Python | Leetcode Python题解之第226题翻转二叉树

题目&#xff1a; 题解&#xff1a; class Solution:def invertTree(self, root: TreeNode) -> TreeNode:if not root:return rootleft self.invertTree(root.left)right self.invertTree(root.right)root.left, root.right right, leftreturn root

Qt 异步实现事件的定时执行 - QTimer和QThread的联合使用

异步实现事件的定时执行 - QTimer和QThread的联合使用 引言一、核心源码二、其信号和槽函数简述三、定时器及其moveToThread简述 引言 在 Qt 中&#xff0c;如果想要定时执行某些事件或函数&#xff0c;通常会使用 QTimer 类。QTimer 允许设置一个时间间隔&#xff0c;当这个时…

MySQL架构你了解多少?

MySQL是一个服务器-客户端应用&#xff0c;MySQL8.0服务器是由连接池、服务管理工具和公共组件、NoSQL接口、SQL接口、解析器、优化器、缓存、存储引擎、文件系统组成。MySQL还为各种编程语言提供了一套用于外部程序访问服务器的连接器。整体架构图如下所示: MySQLConnectors:为…

基于eBPF的procstat软件追踪等待锁和持有锁的时间

在并发编程中&#xff0c;锁的使用是保证线程安全的重要手段。然而&#xff0c;过度使用锁或者锁竞争可能导致性能瓶颈。为了分析程序中锁的使用情况&#xff0c;我们可以借助procstat软件来追踪程序加锁时间和等待锁的时间。procstat是一个基于eBPF&#xff08;extended Berke…

double和float的区别与使用

double和float类型的区别与使用 在Java中&#xff0c;double和float都是基本数据类型&#xff0c;用于表示浮点数&#xff08;即带有小数点的数&#xff09;。 它们在精度和范围上有所不同&#xff1a; double类型提供了更高的精度和更大的范围&#xff0c;而float类型则精度更…

读人工智能全传08人工智能的今天

1. 人工智能的今天 1.1. 未来&#xff0c;或许有些领域会有非常明显的人工智能痕迹&#xff0c;有些领域则不会 1.2. 2018年&#xff0c;来自计算机视觉处理器公司英伟达的研究人员证明了人工智能软件能够创造出虚假的人物照片&#xff0c;并且能够完全…

旷野之间2 - 如何训练医疗保健小型语言模型(AI-SLM)

​​​​ 在本文中,我们将研究如何针对疾病症状训练一个小型医疗保健语言模型。为此,我们将从HuggingFace获取数据集(用于训练我们的模型):https://huggingface.co/datasets/QuyenAnhDE/Diseases_Symptoms QuyenAnhDE/Diseases_Symptoms 数据集来自 Hugging Face。图片来源…

【初阶数据结构】1.算法复杂度

文章目录 1.数据结构前言1.1 数据结构1.2 算法1.3 如何学好数据结构和算法 2.算法效率2.1 复杂度的概念2.2 复杂度的重要性 3.时间复杂度3.1 大O的渐进表示法3.2 时间复杂度计算示例3.2.1 示例13.2.2 示例23.2.3 示例33.2.4 示例43.2.5 示例53.2.6 示例63.2.7 示例7 4.空间复杂…

C语言编程4:复合赋值,递增递减运算符,局部变量与全局变量,本地变量,转义字符

一篇文章带你玩转C语言基础语法4&#xff1a;复合赋值&#xff0c;递增递减运算符&#xff0c;局部变量与全局变量&#xff0c;本地变量&#xff0c;转义字符 一、复合赋值&#x1f33f; 1.1&#x1f4a0;定义 赋值就是给任意一个变量或者常量赋一个值&#xff0c;这个值可以…

《操作系统真象还原》学习笔记:第2章——编写MBR主引导记录

2.1 计算机的启动过程 载入内存&#xff1a; &#xff08;1&#xff09; 程序被加载器&#xff08;软件或硬件&#xff09;加载到内存某个区域 &#xff08;2&#xff09;CPU 的 cs:ip 寄存器被指向这个程序的起始地址 2.2 软件接力第一棒&#xff0c;BIOS 2.2.1 实模式下的…

多模态:Nougat详解

文章目录 前言一、模型结构1. encoder2. decoder3. set 二、数据增强三、数据splitting the pages 四、实验评估repetitions during inference 五、代码1. 环境安装2. Dataset&#xff08;dataset.py&#xff09;3. Model&#xff08;model.py&#xff09; 总结 前言 科学知识…

UML建模工具Draw.io简介

新书速览|《UML 2.5基础、建模与设计实践 Draw.io是一个非常出色的免费、开源、简洁、方便的绘图软件&#xff0c;利用这款软件可以绘制出生动有趣的图形&#xff0c;包括流程图、地图、网络架构图、UML用例图、流程图等。它支持各种快捷键&#xff0c;免费提供了1000多张画图…

【基于深度学习方法的激光雷达点云配准系列之GeoTransformer】——粗配准

【GeoTransformer系列】——粗配准 1.coarse_matching1.1 概要1.2 功能1.3 超参1.4 input1.5 output2 coarse_target2.1 概要2.2 功能2.3 input2.4 output在模型部分有了初步了解之后, 接下来我们对后续的粗配准、精配准等部分依次进行解读. 本篇主要来看粗配准部分, 代码是在G…