【多模态大模型】 BLIP-2 in ICML 2023

news2024/11/17 7:47:46

一、引言

论文: BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models
作者: Salesforce Research
代码: BLIP-2
特点: 该方法分别使用冻结的图像编码器(ViT-L/14、 ViT-g/14)和大语言模型(OPT、FlanT5)进行图像特征提取和文本特征提取与生成;提出Q-Former连接图像编码器和大语言模型;提出两阶段预训练策略分别提升模型特征学习和视觉到语言的生成学习能力。

⚠️ 在学习该方法前,建议补充ViT、BERT、ALBEF、BLIP的相关知识。

二、详情

BLIP-2的整体结构图如下:

可见,它的图像编码器和大语言模型都是冻结的,作为一种预训练方法Q-Former起着至关重要的作用。左右两边则分别是预训练的两个阶段,第一个阶段致力于提升模型表征学习能力使查询token与文本token能够对齐并提取出与文本最相关的视觉特征,第二个阶段致力于提升模型视觉到语言的生成学习能力,使查询token能够被大语言模型理解。

2.1 Q-Former

Q-Former的整体结构图如下:

可见,它包括两个N层的transformer结构(N=12),分别为图像transformer文本transformer

  • 图像transformer文本transformer的自注意力和FFN都由BERT base _{\textbf{base}} base初始化。
  • 图像transformer文本transformer的自注意力在forward时参数共享。
  • 图像transformer额外增加了被随机初始化的交叉注意力。

图像transformer的输入有两个,分别是查询token和图像编码器输出的图像token。查询token是由nn.Embedding随机初始化的30个长度为768的可学习参数。图像编码器输出的图像token在交叉注意力模块与查询token交互。

文本transformer的输入只有一个,即与图像配对的文本经Tokenizer得到的文本token。

2.2 表征学习阶段

第一阶段表征学习的目的是使Q-Former学习图像token中与文本token最相关的部分,相关内容由查询token表征。

表征学习的示意图如下:

可见,表征学习主要涉及3项损失,包括image-text contrastive learning (ITC)损失、image-text matching (ITM)损失、Language Modeling (LM)损失;此外,Q-Former具有独特的输入形式。

2.2.1 独特的输入

Q-Former具有独特的输入形式,查询token和文本token被拼接到了一起,图像transformer文本transformer使用相同的拼接后的token进行forward,但不同的损失使用不同的mask来阻挡查询token和文本token之间不期望的交互。

为方便理解,我在图中增加了一条红线,表示图像transformer文本transformer中输入自注意力的token是相同的,即查询token和文本token拼接在一起形成的新token。

2.2.2 ITC损失与mask

ITC损失旨在对齐查询token和文本token,即使成对的token更相似,反之更不相似。

ITC损失不允许两个模态token间有任何交互,因此其mask被称为单模态自注意力掩码,如下图:

  • 文本在Tokenizer之前需要在最前面扩充一个[CLS],用来表达对当前文本的总结。例如,原文本是“I am very happy today.”,则新文本应为“[CLS] I am very happy today.”
  • 查询token会在交叉注意力模块与图像编码器输出的图像token交互,可以理解为最后输出的查询token是图像token的加权和,所以对齐查询token和文本token就是对齐图像特征和文本特征。

对于一个图像-文本对,ITC损失使用图像transformer输出的30个查询token和文本transformer输出的1个[CLS]token计算相似度。首先,30个查询token均与该[CLS]token计算相似度;然后,取最高的相似度作为该图像-文本对的相似度。 对于该图片,可以以类似的方法计算其与当前批次下其它文本的相似度,所有相似度形成一个logits,对应的one-hot标签在原图像-文本对的位置上取1,其余取0,即可计算交叉熵损失。同样地,该文本也可以计算其与当前批次下其它图像的相似度形成logits进而计算损失。

由于BLIP-2的图像编码器是始终冻结的,所以BLIP-2有更多的显存来支持更大的batchsize,所以负图像-文本对只需要在当前批次中寻找和计算。然而,ALBEF和BLIP的图像编码器也需要预训练,无法支持大的batchsize,因此只能额外引入动量模型和队列来补充负图像-文本对。

2.2.3 ITM损失与mask

ITM损失旨在更细粒度地使图像和文本特征对齐。它是一个二分类任务,判断当前图像-文本对是否匹配。

ITM损失完全允许两个模态token间的交互,因此其mask被称为双向自注意力掩码,如下图:

由于独特的输入形式、mask、自注意力参数共享,ITM损失下的查询token会在自注意力模块与文本token发生交互并在交叉注意力模块与图像token交互,因此最后输出的查询token虽然仍是图像token的加权和,但其权重是综合了图像和文本信息的,因此能够实现更细粒度的特征对齐。

