视觉问答VQA综述:从数据集、算法演进到评估与落地挑战 前段时间我在帮某团队调试一套多模态内容整理工具对方提了一个看起来特别基础的问题“图片里有两个小孩和一条狗狗在孩子前面还是后面”我第一反应是目标检测就能搞定真正动手做才发现这要拆成好几段先定位“小孩”“狗”再计算空间上的前后关系最后还要按自然语言习惯把答案组织出来。这套流程正是 VQAVisual Question Answering视觉问答这个方向一直以来的核心命题。后来我把 VQA 的数据集、算法和评价体系系统梳理了一遍越看越觉得这个任务比很多人想象得要复杂。它表面上是“看图答题”实际上同时考验视觉识别、语言理解、空间推理、逻辑判断甚至常识知识。这篇文章就是那段梳理工作的浓缩版内容按照“数据集—算法—评估—未来挑战”这条线展开。无论你是刚入门多模态方向的研究者还是在真实产品里做视觉语言功能的开发工程师都能从里面找到直接能用的参考。1. 视觉问答为什么值得单独做一篇综述1.1 从“图像理解”到“视觉-语言交互”的边界移动先明确一下什么叫 VQA。它的任务定义很简洁给模型一张图片和一个自然语言问题模型输出一个自然语言答案。问题的范围可以很广包括“图里有几只猫”“左边那个人在做什么”“这辆车是什么颜色的”“这个场景适合带小孩去吗”甚至“为什么这个人看起来很开心”。任务定义一简洁很多人会误以为它是“图像识别 文本匹配”的简单叠加。实际上VQA 和传统视觉任务有本质区别。图像分类只要求模型把整张图映射到类别标签目标检测要求模型输出位置和类别图像描述则要求模型像写作文一样把整幅图翻译成一段自然语言。而 VQA 的问题里隐含了一个“关注焦点”模型必须根据问题语义决定看哪里、忽略哪里并且答案往往很短可能只是一个词或一个短语却要求非常精确。举个容易理解的对比图像描述模型可以输出“一个穿红色衣服的女孩站在树下手里拿着一本书”这句话即使有一两个细节不够准确整体观感仍然可以接受。但 VQA 这个场景中如果问题是“女孩手里拿着什么”模型只能回答“书”回答“一本书和一杯咖啡”就是错的。答案短所以错误非常显性也正因为如此VQA 特别适合用来检验模型是否真正理解了视觉内容和语言逻辑的结合点。它还和文本问答不同。文本问答的答案信息理论上全部藏在文档里模型要做的是搜索和匹配。VQA 面对的却是像素级的视觉输入信息不是现成的“句子”而是分布在空间上的颜色、纹理、形状、物体关系。模型必须先完成感知再做推理最终才能输出答案。1.2 VQA 的普适化对学术界和工业界意味着什么VQA 不是一个孤立的研究玩具它的应用价值非常直接。无障碍辅助是最典型的场景视障用户拍一张照片问“冰箱里有什么可以吃的”“这是哪个地铁站”“药盒上写的用法用量是什么”一个能稳定回答这些问题的模型可以极大降低生活障碍。交互式搜索也是大方向用户不再需要输入精确关键词而是直接描述“上次去爬山那张照片里穿蓝色外套的人是谁”。类似的能力在智能客服、内容审核、电商检索、教育和机器人交互里都会用到本质上都是把“看”和“说”绑定在一起。正因为应用场景宽能力跨度大VQA 才值得单独做综述。我见过不少项目组直接套用图像分类或目标检测的开源模型来做问答结果在“数量”“关系”“方位”这类问题上频繁翻车。原因不是模型不好而是没有正确理解 VQA 涉及的能力层次。它要求模型至少具备对视觉实体的感知能力、对问题结构的解析能力、跨模态对齐能力以及一定程度的组合推理能力。做理论研究会强调这些层次做工程同样需要对应的方法论。2. 数据集演进从“看图答题”到“反常识推理”2.1 主流 VQA 数据集一张表看明白数据集的选取在很大程度上决定了模型的强项和短板。VQA 领域最常用的几个公开数据集在设计初衷上差异很大我把它们放在一张表里方便对比数据集图像来源问题形态规模参考设计要点VQA v1MS COCO 真实图像开放式问答 多选题约20万张图像约61万个问题第一个成规模基准存在明显语言偏置VQA v2MS COCO 真实图像开放式问答 多选题约20万张图像约110万个问题通过平衡互补图像对减轻语言先验CLEVR3D 合成场景渲染计数、比较、空间关系、逻辑组合约7万张图像约85万个问题程序化生成可精确诊断推理链条GQA真实场景图图像多跳关系、组合推理、属性交互约11.3万张图像约2200万个问题强调场景图结构和多步推理OK-VQACOCO 图像需要外部知识才能回答约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 模型时不要只看测试集准确率曲线要看“模型在哪些问题上答错了以及标注者分歧有多大”。一个让多个标注者都迟疑的问题模型答错不一定是缺陷一个大家都意见一致的问题模型还答错那才是真正的严重错误。把这两类错误分开统计你的模型迭代方向会清晰很多。