BLIP2——采用Q-Former融合视觉语义与LLM能力的方法

BLIP2——采用Q-Former融合视觉语义与LLM能力的方法
FesianXu 20240202 at Baidu Search Team

前言

大规模语言模型(Large Language Model,LLM)是当前的当红炸子鸡,展现出了强大的逻辑推理,语义理解能力,而视觉作为人类最为主要的感知世界的手段,亟待和LLM进行融合,形成多模态大规模语言模型(Multimodal LLM, MLLM),BLIP-2这篇文章利用已经充分训练好的图片编码器和LLM模型,通过Q-Former巧妙地融合在一起,在引入少量待学习参数的同时,取得了显著的效果。本文将对BLIP2进行笔记和笔者个人感想纪录,希望对诸位读者有所帮助。如有谬误请见谅并联系指出,本文遵守CC 4.0 BY-SA版权协议,转载请联系作者并注明出处,谢谢。

∇ \nabla 联系方式:

e-mail: FesianXu@gmail.com

github: https://github.com/FesianXu

知乎专栏: 计算机视觉/计算机图形理论与应用(https://www.zhihu.com/column/c_1265262560611299328)

微信公众号:机器学习杂货铺3号店


笔者最近忙于工作,已经很久没空更新博客,刚好最近在回顾一些论文,顺便将其进行笔记。BLIP2的目的是希望将现有可用的(预训练好的)视觉编码器和LLM中进行融合得到MLLM,而如何将视觉语义向量和LLM进行融合是一件极具有挑战性的工作。LLM是以文本语义为目标进行训练的,而视觉编码器是以视觉语义为目的进行训练的,视觉语义即便经过了语义对齐,如通过CLIP等方式进行跨模态语义对齐,其语义和LLM之间也会存在较大的区别,如何融合这两种语义信息,是MLLM模型必须解决的问题,而BLIP2 [1]就提出了采用Q-Former的方法进行解决。

不过在深入介绍BLIP2的内容之前,我们不妨先卖个关子,先给自己10分钟思考,如果让我们设计一个简单的融合视觉语义和LLM语义的方法,我们会怎么做呢?笔者能想到的方法,会类似于LLaVA [2],通过Image/Video Caption模型对图片/视频进行文字描述(场景、事件、实体等等),然后利用LLM,在合适的prompt下对这段文字描述进行总结后,输入到LLM中作为输入,从而间接地引入了视觉语义信息到LLM中,流程可见Fig 1.所示。这种通过视觉Captioner间接地将视觉语义转换成文本语义(语义转换阶段),然后通过Prompt+LLM的方式更好地适配文本语义(语义适配阶段),最后将其作为目标LLM的输入从而构成MLLM的方法(语义融合阶段)。这种思路直接且容易操作,但是其缺陷也很明显,这里的每个阶段都存在信息损失,最终的MLLM模型对原始视觉的细粒度信息无法感知,这显然严重限制了MLLM的上限。

fig1_naive_fusion

Fig 1. 一种朴素的,通过Captioner间接地将视觉语义转换成文本语义,通过prompt+LLM的方式进行合适的语义适配后,作为目标LLM的输入,从而构成了MLLM。

不过这种思路是可以进行扩展的,其实在以上的三个阶段中,信息损失最为严重的就是语义转换阶段和语义适配阶段,如果我们对视觉语义的转换不是以文字描述的形式,而是语义向量的形式,会不会信息损失控制得最少呢?同时,对于语义适配的过程,我们不采用“硬prompt”,而是可学习的“软prompt”是不是也能进一步提升效果呢?其实这也就是BLIP2中的Q-Former的主要思路了,Q-Former主体如Fig 2.所示,图片通过预训练好的图片编码器进行特征提取后得到视觉语义 f v ∈ R M × D f_{v} \in \mathbb{R}^{M \times D} fvRM×D。我们给定 K K K个可学习的"软prompt",在此处称之为"Learnable Queries",符号表示为 V Q ∈ R K × D V_Q \in \mathbb{R}^{K \times D} VQRK×D,这些prompt的作用类似于prompt tuning [3]中进行下游任务迁移的作用,是为了更好的进行视觉语义到文本语义的迁移,从而产出的Transferred vision representation可表示为 E V ∈ R K × D E_V \in \mathbb{R}^{K \times D} EVRK×D,则可以作为输入,喂给后续的LLM。为了让 E V E_V EV包含有充分的视觉语义,Q-Former采用了交叉注意力机制(Cross Attention, xattn)融合图片语义和可学习Q,公式如(1)所示。
x a t t n ( Q , K , V ) = s o f t m a x ( Q K T + m a s k d k ) V K = V = f v ∈ R M × D Q = V Q ∈ R K × D m a s k ∈ R K × M (1) \begin{align} xattn(Q, K, V) &= \mathrm{softmax}(\dfrac{QK^{\mathrm{T}}+mask}{\sqrt{d_k}}) V \\ K &= V = f_v \in \mathbb{R}^{M \times D} \\ Q &= V_Q \in \mathbb{R}^{K \times D} \\ mask & \in \mathbb{R}^{K \times M} \end{align} \tag{1} xattn(Q,K,V)KQmask=softmax(dk QKT+mask)V=V=fvRM×D=VQRK×DRK×M(1)
总结来看,Q-Former和Fig 1.提到的朴素方法其实可以类比,Learnable Queries可以类比为对文字描述进行总结的prompt词, 而产出的Transferred vision representation可以类比经过LLM总结后的文字描述。

fig2_qformer

Fig 2. BLIP2中的Q-Former的基本组成。

Q-Former进行视觉语义表征迁移的方式,其实是受启发自Flamingo [4] 中的Perceiver Resampler的设计,此处毕竟不是Flamingo的主场因此不打算对其进行展开介绍,但是笔者觉得有必要对Perceiver Resampler的设计进行简述,会加深读者对Q-Former的理解,如Fig 3所示,由于Flamingo是对图片、视频进行处理的,因此Perceiver Resampler需要将可能变长的视频帧信息转化为固定大小长度的特征,否则过长的视频帧会大大加大后续LLM的计算负担。Perceiver Resampler考虑采用learnable latent queries作为交叉注意力中的Q,而将视频帧/图片帧进行特征提取后展开表示为 X f X_f Xf,和Q拼接起来作为交叉注意力中的K和V,通过这种方法将learnable latent queries对应位置的Transformer输出作为视觉特征聚合表示,这样变长的视频帧特征就规整为了固定大小的特征,方便了后续的处理。

fig3_flamingo_perceiver_resampler

Fig 3. Flamingo中Perceiver Resampler的设计。

到此为止我们算是对Q-Former的设计初衷和设计进行了介绍,接下来才开始对BLIP2这篇工作进行整体介绍,我们要如何训练Q-Former呢?BLIP2的训练分为两个阶段,如下所示。

  1. 第一阶段,训练Q-Former实现跨模态表征的语义融合
  2. 第二阶段,将训练好的Q-Former和LLM进行结合,实现MLLM

在第一阶段中,为了对Q-Former进行充分训练,作者精妙地设计了三种类型的损失,分别是对比损失(Image-Text Contrastive Learning, ITC),匹配损失(Image-Text Matching, ITM)和生成损失(Image-Grounded Text Generation, ITG),如Fig 4.所示,Q-Former的训练数据是图片——文本对,其中视觉输入Q和文本输入T共用一个自注意层,即是将Q和T拼接起来后输入到自注意层中,通过不同的mask去选择QT之间是否需要注意力交互,mask的具体生效机制见 [5]。让我们回到Q-Former,我们将文本输入[CLS]对应Transformer的输出记为 E T ∈ R N × D E_T \in \mathbb{R}^{N \times D} ETRN×D其中 N N N为batch size, E V ∈ R N × K × D E_V \in \mathbb{R}^{N \times K \times D} EVRN×K×D,那么以下是各种损失的组成:

1、 对比损失 ITC

sim_matrix = matmul(E_V, E_T, transposed_Y=True) # output (N, K, N)
sim_matrix = reduce_max(sim_matrix, axis=1) # output (N, N), maxpool for a best text-vision matching
dig_label = tensor(list(range(0, batch_size))).reshape(batch_size, 1)
itc_loss = cross_entropy_with_softmax(sim_matrix, dig_label)

2、匹配损失 ITM

pos_score = model(Q, T) # positive sample score, output (N, 1)
neg_score = model(Q, T_neg) # negative sample score, output (N, 1), T_neg could be the hard negative sampled at ITC stage
itm_loss = mse(pos_score, 1) + mse(neg_score, 0)

其中的T_neg为负样本文本,可以参考ALBEF [6] 的工作进行难负样本采样,在此不赘述。

3、生成损失 ITG

logits = model(Q, T, mask) # output (N, S, 1)
itg_loss = cross_entropy_with_softmax(logits, gt_char_label)

由于自注意力层的输入是QT的拼接,在不同损失中需要考虑不同的掩膜类型,mask的作用形式见公式(1)所示。在ITC损失中,Q见到T或者T见到Q都会带来信息泄漏,因此需要控制mask使得Q只能和自身交互,T同样,mask形态如Fig 4 (b3)所示。在ITM损失中,Q和T需要进行交互以进行细粒度学习,因此其掩膜为全unmask状态。ITG损失中,由于提前见到文本T的全文将会带来信息泄漏,因此需要保证预测当前token的时候,只能和该token之前的token进行交互,而Q则全文皆可见,因此mask形态如Fig 4 (b2)所示。

fig4_qformer_training

Fig 4. Q-Former的训练过程有ITC、ITM和ITG三种损失构成。

待第一阶段训练好后,可将第一阶段的产出 E V E_V EV通过FC层连接到LLM作为视觉语义输入 f ( E v ) f(E_v) f(Ev),如Fig 5.所示,即为第二阶段训练。此时根据LLM的类型(decoder-only模型、encoder-decoder模型)可选择不同的建模方式,在decoder-only模型中,给定 f ( E v ) f(E_v) f(Ev)后直接对文本进行预测,而在encoder-decoder模型中,则需要将文本信息划分为两段A/B,LLM encoder只喂 f ( E V ) f(E_V) f(EV)和文本A,在LLM decoder模型中对文本B进行预测。此时,由于LLM的参数固定,只需要更新FC层的参数即可。

fig5_stage_2_training

Fig 5. BLIP2第二阶段训练,联合LLM进行生成式目标预训练。

作者在实验中,对BLIP2的zero-shot能力进行测试,如Fig 6.所示,在多个任务上,BLIP2在引入更少额外待学习参数的前提下达到了更好的zero-shot效果。如Fig 7.所示,BLIP2在VQA任务中和多个SOTA模型性能的对比,我们不难发现底座的视觉模型参数量更大(ViT-L -> ViT-g),LLM参数量更大(OPT 2.7B -> OPT 6.7B),随之带来了BLIP2性能的稳定提升。我们同时肯定也会好奇,Q-Former这种引入视觉语义向量的方式带来的收益,作者也对第一阶段的训练进行了消融试验,如Fig 8.所示,引入了第一阶段进行语义迁移后,能带来明显的性能提升。

fig6_blip2_zero_shot_performance

Fig 6. BLIP2在更少待学习参数的前提下,在多个任务上达到了更好的zero-shot效果。

fig7_better_backbone

Fig 7. BLIP2在VQA任务中,和各种SOTA模型的对比,我们发现底座的视觉模型参数量更大(ViT-L -> ViT-g),LLM参数量更大(OPT 2.7B -> OPT 6.7B),随之带来了BLIP2性能的稳定提升。

fig8_qformer_gain

Fig 8. 以VQA试验为例,进行消融试验,验证Q-Former第一阶段训练带来的收益。

BLIP2引入Q-Former进行视觉语义到文本语义迁移的方式是具有启发性的,但是作者在论文中也说明了当前BLIP2的一些缺陷,由于训练过程中仍然是单个图片—文本对的形式进行的,BLIP2模型缺少in-context learning的能力,同时由于采用了固定的LLM模型,BLIP2集成了LLM的固有缺陷,比如幻觉、毒害性等,后续如何进行MLLM的联合训练仍然是一个很值得关注的开放性问题。

Reference

[1]. Li, Junnan, Dongxu Li, Silvio Savarese, and Steven Hoi. “Blip-2: Bootstrapping language-image pre-training with frozen image encoders and large language models.” arXiv preprint arXiv:2301.12597 (2023). aka BLIP2

[2]. Liu, Haotian, Chunyuan Li, Qingyang Wu, and Yong Jae Lee. “Visual instruction tuning.” arXiv preprint arXiv:2304.08485 (2023). aka LLaVA

[3]. Lester, Brian, Rami Al-Rfou, and Noah Constant. “The power of scale for parameter-efficient prompt tuning.” arXiv preprint arXiv:2104.08691 (2021). aka Prompt Tuning.

[4]. Alayrac, Jean-Baptiste, Jeff Donahue, Pauline Luc, Antoine Miech, Iain Barr, Yana Hasson, Karel Lenc et al. “Flamingo: a visual language model for few-shot learning.” Advances in Neural Information Processing Systems 35 (2022): 23716-23736. aka Flamingo

[5]. https://blog.csdn.net/LoseInVain/article/details/116137177, 《Transformer代码随记》

[6]. https://blog.csdn.net/LoseInVain/article/details/122735603, 《图文多模态语义融合前的语义对齐——一种单双混合塔多模态模型》

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

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

相关文章

YOLOv8进阶 | 如何用yolov8训练自己的数据集(以安全帽佩戴检测举例)

前言:Hello大家好,我是小哥谈。YOLOv8是一种目标检测算法,它是YOLO(You Only Look Once)系列算法的最新版本。本节课就带领大家如何基于YOLOv8来训练自己的目标检测模型,本次作者就以安全帽佩戴检测为案例进…

华为机考入门python3--(7)牛客7-取近似值

分类:数字 知识点: str转float float(str) 向上取整 math.ceil(float_num) 向下取整 math.floor(float_num) 题目来自【牛客】 import math def round_to_int(float_num): # 如果小数点后的数值大于等于0.5,则向上取整&#xf…

虚拟机克隆的三种方式:全量克隆、快速全量克隆、链接克隆

虚拟机克隆的三种方式:全量克隆、快速全量克隆、链接克隆 快速全量克隆 特点:虚拟机启动快、拍平后数据独立 场景:快速发放独立的虚拟机,减少等待虚拟机部署完成时间,能够快速提供用户使用虚拟机。 实现方式:通过对…

Fink CDC数据同步(一)环境部署

1 背景介绍 Apache Flink 是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。 Flink CDC 是 Apache Flink 的一组源连接器,基于数据库日志的…

【SpringBoot】RBAC权限控制

📝个页人主:五敷有你 🔥系列专栏:SpringBoot⛺️稳重求进,晒太阳 权限系统与RBAC模型 权限 为了解决用户和资源的操作关系, 让指定的用户,只能操作指定的资源。 权限功能 菜单权限&a…

windows下安装go

下载golang Go 官网下载地址: https://golang.org/dl/ Go 官方镜像站(推荐): https://golang.google.cn/dl/ 选择安装包 验证有没有安装成功 查看 go 环境 说明 : Go1.11 版本之后无需手动配置环境变量&#xff0c…

29 python快速上手

Python操作MySQL和实战 1. 事务1.1 MySQL客户端1.2 Python代码 2. 锁2.1 排它锁2.2 共享锁 3. 数据库连接池4. SQL工具类4.1 单例和方法4.2 上下文管理 5.其他总结 目标:掌握事务和锁以及Python操作MySQL的各种开发必备知识。 概要: 事务锁数据库连接池…

Weblogic反序列化漏洞分析之CVE-2021-2394

目录 简介 前置知识 Serializable示例 Externalizable示例 联系weblogic ExternalizableLite接口 ExternalizableHelperl类 JdbcRowSetImpl类 MethodAttributeAccessor类 AbstractExtractor类 FilterExtractor类 TopNAggregator$PartialResult类 SortedBag$Wrappe…

【测试运维】web自动化全知识点笔记第1篇:什么是Web自动化测试(已分享,附代码)

本系列文章md笔记(已分享)主要讨论Web自动化测试相关知识。了解什么是自动化,理解什么是自动化测试以及为什么要使用自动化测试。具体包含:WebDriver的基本操作,WebDriver的鼠标、键盘操作,下拉选择框、警告…

SpringBoot RestTemplate 上传文件

SpringBoot RestTemplate 上传文件 Testpublic void testUpload() throws Exception {String url "http://127.0.0.1/file/upload";String filePath "C:\\temp\\1.png";RestTemplate rest new RestTemplate();FileSystemResource resource new FileSys…

【教学类-46-01】吉祥字门贴1.0(华光通心圆_CNKI 文本框 空心字涂色,最好繁体字)

作品展示 背景需求: 马上就要过年了,家家户户大门上贴上对联和福字 我想用正方形红色手工纸(15CM)也做一个幼儿描线版的福字 问题一:福字顺时针旋转45度 打印纸上制作福字,需要让这个字顺时针旋转45度&am…

C语言:简单排序

题目描述 输入11个整数,如果第1个数为1,则将其中的第2至11个数升序排列;如果第1个数为0,则降序排列。 输入格式 输入一行,包含11个整数,用空格符分隔。 输出格式 输出1行,包含10个顺序排列的整…

Qt程序设计-使用QSplashScreen制作开机界面

目录 QSplashScreen简介 实例演示 QSplashScreen简介 在Qt中,QSplashScreen类就是用来创建启动画面的。它是一个窗口类,可以显示一个图片,并在图片上显示一些文本信息。QSplashScreen类提供了一些方法,可以方便地设置启动画面的图片和文本,以及控制启动画面的显示和隐藏…

【C++栈和队列:数据结构中的经典组合,高效处理先进先出与后进先出问题的最佳方案】

[本节目标] 1. stack的介绍和使用 2. queue的介绍和使用 3. priority_queue的介绍和使用 4. 容器适配器 1. stack的介绍和使用 1.1 stack的介绍 1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的…

【DC渗透系列】DC-2靶场

arp先扫 ┌──(root㉿kali)-[~] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:6b:ed:27, IPv4: 192.168.100.251 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.100.1 00:50:56:c0:00:08 VMware, In…

DolphinScheduler实现隔几天调度

1.场景分析 dolphinscheduler(海豚)定时器模块-定时调度时每3秒|每3分钟|每3天这种定时,不能够跨分钟,跨小时,跨月,每次跨月等都会从每个月的第1天(第几天开始可以设定)开始重新计时…

Unity3d Cinemachine篇(四)— StateDrivenCamera

文章目录 前言使用StateDrivenCamera根据不同动画切换相机1. 创建一个游戏物体2. 创建StateDrivenCamera相机3. 创建动画4. 设置相机5. 完成 前言 上一期我们简单的使用了FreeLook相机,这次我们来使用一下StateDrivenCamera 使用StateDrivenCamera根据不同动画切换…

PFMEA的具体实施步骤都有哪些——FMEA软件免费

免费试用FMEA软件-免费版-SunFMEA 一、引言 PFMEA(Process Failure Mode and Effects Analysis)是一种用于识别、评估和优先处理生产过程中潜在失效模式的工具。它通过对生产过程中的各个环节进行深入分析,发现可能导致产品不合格、过程不稳…

docker maven插件使用介绍

1、配置docker连接 开放docker tcp连接参考本专栏下令一篇文章 2、docker service窗口 3、根据dockerfile 构建镜像 注意 idea 用通过管理员身份启动,否则连不上docker 构建前添加maven goal 打包 4、运行镜像 创建容器 5、运行docker compose 报错 需要先配置d…

面了昆仑天工大模型算法岗(实习),感觉彻底凉凉。。。

我是过年某985研二,过完年打算找大厂实习 offer,本文章主要记录了本小菜研找实习的坎坷历程。 应聘岗位:昆仑天工大模型算法工程师 面试轮数:第一面 1. 自我介绍 在自我介绍环节,我清晰地阐述了个人基本信息、教育背景…