跳到正文
原文
Hugging Face:Blog(RSS)·· 2023-02-03精选AI 评分62

Hugging Face 深入解读视觉语言模型的预训练策略与 Transformers 实践

A Dive into Vision-Language Models

AI 导读

Hugging Face 发布博客,系统介绍视觉语言模型的主流预训练策略,包括对比学习、PrefixLM、交叉注意力多模态融合、MLM/ITM 以及无训练优化方法,并梳理 PMD、LAION-5B 等常用数据集。文章还演示如何用 🤗 Transformers 中的 ViLT 做视觉问答、用 CLIPSeg 做零样本图像分割,并展望该类模型在医学、机器人和 3D 等领域的新兴应用。

推荐理由

原文系统梳理了视觉语言模型的五类预训练策略与常用数据集,并给出 ViLT 和 CLIPSeg 的可复现代码示例。

正文 · AI 翻译

人类学习本质上是多模态的,因为联合利用多种感官有助于我们更好地理解和分析新信息。毫不意外,近期多模态学习的进展正是受到这一过程有效性的启发,旨在创建能够处理和关联图像、视频、文本、音频、身体姿势、面部表情和生理信号等多种模态信息的模型。

自2021年以来,我们对结合视觉和语言模态的模型(也称为联合视觉语言模型)的兴趣日益增长,例如OpenAI的CLIP。联合视觉语言模型在图像描述、文本引导的图像生成与操作以及视觉问答等极具挑战性的任务中展现出了尤为令人印象深刻的能力。这一领域持续发展,其在提升零样本泛化能力方面的有效性也在不断提高,从而催生了各种实际应用案例。

在这篇博客文章中,我们将介绍联合视觉语言模型,重点聚焦于它们的训练方式。我们还将展示如何利用🤗 Transformers来试验该领域的最新进展。

目录

  1. 引言
  2. Learning Strategies
    1. 对比学习
    2. 前缀语言模型
    3. 基于交叉注意力的多模态融合
    4. MLM / ITM
    5. 无需训练
  3. 数据集
  4. 在🤗 Transformers中支持视觉语言模型
  5. 新兴研究领域
  6. 结论

引言

称一个模型为“视觉语言”模型意味着什么?一个结合了视觉和语言两种模态的模型?但这究竟意味着什么呢?

有助于定义这些模型的一个特点是它们能够处理图像(视觉)和自然语言文本(语言)。这一过程取决于输入、输出以及要求这些模型执行的任务。

以零样本图像分类任务为例。我们将传入一张图像和几个提示,如下所示,以获得输入图像最可能的提示。

drawing
猫和狗的图片取自此处。

要做出这样的预测,模型需要理解输入的图像和文本提示。为了实现这种理解,模型会为视觉和语言分别设置独立的编码器或融合编码器。

但这些输入和输出可以有多种形式。下面我们给出一些例子:

  • 从自然语言文本中检索图像。
  • 短语定位,即根据输入图像和自然语言短语(例如:一个年轻人挥动球棒)执行目标检测。
  • 视觉问答,即根据输入图像和自然语言问题寻找答案。
  • 为给定图像生成描述。这也可以采取条件文本生成的形式,即从自然语言提示和图像开始。
  • 从涉及图像和文本两种模态的社交媒体内容中检测仇恨言论。

学习策略

视觉语言模型通常由3个关键要素组成:一个图像编码器、一个文本编码器,以及一种融合两个编码器信息的策略。这些关键要素紧密耦合在一起,因为损失函数是围绕模型架构和学习策略来设计的。虽然视觉语言模型研究并非新领域,但这类模型的设计多年来发生了巨大变化。早期研究采用手工设计的图像描述子和预训练词向量或基于频率的TF-IDF特征,而最新研究主要采用具有transformer架构的图像和文本编码器,以分别或联合学习图像和文本特征。这些模型通过具有策略性的预训练目标进行预训练,从而支持各种下游任务。

在本节中,我们将讨论视觉语言模型的一些典型预训练目标和策略,这些目标和策略已被证明在迁移性能方面表现良好。我们还将涉及一些其他有趣的内容,这些内容要么特定于这些目标,要么可作为预训练的通用组件。

