入门参考:跟着chatgpt一起学|多模态入门-CSDN博客
学习笔记(上):多模态论文串讲-学习笔记(上)-CSDN博客
学习参考:多模态论文串讲·下【论文精读·49】_哔哩哔哩_bilibili
学习笔记上介绍只使用transformer encoder的方法,本文来介绍下同时使用transformer encoder和decoder的方法。
1. BLIP
论文地址:https://arxiv.org/pdf/2201.12086
摘要:
研究动机:
1.模型层面:
仅使用encoder的方法虽然好,但是无法直接应用到text generation(例如:图像字幕生成)任务中。而同时使用transformer encoder和decoder,虽然可以适用于text generation 的任务,但是由于没有统一的框架,又没办法很好地使用于text image retrieval 任务。
2.数据层面:
已有的模型基本上还是基于noisy的数据去进行训练的,虽然提升数据集规模还是可以带来非常好的性能的提升,但使用noisy的数据得到的结果并不是最优的。
如何解决?
使用captioner为网络图片生成合成标题,使用filter移除那些有噪声的标题。即:使用合成的标题替换图文不匹配的pair对。
模型结构
上期模型结构回顾:
ALBEF:
使用了2个N(12)层的Transformer encoder结构,左边是image encoder,右边被劈成了2个,下面的L层是text encoder,上面的N-L层来进行多模态融合。(相比而言,文本所需要的计算量较小,文本econder和多模态融合共享一个N层的Transformer encoder,计算量保持不变)
图像和文本通过各自的encoder得到相应的图像、文本特征,两者计算对比学习的loss ITC,将两个特征学好。
文本特征经过self-attention层,图像特征通过cross-attention层,两者进行融合,得到多模态的特征。然后使用这个多模态的特征,去做ITM任务。
VLMO:
MoE结构,self-attention层全部共享参数,通过FFN来区分不同的模态(视觉、文本、多模态三种FFN,代表三个专家网络)
训练时是一个模型,推理时,根据任务不同,选择不同的网络结构。
BLIP模型结构
BLIP结合了ALBEF和VLMO两者的优点
左侧:ViT模型( 什么是VIT?-CSDN博客)
右侧:文本部分有3个模型,其中颜色相同的代表共享参数,分布计算不同的目标函数(类似VLMO)。
第一个Text encoder模型,和ViT模型学到的特征一起计算ITC。
第二个模型是Image-grounded Text encoder,ViT的视觉特征通过cross attention层进来,和文本特征一起融合得到多模态特征,基于这个特征再计算ITM。(想想看,除了模型层数不同,这前2个模型是不是就和ALBEF做的事情一样了?)
第三个模型就是为了解决他们研究动机中提到的现有模型无法完成图文生成类的任务。增加一个decoder,来帮助模型完成生成任务。由于是decoder,这部分的输入和前两个模型是不一样的,需要对输入进行mask,self-attention层也和前两个不一致,是causal self-attention,这部分是不共享参数的。目标函数是和GPT一致,LM,给定一些词,去预测接下来的单词。
三个模型使用到的token也是不一样的,第一个模型使用的是cls token,第二个模型使用的是encode,第三个模型使用的是decode。
在推理时,可以根据任务的不同,选择不同的模型
BLIP 中的capfilter 模型
为了提升数据质量,BLIP中提出了capfilter模型来提升数据质量。
具体做法:
使用网络上爬取的数据和干净数据集(CoCo)训练一个基础的MED(左边黄色部分),然后基于干净数据集,做encoder的微调,作为filter。
网络爬取的数据Tw(红色),经过filter后得到干净数据集Tw(绿色)。
同时发现MED的decoder能力也非常强大,干净数据集,做decoder的微调,作为captioner。为网络爬取的图片生成标题,为Ts(红色),再经过filter,得到高质量的图像文本对Ts(绿色)
原始的数据集经过清洗和扩充,就从左上角变为了右下角这部分。
再基于新生成的数据集,做MED的训练,结果得到了大幅度的提升。
capfilter模型效果:
上面是网页爬取出来的结果,下面是captioner生成的title。而红色是被filter拒绝的,而绿色是被通过的。
消融实验结果
Bootstrap中,C代表captioner,F代表Filter。单独使用captioner或者filter均有增益,而单独使用captioner的增益更大。说明captioner带来的数据多样性是会更让模型收益的。
下标B代表base,L代表Large,代表的是模型大小。
BLIP模型是分阶段训练的,训练时ViT模型的大小和后续capfilter的模型大小是可以独立开的,这个capfilter也是可以用在其他模型中,用来提升数据质量的。
Laion-600M 数据集
使用blip随机生成40个标题,再通过clip排序,选出最好的一个,作为文本图像对。
2.CoCa
论文地址:https://arxiv.org/pdf/2205.01917v1
代码地址:https://github.com/lucidrains/CoCa-pytorch
模型结构
CoCa:就是Contrastive Loss和Captioning Loss的缩写,而Captioning Loss就是上面BLIP中的LM,也就是GPT3的loss。
整体模型结构比较简单,和前面提到的ALBEF非常类似。左边是ViT,右边是文本和多模态。不同点在于:文本和多模态中使用的都是decoder,同时imager encoder上加了一层attentional pooling,能更好地适配各种任务。
好处:ALBEF在forward时需要计算3次(不同的Loss需要的模块不一致,而且会有依赖关系)而在CoCa中,只需要计算一次即可,大大降低了计算量。
总结:大力出奇迹,模型结构简单,数据集狂堆,结果超赞!
模型效果
全方面碾压当时的sota模型效果
单模态的效果也非常强悍:
3.BeiTv
论文地址:https://arxiv.org/abs/2208.10442
代码地址:
概述:
将图像视作一种语言imaglish,通过transform后,完全可以以处理文本的方式处理图像。
坚持使用public resource,方便大家复现效果。
模型结构
右侧就是VLMO中的模型结构,只是输入层有些许不同,目标函数简化为一个LM。
使用时,根据任务不同,可以选择不同的模型组成。