Visual Programming: Compositional visual reasoning without training (视觉编程:无需训练的组合视觉推理)

这篇论文被评为最佳论文(best paper)可能有以下几个原因:

  1. 创新性:论文提出了VISPROG,这是一个新颖的神经符号系统,用于解决自然语言指令下的复杂和组合性视觉任务。VISPROG避免了任务特定训练的需求,转而使用大型语言模型的上下文学习能力来生成类似Python的模块化程序,然后执行这些程序以获得解决方案和全面且可解释的推理过程。
  2. 技术贡献:VISPROG展示了在多种任务上的灵活性,包括组合性视觉问题回答、零样本推理、事实知识对象标记和语言引导的图像编辑。这些任务覆盖了空间推理、多图像推理、知识检索和图像生成与操作等能力。
  3. 性能表现:VISPROG在没有针对任何任务进行微调的情况下,就在多个任务上显示出了令人印象深刻的性能提升,例如在组合性视觉问题回答任务上比基础的VQA模型提高了2.7个百分点,在NLVR任务上展现了62.4%的强零样本准确率。
  4. 可解释性:VISPROG生成的程序易于理解,用户可以验证其逻辑正确性。通过将预测分解为简单步骤,VISPROG允许用户检查中间步骤的输出,以诊断错误并在需要时干预推理过程。
  5. 模块化和扩展性:VISPROG的模块化设计使得添加新模块以扩展其能力变得简单直接。这种设计不仅提高了系统的灵活性,也方便了未来的研究和开发。
  6. 实际应用价值:VISPROG能够处理人们可能希望执行的复杂任务的长尾,这对于实际应用来说具有很高的价值,因为它减少了为每个新任务收集和标记数据集的需求。
  7. 研究影响:论文中提出的方法可能会对人工智能领域的研究产生深远影响,特别是在如何将大型语言模型的推理能力应用于视觉任务方面。
  8. 写作和呈现:论文的写作质量和呈现也可能是其被评为最佳论文的原因之一。清晰的结构、充分的实验验证和详细的分析有助于读者理解研究的贡献和重要性。

PRIOR

GitHub - allenai/visprog: Official code for VisProg (CVPR 2023 Best Paper!)

图 1. VISPROG 是一个模块化且可解释的神经符号系统,用于组合视觉推理。给定一些自然语言指令和所需的高级程序示例,VISPROG 使用 GPT-3 中的上下文学习为任何新指令生成一个程序,然后在输入图像上执行该程序以获得预测。VISPROG 还将中间输出总结为可解释的视觉原理(图 4)。我们在需要组合一组多样化模块的任务上展示了 VISPROG,用于图像理解和操作、知识检索以及算术和逻辑运算。标题

摘要

我们提出了 VISPROG,这是一种神经符号方法,用于根据自然语言指令解决复杂且组合的视觉任务。

VISPROG 避免了任何特定于任务的训练(无需训练)

相反,它使用大型语言模型的上下文学习能力来生成类似 Python 的模块化程序,然后执行这些程序以获得解决方案以及全面且可解释的基本原理。

生成的程序的每一行都可以调用几个现成的计算机视觉模型、图像处理子程序或 Python 函数之一来产生中间输出,这些输出可能会被程序的后续部分使用。

我们展示了 VISPROG 在 4 个不同任务上的灵活性 - 组合视觉问答、图像对的零样本推理、事实知识对象标记和语言引导的图像编辑。

我们相信,像 VISPROG 这样的神经符号方法是一种令人兴奋的途径,可以轻松有效地扩展人工智能系统的范围,以服务于人们可能希望执行的复杂任务的长尾。        

1. 介绍

对通用 AI 系统的追求导致了功能强大的端到端可训练模型的开发[1、5、8、13、19、25、27],其中许多模型都希望为用户提供一个简单的自然语言界面来与模型交互。构建这些系统的主要方法是进行大规模无监督预训练,然后进行监督多任务训练。然而,这种方法需要为每个任务提供精心策划的数据集,这使得扩展到我们最终希望这些系统执行的无限长尾复杂任务变得具有挑战性。

在这项工作中,我们探索了使用大型语言模型来解决复杂任务的长尾问题,方法是将这些用自然语言描述的任务分解为更简单的步骤,这些步骤可以由专门的端到端训练模型或其他程序来处理。

