图文预训练梳理

小引

去年在工作中,研究了一段时间的图文预训练,对这块的发展脉络比较清楚,也在工作中尝试捣鼓了一些解决方案。这里记录梳理一下。本文的目标是梳理图文预训练整体的发展方向,着重分析为什么会这么发展,而不仅仅是论文解读的罗列。追溯的时间区间为2019年到2022年初。

什么是图文预训练?

先用一句话概括:图文预训练借鉴了文本预训练的范式,对图文输入进行预训练,并应用于下游图文交互任务

现实的人工智能一定是多模态的,对人类来说,图文是两个很重要的模态,以至于在AI领域,CV和NLP也几乎是各占半壁江山。那问题就来了,我们能不能直接研究图文兼备的模型呢?CV和NLP的交叉领域的问题应该怎么解呢?这些问题,都催生出了图文预训练。

图文预训练解决什么问题?

图文预训练两个最常用的下游任务即VQA(Visual Question Answering)和图文检索(Image Text Retrieval),抽象来说就是分类问题匹配问题。还有一些工作也会关注生成问题

VQA

VQA(Visual Question Answering)的任务是给定一张图片和一个与图片内容相关的问题,找到对应的答案。答案的类型由问题的类型确定。比如“is the”类的问题,答案就是“yes”或者“no”。“what color”类型的问题,答案就是“red”、“white”等颜色。实践中通常把整个数据集中的answer进行计数统计,最终转换成一个分类问题。

典型数据集:VQA v2

VQA v2

NLVR

NLVR (Natural Language for Visual Reasoning),给定一张图片和一个推论,判断这个推论是否正确。实践中是一个二分类问题(“true”或者“false”)。

典型数据集:NLVR2

NLVR2

图文检索

图文检索(Image Text Retrieval)即给定图片检索相关文本或者给定文本检索相关图片。通常关注的指标是Recall@top n。

典型数据集:Flickr30k

Flickr30k

任务总结

任务 典型数据集 当前sota 原始论文 类型
VQA VQA v2 https://paperswithcode.com/sota/visual-question-answering-on-vqa-v2-test-std https://arxiv.org/pdf/1612.00837v3.pdf 分类
NLVR NLVR2 https://paperswithcode.com/sota/visual-reasoning-on-nlvr2-dev https://aclanthology.org/P17-2034.pdf 分类
图文检索 Flickr30k https://paperswithcode.com/sota/image-retrieval-on-flickr30k-1k-test https://aclanthology.org/Q14-1006.pdf 检索

图文预训练和多模态融合的区别和联系

这里主要探讨目标问题域的问题。从上面图文预训练主要关注的任务可以发现,图文预训练主要专注于挖掘图文信息的交互。比如在NLVR中,文本中说“tower”,模型需要知道这个概念在图片中指的是用小积木堆成的矩形。

多模态融合主要关注各种模态的表示的融合问题,首先它并不限制模态必须是图文,音频、数值特征、用户特征等等也都可以。通常模态间融合是粗粒度的。它虽然能学习到一些共现模式,但对细节关系的捕捉能力较弱。另外多模态融合通常还会用到很多backbone去提取模态表示,整体架构也较少使用端到端。

图文预训练工作梳理

关注的几个维度

想梳理清楚图文预训练的发展趋势,主要关注以下几个维度:

  • 数据:用什么数据做图文预训练?
  • 模型结构:单流还是双流?cross attention还是merge attention?
  • 图文特征的提取方式:图片是先做目标检测还是用patch分割?
  • 预训练的目标:mlm、itm、itc如何选择?
  • 预训练的范式:直接图文一起预训练,还是单模态先预训练?

从BERT开始

2018年,BERT横空出世,在NLP领域建立了预训练的范式,这种充分利用大量无标注数据从而碾压下游任务的范式取得了极大成功,使得CV领域和图文领域在接下来的几年,一直在努力引入这种成功的范式。

