上一篇的链接:多模态MLLM都是怎么实现的(7)-Sora (qq.com)

上上一篇的链接:多模态MLLM都是怎么实现的(6)-Dit Diffusion Transformer (qq.com)

上上上一篇的链接:多模态MLLM都是怎么实现的(5)-Backbone, Unet or Transformer?从0搭建一个SD (qq.com)

上上上上一篇的链接:多模态MLLM都是怎么实现的(4)-去噪声 (qq.com)

上上上上上一篇的链接: 多模态MLLM都是怎么实现的(2)-DDPM (qq.com)

上上上上上上一篇的链接:多模态MLLM都是怎么实现的(2) (qq.com)

上上上上上上上篇的链接:多模态MLLM都是怎么实现的(1) (qq.com)

      其实多模态的这个系列本来都已经完结了的,但是我发现忘了一个很重要的场景VQA,所以过来补一篇。

      事情的起因是同事阿贵最近在研究如何把生成式和自动驾驶的场景能串起来,本来研究的方向是语言模型+ASR+TTS和智能座舱,智能车机交互啥的场景,后来就聊到自动驾驶如何把车辆捕捉到的视频帧信息转换成文字描述,然后抽取语义中的跟车辆驾驶相关的信息,进而转换成控制信令传递给车机,最后完成整个的pipeline。对应原来的自动驾驶领域就是"感知-预测-规划"。

      后面的先不说主要是第一步,如何把帧或者说图片吧,转成文字描述,这其实就是一个GPT4V的场景。

多模态MLLM都是怎么实现的(8)-GPT4V和Blip_模态

      说白了就是广义上的VQA,图生文场景,这部分我之前的多模态文章系列,确实鬼使神差的就把它给忘了,GPT-4V讲不了,因为也不公开,我也不是Openai的员工,但是大抵原理是讲的通的,就像我用ViT讲Sora一样,今天我们用Blip来讲GPT-4V。

       其实严格来说image2text这类任务出现的很早了,不是GPT-4V出的时候才有的,最早做这类任务的,至少有以下几个。

 

 1- GIT

多模态MLLM都是怎么实现的(8)-GPT4V和Blip_数据_02

       这个不用讲,大家一看就很简单,采用监督学习,image encoder被embedding成token,然后text-decoder去生成。

       需要注意的是一般来讲text-decoder层数要少,和NLP不同,I2T的多模态任务文字量没NLP那么大,Transfomer层数越多,训练起来麻烦,收敛也费劲,也不好优化,论文里面称6层以下比较好。

      

     2- Flamingo

多模态MLLM都是怎么实现的(8)-GPT4V和Blip_数据_03

       Flamingo和GIT看着差不多,但是image encoder和text-decoder都是训练完就冻结参数的,能学习参数的是紫色的叫Perceiver Resampler的层,这个思想其实非常巧妙,后来也被Blip2给抄走了(我个人认为),这快一会看Blip2吧,毕竟Flamingo已经作古。

 3- CLIP

      还有就是都听过的CLIP

多模态MLLM都是怎么实现的(8)-GPT4V和Blip_数据_04

多模态MLLM都是怎么实现的(8)-GPT4V和Blip_模态_05

     

      Clip我之前文章也讲过,算法比较简单就是图片和语料做距离匹配,实现起来也都比较简单,但是毕竟语料库大,到现在还是活跃在各种多模态的任务里比如SD的text-encoder用的就是CLip。

     4- Llava

     

多模态MLLM都是怎么实现的(8)-GPT4V和Blip_Image_06

      Llava的思路就更简单和粗暴了,不过它出的晚,所以虽然采用的方式和GIT差不多(只是看起来),但是效果好一些,能对付用。

     它是2阶段训练:

经过一个W的project转换(可以理解为线性层的矩阵对齐),说白了,就是一个线性层,image转换embedding的层W。第一阶段是将image和text特征进行对齐。

