文章目录
- BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation 理解、生成我都要,一个很有效的、根据图片生成caption的工具
- 1. BLIP的研究动机
- 2. BLIP的模型结构
- 3. CapFilt Model
- 4. BLIP的训练过程
- CoCa: Contrastive Captioners are Image-Text Foundation Models 让模型训练得更快一点
- 1. CoCa的动机
- 2. CoCa的模型结构
- 3. CoCa的性能
- BEiTv3: Image as a Foreign Language: BEIT Pretraining for All Vision and Vision-Language Tasks 图片也是一种语言,大一统框架
- 1. BEiTv3的提出:大一统
- 2. BEiTv3的框架
- BEiTv3应用
- 多模态大模型总结
- 多模态大模型飞速进展之其他系列
- References
BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation 理解、生成我都要,一个很有效的、根据图片生成caption的工具
题目中有两个关键词,一个就是 Bootstrapping,另一个就是Unified,也就是这篇文章的两个贡献点。
第一个 Bootstrapping 其实是从数据集角度出发的,如果你有一个从网页上爬下来的很嘈杂的数据集,这时候你先用它去训练一个模型,接下来再通过一些方法去得到一些更干净的数据,然后再用这些更干净的数据看能不能训练出更好的模型。
第二个贡献点 unified 其实就从Vision-Language Understanding and Generation来看就非常明了,就是从模型角度出发,这两个方向,一个是understanding,也就是 image text retrieval、VQA、VR、VE 这些我们上次讲过的任务,还有就是 generation 这种生成式任务,比如说 image captioning,就是图像生成字幕这种任务。
1. BLIP的研究动机
1) 从模型角度出发
作者说最近的一些方法,主要就是用了 transformer encoder 的一些模型,这里举的这个CLIP,还有他们自己的 ALBEF。
- 这种 encoder only 的模型,它没法很直接的运用到这种 text generation 的任务里去,比如说图像生成字幕,因为它只有编码器,没有解码器,那它用什么去生成?当然也不是完全不行,但就说不够直接,肯定你要杂七杂八的再加一些模块儿,才能让他去做这种 text generation 的任务。
另外一种就是用了编码器解码器 encoder decoder 的结构,比如说后面这个就是 Sim VLM。
- 对于 encoder decoder 模型来说,它虽然有了decoder,它虽然可以去做这种生成的任务,但是反过来因为没有一个统一的框架,所以说它又不能直接的被用来做这种 image text retrieval 的任务。
2) 从数据角度出发
目前就是表现出色的这些方法,比如说 CLIP、 ALBEF,他们都是在大规模的这种网上爬下来的非常 noisy 的数据集上,也就是这种 image text pair 上去预训练模型的。虽然说当你有足够多、足够大的数据集的时候,它能够弥补一些这些嘈杂数据集带来的影响,也就是说通过这个把这个数据集变大,你还是能够得到非常好的这个性能的提升的。
BLIP 这篇论文就告诉你,使用这种 Noisy 的数据集去预训练还是不好的,它是一个 suboptimal,不是最优解。 那如何能够有效地去 clean 这个 Noisy 的 dataset? 如何能够让模型更好地去利用数据集里的这个图像文本配对信息?在 BLIP 这篇论文里,作者就提出来了这个 captioner 和 filter。
- captioner 的作用就是说给定任意一张图片,用这个 captioner 去生成一些字幕,这样就会得到大量的合成数据 synthetic data。
- 同时再去训练这么一个 filtering model,它的作用就是把那些图像和文本不匹配的对都从这个数据集里删掉。 比如说在这个例子里,这就是一个巧克力蛋糕。那原来从网上直接爬下的这个图像文本对里的文本写的是 blue sky Bakery in Sunset park,一家位于日落公园叫蓝天的蛋糕店,那我们可以很明显的看出来这个图文其实是完全不匹配的。之所以它这个文本是这样的,其实是因为有利于这个搜索引擎去搜索,因为大家看到这个蛋糕的图片之后,更想做的是去知道这家蛋糕店在哪,我怎么能去买到这家蛋糕,这样搜索引擎才能收广告挣钱,这个蛋糕店的店主也能得到更多的客流量。所以大部分你爬下来的那些数据集,不论你爬了几百万、几千万、上亿的图片文本对,里面大部分都是这种不匹配的 Noisy 的文本对。
而BLIP训练的这个 captioner 这个模型,它其实可以生成非常好、非常有描述性的这个文本,那所以在接下来他们训练的这个 filtering 模型来看,他们就会选择这个图像文本对去进行模型的训练,而不用原来的那个真实的图像文本对去进行训练。
2. BLIP的模型结构
结合了 ALBEF 和 VLMO,作者提出了 BLIP 这个模型。
BLIP模型包含四个部分:
图像:一个完整的 ViT 的模型,一个 N 层的 ViT 模型,而且是非常标准的 self attention 和 feed forward。
文本:包含三个模型,分别用来算三个不同的目标函数。 这个就跟 VLMo 已经非常像了,它根据你这个输入模态的不同,它根据你这个目标函数的不同,它去选择一个大模型里不同的部分去做这个模型的forward。
- Text Encoder。第一个文本模型也是N层,目的是根据输入的文本去做understanding,去做这么一个分类的任务。所以说当得到了这个文本特征之后,他就去跟这个视觉特征去做 ITC loss。
- 第二个文本模型,Image-grounded Text encoder,是一个多模态的编码器了,这里是借助了图像的信息,然后去完成一些多模态的任务,很显然那这个就是要做的 ITM loss。
如果将第二个文本模型放在第一个文本模型上面,就变成了ALBEF。但是它跟 ALBEF 有一点不同,这是它借鉴了VLMo里,这个 self attention 层是可以共享参数的,所以就不需要把一个文本模型劈成两个部分去用了,它可以就用一个文本模型,但是共享参数。 图中同样的颜色代表同样的参数,就是共享参数的,它不是两个模型。所以相当于第一个文本编码器和第二个文本编码器,它基本就是一样了,它的这个 SA 和 FF 全都是一致的,只不过第二个里头多了一个 cross attention 层,需要新去学习。 - 目前的这个结构,它还是只能做这种VQA、VR、VE 这种 understanding 的任务。那怎么去做生成的任务?这个 decoder 在哪?所以在后面再加一个文本的decoder——Image-grounded Text decoder。
但是对于 decoder 来说,它的这个输入输出的形式,和尤其是第一层的这个 self attention 是不太一样了。因为这个时候他不能看到完整的这个句子,因为如果他已经看到完整的句子,他再去生成这个句子,那他肯定能 100% 生成出来这个句子,那就训练就没有难度了,那它必须像训练 GPT 模型一样,它把后面的这些句子都挡住都 mask 掉。它只通过前面的这些信息去推测后面的句子到底长什么样,这才叫 text generation。所以说它的第一层用的是 causal self attention,也就是因果关系自注意力,就是你要去做一些这个因果推理,你要通过前面的这些文本去推测后面的文本到底是什么。
但是除了第一层的这个自注意力之外,后面的这个 cross attention 和 feed forward,它就跟前面的全都是共享参数的了。所以说名义上它新添加了一个 text decoder,但事实上参数量并没有增加多少,只是增加了一些 causal self attention。
最后的目标函数就是用的 GPT 系的这种 language modeling,也就是说给定一些词,还去预测剩下的那些词,这个就叫 language modeling(LM)。那对于MLM,也就是 ALBEF 和 VLMo之前用的那个目标函数,那个是属于完形填空,就给一个句子中间词抠掉,我去预测中间这个词,所以说 LM 和 MLM 其实是不一样的,那在这篇论文里,因为作者要去做这种生成式的任务,所以更好的一个选择是使用 language modeling 的目标函数。
快速总结一下,就是说对于图像它就有一个ViT,但是对于文本来说,它对应了三个模型,分别是一个标准的 text encoder,然后还有就是 image-grounded text encoder 和 image-grounded text decoder。但不论你是 encoder 还是decoder,其实模型之间的差距都是非常小的。比如说对于 image-grounded text encoder,它就有一个新的 cross attention,然后对于 image-grounded text decoder,它就有一个新的 causal self attention,剩下的部分其实基本都是共享参数的。
然后就跟 VLMo 一样,当我们选择前两个模型的时候,我们就去算这个 ITC loss。当我们选择第一个和第二个模型的时候,我们就去算 ITM loss。当我们选择第一个模型和第三个模型的时候,我们就去算这个 LM loss。
【Note】一些细节问题
- 对于三个文本模型来说,它们对应的这个 token 就不一样,第一个文本模型就用的是 CLS token,第二个用的是Encode,第三个用的是Decode。
- 这些模型都很难训练,训练的代价非常高,原因就是因为在做每一次这个 training iteration 的时候,图像端其实只需要做一次forward,但其实文本端在这里要做三次forward,要分别通过这三个模型去得到对应的那个特征,然后去算对应的目标函数,所以还是非常费时间的。
- 因为 BLIP 就是 ALBEF 的原班人马做的,所以说里面用到了很多 ALBEF 的技巧,比如说在算ITC的时候,它也用了 momentum encoder 去做更好的 knowledge distillation,也去做更好的这个数据集的清理。同时在算 ITM loss 的时候,也像 ALBEF 一样,利用 ITC 算的那个 similarity score 去做 hard negative many,从而每次都用那个最难的负样本去算这个ITM,从而增加这个 loss 的有效性。
总之这就是 blip 的模型结构。文章中作者把这叫MED,就是 mixture of encoder and decoder,就是把编码器和解码器混到一起了。
3. CapFilt Model
出发点、研究动机
假如说你有很多这个数据集,这个 D 里面可能有一些网上爬下的数据集,可能有一些手工标注的数据集。 当然像 CLIP 模型的训练,他就没有用这个手工标注的数据集,就只用从网上爬下来的那 400 million。但是有的时候,反正手工标注的数据集,比如说 COCO,不用白不用,所以有的人也会用。总之对所有的现有的这个数据集D来说,它最大的问题就是说从网页上爬上的数据集这个图片文本对不匹配,也就是说这里的这个
T
w
T_w
Tw 不好,所以作者这里用红色来表示,然后这个 COCO 手工标注的
T
h
T_h
Th,他认为这个文本就一定匹配,所以用绿色来表示。
如果你用这种 Noisy 的数据集去预训练一个模型,它的效果就不是最好。那如果我们想清理一下这个数据集,从而去达到这个最优解,该怎么做?那很自然的我就需要训练一个模型,这个模型最好是能给我一些像图像文本之间这个相似度,那相似度高的就说明匹配,相似度不高的可能就不匹配,所以这也就是 Filter 这个模块的由来。
Filter的训练
把已经提前预训练好的这个MED,也就是把已经训练好的这个 BLIP 模型拿出来,然后把图像模型和两个文本模型(就是分别做 ITC 和 ITM 的那两个文本模型)拿出来,然后又在 COCO 数据集上,就是在干净的数据集上又去做了一些很快的微调,新训练出来的这个就是微调过后的这个 MED 就叫做 Filter 了。
那接下来主要用这个模型去算一下这个图像文本的这个相似度,尤其是这个 image text matching 的这个分数,那它就知道到底这个图像和文本是不是一个 match 了,那不是match,自然它就可以把它拿掉。
通过这个Filter,就可以把原始爬下来的这个图像文本对,也就是红色的 T w T_w Tw 变成稍微clean一点的图像文本对,即绿色的 T w T_w Tw。
那其实到这里这个任务其实就已经完成了。
为什么还要加一个Captioner?
主要原因是因为作者在训练出来那个 decoder 之后,他发现这个 BLIP 模型训练好的这个 decoder 真的是非常的强,它有时候生成的那个句子比原始的那个图像文本对要好很多。就即使原来的那个图像文本对儿是一个match,它俩是匹配的,但是新生成的这个文本更匹配,它的质量更高。
那用生成的这些文本去充当新的训练数据集,那会不会得到更好的模型?
Captioner的训练
也是在 COCO 这个数据集上把已经训练好的 image-grounded text decoder 又去微调了一下,然后就得到了这个Captioner。
给定任意一张从网上爬下的图片,然后他就用这个 captioner 去给这个图片去生成新的字幕,也就是红色的这里的 T S T_S TS,当然 T S T_S TS 的质量可高可低,这个完全是由模型来决定,有的时候就描述的特别好,那有的时候可能就是非常差,就有可能甚至都不 make sense 了。所以这里还是用红色去表示的,因为它是 synthetic date。
最后通过 Captioner 和Filter,我们得到的数据集就从原来的 变成了现在的,多了一项。
包括Filter过后的数据集、新合成的数据集和手工标注的数据集。总之,这个数据集不仅变得更大了,而且质量变得更高了,这个时候再拿新的D返回来再去训练一个BLIP模型,模型的提升非常显著,而且还有很多有趣的应用。
这就是本文第二个创新点,CapFilt模型做到了数据集上的这个bootstrapping。
4. BLIP的训练过程
【Note】 bootstrapping 的过程,它其实是一个分阶段的训练,就跟 VLMo 一样分阶段,BLIP其实也是分阶段。
Stage 1:用嘈杂的数据集预训练了一个模型。
Stage 2:用COCO去微调Captioner和Filter,把数据集重新处理一遍,得到一个新的、更高的质量、更好的数据集。
Stage 3:用新的数据集又pre-train了一个BLIP。
这三个stage其实都是互不相干的,其实是可以分开训练或者分开使用的。 意思就是说,即使这个模型是 ViT base,就模型可以很小,但是我在第二阶段生成这个新的数据集的时候,我可以用更大的这个模型,用更大的那个MED,更大的 capfilt 模型去生成更好、质量更高的这个数据集。 并不一定说第一阶段的模型是base,我那个 capfilt 模型就一定要用 base 生成数据,这一步完全是一个额外的步骤,完全是另外一步 pseudo labeling 的过程,理论上我也可以用任何一种方式去生成这种 pseudo label,所以这个就很有意思,也就是说 理论上你是可以拿 blip large 训练出来的这个Multimodal mixture of Encoder-Decoder (MED)——这个 caption filter 去生成更好的这个数据,然后去给别的模型做训练用。 你可以拿这个数据去训练VLMO,你也可以拿它去训练Coca,去训练各种各样的多模态的模型,因为它的目的就是生成更好的数据,所以是一个非常通用的工具。
CoCa: Contrastive Captioners are Image-Text Foundation Models 让模型训练得更快一点
从题目上来说,顾名思义就是 contrastive captioner。那我们大概也可以猜出来,模型可能就是用这两个目标函数训练出来的,一个就是 contrasive loss,一个就是 captioning loss,所以听起来跟 blip 非常的像。
1. CoCa的动机
CoCa将解决图像或多模态问题的模型概括成 3 种经典结构,分别是 single-encoder model、dual-encoder model、encoder-decoder model。
Single-encoder model 指的是基础的图像分类模型,dual-encoder model 指的是类似 CLIP 的双塔图文匹配模型,encoder-decoder model 指的是用于看图说话任务的生成式模型。
CoCa 的出发点就是将三种类型的模型结构进行统一,它是 ALBEF 的后续工作,从结构上看来,都是左侧处理图像,右侧文本从中间劈开,前半段处理文本,后半段进行不同模态的融合。
2. CoCa的模型结构
但是CoCa跟ALBEF还是有区别的:
- 在图像这一块,它做了attentional pooling,这一部分是可学的,作者就发现这种可学的 pooling 方式能够针对不同的任务学到更好的特征,从而能对最后的这个多模态学习产生更好的影响。
- 不论是单模态的这个文本特征的学习,还是多模态的这个特征学习,整个文本这一端全都是用的decoder而不是encoder。这也就意味着文本这边的输入从一开始前面的这个 self attention layer 就是 causal 的,也就是说 mask 住这个一个句子后半部分,然后我用前半部分去预测这个后面是什么,也就是 BLIP 的 language modeling loss。
为什么文本这一端为什么统一都用decoder?然后训练目标函数为什么只用一个 captioning loss 而不用 ITM loss?
为了解决训练效率问题! 不论是 ALBEF 还是VLMO,因为它要去算各种各样的这个目标函数,所以它往往一个 training iteration,它要 forward 这个模型好几次,那这无形中就增加了这个模型训练的时间长度。明明是训练 100 个epoch,那其实你 forward 了 3 次之后,你相当于是训练了 300 个epoch,那作者这里就想我能不能只做一次forward,那这不一下就减了一半或者甚至 2/ 3 的这个计算量吗?
为了让 ITC loss 和 captioning loss 能同时计算,所以说这个文本的输入从刚开始就必须是causal 的——从刚开始就必须是把后面都 mask 掉的,这样子通过 unimodel text decoder 出来的特征能直接去做 ITC loss,然后同样的输入得到的这个多模态特征也直接能去做 captioning loss。这样一个 eternity iteration(无限循环)就是指 forward 的一次。这个训练时间就会降低一些。
这里在右边也提供了伪代码,所以说想实现这个算法并不难,但是想复现它那难度是非常大的。因为方法很简单,所以说它能 scale 得非常好。在 CoCa 这篇论文里,它训练出来最大的这个模型,它的参数量已经达到了 2.1Billion ,已经算是视觉或者说多模态里面非常大的一个模型。当然在 NLP 那边儿已经有几十亿上百亿的模型了,这个跟那个比小巫见大巫,但是在视觉这边 2.1Billion 还是非常大。
3. CoCa的性能
多边形的每一个顶点其实都代表了一个数据集,或者说是一个任务。 总之就是方方面面各种各样的任务都画到了这个多边形的每一个顶点上。那显而易见,哪个方法能够做所有的这些任务,而且在所有的这个任务上它的效果都好,那就说明这个方法是真的好。这里蓝色这个框指的是 SimVLM,就是他们组之前自己的工作; Florence 就是 Microsoft 那个 foundation model,都是非常大的模型,但我们可以看到这些模型它有的任务能做,或者说它 report 的分数,有的任务它就没有去 report 分数。然后黄色的这个圈就指的是之前在所有的这些数据集上不同的方法表现出来的,SOTA 的 performance,就是这些分数,它不是由单个模型得到了,是在每一个单独领域里现在最强的那个王者,他得到的这个性能是多少。然后 CoCa 展示的恐怖的性能就是在这些 state-of-the-art 的外面。然后这个紫色的框就是 CoCa 的性能了,它比之前所有的方法在这些所有的任务和数据集上都取得了更好的效果,而且在大部分数据集上都获得的是大幅度的提升。
总之总结一下就是不论你用 ALBEF 或者说 CoCa 这个模型结构,还是说像 VLMo、BLIP那样用多个模型,去共享参数都是可以的。当你把这个模型做大,数据集做大之后,我相信他们的这个性能都差不多,其实往往最后拼的都是数据。
BEiTv3: Image as a Foreign Language: BEIT Pretraining for All Vision and Vision-Language Tasks 图片也是一种语言,大一统框架
BEiTv3 这个目标非常明确,他就是想做一个更大一统的一个框架,不论是从模型上要统一,而且从训练的目标函数上要统一,还有就是模型大小,数据集大小,这上面这个怎么 scale 也要统一。作者管这个叫做 big convergence。
简单用一句话来概括,其实 BEiTv3 就是把图像也看成了是一种语言,这就是他们题目的意思 image as a foreign language。在文章中其实把这个 image 叫做imagelish,然后文本叫做English,然后把这个图像文本对叫做 parallel sentence。那这个时候不论是图像还是文本,都可以用 mask modeling 去做,所以就不需要什么ITC,ITM, LM 或者word patch alignment 各种各样的loss,就用一个 loss mask modeling 就足以了。
在模型层面,用的是他们之前 VLMo 提出的,那在这篇论文里作者又重新起了个名字,管他们之前提出的那个框架叫做 Multiway Transformers,目标函数也就一个就是 mask modeling,但是效果依旧出奇的好。
1. BEiTv3的提出:大一统
不论是在这个language,还是在vision,还是在这个多模态领域,我们都观测到这个 big convergence,就是说我们在超级多的这个数据集上去做大规模的预训练。一旦这个模型训练好之后,它的这个特征就已经非常好了,可以直接 transfer 到这个下游任务上去,那尤其是当这个模型足够大,数据足够多的时候,你有可能就能预训练出来一个有通用性能的一个 foundation model,这个 foundation model 可能就已经能去解决各种各样的这个模态,或者各种各样的下游任务了,非常的强大。
BEiTv3就是想把这个大一统继续往前再推一步,就是彻底把这个多模态,尤其是 vision language 的这个预训练做得很好,而且主要是从以下的这三个方面来讲。
1. 模型角度
从这个模型角度来说,transformer 真的是非常关键。 在视觉这边,CNN 和 Transformer 还在争到底是谁性能更好,或者说谁更适合做这个视觉任务。未来肯定是多模态的,肯定是一个模型去做所有的modality,这样去做所有的 task 。肯定是一个大一统的框架。那在这个大一统的框架下, CNN 就不太适合做其他的modelity,但是 Transformer 又适合做很多的modality,所以就从这一点上讲, Transformer 就已经胜出了。
现在对于这个 vision language modeling,对于多模态学习来说,有几个常用的这个方式,比如说就是 CLIP 这种 dual encoder 的方式,它就非常适合做这种快速的这个retrieval。还有就是 encoder decoder 的框架去做这种 generation task,我们刚刚讲的这个 BLIP、CoCa,这都属于这一类。还有就是 Fusion encoder architecture,就是只用encoder,但是它有多模态融合部分,那ALBEF、VLMo都属于这一类,他们就能做很好的这个 image text encoding。
不论是哪一个方向,这些模型在遇到这个下游任务的时候,因为这个输入的形式可能有时候会改变,那或者输出的形式有时候会改变,所以这个模型就需要根据下游任务去做一些改进,它不是真正意义上的就是训练好一个模型之后你拿去用就可以了,而是说训练好这个模型之后,遇到各种各样的任务还得去修改,那这个就还不够方便,离他们说的这种 general-purpose modeling 还有一段距离。
2. 预训练的目标函数
到目前为止,这个 mask data modeling 就已经成功的被用到各个 modality 里了,比如最开始的完形填空BERT,图像这边就是他们自己的BEiT,还有图像-文本对的VL-BEiT。用这种掩码学习,就已经能够很好的去学习图像文本或者多模态的这种特征了。 那作者这里就想,那能不能真的就用这一个目标函数就把一个模型训练得非常好,因为如果用更多的这个目标函数,这个训练速度肯定会变慢,也就是说,如果你用其他的这个 pre-training objective,比如说 ITM 的话,你这个当数据和模型变大的时候计算就不高效了,你就很难去在短时间内训练出来一个大模型。
第二个也有优化和调参的问题在里面。如果你只有一个loss,那你这个 loss 的 weight 就没啥可调的了。但是如果现在有三四个loss,那这 loss 和 loss 之间的 weight 该怎么调?你是不是得跑好几个大模型去对比一下该选用什么 loss weight。同时有的 loss 之间可能互补,有的 loss 之间可能互斥。比如说之前想让那个 ITM 工作的更好,我们还得用 ITC 去帮助他选择 hard negative,然后才能去做ITM。这就无形中增加了很多的复杂度和很多,这种调参度就太人工了,它就不好 scale up。
所以作者在这篇文章中就用了一个 pre-training task,就是 mask-then-predict,把图像看成是一个 foreign language,叫 Imglish,因为反正图像过完这个 vision transformer embedding 层以后,它就变成了一个 sequence of token,那这样就能把文本和图像用同样的方式去处理,本质上就没有任何区别。 而且如果这样子去处理,对于多模态的图像文本对来说,也就可以把它看成是一个 parallel sentence,就是句子1后面跟了个句子 2 就没有什么不同了,一切都变成 NLP 了。当然这也从侧面说明 mask data modeling 这个目标函数真的是非常的强。
3. 如何把模型和数据集的大小scale up
因为只有 scale up,用了更多的数据,有一个 capacity 很大的模型,它才有可能用一个模型去解决所有的事情。所以在BEiTv3里,作者也把模型的size扩展到 billions of parameters 里了,而且也把数据集扩展的非常大。但即使如此,作者团队还是坚持使用这种 public available 的resource,所以学术界就比较容易去这个复现,非常的难能可贵。
2. BEiTv3的框架
如果我们看 BEiTv3 这个方法本身,就是 图中的这个 Overview of BEIT-3 pretraining,就会发现它就是VLMo。【VLMo的详细介绍参照上一篇 多模态大模型(一)】
对于模型本身而言,它就是这个 Multiway Transformer,而 Multiway Transformer 就是之前的 VLMo里的,它前面的自注意力全都是 share weights,只有后面 feed forward network 是不一样的。 根据不同的modality,训练不同的expert,包括 vision 的,language 的,vision language 的。然后通过调整不同的 input modality,去选择这个模型到底该走哪一支,最后来得到模型的输出。
至于预训练的目标函数,就是 masked data modeling,它有可能是遮住了图像,有可能是遮住了文本,总之就是完形填空,去恢复它就可以了,所以说非常直接,而且就像VLMo里讲的一样,它也很灵活。
BEiTv3应用
当预训练完之后,我们要去做这个下游任务的 transfer 的时候,作者这里说 BEiTv3 也非常的强大。
- (a)如果你只用 vision encoder,就可以去做所有图像这边的任务,包括 classcation detection 和segmentation。
- (b)如果你只用 language encoder,就可以去做 language 那边的各种任务,反正是用 MLM 训练出来的,所以 Bert 能做, BEiTv3 都能做。
- (c)接下来就是多模态,如果你有 vision 和 language,最后有 vision-language 这种 Fusion encode 的形式,就比较容易去做这种 vision language understanding task,就是VQA、VR这种任务。
- (d)如果你想像 CLIP 一样去做比较高效的 image text retrieval,就可以把这两个 vision 和 language 分开做,变成双塔结构。那如果 fine tuning 的话,可以再用 ITC 去 fine tuning 一下就好了。
- (e)最后如果做生成,做 captioning 这种任务,比如像 BLIP 和 CoCa,那就是文本这边 mask 掉,然后你用 image-grounded text encoder,然后去预测到底这个被 mask 掉的是什么词,然后就可以去做 image captioning 了。
多模态大模型总结
OSCAR/UNITER + ViT => ViLT (ICML 2021)
- 在多模态学习之前都是Oscar或者Uniter等这些工作,他们的缺陷都是因为用了一个Object Detection的模型去做视觉特征的抽取,太慢且太贵了。
- 所以在Vision Transformer(ViT) 出来之后,ViLT的作者就想到可以把vision部分用 ViT 去代替,就一个Embedding层就足够了,这样一来大大简化了模型结构。
OSCAR/UNITER + CLIP (ICML2021) + ViLT (ICML2021) => ALBEF
- 原始的OSCAR等工作由于Modality Fusion做的很好,多模态任务非常强。
- CLIP很高效,适合做Image Text Retrieval。
- ViLT结构比较简单。
最后综合以上三个模型的长处,推出了ALBEF,Fusion Encoder的模式。
ALBEF + SimVLM => CoCa
- SimVLM就是用Encoder-Decoder去做多模态的,它的作者就在ALBEF的基础上推出了CoCa。
- 模型结构比较简单,就用 Contrastive 和 Captioning 两个loss,训练出来了非常强大的模型。
ViLT + ALBEF => VLMo
- 有了ViLT和ALBEF之后,微软的研究者就推出了VLMo,用共享参数的方式去推出一个统一做多模态的框架。
ALBEF + VLMo => BLIP
- 基于VLMo这种参数共享的思想,基于这种可以用很多的Text Branch,ABLEF的作者又推出了BLIP模型。
- BLIP模型能做得非常好的Captioning的功能,而且它的Captioner Filter模型也非常好用。
ViT + BERT => BEiT => BEiTv2(视觉)
- ViT在文章中也做了用Mask Data Modeling的方式去self-supervised learning,但是当时效果不太理想。
- 但是大家都认为Mask Data Modeling非常有前景,所以就顺着BERT的思想,微软的研究者提出了BEiT。
- 在BEiT的基础上,推出了BEiT v2,当然这是做视觉task,不是多模态的。
BERT + BEiT => VL-BEiT
- BEiT能在视觉上做Mask Data Modeling
- BERT能在文本上做Mask Data Modeling
- 结合两者推出了Vision Language BEiT(VL-BEiT)
VLMo + VL-BEiT + BEiTv2 => BEiTv3
- 最后经过一系列的经验积累,作者最后把VLMo、VL-BEiT和BEiTv2结合起来推出了BEiTv3,大幅超过了之前的CoCa、BLIP在单模态和多模态上的各种表现。
MAE + CLIP => FLIP
- 回到ViT,对于Mask Data Modeling来说,可以Mask and Predict不同的东西。比如BEiT就是Predict Patch。
- MAE (Mask Auto Encoder) 就是 Mask & Predict Pixel。
- 不论是 mask patch 还是 mask pixel,ViT 这篇论文都做了,但是效果不是很好。
- MAE有一个非常好的特性,它在视觉这一端把大量的patch全都给mask掉之后,只把没有mask的patch扔给ViT去学习,这样就大大减少了计算量。把MAE有用的特性用在CLIP上就形成了FLIP。
多模态大模型飞速进展之其他系列
1. Language Interface
即使像BLIP、BEiT v3、VLMo这种模型,像搭积木一样,想做什么任务就拼出什么模型,然后再去微调得到你想要的结果。这还不够统一,不是真正Unify,真正大一统的框架是什么呢?
比如微软的MetaLM和Google的PaLI,就是说,模型是一个Encoder-Decoder,有图像、文本的输入,模型不论是在预训练的时候还是在下游任务的时候做什么,完全是由文本那边的Prompt决定,输出永远都是文字,属于Text Generation Task。
例如,如果你现在要做图像分类,就把图像给它,文本那边就给它一个prompt说现在要做分类,这个时候它就会把图像的label生成出来,例如狗、猫这种带有语义的词。
通过调整各种各样的Prompt,也就是language Interface,就能知道模型在做什么任务,会给出相应的文本输出来告诉你答案,在这个意义下,模型很少被改动。这样一来,就算得上是Unified Framework。
2. Generalist Model:通用(才)模型
不论是在预训练的时候还是在下游任务的时候做什么,都想直接用一个模型训练好之后做就完了,不想根据下游任务再去调整模型结构或者加一个Task Specific的Head,比如说分类头、检测头、分割头之类的。已经出现Unified IO、UniPerceiver、UniPerceiver v2、UniPerceive-MOE这些模型。
References
- 多模态论文串讲·下【论文精读·49】最近使用 transformer encoder 和 decoder 的一些方法
- 多模态论文串讲·下【论文精读·49】