深入了解视觉语言模型
'Understanding Visual Language Models in depth'
人类学习本质上是多模态的,通过同时利用多种感官帮助我们更好地理解和分析新信息。毫不奇怪,最近在多模态学习方面的进展受到了这一过程的有效性的启发,创造了能够使用图像、视频、文本、音频、身体手势、面部表情和生理信号等多种模态处理和链接信息的模型。
自2021年以来,我们已经看到了对视觉和语言模态(也称为联合视觉语言模型)的兴趣增加,例如OpenAI的CLIP。联合视觉语言模型在非常具有挑战性的任务中表现出了特别令人印象深刻的能力,例如图像字幕生成、文本引导的图像生成和操作以及视觉问答。这个领域不断发展,其提高零样本泛化能力的有效性也在不断改进,导致出现了各种实际应用案例。
在本博客文章中,我们将介绍联合视觉语言模型,重点介绍它们的训练方式。我们还将展示如何利用🤗 Transformers来实验这一领域的最新进展。
目录
- 介绍
- 学习策略
- 对比学习
- PrefixLM
- 多模态融合与交叉注意力
- MLM / ITM
- 无训练
- 数据集
- 在🤗 Transformers中支持视觉语言模型
- 新兴研究领域
- 结论
介绍
将模型称为“视觉语言”模型意味着什么?这是一个同时结合了视觉和语言模态的模型吗?但确切的含义是什么?
- 使用Intel Sapphire Rapids加速PyTorch Transformers – 第2部分
- 介绍 ⚔️ AI vs. AI ⚔️ – 一个深度强化学习多智能体竞争系统
- 生成故事:游戏开发中的人工智能 #5
帮助定义这些模型的一个特征是它们能够处理图像(视觉)和自然语言文本(语言)两种输入。该过程取决于输入、输出和这些模型被要求执行的任务。
以零样本图像分类的任务为例。我们将传入一张图像和一些提示,以获取输入图像的最可能提示。
这张猫和狗的图片来自这里。
要预测这样的结果,模型需要理解输入图像和文本提示。为了实现这种理解,模型需要具有分别用于视觉和语言的编码器或融合编码器。
但这些输入和输出可以采用多种形式。以下是一些示例:
- 从自然语言文本中检索图像。
- 短语定位,即从输入图像和自然语言短语中执行对象检测(例如:一个年轻人挥动球棒)。
- 视觉问答,即从输入图像和自然语言问题中找到答案。
- 为给定的图像生成标题。这也可以采用条件文本生成的形式,其中你可以从自然语言提示和图像开始。
- 检测涉及图像和文本模态的社交媒体内容中的仇恨言论。
学习策略
视觉语言模型通常由三个关键元素组成:图像编码器、文本编码器和融合这两个编码器信息的策略。这些关键元素紧密地结合在一起,因为损失函数的设计是围绕模型架构和学习策略而进行的。虽然视觉语言模型的研究并不是一个新的研究领域,但这些模型的设计在多年间发生了巨大的变化。早期的研究采用手工制作的图像描述符和预训练的词向量或基于频率的TF-IDF特征,而最新的研究主要采用具有Transformer架构的图像和文本编码器,以分别或联合学习图像和文本特征。这些模型使用策略性的预训练目标进行预训练,以支持各种下游任务。
在本节中,我们将讨论一些典型的视觉语言模型的预训练目标和策略,这些目标和策略在转移性能方面表现良好。我们还将介绍一些与这些目标特定或可用作预训练的通用组件的其他有趣内容。
在预训练目标中,我们将涵盖以下主题:
- 对比学习:以对比的方式将图像和文本对齐到一个共同的特征空间
- PrefixLM:通过使用图像作为语言模型的前缀来联合学习图像和文本嵌入
- 多模态融合与交叉注意力:使用交叉注意力机制将视觉信息融合到语言模型的各层中
- MLM / ITM:通过遮蔽语言建模和图像-文本匹配目标,将图像的部分与文本对齐
- 无训练:通过迭代优化使用独立的视觉和语言模型
请注意,本节内容是一个非全面的列表,还有其他各种方法,以及统一的混合策略,如Unified-IO。要获取更全面的多模型综述,请参阅此处的工作。
1)对比学习
如下所示,对比预训练和零样本图像分类。
对比学习是一种常用的用于视觉模型预训练的目标,并且对于视觉-语言模型来说,它已被证明是一种非常有效的预训练目标。最近的作品,如CLIP、CLOOB、ALIGN和DeCLIP通过学习文本编码器和图像编码器的对比损失,来连接视觉和语言模态,使用包含{图像,标题}对的大型数据集。对比学习的目标是将输入图像和文本映射到相同的特征空间,使得图像-文本对的嵌入之间的距离在匹配时最小化,在不匹配时最大化。
对于CLIP,距离只是文本和图像嵌入之间的余弦距离,而ALIGN和DeCLIP等模型则设计了自己的距离度量来考虑嘈杂的数据集。
另一项工作LiT通过使用CLIP预训练目标对文本编码器进行微调,同时保持图像编码器冻结。作者将这个想法解释为教文本编码器更好地读取图像编码器的图像嵌入的方法。这种方法已被证明是有效的,并且比CLIP更具样本效率。其他作品,如FLAVA,使用对比学习和其他预训练策略的组合来对齐视觉和语言嵌入。
2)PrefixLM
PrefixLM预训练策略的示意图(图片来源)
训练视觉-语言模型的另一种方法是使用PrefixLM目标。SimVLM和VirTex等模型使用这个预训练目标,并采用了由transformer编码器和transformer解码器组成的统一多模态架构,类似于自回归语言模型。
让我们详细了解一下这个方法的工作原理。具有前缀目标的语言模型根据输入文本预测下一个标记。例如,给定序列“一个人站在拐角处”,我们可以使用“一个人站在”作为前缀,并用预测下一个标记的目标(“拐角”或前缀的其他可能延续)训练模型。
视觉变换器(ViT)将前缀的相同概念应用到图像上,通过将每个图像划分为多个补丁,并将这些补丁顺序地作为输入提供给模型。利用这个想法,SimVLM的架构接收一个连结的图像补丁序列和前缀文本序列作为前缀输入,解码器然后预测文本序列的延续。上面的图表描述了这个想法。SimVLM模型首先在不包含图像补丁的文本数据集上进行预训练,然后在对齐的图像-文本数据集上进行预训练。这些模型用于基于图像的文本生成/字幕和VQA任务。
利用统一的多模态架构将视觉信息融合到语言模型(LM)中,用于图像导向的任务,显示出了令人印象深刻的能力。然而,仅使用PrefixLM策略的模型在应用领域上可能有限,因为它们主要设计用于图像字幕或视觉问答下游任务。例如,给定一张人群的照片,我们可以查询图像以撰写对图像的描述(例如,“一群人站在一座建筑物前面并微笑着”),或者使用需要视觉推理的问题进行查询:“有多少人穿着红色T恤?”另一方面,学习多模态表示或采用混合方法的模型可以用于各种其他下游任务,如目标检测和图像分割。
冻结的PrefixLM
冻结的PrefixLM预训练策略(图片来源)
虽然将视觉信息融入语言模型非常有效,但能够使用预训练的语言模型(LM)而无需进行微调将更加高效。因此,视觉-语言模型中的另一个预训练目标是学习与冻结的语言模型对齐的图像嵌入。
像Frozen和ClipCap这样的模型使用了Frozen PrefixLM预训练目标。它们只在训练过程中更新图像编码器的参数,以生成可以作为预训练的冻结语言模型的前缀使用的图像嵌入。Frozen和ClipCap都是在对齐的图像-文本(字幕)数据集上进行训练的,目标是生成给定图像嵌入和前缀文本的字幕中的下一个标记。
最后,像MAPL和Flamingo这样的模型保持预训练的视觉编码器和语言模型都是冻结的。Flamingo在预训练的冻结视觉模型之上添加Perceiver Resampler模块,并在现有的预训练和冻结LM层之间插入新的交叉注意力层,以使LM基于视觉数据。
Frozen PrefixLM预训练目标的一个巧妙优势是它能够使用有限的对齐的图像-文本数据进行训练,这在没有可用的对齐多模态数据集的领域特别有用。
3) 多模态融合与交叉注意力
使用交叉注意力机制将视觉信息融合到语言模型解码器的层中(图像来源)
利用预训练的语言模型进行多模态任务的另一种方法是使用交叉注意力机制直接将视觉信息融合到语言模型解码器的层中,而不是将图像作为额外的前缀添加到语言模型中。VisualGPT、VC-GPT和Flamingo等模型使用这种预训练策略,它们在图像字幕和视觉问答任务上进行训练。这类模型的主要目标是有效地平衡文本生成能力和视觉信息,这在缺乏大规模多模态数据集的情况下非常重要。
VisualGPT等模型使用视觉编码器将图像嵌入,并将视觉嵌入馈送到预训练语言解码器模块的交叉注意力层中以生成合理的字幕。最近的工作FIBER在视觉和语言主干中插入带有门控机制的交叉注意力层,以实现更高效的多模态融合,并实现其他各种下游任务,如图像-文本检索和开放词汇对象检测。
4) 掩码语言建模/图像-文本匹配
另一类视觉-语言模型使用掩码语言建模(MLM)和图像-文本匹配(ITM)目标的组合,将图像的特定部分与文本对齐,从而实现各种下游任务,如视觉问答、视觉常识推理、基于文本的图像检索和文本引导的对象检测。遵循这种预训练设置的模型包括VisualBERT、FLAVA、ViLBERT、LXMERT和BridgeTower。
将图像部分与文本对齐(图像来源)
让我们来解析一下MLM和ITM目标的含义。给定一个部分屏蔽的字幕,MLM目标是根据对应的图像预测被屏蔽的单词。需要注意的是,MLM目标要么需要使用具有边界框的丰富注释的多模态数据集,要么使用目标检测模型为输入文本的部分生成对象区域提议。
对于ITM目标,给定一对图像和字幕,任务是预测字幕是否与图像匹配。负样本通常是从数据集本身随机采样的。在多模态模型的预训练过程中,通常会将MLM和ITM目标结合起来。例如,VisualBERT提出了一种类似BERT的架构,它使用预训练的目标检测模型Faster-RCNN来检测对象。该模型在预训练过程中使用MLM和ITM目标的组合来通过自注意力隐式地将输入文本的元素和相关的输入图像区域对齐。
另一项工作FLAVA由图像编码器、文本编码器和多模态编码器组成,用于融合和对齐图像和文本表示以进行多模态推理,所有这些都基于transformers。为了实现这一点,FLAVA使用了多种预训练目标:MLM、ITM以及掩码图像建模(MIM)和对比学习。
5) 无需训练
最后,各种优化策略旨在使用预训练的图像和文本模型将图像和文本表示桥接在一起,或者在没有额外训练的情况下适应预训练的多模态模型到新的下游任务。
例如,MaGiC提出了通过预训练的自回归语言模型进行迭代优化,为输入图像生成标题的方法。为了实现这一点,MaGiC使用生成的标记和输入图像的CLIP嵌入计算基于CLIP的“Magic分数”。
使用预训练的、冻结的单模态图像和文本编码器创建相似性搜索空间(图片来源)
ASIF提出了一种简单的方法,将预训练的单模态图像和文本模型转换为多模态模型,用于在不进行额外训练的情况下生成图像标题,使用相对较小的多模态数据集。ASIF的关键想法是相似图像的标题也彼此相似。因此,我们可以使用一小组地面真实多模态对的数据集来构建相对表示空间,从而执行基于相似性的搜索。
数据集
通常,视觉语言模型是在大规模的图像和文本数据集上进行训练的,这些数据集具有不同的结构,基于预训练目标进行选择。在预训练之后,它们使用特定任务的数据集进行进一步微调。本节提供了一些用于训练和评估视觉语言模型的流行预训练和下游数据集的概述。
预训练数据集
视觉语言模型通常在从网络中收集的大规模多模态数据集上进行预训练,这些数据集以匹配的图像/视频和文本对的形式存在。这些数据集中的文本数据可以是人工生成的标题、自动生成的标题、图像元数据或简单的对象标签。这些大型数据集的一些示例是PMD和LAION-5B。PMD数据集结合了多个较小的数据集,例如Flickr30K、COCO和概念字幕数据集。COCO检测和图像字幕(>330K图像)数据集由图像实例和每个图像包含的对象的文本标签以及自然句子描述组成。概念字幕(> 3.3M图像)和Flickr30K(> 31K图像)数据集是从网络上获取的,同时获取了它们的标题-描述图像的自由形式句子。
即使是仅包含人工生成标题的图像-文本数据集,例如Flickr30K,也存在噪声,因为用户只有时不时为他们的图像编写描述性或反思性的标题。为了解决这个问题,例如LAION-5B数据集利用CLIP或其他预训练的多模态模型来过滤噪声数据,并创建高质量的多模态数据集。此外,一些视觉语言模型,例如ALIGN,提出了进一步的预处理步骤,并创建了自己的高质量数据集。其他视觉语言数据集,例如LSVTD和WebVid数据集,由视频和文本模态组成,尽管规模较小。
下游数据集
预训练的视觉语言模型通常在各种下游任务上进行训练,例如视觉问答、文本引导的对象检测、文本引导的图像修复、多模态分类以及各种独立的NLP和计算机视觉任务。
针对问答下游任务进行微调的模型,例如ViLT和GLIP,最常使用的数据集是VQA(视觉问答)、VQA v2、NLVR2、OKVQA、TextVQA、TextCaps和VizWiz数据集。这些数据集通常包含与多个开放式问题和答案配对的图像。此外,例如VizWiz和TextCaps的数据集也可以用于图像分割和对象定位的下游任务。其他一些有趣的多模态下游数据集包括用于多模态分类的Hateful Memes、用于视觉蕴含预测的SNLI-VE以及用于视觉语言组合推理的Winoground。
请注意,视觉语言模型用于各种经典的NLP和计算机视觉任务,例如文本或图像分类,通常使用单模态数据集(例如SST2、ImageNet-1k)进行这些下游任务。此外,诸如COCO和概念字幕之类的数据集通常既用于模型的预训练,也用于生成字幕的下游任务。
在🤗 Transformers中支持视觉语言模型
使用Hugging Face Transformers,您可以轻松下载、运行和微调各种预训练的视觉语言模型,或者混合和匹配预训练的视觉和语言模型来创建自己的配方。🤗 Transformers支持的一些视觉语言模型包括:
- CLIP
- FLAVA
- GIT
- BridgeTower
- GroupViT
- BLIP
- OWL-ViT
- CLIPSeg
- X-CLIP
- VisualBERT
- ViLT
- LiT(
VisionTextDualEncoder
的一个实例) - TrOCR(
VisionEncoderDecoderModel
的一个实例) VisionTextDualEncoder
VisionEncoderDecoderModel
CLIP、FLAVA、BridgeTower、BLIP、LiT和VisionEncoderDecoder
模型提供了联合图像和文本嵌入,可用于下游任务,如零样本图像分类。其他模型则是在有趣的下游任务上进行训练。此外,FLAVA采用了单模态和多模态预训练目标进行训练,可用于单模态视觉或语言任务和多模态任务。
例如,OWL-ViT实现了零样本/文本引导和单样本/图像引导的目标检测,CLIPSeg和GroupViT实现了文本和图像引导的图像分割,VisualBERT、GIT和ViLT实现了视觉问答以及其他各种任务。X-CLIP是一个多模态模型,使用视频和文本模态进行训练,可以实现类似CLIP的零样本图像分类功能。
与其他模型不同的是,VisionEncoderDecoderModel
是一个模板模型,可以使用任何预训练的基于Transformer的视觉模型作为编码器(例如ViT、BEiT、DeiT、Swin),以及任何预训练的语言模型作为解码器(例如RoBERTa、GPT2、BERT、DistilBERT)来初始化图像到文本模型。事实上,TrOCR就是这个模板类的一个实例。
让我们开始尝试一些这些模型。我们将使用ViLT进行视觉问答,使用CLIPSeg进行零样本图像分割。首先,让我们安装🤗Transformers:pip install transformers
。
ViLT用于VQA
我们先从ViLT开始,下载一个在VQA数据集上预训练的模型。我们可以通过简单地初始化相应的模型类并调用from_pretrained()
方法来下载我们想要的检查点。
from transformers import ViltProcessor, ViltForQuestionAnswering
model = ViltForQuestionAnswering.from_pretrained("dandelin/vilt-b32-finetuned-vqa")
接下来,我们将下载一张两只猫的随机图像,并对图像和查询问题进行预处理,以将它们转换为模型期望的输入格式。为此,我们可以方便地使用相应的预处理器类(ViltProcessor
)并使用相应检查点的预处理配置进行初始化。
import requests
from PIL import Image
processor = ViltProcessor.from_pretrained("dandelin/vilt-b32-finetuned-vqa")
# 下载输入图像
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)
text = "有多少只猫?"
# 准备输入
inputs = processor(image, text, return_tensors="pt")
最后,我们可以使用预处理后的图像和问题作为输入进行推理,并打印预测的答案。然而,重要的一点是要确保您的文本输入与训练设置中使用的问题模板相似。您可以参考论文和数据集了解问题是如何形成的。
import torch
# 前向传播
with torch.no_grad():
outputs = model(**inputs)
logits = outputs.logits
idx = logits.argmax(-1).item()
print("预测的答案:", model.config.id2label[idx])
简单明了,对吧?接下来,我们将使用CLIPSeg进行另一个演示,看看如何使用几行代码进行零样本图像分割。
CLIPSeg用于零样本图像分割
我们将首先初始化CLIPSegForImageSegmentation
及其相应的预处理类,并加载我们预训练的模型。
from transformers import CLIPSegProcessor, CLIPSegForImageSegmentation
processor = CLIPSegProcessor.from_pretrained("CIDAS/clipseg-rd64-refined")
model = CLIPSegForImageSegmentation.from_pretrained("CIDAS/clipseg-rd64-refined")
接下来,我们将使用相同的输入图像,并使用我们想要分割的所有对象的文本描述查询模型。与其他预处理器类似,CLIPSegProcessor
会将输入转换为模型期望的格式。由于我们想要分割多个对象,我们为每个文本描述单独输入相同的图像。
from PIL import Image
import requests
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)
texts = ["一只猫", "一个遥控器", "一条毯子"]
inputs = processor(text=texts, images=[image] * len(texts), padding=True, return_tensors="pt")
与ViLT类似,为了在推理过程中获得最佳性能,重要的是参考原始工作,了解训练模型所使用的文本提示的类型。虽然CLIPSeg是在简单的物体描述(例如“一辆汽车”)上进行训练的,但它的CLIP主干是在设计的文本模板(例如“一辆汽车的图像”,“一辆汽车的照片”)上进行预训练并在训练期间保持冻结。一旦对输入进行预处理,我们就可以执行推理,为每个文本查询获得一个二进制分割图的形状(高度,宽度)。
import torch
with torch.no_grad():
outputs = model(**inputs)
logits = outputs.logits
print(logits.shape)
>>> torch.Size([3, 352, 352])
让我们可视化结果,看看CLIPSeg的表现如何(代码改编自此文章)。
import matplotlib.pyplot as plt
logits = logits.unsqueeze(1)
_, ax = plt.subplots(1, len(texts) + 1, figsize=(3*(len(texts) + 1), 12))
[a.axis('off') for a in ax.flatten()]
ax[0].imshow(image)
[ax[i+1].imshow(torch.sigmoid(logits[i][0])) for i in range(len(texts))];
[ax[i+1].text(0, -15, prompt) for i, prompt in enumerate(texts)]
太棒了,不是吗?
视觉语言模型可以实现许多有用而有趣的用例,不仅限于VQA和零样本分割。我们鼓励您尝试使用本节中提到的模型支持的不同用例。有关示例代码,请参阅各个模型的相应文档。
新兴研究领域
随着视觉语言模型的巨大进展,我们看到新的下游任务和应用领域的出现,例如医学和机器人技术。例如,视觉语言模型越来越多地被用于医疗用例,产生了一些作品,如用于医学诊断和放射学报告生成的Clinical-BERT以及用于医学领域视觉问答的MedFuseNet。
我们还看到大量作品利用联合视觉语言表示进行图像操作(例如StyleCLIP,StyleMC,DiffusionCLIP)、基于文本的视频检索(例如X-CLIP)和操作(例如Text2Live)以及3D形状和纹理操作(例如AvatarCLIP,CLIP-NeRF,Latent3D,CLIPFace,Text2Mesh)。在类似的工作中,MVT提出了一个联合3D场景-文本表示模型,可用于各种下游任务,如3D场景完成。
虽然机器人研究在广泛范围内尚未利用视觉语言模型,但我们看到作品如CLIPort利用联合视觉语言表示进行端到端的模仿学习,并在先前的SOTA上取得了巨大改进。我们还看到大型语言模型越来越多地被用于机器人任务,如常识推理、导航和任务规划。例如,ProgPrompt提出了一种使用大型语言模型(LLMs)生成定位机器人任务计划的框架。类似地,SayCan使用LLMs根据环境的视觉描述和可用对象选择最合理的动作。虽然这些进展令人印象深刻,但由于物体检测数据集的限制,机器人研究仍然局限于有限的环境和对象集合。随着OWL-ViT和GLIP等开放词汇对象检测模型的出现,我们可以预计多模态模型与机器人导航、推理、操作和任务规划框架的更紧密集成。
结论
近年来,多模态模型取得了令人难以置信的进展,其中视觉语言模型在性能和各种用例和应用领域上取得了最大的飞跃。在本博客中,我们讨论了视觉语言模型的最新进展,以及可用的多模态数据集和我们可以使用的预训练策略来训练和微调这样的模型。我们还展示了这些模型如何集成到🤗 Transformers中,以及如何使用它们来执行各种任务只需几行代码。
我们正在不断整合最具影响力的计算机视觉和多模态模型,并期待能够收到您的回信。要及时了解多模态研究的最新消息,您可以关注我们的Twitter账号:@adirik,@NielsRogge,@apsdehal,@a_e_roberts,@RisingSayak和@huggingface。
致谢:我们感谢Amanpreet Singh和Amy Roberts进行的认真审查。同时,也要感谢Hugging Face的Niels Rogge、Younes Belkada和Suraj Patil等众多人员,他们为提高Transformers多模态模型的使用奠定了基础。