【多模态大模型】 BLIP-2 in ICML 2023
一、引言
论文: 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-图像文本预训练论文解读
相关文章:

【多模态大模型】 BLIP-2 in ICML 2023
一、引言 论文: BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models 作者: Salesforce Research 代码: BLIP-2 特点: 该方法分别使用冻结的图像编码器(ViT-L/…...

HPC高性能计算平台
随着技术的发展和数据量的爆炸性增长,企业面临的挑战日益复杂,对计算能力的需求也在不断增加。这些问题的解决超出了传统计算方法的能力范围,高性能计算(HPC)正是为解决这类问题而生。 高性能计算(HPC&…...

前端常用的几个工具网站
觉得不错的前端工具类网站 1、Grid布局生成 https://cssgrid-generator.netlify.app 2、拟物按钮样式生成 https://neumorphism.io 3、玻璃形态效果 在线制作CSS玻璃形态 4、一些Button、checkBox、switch、card的css样式 零代码 - 精美CSS样式库 5、CSS阴影生成 在线创建…...

支付功能之代收代付
有很多老板问小编:“这个分账功能好是好,也能搞定项目中的二清问题和税务纠纷,但还是太复杂了,每次要添加被分账对象都需要提交材料进行审核,太繁琐了,有没有更方便快捷的支付产品来解决资金问题࿱…...

QPixmap
pixel[ˈpɪksl]像素 QPixmap 是 Qt 框架中用于处理图像的一个类。它主要用于在屏幕上显示和处理图像,提供了许多实用的功能,如加载、保存、缩放、旋转、合并等。 绘制 从文件加载:从指定文件加载图像。 QPixmap pixmap(":/images/exam…...

Laravel门面之下:构建自定义门面应用的艺术
Laravel门面之下:构建自定义门面应用的艺术 在Laravel框架中,门面(Facade)提供了一种将类静态调用与面向对象代码解耦的优雅方式。门面是一个全局可访问的类,它为底层复杂的服务提供了一个简单的接口。然而࿰…...

智启万象 | 2024 Google 开发者大会直播攻略
8 月 7 日上午 9:30 2024 Google 开发者大会 主旨演讲直播将准时开启 想要在线上探索大会精彩内容? 快查收这份观看指南! 8 月 7 日上午 9:30 2024 Google 开发者大会开幕 锁定大会官网观看主旨演讲现场直播! 本次大会内容将同步于多个…...

技巧:print打印内容到控制台时信息显示不全
# 请求一个接口,res是响应内容,使用res.text打印的信息不全 #使用流式处理响应 #如果你需要流式处理大的响应,确保你在处理响应内容的同时不会提前结束流。resself.request_base(select_api,change_datachange_data)print("")# pri…...

3.表的操作
目录 创建表 创建表案例: 查看表结构 修改表 1.增加新列 2.修改列的属性 3.删除列 4.修改表名 5.修改列 删除表 创建表 语法: CREATE TABLE [IF NOT EXISTS] table_name(field1 datatype1 [COMMENT 注释信息],field2 datatype2 [COMMENT 注释…...

AI回答:C#项目编译后生成部分文件的主要职责
【引入】以ConsoleApp1为例,请问C#编译之后以下文件有啥用 1.bin\runtimes 文件夹存放什么,有什么用? bin\runtimes 文件夹存放了项目的运行时相关文件,这些文件包括了各种目标平台的运行时库。 2.bin\生成的exe文件可以在别的电脑…...

RPC通信的简单流程
远程调用者假设需要调用Login方法,将调用的信息通过muduo库,同时进行了序列化和反序列化,发送到Rpcprovider上,RpcProvider通过对象和方法表来确定需要调用哪个服务对象的哪个方法。 UserRpcServiceRpc和UseRpcServiceRpcStub是继…...

前端发版(发包)缓存,需要强制刷新问题处理
问题原因: 浏览器问题 一、创建初始版本文件(public/version.json) { "version": "1722240835844" }二、设置版本判断(version.js) import axios from "axios";const isNewVersion () > {let baseUrl …...

洛谷练习(8.4/8.5)
题目 P2036 PERKET题目描述思路代码 P3799 小 Y 拼木棒题目描述思路代码 P1010 幂次方题目描述思路代码 P1498 南蛮图腾题目描述思路代码 P1928 外星密码题目描述思路代码 P2036 PERKET 题目描述 比较苦度和酸度的最小差值 思路 搜索最小差值 代码 void dfs(int sd,int k…...

DLMS/COSEM中的信息安全:加密算法(下)1
4.公钥算法 4.1概述 一般来说,公钥密码系统使用难以解决的问题作为算法的基础。RSA算法基于非常大的整数的素因子分解。椭圆曲线密码学(ECC)是基于求解椭圆曲线离散对数问题(ECDLP)的难度。与RSA相比,ECC提供了相似的安全级别,但密钥大小明显减少。ECC特别适用于嵌入式…...

ES6中的Promise、async、await,超详细讲解!
Promise是es6引入的异步编程新解决方案,Promise实例和原型上有reject、resolve、all、then、catch、finally等多个方法,语法上promise就是一个构造函数,用来封装异步操作并可以获取其成功或失败的结果,本篇文章主要介绍了ES6中的P…...

Modbus poll和Modbus Mbslave的使用
读取Modbus Mbslave中的数据 首先创建COM1和COM2端口 然后 using System.IO.Ports; namespace 通信 {internal class Program{static void Main(string[] args){Console.WriteLine("Hello, World!");SerialPort serialPort new SerialPort("COM1",960…...

树莓集团的全球化征程:数字媒体产业的本土与国际布局
在全球数字化转型的浪潮中,树莓集团正稳步推进数字媒体产业从本土到国际的全球化布局。在数字媒体产业这一新兴且充满活力的领域中,树莓集团不仅在国内市场树立了标杆,更以其独特的全球化战略布局,引领着行业的未来趋势。 本土深耕…...

LeetCode面试150——274H指数
题目难度:中等 默认优化目标:最小化平均时间复杂度。 Python默认为Python3。 目录 1 题目描述 2 题目解析 3 算法原理及代码实现 3.1 排序 3.2 排序时间优化(计数排序) 3.3 二分查找 参考文献 1 题目描述 给你一个整数数组 citations …...

【Linux】Linux重定向指南:探索输出重定向与追加重定向的奥秘!
欢迎来到 CILMY23 的博客 🏆本篇主题为:Linux重定向指南:探索输出重定向与追加重定向的奥秘! 🏆个人主页:CILMY23-CSDN博客 🏆系列专栏:Python | C | C语言 | 数据结构与算法 | 贪…...

Spring AI -快速开发ChatGPT应用
Spring AI介绍 Spring AI是AI工程师的一个应用框架,它提供了一个友好的API和开发AI应用的抽象,旨在简化AI应用的开发工序,例如开发一款基于ChatGPT的对话、图片、音频等应用程序。 Spring AI已经集成了OpenAI的API,因此我们不需…...

Modern C++ 智能指针
Why? 原始指针存在缺陷,不符合现代编程语言的需要。 原始指针的缺陷: 指针指向一片内存,使用者无法得知到底是指向了什么,是数组还是对象?使用完指针是否需要销毁?什么时候销毁?如…...

Python的100道经典练习题,每日一练,必成大神!!!
Python的100道经典练习题是一个广泛而深入的学习资源,可以帮助Python初学者和进阶者巩固和提升编程技能 完整的100多道练习题可在下面图片免沸获取哦~ 整理了100道Python的题目,如果你是一位初学者,这一百多道题可以 帮助你轻松的使用Python…...

代码回滚命令
定位到当前分支 git branch回滚到指定的commit git reset --hard 85da0cb8322accad143cpush到远程分支 git push --force...

[ASIS 2019]Unicorn shop1
打开题目 随便输入信息看一下 操作失败,只让输入一个字符 不妨抓包看一下,信息,发现 从中可以发现源代码是如何处理price的 使用的是unicodedata.numeric() 但我们查看页面源码时,看到源码处理方式是utf-8 所以,前…...

LangChain与泛型编程:探索代码生成的新维度
LangChain与泛型编程:探索代码生成的新维度 在软件开发领域,泛型编程是一种允许创建可重用组件的技术,这些组件可以在多种数据类型上工作的编程范式。LangChain作为一个假设的编程辅助工具,如果存在,它可能会支持泛型…...

day25
一、进程间通信(IPC) 1.1 进程间通信的引入 1> 对于多个线程之间通信,我们可以使用临界资源来完成,通过一个线程任务对临界资源进行修改,另一个线程也可以使用已经修改过的临界资源,但是要注意使用…...

红黑树的概念和模拟实现[C++]
文章目录 红黑树的概念一、红黑树的性质红黑树原理二、红黑树的优势和比较 红黑树的模拟实现构建红黑树的数据结构定义节点的基本结构和初始化方式插入新节点插入新节点的颜色调整颜色和结构以满足红黑树性质 红黑树的应用场景 红黑树的概念 一、红黑树的性质 红黑树是一种自平…...

网络安全应急响应概述
前言 在网络安全领域,有一句广为人知的话:“没有绝对的安全”。这意味着任何系统都有可能被攻破。安全攻击的发生并不可怕,可怕的是从头到尾都毫无察觉。当系统遭遇攻击时,企业的安全人员需要立即进行应急响应,以将影响…...

【C++】链表操作技巧综合:重排链表(带你理顺链表的做题思路)
1.题目 2.算法思路 这是一道关于链表的综合题,一共涉及到三个步骤,其中每个步骤单拎出来就可以当一道单独的题目。所以需要大家对链表的操作十分熟悉,否则可能需要大量的时间做这道题目,而且还要很多的bug。 第一个步骤…...

行为型设计模式2:观察者/职责链/中介者/访问者
设计模式:观察者/职责链/中介者/访问者 (qq.com)...