视觉问答VQA可能是多模态方向里最能反映一个模型“是否真懂”的任务了。它给模型一张图、一句自然语言问题要求模型输出一个开放式的短答案。可别小看这一问一答里面牵扯到目标检测级别的视觉细粒度理解、指代消解级别的语言理解以及把两者对齐起来的跨模态推理。这篇综述性质的笔记我按数据集演进、算法路线、评估体系和未来挑战四个维度来梳理同时会穿插一些自己复现和调模型时踩过的坑。不管你是刚入门想做第一个VQA baseline还是已经训练过几版模型想系统捋一捋这个领域的脉络这篇内容应该都能给你一张比较完整的“作战地图”。1. VQA到底是什么任务定义与价值坐标1.1 任务定义与输入输出VQA的任务形式很简洁输入一张图像$I$和一个自然语言问题$Q$模型输出一个答案$A$。这里强调“开放式”三个字是因为回答空间不是预先限定的类别集合模型需要从整个词表里选出合理的短答案。常见变体包括多项选择从候选答案里选、填空式把问题变成带空格的句子以及计数类输出具体数字。这个任务和图像描述Image Captioning有本质区别。图像描述是“看图说话”模型决定说哪部分内容VQA则是“按需回答”模型必须站在提问者的角度去筛选图像里的信息。举个很简单的例子图里有一只猫坐在红色的沙发上如果问题是“猫在什么上面”描述模型可能说“一只猫坐在红色沙发上”但VQA模型必须精确聚焦“沙发”这个答案而不是把整句描述复述出来。这个“意图对齐”的过程是VQA区别于其他多模态任务的灵魂。1.2 为什么这个任务很难跨模态对齐的痛点VQA难在它同时踩了三个坑视觉理解的细粒度、语言理解的歧义性、模态对齐的精确性。分类任务只需要知道“图像里有什么”VQA还要知道“图像里哪个区域跟当前问题相关”。语言上“左边那辆车”这种描述需要模型具备空间方位理解如果问题问“哪个颜色更显眼”模型还得对“显眼”这种主观词建立视觉上的对应。我自己的感受是真正决定模型上限的不是单项能力的强弱而是三项能力的耦合程度。很多模型在单一模态benchmark上表现很好一到VQA就露馅正是因为语言和视觉没有在细粒度层面完成对齐。一个典型的失败案例问题问“图里有几只鸟”模型可能因为训练数据里“几只”问题总是伴随大量鸟类的图片直接回答“三只”完全忽略当前图像里其实一只鸟都没有。这类错误暴露的正是语言先验对视觉证据的压制。1.3 真实应用场景VQA从论文走向工程最直接的应用是无障碍辅助。给视力障碍者拍摄画面模型用语音回答“前面有没有障碍物”“货架上最贵的商品多少钱”这比单纯输出一段图像描述实用性高得多。其次是智能助手和图像检索用户用自然语言描述“帮我找一张去年夏天在沙滩拍的、有人举着冲浪板的照片”如果搜索引擎具备VQA能力就能直接定位。还有自动驾驶场景里的交互问答“当前路口的红绿灯状态是什么”“右侧车道有没有车辆正在靠近”这类问题在辅助驾驶的人机交互层有明确需求。电商领域也用得上根据商品图回答“这件衣服有绿色的吗”“裤子的版型是直筒还是修身”直接提升检索和导购的体验。2. 数据集演进从“看图说话”到“结构化推理”2.1 早期数据集与基础思路早期的VQA数据集基本脱胎于图像描述任务先收集一批图片再让人看图提问、看图作答。这种方式的优点是问题自然、贴近真实用户习惯缺点是成本高、主观性强同一张图不同人的问题可能差异极大。标注规范一开始也很松散答案里混着大小写、单复数、冠词、同义词给后续评估带来不少麻烦。我记得自己第一次处理这类数据时最头疼的就是答案归一化。光是把“red”“Red”“reddish”“红色”规整成统一形式就要处理一大堆边界case。后来社区的通用做法是统一转小写、去掉句末标点、数字转阿拉伯写法、同义词映射到规范形式。这个环节看起来琐碎但直接影响最终准确率指标差一两个点都很正常。2.2 大规模数据集与balanced策略随着VQA热度上升主流数据集规模从几万问答对扩展到几十万甚至上百万。问题类型也丰富起来除了简单的“是什么颜色”“有没有猫”还加入了“哪个更大”“图中有几个杯子”这类需要计数和比较的问题。但大规模真实数据带来一个著名问题语言先验过强。统计一下训练集就会发现答案“是”和“不是”占了很大比例颜色类问题里“黑色”“白色”出现频率明显偏高。模型只要学会这些统计规律不认真看图也能蒙对不少。针对这个问题后续的balanced版本在验证集和测试集构建上下了功夫重新采样让每个问题类型下的答案分布尽量均衡。这样操作之后盲猜基线明显下降模型的真实视觉理解能力才真正被检验出来。我自己做实验的时候对比过用不平衡的旧验证集和平衡的新验证集评测同一个模型准确率能差7到10个点可见评测协议对结论的影响有多大。2.3 诊断型数据集与可控合成真实图像数据虽然自然但难以控制变量。你不知道模型答对了是因为真懂空间推理还是因为恰好见过类似布局的图。这推动了合成图像数据的出现。程序化生成的方式可以精确控制物体数量、颜色、位置、关系从而单独测试某一项能力。比如把问题全部模板化为“什么颜色的物体在金属物体的左边”模型如果做得好说明空间关系理解是过关的如果做不好就能精准定位短板。合成数据集的局限也很明显图像分布与真实场景差距较大模型在合成数据上表现好迁移到真实图像可能会掉点。所以业界通常用它做“诊断”而不是做“训练集”重点观测模型在可解释的维度上的表现曲线而不是追求绝对分数。场景图类数据则是另一个补充维度它不仅标注物体还标注物体之间的关系“坐在上面”“旁边”“比…大”为更复杂的问题生成提供结构化基础。2.4 数据集综合对比数据集类型图像来源问题来源标注成本核心优势主要短板早期众包数据真实图像人类自由提问高自然分布、贴近真实答案噪声大、先验偏置强大规模开放数据真实图像众包模板混合中高问题类型丰富、数量大长尾答案多、语言先验明显平衡协议版本真实图像重采样原问题子集中弱化先验、评测公平样本利用率下降合成诊断数据程序生成模板生成低能力可控、自动标注迁移性受限、缺乏真实噪声场景图数据真实图像基于关系模板高支持结构化推理问题多样性有限选数据集要按阶段来跑基线验证流程用大规模开放数据验证模型的推理能力用合成诊断数据做上线前评测则一定要准备一套平衡且跟目标场景接近的自测集不能只迷信公开榜。3. 算法路线从拼接式基线到统一多模态预训练3.1 早期拼接式基线VQA最早的算法思路简单粗暴双塔式结构视觉塔用卷积网络提取整图特征语言塔用LSTM/GRU编码问题两个特征拼接到一起再过几层全连接最后输出答案类别的概率分布。这类baseline实现快、训练稳作为第一个跑通的模型非常合适。但它有个硬伤拼接特征时已经丢失了“图像哪里跟问题相关”的信息模型只能在全局层面做粗糙匹配。我复现这类模型的时候发现它的表现很像一个“半盲”模型颜色和存在性问题还能答对一些但一进入空间关系、计数、比较类问题就崩盘。原因不难理解整图特征里多个物体的信息混在一起全连接层没有办法做细粒度的定位。所以这个阶段的工作证明了两件事VQA确实需要跨模态注意力以及简单拼接是走不远的。3.2 注意力机制与双线性融合注意力机制是VQA算法路线的第一次实质突破。核心思路是让模型根据问题去加权图像区域而不是把整图特征一刀切。具体来说视觉特征不再是单一全局向量而是一组区域特征每个区域对应图像上的一个候选框或网格注意力模块根据问题向量计算每个区域的权重再做加权求和。这样模型就拥有了“该看哪里”的能力。紧接着又发展出双线性融合方向。问题特征是词向量的组合视觉特征是区域向量的组合简单的拼接或加权求和无法充分建模二阶交互。双线性池化把两个模态的特征做外积但外积的维度爆炸让人无法直接使用。于是出现了各种紧凑方案先把特征随机投影到低维空间再做逐元素乘法用傅里叶变换近似外积或者使用分块双线性池化。实践下来这类结构在同等计算量下能比拼接式高3到5个点性价比很明确。值得提醒的是注意力机制也不是万能的。如果训练数据里语言先验过强注意力会退化成一个“偷懒”的模块它学到的不是基于视觉证据的定位而是基于问题文本的惯性加权。你自己做实验时如果发现注意力热力图总集中在相似区域不管图怎么换就要警惕是先验在主导而不是视觉理解在主导。3.3 预训练范式的统一近几年的主流VQA方案几乎都被统一到了“预训练微调”范式下。模型先在大规模图文对数据上做自监督预训练学习图像和文本之间的对齐关系再在VQA任务上做监督微调。预训练任务通常包括掩码语言建模遮蔽文本中的词从图像上下文预测和图文匹配判断图文对是否匹配。通过这些任务模型在进入VQA之前就已经具备较强的跨模态对齐能力。这个转变意味着什么以前我们是在VQA数据集上从零学对齐数据量有限学到的对齐泛化能力弱现在对齐能力在预训练阶段就大规模学会了VQA微调只需要学习“如何根据问题格式输出答案”。实际操作中预训练模型做VQA微调收敛很快通常几个epoch就能达到很好的效果而且对下游标注量的需求明显下降。代价是训练成本高显存和算力要求上一个台阶中小团队要复现完整预训练流程并不现实通常直接使用公开的预训练权重。3.4 推理增强与外部知识注意力机制和预训练解决的是“看哪、齐什么”的问题但VQA里还有一部分问题需要多步推理。比如“图中有几个蓝色的圆柱体”需要先筛选蓝色物体、再筛选圆柱体形状、最后计数三个步骤缺一不可。早期的注意力模型把这类复合问题当做一个整体映射效果自然不好。于是有工作尝试把问题解析成程序模块化地执行解析器把问题分解成多个子操作每个操作对应一个神经模块模块串联完成推理。这个思路跟人类解复合问题的逻辑很像可解释性也更好。外部知识的引入让VQA从纯视觉推理扩展到常识推理。有些问题光看图答不出来还需要知道“斑马是条纹的”“斑马通常生活在草原”这类知识。这类方案一般用检索方式从知识库或者知识图谱中找出相关事实再把事实特征与视觉、文本特征融合。我自己体验下来外部知识对开放域常识题提升明显但也引入了新的难题知识检索的准确率会直接影响最终答案知识本身和图像信息矛盾时模型的决策机制需要额外设计。4. 评估指标与评测陷阱acc背后藏了多少信息4.1 开放域准确率的计算协议VQA最常用的评估指标是开放域准确率但它的计算方式有几个容易被忽视的细节。首先是“多标注者一致性”一个答案如果被至少两个独立标注者认同就视为正确如果只有一个人标注则按比例计分或直接剔除。这种设计的目的是减小标注主观性带来的噪声。其次是答案预处理小写化、移除冠词、数字归一、同义词映射都必须在评测前完成否则会人为压低准确率。我自己在评估时吃过亏模型预测了“elephant”但标注里只有“African elephant”和“elephant”我的词表过滤逻辑把“elephant”过滤掉了导致预测被判错。后来养成一个习惯先做答案集合并和归一化再跑评分脚本顺序错了结果会很误导人。4.2 语言先验与盲猜基线评测VQA模型时只看总体准确率远远不够。一个模型可能总体准确率55%但其中大部分分数来自语言先验而不是视觉理解。社区的标准做法是引入“盲猜基线”把图像输入全部置零或屏蔽只凭问题文本预测答案。这个基线的分数代表“没有视觉也能答对多少”。如果我们的模型分数只比盲猜基线高一点点说明视觉信息并没有被真正利用。平衡评测协议出现后盲猜基线被大幅压低正是为了逼模型依赖视觉证据。我建议大家在论文复现或项目汇报里除了报总体acc至少额外报三个数盲猜基线、按问题类型拆分的分组准确率、以及去掉高频答案后的长尾准确率。这三组数字组合起来能清晰反映模型是“真懂”还是“背题”。4.3 分组统计与错误模式分析分组统计是定位模型短板最有效的手段。常见分组维度包括问题类型计数、颜色、存在性、空间关系、答案长度、是否涉及推理、是否覆盖训练集常见组合。一个总体acc 65%的模型可能计数类只有35%颜色类70%存在性类80%。如果不拆开看你根本不知道下一步该优化哪块。还有一个被讨论得越来越多的评估维度幻觉检测。模型输出一个看起来合理的答案但图像里根本没有对应证据这在开放生成模型里尤其严重。评估时需要专门标注“答案是否可被图像证据支持”而不是只看字面匹配。这块目前还没有统一标准但做实际项目时非常值得自己建一套小评测集专门用来跟踪幻觉率的变化。5. 踩坑笔记与训练实操建议5.1 数据处理的经典大坑数据侧最典型的问题有三个。第一是数据泄露同一张图像的不同问题被切分到训练集和验证集两边模型在训练时见过同样的图像区域验证分数虚高。修正方式是按照图像ID做分割保证训练/验证/测试的图像集合互不重叠。第二是答案词表漂移训练集和验证集的答案分布不一致低频答案在验证集里出现但不在词表中直接无法预测。建议在构建词表时保留至少出现两次的答案并做好频次统计。第三是问题和答案的格式不统一全角半角标点、中英文标点混用、多余空格等都会在预处理阶段制造隐性噪声。5.2 模型训练与收敛经验训练VQA模型时优化器设置比结构设计更容易踩坑。使用预训练权重时通常要给预训练部分设置较小的学习率如2e-5量级而新初始化的分类头或融合层使用较大学习率如5e-5到1e-4用分层学习率策略分别控制。全量统一用一个学习率的后果是预训练特征被扰动太大模型容易过拟合到VQA训练集验证集上反而变差。输出层的设计也值得讨论。开放式答案既可以当多分类做也可以当多标签多分类做。多标签的做法把答案词表中所有与图片相符的答案都标为正例比如某个图像既可以被回答“猫”也可以被回答“橘猫”两个答案都合理多标签可以让模型学到这种兼容性。实际训练中多标签配合二进制交叉熵损失在VQA上的表现通常优于单标签交叉熵尤其适合答案存在同义词或粒度差异大的场景。5.3 评测复现的注意点很多人复现论文结果总是差那么一两个点问题往往不在模型结构而在评测细节。第一是多次预测投票训练好的模型在预测时使用greedy decoding还是beam search结果会有波动论文默认的推理策略一定要对齐。第二是模型集成论文报告的分数可能来自多个seed或多套初始化权重的集成结果单模型分数自然会低一点。第三是任务头细节分类头的dropout比例、答案词表大小、是否过滤低频答案都会造成差异。做对比实验时最好先固定一套统一的预处理和评测脚本再测不同模型结构否则很容易把预处理差异当成模型差异。5.4 小样本与跨语言场景的补充经验如果目标场景不是英文问题会更多。中文VQA需要额外处理分词、繁体简体映射、中英数词统一等问题。答案归一化时中文同义词合并比英文更麻烦“车辆”和“车”、“轿车”和“小汽车”语义重叠但文字完全不相似。我在中文场景上的经验是除了字面归一还要建立一个业务相关的答案等价表把工作中实际会遇到的同义表达预先合并。至于小样本场景预训练模型加少量标注微调已经比从零训练靠谱得多但如果目标语言完全没参与过预训练效果衰减会非常明显需要先做跨语言对齐或轻量预训练适配。6. 未来挑战与值得跟的方向6.1 组合泛化与系统能力当前VQA模型最被诟病的短板是组合泛化。模型在训练集覆盖过的“组合”上表现很好但遇到新的组合方式就明显下降。比如训练集里见过“蓝色方块在红色圆柱左边”也见过“黄色圆柱在绿色方块右边”但模型没见过“黄色方块在蓝色圆柱左边”这种组合推理能力就失效了。这个问题的本质是模型在记忆场景组合而不是在掌握组合性的语言-视觉规则。合成诊断数据集已经把这个问题暴露得很充分但要真正解决还需要系统性的思路可组合的中间表示、能分解并重组的推理模块、以及更强的反事实训练策略。我判断未来几年这个方向会是VQA算法创新的主战场谁能在组合泛化上做出突破谁就能把VQA带进下一个阶段。6.2 幻觉与可信推理幻觉问题是所有生成式多模态模型的共病。模型在不确定时会生成一个语法正确但完全没有视觉依据的答案。在VQA场景里这比分类错误更危险因为用户很容易把流畅的答案当成可信的答案。提高可信性的思路包括显式训练模型在证据不足时输出“不确定”、设计校准机制让模型置信度尽量匹配真实正确率、以及在后处理环节增加证据验证模块。现阶段评测基准虽然还很不统一但任何要做落地的VQA项目都应该提前建立自己的幻觉评测集把“无中生有”的比例当作核心上线指标之一。光看准确率一个准确率高但会在关键场景乱答的模型是不敢交给用户去用的。6.3 数据效率与持续学习VQA对标注数据的依赖依然很高。人工问答对标注成本高、主观性强多语言、多领域的扩展更加昂贵。所以少样本VQA、零样本VQA、以及让模型通过主动提问来降低标注成本都是很有价值的研究方向。持续学习方面VQA模型上线后会不断遇到新场景、新问题类型模型需要在不遗忘旧知识的前提下适应新分布这也是工程落地绕不开的课题。6.4 多模态融合的边界拓展VQA的定义也在不断外延。视频VQA要求模型理解时间维度的动作和事件3D场景问答涉及空间深度和遮挡关系文档类VQA则混合了版面结构、图表和文本信息。每一类新模态都会带来看得见的任务定义变化和看不见的评估难点。我自己比较看好文档类问答和视频问答它们的商业价值明确测试协议也相对成熟具备从研究走向产品的清晰路径。如果让我给刚入坑这个方向的读者一条最实在的建议我会说不要只盯排行榜上的总体准确率先把案例按问题类型拆开看跑通一个简单基线再把评测脚本吃透然后再去追赶模型结构上的新东西。这个领域表面看很卷其实还远没到真正解决核心问题的程度很多机会恰恰藏在那些“准确率看得过去、但细看错误很蠢”的case里。多做错误分析比多换模型更能帮你找到下一步真正的突破点。
阅读完成 · 觉得有帮助?