打破视觉-语言模型的分辨率诅咒
tl;dr
在这篇文章中,我描述了现代视觉-语言模型(VLM)面临的分辨率问题,并探索了一种使用高分辨率图像的多个裁剪来解决这个问题的新方法。如果您想尝试它如何工作,演示链接在这里:https://huggingface.co/spaces/visheratin/mc-llava-3b。模型可在hub中找到。
概述
VLM 棒极了。它们让我们能够从图像中提取大量不同的信息——一般描述、问题答案,甚至图像中物体的边界框。如今,构建 VLM 的主要方法是将预训练视觉模型中的图像特征引入语言模型,通常是一个大型语言模型 (LLM)。您可以在 BLIP、LLaVA、PaLI-3、MiniGPT-4 和许多其他模型中找到这种方法。通过这种方式,您训练一些适配器来将图像特征与文本嵌入空间对齐,这使您能够有效地将修改后的图像特征视为文本嵌入。例如,下面是 PaLI-3 模型的主要结构。
这也有替代方案。例如,CogVLM 拥有视觉专家模块,这些模块与 LLM 模块相呼应,并且只在图像存在时激活。这在多模态任务中保持了纯文本推理的同时,也带来了出色的性能。
Adept 走了另一条路,开发了一个单一的仅解码器 Transformer——Fuyu——它同时处理图像和文本。这极大地简化了架构,并将图像和文本带入一个真正统一的空间。
问题
基于预训练视觉编码器的 VLM 存在一个关键问题——分辨率。考虑一下最近发布的 V* 基准测试中的以下示例。尝试回答以下问题:“根据这个广告牌,你能说出图片中是什么类型的商店吗?”
当然,你不能。图像太小了。但实际上,图像的分辨率为 4240x2832 像素,你可以轻松放大以读取文本。但 VLM 无法放大!它们受限于视觉编码器的分辨率,通常分辨率不会非常大。例如,这里是同一张图像,大小调整为 384x384 像素,这是标准分辨率之一。
但这真的是个问题吗?让我们看看最先进的 VLM 能否回答这个问题。下面是 CogVLM 的输出:
这是 Fuyu-8B 的答案:
LLaVA-1.6 34B 的输出
最后,通过 ChatGPT 使用 GPT-4V
现在我们明白了这确实是一个问题,我们能做些什么呢?
解决方案
视觉搜索
Penghao Wu 和 Saining Xie 提出了 SEAL(Show, SEArch, and TelL)元框架,它带来了类似于人们在大场景中搜索细节的视觉搜索。模型配备视觉工作记忆,可以通过处理图像的较小部分来推理图像,直到找到回答问题所需的所有信息。因此,SEAL 在回答关于超大图像中微小细节的问题方面优于所有现有模型,包括 GPT-4V。例如,它可以告诉您图像中是什么类型的商店。
视觉裁剪
解决分辨率问题的另一种方法,其中包括减少分析区域。最近,Jiarui Zhang 等人展示通过跟踪模型的注意力,可以找到最相关的部分。如果将图像裁剪到这些部分,在某些情况下,可以将模型的性能提高高达 10%。
我们能否结合这两种方法的思想,让模型一次性仅使用注意力执行某种视觉搜索?
MC-LLaVA
通常,在 LLaVA 模型中,我们为图像生成 N 个嵌入,然后将其与文本嵌入结合并发送到 LLM。但是,如果我们不是为一张图像创建 N 个 token,而是为图像的 M 个部分(裁剪)创建 K<<N 个 token 呢?这将使我们能够从图像的小部分获取视觉信息,并且不会过度增加图像“token”的数量。我将这种方法称为多裁剪 LLaVA (MC-LLaVA)。
与视觉 Transformer (ViT) 类似,我们将图像分割成多个网格对齐的裁剪。但与 ViT 不同的是,MC-LLaVA 中的裁剪是重叠的。简单的解释是,它只是效果更好。目前的假设是,重叠裁剪可以将来自同一区域的视觉信息分散到多个嵌入中,并弥补仅选择 M 个嵌入而不是 N 个嵌入的不足。
由于输入图像可能具有不同的纵横比,如果模型中仅使用裁剪,我们将丢失有关裁剪的位置信息。因此,除了裁剪本身,我们还提取其相对坐标。结果,我们得到一个包含其坐标的裁剪列表。
然后,我们通过视觉编码器传递裁剪本身,并从池化前的最后一层提取隐藏状态。最初,它的形状是 [729, 1152],但正如原始 LLaVA 论文中那样,我们丢弃第一个特征,最终得到形状为 [728, 1152] 的张量。然后,我们从隐藏状态中选择 K
个最后特征。K
取决于图像裁剪的数量,大致计算为 int(N/M)
,其中 N
是图像嵌入的目标数量,M
是裁剪数量。至于坐标,我们将其通过标准的多层感知器(包含两层)。然后,我们将生成的坐标嵌入添加到选定的图像嵌入中。
在处理完所有裁剪及其坐标后,我们只需将它们的嵌入拼接起来,就能得到我们目标中的 N 个嵌入。但这一次,它们包含了来自图像所有小部分的详细视觉信息!很酷,对吧?
其余部分是标准的 LLaVA 架构——我们将多裁剪表示通过适配器,使其与语言模型的嵌入对齐。
实验
但这有用吗?为了回答这个问题,我训练了一个基于 Phi-2 语言模型和 SigLIP 视觉编码器的 32 亿参数 MC-LLaVA 模型。该模型在各种分辨率的图像上进行了训练,这意味着提取特征的数量(K
)是动态的。这意味着从技术上讲,该模型不仅支持任意数量的裁剪(M
),还支持任意数量的提取 token(N
)!所以现在我们有两个完整的旋钮可以调整,以充分发挥模型的最佳性能。让我们看看它在性能方面能给我们带来什么。您可以在这个 Colab 笔记本中进行操作。
模型本身与 Transformers 自动类兼容,因此您只需两行代码即可为其创建模型和处理器。
from transformers import AutoModel, AutoProcessor
import torch
model = AutoModel.from_pretrained("visheratin/MC-LLaVA-3b", torch_dtype=torch.float16, trust_remote_code=True).to("cuda")
processor = AutoProcessor.from_pretrained("visheratin/MC-LLaVA-3b", trust_remote_code=True)
在调用处理器时,您可以调整每张图像的裁剪数量和图像“token”的数量。
with torch.inference_mode():
inputs = processor(prompt, [raw_image], model, max_crops=100, num_tokens=728)
首先,我们能最终读懂板子上写了什么,这家店是做什么的吗?是的,我们可以!在最大 100 个裁剪和 728 个图像 token 的情况下,模型自信地读出了“Core Power Yoga”,这正是板子上写的内容!
让我们看另一个例子,在这个例子中,我们将能够利用我们的旋钮。模型能根据这个杯子的标志回答在哪里可以买到类似的杯子吗?
如果我们使用上一个例子中的设置(最大 100 个裁剪和 728 个图像 token),模型会失败。
The mug is from the company "Nike". You can buy it from Nike's website or from any Nike store.
这是因为图片的分辨率为3213x3024像素,而实际的标志非常小(30x90像素)。让我们将裁剪数量增加到200,同时保持token数量不变。
Based on the logo, you can buy a mug like this at Starbucks. The logo is a combination of the Starbucks logo and the logo of the TV show "Star Trek".
现在我们来谈谈!但模型生成了一些关于《星际迷航》的随机内容。让我们尝试通过将图像 token 数量翻倍到 1456 来消除它。
The mug is from the Starbucks brand. You can buy it at any Starbucks location.
这是个正确的答案。但如果这是个侥幸,模型把房间里其他东西当成星巴克杯子了呢?我使用了最先进的图像编辑技术,也就是复制粘贴,来隐藏图片中的杯子。
现在模型能告诉我们什么?我们使用与之前相同的参数——最大 100 个裁剪和 1456 个图像 token。
The mug is from the Coca-Cola company. You can buy it at any Coca-Cola store or online at the Coca-Cola website.
太棒了!这意味着模型确实注意到了杯子并识别出上面的星巴克标志。
基准测试
现在,进行更系统的检查。以下是四项流行基准测试的数据。结果相当不错,或多或少符合 3B 模型应有的预期。
基准测试 | 准确率 |
---|---|
文本视觉问答 | 50.9% |
GQA | 59.5% |
VQAv2 | 76.72% |
VizWiz | 32.68% |
对我们来说最有趣的基准是 V* 数据集,模型需要回答关于高分辨率图像中微小细节的问题。在这里,我对 MC-LLaVA 在推理过程中可用的两个参数——最大裁剪数量和图像“token”数量——进行了适当的网格搜索。在基准测试的“直接属性”和“相对位置”部分,模型的表现与其他大型模型或多或少相似。但对于其他两个部分,情况变得有趣起来。“GPT4V-hard”是一组包含 17 张图像的集合,GPT-4V 无法回答其中问题。而 SEAL 框架则全部答对了。我们可以看到,增加裁剪数量可以带来更好的性能,在最佳状态下,MC-LLaVA 达到了 52.94% 的分数,高于任何其他更大规模的 VLM!
结论
- 即使是最好的 VLM(是的,甚至包括 GPT-4V)也受到分辨率诅咒的影响。
- 添加视觉搜索和裁剪有助于它们找到更小的细节。
- 我们也可以通过从图像的较小部分提取特征并在 LLaVA 模型中使用它们来解决这个问题。
- MC-LLaVA 对于一个 3B 参数的模型来说,表现非常出色。它仍在开发中,如果您对如何改进模型有任何想法,请告诉我!
致谢
感谢 Lambda 提供机器训练模型。
感谢 ML Collective 的持续支持,以及为模型测试提供计算资源。