Visual Programming——实现通用人工智能的另一种方式


论文链接: https://arxiv.org/abs/2211.11559

visual programming获得了2023年的best paper, 足以证明其论文质量。但这篇论文比较特殊,在其他模型强调自己模型结构新颖的时候,这篇文章的标题中的without training显得格格不入。

如果抱着学习一些算法上的巧妙思路去阅读这篇文章可能会有些失望,但如果作为一个务实派,站在解决实际问题的角度,这篇文章的前瞻性,思考问题的方式和解决问题的工程能力绝对会让你眼前一亮!

既然更重要的是思考问题和解决问题的方式,区别于之前的一些论文解读文章,这篇文章在写的时候会更关注出发点和如何解决。 如果你只关心这篇文章大概是怎么做的,可以看前言->VisProg方法总结这一个小节。

前言

AI的概念自1995年诞生以来,全球的研究者一直致力于创造的算法拥有的智能能和人类的智能相当甚至是超越,但是长久以来,受限于现有技术、 算力和研究者对通用智能的理解等因素。我们追求的一直是通用(general) 的智能, 而得到的是特定任务(task-specific) 或者是狭隘(narrow) 的智能。

当前AI算法的任务普遍存在以下两个问题:

  • 定义明确
  • 应用范围狭隘

这两个问题导致目前模型和任务一一对应,扩展性弱。而现实世界中的问题定义不明确,场景多样。 理想和实际是割裂的,为了解决部分现实世界中的问题,需要对收集数据对场景定制模型,或者手动的写一些规则,调用多个模型适应现实不同的场景。

VisProg方法总结

VisProg(Visual Programming)的目的是实现通用的智能,但区别于现在大模型想把尽量多的知识放在一个模型中的做法。VisProg利用现有的语言模型,将一个复杂的任务分解成多个子任务。

VisProg的思路很简单, 避免了任何模型的训练,使用的是大语言模型和in-context learning的技术,将一个复杂的任务拆解成类似python的模块化程序,然后逐个执行,最终解决问题。生成的模块化步骤可以用单个或者多个视觉模型/图像处理/python函数解决,并且前一步输出的结果可以给之后的步骤使用。

端到端和多步骤推理

在心理学原理中有一个描述思维的双过程理论(dual-process theory),《思考的快与慢》中也将思考的系统分为系统一和系统二:

  • 系统一: 大脑对现状和刺激做出的快速、无意识的反应。可以看作是潜意识,大脑对该问题熟悉到使用历史知识做出反应可以得到正确的结果
  • 系统二: 大脑在解决复杂问题时缓慢、“需要动脑”和有逻辑的思考。

端到端的模型可以看作是系统一,而VisProg的多步骤推理可以看作系统二。

下面尝试带入到一个“需要动脑”的具体任务中: 标记下图中’生活大爆炸’中的7个主角

在我们思考这个问题的时候,会将这个任务拆解成如下几步:

  • 找出图像中的人脸
  • 在大脑储备的知识中查找生活大爆炸的7个主角分别是谁,得到搜索结果
  • 将人脸和大脑搜索引擎的结果匹配,给每个人脸一个分类结果
  • 在图片中标记出人脸坐标和人名

在我们完成上述任务中思考的分布可以看作系统二,也就是多步骤推理;而每一步的具体执行可以看作系统一.也就是使用具体的端到端模型.

VisProg

得益于最近的一些进展:

  • HuggingFace上有大量现成的视觉和语言模型
  • GPT等技术的发展,可以用自然语言产生分步的步骤或者具体的代码

VisProg是一个模块化可解释的视觉系统. 使用GPT3的语言理解和规划能力,将自然语言指令分解为具体的一些步骤,使用训练好的模型、图像处理代码和数学逻辑运算,执行拆解的步骤,以完成自然语言指令的任务。 VisProg结构和可视化效果如下图所示:

图片左侧是VisProg的网络结构图, 右侧是在4个任务上的可视化效果。 以VQA的任务为例,问题是照片上是否有领带和眼镜, 生成的步骤为:

  • 定位图片中的领带
  • 计算含有领带的定位框数量, 记为answer0
  • 定位图片中的眼镜
  • 计算含有眼镜的定位框数量, 记为answer1
  • 执行判断逻辑,answer0>0 and answer1>0,则answer2=’yes’,否则answer2=’no’
  • 最终结果为answer2

接下来看下图片左侧的算法结构

VisProg由程序生成器程序解释器两部分组成:

  • 程序生成器(Program Generator):

    • 输入包含两部分,分别是自然语言指令和In-Context指令对,自然语言指令描述的是需要解决的问题,In-Contex指令对是和需要解决问题类似指令对。 期望GPT3能在推理时激活输入数据、预测标签对应的分布, 以及这种数据+label的语言表达形式。下面是一个具体的例子。

    • 输出是类似Python代码的执行步骤
  • 程序解释器(Program interpreter):

    • 输入是图片和执行步骤, 输出是答案和可视化的视觉逻辑

Program Execution

在VisProg中, 每个模块都被实现为python代码。

  • execute解析步骤,返回输入变量名,输出变量名
  • inputs.append(state[var_name])从state获取输入变量对应的值
  • output = some_computation(inputs) 载入模型执行计算
  • state[output_var_name] = output更新state中的变量
  • step_html = self.html(inputs,output)HTML可视化每一步的输入输出

Visual Rationale

将每个模块的输入和输出可视化出来,用于分析逻辑和模块输出是否存在问题,可以调整指令

实验

为了验证其有效性在4个任务上做了实验,并且关于in-context的数量做了消融实验。

VQA