它是将图片还有prompt的语料(这prompt语料是GPT生成的关于这个图片的问题)一齐作为输入,然后把这个东西输入进随便什么LLM来训练,也是有监督的,监督的label就是生成的响应语句,求Loss。第二阶段是让大语言模型理解图片和文本,并具有多轮对话能力,是一个微调过程

     然后下一个问题是,我们为什么要做Blip。

     前面几个比较太远古了,大家都知道不太能用,或者作为组件用(比如clip)那跟Llava比呢?

     我们看一下Llava的思路:

     1-通过clip的image-encoder能实现对图片的文字简单描述(场景、事件、实体等等)。

      2- 因为CLip的总结太机械和对象化,这中间可能还利用LLM,对CLip生成的文字,在合适的prompt下对这段文字进行重描述。

      3- 然后和视觉的向量做个线性层整合,作为输入,交给LLM训练。

      这三步看着好像是那么回事,可是每一步都有原始信息的损失,即

      1-Clip一定准吗?

      2-你LLM扩写不会夹带私货吗?

      3-视觉和文字做embedding contact,升降维度带来的损失。

      我说这个大家是基本同意的吧?

      另外还有其他一些问题,如:

  • 早期的预训练模型有一个算一个,通常在理解型任务或生成型任务中表现出色,但没有模型横跨两个领域的好用的。
  • 早期的这些模型,性能改进主要是通过扩大数据集规模,但是它也不选择,啥都训练也带进去很多噪声,网络数据集中的噪声会对模型的性能产生负面影响,这一点不但起不到好效果,反而会拉低模型的准确率。(其实NLP领域也是一样的,你们看到的很多幻觉,幻觉的其中一个原因还真就是因为有些语料就是乱答一气造成的。)

    5-Blip 

    那么怎么解决呢?所以Blip来了(其实blip和blip2都比llava出的要早

多模态MLLM都是怎么实现的(8)-GPT4V和Blip_模态_07

,但是因为LLava的LLM是Vicuna,远不是2022年和2023年初的Blip能相比的)。

多模态MLLM都是怎么实现的(8)-GPT4V和Blip_模态_08

    Blip其实和之前介绍的几个都一样,也是双塔模型。

    BLIP的核心在于2点:

    1- 创新的三训练任务,让一个模型兼顾图像识别,分类,生成,把杂糅的下游任务分成了细活(GPT4-V也是这么规划任务的)

  boostrapping caption的方案的设计。该用于给互联网那个数据“提纯”去除噪声,从而进一步提升多模态模型的效果。

    从网络层面,它分为以下几个模块,

  • Image Encoder(ViT):就是标准Vit,把图给embedding成patches,编码,加个cls位,描述图片的全局特征。
  • Text Encoder(BERT):对句子进行编码,增加cls token描述text的全局特征。
  • Image-grounded Text Encoder:在text-embedding contact image的embedding,通过在self-attention和FFN中间增加一层cross-attention拉齐text-encoder和img-encoder的特征。
  • Image-grounded Text Decoder:这就是个causal-only的单注意力机制的Transformer了,和平常见到的LLM几乎一样(区别是得有cross-attention,不然,没法融合图片的信息,所以更像传统Transformer的decoder),self-attention来预测下一个token,生成对图片描述,和左边的Image-grounded Text Encoder共享除了self-attention之外的层的所有参数(省算力,BLIp2也这么玩)

   

   从下游任务层面,主要有这3种任务:

  • Image-Text Contrastive Loss,简单理解就当是CLIP的训练任务就可以了,找图文匹配度,求Loss,也是对比学习。
  •  ITM:Image-Text Matching,细粒度的2分类任务,把ITC里面容易判断错误的样本当成hard negative sample,来做2分类。
  •  LM:这个就是纯纯给图生成描述了(用的是OPT),用cross-Entropy通过自回归来生成一个token又一个token的NLG任务,只不过prompt是图。

    

    讲完了创新的3下游任务,现在说它的bootstrap,怎么理解这个事呢?