想象一下,指示视觉系统“在这张图片中标记电视节目《生活大爆炸》中的 7 个主要角色”。为了执行此任务,系统首先需要理解指令的意图,然后执行一系列步骤 - 检测面部,从知识库中检索《生活大爆炸》中的主要角色列表,使用角色列表对面部进行分类,并使用已识别角色的面部和名称标记图像。虽然存在不同的视觉和语言系统来执行每个步骤,但执行用自然语言描述的任务超出了端到端训练系统的范围。

我们引入了 VISPROG,它输入视觉数据(单个图像或一组图像)以及自然语言指令,生成一系列步骤(如果您愿意的话,可以称为视觉程序),然后执行这些步骤以产生所需的输出。视觉程序中的每一行都会调用系统当前支持的众多模块之一。模块可能是现成的计算机视觉模型、语言模型、OpenCV [4] 中的图像处理子程序或算术和逻辑运算符。模块使用通过执行前面的代码行生成的输入并输出可在下游使用的中间结果。在上面的示例中,VISPROG 生成的视觉程序调用人脸检测器 [18]、GPT-3 [5] 作为知识检索系统和 CLIP [23] 作为开放词汇图像分类器来产生所需的输出(参见图 1)。

VISPROG 改进了以前用于生成和执行视觉应用程序的方法。对于视觉问答 (VQA) 任务,神经模块网络(NMN) [2,9,10,12] 由专门的可区分神经模块组成一个针对特定问题、端到端的可训练网络。这些方法要么使用脆弱的现成语义解析器来确定性地计算模块的布局,要么通过 REINFORCE 的弱答案监督来学习布局生成器 [33]。相比之下,VISPROG 使用强大的语言模型 (GPT-3) 和少量上下文示例来创建复杂的程序,而无需任何训练(我们使用“训练”来指代基于梯度的学习,以将其与仅涉及前馈传递的上下文学习区分开来)。VISPROG 创建的程序还使用比 NMN 更高级别的抽象,并调用经过训练的最先进的模型和非神经 Python 子程序(图 2)。这些优势使得 VISPROG 成为一个易于使用性能卓越模块化的神经符号系统。

图 2. VISPROG 当前支持20个模块。红色模块使用神经模型(OWL-ViT [21]、DSFD [18]、MaskFormer [6]、CLIP [23]、ViLT [16] 和 Stable Diffusion [28])。蓝色模块使用图像处理和其他 Python 子程序。这些模块在由自然语言指令生成的程序中调用。添加新模块来扩展 VISPROG 的功能非常简单(代码 1)。标题

VISPROG 还具有高度可解释性。首先,VISPROG 生成易于理解的程序,用户可以验证其逻辑正确性。其次,通过将预测分解为简单的步骤,VISPROG 允许用户检查中间步骤的输出以诊断错误,并在必要时干预推理过程。总之,执行的程序与中间步骤结果(例如文本、边界框、分割掩码、生成的图像等)链接在一起以描述信息流,作为预测的视觉原理。

为了展示其灵活性,我们将 VISPROG 用于 4 个不同的任务,这些任务共享一些共同的技能(例如图像解析),同时还需要一定程度的专业推理和视觉处理能力。这些任务是 -

(i)组合视觉问答;

(ii)图像对的零样本自然语言视觉推理(NLVR);

(iii)来自自然语言指令的事实知识对象标记;

(iv)语言引导的图像编辑。

我们强调,语言模型和任何模块都没有以任何方式进行微调。将 VISPROG 适应任何任务都很简单,只需提供一些由自然语言指令和相应程序组成的上下文示例即可。虽然易于使用,但 VISPROG 在组合 VQA 任务上比基础 VQA 模型提高了 2.7 分,在 NLVR 上实现了 62.4% 的强大零样本准确率,而无需对图像对进行训练,并且在知识标记和图像编辑任务上获得了令人满意的定性和定量结果。

我们的主要贡献包括 -

(i) VISPROG - 一个使用语言模型的上下文学习能力的系统,从自然语言指令中生成视觉程序,用于组合视觉任务(第 3 节);

(ii) 展示 VISPROG 在复杂视觉任务(如事实知识对象标记和语言引导图像编辑(第 4.3 和 4.4 节))上的灵活性,这些任务在单一的端到端模型中无法实现或取得的成功有限;

