前段时间我在帮某团队调试一套多模态内容整理工具,对方提了一个看起来特别基础的问题:“图片里有两个小孩和一条狗,狗在孩子前面还是后面?”我第一反应是目标检测就能搞定,真正动手做才发现,这要拆成好几段:先定位“小孩”“狗”,再计算空间上的前后关系,最后还要按自然语言习惯把答案组织出来。这套流程,正是 VQA(Visual Question Answering,视觉问答)这个方向一直以来的核心命题。
后来我把 VQA 的数据集、算法和评价体系系统梳理了一遍,越看越觉得这个任务比很多人想象得要复杂。它表面上是“看图答题”,实际上同时考验视觉识别、语言理解、空间推理、逻辑判断,甚至常识知识。这篇文章就是那段梳理工作的浓缩版,内容按照“数据集—算法—评估—未来挑战”这条线展开。无论你是刚入门多模态方向的研究者,还是在真实产品里做视觉语言功能的开发工程师,都能从里面找到直接能用的参考。
1. 视觉问答为什么值得单独做一篇综述
1.1 从“图像理解”到“视觉-语言交互”的边界移动
先明确一下什么叫 VQA。它的任务定义很简洁:给模型一张图片和一个自然语言问题,模型输出一个自然语言答案。问题的范围可以很广,包括“图里有几只猫”“左边那个人在做什么”“这辆车是什么颜色的”“这个场景适合带小孩去吗”,甚至“为什么这个人看起来很开心”。
任务定义一简洁,很多人会误以为它是“图像识别 + 文本匹配”的简单叠加。实际上,VQA 和传统视觉任务有本质区别。图像分类只要求模型把整张图映射到类别标签;目标检测要求模型输出位置和类别;图像描述则要求模型像写作文一样把整幅图翻译成一段自然语言。而 VQA 的问题里隐含了一个“关注焦点”,模型必须根据问题语义决定看哪里、忽略哪里,并且答案往往很短,可能只是一个词或一个短语,却要求非常精确。
举个容易理解的对比:图像描述模型可以输出“一个穿红色衣服的女孩站在树下,手里拿着一本书”,这句话即使有一两个细节不够准确,整体观感仍然可以接受。但 VQA 这个场景中,如果问题是“女孩手里拿着什么”,模型只能回答“书”,回答“一本书和一杯咖啡”就是错的。答案短,所以错误非常显性,也正因为如此,VQA 特别适合用来检验模型是否真正理解了视觉内容和语言逻辑的结合点。
它还和文本问答不同。文本问答的答案信息理论上全部藏在文档里,模型要做的是搜索和匹配。VQA 面对的却是像素级的视觉输入,信息不是现成的“句子”,而是分布在空间上的颜色、纹理、形状、物体关系。模型必须先完成感知,再做推理,最终才能输出答案。
1.2 VQA 的普适化对学术界和工业界意味着什么
VQA 不是一个孤立的研究玩具,它的应用价值非常直接。无障碍辅助是最典型的场景:视障用户拍一张照片,问“冰箱里有什么可以吃的”“这是哪个地铁站”“药盒上写的用法用量是什么”,一个能稳定回答这些问题的模型可以极大降低生活障碍。交互式搜索也是大方向,用户不再需要输入精确关键词,而是直接描述“上次去爬山那张照片里,穿蓝色外套的人是谁”。类似的能力在智能客服、内容审核、电商检索、教育和机器人交互里都会用到,本质上都是把“看”和“说”绑定在一起。
正因为应用场景宽,能力跨度大,VQA 才值得单独做综述。我见过不少项目组直接套用图像分类或目标检测的开源模型来做问答,结果在“数量”“关系”“方位”这类问题上频繁翻车。原因不是模型不好,而是没有正确理解 VQA 涉及的能力层次。它要求模型至少具备:对视觉实体的感知能力、对问题结构的解析能力、跨模态对齐能力,以及一定程度的组合推理能力。做理论研究会强调这些层次,做工程同样需要对应的方法论。
2. 数据集演进:从“看图答题”到“反常识推理”
2.1 主流 VQA 数据集一张表看明白
数据集的选取在很大程度上决定了模型的强项和短板。VQA 领域最常用的几个公开数据集,在设计初衷上差异很大,我把它们放在一张表里方便对比:
| 数据集 | 图像来源 | 问题形态 | 规模参考 | 设计要点 |
|---|---|---|---|---|
| VQA v1 | MS COCO 真实图像 | 开放式问答 + 多选题 | 约20万张图像,约61万个问题 | 第一个成规模基准,存在明显语言偏置 |
| VQA v2 | MS COCO 真实图像 | 开放式问答 + 多选题 | 约20万张图像,约110万个问题 | 通过平衡互补图像对减轻语言先验 |
| CLEVR | 3D 合成场景渲染 | 计数、比较、空间关系、逻辑组合 | 约7万张图像,约85万个问题 | 程序化生成,可精确诊断推理链条 |
| GQA | 真实场景图图像 | 多跳关系、组合推理、属性交互 | 约11.3万张图像,约2200万个问题 | 强调场景图结构和多步推理 |
| OK-VQA | COCO 图像 | 需要外部知识才能回答 | 约1.4万张图像,约1.4万个问题 | 考验世界知识与视觉信息融合 |
这张表里,VQA v1 是最早的基准,但它有一个广为人知的问题——语言偏置。研究者发现,有些问题根本不需要看图,只看问题就能猜答案。比如训练集中“香蕉是什么颜色”的答案绝大多数是“黄色”,模型只要回答“黄色”就能拿到很高分数,哪怕图上根本没有香蕉。这类缺陷让后续数据集设计开始刻意规避语言先验。
VQA v2 的思路很直接:为每个问题准备一对互补图像,使得同一个问题在两张图上对应不同的答案。比如一张图上有香蕉,答案是“黄色”;另一张图上没有香蕉,答案可能是“没有”或“不确定”。模型必须真正结合图像内容才能回答,不能靠统计答案分布蒙混过关。这是数据清洗上很关键的一步,直到今天做真实项目时,我都会借鉴这种“问题-图像配对平衡”的思路来构建自己的评估集。
CLEVR 干脆放弃了真实照片,全部使用 3D 渲染出来的合成场景。好处是可以任意控制物体数量、颜色、大小、位置,问题也由模板程序化生成,每一道题的推理步骤都明确可查。想诊断模型会不会数数,就生成一组“有几个蓝色方块”的问题;想看空间推理,就生成“圆锥左边的大球是什么颜色”。CLEVR 的价值在于把组合逻辑拆解得很干净,成为检验模型“推理能力”的标尺。GQA 则试图在真实图像上把这种受控推理变成可能,它借助场景图结构,把图像中的物体、属性和关系显式建模,再基于场景图生成多跳问题。
2.2 数据集的偏差问题如何反向塑造算法
很多人以为数据集只是用来训练的素材,其实数据集的分布特征会直接影响算法设计。语言偏置问题最早让研究者意识到,VQA 不能被当作“图片特征 + 文本特征拼接 + 分类器”那么简单对待。早期的模型校正是简单的加更多视觉特征,但真正有效的方法是改变数据分布:把互补图像成对呈现在训练里,逼着模型去做视觉-语言联合推理。
CLEVR 这种合成数据集又把问题推向了另一个极端。它没有自然分布的语言歧义,所有问题都是逻辑可判定的,因此在这个数据集上表现好的模型不一定在真实图像上同样好。但它至少揭示了一个事实:模型是可以学会“分步推理”的,关键是训练数据能不能把推理链暴露出来。后来的研究者在构建数据时,会更刻意地控制答案类别均衡、问题长度分布、场景复杂度这些因素,目的就是避免模型抄近路。
我的一点体会是,做实际项目时不要盲目相信某个公开数据集的分数。VQA 领域的数据分布和你要部署的真实场景往往有一道很宽的沟:公开数据集里问题类型相对整齐,真实用户问法五花八门,图像质量参差不齐。你至少要在自己的数据上先做一轮人工抽检,统计“问题类型分布”“答案词分布”,再决定要不要在现有模型上做迁移。
3. 算法演进:特征拼接、注意力到预训练多模态大模型
3.1 早期方法:把视觉和文本特征“拧”在一起
VQA 最早的算法路线非常直白。图像部分用深度卷积网络提取一个全局特征向量,文本部分用 LSTM 或 GRU 把问题编码成一个向量,然后把两个向量拼接或相加,送进多层感知机,最后对预定义的答案集合做分类。这个答案集合通常来自训练集里出现频次较高的答案词,数量从几百到几千不等。
这套流程实现简单,训练稳定,但问题也很明显:图像被压缩成一个全局向量之后,空间位置信息损失得很厉害。模型知道图里“有”一只狗,但狗在哪个区域、和椅子是什么相对位置、旁边是谁,这些信息都糊成了一团。LSTM 把问题编码成向量也存在类似问题,长句的关键信息会被稀释。
在那个阶段,研究者的主要精力花在如何设计更好的融合策略上。多模态紧致双线性池化这类方法,尝试用特征外积的高阶交互替代简单拼接,让图像特征和文本特征在更高阶空间里发生关系。效果确实比拼接好,但计算开销太大,而且仍然没有从根本解决“对齐”问题。我当时复现过这类模型,最直观的感受是:它更像一个强大的“模式匹配器”,而不是真正在“理解”。
3.2 注意力时代:先看哪里,再答什么
注意力机制是 VQA 算法演进里最重要的分水岭。它的核心思路是,不要图省事把整张图压成一个向量,而是把图像切分成多个区域特征,计算每个区域和问题关键词语之间的相关性,再根据相关性加权聚合区域特征。
这个概念和应用场景结合得很好:问题里提到“左边的女孩”,视觉注意力就应该落到图像左侧的人形区域;问题里问“什么颜色”,注意力就应该偏向颜色属性明显的区域。堆叠注意力网络把这种机制做了多层叠加,模型可以“多看一眼”再作答。双线性注意力网络则更明确地在视觉区域和文本词之间建一个二阶交互矩阵,把“哪块区域对应哪个词”建模得更细。
这代模型有一个额外好处:注意力权重可以被可视化。开发者能画出一张热力图,看到模型回答问题时在看图像的哪些位置,这对调试非常有帮助。我踩过的坑是,注意力热力图不能全信。有些模型虽然注意力图看起来“盯对了位置”,真正决策时却仍被语言先验主导,比如看到“数量”类问题就偏向回答“2”。注意力只能作为分析工具,不能作为模型可靠性的证明。
CLEVR 带来的推理类问题进一步推动了结构化推理模型的发展。研究人员开始把 VQA 拆成多步:先用问题解析出推理步骤,每一步对应一个视觉操作,比如“找出大球”“判断颜色”“比较位置”,然后组合这些子结果得到答案。这类模型在合成数据集上的提升非常明显,算是把“组合式推理”从概念变成了可训练的结构。
3.3 大模型时代:从分类到生成
大约从 2019 年开始,Transformer 架构全面进入 VQA,并带来两条重要改变。第一,图像和文本不再分别抽取固定向量再融合,而是都被切分成序列化的“词片”或区域 token,输入统一的 Transformer 栈,通过自注意力和交叉注意力完成交互。第二,模型不再是单纯的答案分类器,而是能够生成自然语言答案的生成式模型,甚至可以用指令来约束回答格式。
这个阶段的模型普遍采用“预训练 + 微调”范式:先在千万级甚至亿级规模的图像-文本对上进行对比学习、掩码语言建模、图像文本匹配等多任务预训练,然后在 VQA 数据集上做下游微调。预训练让模型学到了大量跨模态的常识对应关系,比如“苹果”这个词和图像中红绿色的块状物体存在强关联,“跑”这个动词经常出现在动态场景描述里。到了多模态大模型时代,VQA 往往只是众多能力中的普通一项,模型还能同时做图像描述、视觉对话、文本答问和工具调用。
从工程角度看,我的建议很直接:现在做 VQA 类功能,不要想着从零开始训练网络了。以开源预训练视觉语言模型为基础,做领域微调,是性价比最高的路线。你需要投入精力的地方反而不是模型结构,而是数据清洗、提示词设计和评估集构建。另外要注意,生成式模型会带来“幻觉”问题——它可能产生一个语法正确、听起来合理,但图像里根本没有得到验证的答案。这是早期分类式模型里不存在的风险,落地时必须加一层证据验证或置信度判断。
4. 评价指标与测试集:别被高分骗了
4.1 VQA 官方评分里的“人类一致性”逻辑
VQA 的答案不像判断题那样有唯一正确答案,同一个问题,十个标注人可能给出七八种不同说法。比如“这个人的心情怎么样”,可能有人答“开心”,有人答“高兴”,也有人答“挺好”。如果直接用精确匹配来打分,模型输出“高兴”而标注里出现的是“开心”,就会被误判为错误。
官方处理办法是用人类标注分布来给答案加权。基本逻辑是:如果十个标注者里有九个认为这个答案是合理的,那这个答案几乎可以满分;如果只有一个人认可,那这个答案只能拿很小的权重。用一个广泛使用的简化版本说,就是预测答案 a 的得分等于“标注者中选择 a 的人数”与 3 的比值,但上限到 1。这意味着模型并不需要和某个“标准答案”一模一样,而是要让足够多的人类标注者认可。
这套评分机制比较人性化,同时也提醒了工程团队一件事:在真实产品里评估模型时,最好也保留一份“答案合理性池”,由几个人共同标注,而不是拿单一标注文本做硬匹配。否则你优化的可能是“文案对齐”,而不是真正的理解能力。
4.2 VQA-CP 与分布外泛化:为什么换个场景就掉分
常规的基准测试会随机划分训练集和测试集,虽然不会泄露具体题目,但数据分布非常接近。模型在这种测试集上的成绩高,只能说明它记住了分布,不说明它会做推理。为了检验模型的“组合泛化能力”,研究者提出了 VQA-CP,核心操作是把训练集和测试集按照“问题类型 + 答案类型”重新拆分,故意让测试集与训练集统计分布不一致。
实验结果非常残酷:当年很多模型在常规 VQA v2 测试集上能拿到超过 60% 的准确率,迁移到 VQA-CP 分割后直接掉到 40% 上下。也就是说,模型对“训练集中最常见的答案”很敏感,一旦场景换血,它引以为傲的分数立刻归零。这个问题直到今天也没有完全解决,只是预训练大模型凭借更广泛的世界知识,掉分幅度变得小一些。
这件事对我做项目评估的启发很大。我现在构建模型验证集时,都会专门留一个“分布外小集”,比如换掉拍摄风格、换掉产品外观、换掉问题措辞。如果模型在分布外小集上的分数比同分布集低很多,我会直接判定这个模型尚未达到安全上线标准。只看一个总准确率数字,是很容易被短期的同分布性能蒙骗的。
4.3 选择题指标是“看起来很美”的数字
VQA 的数据集里经常附带多选题形式,给模型一组候选选项,模型从中选择正确答案。多选题的好处是评估方便、自动化程度高,但它的分数很容易被高估。一方面,候选选项本身暴露了答案范围:模型不需要凭空生成答案,只需要排除错误项;更关键的是,选项里往往存在语言先验,模型即使不看图也能通过常识选对。比如问题“桌上放的是什么水果”,选项是“香蕉、苹果、电脑”,机器完全不看图片也可能蒙对。
所以在实际工作中,我建议同时报告“开放答案准确率”和“选择题准确率”,不要只信其中一个。开放答案更贴近真实使用场景,但答案处理起来麻烦;选择题便于调试,但分数虚高。把两者摆在一起对比,才能看出模型的真实水平。另外,开放答案评估还要注意大小写、时态、同义词这些细节,是否做文本规范化,会直接影响最终数字。
5. 未来挑战与落地建议:从论文到真实项目
5.1 组合式外推:记答案和做推理是两码事
VQA 最核心的未来挑战仍然是组合式外推。所谓组合式外推,就是模型是否能在没有见过某种组合的情况下,把已经学会的视觉概念、语言概念、推理规则重新组合出来。比如训练数据里见过“蓝球”和“方桌”,但从未见过“蓝桌上放球”,模型能不能理解这话描述的场景?这个问题听起来简单,实际却很难。
单纯增加训练数据并不能根本解决组合外推问题,因为真实世界里的组合可能性几乎是无限的。业界普遍认为,未来需要在模型中补充更强的符号化、结构化推理模块,或者在训练数据里系统性地暴露更多组合模式。多模态大模型已经在这个方向上做得比老方法好很多,但依然没有完全跨越“记忆”与“推理”之间的鸿沟。这也是我持续关注这个领域的原因——每过一段时间,就会看到模型又在某些组合上翻车。
5.2 偏差、偏见与解释性:多模态系统要过信任关
VQA 系统中还存在两类难以量化但绕不开的问题。第一类是数据偏见,比如模型看到“护士”词和图中女性形象关联太强,看到“厨房”就更容易回答女性,这类偏见在训练之前就已经嵌在语料和数据分布里。第二类是解释性不足,注意力图只能告诉我们“模型在看哪”,不能告诉我们“模型究竟基于什么做出决策”。
对于真实产品,这两类问题都要提前设计应对策略。比如在做数据采集时,刻意检查属性分布的均衡性;在发布前,用小批量人工测试检查敏感场景的答案是否稳定;如果模型给出低置信度答案,系统可以拒绝回答,而不是强行输出一个可能冒犯用户的结论。技术不是孤立的,它一旦进入真实环境,就必然要面对社会层面的审视。
5.3 真实项目里跑通 VQA 的几条实操建议
落到具体项目里,我有几条反复用过的经验可以分享。
第一,从预训练视觉语言模型起步,不要从头训练。除非你有非常明确的领域封闭需求,否则在通用大模型基础上做领域数据微调,成本更低,稳定性更好。微调前先小批量实验,确认你的场景是否真的需要改权重,有时候换提示词就能解决。
第二,根据业务定义答案空间。如果业务只关心有限几个类别,用受控分类式输出更稳定;如果需要自由回答,使用生成式模型,但一定要配套置信度阈值和证据校验。自由生成很灵活,可代价是可能一本正经地胡说八道。
第三,评估要按问题类型拆开看。总数准确率只能反映平均水平,按“物体识别、数量、颜色、空间位置、关系比较、常识知识”这几类分别统计,才能快速定位模型短板。我通常把一个模型的评估表做成雷达图,短板一目了然。
第四,反事实验证值得放进测试流程。构造一些图像-问题对,使答案高度依赖某个关键视觉属性,然后把属性替换掉,比如把图中的“黑猫”替换成“白猫”,看模型的回答是否跟着变化。如果模型仍然坚持旧答案,说明它在走捷径,没有真正利用图像。
第五,文本规范化处理必须提前做。统一大小写、去掉首尾空格、把数字做规范化、建立同义词表,这些工作看起来不起眼,却能直接影响最终准确率三五个点。很多模型“看起来分数低”,其实只是答案文本处理和标注口径不一致造成的。
5.4 关于 VQA 综述的扩展方向
如果读者想继续深入,可以做两件事。一是系统阅读近几年多模态大模型相关的论文,观察 VQA 如何从一个独立任务变成一个基础能力的评测子集;二是自己动手在公开数据集上复现一次“基线模型→注意力模型→预训练模型”的演进过程,记录每个阶段在相同测试集下的变化。只有亲手跑过一遍,才会理解语言偏见、分布外泛化这些抽象概念在真实代码里有多明显。
我在多次项目迭代里的体会是,VQA 的进步从来不是某个单一模型结构的功劳,而是数据集、评价指标、训练范式三者互相拉扯出来的。你训练模型时所做的每个小决定——数据怎么采样、问题怎么写、评估怎么切分——最终都会以某种形式体现在模型行为里。
最后再说一个小技巧。评估 VQA 模型时,不要只看测试集准确率曲线,要看“模型在哪些问题上答错了,以及标注者分歧有多大”。一个让多个标注者都迟疑的问题,模型答错不一定是缺陷;一个大家都意见一致的问题,模型还答错,那才是真正的严重错误。把这两类错误分开统计,你的模型迭代方向会清晰很多。