深入了解视觉语言模型
人类的学习本质上是多模态的,因为联合利用多种感官有助于我们更好地理解和分析新信息。不出所料,多模态学习的最新进展从这一过程的有效性中汲取灵感,创造出能够处理和关联图像、视频、文本、音频、身体姿势、面部表情和生理信号等多种模态信息的模型。
自 2021 年以来,我们看到人们对结合视觉和语言模态的模型(也称为联合视觉语言模型)的兴趣日益浓厚,例如 OpenAI 的 CLIP。联合视觉语言模型在图像描述、文本引导的图像生成和操作,以及视觉问答等极具挑战性的任务中展现了尤为出色的能力。该领域在不断发展,其提高零样本泛化能力的有效性也在不断提升,从而带来了各种实际应用场景。
在这篇博文中,我们将介绍联合视觉语言模型,重点关注它们的训练方式。我们还将展示如何利用 🤗 Transformers 来试验该领域的最新进展。
目录
简介
称一个模型为“视觉语言”模型意味着什么?一个结合了视觉和语言两种模态的模型?但这究竟是什么意思?
定义这些模型的一个特点是它们能够同时处理图像(视觉)和自然语言文本(语言)。这个过程取决于输入、输出以及要求这些模型执行的任务。
以零样本图像分类任务为例。我们将传入一张图像和几个提示,从而为输入图像获得最可能的提示。
猫和狗的图片取自 此处。
要做出这样的预测,模型需要理解输入的图像和文本提示。模型会有独立或融合的视觉和语言编码器来实现这种理解。
但这些输入和输出可以有多种形式。下面我们举一些例子:
- 根据自然语言文本进行图像检索。
- 短语定位,即根据输入的图像和自然语言短语进行目标检测(例如:一个 年轻人 挥舞着一根 球棒)。
- 视觉问答,即从输入的图像和自然语言问题中寻找答案。
- 为给定图像生成描述。这也可以采用条件文本生成的形式,即从一个自然语言提示和一张图像开始。
- 从涉及图像和文本模态的社交媒体内容中检测仇恨言论。
学习策略
一个视觉语言模型通常包含 3 个关键元素:一个图像编码器、一个文本编码器,以及一个融合两种编码器信息的策略。这些关键元素紧密耦合,因为损失函数是围绕模型架构和学习策略设计的。虽然视觉语言模型研究早已不是一个新的研究领域,但这类模型的设计多年来发生了巨大变化。早期的研究采用手工制作的图像描述符和预训练的词向量或基于频率的 TF-IDF 特征,而最新的研究主要采用带有 Transformer 架构的图像和文本编码器,来分别或共同学习图像和文本特征。这些模型通过战略性的预训练目标进行预训练,从而能够支持各种下游任务。
在本节中,我们将讨论一些典型的视觉语言模型预训练目标和策略,这些方法在迁移性能方面表现良好。我们还将介绍一些额外的有趣内容,它们要么是这些目标特有的,要么可以作为预训练的通用组件。
我们将涵盖预训练目标中的以下主题:
- 对比学习:以对比的方式将图像和文本对齐到联合特征空间。
- 前缀语言模型 (PrefixLM):通过将图像作为语言模型的前缀来共同学习图像和文本嵌入。
- 使用交叉注意力的多模态融合:通过交叉注意力机制将视觉信息融合到语言模型的各层中。
- 掩码语言建模 (MLM) / 图文匹配 (ITM):通过掩码语言建模和图文匹配目标将图像的部分与文本对齐。
- 无需训练:通过迭代优化使用独立的视觉和语言模型。
请注意,本节并非详尽无遗的列表,还有其他各种方法以及混合策略,例如 Unified-IO。有关多模态模型的更全面综述,请参阅这项工作。
1) 对比学习
如此处所示的对比预训练和零样本图像分类。
对比学习是视觉模型常用的预训练目标,并且也已证明是视觉语言模型非常有效的预训练目标。最近的工作,如 CLIP、CLOOB、ALIGN 和 DeCLIP,通过使用包含 {图像, 描述} 对的大型数据集,以对比损失联合学习文本编码器和图像编码器,从而连接视觉和语言模态。对比学习旨在将输入的图像和文本映射到相同的特征空间,使得匹配的图文对嵌入之间的距离最小化,而不匹配的则最大化。
对于 CLIP,距离就是文本和图像嵌入之间的余弦距离,而像 ALIGN 和 DeCLIP 这样的模型则设计了自己的距离度量来处理带噪声的数据集。
另一项工作 LiT 介绍了一种简单的方法,即在保持图像编码器冻结的情况下,使用 CLIP 预训练目标来微调文本编码器。作者将这个想法解释为“一种教文本编码器更好地从图像编码器读取图像嵌入的方式”。这种方法已被证明是有效的,并且比 CLIP 更具样本效率。其他工作,如 FLAVA,则结合了对比学习和其他预训练策略来对齐视觉和语言嵌入。
2) 前缀语言模型 (PrefixLM)
另一种训练视觉语言模型的方法是使用 PrefixLM 目标。像 SimVLM 和 VirTex 这样的模型使用这种预训练目标,并采用统一的多模态架构,由一个 Transformer 编码器和一个 Transformer 解码器组成,类似于自回归语言模型。
让我们来分解一下,看看它是如何工作的。带有前缀目标的语言模型会根据一个输入文本作为前缀来预测下一个词元。例如,给定序列“A man is standing at the corner”,我们可以用“A man is standing at the”作为前缀,并训练模型预测下一个词元“corner”或前缀的其他可能延续。
视觉 Transformer (ViT) 将同样的前缀概念应用于图像,通过将每个图像分割成若干个图像块,并将这些图像块按顺序作为输入喂给模型。借鉴这一思想,SimVLM 的架构中,编码器接收一个拼接的图像块序列和前缀文本序列作为前缀输入,然后解码器预测文本序列的后续部分。上图描绘了这一思想。SimVLM 模型首先在没有图像块的前缀文本数据集上进行预训练,然后在一个对齐的图文数据集上进行训练。这些模型用于图像条件的文本生成/描述和视觉问答任务。
利用统一的多模态架构将视觉信息融合到语言模型 (LM) 中以执行图像引导任务的模型显示出令人印象深刻的能力。然而,仅使用 PrefixLM 策略的模型在应用领域上可能受到限制,因为它们主要为图像描述或视觉问答等下游任务设计。例如,给定一张一群人的图像,我们可以查询图像以生成描述(例如,“一群人站在一座建筑物前微笑”)或提出需要视觉推理的问题:“有多少人穿着红色 T 恤?”。另一方面,学习多模态表示或采用混合方法的模型可以适应于各种其他下游任务,如目标检测和图像分割。
冻结前缀语言模型 (Frozen PrefixLM)
冻结前缀语言模型预训练策略 (图片来源)
虽然将视觉信息融合到语言模型中非常有效,但能够使用预训练的语言模型 (LM) 而无需进行微调会更加高效。因此,视觉语言模型中的另一个预训练目标是学习与冻结的语言模型对齐的图像嵌入。
像 Frozen 和 ClipCap 这样的模型使用了这种冻结前缀语言模型 (Frozen PrefixLM) 预训练目标。它们在训练期间只更新图像编码器的参数,以生成可以作为预训练、冻结的语言模型前缀的图像嵌入,其方式与上面讨论的 PrefixLM 目标类似。Frozen 和 ClipCap 都在对齐的图文(描述)数据集上进行训练,目标是给定图像嵌入和前缀文本,生成描述中的下一个词元。
最后,像 MAPL 和 Flamingo 这样的模型则将预训练的视觉编码器和语言模型都保持冻结。Flamingo 通过在预训练的冻结视觉模型之上添加 Perceiver Resampler 模块,并在现有的预训练、冻结的语言模型层之间插入新的交叉注意力层,以使语言模型能够基于视觉数据进行条件生成,从而在一系列开放式视觉和语言任务的小样本学习上取得了新的 SOTA (state-of-the-art) 记录。
冻结前缀语言模型预训练目标的一个巧妙优势是,它能够用有限的对齐图文数据进行训练,这在缺少对齐多模态数据集的领域尤为有用。
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,由一个图像编码器、一个文本编码器和一个用于融合和对齐图像与文本表示以进行多模态推理的多模态编码器组成,所有这些都基于 Transformer。为了实现这一点,FLAVA 使用了多种预训练目标:MLM、ITM,以及掩码图像建模 (MIM) 和对比学习。
5) 无需训练
最后,各种优化策略旨在利用预训练的图像和文本模型来连接图像和文本表示,或在无需额外训练的情况下使预训练的多模态模型适应新的下游任务。
例如,MaGiC 提出通过预训练的自回归语言模型进行迭代优化,为输入图像生成描述。为此,MaGiC 使用生成的词元和输入图像的 CLIP 嵌入计算一个基于 CLIP 的“Magic score”。
使用预训练的、冻结的单模态图像和文本编码器构建一个相似性搜索空间 (图片来源)
ASIF 提出了一种简单的方法,利用相对较小的多模态数据集,无需额外训练,即可将预训练的单模态图像和文本模型转化为一个用于图像描述的多模态模型。ASIF 背后的核心直觉是,相似图像的描述彼此也相似。因此,我们可以通过使用一个小的基准多模态对数据集构建一个相对表示空间来进行基于相似性的搜索。
数据集
视觉语言模型通常在大型图文数据集上进行训练,这些数据集的结构根据预训练目标的不同而有所差异。预训练完成后,它们会使用特定任务的数据集在各种下游任务上进行进一步微调。本节概述了一些用于训练和评估视觉语言模型的常用预训练和下游数据集。
预训练数据集
视觉语言模型通常在从网络上收集的大型多模态数据集上进行预训练,这些数据集以匹配的图像/视频和文本对的形式存在。这些数据集中的文本数据可以是人工生成的描述、自动生成的描述、图像元数据或简单的物体标签。这类大型数据集的一些例子是 PMD 和 LAION-5B。PMD 数据集结合了多个较小的数据集,如 Flickr30K、COCO 和 Conceptual Captions 数据集。COCO 目标检测和图像描述(超过 33 万张图像)数据集分别包含与每张图像中所含物体文本标签配对的图像实例,以及自然语言句子描述。Conceptual Captions(超过 330 万张图像)和 Flickr30K(超过 3.1 万张图像)数据集及其描述——描述图像的自由格式句子——都是从网络上抓取的。
即使是完全由人工生成的描述组成的图文数据集,如 Flickr30K,也天生带有噪声,因为用户并不总是为他们的图像编写描述性或反映性的文字。为了克服这个问题,像 LAION-5B 这样的数据集利用 CLIP 或其他预训练的多模态模型来过滤噪声数据,创建高质量的多模态数据集。此外,一些视觉语言模型,如 ALIGN,提出了进一步的预处理步骤,并创建了自己的高质量数据集。其他视觉语言数据集,如 LSVTD 和 WebVid,则包含视频和文本模态,尽管规模较小。
下游数据集
预训练的视觉语言模型通常会在各种下游任务上进行训练,如视觉问答、文本引导的目标检测、文本引导的图像修复、多模态分类,以及各种独立的自然语言处理和计算机视觉任务。
在问答下游任务上微调的模型,如 ViLT 和 GLIP,最常用的是 VQA (视觉问答)、VQA v2、NLVR2、OKVQA、TextVQA、TextCaps 和 VizWiz 数据集。这些数据集通常包含与多个开放式问题和答案配对的图像。此外,像 VizWiz 和 TextCaps 这样的数据集也可用于图像分割和目标定位等下游任务。其他一些有趣的多模态下游数据集有:用于多模态分类的 Hateful Memes,用于视觉蕴含预测的 SNLI-VE,以及用于视觉语言组合推理的 Winoground。
请注意,视觉语言模型可用于各种经典的 NLP 和计算机视觉任务,如文本或图像分类,并且通常为这类下游任务使用单模态数据集(例如 SST2、ImageNet-1k)。此外,像 COCO 和 Conceptual Captions 这样的数据集在模型预训练和描述生成下游任务中都很常用。
🤗 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 用于视觉问答
让我们从 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")
# download an input image
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)
text = "How many cats are there?"
# prepare inputs
inputs = processor(image, text, return_tensors="pt")
最后,我们可以使用预处理后的图像和问题作为输入进行推理,并打印出预测的答案。然而,需要记住的一个重要点是,要确保你的文本输入与训练设置中使用的问题模板相似。你可以参考论文和数据集来了解问题的构成方式。
import torch
# forward pass
with torch.no_grad():
outputs = model(**inputs)
logits = outputs.logits
idx = logits.argmax(-1).item()
print("Predicted answer:", 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 = ["a cat", "a remote", "a blanket"]
inputs = processor(text=texts, images=[image] * len(texts), padding=True, return_tensors="pt")
与 ViLT 类似,为了在推理时获得最佳性能,参考原始工作,了解模型训练时使用了哪种文本提示非常重要。虽然 CLIPSeg 是在简单的物体描述(例如,“a car”)上训练的,但其 CLIP 主干网络是在精心设计的文本模板(例如,“an image of a car”、“a photo of a car”)上预训练的,并在训练期间保持冻结。一旦输入被预处理,我们就可以进行推理,为每个文本查询获得一个形状为 (height, width) 的二值分割图。
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)]
太棒了,不是吗?
视觉语言模型催生了大量有用且有趣的用例,这些用例远不止视觉问答和零样本分割。我们鼓励你尝试本节提到的模型所支持的不同用例。有关示例代码,请参阅各个模型的相应文档。
新兴研究领域
随着视觉语言模型的巨大进步,我们看到了新的下游任务和应用领域的出现,例如医学和机器人技术。例如,视觉语言模型越来越多地被用于医疗用例,催生了诸如用于医学诊断和放射学报告生成的 Clinical-BERT,以及用于医学领域视觉问答的 MedFuseNet 等工作。
我们还看到大量工作利用联合视觉语言表示进行图像处理(例如,StyleCLIP、StyleMC、DiffusionCLIP)、基于文本的视频检索(例如,X-CLIP)和处理(例如,Text2Live)以及 3D 形状和纹理处理(例如,AvatarCLIP、CLIP-NeRF、Latent3D、CLIPFace、Text2Mesh)。在类似的研究方向上,MVT 提出了一个联合 3D 场景-文本表示模型,可用于各种下游任务,如 3D 场景补全。
尽管机器人研究尚未大规模利用视觉语言模型,但我们看到像 CLIPort 这样的工作,利用联合视觉语言表示进行端到端模仿学习,并报告了相对于先前 SOTA (state-of-the-art) 的巨大改进。我们还看到大型语言模型越来越多地被用于机器人任务,如常识推理、导航和任务规划。例如,ProgPrompt 提出了一个框架,利用大型语言模型 (LLM) 生成情境化的机器人任务计划。同样,SayCan 使用 LLM 根据环境的视觉描述和可用物体来选择最合理的行动。虽然这些进展令人印象深刻,但由于目标检测数据集的局限性,机器人研究仍局限于有限的环境和物体集合。随着像 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 中多模态模型的使用奠定了基础。