article:Li J, Li D, Xiong C, et al. Blip: Bootstrapping language-image pre-training for unified vision-language understanding and generation[C]//International Conference on Machine Learning. PMLR, 2022: 12888-12900.
code:https://github.com/salesforce/BLIP
(1)constrastive pre-training
在模型训练过程中,我们取到的每个batch由N 个图像-文本对组成。这N 个图像送入到图像编码器中会得到 N 个图像特征向量 ( I 1 , I 2 , . . . , I N ) (I_1,I_2,...,I_N) (I1,I2,...,IN),同理将这 N 个文本送入到文本编码器中我们可以得到N个文本特征向量 ( T 1 , T 2 , . . . , T N ) (T_1,T_2,...,T_N) (T1,T2,...,TN)。因为只有在对角线上的图像和文本是一对,所以CLIP的训练目标是让是一个图像-文本对的特征向量相似度尽可能高,而不是一对的相似度尽可能低,这里相似度的计算使用的是向量内积,计算文本特征和图像特征的余弦相似性(cosine similarity)。通过这个方式,CLIP构建了一个由 N个正样本和 N 2 − N N^2-N N2−N 个负样本组成的损失函数。另外,因为不同编码器的输出的特征向量长度不一样,CLIP使用了一个线性映射将两个编码器生成的特征向量映射到统一长度。
(2)zero-shot prediction(inference)
以ImageNet类中没出现的一张图片为例,进入image encoder之后得到一个对应的图像特征向量,然后跟一系列的文本特征向量进行比较,看是否相似,如果相似就做一个输出。这一系列文本特征就是ImageNet中所有1000个类通过text encoder得到的对应的文本特征向量。但是这样做有一个问题就是,在模型预训练的时候模型看到的每张图片对应的是一句描述性的句子,如果在预测的时候只是以类别的文本特征向量和图片特征向量做相似度匹配的话,就会导致效果不好。所以clip做了一个promot learning,就是把原来的一个单词换成了 “a photo of [object]”这样格式的短句,使其和预训练的格式匹配。
视觉语言预训练(VLP)旨在从大规模图像文本对中学习多模态表示,从而改进下游的视觉语言(V+L)任务。
大多数现有的VLP方法(如LXMERT,UNITER,OSCAR)都依赖于预训练过的目标检测器来提取基于区域的图像特征,并使用多模态编码器将图像特征与单词token进行融合。多模态编码器被训练来解决需要共同理解图像和文本的任务,如掩蔽语言建模(MLM)和图像-文本匹配(ITM)。
但这个VLP框架存在几个关键的限制:
(1)图像特征和词嵌入位于它们自己的空间中(不在一个空间),这使得多模态编码器学习建模它们的交互具有挑战性;
(2)目标检测器标注成本和计算代价都很高,因为它在预训练需要边界框标注,在推理过程中需要高分辨率(例如600×1000)图像;
(3)广泛使用的图像-文本数据集是从web中收集而来的,具有固有的噪声,现有的预训练目标如MLM可能会过度适应噪声文本,降低模型的泛化性能。
ALBEF改进:
(1)不使用目标检测器提取图像的特征,使用ViT
(2)在融合多模态数据之前,先把两种模态的特征映射到同一个特征空间中(align);
(3)提出动量蒸馏(momentum distillation)的方式过滤数据中的噪声
ALBEF模型由图像编码器(image encoder)、文本编码器(text encoder)和 多模态编码器(multimodal encoder)组成,其中图像编码器采用的是12层的VIT-base模型,并使用在ImageNet-1k上预训练的权重来初始化它。而文本编码器、多模态编码器采用是一个12层的bert base模型,其前6层作为文本编码器,后6层作为多模态编码器,文本编码器使用BERT base模型的前6层进行初始化,多模态编码器使用BERT Base模型的最后6层进行初始化。
算法流程:输入一个图像,经过image encoder得到图像的一个embedding { v c l s , v 1 , v 2 , . . . , v N } \{v_{cls},v_1,v_2,...,v_N\} {vcls,v1,v2,...,vN},同理,对输入的文本经过text encoder后会得到文本 的embedding { w c l s , w 1 , w 2 , . . . , w N } \{w_{cls},w_1,w_2,...,w_N\} {wcls,w1,w2,...,wN},每个图片和文本得到的embedding在最开始都有一个[CLS],由于transformer的特性,每个输出的embedding都包含有全局的信息,就可以用这个[CLS]对应的embedding来做对比学习,也就是图文对比任务。
ALBEF预训练任务分为图文对比(Image-Text Contrastive Learning)、.掩码建模(Masked Language Modeling)、.图文匹配(Image-Text Matching)三个任务。
图文对比学习任务的目的是融合预训练更好的单模态表示。它学习了一个相似性函数 s = g v ( v c l s ) T g w ( w c l s ) s=g_v(v_{cls})^Tg_w(w_{cls}) s=gv(vcls)Tgw(wcls),使匹配的图像-文本对具有更高的相似性得分。
视觉语言预训练(Vision-language pre-training)最近在各种多模态下游任务上获得了巨大的成功。然而,现有的方法有两个主要的局限性:
(1) 模型角度: 大多数方法要么采用基于编码器的模型,要么采用编码器-解码器模型。然而,基于编码器的模型不太容易直接转换到文本生成任务(例如图像字幕),而编码器-解码器模型尚未成功用于图像文本检索任务。
(2) 数据角度: SOTA的方法(如CLIP、ALBEF等)都在从web上收集到的图文对上进行预训练。尽管通过扩展数据集获得了性能提升,但本文的研究表明,对于视觉语言学习来说,有噪声的网络文本是次优的。
作者提出了BLIP: 引导语言图像预训练,以实现统一的视觉语言理解和生成。BLIP是一个新的VLP框架,与现有方法相比,它可以实现更广泛的下游任务。它分别从模型和数据角度有两个贡献:
(1) Multimodal mixture of Encoder-Decoder (MED):为了预训练一个既有理解能力又有生成能力的统一模型,作者提出了多模态混合编码器-解码器(MED),这是一个多任务模型,可以作为单模态编码器、基于图像的文本编码器或基于图像的文本解码器工作。该模型与三个视觉语言目标联合预训练:图像文本对比学习、图像文本匹配和图像条件语言建模。
(2) Captioning and Filtering ((CapFilt):一种新的数据集增强方法,用于从噪声图像-文本对中学习。作者将预先训练的MED分为两个模块: 一个字幕器,用于生成给定web图像的合成字幕,以及一个过滤器,用于从原始web文本和合成文本中删除嘈杂的字幕。
image encoder使用的是从ImageNet上预训练的vit(vision transformer)初始化,把输入图像分成多个patch,并将它们编码为一系列patch embedding(序列长度=patch+1,加1是认为增加的 class token,cls),额外的 [CLS] token(通过随机初始化得到)来表示全局图像特征,放在序列的最前端,经过image encoder后得到 图像特征向量。
# 随机初始化cls
self.cls_token = nn.Parameter(torch.zeros(1, 1, embed_dim))
- 为什么不用预训练的目标检测器(标注和计算代价高)2. 为什么[cls]表示全局图像特征,transformer的自注意力机制使得[cls] token对应的向量关联到输入的所有位置,因此可以包含有全局图像特征,且[cls]无实际含义,就算模型对它产生偏好对模型的效果也不会产生多大的影响。
文本编码器与BERT相同(,用的BERT_base,BERT用的就是transformer的encoder部分),将 [CLS] token附加到文本输入的开头以概括句子。
用Bi self-attention和cross attention有什么区别?
self-attention是相同的嵌入向量X与三个不同的权值向量 W Q , W K , W V W^Q,W^K,W^V WQ,WK,WV相乘得到的,Q,K,V三个矩阵的尺寸也是相同的;cross attention的输入是不同的,Cross-attention将两个相同维度的图像-文本特征序列不对称地组合在一起,而其中一个序列用作查询Q输入,而另一个序列用作键K和值V输入,用来求两者的相关性,即图像-文本任务,这也是该模块设计出来的初衷之一。
以图像为基础的本文编码器,通过在文本编码器的每个transformer块的自注意 (SA) 层和前馈网络 (FFN) 之间插入一个额外的交叉注意 (CA) 层来注入视觉信息。文本中附加了一个特定于任务的[Encode] token,[Encode]的输出嵌入被用作图像-文本对的多模态表示。
这个模块就是后面用来做filter的模块,把从网络中获取的图文不匹配的数据过滤掉
以图像为基础的文本解码器,用因果自注意力层(causal self-attention layer)替代编码器中的双向自注意力层。用[Decode]标记来表示一个序列的开始,用一个 end-of-sequence token表示序列的结束。
为什么这里要用因果自注意力机制,因为这个模块最后要做的是LM任务,LM的任务实际上就是GPT采用的任务,给出前半句续写后半句这样的一个形式,而不是bert采用的MLM(类似于完形填空)任务,
图像-文本对比任务,目的是通过促进正向的图像-文本对与负向的图像-文本对有相似的表示,来对齐ViT和text Transformer的特征空间。在以前的研究中(CLIP,ALBEF)已被证明是改善视觉和语言理解的一个有效目标。作者遵循前人的ITC损失,引入了一个动量编码器来产生特征,并从动量编码器中创建软标签作为训练目标,以说明negative pairs中的潜在positive。
图像-文本匹配任务,激活了以图像为基础的文本编码器。它的目的是学习图像-文本的多模态表示以捕捉视觉和语言之间的细粒度对齐。ITM是一个二元分类任务,模型根据多模态特征使用一个ITM头(一个线性层)来预测一个图像-文本对是positive(匹配的)还是negative(不匹配的)。
为了找到信息量更大的否定词,研究人员采用了硬否定词挖掘策略,在一个batch中具有更高的对比相似度的否定词对更有可能被选来计算损失。
激活了以图像为基础的文本解码器,其目的是生成给定图像的文本描述。它优化了交叉熵损失,训练模型以自回归的方式最大化文本的概率。在计算损失时,研究人员采用0.1的标签平滑度(label smoothing)。与其他用于VLP的MLM损失相比,LM损失使模型具有泛化能力,能够将视觉信息转换为连贯的标题。
训练流程:首先进行一次预训练(按上文的框架跑一遍,MED模型),输入数据由两部分组成,一部分是从网络上获取的文本-图像对,由于存在噪声影响,并不是所有的文本都能正确的描述图片( T w T_w Tw中有错误的部分),另一部分是人工标注的文本-图像对,由于标注成本较高,因此这部分数据数量较少但质量相对较高。
结束一次预训练后,论文提出了两个模块,captioner和filter,这两个模型都是从相同的预训练MED初始化的,先用人工标注的数据集对这两个模块在各自的任务上进行fine-tuning,然后对于captioner模块,输入图片,生成对应的caption T s T_s Ts,组成{I_w,T_s},同时和从网络获取的{I_w,T_w}做ITC和ITM任务,把噪声部分从T_w中过滤掉,图文一致的就保留下来,最终得到的数据集就由三部分组成,然后再把这个数据集送回模型中继续训练,通过这样的方式,可以提升模型的性能。
基于pytorch实现
image encoder使用vit,还探索了vit-B/16和vit-L/16,默认使用vit-B
AdamW优化器:权重衰减0.05
学习率 warmed-up 到 3e-4 (ViT-B) / 2e-4 (ViT-L) 并以 0.85 的速率线性衰减。
预训练期间随机裁剪分辨率为 224×224 的图像,并在微调期间将图像分辨率提高到 384×384。
数据集:共1400万张图像,2个人工标注(CoCo和visual genome),3个网络数据集(Conceptual Captions,SBU-captions, conceptual 12M),还试验了一个额外的网络数据集LAION,这个数据集包含1.15亿张图像。
如图像文本检索(平均召回率+2.7%@1)、图像标题(CIDEr+2.8%)和VQA(VQA score+1.6%)。
比较了在不同数据集上预训练的模型,以证明 CapFilt 在下游任务上的功效,当仅将 captioner 或过滤器应用于具有 14M 图像的数据集时,可以观察到性能改进。当一起应用时,它们的效果相互补充,与使用原始嘈杂的网络文本相比,会带来实质性的改进。CapFilt 可以通过更大的数据集和更大的视觉主干进一步提升性能,这验证了其在数据大小和模型大小方面的可扩展性。