美文网首页
ALBEF,BLIP和BLIP2全系列工作串讲

ALBEF,BLIP和BLIP2全系列工作串讲

作者: 菜根小友 | 来源:发表于2023-04-14 19:35 被阅读0次

    只用Transformer Encoder的一些方法

    ViLT

    为了把目标检测从视觉端拿掉
    因为预训练目标检测器去抽视觉特征时,会面临很多局限性。


    image.png

    (a)以VSE为代表,文本端直接抽一个文本特征,但视觉端非常大,也就是说需要的计算量非常多,因为它是一个目标检测器。
    得到文本特征和视觉特征之后,做一个简单的模态间的交互。
    (b)以CLIP为代表
    (c)以ViLBERT为代表,它们发现,对于多模态的任务而言,最后的模态间的交互非常重要,效果才会非常好。所以它们把简单的点乘,变成了Transformer Encoder或者别的更复杂的结构。
    但以上都用了预训练的目标检测器,还搞了这么大一个模态融合的部分,这个模型不管是训练还是部署都非常困难。
    (d)以ViLT为代表
    发现在Vision Transformer里,基于Patch的视觉特征,其实跟之前这种基于Bounding Box的视觉特征也没啥太大区别,也能用来做图像分类,目标检测的任务。
    因为移除掉了目标检测器,换成了可学习的Patch Embedding Layer,所以ViLT模型极其简单。
    虽然作为一个多模态学习的框架,但其实跟NLP那边的框架没啥区别。无非就是先都tokenized了一下,然后直接扔给一个transformer去学习了。
    BUT:①性能不够高。视觉的模型要比文本的模型大,效果才会好。
    ②推理时间很快,但训练时间非常慢。

    CLIP

    典型的双塔模型,即类似上图(b),有两个model,一个对应图片,一个对应文本,可以学到很好的图像文本特征。学到之后,只需做很简单的点乘,就能做多模态任务。
    缺陷:只对图文匹配的任务在行,复杂点就不行。
    做个好的多模态学习,应该像(c)。希望用Vision Transformer代替目标检测。

    ALBEF

    最近图像文本的大规模学习已经变得火爆。大部分已有方法,都是用一个transformer模型,去当做多模态编码器去同时编码视觉Token和文本的Token。
    作者还专门强调,视觉token就是rigion-based Token(目标检测器)。
    ViLT觉得目标检测器太大了,想拿掉目标检测器,提高推理速度。
    ALBEF认为,用了目标检测器之后,视觉特征和文本特征不是align的。因为目标检测器是提前训练好的,只用抽特征,没有再进行end-to-end的训练。这就导致视视觉特征跟文本特征可能相隔很远。把这俩特征同时扔给多模态编码器之后,学图像文本的交互信息就会变得很challenging。
    如何在Multi-Modal Encoder之前,就把图像和文本特征align起来?
    作者提出了一个对比学习的Loss,让图像文本在Fuse之前就align。
    其实就是图像-文本的loss——ITC。

    引用了ViLT的patch方法,也就不需要Bounding Box Annotation,也就是不需要预训练的目标检测器。
    为了能从特别Noisy网上爬下来的数据中去有效地学习文本图像特征,
    Noisy是因为网上爬下来的数据,文本没有很好地去描述这个图像,(那种文本叫Alt Text,也就是Alternative Text,就是另外一种形式的文本),对于搜索引擎来说,最具备价值的东西都是关键词,比如说我在喝饮料,就不具备价值,得说我在喝可口可乐,这样大家去搜的时候才会搜到这张图片。再比如说,我去爬山,得说我去爬了哪座山,南岳衡山还是岳麓山,搜索引擎才会搜到。 so从搜索引擎上下下来的这种图片文本对,里面的文本都是具备搜索属性的,但并不是特别好描述性的一个句子。
    作者提出一个方法,叫做Momentum Distillation,也就是自训练方法去学习(一听就pseudo-label伪标签)。伪标签咋来?从MOCO里的momentum model里拿到伪标签,从而达到自训练的结果。
    结论:文章里这些训练的目标函数,包括LLM,ITM还有就是momentum distillation其实它们最终的作用,都是为同一个图像文本对去生成不同视角,也就是变相在做一种data augmentation,从而让最后训练出的模型,具备semantic preserving的功能。
    也就是说,只要是语义匹配的图像文本对,就应该被当成是一对。

    image.png
    把Transformer劈成了两部分,前6层做文本的编码器,后6层做多模态融合的编码器。
    首先看图像这边,图像就是给定任何一张图片,按照Vision Transformer的做法,把它打成patch,通过patch embedding layer,送给一个Vision Transformer,这里就是一个非常标准的12层的Vision Transformer的base模型。如果这里的图片是224×224的话,那sequence length就是196,再加上一个额外的CLS token,就是197,它的特征维度就是768,所以里面这个绿黄色的特征就是197×768。
    但在预训练阶段,用的图片是256×256,所以sequence length就会相应再长一点。预训练参数用的DEiT。
    文本这边,把大模型劈开,劈成两个部分,只用前六层做文本编码,因为本来就希望文本编码器比图像编码器要弱一些。把剩下的六层transformer encoder直接当做multi-modal fusion的过程,这样一举两得,跟之前的方法有同样的计算复杂度。
    (其实就是用bert模型去做初始化。特征维度也是768,也有一个[CLS] token,代表了整个句子的文本信息。)
    之后,为了做后面的momentum distillation,以及为ITC loss提供更多的negative,所以还有一个momentum的model。右边的模型参数,是由左边在训练的模型参数,通过moving average得到的,也就是Momentum model。
    这里通过把moving average的参数设得非常高,在论文里是0.995,从而来保证右边的Momentum Model不会那么快地更新。
    【目标函数】把那个黄色的小块当全局特征,也就是一个768×1的向量,文本这边也一样,先是tokenize之后,就把文本text变成一个tokenization的序列,然后把它扔给BERT的前6层,得到一系列的特征。这边的[CLS] token也就当做了文本的全局特征:一个768×1的向量。接下来的操作跟MoCo一模一样,先做一下downsample和normalization,就把768×1的向量变成了256×1,文本那边同样,希望这俩特征尽可能地近。负样本全存在一个q里,这个q里有65536个负样本,但它没有gradient,因为它是由mementum model产生的,所以它并不占很多内存。
    因为你有很多很多负样本,通过正负样本之间的对比,就可以对模型进行第一阶段的学习了。也就是——align before fuse的align。
    也就是说,在我们把这个图像特征和这个文本特征扔到multi-modal fusion的encoder之前,就已经通过ITC loss让图像特征和文本特征尽可能拉近了(尽可能在一个embedding space里)。这里的ITC loss的实现完全按MoCo来,就是算了一个cross entropy loss。
    有了这个ITC loss之后,transformer的12层和Bert的前6层都可以训练了,但是BERT的后6层(即多模态的融合部分)该怎么训练呢?
    先说下ITM loss,也就是Image Text Matching。(二分类任务)在选负样本的时候,给它一些constraint,在ALBEF这篇论文里,它采用了最常用的一个方法,就是通过某种方式,去选择最难的那个负样本,也就是最接近于正样本的那个负样本。
    具体来说,在ALBEF这篇论文里,它的batch_size是512,对于ITM Loss来说,正样本对就是512个。
    对于mini-batch里的每个正样本,去哪找它的hard negative的文本呢,这个时候ITM还依赖于之前的ITC。
    最后的损失函数为
    L=L_{itc}+L_{mlm}+L_{itm}

    【Momentum Distiilation动量蒸馏】
    Why要做动量蒸馏?主要就是noisy的web data,摘要的时候也说了,网上爬下来的数据关联性不那么强。比如算ITC loss的时候,对一张图片,它的所谓的负样本文本其实也可能描述了这个图像里的很多内容,甚至比Ground Truth pair描述得还好,但我们非要把它当成是一个负样本。这个时候就会对ITC的学习造成很大的影响。
    对于MLM来说,做了这么多年完形填空,大家也知道,有时候填进去的词其实比标准答案还准确。
    so用从网上爬下来的one-hot label表明图像-文本是一对/不是一对,对ITC和MLM两个loss来说是不好的,因为有的负样本也包含了很多的信息。一味在算loss的时候去惩罚那些负样本,会让模型的学习变得非常困难。
    所以希望不是one-hot,而是multi-hot或者说它就是另一个模型的输出。
    so,首先构造一个动量模型去生成伪标签,这个伪标签其实就是一个softmax score,不再是一个one hot label了。
    具体咋构造的呢?就是在原模型的基础上,做EMA。目的是在训练原模型的时候,不光让它的预测跟ground truth的one hot label尽可能去接近,还想让这个动量模型出来的伪标签尽可能去match,也就是说,很多的信息从one-hot label中去学,但是当这个one hot label是错误的,或者是noisy的时候,我们希望这个稳定的momentum model能够提供一些改进。

    ALBEF-Motivation

    Detector-based Method
    在ALBEF之前,视觉语言学习一般都是基于Detector,因为基于Detector可以提取到图上一些object或region,这些region会跟文本一起训练。
    Why这样?
    因为视觉Transformer还没有火起来。
    缺点:由于detector有很多视觉的anchor和bounding box,它的计算复杂度是非常大的,同时,由于现在的目标检测都是有标注的数据集,比如CoCo或者其它数据集,这种数据集它们的物体类别数非常有限,大模型的性能就往往受限于Detector的性能。
    ALBEF如何解决以上的问题?
    ALBEF提出,不用这样的object detector,这样是不是训练的效率会变高,同时我们最终大模型的能力不再受限于目标检测器的性能?


    image.png

    从左到右,输入image input,会经过这样一个transformer提取出图像的embedding,同理文本也会得到这样一个embedding,由于文本和图像得出的embedding会有[CLS]这样一个embedding,由注意力机制这样一个运算的特性,[CLS]embedding往往包含了全局图像的信息。那么用图像的global embedding和文本的global embedding做一个对比损失函数(其实就是图文的对比学习)。之后在多模态的编码器上,进行cross-attention,两个embedding可以进一步地融合,可以看到,它分别执行了两个任务,分别是ITM和MLM,
    ITM是图像文本的匹配任务,(二分类任务)。它比较难的负样本从哪里来呢?就是从对比学习中来。
    MLM,就是bert的任务,完型填空。
    这三个任务联合使用,就可以对ALBEF进行训练。
    至于动量模型,

    BLIP一经推出,轰动多模态领域,更有甚者,称BLIP2是下一代多模态学习的启发性工作。

    VLMO

    贡献点:

    • 模型结构上的改进:Mixture-of-Modality-Experts
    • 训练方式上的改进:分阶段的模型预训练。
      现在多模态学习领域,大概有两个主流的模型结构,一个是像CLIP Align这种,采用了dual-encoder也就是,双塔结构,即图形有一个模型,文本有一个模型,双塔完全分开的,谁跟谁都不沾,模态间的交互用一个很简单的Cosine Similarity去做。这个方式对检索任务来说极其有效,因为它可以提前把特征都抽好,接下来直接算Similarity就好。所以极其适合大规模的图像文本的检索,且非常具有商业价值。但它的缺点也可见,就是说如此shallow的交互,只算了一个Cosine Similarity,是无法做这种多模态之间的比较难的情况的。
      比如在ViLT里面就有介绍,如此shallow的交互,CLIP在一些下游任务里的表现是不太好的。
      另一种就是单塔,先把图像和文本分开处理一下,单塔就是Fusion Encoder的方法,做模态交互的时候,我用一个Transformer Encoder去好好做一下模态间的交互,这样就弥补了之前双塔模式的缺陷。所以说在Visual Language Classification的Task上,取得了很好的效果。但它做检索任务的时候,因为你只有一个模型,因此你必须同时做推理,当你图像文本对,数据集特别大的时候,就要把所有可能的图像文本对全都同时去编码,然后算Similarity Score,所以说它的推理时间就会变得非常慢。

    就想,既然你各有各的优缺点,能不能把二者结合呢?在做推理的时候,把你当dual-encoder来用,想把你当Fusion-encoder来用的时候,就当fusion-encoder。如果能达到这个灵活性,岂不是特别美好?!
    所以就引出了Miture-of-Modality-Expert。很简单来说,自注意力对所有模态都是共享的,但是在fc层,每个模态会对应自己不同的Expert,即视觉有视觉的Expert,语言有语言的Expert,Multi-modal就对应Multi-modal的Expert。这样,在训练的时候,哪个模态的数据来了,我就训练哪个模态的Expert,然后在推理的时候,也能根据现在输入的数据,去决定我该用什么样的模型结构。
    另一个研究动机,VLMo的损失函数,即ITC,ITM和MLM跟ALBEF是一样的,多模态学习也希望,数据越多,性能越好。CLIP其实已经在某种程度上验证这一点了,所以大家自然想在更多的数据集上做预训练,有标签的数据少,无标签的数据还不够嘛。所以作者想,分阶段训练,先把vision expert在视觉数据集这边训练好,再去把language expert在language那边的数据集上训练好。
    这个时候,模型本身的参数是非常好地被初始化过了。你再在多模态数据集上做pretraining,效果应该就好很多了。


    image.png

    作者先做Vision pretraining,再做Language pretraining,最后再做Image-Text pretraining。在做Vision Pretraining的时候用的是无监督,自己团队提出的BEiT。在做Language pretraining的时候就是Mask Language Modelling,最后做Vision-Language pretraining的时候就是三个目标函数。作者在训练的过程中,到底哪些层是冻住的?如图所示。


    image.png

    BLIP

    Bootstrapping:从数据集出发,比如有一个从网页上爬下来的,很noisy的数据集,先用它训练一个模型,接下来再通过一些方法去得到一些更干净的数据,再用这些干净的数据去训练出更好的模型。
    Unify:Understanding&Generation。
    研究动机:
    (1)模型角度。最近的方法,要么用了Transformer Encoder的模型(CLIP,ALBEF),另一种用了encoder-decoder的方法,Encoder-Only的模型没法很直接地应用到text-generation的task里,比如image-captioning(只有编码器,没有解码器,拿啥去生成字幕呢?)而对于Encoder-Decoder,因为没有统一框架,所以不能用来做image-text retrieval的任务。
    (2)数据角度。CLIP,ALBEF,SimVLM都是在大规模网络数据集(noisy)的image-text pair上去预训练,不太好,如何有效clean这些dataset,更好利用信息,作者提出了Captioner这样一个module,即给定任意一张图片,通过Captioner去生成一些字幕,这样就会得到大量合成数据(synthetic data),同时去训练Filtering model,它的作用是把那些图像和文本不匹配的对从这个数据集里删掉。


    image.png

    相关文章

      网友评论

          本文标题:ALBEF,BLIP和BLIP2全系列工作串讲

          本文链接:https://www.haomeiwen.com/subject/jzecddtx.html