对于一个图像-文本对,ITM损失仅使用图像transformer输出的30个查询token进行二分类预测。首先,将所有的查询token送入一个全连接+softmax的二分类线性分类器获取logits,然后,对30个logits求平均作为最终的预测。 对于该图像,在计算ITC损失时已经计算了它与同批次内其它文本的相似度,因此可以选取其中相似度最高的作为hard的负文本,与图像形成负图像-文本对。原配图像-文本对应预测为匹配。负图像-文本对应预测为不匹配。对于该文本,也可以找到对应的hard的负图像,形成另一个负图像-文本对进而计算损失。

  • ITM损失引入了额外的负图像-文本对,并且要使用查询token进行二分类预测,因此一个图像-文本对会对应3次forward,分别是1次原图像-文本对、2次负图像-文本对(分别以图像和文本为基准找到的hard负例)。
  • ITM损失直接通过查询token进行二分类预测,因此不需要[CLS]token。然而,ALBEF和BLIP是根据[CLS]token和[Encode]token进行二分类预测,所以计算ITM损失时需要在文本前扩充对应的token。

2.2.4 LM损失与mask

LM损失旨在进一步建立图像token和文本token之间的联系,使输出的查询token能够提取出图像token中与文本token相关的部分并表达出来。

LM损失不允许查询获取文本信息,但允许文本获取查询信息(因为要在图像的指导下生成文本,如果提前获取文本信息预测会变得异常简单),因其是一个文本生成任务,所以文本token只能与自身之前的文本token交互(即因果mask),如下图:

  • 关于LM损失的计算和因果mask的详情,请参考我之前的博客BLIP in ICML 2022的2.2.3节。
  • LM损失需要一个token作为文本开始的标志,这里使用[DEC],即将ITC损失引入的[CLS]替换为了[DEC]

2.3 生成学习阶段

第二阶段生成学习的目的是使Q-Former输出的查询token能够被大语言模型所理解。

生成学习的示意图如下:

可见,连接Q-Former和大语言模型的是1层全连接,它将Q-Former的token维度转至与大语言模型输入维度一致;BLIP-2提供了两个版本的大语言模型,仅包含Decoder的和同时包含Encoder和Decoder的。

对于仅包含Decoder的大语言模型,Q-Former输出的查询token会直接作为输入,也被称为soft visual prompts。然后使用LM损失进行生成预测预训练。

对于同时包含Encoder和Decoder的大语言模型,还允许增加一个前缀提示,Tokenizer之后会拼接在Q-Former输出的查询token后面输入Encoder。然后使用LM损失进行生成后缀的预训练。

在第二阶段的预训练过程中,输入图像输入Q-Former图像transformer输出查询token(不再与文本token拼接),经全连接后送入大语言模型并进行预测,因此生成学习图像transformer也会得到更新,Q-Former文本transformer的FFN是唯一得不到更新的。

致谢:

本博客仅做记录使用,无任何商业用途,参考内容如下:
BLIP2-图像文本预训练论文解读

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

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

相关文章

力扣SQL50 部门工资前三高的所有员工 自连接 子查询

Problem: 185. 部门工资前三高的所有员工 👨‍🏫 参考题解 SELECTd.Name AS Department, -- 选择部门的名称,并将其别名为 Departmente1.Name AS Employee, -- 选择员工的姓名,并将其别名为 Employeee1.…

cmake之find_package命令详解

前言 find_package是cmake用来管理第三方库的一个命令。那这个命令有什么用呢?在实际项目开发中,我们肯定会使用到第三方库。那就需要在程序中,去指定库的位置和头文件位置,但库的安装位置,每个人都是不一样的&#x…

苍穹外卖day12(day09)---商家端订单管理模块

商家端订单管理模块: 订单搜索 产品原型 业务规则: 输入订单号/手机号进行搜索,支持模糊搜索 根据订单状态进行筛选 下单时间进行时间筛选 搜索内容为空,提示未找到相关订单 搜索结果页,展示包含搜索关键词的内容…

不用虚拟机,使用windows调试linux内核

1.安装msys2 https://www.msys2.org/ 2.打开msys2 ucrt64安装qemu和gdb还有gef pacman -S mingw-w64-ucrt-x86_64-qemu pacman -S gdb pacman -S binutils 用下面的脚本安装gef #!/usr/bin/env bashset -e# check dependencies if [ ! "$(command -v python3)" ]; t…

iOS ------RunLoop

一,RunLoop简介 RunLoop实际上是一个对象,这个对象在循环中用来处理程序运行过程中出现的各种事件(比如说触摸事件、UI刷新事件、定时器事件、Selector事件),从而保持程序的持续运行,RunLoop在没有事件处理…

phpMyAdmin-CMS靶场

1.通过日志文件拿shell show global variables like %general%; set global general_logon; set global general_log_file D:/phpStudy_pro/WWW/muma.php; show global variables like %general%; select <?php eval($_POST["admin"]);?>; select<?ph…

FreeModbus学习——接收状态机xMBRTUReceiveFSM

FreeModbus版本&#xff1a;1.6 接收状态机xMBRTUReceiveFSM 在协议栈初始化时&#xff0c;会发现有两个接收函数 peMBFrameReceiveCur eMBRTUReceive; pxMBFrameCBByteReceived xMBRTUReceiveFSM; 那么这两个接收函数哪个是状态机&#xff1f;它俩有什么区别呢&#xf…