(iii) 为这些任务提供视觉原理,并展示它们在错误分析和用户驱动的指令调整方面的实用性,以显著提高 VISPROG 的性能(第 5.3 节)。

2. 相关工作

由于大型语言模型 (LLM) 具有令人难以置信的理解、生成和上下文学习能力,神经符号方法获得了新的发展势头。我们现在讨论以前用于视觉任务的程序生成和执行方法、最近使用 LLM 进行视觉研究的工作以及用于语言任务的推理方法的进展。

视觉任务的程序生成和执行。神经模块网络 (NMN) [2] 开创了用于视觉问答 (VQA) 任务的模块化和组合方法。NMN 将神经模块组合成端到端可微分网络。虽然早期尝试使用现成的解析器 [2],但最近的方法 [9,10,12] 使用 REINFORCE [33] 和弱答案监督与神经模块一起学习布局生成模型。虽然 VISPROG 在精神上与 NMN 相似,但它比 NMN 有几个优势。首先,VISPROG 生成高级程序,这些程序在中间步骤调用经过训练的最先进的神经模型和其他 Python 函数,而不是生成端到端神经网络。这使得合并符号、不可微分模块变得容易。其次,VISPROG 利用 LLM [5] 的上下文学习能力,通过向 LLM(GPT-3)提示自然语言指令(或视觉问题或要验证的陈述)以及一些类似指令及其对应程序的示例来生成程序,从而无需为每个任务训练专门的程序生成器。

用于视觉任务的 LLM。LLM 和上下文学习已应用于视觉任务。PICa [34] 使用 LLM 执行基于知识的 VQA [20] 任务。PICa 通过标题、对象和属性将图像中的视觉信息表示为文本,并将此文本表示连同问题和上下文示例一起提供给 GPT-3,以直接生成答案。苏格拉底模型 (SM) [36],由语言 (BERT [7]、GPT-2 [24])、视觉语言 (CLIP [23]) 和音频语言 (mSLAM [3]) 等不同模态的预训练模型组成,以执行许多零样本任务,包括图像字幕、视频到文本检索和机器人规划。然而,在 SM 中,每个任务的组成都是预先确定的和固定的。相比之下,VISPROG 通过根据指令、问题或语句生成程序来确定如何为每个实例编写模型。我们展示了 VISPROG 处理复杂指令的能力,这些指令涉及多种功能(20 个模块)和各种输入(文本、图像和图像对)、中间(文本、图像、边界框、分割蒙版)和输出模态(文本和图像)。与 VISPROG 类似,ProgPrompt [29] 是一项并发工作,展示了 LLM 从自然语言指令生成类似 Python 的情境机器人行动计划的能力。虽然 ProgPrompt 模块(例如“find”或“grab”)以字符串(通常是对象名称)作为输入,但 VISPROG 程序更为通用。在 VISPROG 程序的每个步骤中,模块可以接受多个参数,包括字符串、数字、算术和逻辑表达式或由前面的步骤生成的任意 Python 对象(例如包含边界框或分割蒙版的 list() 或 dict() 实例)。

NLP 中的提示推理。越来越多的文献 [14, 17] 介绍了使用 LLM 通过提示进行语言推理任务。思路链 (CoT) 提示 [32],即使用输入、思路链原理(一系列中间推理步骤)和输出的上下文示例来提示语言模型,在解决数学推理问题方面表现出令人印象深刻的能力。虽然 CoT 依赖于 LLM 生成推理路径和执行推理路径的能力,但类似于 VISPROG 的方法已应用于语言任务,其中首先使用decomposer pompt(分解器)提示 [15] 来生成一系列子任务,然后由子任务处理程序处理这些子任务。

3. VISPROG

过去几年,人工智能社区已经为许多视觉和语言任务(例如物体检测、分割、VQA、字幕和文本转图像生成)制作了高性能、特定于任务的模型。虽然这些模型中的每一个都解决了一个定义明确但范围狭窄的问题,但我们通常希望在现实世界中解决的任务往往更广泛且定义松散。

