多模态方法总结
架构分为Transformer Encoder的方法和基于Transformer Encoder和Decoder的方法
Transfomer Encoder方法
这张图来源于VILT,基本概括了多模态领域的模型架构。
图a是VSE或VSE++的架构,文本端进行一个轻量的word embedding,视觉端经过一个目标检测器提取区域性特征,最后多模态进行一个少量的交互。
图b是CLIP的架构,典型的双塔模型,CLIP采用BERT提取文本特征,采用分类网络(ViT or ResNet)提取视觉特征,最后经过简单的点乘操作完成模态交互。
图c是ViLBERT,UNITER等模型的架构,从效果上来看,这一类的架构性能是最好的,从过去的方法总结来看,通过视觉端总是需要一个相对厚重的特征提取,而文本端只需简单的tokenize,最后,一个充分的多模态交互被认为是有效的。
图d是VILT模型的架构,ViLT考虑视觉端是否可以向文本一样,不要做过多的特征提取,进行做一个patch embedding即可。同时由于文本和图像都没有过多的特征处理,那么交互就变得及其重要,因此参考UNITER等模型,设计了厚重的模态交互。
特别的说,不同的架构设计都存在其各自的优势。例如一个轻量的模态交互的架构会比较有利于文本检索的任务,例如CLIP。因为在检索的时候只需要提取一次外部图像或文本的特征并做一个简单的点乘交互,而内部的数据特征我们可以提前提取出来保存。而一个厚重的模态交互的架构则比较有利于VQA任务,因为VQA任务需要模型对视觉、文本具有更深刻的理解,简单的模态交互通常无法很好的完成任务。
ALBEF
动机
ALBEF的贡献主要在两个地方,第一个是引入了ITC loss(Image-Text Contrastive)来进行align before fuse,并且引入了ITM loss(Image-Text Matching)和MLM loss(Masked Language Modeling)进行多任务训练。第二个是提出了momentum distillation的方式进行自训练学习。
ALBEF属于c类架构,尽管ALBEF和VILT一样认为视觉端不需要目标检测器,但是VILT是从推理时间考虑,而ALBEF则是认为目标检测器会导致文本和视觉特征的不对齐。因此作者依然使用了目标检测器提取特征,但是增加一个对齐操作,也就是本文的名字Align Before Fuse。同时,尽管遵循C类架构的设计,但ALBEF相对巧妙。ALBEF在视觉端采用12层的Transformer Encoder,使用ViT初始化,文本端和模态交互将BERT模型拆分各自采用6层的Transformer Encoder并且采用BERT模型进行初始化。这样就刚好达成了最优配比。
momentum distillation的动机来源于noise data。因为我们从网上爬下来的数据呢通常不是很匹配,就是说很多图像文本对中的文本并不能很好的描述图像中的内容。并且,有的时候模型生成的文本可能比GT的描述更加的匹配。基于这种情况呢,就比较适合基于自训练的方式进行模型训练。其实当前大数据、大模型的火爆之下一个很关键的点是高质量的数据支撑。而高质量的数据通常并不是天然的。我们可以发现有不少方法不约而同的采用了自训练的方式进行数据和模型的交互迭代,例如SAM模型的数据引擎,ALBEF的momentum distillation,blipv2的capfilter等等。
方法
momentum distillation的思路呢是说原本计算MLM和ITC loss的时候呢,如果本身图像文本对不是那么匹配的,而根据图像生成的文本实际是更匹配的,这样一味去惩罚生成的样本会影响模型的学习。因此我们保存一个momentum model。这个模型采用EMA(指数移动平均,sigma=0.995)的方式进行更新,这个模型更新会非常缓慢,**从而可以获得相对稳定的文本caption预测pseudo-targets。(这里的疑问在于这个caption是如何得到的,因为这里所有的模型都是encoder)**然后我们在计算ITC和MLM Loss的时候,就不单单只考虑之前基于gt的one-hot loss,同时也考虑基于pesudo-targets的soft loss。
p m i 2 t ( I ) = exp ( s ( I , T m ) / τ ) ∑ m = 1 M exp ( s ( I , T m ) / τ ) , p m t 2 i ( T ) = exp ( s ( T , I m ) / τ ) ∑ m = 1 M exp ( s ( T , I m ) / τ ) \begin{aligned}p_m^{\mathrm{i}2\mathrm{t}}(I)&=\frac{\exp(s(I,T_m)/\tau)}{\sum_{m=1}^M\exp(s(I,T_m)/\tau)},\quad p_m^{\mathrm{t}2\mathrm{i}}(T)=\frac{\exp(s(T,I_m)/\tau)}{\sum_{m=1}^M\exp(s(T,I_m)/\tau)}\end{aligned} pmi2t(I)=∑m=1Mexp(s(I,Tm)/τ)exp(s(I,Tm)/τ),pmt2i(T)=∑m=1Mexp(s(T,Im)/τ)exp(s(T,Im)/τ)
L itc = 1 2 E ( I , T ) ∼ D [ H ( y i 2 t ( I ) , p i 2 t ( I ) ) + H ( y t 2 i ( T ) , p t 2 i ( T ) ) ] \mathcal{L}{\text{itc}} = \frac{1}{2} \mathbb{E}{(I,T) \sim D} \left[ \mathcal{H}\left(\mathbf{y}^{i2t}(I), \mathbf{p}^{i2t}(I)\right) + \mathcal{H}\left(\mathbf{y}^{t2i}(T), \mathbf{p}^{t2i}(T)\right) \right] Litc=21E(I,T)∼D[H(yi2t(I),pi2t(I))+H(yt2i(T),pt2i(T))]
L m l m = E ( I , T ^ ) ∼ D H ( y m s k , p m s k ( I , T ^ ) ) \mathcal{L}{\mathrm{mlm}}=\mathbb{E}{(I,\hat{T})\thicksim D}\mathcal{H}(\boldsymbol{y}^\mathrm{msk},\boldsymbol{p}^\mathrm{msk}(I,\hat{T})) Lmlm=E(I,T^)∼DH(ymsk,pmsk(I,T^))
L i t c m o d = ( 1 − α ) L i t c + α 2 E ( I , T ) ∼ D [ K L ( q i 2 t ( I ) ∥ p i 2 t ( I ) ) + K L ( q t 2 i ( T ) ∥ p t 2 i ( T ) ) ] \mathcal{L}{\mathrm{itc}}^{\mathrm{mod}}=(1-\alpha)\mathcal{L}{\mathrm{itc}}+\frac{\alpha}{2}\mathbb{E}_{(I,T)\thicksim D}\left[\mathrm{KL}(\boldsymbol{q}^{\mathrm{i}2\mathrm{t}}(I)\parallel\boldsymbol{p}^{\mathrm{i}2\mathrm{t}}(I))+\mathrm{KL}(\boldsymbol{q}^{\mathrm{t}2\mathrm{i}}(T)\parallel\boldsymbol{p}^{\mathrm{t}2\mathrm{i}}(T))\right] Litcmod=(1−α)Litc+2αE(I,T)∼D[KL(qi2t(I)∥pi2t(I))+KL(qt2i(T)∥pt2i(T))]
L m l m m o d = ( 1 − α ) L m l m + α E ( I , T ^ ) ∼ D [ K L ( q m s k ( I , T ^ ) ∥ p m s k ( I , T ^ ) ) ] \mathcal{L}{mlm}^{mod} = (1 - \alpha) \mathcal{L}{mlm} + \alpha \mathbb{E}_{(I, \hat{T}) \sim D} [ KL( q^{msk}(I, \hat{T}) \parallel p^{msk}(I, \hat{T}) ) ] Lmlmmod=(1−α)Lmlm+αE(I,T^)∼D[KL(qmsk(I,T^)∥pmsk(I,T^))]
这是一个加权的多任务学习损失函数公式,结合了基础的 MLM(Masked Language Modeling)损失 L m l m \mathcal{L}_{mlm} Lmlm和带有 KL 散度的掩码相关部分 q m s k q^{msk} qmsk和 p m s k p^{msk} pmsk的损失。
这里使用的是KL散度,其实一般衡量两个概率分布的距离多用KL散度。原始的ITC Loss虽然是基于交叉熵的,但是也可以是KL散度,因为标签是ont-hot分布,交叉熵和KL散度此时是等价的。
H ( P , Q ) = H ( P ) + D K L ( P ∥ Q ) H(P, Q) = H(P) + D_{KL}(P \parallel Q) H(P,Q)=H(P)+DKL(P∥Q)
实验设置
训练集1:【Conceptual Captions(4M),SBU Captions(1M)】,【Coco(10万),Visual Genome(10万)】
训练集2:【Conceptual Captions(14M),Conceptual Captions(4M),SBU Captions(1M)】,【Coco(10万),Visual Genome(10万)】
下游任务
图像文本检索,topk召回率
VQA,分为开卷(分类),闭卷(生成)
visual entailment(视觉蕴含,三分类问题)
Natural Language for Visual Reasoning(视觉推理)
VLMO
动机
双塔架构的模型(如CLIP)适合图像文本检索任务,但对于复杂的VL任务则失效,而fusion encoder的模态交互在复杂任务上表现良好,但对于文本检索又显得过于笨重,因为模型需要把所有的数据都输入模型计算一遍才能检索出合适的数据。那么有没有一种办法可以结合两种架构的优势呢?MoME(混合模态专家模型)应运而生。
VLMO的第二个动机是数据规模问题。因为当时多模态领域还没有足够大的开源数据,但此时大家的一个共识是有更多的训练数据可能会取得更好的结果。因此VLMO提出了一种叫做stage-wise pretraining的解决思路。因为单个模态领域不管是视觉也好,还是NLP也好,都已经有各自的超大规模数据集,如果我们可以先各自训好两个单模态的模型后再在多模态数据集上训练,可能会有更好的效果。实验证明确实如此。
方法
这两个图已经把动机对应得方法解释得很清楚了。值得一提的是呢,这个作者团队还推出了BEIT的系列工作,BEIT,BEITv2都是视觉领域的工作,而BEITv3则继承了该团队在各个领域的探索,并应用在多模态领域。
Transformer Encoder-Decoder方法
BLIP
动机
BLIP这个工作跟ALBEF是同一个作者,所以继承并发展了ALBEF的一些思路,比如对noise data的处理,比如3个损失函数。另一方面呢,BLIP同时又借鉴了VLMO的专家混合的想法,不同的任务经过不同的模块。
BLIP的动机也很简单,分别从数据层面和模型层面来说
数据层面,作者延续了之前使用模型生成的caption作为pesudo targets的思路,但是此时还是会将原本noise的data考虑在损失内。既然noise data会影响模型的学习,那么我们能不能过滤掉这些这些noise的data呢?因此作者提出了CaptionFilter,Caption生成文本,Filter判别是否配对从而过滤掉不配对的数据。
模型层面,跟VLMO出发点有些类似。他是说现有多模态的模型一般就两类架构,一个基于Transformer Encoder的,一个基于Transformer Encoder-Decoder的。第一类架构在生成任务上有所缺陷,需要额外的模块辅助;第二类架构则在检索任务上至今都还没有得到有效应用。因此,作者提出一个多模态混合架构,既可以作为unimodel encoder,也可以作为image-grounded text encoder,还可以作为image-grounded text decoder。
方法
上面这个是他的基础架构,其实已经一目了然了,需要强调的是呢,原本的MLM loss现在已经换成了LM loss,因为我们现在做的不是增加了一个文本生成的任务,并且由于三部分任务(ITC,ITM,LM)共享参数(除去self attention之外)因此我们在text-encoder的部分呢也没有必要继续使用MLM,只留下ITM即可。此外,BLIP的一个缺点呢可能是因为多任务的原因,三个任务各自需要一次前向操作。
BLIP的第二点贡献,这个CapFilter是我们需要更加关注的。下面这个图的意思呢,大概就是我们先在原始noise data上预训练一个模型,这个模型因为MMoE的结构呢,既能评估图像和文本是否匹配,也能根据图像生成caption。但是呢,因为是在noise data上训练的,所以我们不够信任它的能力,所以我们对两部分模型呢分别在人工标注的数据集(如COCO)上进行微调加强这一方面的能力。然后我们就得到了Captioner和Filter,对于给定的Iw,Tw,captioner会生成一个新的Ts,(Iw,Tw)和(Iw,Ts)都会送到Filter去过滤掉不匹配的样本对。最后我们就得到一个数据集D如图。
CoCa
CoCa这篇文章基于ALBEF和SimVLM改进而来
首先,ALBEF是基于掩码自编码(MLM)预训练的,不适合生成式任务。CoCa的第一个想法就是将Multimodel Text Encoder换成Decoder,使用LM进行预训练。这篇文章里叫做captioning loss。
其次,在之前的Encoder-Decoder类模型(如BLIP),因为不同的任务架构不同,通常需要进行多次前向操作。CoCa思考的是能不能只用一次前向过程,这样可以省掉一半或2/3的计算量。因此CoCa把ALBEF的Text Encoder也换成了Decoder,引入cls token作为文本特征的embedding,从而与image embedding计算ITC loss。此外呢,为了避免多次前向,CoCa直接取消了ITM loss,仅仅使用captioning loss进行预训练。
其实我们发现直接多模态模型越来越趋向于简单大一统的架构,简单的训练损失并获得大的提升。这是我们追求的目标
BeiTv3
BeiTv3这个方法动机很简单,就是大一统。BeiTv3希望仅仅使用一个模型,使用一个损失然后达到最好的效果,事实他做到了
模型结构也极其简单,就是Multiway Transformer,是纯Encoder架构的模型。损失函数只有一个,就是MLM。这种结构可以广泛的应用到各类下游任务,如检索,image caption,视觉问答,视觉推理等等,并且完全不需要其他的模块。
这里指的一提的是为什么仅仅使用一个模型接受不同类型的输入呢,这个就是Transformer的优势,只要输入是序列数据那么它就可以提取其特征,并且非常具有通用性。因此呢,BeiTv3将图像patch成序列之后也视为一种语言,叫做imglish。image-text pairs就是将imglish 和 text两个序列拼起来即可。
当然,简单归简单,但是在下游任务如何使用应该还是有很多细节。这一点还需要进一步去探索。
总结
总的来说,多模态几乎都是基于Transformer的工作,并且正在向更大一统的方向前进。BeiTv3尽管只有一个模型,但依然有不同的子模块FFN。一个方向是language interface,类似通过prompt指定任务类型,把所有的任务都当成文本生成任务。
另外,在最后总结一下我目前遇到的一些问题,第一个是ALBEF论文里的伪标签文本是如何生成的。我这里说的是伪标签文本而不是伪标签。对于ITC来说,生成的伪标签是一个相似度,对于MLM来说,生成的伪标签是词表概率分布。这些都不需要文本。但是奇怪的是论文中给出了ITC的top5 伪标签文本示例。
目前来说,这个文本的来源有三种可能。要么是基于image feat输入一个额外的decoder生成的caption,要么是从数据集里面挑出来的跟image feat相似度top5的文本。前者在论文里面没有任何描述,只有在下游VQA任务提到需要一个decoder,但是这个decoder大概是不能完成预训练时的解码任务的。因为这个decoder还需要question文本的特征。后者确实很有可能,毕竟这里仅作展示用途,实际训练的时候完全不需要decoder
第三种可能,大概也是真正的答案,基于MLM的自回归。BeiTv3中基于一个纯encoder架构实现了image caption,就是使用这种方法。大致就是说给定一句话例如this image shows,然后加一个mask标志符,使用Image Grounded的Text Encoder去预测被Mask掉的单词,重复这个过程呢就可以做Image Captioning了。
参考博客:多模态系列论文--BEiT-3 详细解析_beitv3 github-CSDN博客
最后,因为本身对多模态处于一个学习了解的阶段,上述内容有任何表述错误请不吝指出,这将对我产生很大帮助,感谢,也希望上面的内容对一些初学者有所帮助。