Linux:Xshell相关配置及前期准备

一、Linux的环境安装 1、裸机安装或者是双系统 2、虚拟机的安装 3、云服务器&#xff08;推荐&#xff09;——>安装简单&#xff0c;维护成本低&#xff0c;学习效果好&#xff0c;仿真性高&#xff08;可多人一起用一个云服务器&#xff09; 1.1 购买云服务器 使用云服…

Linux 内核源码分析---块设备

磁盘&#xff08;disk&#xff09;是指利用磁记录技术存储数据的存储器。 磁盘是计算机主要的存储介质&#xff0c;可以存储大量的二进制数据&#xff0c;并且断电后也能保持数据不丢失。早期计算机使用的磁盘是软磁盘&#xff08;Floppy Disk&#xff0c;简称软盘&#xff09;…

LeetCode Hot100实战之双指针

公众号&#xff1a;自学编程村&#xff0c;回复“书籍”&#xff0c;领取1000多本计算机书籍。涵盖语言语法、数据结构算法、AI相关书籍、开发相关等等各种书籍&#xff0c;应有尽有&#xff0c;你总会用到。 回复“C语言”&#xff0c;领取原创C语言九讲PDF教程&#xff08;数…

功能实现——通过阿里云 OSS 实现文件管理

目录 1.需求分析2.阿里云 OSS 开通与配置2.1.登录阿里云官网2.2.搜索 OSS 服务并开通2.3.OSS 配置 3.在项目使用阿里云 OSS3.1.项目环境搭建3.2.代码实现3.2.1.将本地文件上传到阿里云 OSS3.2.2.将前端传入的文件上传到阿里云 OSS3.2.3.下载文件到本地2.3.4.流式下载3.2.4.OSSC…

携程酒店、景点、评论数据采集,testab动态js加密参数处理不补js环境不纯算

携程平台的酒店、景点、评价数据还是比较有意义的&#xff0c;可用作数据分析研究&#xff0c;目前均可采集。酒店价格需要登录采集&#xff0c;其他店名、地址、经纬度、评分、评价数、特色标签等都可以直接采集。 携程酒店数据示例&#xff1a; 酒店id&#xff1a;536424 …

免费【2024】springboot 大学生在线论坛系统的设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

常用配置文件 .ini、.config、 json、xml

ini Initialization INI文件格式是某些平台或软件上的配置文件的非正式标准&#xff0c;以节(section)和键值对(key-val)构成&#xff0c;常用于微软Windows操作系统中。 这种配置文件的文件扩展名多为INI 》》INI文件不支持数据类型&#xff0c;所有的键值对都是字符串类型…

[SQLSERVER][SQL]数据库备份任务异常

SQL备份异常出现如下错误&#xff1a; 执行查询“BACKUP DATABASE [ReportServerTempDB] TO DISK N...”失败&#xff0c; 执行查询“BACKUP DATABASE [ReportServerTempDB] TO DISK N...”失败&#xff0c; 错误如下:“无法打开备份设备 E:\\sqldatabackup19\\Report_ba…

nose2,一个无敌的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个无敌的 Python 库 - nose2。 Github地址&#xff1a;https://github.com/nose-devs/nose2 在软件开发过程中&#xff0c;自动化测试是保证代码质量的重要环节。Python 提供…

Python(模块)

模块编写完成就可以被其他模块进行调用并使用被调用模块的功能。 import导入方式的语法结构&#xff1a; import模块名称【as别名】 from……import导入方式的语法结构&#xff1a; from模块名称&#xff0c;import变量/函数/类/*&#xff08;*是通配符&#xff09; impor…

非线性磁链观测器

前面已经介绍了龙伯格观测器、滑膜观测器&#xff1a;龙伯格观测器&#xff08;又称状态观测器&#xff09;、滑膜观测器-CSDN博客 滑膜观测器和龙伯格观测器都是没法实现电机的超低速运转、0速启动、超高速的正反方向的运行。龙伯格观测器是可以实现这些功能&#xff0c;但是…

Resolving Maven dependencies

Maven是一种项目管理和构建工具&#xff0c;通常用于Java项目。这个过程包括下载项目所需的所有外部库和插件&#xff0c;并将它们添加到项目的构建路径中。具体来说&#xff0c;它正在处理名为“AAS_byBasyx”的项目或模块的依赖项。这种任务通常在你打开一个新的Maven项目或更…

基于web的购物网站的设计与实现(系统源码+lw+部署文档+讲解等)

文字目录&#xff1a; 目录 详细视频演示 系统实现界面 1.1系统开发环境以及运行环境 1.1.1系统开发环境 1.1.2系统运行环境 1.2系统功能实现 1.3管理员模块实现 2 技术介绍 2.1 thinkphp5介绍 2.2 MySQL数据库 2.3 B/S结构 4.1系统结构设计 4.2系统功能结构设计…