为了解决此类实际任务,人们必须收集新的特定于任务的数据集(这可能很昂贵),或者精心编写一个程序来调用多个神经模型、图像处理子程序(例如图像调整大小、裁剪、过滤和颜色空间转换)和其他计算(例如数据库查找或算术和逻辑运算)。为我们每天遇到的无限长的复杂任务手动创建这些程序不仅需要编程专业知识,而且速度慢、劳动密集,最终不足以覆盖所有任务的空间。如果我们可以用自然语言描述任务,并让人工智能系统在没有任何训练的情况下生成和执行相应的视觉程序,那会怎样?

用于可视化编程的大型语言模型。大型语言模型(如 GPT-3)已经表现出非凡的能力,可以在看到少量上下文输入和输出演示后,将任务推广到新样本。例如,用两个英法翻译示例和一个新的英语短语提示 GPT-3 会产生法语翻译“bonsoir”。请注意,我们不必对 GPT-3 进行微调即可执行第三个短语的翻译任务。VISPROG 使用 GPT-3 的这种上下文学习能力来输出用于自然语言指令的可视化程序。

good morning -> bonjour
good day -> bonne journ ́ee
good evening ->

与上面示例中的英语和法语翻译对类似,我们用成对的指令和所需的高级程序提示 GPT-3。图 3 显示了这样一个图像编辑任务的提示。上下文示例中的程序是手动编写的,通常可以在没有附带图像的情况下构建。VISPROG 程序的每一行或程序步骤都由模块名称、模块的输入参数名称及其值以及输出变量名称组成。VISPROG 程序通常使用过去步骤的输出变量作为未来步骤的输入。我们使用描述性模块名称(例如“Select”、“ColorPop”、“Replace”)、参数名称(例如“image”、“object”、“query”)和变量名称(例如“IMAGE”、“OBJ”)让 GPT-3 了解每个模块的输入和输出类型和功能。在执行期间,输出变量可用于存储任意数据类型。例如,“OBJ”是图像中的对象列表,其中每个对象都带有相关的蒙版、边界框和文本(例如类别名称)。

这些上下文示例与新的自然语言指令一起输入到 GPT-3 中。无需观察图像或其内容,VISPROG 即可生成一个程序(图 3 底部),该程序可以在输入图像上执行以执行所描述的任务。

图 3. VISPROG 中的程序生成。VisProg 通过提示 LLM、GPT-3 来生成程序,并带有一条指令以及由指令和相应程序组成的上下文示例。与以前的方法(如 Neural Module Network)不同

模块。VISPROG 目前支持 20 个模块(图 2),用于实现图像理解、图像处理(包括生成)、知识检索以及执行算术和逻辑运算等功能。在 VISPROG 中,每个模块都作为 Python 类(代码 1)实现,该类具有以下方法:(i)解析行以提取输入参数名称和值以及输出变量名称;(ii)执行可能涉及训练过的神经模型的必要计算,并使用输出变量名称和值更新程序状态;(iii)使用 html 直观地总结步骤的计算(稍后用于创建视觉原理)。向 VISPROG 添加新模块只需实现和注册一个模块类,而使用此模块执行程序则由 VISPROG 解释器自动处理,下面将对此进行介绍。

Code 1.VISPROG模块的实现 

class VisProgModule():
    def __init__(self):
        # 加载训练好的模型;移动到 GPU
        pass  # 假设有实现代码
    def html(self, inputs: List, output: Any):
        # 返回一个可视化步骤输入/输出的 HTML 字符串
        pass  # 假设有实现代码
    def parse(self, step: str):
        # 解析步骤并返回输入值列表
        # 以及变量和输出变量名
        pass  # 假设有实现代码
    def execute(self, step: str, state: Dict):
        inputs, input_var_names, output_var_name = self.parse(step)
        # 从状态中获取输入变量的值
        for var_name in input_var_names:
            inputs.append(state[var_name])
        # 使用加载的模型执行计算
        output = some_computation(inputs)
        # 更新状态
        state[output_var_name] = output
        # 步骤计算的可视化摘要
        step_html = self.html(inputs, output)
        return output, step_html

程序执行。程序执行由解释器处理。解释器使用输入初始化程序状态(将变量名称映射到其值的字典),并逐行执行程序,同时使用该行中指定的输入调用正确的模块。执行完每个步骤后,程序状态将使用该步骤输出的名称和值进行更新。