在做VQA这个任务的时候,选择的是GQA的数据集。 GQA更适合VisProg将问题拆解为多步骤的算法。具体GQA和之前数据集的区别,可以去看官网或者参考这篇文章

VisProg使用的算法能力是VILT-VQA模型,和实验中需要对比的算法是同一模型,区别是VisProg不是直接将一个复杂的任务,让VILT-VQA返回输出,而是会做拆解。 例如对于具体的问题图中的卡车是在戴头盔的人左边还是右边,VisProg会先对戴头盔的人定位,再判断这些人的是否存在卡车。

评估部分: GQA的数据集比较大,有约100种类型的VQA。为了省钱没有测试所有的数据,从每个类别中随机抽了5个验证集和20个测试集评估算法的效果。

Prompt 随机抽了一些样本,人工标注了需要回答特定问题所需要的推理步骤

和用VILT在VQA任务上fintune之后模型的效果对比如下:

  • curated: 从大量的context examples中挑选20个比较好的例子作为输入
  • random: 随机选24个content作为输入
  • voting: 随机选24个context,但运行5次,投票的方式选出最优的

zero-shot reasoning on image pairs

区别于VQA中单张图片的问答,该任务特指对多张图像的问答。 现实场景中会存在这样的需求场景,例如用户需要手机相册帮忙回忆下”我在去完埃菲尔铁塔后的第二天,去参观了哪些地标。”,手机相册实现这样的智能需要具有解析多张图片的推理能力。

VisProg完成该任务的时候同样没有训练模型,GPT3得到执行步骤后,使用的是VILT-VQA+python运算。

评估部分: 从NLVR2的开发集随机抽取了250条样本用于构造context的prompt,在完整的测试集上测试。

和用VILT在NLVR数据集上finetune的对比结果如下:

Knowledge tagging

在日常生活中,我们经常需要知道图片中人或物的名字, 例如需要识别名人、政治家,影视作品中某个角色的扮演者等等。为了完成此任务,不仅需要定位出人、物的位置,还需要从外部知识库中查找。

为了使用VisProg解决这一问题,使用GPT-3作为知识的来源,例如问GPT-3生活大爆炸中主要角色的名字有哪些,得到人脸检测坐标后,再通过CLIP分类将人脸和角色名对应起来。

评估部分: 在46张图片中,人工编写了100条指令,需要外部知识标记253个对象实例。通过taggeing和Localization两个任务的判断该任务的效果

prompt: 在该任务上创建了14个in-context的例子

  • Original: 原始的结果
  • Modified: 根据Visual Rationale的结果调整后的结果

Image editing

文生图这一领域由于DALL-E和Stable Diffusion的提出进展非常迅速,但是构造好的prompt和让模型按prompt生成图片还是有很多挑战。 在现实应用中有很多需要图像编辑的场景, 这里举一些例子:

  • 出于隐私保护的考虑,需要将某人的人脸换成一个表情包里的表情做遮挡
  • 为了高亮显示某个人物/物体,需要将其他部分模糊掉
  • 做一些P图,让某人戴上墨镜

在VisProg中,需要先检测/分割出需要编辑的图像区域,再调用stable diffusion生成新的图像做mask的替换

评估部分: 收集了65张图像对应107条指令,人工对效果打分

Prompt: 在该任务上创建了10个in-context的例子

in-content数量的影响

该实验验证的是in-content示例数量在GQA和NLVRv2任务上的消融实验,有几个结论:

  • content examples的数量能提升最终的性能
  • 运行多次后投票能提升最终的性能
  • context examples的数量对性能的影响,在NLVRv2任务上更容易达到的饱和。 原因是NLVRv2任务相对比较简单,需要的步骤比较少,因此用较少的context就能取得不错的效果

视觉原理

视觉原理模块主要有两个作用,分别是错误分析指令调优

错误分析

下图是在四个任务下,根据每一步可视化的结果分析造成错误的归因,有了错误原因可以针对性的调优。 例如在多图问答任务中,将VILT-VQA模型替换为VILT-NLVR模型优24%的性能提升。

指令调优

对于利用知识定位物体和图像编辑任务,实验了调整指令对最终结果的影响,如下图所示,

  • 将IBM的CEO改成最近担任过IBM CEO的指令
  • 明确替换的类别,加上table-merged,修改之前会关注到地毯
  • 将标记煮咖啡的物品,替换为标记煮咖啡的厨房用品。执行步骤会从直接定位煮咖啡的目标,变为,先检测所有的厨房用品,再选择哪个是咖啡机
  • 标记三强争霸赛的冠军改为4位三强争霸赛的冠军

总结

作者期望VisProg能有效的扩展目前人工智能应用范围狭隘的问题,能解决目前AI无法下手需要多步决策的场景。

这篇文章更多的创新在于前瞻性(CVPR2023的截稿日期为2022.11.11,早于2023年4月份开始流行,目前144k star的AutoGPT! 甚至早于2022年11月问世的chatGPT!)和提出了解决通用问题的另一种思路,整个系统的工作原理很容易讲明白。

理解了论文中的Figure.1的图,就会发现是一个简单粗暴有效的方法。甚至我刚开始看的想着可能会有些其他的东西,但算法的设计上确实没太多可以讲的。VisProg将一个具体问题拆解成Python语言的形式很巧妙,因为编程实际上也是一种思维方式, 把一个复杂的问题,拆解成一步步可以用代码解决的问题。 而且简单有效并不是坏事, 这篇更多的是关于实际问题的思考方式, 和作者关于通用人工智能实现方式的尝试。

简而言之,这篇文章及其类似方法提供的思路可能是现有条件下实现通用智能最好的方式!

-------------本文结束感谢您的阅读-------------