type
status
date
slug
summary
tags
category
icon
password
ㅤ | Paper | Cite | Date | github |
BLIP | 881 | 2022-01 | ||
BLIP-2 | 455 | 2023-01 | ||
InstructBLIP | 157 | 2023-05 |
1 背景2 BLIP2.1 main-idea2.2 method2.2.1 模型架构2.2.2 多模态预训练任务2.2.2.1 Image-Text Contrastive Loss (ITC)2.2.2.2 Image-text matching (ITM)2.2.2.3 Language modeling loss(LM)2.2.3 boostrapping caption(核心)2.3 result3 BLIP-23.1 main-idea3.2 method3.2.1 模型架构3.2.2 多模态预训练任务3.2.2.1 多模态表征对齐预训练 (第一阶段)3.2.2.2 多模态表征理解预训练(第二阶段)3.3 result4 InstructBLIP4.1 main-idea4.2 method4.2.1 模型架构4.2.2 构建多模态instuction数据集4.3 result总结QA
1 背景
BLIP系列是多模态任务比较有代表性的一份工作,本文将对BLIP系列的3篇paper进行详细解读,便于多模态的初学者入门,也以便自己日后回顾。
概括来看:
- BLIP的核心创新点在于boostrapping caption的方案的设计。该方案用于“提纯”带噪声web datasets,从而进一步提升多模态模型的效果。
- BLIP-2的核心创新点有二,其一是设计了一个轻量架构QFormer(querying transformer)来建立图像-文本的桥梁,其二是设计了一种二阶段预训练范式实现高效训练,实现将目前的视觉backbone与LLM模型链接起来。
- InstructBLIP的核心创新点在于系统的研究了vision-language的intruction tuning技术方法。并设计了一种instruction-aware的特征提取方式来增强多模态模型的能力。
2 BLIP
2.1 main-idea
目前VLP(vision-language pre-training)数据集大多是网络爬取而来(称之为web datasets),里面的caption包含很多噪声,并不是一个理想的监督来源。BLIP这篇文章提出一种boostrapping caption的方案来“提纯”带噪声web datasets,从而进一步提升多模态模型的能力。概括来说:这篇文章设计了一种去噪方案,来提纯web datasets,以此带来精度提升。
2.2 method
2.2.1 模型架构
BLIP多模态架构为双塔架构。论文中用3个vision language pretraining(VLP) task来激发模型的多模态能力。
2.2.2 多模态预训练任务
2.2.2.1 Image-Text Contrastive Loss (ITC)
和CLIP训练任务一致。核心思想是:给定图片-文本向量对 .其训练目标为,同pair的相似度越接近越好,非同pair的相似度越远越好,形如
伪代码如下(from CLIP paper)
有了上面的背景知识,ITC的步骤就很好理解了:
STEP1: 图片经过image encoder得到image embedding
STEP2: 文本经过text encoder得到text embedding
STEP3: 分别拿到image embedding中
[CLS]
token对应的embedding , 与文本text embedding中[CLS]
token对应的embedding .STEP4: 将与投影到同一维度
STEP5: 同pair的相似度约接近越好,非同pair的相似度越远越好。
2.2.2.2 Image-text matching (ITM)
ITM也是VLP的常用任务,它的实现形式有很多,核心思想是:给定图片-文本向量对.其训练目标为预测是否来自同一个pair。是为1,否则为0。形如:
下面来看具体是如何实现的。
STEP1: 图片经过image encoder得到 image embedding
STEP2: 文本经过text encoder得到text embedding ,和ITC有所区别的是,此处将image embedding 作为
encoder_hidden_states
也送入到text encoder(image embedding与text embedding在cross-attent层进行特征交互,image se quence embedding作为key,value。text embedding作为query)。因此最后输出的text embedding也同时蕴含了image sequence embedding的信息。作者将此时的text encoder称为image-ground text encoder
image embedding与text embedding在cross-attention的特征交互实现可见transformers库BertSelfAttention函数
STEP3: 取文本text embedding中
[CLS]
token对应的embedding 。- 当送入image sequence embedding与text是pair时,的类别标签为1
- 当送入image sequence embedding与text非pair时,的类别标签为0
随后用cross-entropy计算损失。
训练完成后:得到 image-ground text encoder
2.2.2.3 Language modeling loss(LM)
LM时GPT系列的预训练任务。简单来说就是根据前面的词来预测下一个词。与NLP的LM有所不同的是VLP同时将image-embedding引入到上下文信息。
STEP1: 图片输入到image encoder中的得到 image embedding( )。
STEP2: 将 image embedding( )作为key,value送入到text-decoder的cross-attention中与text embedding进行特征交互。作者将此时的text-decoder称为
image-ground text decoder
STEP3:最大化自回归序列的似然概率进行训练。训练完成后:得到 image-ground text decoder
通过以上预训练任务:得到
- image encoder
- image-ground text encoder
- image-ground text decoder
2.2.3 boostrapping caption(核心)
通过2.2.2节的预训练任务我们得到3个模型:1)image encoder;2)image-ground text encoder ;3) image-ground text decoder
下面来看如何结合上述上个模型来对web dataset进行“提纯”,主要步骤如下:
STEP1: 用人工标注的数据集对预训练模型image-ground text encoder与 image-ground text decoder 进行微调。为图文对。
STEP2: 遍历web datasets .进行下面操作
- STEP2.1 通过 image-ground text decoder (论文称之为Captioner)预测的caption 。此时对于图片有两个图文对和
- STEP2.2 通过image-ground text encoder(论文称之为Filter)来判别图文对和是否matching。过滤不matching的图文对。
STEP3: 汇总所有图文对
用提纯后的数据集用2.2.2的预训练任务重新训练。
2.3 result
从作者给出的实验来看,boostrapping caption不论在retrieval还是在caption任务上都能带来一定的提升。但当scale up dataset and scale up model后,boostrapping caption的提升就很有限了(在caption任务上尤为明显),如下表的最后一行。
BLIP只评估了在flickr30K上的zero-shot retrieval的能力,相比之前的SOTA在image-to-text retrieval的R@1上有2个点的提升,其它指标提升不大。其它对比结果见原论文。
3 BLIP-2
3.1 main-idea
BLIP-2主要从模态对齐、高效训练两个方向对图文多模态预训练任务(vision-and-language pre-training VLP)做出优化。在模态对齐上提出了一个轻量架构QFormer(querying transformer)来建立图像-文本的桥梁。在高效多模态训练上,结合QFormer提出一种二阶段预训练范式来将目前的视觉backbone与LLM模型链接起来。在VQAv2任务上,仅用了\frac{1}{54}倍Flamingo80B的训练数据,却带来8.7%精度提升。
3.2 method
3.2.1 模型架构
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
3.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)技术。
3.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层代码。
3.2.2.2 多模态表征理解预训练(第二阶段)
通过3.2.2.1我们得到一个训练好的QFormer,这个QFormer能够实现将图片转为一个32x768(用32个token来表征图像)。3.2.2.2的任务是让预训练的LLM模型能够理解上述的图片表征,从而借助LLM强大的知识库来实现问答、推理等任务。也就是说,这一阶段我们需要通过训练来赋予图片token能被LLM理解的语义。
这一步的训练比较简单。固定image encoder与预训练的LLM模型,仅训练QFormer和新增的一个投影层。训练任务为language modeling。最终实现QFormer输出的图片表征(论文称之为soft visual prompt)变成LLM能看懂的样子。
3.3 result
BLIP-2在image-caption, VQA,跨模态搜索的zero-shot能力都超过之前的方法。
作者发现当换更大的视觉backbone与language model时,VQA任务的指标还能有明显提升,说明BLIP-2的scale up的能力不错。
另外作者对二阶段训练的必要性进行了消融实验。实验发现不预先进行第一阶段表征对齐的预训练,直接进行二阶段的表征理解训练(让LLM理解visual prompt的语义),将会明显降低精度。更多的实验结果看原论文。
4 InstructBLIP
4.1 main-idea
这篇文章在BLIP-2的基础上,在26个数据集上系统研究vision-language的指令集微调(intruction tuning)。并设计了一种instruction-aware的特征提取方式,使得模型能够根据不同instruction来提取图片中特定的表征,以此提升多模态能力。
4.2 method
4.2.1 模型架构
InstructionBLIP是用指令集对训练好的BLIP-2进一步微调。微调的架构如下:
InstructionBLIP仅微调Q-Former和FullyConnected两个模块,和BLIP-2中第二阶段的微调参数一致。有所区别的是它的Q-Former的输入不仅有
learned queries
还有instruction的文本,其目的是为了让Q-Former产出的soft visual prompt更有倾向性(即能根据不同的指令提取不同的图像特征,也即是instruction-aware visual feature extraction)。只要理解了learned queries和instruction是如何融合的,InstructionBLIP这篇paper也就理解了。从源码来看instruction-aware visual feature extraction的实现比较简单,直接将learned queries的embedding (
image_learned_embed
)和instruction的文本embedding(instruct_embed
)在特征维度拼接起来,再送入到SelfAttention层中。其它都和BLIP-2中第二阶段微调一致。4.2.2 构建多模态instuction数据集
作者主要在26个数据集上研究VLP的指令集微调,并将其分为了11个类别,如下图所示。作者再将这26个数据集划分成held-in数据集和held-out数据集(填充为黄色的为held-in,白色的为held-out)。仅用held-in的数据集进行训练,用held-out数据集进行zero-shot评估。设计instruction有3大类,训练的时候根据类别随机采样instruction。
由于每个datasets的数量不同,还需要对datasets进行平衡,否则模型可能会在数据量大的datasets过拟合,在数据量少的datasets欠拟合。平衡规则如下:
假定各dataset的数据量为:,在训练阶段采样的数据来自dataset d的概率为
4.3 result
从作者在held-out数据集测试的结果来看经过指令集微调后,Instruction的效果有明显提升。在测试的几类任务上encoder-decoder的LLM架构(T5)似乎比decode-only更有优势(Vicuna)。
总结
本文系统总结了BLIP系列文章的技术方案与技术细节。
- BLIP的核心创新点在于boostrapping caption的方案的设计。该方案用于“提纯”带噪声web datasets,从而进一步提升多模态模型的效果。
- BLIP-2的核心创新点有二,其一是设计了一个轻量架构QFormer(querying transformer)来建立图像-文本的桥梁,其二是设计了一种二阶段预训练范式实现高效训练,实现将目前的视觉backbone与LLM模型链接起来。
- InstructBLIP的核心创新点在于系统的研究了vision-language的intruction tuning技术方法。并设计了一种instruction-aware的特征提取方式来增强多模态模型的能力。
QA
Q: 对于BLIP2的ITG task,那个past_key_value具体是什么?是learned query那边的最终layer的output embeddings吗,还是相同层对应的key和value。
A: 是相同层的key-value。 BLIP2一阶段的三个预训练任务ITC,ITM, ITG是联合训练的。 先ITC任务计算得到itc_loss(先不反向传播),并缓存image-transformer中self-attn的key-value。最后进行ITG任务,(将ITC任务缓存的key-value作为self-attn的past-key-value)最后得到itg-loss。这三个loss加起来后反向传播。 PS: QFormer的text- transformer与image- transformer结构相似(仅多cross-attn层)且共享权重,因此key-value可以逐层对应。
Q: 在itm损失这里不太明白,为什么bs=2的时候,要构造长度为6的bs,这样的话(image_embed1,text_embed2)不是会重复计算一次吗
A: 构造规则是这样的,假定batch_size为2,构建3组pair,每个pair的batch都是2,拼接一起就是6。[(img_emb, text_emb), (img_emb_neg, text_emb), (img_emb, text_emb_neg)] 另一个问题就是img_emb_neg和text_emb_neg分别是什么。 blip2的训练是多卡训练,假定2卡训练,可以gather所有卡的img_emb,记为:img_emb_all (其batch为2x2=4,),和所有卡的text_emb,记为:text_emb_all(其batch为4) 可以分别求出 img_emb 和 text_emb_all 的相似分数sim_i2t (shape为2 * 4) 可以分别求出 text_emb 和 img_emb_all 的相似分数sim_t2i (shape为2 * 4) 依sim_t2i 概率取相似度最小的2个作为img_emb_neg 依sim_i2t 概率取相似度最小的2个作为text_emb_neg .更详细的实现可以参考官方源码(我之前看的是v1.0.0版本.
Q:博主您好,blip2中itm loss的计算,compute_itm的输入的文本端是text input id(bs,32),不是encoder + concat后的text embedding吧?源码见LAVIS/lavis/models/blip2_models/blip2_qformer.py中的compute_itm函数
A: 源码中的确会concat query embedding
然后看BertEmbeddings的计算方式,当传的input_ids和query_embeds不为None会concat起来
Q: 关于learned queries,在两个阶段的训练中以及在最后inference的过程中,这些 learned queries是直接随机初始化输入到模型中,还是需要保存训练好的queries输入到模型中呢?
A: learned queries是模型的参数之一,stage2的训练和inference都是用训练好的,而不是随机初始化。
Q: learned queries的数量是不是越大越好呢?比如ViT模型输出的tokens有196个,那么理想情况下 learned queries的数量是不是也是196个呢?
A: 采用learnable queries这种形式更大的好处是可以限制visual token的数量,起到一定的压缩作用。对于224x224分辨率的图片可能只有196个token。但对1024的图片就有了4096个token,不做压缩的话LLM推理成本会非常大。 至于learnable queries的token数量和训练的分辨率大小取决于你的下游任务所需要的信息粒度。比如下游任务是面向全局特征的caption类任务,learnable queries的token就可以少一些,训练分辨率也无需很大。但对于细粒度VQA,OCR类任务训练分辨率就需要大一些。
Q: 最近blip3也提出了,blip3中将Qformer直接去掉并且采用了微调LLM的训练方式,您觉得是不是Qformer存在一些缺陷导致他们团队最后去掉了Qformer,就目前从我自己的工作中看来,我认为Qformer很难训练得很好,导致最后模型的效果不佳,而且我感觉blip2有点依赖LLM的性能,一旦LLM本身解码的能力就不佳就会导致怎么训练Qformer都很难达到想要的效果。
A: 1)blip3中将Qformer替换为Perceiver Resampler,个人感觉二者差不多,核心方法都是用learnable queries的思路,将visual token压缩成有限个token 更容易被LLM理解的token。 2)由于BLIP2中LLM是freeze的,LMM的上限就已经固定了。并且相对fine-tuning,让freeze的LLM”理解“ visual token也更难。 3)从公开的技术报告看,要想LMM泛化的好,LLM参与训练是必不可少的。
Q: 关于blip2的三个loss,在blip3中也是做了简化,所以想听听您对这三个loss的看法,是不是可以适当删减掉其中一个loss?或者说这三个loss重要性的顺序是怎么样的。
A: 用什么loss训练取决于你的任务目标是什么。比如,如果你想要你训练的模型既能做生成又能做多模态搜索,并且认为现有的多模态预训练模型不够好,你就可以额外加一层embedding align layer用对比学习做表征对齐。 blip2中stage1的用3个loss训练,主要是为了让visual token具备一定的语义信息。减少stage2的训练难度。如果LLM本身参与训练的话就不用这么麻烦了。
- 作者:莫叶何竹🍀
- 链接:http://www.myhz0606.com/article/blip_hub
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章