可视化原理。除了执行必要的计算之外,每个模块类还实现了一个名为 html() 的方法,以 HTML 片段的形式直观地总结模块的输入和输出。解释器只需将所有程序步骤的 HTML 摘要拼接成可视化原理(图 4),即可用于分析程序的逻辑正确性以及检查中间输出。可视化原理还使用户能够了解失败的原因,并尽量调整自然语言指令以提高性能。有关更多详细信息,请参阅第 5.3 节。

图 4. VISPROG 生成的视觉原理。这些原理以视觉方式总结了在图像编辑(顶部)和 NLVR 任务(底部)的推理过程中生成的程序中每个计算步骤的输入和输出。
Image Editing with Natural Language
Reasoning about image pairs (NLVR)

4. 任务

VISPROG 提供了一个灵活的框架,可应用于各种复杂的视觉任务。我们在 4 个任务上评估了 VISPROG,这些任务需要从空间推理、多图像推理、知识检索到图像生成和处理等能力。图 5 总结了用于这些任务的输入、输出和模块。我们现在描述这些任务、它们的评估设置以及上下文示例的选择。

图 5. 我们在一系列不同的任务上评估 VISPROG。这些任务涵盖各种输入和输出,并尽可能重用模块(Loc、 FaceDet、VQA)。

4.1. Compositional Visual Question Answering(组合式视觉问答)

VISPROG 的构造是组合式的,这使其适用于组合式、多步骤的视觉问答任务:GQA [11]。GQA 任务的模块包括用于开放词汇定位的模块、VQA 模块、用于根据边界框坐标或空间介词(例如上方、左侧等)裁剪图像区域的函数、用于计数框的模块以及用于评估 Python 表达式的模块。例如,考虑这个问题:“小卡车是在戴头盔的人的左边还是右边?”。VISPROG 首先定位“戴头盔的人”,裁剪这些人左侧(或右侧)的区域,检查那一侧是否有“小卡车”,如果是,则返回“左”,否则返回“右”。 VISPROG使用基于 VILT [16] 的问答模块,但 VISPROG 不会简单地将复杂的原始问题传递给 VILT,而是会调用它来完成一些更简单的任务,例如识别图像块中的内容。因此,我们为 GQA 生成的 VISPROG 不仅比 VILT 更具可解释性,而且更准确(表 1)。或者,人们可以完全消除对 ViLT 等 QA 模型的需求,并使用 CLIP 和对象检测器等其他系统,但我们将其留待将来研究。

评估。为了限制使用 GPT-3 生成程序所花费的资金,我们创建了一个 GQA 子集用于评估。GQA 中的每个问题都用问题类型注释。为了对多种问题类型(约 100 种详细类型)进行评估,我们从平衡的 val(k = 5)和 testdev(k = 20)集中随机抽取每个问题类型最多 k 个样本。

提示。我们用所需的 VISPROG 程序手动注释了来自平衡训练集的 31 个随机问题。用程序注释问题很容易,只需要写下回答该特定问题所需的推理链。我们为 GPT-3 提供了一个较小的上下文示例子集,从此列表中随机抽样,以降低回答每个 GQA 问题的成本。

4.2. Zero-Shot Reasoning on Image Pairs(图像对的零样本推理)

VQA 模型经过训练可以回答有关单幅图像的问题。在实践中,可能需要系统回答有关一组图像的问题。例如,用户可能会要求系统解析他们的假期相册并回答以下问题:“在参观埃菲尔铁塔的第二天,我们参观了哪个地标?”。我们无需组装昂贵的数据集并训练多图像模型,而是展示了 VISPROG 使用单幅图像 VQA 系统解决涉及多幅图像的任务的能力,而无需对多幅图像示例进行训练。

我们在 NLVRV2 [30] 基准上展示了这种能力,该基准涉及验证有关图像对的语句。通常,解决 NLVRV2 挑战需要训练自定义架构,将图像对作为 NLVRV2 训练集的输入。相反,VISPROG 通过将复杂语句分解为关于单个图像的更简单问题以及涉及算术和逻辑运算符的 Python 表达式以及对图像级问题的答案来实现这一点。VQA 模型 VILT-VQA 用于获取图像级答案,并评估 Python 表达式以验证语句。

评估。我们从 NLVRV2 开发集中抽取 250 个随机样本,创建一个小型验证集,以指导提示选择,并在 NLVRV2 的完整公共测试集上测试泛化。

