截止目前,图片检索领域最出名的应该是openAI的clip了,分别用bert和vit对text和image做encoder,然后让配对的embedding接近,不配对的embedding拉远,通过这种方法达到text匹配(检索)image的目的!但这种方式只能检索,没法生成text啊(比如对image做适当的description),咋整了?总结一下,单存的clip有如下问题:
- Model perspective
-
Encoder-based model generation tasks:clip只能retreval,不能generate
-
Encoder-decoder-based model retrieval tasks : 两个都有只能generate,不能retreval
-
-
Data perspective:
-
The web text-image data contains noise:当年openai训练clip的时候,号称使用了400 million的text-image数据,但这些都来自web,肯定有很多noise,不干净!
-
为了解决上述问题,blip诞生了!论文: https://arxiv.org/abs/2201.12086
1、clip是典型的“双塔”模型:text和image分别用encoder转成embedding,然后计算vector的距离!因为缺乏decoder,所以没法生成text,所以这里就像搭积木一样加上decoder不就行了?看到这里,我想大部分人和我都是这样想的,但是人家salesforce团队
肯定是有高人的,见识和认知都比我这种普通人高多了,他们的网络架构图如下:
(1)image encoder:提取imag的图片信息,可以用vit(其他的image encoder也行),把(batch_size, channel, width,height) 通过conv2d转成(batch_size, w' * h', channel);w' * h' 就是卷据后的宽、高,类比于nlp任务的seq_len;channel类似于nlp任务中token的dimension,这两个都是超参数,可以根据后续的nlp任务设置成合适的大小!
(2)顺数第二个的text encoder:这是个典型的bert结构,用的是self-attention,并且在text的开头加上了cls标识token。这里最核心的就是Bi self-att了,同时使用token的context得到当前token的embedding!经过了feed forward后,得到了text的embedding,就和image embedding做 ITC Image-Text Contrastive learning了:本质就是二分类。image 和text 经过各自的encoder之后,不进行交互(没有cross attention),独立生成image和text的嵌入(embedding)。接着,模型通过对比学习(contrastive learning)来优化嵌入,使匹配的image和text对的距离更接近,不匹配的对则远离。这种方法有助于模型在全局层面上理解image和text之间的语义关系。这里和Clip没有本质区别!
在训练时,ITC分错误的样本说明是比较难的,这部分样本可以继续用于训练ITM,让ITM的能力更强!
(3)顺数第三个的image-grounded text encoder:和第二个比,明显多了和image的cross attention,其他和第二个完全一样,为啥还要这么做了?这一步的encoder和上一步的encoder比,最大的差异就是cross attention了,这里是直接把image的embedding融合到text的embedding,所以这里得到的text embedding的信息明显比第一个跟丰富!最重要的是:attention机制找到text和image局部的对应关系(ITC是全局语义关系),这个关系在最后一个LM里面是复用的!最后通过binary cross entropy来计算损失函数!
(4)最后一个LM,和第三个ITM比,唯一的区别就是把Bi self-att换成了causal self-att,为啥这么变?因为最后一个LM是decoder,目的要输出text token,所以训练的loss自然就是gpt采用的auto regression啦!训练时token只能看到上文,看不到下文,所以下文的token全部都要mask掉!为了提升预训练效率,text encoder和text decoder share除了attention之外的参数,论文原话:In order to perform efficient pre-training while leveraging multi-task learning, the text encoder and text decoder share all parameters except for the SA layers. The reason is that the differences between the encoding and decoding tasks are best captured by the SA layers【颜色相同的模块参数是共享的】;
2、representation和generative的问题解决了,data的问题怎么办了?clip训练采用了很多web数据,这些数据肯定有很多noise,怎么提升数据质量?最简单粗暴的办法是找人标注,但成本高啊!怎么低成本地获取大量高质量数据了?多年前做传统数据挖掘时,有这样一种方式获取较多的高质量数据:
- 先人工标注少量数据,能训练模型就行(训练样本一般是参数的5~10倍;比如有100个参数,人工标注500条高质量数据即可),利用这些高质量数据训练模型
- 用模型做推理预测。对于得分非常高和非常低的样本,其置信度较高,这类样本判断错误的概率较低,所以这类样本直接作为正样本或负样本,继续用于迭代训练模型
Blip是怎么做的了?如下图:
- 红色的数据可能有noise,属于弱监督;绿色的数据基本没noise,数据质量高!
- w是web爬取的,数据有noise;h是human标注的,属于高质量数据
- 先用所有的样本训练MultiModal,包括ITC、ITM和LM;因为所有样本有来自web的noise,所以此时模型的质量并不高
- 再用{Ih,Th} 这种高质量数据fine - tune ITC和ITM,把这两个classifier的质量提起来!
- 经过高质量数据fine - tune后,ITC和ITM的分类准确率会大幅提升,此时再用这两个model对低质量的{Iw,Tw}数据做filter,只保留匹配正确的数据,去掉匹配错误的noise,这一步就叫filter!
- 同理,使用高质量的{Ih,Th} fine-tune decoder模型,提升decoder的质量;
- 此时用这个decoder对Iw(也就是web爬取的有noise的Image),让decoder生成text(这个叫captioning),取名Ts;这个Ts对不对了?此时不用人工判断,直接用上一步的ITC和ITM去判断。如果是对的,那么这个{Iw,Ts}对就可以放入数据集啦!这个过程叫bootstrapping;
总结一下:最终的数据集Data set的数据来自三部分:人工标注的Th、ITC和ITM filter的Tw,以及decoder生成并通过filter的Ts!这三部分数据质量相对较高,完成了整个data set的数据清洗!
3、Blip完成了representation和generative的任务,但缺陷还是有的:
- 要训练4个model,计算量特别大!
- 根据scaling law,image-text配对的数据需要较多
blip的这两个
参考:
1、https://arxiv.org/abs/2301.12597 BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models
2、https://github.com/salesforce/LAVIS/tree/main/projects/blip2
3、https://www.bilibili.com/video/BV1ff421q7sC?spm_id_from=333.788.videopod.episodes&vd_source=241a5bcb1c13e6828e519dd1f78f35b2&p=3
4、https://mp.weixin.qq.com/s/csqFAkjziwx34aAxKj9-gQ 视频、图像、文本,只需基于下一个Token预测:智源Emu3发布,验证多模态模型新范式