我们将在预训练目标中涵盖以下主题:

  • 对比学习:以对比方式将图像和文本对齐到联合特征空间
  • PrefixLM:通过将图像作为语言模型的前缀来联合学习图像和文本嵌入
  • 使用交叉注意力的多模态融合:通过交叉注意力机制将视觉信息融合到语言模型的各层中
  • MLM / ITM:通过掩码语言建模和图像-文本匹配目标将图像部分与文本对齐
  • 无训练:通过迭代优化使用独立的视觉和语言模型

请注意,本节并非详尽列表,还有各种其他方法以及混合策略,例如Unified-IO。有关多模态模型的更全面综述,请参阅这项工作。

1) 对比学习

Contrastive Learning
对比预训练和零样本图像分类,如此处所示。

对比学习是视觉模型常用的预训练目标,并且已被证明对视觉语言模型也是非常有效的预训练目标。近期工作如CLIP、CLOOB、ALIGN和DeCLIP通过使用由{图像, 标题}对组成的大型数据集,以对比损失联合学习文本编码器和图像编码器,从而连接视觉和语言模态。对比学习旨在将输入图像和文本映射到同一特征空间,使得如果图像-文本对匹配,则其嵌入之间的距离最小化;如果不匹配,则最大化。

对于CLIP,距离就是文本和图像嵌入之间的余弦距离,而ALIGN和DeCLIP等模型则设计了自己的距离度量以应对噪声数据集。

另一项工作,LiT,提出了一种简单的方法,使用 CLIP 预训练目标对文本编码器进行微调,同时保持图像编码器冻结。作者将这一想法解释为一种教文本编码器更好地读取来自图像编码器的图像嵌入的方法。这种方法已被证明是有效的,并且比 CLIP 更节省样本。其他工作,如 FLAVA,使用对比学习和其他预训练策略的组合来对齐视觉和语言嵌入。

2) PrefixLM

PrefixLM
PrefixLM 预训练策略示意图(图片来源)

训练视觉-语言模型的另一种方法是使用 PrefixLM 目标。诸如 SimVLM 和 VirTex 等模型使用这种预训练目标,并具有由 transformer 编码器和 transformer 解码器组成的统一多模态架构,类似于自回归语言模型的架构。

让我们分解一下,看看它是如何工作的。具有前缀目标的语言模型在给定输入文本作为前缀的情况下预测下一个 token。例如,给定序列“A man is standing at the corner”,我们可以使用“A man is standing at the”作为前缀,并以预测下一个 token——“corner”或该前缀的另一个合理延续——为目标来训练模型。

视觉 transformer(ViT)通过将每张图像划分为若干 patch 并将这些 patch 依次作为输入馈送到模型,将相同的前缀概念应用于图像。利用这一想法,SimVLM 采用了一种架构,其中编码器接收拼接后的图像 patch 序列和前缀文本序列作为前缀输入,然后解码器预测文本序列的延续。上图描绘了这一想法。SimVLM 模型首先在前缀中不存在图像 patch 的文本数据集上进行预训练,然后在对齐的图像-文本数据集上进行预训练。这些模型用于以图像为条件的文本生成/图像描述和 VQA 任务。

利用统一多模态架构将视觉信息融合到语言模型(LM)中以完成图像引导任务的模型展现出令人印象深刻的能力。然而,仅使用 PrefixLM 策略的模型在应用领域方面可能受到限制,因为它们主要设计用于图像描述或视觉问答下游任务。例如,给定一张一群人的图像,我们可以查询该图像以撰写图像描述(例如,“A group of people is standing together in front of a building and smiling”),或者用需要视觉推理的问题查询它:“How many people are wearing red t-shirts?”。另一方面,学习多模态表示或采用混合方法的模型可以适应各种其他下游任务,例如目标检测和图像分割。

Frozen PrefixLM

Frozen PrefixLM
Frozen PrefixLM 预训练策略(图片来源)

虽然将视觉信息融合到语言模型中非常有效,但能够使用预训练语言模型(LM)而无需微调会高效得多。因此,视觉-语言模型中的另一个预训练目标是学习与冻结语言模型对齐的图像嵌入。

Frozen 和 ClipCap 等模型使用这种 Frozen PrefixLM 预训练目标。它们在训练期间只更新图像编码器的参数,以生成图像嵌入,这些嵌入可以像上文讨论的 PrefixLM 目标那样,用作预训练且冻结的语言模型的前缀。Frozen 和 ClipCap 都在对齐的图像-文本(标题)数据集上训练,目标是在给定图像嵌入和前缀文本的情况下,生成标题中的下一个 token。

