LLM大模型: blip2/blip3多模态大模型原理
截止目前,图片检索领域最出名的应该是openAI的clip了,分别用bert和vit对text和image做encoder,然后让配对的embedding接近,不配对的embedding拉远,通过这种方法达到text匹配(检索)image的目的!但这种方式只能检索,没法生成text啊(比如对image做适当的description),咋整了?总结一下,单存的clip有如下问题:
- Model perspective
-
Encoder-based model generation tasks:clip只能retreval,不能generate
-
Encoder-decoder-based model retrieval tasks : 两个都有只能generate,不能retreval
-
-
Data perspective:
-
The web text-image data contains noise:当年openai训练clip的时候,号称使用了400 million的text-image数据,但这些都来自web,肯定有很多noise,不干净!
-
为了解决上述问题,blip诞生了!论文: https://arxiv.org/abs/2201.12086
1、clip是典型的“双塔”模型:text和image分别用encoder转成embedding,然后计算vector的距离!因为缺乏decoder,所以没法生成text,所以这里就像搭积木一样加上decoder不就行了?看到这里,我想大部分人和我都是这样想的,但是人家salesforce团队
肯定是有高人的,见识和认知都比我这种普通人高多了,他们的网络架构图如下:
(1)image encoder:提取imag的图片信息,可以用vit(其他的image encoder也行),把(batch_size, channel, width,height) 通过conv2d转成(batch_size, w' * h', channel);w' * h' 就是卷据后的宽、高,类比于nlp任务的seq_len;channel类似于nlp任务中token的dimension,这两个都是超参数,可以根据后续的nlp任务设置成合适的大小!
(2)顺数第二个的text encoder:这是个典型的bert结构,用的是self-attention,并且在text的开头加上了cls标识token。这里最核心的就是Bi self-att了,同时使用token的context得到当前token的embedding!经过了feed forward后,得到了text的embedding,就和image embedding做 ITC Image-Text Contrastive learning了:本质就是二分类。image 和text 经过各自的encoder之后,不进行交互(没有cross attention),独立生成image和text的嵌入(embedding)。接着,模型通过对比学习(contrastive learning)来优化嵌入,使匹配的image和text对的距离更接近,不匹配的对则远离。这种方法有助于模型在全局层面上理解image和text之间的语义关系。这里和Clip没有本质区别!
在训练时,ITC分错误的样本说明是比较难的,这部分样本可以继续用于训练ITM,让ITM的能力更强!
(3)顺数第三个的image-grounded text encoder:和第二个比,明显多了和image的cross attention,其他和第二个完全一样,为啥还要这么做了?这一步的encoder和上一步的encoder比,最大的差异就是cross attention了,这里是直接把image的embedding融合到text的embedding,所以这里得到的text embedding的信息明显比第一个跟丰富!最重要的是:attention机制找到text和image局部的对应关系(ITC是全局语义关系),这个关系在最后一个LM里面是复用的!最后通过binary cross entropy来计算损失函数!
(4)最后一个LM,和第三个ITM比,唯一的区别就是把Bi self-att换成了causal self-att,为啥这么变?因为最后一个LM是decoder,目的要输出text token,所以训练的loss自然就是gpt采用的auto regression啦!训练时token只能看到上文,看不到下文,所以下文的token全部都要mask掉!为了提升预训练效率,text encoder和text decoder share除了attention之外的参数,论文原话:In order to perform efficient pre-training while leveraging multi-task learning, the text encoder and text decoder share all parameters except for the SA layers. The reason is that the differences between the encoding and decoding tasks are best captured by the SA layers【颜色相同的模块参数是共享的】;
2、representation和generative的问题解决了,data的问题怎么办了?clip训练采用了很多web数据,这些数据肯定有很多noise,怎么提升数据质量?最简单粗暴的办法是找人标注,但成本高啊!怎么低成本地获取大量高质量数据了?多年前做传统数据挖掘时,有这样一种方式获取较多的高质量数据:
- 先人工标注少量数据,能训练模型就行(训练样本一般是参数的5~10倍;比如有100个参数,人工标注500条高质量数据即可),利用这些高质量数据训练模型
- 用模型做推理预测。对于得分非常高和非常低的样本,其置信度较高,这类样本判断错误的概率较低,所以这类样本直接作为正样本或负样本,继续用于迭代训练模型
Blip是怎么做的了?如下图:
- 红色的数据可能有noise,属于弱监督;绿色的数据基本没noise,数据质量高!
- w是web爬取的,数据有noise;h是human标注的,属于高质量数据
- 先用所有的样本训练MultiModal,包括ITC、ITM和LM;因为所有样本有来自web的noise,所以此时模型的质量并不高
- 再用{Ih,Th} 这种高质量数据fine - tune ITC和ITM,把这两个classifier的质量提起来!
- 经过高质量数据fine - tune后,ITC和ITM的分类准确率会大幅提升,此时再用这两个model对低质量的{Iw,Tw}数据做filter,只保留匹配正确的数据,去掉匹配错误的noise,这一步就叫filter!
- 同理,使用高质量的{Ih,Th} fine-tune decoder模型,提升decoder的质量;
- 此时用这个decoder对Iw(也就是web爬取的有noise的Image),让decoder生成text(这个叫captioning),取名Ts;这个Ts对不对了?此时不用人工判断,直接用上一步的ITC和ITM去判断。如果是对的,那么这个{Iw,Ts}对就可以放入数据集啦!这个过程叫bootstrapping;
- 整个过程是不是有点像GAN?Generator和Discriminator两个网络互相交互,最终生成数据!
总结一下:最终的数据集Data set的数据来自三部分:人工标注的Th、ITC和ITM filter的Tw,以及decoder生成并通过filter的Ts!这三部分数据质量相对较高,完成了整个data set的数据清洗!
3、(1)Blip完成了representation和generative的任务,但缺陷还是有的:
- 要训练4个model,计算量特别大!
- 根据scaling law,image-text配对的数据需要较多
blip的这两个缺点,在blip 2中解决了!
- Blip有4个单模态模型要训练,计算量大,那就采用现成的?
- 比如image encoder直接用现成的,诸如CLIP的encoder或 ViT
- large language model怎么办?直接也用现成的呗!Blip2采用的是OPT、Flan-T5等现成的
现在最核心的问题就是:image encoder和LLM都是现成的,这两大部分原本都是在各自的语义空间训练的,互相牛头不对马嘴,怎么衔接了? 这就是Q-Former存在的意义了!
(2)原论文中Q-Former的架构如下:颜色相同的模块共享参数
- learned queries:可学习的embedding,可以看成是ITM模型中上一层输出的embedding(一共有N层,每层都会向下一层输出embedding,就是这里的learned Queries)
- input image 经过image encoder后得到的embedding representation,会和ITM中每一层都做cross attention,一共要做N次,充分把image的信息融入ITM模型!所以每个learned Queries都会包含image的信息
- text的信息在IGT输入,但IGT和ITM是共享self attenion的,所以text的信息在ITM这里也是有的
- 这里因为image和text信息要充分融合,所以image和text需要互相能看到,所以ITM这里的self attention用的Bi-directional
- 训练样本中的text经过类似bert的Image-Grounded Text Generation模块后也生成了embedding representation
- 这里因为后续要做generative的任务,所以用causal mask:下一个token只能看到前面的所有token;达到的效果就是:image的所有信息都有,也就是说image能全部看到,但text的token只能一个一个看
- IGT的self attenion和ITM共享,所以IGT的embedding representation其实也包含了image的信息(来自ITM上一层的learned queries);
- ITM和IGT的embedding representation分别都准备好了,此时可以通过ITC的对比学习来更新ITM、IGT的参数了!如果ITC分类错误,这个样本就被送入ITM做负样本(ITM用的是binary cross entropy的loss)!
- ITC:因为是image和text配对,所以不能让image和text互相看见(都能看见对方了还学习啥了?直接照抄不就行了?),所以这里的query token和text token不想不能看见对方
- IGT输出的embedding representation会进入后续的LLM阶段用于生成text
- 通过Q-Former的ITM、IGT、ITC,让image能匹配text,也能通过image生成text;image encoder生成的embedding,能被IGT理解,进而用于后续的LLM生成text!
(3)上一步Q-Former生成的embedding representation,下一步就是送入最终的LLM生成text啦!最后一步很简单:
- 经过fully connected做个形状的转换,适配下游的LLM任务
- 下游可以是GPT这种decoder,也可以是T5、chatGLM这种encoder+decoder都行!
- image在这里本质是promt
(4)原论文中的效果展示:
blip2可以很好的理解图像,但是由于结构原因,对于部分细节把握不到位,可能是因为vit、clip这种image encoder无法提取image的所有细节导致的!
总结:
- Blip2采用了现成的image encoder和LLM,只需要训练Q-Former就行了,这部分的参数少很多!
- image encoder只能对image做编码,要实现text检索image,还是要ITM和ITC; LLM可以生成text,但是需要输入embedding representation(还要包含image的信息),这个工作就由IGT来做了!
4、blip系列在2024.8月份又更新了,blip3问世: https://arxiv.org/html/2408.08872v2 原论文中整体的架构如下:
(1)text 经过tokenizer后转成token;image经过vit后再通过token sampler做 downsample image embeddings,转成vision tokens。此时此刻,原始的image和text都转成token啦!所以为了方便理解,我个人更愿意把 “vit + token sampler” 的组合称之为 image tokenizer!
(2)image和text统一转成token后,接下来就是最熟悉的剧情了:vision tokens和text tokens concatenate 进入LLM做各种处理啦!
(3)所以处理image时用的token sampler到底是个啥?对vit的patch又做了怎样的处理?原论文的原话:
Any-Resolution Vision Token Sampling.
Our any-resolution strategy differs from previous work [46] in that every group of image embeddings (of the same image patch) is downsampled with a perceiver resampler, which ensures that the number of vision tokens input to the LLM remains relatively small. In this section, we ablate the effectiveness of our any-resolution strategy by comparing it with a “fixed-resolution" baseline and other downsampling designs.
The “fixed-resolution" baseline resizes all images to the default input size of the vision encoder while keeping the original aspect ratios. We also tried another downsampling strategy with the perceiver resampler: Instead of doing downsampling for each patch independently, we consider a "fixed sampling" (denoted as anyres-fixed-sampling in Figure 8(a)). In the fixed sampling, we concatenate the image embeddings from all image patches and then input them as a single sequence to the perceiver resampler to obtain the fixed number of vision tokens for the whole image. 核心的做法就是:把所有的image patch 的 embedding concatenated,然后看作一个single sequence后进入perceiver resampler,最终的目的是obtain 固定数量的vision tokens!那么这里的perceiver resampler具体是怎么做到的了?
perceiver resampler :用特定长度的Query抽取图片信息(降低图片的表示长度)
最核心的仍然是attention机制: vit将patch做encoder后,加上time信息,然后flat成一个sequence,最核心的就是和learned latent queries做attention了,让query里面的token找到image的强相关token,最后通过FFW适当降维,输出固定数量的vision token,减小后续的计算量!这一步的本质:根据用户的queries,使用attention机制,找到image的核心信息,然后以vision token的形式输出!举个例子,比如query: what's the breed of the dog? query问的是这只狗是什么品种,既然都明确和狗相关了,image里面的其他信息就都不重要啦,所以image只需要保留狗就行了,其他信息诸如背景、地面及其他事物都可以不要啦,这时就可以通过perceiver resampler提取image中dog的信息,然后输出固定数量的vision token即可!
总结:
1、多模态,不论哪种算法或网络架构,对image的处理思路完全一样:通过cnn或vit等方式提取image整体的特征,用embedding representation的形式表示,然后和text的embedding representation融合,具体的方式有:cross attention、add、concat等;
参考:
1、https://arxiv.org/abs/2301.12597 BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models
2、https://github.com/salesforce/LAVIS/tree/main/projects/blip2
3、https://www.bilibili.com/video/BV1ff421q7sC?spm_id_from=333.788.videopod.episodes&vd_source=241a5bcb1c13e6828e519dd1f78f35b2&p=3
4、https://mp.weixin.qq.com/s/csqFAkjziwx34aAxKj9-gQ 视频、图像、文本,只需基于下一个Token预测:智源Emu3发布,验证多模态模型新范式