2019年图文领域对应的工作出来了,比较典型的有VisualBERTVL-BERT,还有相对较晚的UNITER。从名字就可以看出,这些工作受BERT的启发,本身的工作也都和BERT很像。

我们回到当时的场景思考一下,如何把图文的数据都丢到BERT里去呢?文本部分还好,不用改,主要的问题在于图片怎么转换成embedding?这里可以有很多不同方式,早期的方法通常是先对图片做通用的目标检测,得到一系列的region box,然后过CNN,得到一系列图片embedding。

输入搞定了,预训练任务怎么扩展?文本可以继续使用MLM,图片部分怎么处理?

  • VisualBERT参考BERT里的NSP(给定一个文本pair判断是否是连贯上下文)提出了Sentence-image prediction,也就是给定一个图文对判断是随机组合还是原始组合。
  • VL-BERT的做法是参考MLM,提出了Masked RoI Classification with Linguistic Clues,也就是将一部分region mask掉,然后根据文本和其他图片信息去预测这个region的类目。
  • UNITER将这些预训练任务整理了下:
    • 将mask region类的任务称为Masked Region Modeling (MRM),这里面又可以分为回归和分类。
    • 将图文匹配的任务称为Image-Text Matching (ITM)
    • 将细粒度的图文匹配任务称为Word-Region Alignment (WRA)。这里使用了Optimal Transport (OT)的思想,将细粒度的对齐问题建模成一个运输优化问题。
    • UNITER还对不同的预训练任务做了消融实验,其结论为:预训练任务的作用排序:MLM > ITM > MRC > WRA

预训练范式方面,这些工作直接用BERT的参数初始化模型,然后再进行图文预训练。

数据方面,这些工作通常都是使用开源的图文数据集,如CC、COCO,体量大致在百万级别。

VL-BERT

UNITER

ViT来了

2020年,CV圈也迎来了里程碑式的工作:ViT,它对图片输入的处理简单粗暴,直接划分成16 × 16个patch,并在论文的题目中宣称:“一张图等于16 × 16个字”。ViT引发了transformer在CV界的广泛应用,于是自然有人将这个思路引入到图文预训练中来,这就是ViLT

ViLT的做法其实几乎和UNITER如出一辙,不过将所有的region都替换成了patch。这里会产生一个小问题:region是有类别的,而patch因为是随机切分,没有类别,所以也就没有MRM这类的任务了。不过这个影响不大,因为MRM的贡献本来就不大。

ViLT和UNITER不同的是,ViLT基于ViT参数进行了初始化,而UNITER是基于BERT。另外ViLT也提出了两个提点建议:全词mask和图片的数据增强。

那引入patch有什么好处呢?

  • 提速:ViLT和UNITER的预测速度比为15ms:900ms,而diff部分也主要来自于目标检测的耗时。
  • 结构统一、简单。图片省去了额外的特征提取操作。

但整体来说,ViLT的性能并没有优于UNITER,它的贡献在于让大家认识到省掉目标检测是可能的;且这是一个工业应用affordable的方案。我们也在实际应用中采用了ViLT的方案,在下游任务上取得了不错的效果。

ViLT

来点对比学习?

2021年图文领域也出现了一个里程碑式的工作:CLIP。CLIP最初的动机是学习一个迁移性能好的图片表示。它的想法很简单:用文本信息作为弱监督,通过对比学习来学习图片表示。它的整体架构很简单,采用了文本encoder和图片encoder双流的结构,融合的head只是一个简单的相似度计算。

那么优秀的迁移性是通过什么实现的呢?

  • 基于wikipedia的海量图文对(4亿对),涵盖各种领域。
  • 基于和文本表示对比学习的弱监督:文本表示相比于类目信息量更丰富。

CLIP最终的性能是令人惊艳的,最让人惊艳的是图文匹配的能力。当时一些基于CLIP去做以文搜图、以文搜视频的应用层出不穷。这个结果给人一种感觉:对比学习在跨模态对齐的任务中,大有可为。我们当时也迅速跟进:先是迁移了一个中文版的encoder;然后又基于我们自己的业务数据(电商图文),预训练了一个CLIP模型。