多模态MLLM都是怎么实现的(8)-GPT4V和Blip_Image_09

      看上图,首先数据最原始的数据是咋来的,有两部分,一部分是人选的image Ih,也给打了标,就是人选出来的Th (text描述),这部分来讲话呢,肯定是最准确的理解。

多模态MLLM都是怎么实现的(8)-GPT4V和Blip_模态_10

       上图左边的部分没在红框里的数据,就稍微有点难受了,因为Image来自于web上面,然后对这个Image的标准呢,也是来自于Web上面,看下面的例子。

       

多模态MLLM都是怎么实现的(8)-GPT4V和Blip_数据_11

      这是个蛋糕的图,本来正确的描述应该是巧克力蛋糕,但是从web上抽取,得到的文本描述是"blue sky bakery in sunset park",这似乎是这个蛋糕的广告语,或者从哪个别的地方拿到的描述,但是严格说和对图片的描述毫无关系。

      第一步,我们在训练时把人标注的,我们认为顶级数据和互联网上标注的,一般的,可能存在的噪声数据,一起放进去训练,然后拿这份数据去pretrain ITC,ITM和LM的训练。

多模态MLLM都是怎么实现的(8)-GPT4V和Blip_Image_12

      第二步,我们用人类的标注数据去tuning 这3个下游任务

多模态MLLM都是怎么实现的(8)-GPT4V和Blip_模态_13

    这样,这3个模型其实就接近于我们想要的效果了,符合了下游任务的范式,这还没完。

    第三步,把互联网标注的语料,拿ITC,和ITM给过滤了,错的,我就不要了,只留下好的,就是Tw的绿色部分,另外没有标注的互联网图片,用LM来标注成Ts,一起混合成新的数据,再和老的数据,重新灌注给模型的变成新的pretrain,完成下一个ephco,周而复始,把不断迭代优化Loss

多模态MLLM都是怎么实现的(8)-GPT4V和Blip_Image_14

   以上就是Blip的创新和训练方式。

    6-Blip2

    Blip当年出了好像就是Sota,记不清了,但是训练起来也太麻烦了

    后来第二年2023年Saleforce又公布和开源了它的2代,Blip2

    

多模态MLLM都是怎么实现的(8)-GPT4V和Blip_模态_15

BLIP-2的核心创新点也有2个。

1- 是设计了一个轻量架构QFormer(querying transformer)来建立图像-文本的对齐的bridge

2-是设计了一种二阶段预训练范式实现高效训练,实现将目前的视觉backbone与LLM模型连接起来。 (后面就随便换了,LLM越强,模型越强,比如GPT4...)

Blip2其实是偷师了Flamingo的概念,它用12层Transformer(被称为Q-Former来训练各种双塔任务),这个就很像Flamigo的Perceiver Resampler,有点那个意思,

  训练第二步:Q-Former 训练第1步:联合image-encoder训练Q-former

多模态MLLM都是怎么实现的(8)-GPT4V和Blip_模态_16

     首先冻住image encoder(也是CLip分辨率就差一些224*224,如果换成SAM就可以实现1024*1024的分辨率)的权重

     然后训练Q-Former,Q-Former里面一共12层,奇数层有cross-attention层,偶数层没有。里面其实是2张网络,一张是管image的(左),一张是管text的(右)。self-attention层的设计上和Blip的ITM&LM一样的,都是共享的。

     从Image的角度讲,BLIP2中QFormer不像BLIP1是把图片过完image encoder后直接过self attention,而是直接cross attention,也就是说图片的特征是被压缩的learned queries作为q和image encoder做了cross attention得到的。

    那什么是learned queries呢?

    就当它是一个可以学习的Q就可以了,而image-的embedding被当成了KV,Blip实际上是把image-embedding当成了Q,这个其实在CV领域也不少见,Dalle2中的DiffusionPrior模块,diffusion model中的text inversion技术都用到了类似的思想。(这块不是self-attention了,Q是可学习的,KV是cross-attetion过来的)

    拿ITC任务举例,由于learning query的引入,embedding的contact也变的和Blip不一样了,与常规ITC任务不同的,1个图片因为有learning query的存在,产生了image embedding有32个(等于learned query的数量),而text embedding只有1个。BLIP2的操作是,算32个image embedding与text embedding的距离,挑最近的作为loss,记录下来。

    ITM和ITG任务就不赘述了。

    需要注意的是,因为掩码机制的存在

