参考:多模态论文串讲·上、多模态论文串讲·下、多模态论文串讲
论文链接放在每一小节前面。
Review:
ViLT论文的研究动机其实就是为了把目标检测从视觉端拿掉。图文多模态任务,关键是提取视觉特征和文本特征,然后对齐。在之前的多模态研究工作中,视觉侧通常需要一个目标检测器来确定图像中物体所在的区域,再提取各区域的特征。ViT 将 Transformer 迁移到视觉领域之后,人们意识到,直接使用 patch projection 来处理图像输入也是可行的。由此,ViLT 首次使用 patch projcetion 来直接提取图像特征,摆脱了笨重的目标检测器。
但ViLT由两个局限性
- 虽然 ViLT 通过改用线性映射,降低了视觉端嵌入网络的复杂度,但是性能有所下降。原因是文本端的 tokenizer 已经有一定语义理解能力了,而视觉端的 patch embedding 是随机初始化的。
- 虽然 ViLT 的推理很快,但是训练时间比较长。
CLIP一种典型的双塔结构:在视觉端和文本端分别有一个独立的编码器来提取视觉特征和文本特征,而模态间的交互就是简单的点乘余弦相似度。CLIP可以提前把数据库里所有的图像文本的特征提前抽好,想用的时候直接点乘。
CLIP的缺陷:
- 它虽然对图文匹配任务在行,但是对别的任务VQA、VR、VE就不太行。因为只靠一个点乘没法分析特别复杂的情况。
总结:根据ViLT论文里的figure2, 可以得出这样一个结论,我们需要好的visual embedding,图像编码器比文本编码器要大(假设1),因为图像更为复杂,同时modality interaction也要很好(假设2),text embedding已经很成熟,一般用BERT,这个已经很轻量化了。因此我们总结出理想化的情况应该是接近下图(c)的情况。
我们可以考虑一些常用的loss: ,下面前三个loss是比较好用的。
- Image text contrastive loss(CLIP模型训练方式)
- Image text matching loss(BERT训练方式)
- Masked language modelling loss(ViLBERT和ViLT使用过)
- Word patch alignment (这个在vilt中用到,但是计算很慢)
通过总结,就可以引出ALBEF
一、Transformer Encoder
1.1 ALBEF
论文:Align before Fuse: Vision and Language Representation Learning with Momentum Distillation
- 贡献1(出发点):在multimodal interaction之前我们要align好text and image token,以便于multimodal encoder学习。ALBEF 提出在进行多模态交互之前,先通过一个对比损失(其实就是 CLIP 中的 ITC 损失)来对齐图像和文本数据。
- 贡献2:不同的损失函数其实是在为同一个图像文本对,生成不同的视角,变相地做data augmentation,达到semantic preserving的目的。
1.1.1 模型方法
在这张图中,满足了我们两个假设,文本编码器比图像编码器小且模态融合也大。同时也用了我们提到的三个loss去训练模型:Image-text contrastive loss(ITC)、Image text matching loss(ITM)和Masked language modelling loss(MLM)。
1.1.2 目标函数
通过对比学习可知,只要定义一个正样本对和多个负样本对,就可以进行对比了。我们希望正样本对之间的距离越来越近,正负样本对之间的距离越来越远。首先要做的就是去出去这种全局特征,在特征之间去做embedding space上的拉近和拉远。
- ITC loss, image-text contrastive loss。图像和文本分别通过encoder tokenise, CLS token是一个全局特征(图中绿色方块旁边的黄色方块), down sample和normalisation(786x1 => 256x1),然后进行正负样本的对比学习(预先存了很65536个负样本q,没有gradient,由Momentum Model产生),这一步就是align。
- ITM loss, image text matching loss。在multimodal encoder的输出之后加一个二分类头(FC层),这里很特别的是,每个batch里我拿一个图片和batch里除了配对文本之外的所有的文本做cosine similarity (借助之前ITC的那个模块),挑一个相似度最高的作为负样本 (hard negative) 来训练,来加大难度。
- MLM, masked language modeling。类似BERT的完形填空,mask一个词语,去预测mask的词语,但是融合了图像的信息。
在这里有一个小细节,计算ITC和ITM loss的时候,输入的都是原始的image and text embedding(下图橙色的T '表示masked text embedding),算MLM loss的时候,用的是原始的image embedding,但是是masked后的text embedding,因此每一次训练iteration其实做了2次forward,一次用了原始的image and text embedding,另一次用了原始的image和masked的text embedding,因为你要算多个loss函数。
最后的目标函数计算如下:
1.1.3 Momentum Distillation
做动量蒸馏(Momentum Distillation)的动机:从网上爬下来的图像文本对通常weakly-correlated,即文本并没有很好地描述图像,从而产生了noise。这种弱关联的训练样本中可能出现某些负样本的图文匹配程度,比 GT 中正样本的 one-hot 标签的匹配程度更高的情况,不利于 ITC 和 MLM 两种任务的训练。
ALBEF 中除了梯度更新的主模型之外,还有一个动量模型,用于为主模型的训练生成 multi-hot 的伪标签。动量模型通过滑动指数平均(EMA)的方式,根据主模型进行动量更新。这样,除了Ground Truth(GT,真实标签)中的 one-hot 标签,我们就又得到了multi-hot的伪标签(pseudo-targets),用于 ITC 和 MLM 任务的损失计算。补充一句,对于 ITM 任务,由于其本身就是基于 GT 的二分类任务,并且通过 ITC 中计算的相似度结果进行了难负例挖掘,因此无需进行动量计算。
实际上论文设计了5个loss,2个ITC,2个MLM,1个ITM,ITM这个loss ground truth很清晰,所以不需要momentum的版本。
总的来说,ALBEF不论是在训练速度上还是在推理速度上,又或者是在通用性、性能表现上都比较亮眼。(代码还是开源的!!!)
1.2 VLMo
论文:VLMo Unified Vision-Language Pre-Training with Mixture-of-Modality-Experts
- 贡献1:dual-encoder (双塔模型,如CLIP) 解决了检索问题,而fusion encoder,也叫单塔模型,解决了不同模态之间的交互问题,VLMo就把2种的好处都结合了起来,一个模型,想当双塔和单塔 (论文命名为vision-language expert, language expert, vision expert,其实就是不共享参数的FC层) 用都可以。
- 贡献2:分阶段模型训练的改进(stage-wise pre-training), 简单来说就是多模态的数据集不够大,那我就先预训练单独的一个模态。
1.2.1 引言
解释两个贡献的研究动机:
- 为什么提出MoME(Mixture of Multi Expert):双编码器模型(dual-encoder)的优点是在进行检索等任务时,可以预先对数据库中的数据进行特征提取,运行效率高。缺点是模态交互部分只有一个简单的余弦相似度的计算,过于简单。在视觉推理等模态交互复杂的任务上表现较差。与之相反的,融合编码器模型(fusion-encoder)的优点是模态交互充分,缺点是无法预先进行特征提取,效率稍差。为了解决这种冲突,VLMo 提出了 MoME(Mixture of Multi Expert),由不同的 “专家” 来处理不同类型(文本/图像)的输入数据。简单来说,就是在每个 Tranformer 块中:自注意力层权重在不同类型输入间共享,而 FFN 层权重则根据输入类型的不同而不同。
- VLMo的目标函数和ALBEF一样也是ITC、ITM和MLM。因为在NLP使用Transformer时,数据集越大训练效果越好,在做多模态时也希望如此,但是在当时还没有开源的大规模数据集。曲线救国:所以VLMo的作者想到可以用文本和视觉各自领域的超大规模数据集先分别对 “文本专家” 和 “视觉专家” 进行预训练(stage-wise pre-training),然后再在多模态数据集上进行预训练。
1.2.2 模型结构
在预训练任务的选择上,VLMo 与 ALBEF 一致,同样使用 ITC、ITM 和 MLM 三种,并且同样借助 ITC 为 ITM 进行hard negtives。在进行不同的任务时,会使用 MoME 结构中不同的 FFN 层参数进行训练:
- ITC:在计算 ITC 损失时,VLMo 的模型是一种 “dual encoder” 模型,以双塔的结构分别对文本和图像进行嵌入。
- ITM、MLM:在计算 ITM、MLM 损失时,VLMo 模型又成了一种 “fusion encoder” 模型,分别提取图像文本的特征之后,再用 F FF 层 Transformer Block 进行模态融合。
MoME 结构最大的优势就是灵活。在训练时,对应不同的任务时使用不同结构计算损失函数,并更新对应参数。这样的训练有一个缺点是需要做多次模型前向。
1.2.3 分阶段训练方式
- 首先,VLMo 先在单独的图像数据上训练自注意力层和视觉 FFN ;
- 然后,在单独的文本数据上训练文本 FFN ;
- 最后,在多模态数据上训练自注意力层和三种 FFN 专家。
这里特别有趣的点是在单独的文本数据上进行训练时,自注意力层是冻结的。也就是说,通过图像数据训练出的自注意力层,在文本数据上甚至连微调都不需要,就能工作得很好。如果换过来,先文本,在视觉,效果会怎样呢(不好)?是否不同模态间的注意力是可以通用的呢?
未来的提升(作者都做到了):
二、Transformer Encoder-Decoder
2.1 BLIP
论文:BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation
BLIP是 ALBEF 原班人马做的,基本可以看做吸收了 VLMo 思想的 ALBEF。训练的 loss 和技巧都与 ALBEF一致,属于 ALBEF 的后续工作。
研究动机:
- 模型:最近要么用transformer encoder,要么用SimVLM,encoder only的模型很难用在文本生成任务,encoder decoder模型没有统一的框架很难做image-text retrieval 任务。
- 数据层面:CLIP,ALBEF,SIMVLM数据都是爬的,存在noisy,使用起来不好。如何更好利用?设计了captioner(生成好的描述性文本)和filter可以选择GT和cap的文本选个好的。
2.1.1 引言
BLIP 的两个关键点都包含在标题内,一是bootstrapping,是数据方面的改进,指的是用含噪声的数据训练出模型后,再用某些方法得到更干净的数据,用这些干净的数据训练出更好的模型;二是unified,指的是 BLIP 作为一种encoder-decoder架构,不只能做 understanding 类的任务(如VLMo介绍的下游任务),也能做generation 类的任务,如图像字幕 image captioning。
2.1.2 模型结构
BLIP 的模型结构和目标函数如上图所示,图中相同的颜色表示相同的参数。细分开来,BLIP 模型共包含四个网络。图中左侧是一个标准的 ViT 模型,用于处理图像数据。右侧三个网络都用于处理文本数据,但他们的细节有所不同,细节如下:
- Text Encoder,提取文本特征,用于与视觉特征计算 ITC 损失。Text Encoder 不与视觉特征计算交叉注意力。
- Image-gounded Text Encoder,与视觉特征计算交叉注意力,提取文本特征用于计算 ITM 损失。
- Image-gounded Text Decoder,与视觉特征计算交叉注意力,用于进行 LM 语言建模训练。为了进行语言建模训练,需要 mask 掉后面的单词。因此该网络的注意力层是 Causal SA,而非 Bi SA。
BLIP模型是ALBEF模型原班人马做的,所以与 ALBEF 一样,同样采用动量模型为 ITC 生成伪标签;同样使用 ITC 为 ITM 进行难负例挖掘。
BLIP 的整个模型称为MED(Mixture of Encoder and Decoder)。虽然看起来模型很多,但实际上大部分网络是共享参数的,因此实际模型参数增加并不多。和ALBEF的区别是 fusion的text是直接输入的,不是从文本的encoder获取的,因为参数共享,不用劈成两份了,第一个文本编码器和第二个文本编码器基本一样。
2.1.3 Caption Filter Model
它的出发点:假如有很多数据集D,里面可能有一些爬虫数据集、一些手工标注数据集coco。数据集中最大的问题是爬虫数据集的图片文本对不匹配,也就是下图中标红的数据。为了清洗数据集从而使模型达到最优解,怎么做呢?做一个模型!利用相似度来辨别是否匹配。
作者把MED也就是已经训练好的BLIP模型拿出来,然后把图像模型和两个文本模型(ITC和ITM的两个文本模型)拿出来,在coco数据集上做了一些很快的微调。微调后的MED就是Filter。
为什么有Captioner呢?BLIP训练出来的图像文本对比原始的图像文本对的文本描述更贴切,质量更高。然后就有了Captioner去训练出质量更高的图像文本对。
BLIP的特点:最显著的特点就是解码器输出的 caption 确实是不错,以至于很多下游任务都拿 BLIP 来生成 caption。
2.2 CoCa
论文:CoCa: Contrastive Captioners are Image-Text Foundation Models
它也是 ALBEF 的后续工作,模型非常像。区别在于:
- 图像用了 attentional pooling,这在本文的实验中有效
- 去掉了 ITM loss,目的是加快训练,原本文本需要 forward 2-3 次,去掉 ITM loss 之后只需要 forward 一次就可以了。
- 在 ALBEF 中,ITM 需要完整的 text,而 MLM 需要掩码,所以是两次输入。
- 在 BLIP 中,ITC 一次,ITM 因为在文本模型中插入了新的模块,所以得单独做forward。而 LM 因为用了既多了新的模块又得用 causal self-attention 所以又得单独做一次。
- 在 CoCa 中,为了完成captioning loss和ITC loss,只需要做一次forward即可。GPT 中把 cls-token 放在最后面就可以得到全局表征来做 ITC loss 了。
2.2.1 模型总览
从上图可以看出来,CoCa使SimVLM和ALBEF一个非常直接的后续工作。与 ALBEF 最大的不同在于:
- CoCa 左侧处理文本和进行多模态交互的网络是一个文本解码器(Text Decoder)而非文本编码器。目标函数为 ITC 对比损失和文本解码器的语言建模损失 。使用文本解码器,模型能够处理生成式多模态任务(如 image captioning)。
- 并且,CoCa 在图像编码器的最后使用可学习的attention pooling进行降采样。
- 另外,CoCa 没有使用 ITM 损失,减少了模型参数每次迭代所需前向传播的次数,大大降低了训练时间。
2.2.2 实验
这个实验数据集对比图画的非常好!!!
2.3 BEiT v3
论文:Image as a Foreign Language: BEiT Pretraining for All Vision and Vision-Language Tasks
BEiT v3的目标就是:做一个更大一统的一个框架。不论是从模型上还是训练的目标函数都要统一。用简单的一句话概括就是把图像也当成一种语言。
最大的亮点:用统一的multi-way transformer (mixture of experts ) 架构和单个masked modeling loss,将任意模态看做是同一个模态来建。
2.3.1 引言
BEiT v3 的关键词就是大一统(big convergence),输入形式大一统,目标函数大一统,模型大一统。BEiT v3 将图像也视作一种语言(Imglish),与文本输入(English),图像文本对输入(parallel sentence)一起,实现了输入形式的大一统。在输入形式统一之后,也不需要 ITC、ITM、MLM、WPA 等其他目标函数,而是可以使用统一的 mask modeling 来驱动训练。
BEiT v3 使用本组之前工作 VLMo 中提出的 MoME(本文中称为 Multi-way Transformer),对不同模态使用不同的专家 FFN,实现统一。
2.3.2 模型方法
模型结构就是之前VLMo 中的 MoME,自注意力层权重共享,根据不同的输入来选择不同的 FFN 专家。与 VLMo 不同之处在于训练的目标函数,是大一统的 masked data modeling,即遮住部分数据,要求模型还原出被遮住的数据。
- multiway transformer:VLMo 的模型 MoME。该网络的 transformer block 中的自注意力层是共享的,而 FFN 层(模态专家)则有三种,分别针对文本、图像、图文,当接收不同类型的输入数据时,数据会通过对应的 FFN 层进行计算。
- masked data modeling:BEiTv3 在单模态、多模态数据上,通过一个统一的掩码数据建模任务进行训练。在训练时,随机掩码掉一定比例的 token,然后训练模型恢复出被掩码的 token。统一的掩码数据建模不仅能够学习数据的表示,还能学习对不同模态数据进行对齐。BEiTv3 中,使用 SentencePiece 对文本数据进行 tokenize,使用 BEiTv2 中使用 VQ-KD 训练得到的 tokenizer 对图像数据进行 tokenize(得到离散的视觉 token),作为重构目标。
2.3.3 下游任务
如果想做下游任务的话,直接将需要的那部分模型拿出来即可。比如做视觉任务就拿视觉模型,做语言任务就拿语言模型。如果是做多模态任务,可以灵活地模拟不同的需求,比如:
- 做生成任务可以拿多模态部分的参数出来
- 做图文检索可以单独取出视觉部分和语言部分来模拟 CLIP。不仅仅是能做任意任务,还继承了前作的优点,比如 CLIP 这种弱跨模态交互带来的计算效率的优势。
三、总结
在多模态学习之前都是Oscar或者Uniter等这些工作,他们的缺陷都是因为里面用了一个Object Detection的模型去做视觉特征的抽取,太慢且太贵了。所以在Vision Transformer出来之后,ViLT的作者就想到可以把vision部分用Vision Transformer去代,就一个Embedding层,这样一来大大简化了模型结构。(ViT + Oscar =>> ViLT,是ICML21的工作)
CLIP也是ICM21的工作,经过一番总结经验和对比,ALBEF的作者发现CLIP很高效适合做Image Text Retrieval,并且由于Modality Fusion做的很好,多模态任务非常强,再加上ViLT结构比较简单。综合了上述三家的长处,就推出了ALBEF,Fusion Encoder的模式。(CLIP + Modality Fusion + ViLT =>> ALBEF)
由于ALBEF的结果不错、模型也比较简单,代码也公开了,在它之上延伸了很多工作。比如SimVLM就是用Encoder-Decoder去做多模态的,它的作者就在ALBEF的基础上推出了CoCa。模型结构比较简单,就用一个Contrast和captioning的两个loss,训练出来了非常强大的模型。
同时另外一个分支,有了ViLT和ALBEF之后,微软的研究者就推出了VLMo,用共享参数的方式去推出一个统一做多模态的框架。基于这种参数共享的思想、基于这种可以用很多很多Text Branch,ALBEF的作者又推出了BLIP模型,能做得非常好的Captioning的功能,而且它的Captioner Filter模型也非常好用。
回到ViT中运用的Mask Data Modeling的方式去self-supplied learning,但是效果不太理想。但是大家都认为Mask Data Modeling非常有前景,所以就顺着BERT的思想,微软的研究者提出了BEiT。在BEiT的基础上,推出了BEiT v2(主视觉)。因为BEiT能在视觉上做Mask Data Modeling,BERT能在文本上做Mask Data Modeling,结合两者推出了Vision Language BEiT(VL-BEiT)。 最后经过一系列的经验积累,作者最后把VLMo、VL-BEiT和BEiT v2结合起来推出了BEiT v3,大幅超过了之前的CoCa、BLIP在单模态和多模态上的各种表现。
再回到ViT,对于Mask Data Modeling来说,可以Mask and Predict不同的东西。比如BEiT就是Predict Patch。MAE的Mask Auto Encoder就是Mask Predict Pixel。把MAE有用的特性用在CLIP上就形成了FLIP。
多模态的飞速进展之其他系列:
- Language Interface:即使像BLIP、BEiT v3、VLMo这种模型,像搭积木一样,想做什么任务就拼出什么模型,然后再去微调得到你想要的结果。这还不够统一,真正Unify,真正大一统的框架是什么呢?其中就有微软的MetaLM和Google的PaLI,模型就是一个Encoder-Decoder,有图像、文本的输入,模型不论是在预训练的时候还是在下游任务的时候做什么,完全是由文本那边的Prompt决定,输出永远都是文字,属于Text Generation Task。这样一来,就算得上是Unified Framework。
- Generalist Model:通用(才)模型,不论是在预训练的时候还是在下游任务的时候做什么,都想直接用一个模型训练好之后做就完了,不想根据下游任务再去调整模型结构或者加一个Task Specific的Head,比如说分类头、检测头、分割头之类的。已经出现Unified IO、UniPerceiver、UniPerceiver v2、UniPerceiver MOE这些模型。