最后,MAPL 和 Flamingo 等模型将预训练的视觉编码器和语言模型都保持冻结。Flamingo 在预训练的冻结视觉模型之上添加 Perceiver Resampler 模块,并在现有的预训练且冻结的 LM 层之间插入新的交叉注意力层,以将视觉数据作为条件输入 LM,从而在广泛的开放式视觉和语言任务上创造了少样本学习的新技术水平。

Frozen PrefixLM 预训练目标的一个巧妙优势是它能够利用有限的对齐图像-文本数据进行训练,这对于无法获得对齐多模态数据集的领域特别有用。

3) 使用交叉注意力进行多模态融合

Cross Attention Fusing
如图所示,使用交叉注意力机制融合视觉信息(图片来源)

另一种利用预训练语言模型进行多模态任务的方法是,使用交叉注意力机制将视觉信息直接融合到语言模型解码器的层中,而不是将图像用作语言模型的额外前缀。VisualGPT、VC-GPT 和 Flamingo 等模型使用这种预训练策略,并在图像描述和视觉问答任务上进行训练。此类模型的主要目标是有效平衡文本生成能力和视觉信息的混合,这在缺乏大型多模态数据集时非常重要。

VisualGPT 等模型使用视觉编码器来嵌入图像,并将视觉嵌入馈送到预训练语言解码器模块的交叉注意力层,以生成合理的描述。最近的一项工作 FIBER 在视觉和语言主干中都插入了带有门控机制的交叉注意力层,以实现更高效的多模态融合,并支持各种其他下游任务,例如图像-文本检索和开放词汇目标检测。

4) 掩码语言建模 / 图像-文本匹配

另一类视觉-语言模型使用掩码语言建模(MLM)和图像-文本匹配(ITM)目标的组合,将图像的特定部分与文本对齐,并支持各种下游任务,例如视觉问答、视觉常识推理、基于文本的图像检索和文本引导的目标检测。遵循这种预训练设置的模型包括 VisualBERT、FLAVA、ViLBERT、LXMERT 和 BridgeTower。

MLM / ITM
将图像的部分与文本对齐(图片来源)

我们来拆解一下 MLM 和 ITM 目标的含义。给定一个部分被掩码的标题,MLM 目标是根据对应的图像预测被掩码的词。请注意,MLM 目标需要使用带有边界框的丰富标注多模态数据集,或者使用目标检测模型为输入文本的各个部分生成目标区域提议。

对于 ITM 目标,给定一个图像和标题对,任务是预测该标题是否与图像匹配。负样本通常从数据集本身中随机采样。MLM 和 ITM 目标在多模态模型的预训练过程中经常被结合使用。例如,VisualBERT 提出了一种类似 BERT 的架构,它使用预训练的目标检测模型 Faster-RCNN 来检测目标。该模型在预训练期间结合使用 MLM 和 ITM 目标,通过自注意力隐式地对齐输入文本的元素与相关输入图像中的区域。

另一项工作 FLAVA 由一个图像编码器、一个文本编码器和一个多模态编码器组成,用于融合和对齐图像与文本表示以进行多模态推理,所有这些都基于 transformer。为了实现这一点,FLAVA 使用了多种预训练目标:MLM、ITM,以及掩码图像建模(MIM)和对比学习。

5) 无训练

最后,各种优化策略旨在使用预训练的图像和文本模型来桥接图像和文本表示,或者将预训练的多模态模型适配到新的下游任务而无需额外训练。

例如,MaGiC 提出通过预训练的自回归语言模型进行迭代优化,为输入图像生成标题。为此,MaGiC 使用生成 token 和输入图像的 CLIP 嵌入来计算基于 CLIP 的“Magic 分数”。

ASIF
使用预训练的、冻结的单模态图像和文本编码器构建相似性搜索空间(图片来源)

ASIF 提出了一种简单的方法,使用相对较小的多模态数据集将预训练的单模态图像和文本模型转化为用于图像描述的多模态模型,而无需额外训练。ASIF 背后的关键直觉是,相似图像的标题彼此也相似。因此,我们可以通过使用小型真实多模态对数据集构建相对表示空间来执行基于相似性的搜索。

数据集

视觉语言模型通常基于预训练目标,在具有不同结构的大型图像和文本数据集上进行训练。预训练之后,它们会使用特定任务的数据集在各种下游任务上进一步微调。本节概述了一些用于训练和评估视觉语言模型的常用预训练数据集和下游数据集。

