BLIP-2小结

2023-10-07 19:44
文章标签 小结 blip

本文主要是介绍BLIP-2小结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

paper:BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models

引用量:376(截止2023-09)

motivation

BLIPv2主要从模态对齐、高效训练两个方向对图文多模态预训练任务(vision-and-language pre-training VLP)做出优化。在模态对齐上提出了一个轻量架构QFormer(querying transformer)来建立图像-文本的桥梁。在高效多模态训练上,结合QFormer提出一种二阶段预训练范式。在VQAv2任务上,仅用了 1 54 \frac{1}{54} 541倍Flamingo80B的训练数据,却带来8.7%精度提升。

method

模型架构

**BLIP2的核心是引入了QFormer(Querying Transformer)模块来将对齐图片特征与文本特征。**QFormer内部包含两个transformer子模块,其一为image transofmrer,其二是text-transformer。image transformer比text-transformer多了一个cross-attention层,这两个transformer共享Self-Attention参数,如下图所示。
在这里插入图片描述

PS: 作者源码中用一个Bert模型来实现QFormer,通过魔改BertLayer实现通过条件判断来确定走image transformer分支还是text-transformer分支。感兴趣的同学可以深入看一下源码,核心逻辑位于:
lavis/models/blip2_models/Qformer.BertLayer

这里面有一个需要注意的点:作者没有将image encoder得到的image embedding作为image transformer的输入,而是定义了一个可训练的query作为输入。image embedding用作cross attention层的key, value。

这个地方理解可能比较难,尝试直觉的解释一下。NLP任务的transformer会对输入的token新增[CLS]token,通过训练将文本的信息融入到【CLS】token中。在分类、检索等下游任务中将【CLS】token对应位置的输出作为文本的表征。这里放一张图便于理解观察shape变化(忽略了batch size维度)。

在这里插入图片描述

类似的,QFormer定义了learning query通过训练将与文本对齐后的图片的信息融入到learning query中。与NLP不同的是:

  • QFormer的image-transforme没有将图片的embedding作为输入和[CLS]token组合起来送入模型,而是将image embedding作为cross-attention的key,value。
  • QFormer的image-transforme输入的【CLS】 token有多个(姑且这么称呼,论文称为learned queries,其实是一回事),而NLP中只有一个【CLS】token。

PS: 这种做法现在CV里面很常用。如Dalle2中的DiffusionPrior模块,diffusion model中的text inversion技术都用到了类似的思想。

QFormer的整体pipeline如下图所示,为了便于理解同时给出了shape变化(忽略了batch size维度)。image encoder是eva_clip_g

在这里插入图片描述

2.2 多模态预训练任务

BLIP2的预训练任务分为两个阶段。第一个阶段用于对齐多模态表征。主要通过Image-Text Contrastive Loss (ITC)、 Image-text matching (ITM)、Image-grounded Text Generation3个任务的联合训练来实现。第二个阶段用于让LLM理解第一个阶段产生的soft visual prompt的语义,从而借助LLM强大的知识库实现视觉推理等更为复杂的任务,主要通过language modeling(LM)任务的训练来实现。

BLIP2的预训练任务同样用了BLIP提出的boostrapping caption(也称为CapFilt method)技术。

2.2.1 多模态表征对齐预训练

主要通过ITC、ITM, ITG三个预训练任务来对齐QFormer产生的文本表征与图片表征。三个预训练任务联合优化。

Image-Text Contrastive Loss (ITC)

与常规ITC任务不同的是:单个图片BLIP2产生的image embedding有32个(等于learned query的数量),而text embedding只有1个。BLIP2的操作是,同时计算32个image embedding与text embedding的距离,仅取最近的计算loss

下图详细梳理了整体pipeline及对应的shape变化(忽略了batchsize)

在这里插入图片描述

Image-text matching (ITM)

图片匹配的整体架构如下图所示。此时会将query embedding与text embedding拼接起来作为输入,送入到QFormer中的Image Transformer中。最后对Qformer在query embedding位置的输出向量取平均后进行预测。下图中详细展示了整体pipeline与shape变化(包含batch size维度)。

在这里插入图片描述

Image-grounded Text Generation (ITG)

此处直接用QFormer的text transformer做image caption任务。有一个细节值得注意:作者将图片与文本表征的交互放到了self-attention中。下图是摘取的部分self-attention层代码。

在这里插入图片描述

2.2.2 多模态表征理解预训练

通过2.2.1我们得到一个训练好的QFormer,这个QFormer能够实现将图片转为一个32x768(用32个token来表征图像)。2.2.2的任务是让预训练的LLM模型能够理解上述的图片表征,从而借助LLM强大的知识库来实现问答、推理等任务。也就是说,这一阶段我们需要通过训练来赋予图片token能被LLM理解的语义。

这一步的训练比较简单。固定image encoder与预训练的LLM模型,仅训练QFormer和新增的一个投影层。训练任务为language modeling。最终实现QFormer输出的图片表征(论文称之为soft visual prompt)变成LLM能看懂的样子。

在这里插入图片描述

3 小结

BLIP2通过QFormer模块与二阶段训练的范式,将目前的视觉backbone与LLM模型链接起来。

这篇关于BLIP-2小结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

mybatis映射器配置小结

《mybatis映射器配置小结》本文详解MyBatis映射器配置,重点讲解字段映射的三种解决方案(别名、自动驼峰映射、resultMap),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定... 目录select中字段的映射问题使用SQL语句中的别名功能使用mapUnderscoreToCame

Vue和React受控组件的区别小结

《Vue和React受控组件的区别小结》本文主要介绍了Vue和React受控组件的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录背景React 的实现vue3 的实现写法一:直接修改事件参数写法二:通过ref引用 DOMVu

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

Java Stream 并行流简介、使用与注意事项小结

《JavaStream并行流简介、使用与注意事项小结》Java8并行流基于StreamAPI,利用多核CPU提升计算密集型任务效率,但需注意线程安全、顺序不确定及线程池管理,可通过自定义线程池与C... 目录1. 并行流简介​特点:​2. 并行流的简单使用​示例:并行流的基本使用​3. 配合自定义线程池​示

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.

Go之errors.New和fmt.Errorf 的区别小结

《Go之errors.New和fmt.Errorf的区别小结》本文主要介绍了Go之errors.New和fmt.Errorf的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考... 目录error的基本用法1. 获取错误信息2. 在条件判断中使用基本区别1.函数签名2.使用场景详细对

C#异步编程ConfigureAwait的使用小结

《C#异步编程ConfigureAwait的使用小结》本文介绍了异步编程在GUI和服务器端应用的优势,详细的介绍了async和await的关键作用,通过实例解析了在UI线程正确使用await.Conf... 异步编程是并发的一种形式,它有两大好处:对于面向终端用户的GUI程序,提高了响应能力对于服务器端应

MySQL慢查询工具的使用小结

《MySQL慢查询工具的使用小结》使用MySQL的慢查询工具可以帮助开发者识别和优化性能不佳的SQL查询,本文就来介绍一下MySQL的慢查询工具,具有一定的参考价值,感兴趣的可以了解一下... 目录一、启用慢查询日志1.1 编辑mysql配置文件1.2 重启MySQL服务二、配置动态参数(可选)三、分析慢查

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c