多模态MLLM都是怎么实现的(8)-GPT4V和Blip_数据_17

      在面对不同任务的时候需要考虑不同的掩码政策

      比如ITC损失,Q和T是都不可见的,见了,还怎么做对比学习?所以mask掩完之后,Q只能看到Q,T只能看到T

      在做ITM的时候Q和T需要更细粒度的匹配,所以要相互学习,那就要都放开。

     而ITG就跟NLG掩码似的,这块就没什么可讲的了。

     对Transformer的基础知识需要学习和强化的同学,请移步这个系列。

     小周带你读论文-2之"草履虫都能看懂的Transformer老活儿新整"Attention is all you need(4) (qq.com)

     Blip训练是二阶段的

训练第二步:Q-Former 训练第2步:联合image-encoder和LLM训练   

      二阶段除了训练Qformer和Learned queries外还得训练QFormer输出和LLM之间的Fully Connected,这把image-encoder和LLM的decoder都得冻住,如果是T5或者其他的双向注意力机制的LLM,连encoder都得冻住。

多模态MLLM都是怎么实现的(8)-GPT4V和Blip_数据_18

      第二阶段可以理解为一种VQA(visual query anwser)的任务微调


多模态MLLM都是怎么实现的(8)-GPT4V和Blip_数据_19

      Queries 在经过了第1阶段的训练之后,学习到了如何更好地结合文本提取图片信息,因此它能将最有用的信息提供给 LLM,同时删除不相关的视觉信息。这减少了后面LLM 学习视觉语言对齐的任务压力。

      把文本问题和Q-Former提取的视觉文本混合表征,一起输入LLM从而得到答案,不过还多了一个把问题也加入了Q-Former的输入,使提取的图像特征和问题更相关。后面的InstructBLIP中,也是这种VQA的微调。

      blip2能够根据上下文进行回答,但由于blip2文本长度默认为32,根据图像输出的长度有限。

多模态MLLM都是怎么实现的(8)-GPT4V和Blip_模态_20

       基本就这样,准确度还是不错的,但是表现力受限于它当时所处的时代,所以表现有限。

       后面又有了MiniGPT,目前被大家广泛使用。


多模态MLLM都是怎么实现的(8)-GPT4V和Blip_模态_21

      MiniGPT其实也是基于Blip2思想来做的,但是它效果好出那么多,因为它LLM是Vicuna啊,和Llava一样,本身LLM能力就非常强。

      MiniGPT主要对blip2的第二步训练(视觉到文本生成)改进。 


  •       Linear Layer修改了输出维度,vit输出的编码向量维度默认为768,此处就是一个升维操作,变成4096,而blip2,只有2560,所以增加了表达能力。
  •      同时对LLM模型输入时,增加了prompt,提高了模型的问答能力。
  •      Vicuna或者Llama chat替换OPT,这其实是我认为的最核心的改变。

   

多模态MLLM都是怎么实现的(8)-GPT4V和Blip_Image_22

      MiniGPT的效果也要照之前的好上好几个级别。

      这里面其实细心的读者能够看出,LLM对能力提升对于MLLM的能力提升机会是线性的,所以也不难理解,为什么GPT4-V和Claude-3这些模型出来基本就能吊打其他的老的模型效果,这里面固然有关于视觉backbone比如说Q-former(或者OpenAI,anthropic 的独有算法优势在里面),但是对于VQA的任务,或者说图生文的任务来讲,LLM的能力,永远是第一位的。

     剩下还有什么Coca,Vlmo啥的我也没必要一一列举,主要就是帮大家理清一下VQA任务的原理,和业界目前的design思路。

多模态MLLM都是怎么实现的(8)-GPT4V和Blip_数据_23