预训练数据集

视觉语言模型通常是在从网络收集的大规模多模态数据集上进行预训练的,这些数据集以匹配的图像/视频与文本对的形式存在。这些数据集中的文本数据可以是人工生成的描述、自动生成的描述、图像元数据或简单的物体标签。此类大规模数据集的一些例子包括 PMD 和 LAION-5B。PMD 数据集结合了多个较小的数据集,如 Flickr30K、COCO 和 Conceptual Captions 数据集。COCO 检测和图像描述(>330K 图像)数据集分别由图像实例与每张图像所包含物体的文本标签配对,以及自然语句描述组成。Conceptual Captions(> 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 和 Conceptual Captions 之类的数据集通常既用于模型的预训练,也用于描述生成下游任务。

在 🤗 Transformers 中支持视觉语言模型

使用 Hugging Face Transformers,你可以轻松下载、运行和微调各种预训练的视觉-语言模型,或者混合搭配预训练的视觉和语言模型来创建自己的方案。🤗 Transformers 支持的一些视觉-语言模型包括:

虽然 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。

用于 VQA 的 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”)上预训练的,并在训练期间保持冻结。一旦输入经过预处理,我们就可以执行推理,为每个文本查询获得形状为(高度,宽度)的二值分割图。

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)]

CLIPSeg results

很神奇,不是吗?

视觉语言模型带来了大量有用且有趣的用例,远不止 VQA 和零样本分割。我们鼓励你尝试本节中提到的模型所支持的不同用例。有关示例代码,请参阅各模型的相应文档。

新兴研究领域

随着视觉语言模型的巨大进步,我们看到了新的下游任务和应用领域的出现,例如医学和机器人技术。例如,视觉语言模型正越来越多地被应用于医疗用例,从而产生了诸如用于医学诊断和从放射图像生成报告的 Clinical-BERT,以及用于医学领域视觉问答的 MedFuseNet 等成果。

我们还看到大量利用联合视觉语言表示的工作涌现,用于图像操控(例如 StyleCLIP、StyleMC、DiffusionCLIP)、基于文本的视频检索(例如 X-CLIP)和操控(例如 Text2Live)以及 3D 形状和纹理操控(例如 AvatarCLIP、CLIP-NeRF、Latent3D、CLIPFace、Text2Mesh)。在类似的工作中,MVT 提出了一种联合 3D 场景-文本表示模型,可用于各种下游任务,例如 3D 场景补全。

虽然机器人研究尚未大规模利用视觉语言模型,但我们看到诸如 CLIPort 这样的工作利用联合视觉语言表示进行端到端模仿学习,并报告了相比之前 SOTA 的巨大改进。我们还看到,大型语言模型正越来越多地被应用于机器人任务中,如常识推理、导航和任务规划。例如,ProgPrompt 提出了一个使用大型语言模型(LLM)生成情境化机器人任务规划的框架。类似地,SayCan 使用 LLM 根据环境的视觉描述和可用物体选择最合理的动作。尽管这些进展令人印象深刻,但由于物体检测数据集的限制,机器人研究仍局限于有限的环境和物体集合。随着 OWL-ViT 和 GLIP 等开放词汇物体检测模型的出现,我们可以期待多模态模型与机器人导航、推理、操作和任务规划框架更紧密地集成。

结论

近年来,多模态模型取得了令人难以置信的进展,其中视觉语言模型在性能以及用例和应用的多样性方面取得了最显著的飞跃。在这篇博客中,我们讨论了视觉语言模型的最新进展,以及有哪些多模态数据集可用,以及我们可以使用哪些预训练策略来训练和微调此类模型。我们还展示了这些模型如何集成到 🤗 Transformers 中,以及如何使用它们通过几行代码执行各种任务。

我们正在继续集成最具影响力的计算机视觉和多模态模型,并期待您的反馈。要了解多模态研究的最新消息,您可以在 Twitter 上关注我们:@adirik、@NielsRogge、@apsdehal、@a_e_roberts、@RisingSayak 和 @huggingface。

致谢:我们感谢 Amanpreet Singh 和 Amy Roberts 的严格审阅。同时,感谢 Niels Rogge、Younes Belkada 和 Suraj Patil,以及 Hugging Face 的许多其他人,他们为增加 Transformers 中多模态模型的使用奠定了基础。

来源:Hugging Face:Blog(RSS) · huggingface.co