CLIP

CLIP这种双流结构+对比学习在模态对齐的任务上效果拔群,但在VQA这中分类任务中就表现平平了。究其原因,还是因为CLIP的融合头太简单了,于是出现了一些后续工作,将双流+对比学习的范式和之前的单流范式进行结合。

首先出现的是CLiP-ViL:文本还是不变,图片先过CLIP的图片encoder生成一系列图片表示,然后再一起进入一个单流的transformer。这种范式,也就是先多流后单流,后来称为新的潮流。

采用先多流后单流范式的影响力更大的工作是ALBEF

ALBEF前面的多流和CLIP一样,做对比学习。而它是这么解释为什么要先多流对比学习的:

  • 图文embedding对齐后,让单流的融合头学习更容易。
  • 单模态(特别是图片)的encoder可以学得更好。
  • 相对于之前简单的ITM,可以引入更多负例。

另外考虑到现实数据可能比较noisy,ALBEF还提出了MoD(momentum distillation)。整体思路就是引入动量更新,即一个相对平滑的teacher模型,用于生成伪标签,让目标模型利用伪标签进行一致性正则约束。

但不得不说的是,既然引入了对比学习,鉴于CLIP的经验,图文预训练的数据其实应该更多。因此ALBEF除了和之前其他工作对齐的百万级数据外,海训练了千万级数据的版本。至此,ALBEF的性能碾压了UNITER,基于patch的方案也终于在数据量和对比学习的加持下,打败了基于region的方案。

ALBEF

除了这种先多流后单流的方式,还有没有其他可能的方式去引进对比学习呢?有没有办法改造下单流让它可以直接使用对比学习呢?VLMO提供了另一种思路:我们可以只替换ffn来表示不同模态的encoder(MoME),这样encoder其他地方都可以复用,attention也只有self attention,没有cross attention。

VLMO

这里的预训练范式也改成了:

  • 1.单模态预训练
    • 图片用BEIT
    • 文本用BERT
  • 2.图文预训练

预训练范式改进了以后,性能又得到了提升。

整合一下

2021年METER是一个整合的工作,它就训练任务、模型架构等方面做过大量比较,结论是:

  • 模型结构:
    • 融合头用cross-attention优于用merge-attention
    • backbone最佳组合:RoBERTa + Swin Transformer / CLIP-ViT
    • decoder类型的结构并不能带来增益
  • 预训练任务:
    • MLM + ITM是基石,图片的mask预训练任务像MIM其实可有可无(注意这里是多模态数据预训练时,前置的单图预训练还是很有增益的)

除此之外METER还分享了两点经验:

  • 按照参数是否随机初始化而设置不同的学习率,也能带来较多的提升。
  • 提高图片像素可以带来较大提升。

METER

更大更强

为了追求极致性能,后面出现了一些彻底“不讲武德”的工作,继续充分挖掘大模型、大数据。

Florence在做图文对比学习时,直接怼了9亿图文对;再配合roberta的预训练文本encoder(VQA架构基于METER),最终效果也再度炸裂。

Florence

总结梳理

再来整体梳理下发展脉络:

  • 第一阶段:从BERT中发展而来。
    • 代表作:VisualBERTVL-BERTUNITER
    • 特点:图片特征抽取还是依赖于目标检测;图文预训练任务使用itm(Image text match)
  • 第二阶段:引入patch。
    • 代表作:ViLT
    • 特点:借鉴ViT的输入方式,直接分割patch,然后线性映射为embedding;推理速度较快
  • 第三阶段:和对比学习结合。
    • 代表作:CLIPCLiP-ViLALBEFVLMO
    • 特点:引入对比学习,在前置环节学好图片encoder;开始尝试各种多流/单流、merge attention/cross attention的组合。
  • 第四阶段:更大更强
    • 代表作:METERFlorence
    • 特点:整合现有方案;用更多的图文数据碾压。