通过代码生成实现模块化视觉问答

实现模块化视觉问答的代码生成

由加州大学伯克利分校的博士生Sanjay Subramanian和Google Research感知团队的研究科学家Arsha Nagrani发布

视觉问答(VQA)是一项机器学习任务,要求模型回答关于图像或一组图像的问题。传统的VQA方法需要大量的带有图像的人工注释问题-答案对的标记训练数据。近年来,大规模预训练的进展导致了在少于五十个训练示例(少样本)和没有任何人工注释的VQA训练数据(零样本)上表现良好的VQA方法的发展。然而,这些方法与MaMMUT和VinVL等最先进的完全监督VQA方法之间仍存在显著的性能差距。特别是,少样本方法在空间推理、计数和多跳推理方面存在困难。此外,少样本方法通常只能回答关于单个图像的问题。

为了提高涉及复杂推理的VQA示例的准确性,我们在即将于ACL 2023上发表的论文《通过代码生成进行模块化视觉问答》中引入了CodeVQA,这是一个使用程序合成回答视觉问题的框架。具体来说,给定关于图像或一组图像的问题,CodeVQA生成一个包含简单视觉函数的Python程序(代码),使其能够处理图像,并执行该程序以确定答案。我们证明,在少样本设置下,CodeVQA在COVR数据集上的性能比先前的工作提高了约3%,在GQA数据集上提高了约2%。

CodeVQA

CodeVQA方法使用代码编写的大型语言模型(LLM),例如PALM,来生成Python程序(代码)。我们通过构建一个由这些函数的描述和少于十五个“上下文内”视觉问题示例以及与之对应的Python代码组成的提示来引导LLM正确使用视觉函数。为了选择这些示例,我们计算输入问题和我们已注释程序的所有问题的嵌入。然后,我们选择与输入具有最高相似度的问题,并将它们用作上下文内的示例。给定我们想要回答的提示和问题,LLM生成表示该问题的Python程序。

我们使用三个视觉函数实例化CodeVQA框架:(1)query,(2)get_pos和(3)find_matching_image

  • query使用少样本的Plug-and-Play VQA(PnP-VQA)方法回答关于单个图像的问题。PnP-VQA使用BLIP生成字幕,BLIP是一个在数百万个图像-字幕对上进行预训练的图像字幕转换器,然后将这些字幕输入到LLM中输出问题的答案。
  • get_pos是一个对象定位器,它将对象的描述作为输入并返回其在图像中的位置。它使用GradCAM实现。具体而言,将描述和图像通过BLIP联合文本-图像编码器,该编码器预测图像-文本匹配得分。GradCAM根据这个得分与图像特征的梯度找到与文本最相关的区域。
  • find_matching_image用于多图像问题,它用于找到与给定输入短语最匹配的图像。它通过使用BLIP文本和图像编码器计算短语的文本嵌入和每个图像的图像嵌入。然后,文本嵌入与每个图像嵌入的点积表示每个图像与短语的相关性,并选择最大化此相关性的图像。

可以使用几乎不需要注释的模型(例如,从Web上收集的文本和图像-文本对以及少量的VQA示例)来实现这三个函数。此外,CodeVQA框架可以轻松扩展到用户可能实现的其他函数(例如,对象检测、图像分割或知识库检索)。

CodeVQA方法的示意图。首先,大型语言模型生成一个调用表示问题的视觉函数的Python程序(代码)。在这个示例中,使用简单的VQA方法(query)回答问题的一部分,并使用对象定位器(get_pos)找到所提到的对象的位置。然后,程序通过结合这些函数的输出来回答原始问题。

结果

CodeVQA框架不仅能够为单图像问题生成和执行Python程序,还能够为多图像问题生成和执行Python程序。例如,如果给出两幅图像,每幅图像都显示两只熊猫,一个可能会问的问题是:“真的有四只熊猫吗?”在这种情况下,LLM将关于图像对的计数问题转化为一个程序,其中通过查询函数获取了每幅图像的对象计数。然后将两幅图像的计数相加,计算出一个总计数,然后将其与原始问题中的数字进行比较,得出一个是或否的答案。

我们在三个视觉推理数据集(GQA,COVR和NLVR2)上评估了CodeVQA。对于GQA,我们为每种方法提供了12个上下文示例,对于COVR和NLVR2,我们为每种方法提供了六个上下文示例。下表显示了CodeVQA在所有三个数据集上相对于基线few-shot VQA方法的稳定改进。

方法       GQA       COVR       NLVR2      
few-shot PnP-VQA       46.56       49.06       63.37      
CodeVQA       49.03       54.11       64.04      
GQA、COVR和NLVR2数据集上的结果,显示CodeVQA相对于few-shot PnP-VQA方法的持续改进。指标是完全匹配准确度,即预测答案与真实答案完全匹配的例子所占的百分比。

我们发现在GQA中,CodeVQA在空间推理问题上的准确率比基准高约30%,在“and”问题上高4%,在“or”问题上高3%。第三类问题包括多跳问题,例如“图片中有盐瓶或滑板吗?”,其生成的程序如下所示。

img = open_image("Image13.jpg")
salt_shakers_exist = query(img, "是否有盐瓶?")
skateboards_exist = query(img, "是否有滑板?")
if salt_shakers_exist == "yes" or skateboards_exist == "yes":
    answer = "是"
else:
    answer = "否"

在COVR中,我们发现CodeVQA相对于基准的增益在输入图像数量较大时更高,如下表所示。这一趋势表明将问题分解为单个图像问题是有益的。

         图像数量      
方法    1    2    3    4    5   
少样本PnP-VQA    91.7    51.5    48.3    47.0    46.9   
CodeVQA    75.0    53.3    48.7    53.2    53.4   

结论

我们提出了CodeVQA,这是一个依靠代码生成来进行多步视觉推理的少样本视觉问答框架。未来工作的激动人心的方向包括扩展所使用的模块集,并为VQA之外的视觉任务创建类似的框架。我们注意到在考虑部署类似CodeVQA的系统时需要谨慎,因为像我们的视觉功能中使用的视觉-语言模型已被证明存在社会偏见。与此同时,与单体模型相比,CodeVQA提供了额外的可解释性(通过Python程序)和可控性(通过修改提示或视觉功能),这在生产系统中非常有用。

致谢

此研究是由加州大学伯克利分校的人工智能研究实验室(BAIR)和谷歌研究共同合作进行的,研究人员包括Sanjay Subramanian、Medhini Narasimhan、Kushal Khangaonkar、Kevin Yang、Arsha Nagrani、Cordelia Schmid、Andy Zeng、Trevor Darrell和Dan Klein。