提示。我们为 NLVRV2 训练集中的 16 个随机语句对 VISPROG 程序进行抽样和注释。由于其中一些示例是冗余的(类似的程序结构),我们还通过删除 4 个冗余示例创建了一个由 12 个示例组成的精选子集。

4.3. Factual Knowledge Object Tagging(事实知识对象标注)

我们经常想识别图像中那些我们不知道名字的人和物体。例如,我们可能想识别名人、政治家、电视节目中的角色、国家国旗、公司徽标、流行汽车及其制造商、生物物种等等。解决这个任务不仅需要定位人物、面孔和物体,还需要在外部知识库中查找事实知识来构建一组用于分类的类别,例如电视节目中角色的名字。我们将这个任务称为事实知识对象标记或简称知识标记。

为了解决知识标记问题,VISPROG 使用 GPT-3 作为隐性知识库,可以使用自然语言提示进行查询,例如“列出电视节目《生活大爆炸》中的主要角色,并用逗号分隔”。然后,这个生成的类别列表可以被 CLIP 图像分类模块使用,该模块对定位和人脸检测模块生成的图像区域进行分类。VISPROG 的程序生成器会根据自然语言指令中的上下文自动确定是使用人脸检测器还是开放词汇定位器。VISPROG 还会估计检索到的类别列表的最大大小。例如,“标记德国前五大汽车公司的徽标”会生成一个包含 5 个类别的列表,而“标记德国汽车公司的徽标”会生成一个由 GPT-3 确定的任意长度的列表,截止值为 20。这允许用户通过调整指令轻松控制分类过程中的噪音。

评估。为了评估 VISPROG 在该任务上的表现,我们在 46 幅图像上标注了 100 条标记指令,这些指令需要外部知识来标记 253 个对象实例,包括流行文化、政治、体育和艺术领域的人物,以及各种物体(例如汽车、旗帜、水果、电器、家具等)。对于每条指令,我们通过精度(正确的预测框的比例)和召回率(正确预测的地面实况对象的比例)来测量定位和标记性能。标记指标要求预测的边界框和相关标记或类标签都是正确的,而定位则忽略标记。为了确定定位的正确性,我们使用 IoU 阈值 0.5。我们通过 F1 分数(指令间平均精度和召回率的调和平均值)总结定位和标记性能。

提示。我们为此任务创建了 14 个上下文示例。请注意,这些示例的指令是幻觉,即没有与这些示例相关联的图像。

4.4. Image Editing with Natural Language(使用自然语言编辑图像)

过去几年,文本到图像的生成取得了令人瞩目的进步,例如 DALL-E [26]、Parti [35] 和 Stable Diffusion [28] 等模型。然而,这些模型仍然无法处理诸如“用 :p 隐藏 Daniel Craig 的脸”(去身份识别或隐私保护)或“创建 Daniel Craig 的彩色弹出并模糊背景”(对象突出显示)之类的提示,尽管这些提示相对容易通过结合使用人脸检测、分割和图像处理模块以编程方式实现。要实现诸如“用戴着太阳镜的 Barack Obama 替换 Barack Obama”(对象替换)之类的复杂编辑,首先需要识别感兴趣的对象,生成要替换的对象的掩码,然后使用原始图像调用图像修复模型(我们使用 Stable Diffusion),掩码指定要替换的像素,并描述在该位置要生成的新像素。 VISPROG 在配备必要的模块和示例程序后,可以轻松处理非常复杂的指令。

评估。为了测试 VISPROG 在图像编辑指令上的去标识化、对象突出显示和对象替换,我们在 65 张图像中收集了 107 条指令。

我们手动对预测的正确性和报告准确性进行评分。请注意,只要生成的图像在语义上正确,我们就不会对使用稳定扩散的对象替换子任务的视觉伪影进行惩罚。

提示。与知识标记类似,我们为此任务创建了 10 个上下文示例,没有相关图像。

5. 实验和分析

我们的实验评估了提示数量对 GQA 和 NLVR 性能的影响(第 5.1 节)、VISPROG 在四个任务上的概括以及各种提示策略的比较(第 5.2 节),分析了每个任务的错误来源(图 8),并研究了视觉原理在诊断错误和通过指令调整提高 VISPROG 性能方面的实用性(第 5.3 节)。

5.1. Effect of prompt size(提示大小的影响)

图 7 显示,对于 GQA 和 NLVR,验证性能随着提示中使用的上下文示例数量的增加而逐渐增加。每次运行都会根据随机种子随机选择带注释的上下文示例子集。我们还发现,对随机种子进行多数投票可始终获得比运行间平均性能更好的性能。这与 Chain-of-Thought [32] 推理文献中关于数学推理问题 [31] 的发现一致。在 NLVR 上,VISPROG 的性能在提示数量少于 GQA 时达到饱和。我们认为这是因为 NLVRV2 程序需要的模块更少,因此使用这些模块的演示也比 GQA 更少。

图 7. GQA 和 NLVRV2 验证集上上下文示例的数量越多,性能越好。误差线 表示 5 次运行的 95% 置信区间。相同运行的预测用于多数表决。(第 5.1 节)

5.2. Generalization(概括)

GQA。在表 1 中,我们在 GQA testdev 集上评估了不同的提示策略。对于在验证集上评估的最大提示大小(24 个上下文示例),我们比较了由 VISPROG 在验证集上的 5 次运行中选择的最佳提示组成的随机策略(每次运行从 31 个带注释的示例中随机抽取上下文示例)和多数投票策略,该策略在 5 次运行中对每个问题进行最大共识预测。虽然“随机”提示仅略胜于 VILT-VQA,但投票可带来 2.7 分的显着收益。这是因为在多次运行中进行投票,每次都有一组不同的上下文示例,有效地增加了每个预测看到的上下文示例总数。我们还评估了一个手动策划的提示,该提示由 20 个示例组成 - 31 个带注释示例中的 16 个,以及 4 个额外的幻觉示例,旨在更好地覆盖验证集中观察到的失败案例。策划的提示与投票策略一样好,同时使用的计算量减少了 5 倍,凸显了提示工程的前景

表 1. GQA testdev 结果。我们报告了原始 GQA testdev 集子集上的性能,如第 4.1 节所述。

NLVR。表 2 显示了 VISPROG 在 NLVRV2 测试集上的表现,并与 GQA 的随机、投票和策划提示策略进行了比较。虽然 VISPROG 无需对图像对进行训练即可执行 NLVR 任务零样本,但我们报告了 VILT-NLVR(一种在 NLVRV2 上微调的 VILT 模型)作为性能的上限。虽然落后上限几个点,但 VISPROG 仅使用单图像 VQA 模型进行图像理解和 LLM 进行推理,就表现出强大的零样本性能。请注意,VISPROG 使用 VILT-VQA 作为其 VQA 模块,该模块在 VQAV2 单图像问答任务上进行训练,但不在 NLVRV2 上进行训练。 

表 2. NLVRV2 测试结果。VISPROG 执行 NLVR zeroshot,即无需在图像对上训练任何模块。VILT-NLVR 是一个在 NLVRV2 上微调的 VILT 模型,用作上限。

知识标记。表 3 显示了知识标记任务的定位和标记性能。此任务的所有指令不仅需要开放词汇本地化,还需要查询知识库以获取用于标记本地化对象的类别。这使得它成为对象检测器单独无法完成的任务。使用原始指令,VISPROG 在标记方面获得了令人印象深刻的 63.7% F1 分数,这涉及正确定位和命名对象,仅在定位方面就获得了 80.6% 的 F1 分数。VISPROG 中的视觉原理允许通过修改指令来进一步提高性能。有关定性示例,请参见图 6,有关指令调整的更多详细信息,请参见第 5.3 节。

表 3. 知识标记结果。该表显示了原始指令以及在检查视觉原理以了解特定实例的错误来源后创建的修改指令的性能。
图 6. 图像编辑(顶部)和知识标记任务(底部)的定性结果。

图像编辑。表 4 显示了语言引导图像编辑任务的表现。图 6 显示了使用 VISPROG 中当前模块集可以进行的各种操作,包括面部操作、通过色彩弹出和背景模糊等风格效果突出显示图像中的一个或多个对象,以及通过替换场景中的关键元素(例如沙漠)来更改场景背景。

5.3. Utility of Visual Rationales(视觉原理的实用性)

错误分析。VISPROG 生成的理由允许对故障模式进行彻底分析,如图 8 所示。对于每个任务,我们手动检查约 100 个样本的理由,以分解错误来源。这种分析为提高 VISPROG 在各种任务上的性能提供了一条清晰的途径。例如,由于不正确的程序是 GQA 上影响 16% 样本的主要错误来源,因此可以通过提供更多类似于 VISPROG 当前失败的指令的上下文示例来提高 GQA 的性能。通过将用于实现高错误模块的模型升级为性能更高的模型,也可以提高性能。例如,用更好的 NLVR VQA 模型替换 VILT-VQA 模型可以将性能提高多达 24%。同样,改进用于实现“列表”和“选择”模块的模型(知识标记和图像编辑任务的主要错误来源)可以显着减少错误。

图 8. VISPROG 中的错误来源。

指令调整。要发挥作用,视觉原理最终必须允许用户提高系统在其任务上的性能。对于知识标记和图像编辑任务,我们研究视觉原理是否可以帮助用户修改或调整指令以实现更好的性能。图 9 显示修改后的指令:(i)为定位模块带来更好的查询(例如“厨房用具”而不是“物品”);(ii)为知识检索提供更具信息量的查询(例如“IBM 最近的 CEO”而不是“IBM 的 CEO”);(iii)为 Select 模块提供类别名称(例如“table-merged”)以将搜索限制在属于指定类别的分段区域;或(iv)通过 List 模块中的最大参数控制知识标记的分类类别数量。表 3 和表 4 显示,指令调整为知识标记和图像编辑任务带来了显着的收益。

图 9. 使用视觉原理进行指令调整。通过揭示失败的原因,VISPROG 允许用户修改原始指令以提高性能。

6. 结论

VISPROG 提出可视化编程是一种简单有效的方法,可以将 LLM 的推理能力应用于复杂的视觉任务。VISPROG 在生成高度可解释的视觉原理的同时,还表现出强大的性能。研究更好的提示策略并探索结合用户反馈的新方法以提高神经符号系统(如 VISPROG)的性能,是构建下一代通用视觉系统的一个令人兴奋的方向。

7. 附录

本附录包括

• VISPROG 的任务提示(第 A.1 节)

• 模块实施细节(第 A.2 节)

• 更多定性结果以及成功和失败案例的视觉原理可在以下链接找到。

PRIOR

7.1. Task Prompts

我们展示了 GQA(图 10)、NLVR(图 11)、知识标记(图 13)和语言引导图像编辑(图 12)任务的提示结构,每个任务都有 3 个上下文示例。

Figure 10. GQA prompt

Figure 11. NLVR prompt

图 12. Image editing prompt.。请注意,提示包括表情符号到 AugLy [22] 库中用于实现表情符号模块的名称的映射。第三个示例显示如何为 Select 模块提供类别值。
图 13. Knowledge tagging prompt.。请注意,提示有一个额外的占位符,用于配置 List 模块的默认最大值。虽然第一个示例从自然指令推断出最大值,但第三个示例演示了用户如何最低限度地增强自然指令以提供参数值。

7.2. Module Details

为了帮助更好地理解生成的程序,我们现在提供了一些关于某些模块的实现细节。

选择。该模块接受一个查询和一个类别参数。当提供类别时,仅对程序中先前模块(通常是 Seg 模块)已识别为属于该类别的区域执行选择。如果类别为 None,则对所有区域执行选择。查询是用于区域文本评分以执行选择的文本。我们使用 CLIP-ViT [23] 来选择查询得分最高的区域。当查询包含多个以逗号分隔的短语时,将为每个短语选择得分最高的区域。

分类。分类模块获取对象区域和类别的列表,并尝试将其中一个类别分配给每个区域。为简单起见,我们假设标记任务中的图像最多有每个类别的 1 个实例。分类模块根据类别列表是否具有 1 个或多个元素而以不同的方式运行。如果类别列表只有 1 个元素,则该类别将分配给具有最高 CLIP 分数的区域,类似于选择模块。当提供多个类别时,首先,每个区域被分配具有最佳分数的类别。由于分类错误,这可能导致多个区域被分配相同的类别。因此,对于每个分配的类别(不包括未分配给任何区域的类别),我们执行重复数据删除步骤,仅保留每个类别的最高得分区域。

列表。列表模块使用 GPT3 创建了一个灵活而强大的知识检索器。图 14 显示了提供给 GPT3 以检索事实知识的提示。

图 14. List 模块的提示。list_max 表示默认的最大列表长度,new_query 是新检索查询的占位符

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值