OSCAR 和 UNITER :在没有 Transformer 之前,做多模态的就是 OSCAR 和 UNITER 等工作,其中用的是 object detection 的模型来做视觉特征的抽取,这个代价很大
ViLT:transformer (ViT)出现之后,ViLT 的作者就想到使用 linear embedding 来代替视觉特征的抽取,大大的简化的视觉特征的抽取过程和代价
CLIP:能高效的做图文对比学习来实现高效的图文检索
ALBEF:根据 ViLT 的简单结构、CLIP 的对比学习的高效和强悍、UNITER 的多模态融合的有效,结合了三家长处,得到了 fusion-encoder 的结构,能够实现更高效的更强悍的图文理解
CoCa:在 SimVLM 和 ALBEF 的基础上,提出了对不同任务框架的统一
VLMO:基于 ViLT 和 ALBEF,提出了共享参数的统一任务框架
BLIP:基于 ALBEF 和 VLMO,提出了一个能实现文本生成的框架,也相当于一个普适的工具,能生成很好的文本描述
BEIT:在 ViT 的基础上,顺着 BERT 的 mask 的思想,提出了 BEIT,能在视觉上做 mask model
VL-BEIT:结合了 BERT 在文本上的 mask 方法和 BEIT 在视觉上的 mask 方法,推出了多模态的 mask 方法
BEIT-V3:结合了 VMLO、BEIT、VL-BEIT,推出了 BEIT-V3,超过了单模态和多模态的大量方法
MAE:在 ViT 的基础上,mask 掉 pixel,很有效的做了 mask model,MAE mask 掉了大量的视觉 patch,只把没有 mask 的 patch 送入了 vision transformer 学习,计算量就变小了
FLIP:结合了 CLIP 和 MAE 的特性,模型就是 CLIP,在视觉那端只用了没有 mask 的 token,降低了计算量,所以 Fast
还有很多研究者聚焦于模型的统一,因为 VLMO 和 BEIT 这些虽然号称自己是大一统的模型,其实是多种模块的拼接,用的时候需要哪个用哪个,而不是真正意义上的一个模型
所以很多工作聚焦于 Language interface 和 generalist model,依然想建立真正意义上的大一统模型
论文:Learning Transferable Visual Models From Natural Language Supervision
代码:https://github.com/OpenAI/CLIP
官网:https://openai.com/research/clip
出处:OpenAI
时间:2021.02
贡献:
CLIP 的核心就是利用自然语言的监督信号来指导模型训练
作者强调这种思路并不是一种很新的思路,因为之前就有方法做了相关研究,但描述的很凌乱,同样的思想却被分别称为无监督、自监督、弱监督、有监督的方法,看的很混乱,而且规模也没做大,所以本文就是总结了这些方法且用很多的实验证明了效果
预训练流程:
推理:
分割任务其实是对像素级别的分类,所以分类任务的技术很容易就能用到分割任务上来
论文:Language-Driven segmantic segmentation
出处:ICLR2022
1、模型效果
2、模型架构
模型结构和 CLIP 看起来非常像:
单看下面的图像特征的处理过程,和有监督的图像分割结构完全一致,都是对图像进行特征提取,得到特征图,然后上采样得到输出特征图,输出和 gt 做 loss 就可以了
文本的处理也是先输入 label,假设有 N 个 label,经过 text encoder 就会得到 N 个文本特征,也就是 NxC 的特征,而且这里的文本编码器是使用的 CLIP 训练好的编码器,在训练的过程中是不参与训练的,是冻住的
这个方法就是将文本引入了分割任务,但终究使用的是有监督的训练方式,就是使用了 7 个分割数据集的 gt 来监督模型的训练,计算 CE loss
论文:GroupViT: Semantic Segmentation Emerges from Text Supervision
代码:https://github.com/NVlabs/GroupViT
出处:CVPR2022
因为 LSeg 虽然很类似于 CLIP 的结构,但目标函数不是对比学习,也并没有把文本当做监督信号来使用,还是依据于人工标注的 mask 来训练的,手工标注 mask 是很贵的,所以还需要研究如何真正使用文本来监督训练
GroupViT 是真正的利用的文本特征,使用图像-文本对来监督模型训练,不需要使用 mask,从而让模型来实现简单的分割任务
视觉上很早之前做无监督分割的时候,其实就是一种自下而上的方式,就是使用 group 的方法,就是假如有聚类的中心点,然后从中心点开始发散,把附近周围相似的点来扩展成 group,这个 group 就相当于一个 mask
本文作者重新审视了一下 group 的方法,提出了一个计算单元 grouping block,还有一些可学习的 tokens,希望模型在初始学习的时候就能慢慢的把相邻相近的像素点 group 起来,慢慢形成一个 mask。
可以看到在初始浅层上,学到的 group token 分割的效果还不是很好,经过学习的深层 group token 就做的挺好的了,所以 GroupViT 就是在原始的 group 框架中,加入了 group block 和可学习的 group token。
模型训练:
图像编码器是 transformer,一共有 12 层,输入有两部分:
模型推理:
可视化 group token 的作用:能够起到不同类别划分到不同 group 上的作用
效果:
局限性:
分割中存在背景类,作者为了尽可能的提高前景类的性能,作者这里设定了一个阈值,如 PASCAL VOC 设置为 0.9,就是当匹配的相似度超过 0.9 时,才会说 group embedding 属于这个类别,如果都没有超过阈值的话,就说明不是前景
这个操作都 PASCAL VOC 上这种前景特别明显类别少的数据集上表现还好,但在复杂数据集上前景类和背景类的得分差不了很多,设置一个很高的阈值就会导致把很多很多前景部分分割成了背景部分,设置很低的阈值就会造成错误分类,相似度最高的那个类别不是真正正确的那个类别。
这是作者自己发现的问题,通过观察发现 group token 学的挺好的,就是分割效果做的挺好的,就是最后的分类会分错。
所以作者直接拿了 gt 的类别标签,只使用 group vit 输出的 mask 和 gt 的标签进行 IoU 计算,IoU 最大的 gt label 直接给到预测 mask 作为类别,用这样的方式来验证到底是不是分类效果影响了最后的分割评价效果。
作者用这样的方式来验证后就得到了 table c.3 的结果,提高了二三十个点,和有监督的 SOTA 基本逼近了。这也验证了 group vit 已经把分割做的很好了,只是说语义没识别正确。
这种结果究其原因还是在于 CLIP 的这种训练方式,只能学到物体语义信息非常明确的物体,而无法学习到语义信息很模糊的东西。
这篇文章的开头就说明白了,本文要实现的就是能够检测任意的物体类别,做的方法就是把 CLIP 当做 teacher,蒸馏自己的网络
作者先给出了当前目标检测方法的限制,就是只能检测有限的基础类别,比如蓝框标出来的就叫 toy,那么模型就只能检测 toy,如果想检测绿色的玩具,或者鸭子,模型是没有办法检测的
所以是否能做到不额外标注鸭子、绿色玩具的情况下,模型就能识别这些目标呢,也就是能检测新类别的能力
论文的主体方法:
这个论文的思路其实是在基础类别上做有监督的训练的,也就是有监督的训练
A base line:
只涉及基础类别 C B C_B CB,也是 mask rcnn,第一阶段输出 N 个 proposal,然后抽特征,最后分类,会使用分类和定位来衡量目标检测的效果。ViLD 相当于把分类和定位这个两个任务给分开来了,输入的时候直接就是 N 个 proposal 了,第一阶段提取 proposal 的阶段没有体现在其中,也就是说文章的重点不在于提取 proposal,而在于第二阶段
B ViLD-text:
ViLD-text,只涉及基础类别 C B C_B CB,会从头开始训练,和 Mask rcnn 的差别在于适用固定的 text embedding 代替了可学习的分类器,这里的 N 个 proposal 输入是来自于第一阶段的 RPN 网络,和 mask rcnn 中的一样,是参与训练的。
主要是将图像特征(黄色 region embedding)和文本特征(蓝色 text embedding)做了关联,计算相似度。
输入是 N 个提取好的 proposal,经过一些映射得到 N 个 region embedding,对应 N 个 proposal 的特征
文本的 embedding 就是将物体要检测的类别拿过来先变成 prompt 模板(a phtot of {}),然后送入固定的文本特征提取器,也就是图中蓝色框中,得到对每个类别的文本编码特征,这里是使用基础类别的名称来监督检测的训练的,所以在这里也只是将文本和图像的特征做了关联,zero-shot 的特征还有待加强。
而且这里还有 background ,就指的是除过基础类别之外的其他类别的 text embedding,全部塞给背景类,背景类的文本编码是可学习的。N 个 region embedding 要同时和固定的 text embedding 和 background embedding 计算相似度。
C ViLD-image:
ViLD-image,同时涉及基础类别 C B C_B CB 和新类别 C N C_N CN。使用的是用训练好的 RPN 预提取的 M 个 proposal
因为 ViLD-text 已经有了一定的图文关联能力了,但毕竟只是在基础类别上去训练的,如何扩展到新的类别上呢,或者如何把 CLIP 的能力引入到这个框架里边来呢,作者就提出了 ViLD-image。
作者认为 CLIP 预训练好的图像编码器很好,而且和文本的关联也很好,所以,如果这里这个黄色块的图像编码结果能尽可能的像 CLIP 输出的橘色块里边的图像编码,想做到这点就可以使用知识蒸馏。
具体做法就是粉色背景区域中(teacher 网络),对抽出来的 proposal 从原图中 crop,crop 出原图的区域并 resize,然后送入 CLIP 预训练好的编码器来得到 CLIP 的图像编码特征,这里 CLIP 图像编码器是不会参与训练的,是固定的参数。
ViLD-image 左边的这个分支呢就是 student 网络,包括检测头、特征映射层等,使用 L1 loss 做蒸馏。注意,这里的类别就不受基础类别的限制了,因为 proposal 是与类别无关是,是第一阶段的 RPN 网络提取的,监督信号是从 CLIP 来的。
但这里值得注意是 M 个 proposal,而不是之前的 N 个 proposal(前面这个 RPN 网络输出的就是 N 个 proposal),但肯定用全部生成的 proposal 会更好一些,但事实上,如果每次在训练的时候再抽取 CLIP 的特征(蓝色)呢就很费时间,而且作者想用最大最好的 CLIP 模型,这样就会更耗时。如果每次训练有 1000 个 proposal,那么就要进行 1000 次的图像特征提取,而且每次迭代都要提取这些 proposal 的特征,肯定会拉长训练时长。所以作者就在训练之前,先利用 RPN 预抽取 M 个 proposal,通过 CLIP 模型提取好特征,然后存储起来,在训练的时候直接拿来 embedding 就可以。所以这 M 个 proposal 和那 N 个可以在训练的时候改变的 proposal 是不一样的。
C ViLD:
左边是目标检测分支,右边是 CLIP 图像 embedding 的分支,右边只有在训练的时候才会用的,推理的时候是不会使用的。
具体的就是把 N 个 proposal 和 M 个预抽取的 proposal 全部输入检测头,得到 N+M 个 region embedding,N 个 embedding 去计算 cross entropy loss,M 个预抽取的 region embedding 去计算蒸馏的 L1 loss
训练整体过程:
ViLD-text 的过程:从头开始使用基础类别来训练特征提取器和图文匹配能力(基于第一阶段训练得到的 N 个 proposal )
ViLD-image 的过程:使用 M 个 proposal 的 CLIP 特征指导学生网络的训练
也就是说这 M 个预提取的 proposal 用于指导蒸馏,N 个可训练的 proposal 用于参与 proposal 特征的提取和图文的匹配
推理的过程:
效果:
总结:
GLIP 的动机:如何像 CLIP 一样利用超多的容易获得的图像文本对儿来实现对任意目标的识别
所以本文主要围绕的也是如何扩大数据量级这个目标来做的
因为 phrase grounding 其实和目标检测的本质是一样的,那么是否能够将两个任务结合起来,将两种数据都利用起来,从而实现能够利用更多的数据就是作者思考的问题
此外,作者还把伪标签那种方法加进来,就是 self-training 的方法,在没有标注过的图像文本对儿上生成伪标签,从而扩大整个数据集的数量,来将整个模型训练的更好。
所以 GLIP 在 COCO 上 zero-shot 的效果就达到了 49.8AP,这在有监督里边都是很能打的效果
GLIP 是怎么把目标检测和 phrase grounding 结合起来的:将目标检测的类别全部放入 prompt 中作为检测类别
作者验证了可行性后,就可以把 phrase grounding 数据集和检测数据集结合起来了,但还想进一步扩大数据集来支持各种各种的物体识别
所以作者进一步引入了 Cap4M 和 Cap24M 这些 caption 数据集,这些数据集是没有框的信息的,所以作者使用基于 Object365 和 GoldG 数据集训练好的 GLIP-T© 模型对这些图像-文本对儿进行推理,推理出来的 bbox 就当做 gt,但肯定不是很准确,所以叫做伪标签,通过提供伪标签的方式来进一步提高数据量。
总体的数据量是 3M 标注数据集+24M 伪标签数据集 = 27M数据量
总体框架:
效果:
将更多视觉定位和视觉理解任务都结合起来了,比 GLIPv1 做了更多的工作拓展,能做检测和分割,还能做 VQA 和 Image caption,而且为每次的迭代引入了更多的负样本,让不同图文对能拉的更远。
ViLT: Vision-and-Language Transformer Without Convolution or Region Supervision
Align before Fuse: Vision and Language Representation Learning with Momentum Distillation
我们已知 CLIP 在对有明显语义特征或者说很好描述的任务上表现的比较好,如图像分类,很好的描述这是狗或猫,但在难以很容易用语言描述清楚的任务,或者说文本描述比较复杂的任务上(VQA/VR)表现不太好,究其原因就在于 CLIP 只是对两个模态的特征进行了简单的融合匹配,并没有让模型学习到更深层次的图像-语言之间的内在关系
所以,我们已经知道在多模态中,图像编码器是要比文本编码器更重要的(虽然 ViLT 使用了轻量级的图像编码器达到了 trade-off,但效果是在是不太好),然后模态之间的融合也是很重要的,也就是类似于 c 中的样式,当然其中的视觉模型是使用 Vision transformer (而不是 ViLT 中的 linear embedding)
从 CLIP 的成功中可以知道使用 Image-text contrastive loss (ITC)一定是很有用的,所以一定要使用的,而且 ViLT 中的 WPA loss 计算起来非常慢,所以训练起来很费劲,还有两个常用的 loss,一个是Mask Language Modeling loss(MLM)在 NLP 里边应用的很多也很成功,还有一个是 Image-text Matching loss(ITM)在 ViLBERT 和 ViLT 中都取得了很好的效果,所以也继续采纳。
从这可以发现,一个好的多模态模型,可能使用 ITC+MLM+ITM 这三个 loss 就能取得较好的效果了
所以现在可以来看 ALBEF 的结构
ALBEF:
ViLT 的出发点:视觉编码使用目标检测方法的速度太慢了,想让速度变的更快一些
ALBEF 出发点和贡献:
贡献 1:使用对比学习 loss 在两个模态的特征融合之前先进行了特征对齐
用了预训练的目标检测器提取的视觉特征,和文本特征是没有 align 的,因为目标检测器是提前训练好的,用于抽特征,将两个距离很远的两种模态的特征同时送入 transformer 编码器的话,编码器不太好学习,就是很难以学习到图像和文本之间的交互信息。所以 ALBEF 就提出了一种对比学习的 loss(就是 ITC),能够在 fusing 之前就通过 cross-modal attention 把文本和图像特征进行对齐。
贡献 2:为了从 noisy 的数据中更好的提取特征,所以使用了 self-training 的方式来训练了模型(也就是伪标签),所以还使用了 MOCO 中提出的 momentum model 来生成伪标签,从而达到自训练的效果。为什么作者说从网上爬取的图像文本对儿是 noisy 的是因为,直接爬取的,很多文本并没有很好的描述对应的图像,而这些文本都是具有搜索性的,不是描述性的。
ALBEF 的效果:
ALBEF 的主体结构:左边是梯度更新的模型,右边是使用动量更新的模型,图像模型更大,文本模型更小,文本模型原始的 BERT 分了 6 层用于模态融合了,所以总体参数还是没有很大的变化的
训练图像 embedding 和 BERT embedding 前 6 层的目标函数:
ITC Loss:用于训练图像 embedding 和 BERT embedding 的前 6 层
图像-文本对比学习,对比学习的目标是将一对样本拉近,非一对的样本拉远
图像和文本分别经过各自的编码器,都会有 768x1 的 cls token,然后将 cls token 映射为 256x1 的向量,两个 cls token 就分别代表图像和文本的特征,就希望一对的特征尽可能的近,和其他有 momentum model 产生的负样本(存在 q 里,共 65536 个负样本)特征尽可能的远,也是模型的第一阶段的学习。
也就是文章题目中 align before fuse 中的 align 过程。这里的 ITC loss 就是和 MOCO 完全一样,计算的是 cross entropy loss。
训练多模态融合的 目标函数:
ITM Loss:Image-text matching,给定一个图像,给定一个文本,对各自 embedding 通过 attention 得到交互后的特征,然后使用分类头(FC)来判断 I 和 T 是不是一个对儿。
这个 loss 实际在想做好其实比较难,因为判断谁和谁是正样本对可能比较难,但判断谁和谁是负样本对很简单,因为一个图像匹配的文本只有一个,其他很多很多的文本样本都是负样本,所以在训练的时候精度能得到很大的提升,然后训练再久都没什么意义。
所以常见的做法就是在选负样本的时候给一些限制,这里就选择了难负样本来参与训练,也就是选择和正样本很接近的负样本来参与训练。
这里 batch size 假设是 512,那么一个迭代中正样本对就是 512,对于每一张图片,从哪里找 hard negative 文本呢,ALBEF 借助了上面的 ITC 来进行 hard negative 文本样本的选择,就是使用 ITC 计算一遍整个 batch 中所有图像和所有文本的相似度 cos similarity,选择除了自己之外的相似度最高的那个文本作为负样本,也就是这个文本和图像都非常相似了,但其实是一个负样本,所以 ITM loss 就变的很难了,这样才能进行有意义的训练
MLM Loss:把原来完整的句子进行 mask,擦除掉一些单词,把擦除了一些单词的句子和其对应的图片一起输入到 ALBEF 中,然后需要把之前完整的句子预测出来,这里不像 NLP 中单纯的 MLM,而是借助的图像信息
总体 loss(不带动量的):
每次迭代前向传播的次数:2
动量蒸馏:
为什么要做动量蒸馏:
带动量的 ITC loss :
带动量的 MLM loss:
注意:加入动量蒸馏后的全部 loss 一共有 5 个!!!
图 2 展示了使用动量模型能实现的效果,伪标签其实比 gt 更能准确形象的描述这个图像中的内容
预训练的数据集:
下游任务:
1、图文检索:图像到文本的检索,文本到图像的检索
衡量的指标是 Recall,使用一般是 Recall@1,Recall@5,Recall@10 这种衡量方式,就是判断在检索回来的这 1 个、5个、10 个样本中,有没有真正的样本,如果有就算找到了
fine-tuning 的效果比 SOTA 要好,使用更大数据集还是更好的
因为在 coco 上做了预训练了,所以作者只在 Flickr30K 上做了 zero-shot 测试,在 4M 上训练,zero-shot 的结果就比 CLIP 还要好
2、视觉蕴含:Visual Entialment
给定一个假设,能不能推理出来这个前提,如果能推理出来就是蕴含 entialment,如果没推理出来就是 contradictory,如果不知道能不能推出来就是中立 neutral。一般情况下都变成了3分类问题,衡量指标就是分类准确度
3、视觉问答:VQA
一般有两种方式来解决:
虽然 ALBEF 说能够做 answer generation 的任务,但推理的时候还是把生成的答案限制到了 3192 中,还是分类问题,衡量指还是准确度
4、视觉推理:Natural Language for Visual Reasoning( N L V R 2 NLVR^2 NLVR2)
预测文本能不能同时描述一对图像,是一个二分类任务,衡量指标也是准确度
5、Visual Grounding:视觉定位,一般视觉定位单独属于一个领域,很多做多模态表征学习的论文里都不会涉及到这个任务,专门做 grounding 的论文才会做这个任务
消融实验:
论文:BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation
代码:https://github.com/salesforce/BLIP
BLIP 是 ALBEF 的后续工作
题目中有两个关键词,也就是两个贡献点:
研究动机:
预训练框架结构如图 2:MED:Mixture of Encoder and Decoder
对数据的处理:Caption model 和 Filter model
数据集 D 中有网络爬取的数据集和手动标注的数据集,最大的问题就是爬取的数据中图片-文本不匹配,作者认为 COCO 这种手工标注的数据是匹配的,使用 noisy 的数据集预训练的模型效果肯定是不够好的,所以如果想清理数据集达到最优解的话,就需要做一些操作
清理数据集的方式可以使用一个有一定能力的模型,来计算图像和文本的相似度,相似度高的就说明匹配,不高的就说明不匹配。这就是 Filter 模型的由来
Filter 模型的训练方式:使用 COCO 微调预训练好的 MED 中的前两个文本编码器来做 noisy 图文对的删除
Captioner 模型的训练方式:使用 COCO 微调预训练好的 MED 中的最后一个文本编码器来做优质文本的生成
经过了 Filter 和 Caption 这两步后,可以用的数据集就变成了三部分:
下图 4 中,Tw 是网络上的文本,Ts 是模型生成的文本,红色是被过滤掉的文本,绿色是被 Filter 保留下来的文本,直观看起来就能感受到模型的强大之处,说明 Filter 把数据集清理的相当好
对数据集进行了过滤和扩充后,作者使用这些优质的数据再重新预训练一个 MED ,就能很好的再次提升模型效果
模型效果展示:
主要结果和消融实验:
Caption-Filter 模式带来的效果:
BLIP 提出的 Caption 方法非常具有普适性,很有用
论文:CoCa: Contrastive Captioners are Image-Text Foundation Models
CoCa 是 ALBEF 的一篇后续工作
CoCa 和 ALBEF 的两个区别:
为什么不用 ITM loss:
训练数据集:几十亿的训练数据,模型大小 2.1B
CoCa 是多边形战士,没有角的就是不能做这个任务
CoCa 比之前所有的 SOTA 在所有数据集上的效果都是最优的
论文:Image as a Foreign Language: BEiT Pretraining for All Vision and Vision-Language Tasks
本文的出发点:将图像也看做语言,使用一个统一的目标函数,使用的数据都是开放的(CoCa 的训练数据量几十倍于 BeiTv3)
采取了 CoCa 的多边形图,展示了效果,在每个任务上都取得了最好的,紫色的圈
BeiTv3 是一个灵活的结构,推理的时候可以拆成各种各样的部分,可以做单模态的图像任务(分类、分割、检测)也可以做多模态的任务,也可以做语言任务
定量的展示了效果:
BeiTv3:做大做强统一的模型(unified framework)
出发点:
最近在语言、视觉、多模态任务上,大家研究大型预训练模型的热情都很高,一旦模型训练好之后,特征就能提取的非常好了,可以直接 transfer 到下游任务上去,尤其是模型足够大数据足够多的时候,就有可能训练出一个有通用性的 foundation model,性能很强大,但现在已经有了很多号称自己是 foundation model 的大模型,作者就想把这些 vision-language foundation model 进行统一,且是从下面三个方向来做统一
第一:模型的大一统。大一统的框架下,transformer 就更适合做多模态任务,当前多模态的模型有几种框架。但这几种不同的框架都是针对特定的任务的,需要根据下游任务来做修改,不够方便也不够泛化。所以本文作者提出了 Multiway transformer 来构建了一个大一统的模型结构
第二:目标函数的大一统。当前,基于 masked data modeling 的方法已经被用于很多模态,比如 BERT、BeiT,作者就想着能不能只用一个目标函数来把模型训练好。
第三:把模型和数据集增大(scale up)。只有用了很多的数据集和很大的模型,才有可能用一个模型解决所有的事情。在 BeiTv3 中,把模型扩展到了 billion 尺度,也最大尺度的收集了可获得的开放数据集来得到更多数据
BeiTv3 的预训练:
预训练完后做下游任务的 transfer: