多模态大模型(VLM)越来越能“看图说话”,但幻觉问题始终绕不过去。所谓幻觉捷径,就是模型在没有足够视觉证据时,只靠语言先验把答案猜出来。比如你给一张“大象站在厨房”的图片,问“大象在哪里”,模型如果回答“野外”,它并不是在推理,而是在背训练数据里的共现规律。今天想聊的这篇论文,核心主张就是切断这条捷径,让视觉推理真正依赖证据,而不是语言统计规律。适合谁看?如果你做多模态模型评测、VLM幻觉治理,或者想让问答系统给出可验证理由,这篇内容应该能帮你理清思路。下面我从问题定义、方法设计、实验验证、落地边界四个方向拆开讲。
1. VLM 幻觉问题到底卡在哪:语言先验是怎么变成“捷径”的
1.1 先理解多模态大模型的推理链条
VLM 的处理链路通常是:图像编码器把图片转成视觉特征,文本编码器负责问题,中间经过跨模态融合,最后用语言模型生成答案。这条链路看起来是“看图说话”,但实际生成方式还是自回归的,也就是一个 token 一个 token 往下预测。
这里有个容易被忽略的问题:自回归生成并不是先完整“看完图”再写答案,而是每一步都根据当前已生成的文本和全局视觉特征去预测下一个词。当视觉特征提供的证据不足,或者图像信息在融合过程中被压缩、干扰时,语言模型部分就会自动用最顺口的文本补全答案。这种补全不是基于图像,而是基于训练语料里的统计规律。
所以“视觉推理”这个词听着很可靠,实际执行时却经常退化成“视觉启动 + 语言填空”。
1.2 语言先验为什么会成为捷径
先验其实是模型不可避免的一部分。模型在训练时见过大量图文语料,知道“大象”通常出现在“草原”“野外”“动物园”这些场景里。如果问题问的是“大象在哪里”,模型对“野外”这类答案的预期概率本来就高。
问题在于,模型分不清这一次的答案应该来自图像,还是来自记忆。当图像区域不明显、目标太小、存在遮挡,或者场景和常见组合不一致时,模型会倾向于选择“概率最高”的答案,而不是“图像实际支持”的答案。这就是论文里所说的捷径:它让模型不用真正看图像也能蒙对一部分问题。
为什么叫捷径?因为训练目标通常只评价最终答案是否正确,并不评价模型是否看到了正确的区域。只要训练集里“大象在野外”这类样本足够多,模型就会学到一条省力的决策路径:遇到类似问题,直接按语言先验输出,而不是去图像里精确定位。
1.3 这个“捷径”为什么不容易发现
很多 VLM 在常见测试集上准确率很高,但换个环境就开始出错。问题在于,常见测试集的答案分布往往和训练语料高度一致,模型靠先验就能答对不少题,整体分数看不出异常。
真正能暴露捷径的,是反事实样本。比如把沙发放在沙漠里,问“这张图片的拍摄地点更可能在哪个环境”;或者把一只蓝色的猫放在草地上,问“猫是什么颜色”。如果模型还能给出“猫是橘色”“地点是客厅”这类常见但和图像不符的答案,说明它根本没有依赖视觉证据。
我在实测时会用很笨的办法:先准备 20 到 30 张“常见组合被打破”的图片,让模型回答并给出置信度。如果模型错误答案的置信度还很高,那基本可以断定它已经走上了语言先验的捷径。这个诊断阶段不需要复杂训练,只需要一个能输入图片的开源多模态模型和一批反事实样本。
2. 论文想解决什么问题:从“像人一样看”到“按证据回答”
2.1 核心目标不是消灭先验,而是约束先验的使用方式
稍微想一下就知道,完全消灭语言先验既不可能,也没必要。人类也会用常识推断,比如看到“沙滩上有一只企鹅”,即使图片像素不高,也能推测“这可能是错误摆放或后期合成”。常识和视觉证据需要配合。
所以这篇工作的目标,不应该被理解成“让模型变成纯视觉机器”,而是给先验加约束:先找到证据,再决定要不要用它;证据不支持时,宁可降低置信度或拒绝回答,也不能硬猜。
这是我读这类论文时最在意的判断点:方法有没有把“证据”变成可检查的中间产物。如果没有,那它只是在改答案分布,还是在绕捷径。
2.2 证据的定义:哪些信息才算视觉证据
论文里反复出现的关键词是证据。但证据不是一个模糊概念,它需要具备可定位、可验证、和答案存在因果对应三个特点。
- 可定位:答案要能对应到图像里的某个区域、物体或关系。
- 可验证:另一个模型或标注者能够根据图像确认这个区域确实存在。
- 因果对应:证据对答案有真正的支撑作用,而不是“出现了一下”就算相关。
举个例子。问题是“照片里人物的帽子是什么颜色”。如果模型输出“红色”,但没有任何区域标注,这个答案就无法验证。如果模型输出一个目标框,框住人物的头部,并标明“帽子区域”,那么这就是一条可核验的证据。
更有意思的是“相关性”和“因果性”的区别。图片里正好有一面红色旗帜,模型拿红色旗帜当“红帽子”的证据,这就属于相关性误用。真正有效的证据必须落在帽子区域,而不是随便一个红色物体。这类细节决定了证据监督训练的质量。
2.3 这类方法与常规微调的本质区别
常规微调通常只调整答案分布:给模型更多“问题-正确答案”对,让它记住这些模式。这样做当然能提升特定任务准确率,但模型并没有被迫学习“证据如何使用”。
这类方法则把监督信号从“答案层”下沉到“推理过程层”。模型不能只输出一个答案,还要输出它根据图像哪些区域、哪些属性得出这个答案。更严格的做法是在训练时把证据区域作为额外监督,模型不仅要答对,还要在对应位置给出有效的证据。
换句话说,常规微调是在教模型“背更多题”,而这类方法是在教模型“先把题目的依据找出来”。前者更适合提升熟悉场景表现,后者更适合做稳定、可解释、抗分布变化的推理。
3. 方法拆解:让视觉推理依赖证据的主流设计思路
3.1 视觉证据的显式提取
第一种常见做法是先用视觉模型把图像中的候选物体、区域、属性提取出来。这些视觉模型可以是目标检测、分割模型,也可以是带区域描述的视觉编码器。提取结果通常会转成结构化文本,再送进大模型。
这样做的好处是,模型不用自己在大图里漫无目的地找信息,而是拿到一批“可能相关的候选证据”。比如你问“图中有几个人”,先行的检测器可以输出几个 person 框,模型直接在这些框的基础上做计数。如果检测器漏了一个被遮挡的人,模型也可能跟着漏数。
所以显式提取的关键不是“跑通就行”,而是检查检测器的召回率。我一般会把检测器的置信度阈值设置在 0.5 到 0.9 之间,太低会混入大量噪声,太高会漏掉有效证据。具体阈值要看任务,计数任务更看重召回,属性识别更看重精度。
3.2 推理链路上的干预
第二种思路是在模型回答之前,强制它先输出证据链。类似“图中有一个人在跑步,跑步者穿着黄色上衣,因此答案是人”。这类方法也被称为视觉思维链,或者更广义的可验证推理。
但这里有一个容易踩的坑:模型完全可能一边编造证据一边给出答案。所谓“伪证据”就是模型说“我看到了一只狗”,但图像里根本没有狗,只是它觉得这个问题通常和狗有关。所以仅仅在提示词里加一句“请先描述图片再回答”是不够的,必须在训练或后处理时验证证据是否真的存在。
我在工程上通常会做两层检查:第一层是格式检查,模型输出的证据区域是否落在图像范围内,属性描述是否完整;第二层是语义检查,可以用一个专门的小模型判断“这个区域是否存在并具有这个属性”。两层都通过,才把答案作为高置信度输出。
3.3 训练数据与目标函数的设计
要让模型真正学会依赖证据,训练数据就不能只有“问题和答案”,还要有“证据目标”。结构化证据标签可以设计成统一的 JSON 格式,这样既方便训练,也方便推理后解析。
一个较通用的标注结构如下:
{ "question": "图中人物的帽子是什么颜色?", "evidence": { "bbox": [120, 88, 240, 160], "object": "帽子", "attribute": "红色", "checked": true }, "answer": "红色", "confidence": 0.92 }训练时,模型需要同时预测 evidence 字段和 answer 字段。损失函数也不是单一答案交叉熵,而是答案损失加上证据损失。证据损失可以细分为区域坐标回归、物体类别损失、属性判断损失。不同的权重会影响训练结果,如果答案损失权重太大,模型还是会偷懒;如果证据损失权重太大,模型可能为了迁就证据而改变答案。
3.4 推理时的判别机制
即使训练时加入了证据监督,推理时也不能完全信任模型输出。我比较推荐在解码后加一层规则校验:
- 从生成结果中解析出 evidence 区域;
- 检查区域坐标是否在图像边界内;
- 用预先定义的物体类别或属性列表做匹配;
- 如果证据缺失或校验失败,降低答案置信度,或输出“无法确定”。
这相当于给模型加了一个“安全阀”。它的价值不是提升模型的上限,而是减少高置信度错误。对生产系统来说,这比单纯追求准确率更重要,因为“答错但态度坚定”的可信度伤害很大。
这类做法也能和文本生成的解码参数配合。采样温度偏高时,模型更容易发散,幻觉更容易出现。排查问题时,不要一上来就怀疑模型没训练好,先看一下 temperature 是不是开到了 1.0 以上。
4. 复现和验证时怎么设计实验:从单张反例到证据指标
4.1 建议的最小验证路径
我不建议一上来就全量训练一个大模型。更稳妥的路径是先把问题缩小到单个任务,例如“颜色识别”或“计数”,在 100 到 200 条样本上完成一轮验证。
第一步,找一个人能看懂的基线模型。第二步,构造 20 到 30 条反事实样本,确认基线模型确实存在语言先验错误。第三步,给这些样本标注证据区域。第四步,用带证据监督的配置跑一个小规模训练。第五步,对比有无证据监督前后的准确率、证据正确率和拒答率。
这个过程中最容易被跳过的是第一步和第二步。很多人直接拿公开评测集开始微调,结果发现提升不明显,原因是测试集里本来就没什么反事实样本,模型靠先验也能答对,改进当然体现不出来。
4.2 评估指标:不能只看准确率
只看最终答案准确率,很难判断模型是不是真的在依赖证据。我建议至少同时记录下面几个指标:
| 指标 | 判断方式 | 说明 |
|---|---|---|
| 答案准确率 | 模型最终答案与标准答案是否一致 | 容易被语言先验拉高,不能单独使用 |
| 证据正确率 | 模型给出的证据区域/属性是否与标注一致 | 判断模型是否找对了图像依据 |
| 支持率 | 答案正确且证据正确的比例 | 这是“真正依赖证据”的核心指标 |
| 拒答率 | 证据不足时模型是否输出“无法判断” | 好的模型应当敢于不猜 |
| 反事实鲁棒性 | 在反事实样本上的答案准确率 | 能暴露语言先验残留 |
我一般会把“支持率”作为最重要的人工校验指标。一个只靠先验回答的系统,即使答案偶尔对,证据正确率通常很低,支持率也不会高。
4.3 标注证据时的常见问题
证据标注质量直接决定训练效果。最容易出现的问题是标注不一致:同一个人在不同时间可能把边界框画得很不一样。这个问题的解决办法是先写清楚任务专用的标注规范。
规范至少要包含:
- 边界框是该框住整个物体,还是只框住回答问题的关键部位;
- 属性是否区分“颜色”“材质”“状态”,比如“红色帽子”和“红色标志”不能混淆;
- 如果问题需要多个对象联合判断,是否允许标注多个证据框;
- 图像里确实找不到证据时,是否允许标记为“无证据”。
我建议每个问题至少由两个人标注,做完一致性检查。如果两人标注框的交并比低于 0.5,说明任务定义还不清晰,先不要急着训模型。
4.4 常用基线对比
实验对照设计也很重要。不要只对比“有监督”和“无监督”,要拆开看每一层设计到底带来了多少提升。
我经常用的对照组合:
- 基线 A:原始多模态模型直接回答;
- 基线 B:在提示词里加“请先描述图片再回答”;
- 基线 C:让模型输出视觉思维链,但不做证据校验;
- 实验组:使用证据监督训练,并增加推理时校验。
看一眼各组合在支持率和反事实鲁棒性上的差异,就能知道哪些步骤是真正有效的。如果提示词基线就能大幅提升正确答案,可能说明问题更多出在解码策略而不是模型能力;如果加了证据监督但支持率没变化,就要检查标注数据是否干净,或者模型是否学会了伪造证据。
5. 实际落地的边界与坑:显存、数据质量、训练稳定性、评估偏差
5.1 显存和算力:不是所有环境都能跑完整流程
论文里的完整流程通常包含视觉检测器、大语言模型、证据校验器,真要全部加载,显存需求不低。如果你手里只有 16GB 左右的显卡,不要直接尝试全量微调。
常见的降级方案是只训练语言模型部分的低秩适配层,也就是 LoRA / QLoRA 这类参数高效微调方式。视觉编码器可以冻结,最多微调最后一两层。这样既降低了显存占用,也保留了视觉编码器原有的理解能力。
图像分辨率也会明显影响显存和速度。输入图越大,视觉 token 越多,显存上升很快。低配置环境建议先把输入分辨率固定到一个较小值,比如 336 或 448 附近,再观察效果。如果模型处理大图能力有限,可以在预处理阶段先裁出关键区域,而不是整图压缩。
5.2 训练数据不干净会带来“证据污染”
如果证据标注本身质量差,模型学到的不是“找证据”,而是“编一个符合答案的证据”。这种情况比没有证据监督更危险。
典型场景是:一张图里有一只红色球和一个戴红色帽子的女孩,但问题问的是“帽子的颜色”。如果标注者把红色球所在的框当成证据,模型就会学到“看见红色物体就输出红色”的坏习惯。表面上看答案正确,证据却完全不相关。
所以训练前一定要做证据和问题的一致性审核。我习惯在训练集里随机抽取 10% 的样本,逐条检查 evidence 区域是否真的对应问题描述的实体。发现问题就回到标注环节修正,而不是强行靠训练去纠正。
5.3 评估集偏差:模型可能背答案
公开数据集往往存在分布偏差。比如“帽子颜色”问题里,红色出现的频率很高,模型只要一直猜红色,准确率就不会太低。这掩盖了证据缺失的问题。
要避免这种情况,最好自己构造一个“反事实子集”。具体做法是把常见组合做一些反转,或者在同一张图里故意设置多个相似物体,迫使模型必须明确指代。
比如图中有两个人,一个戴蓝帽子,一个戴红帽子。问题写成“站在左边的人帽子是什么颜色”。如果模型没有证据监督,很容易只凭“帽子颜色”这个高频词输出“红色”。但正确答案必须是“蓝色”。这类样本能非常直接地暴露语言先验。
5.4 训练稳定性和重复实验
加入证据损失后,训练可能会变得不稳定。最明显的现象是答案准确率还在上升,但证据正确率突然掉下去,或者两者来回震荡。
我遇到这种情况会按以下顺序排查:
- 先看数据加载和预处理:证据框坐标是否已经归一化,类别标签是否匹配;
- 再看损失权重:证据损失权重是否过大,尝试降低到答案损失的 0.2 到 0.5 倍;
- 然后看训练阶段:损失函数是否一开始就把证据监督加进来了,如果模型还在学习基本对齐,可以先跑几个 epoch 只训答案损失,再打开证据损失;
- 最后看梯度状态:如果 loss 持续下降但指标不涨,可能是模型陷入了“输出格式正确但语义错误”的局部最优,需要引入更多反事实样本。
每次实验固定随机种子,至少跑 3 次取平均。单次实验偶然性很大,尤其数据量很小时,一次结果说明不了问题。
6. 我更建议的实践顺序:先诊断,再标注,后训练,最后推广
6.1 第一阶段:用现成模型跑对抗样例
在我给团队做方案时,第一步永远是让现有模型“出丑”。不需要训练,只需要拿现成的多模态模型跑 10 到 20 个反事实样例。
判断标准很简单:错误是否集中在“图像证据明显,但答案却来自常识”的样本上。如果是,说明先验干扰是真的;如果不是,可能模型问题更多来自没看清、指令理解错误或性能瓶颈。这个阶段能帮你确认该不该引入证据监督。
6.2 第二阶段:做人工证据标注
选择一个窄任务开始标注。任务越具体越好,比如“单物体颜色判断”“室内场景物体计数”“空间关系左/右判断”。
标注时统一使用类似前面提到的 JSON 结构。每个样本必须包含:
- 问题;
- 证据区域;
- 证据属性或对象描述;
- 标准答案;
- 是否允许模型在证据不足时拒答。
标注完成后,做一轮质量抽检。如果抽检发现证据和问题对应关系不清晰,就先回到标注规范,不要急着训练。
6.3 第三阶段:在单一任务上验证干预效果
第一次训练不要贪多。一个任务、几千条样本、一个轻量模型,足够看出证据监督有没有效果。
训练完成后重点看两个数:支持率和反事实鲁棒性。如果支持率明显提升,说明模型确实开始依赖证据;如果准确率没变但支持率上升,也可以视为一种改进,因为模型输出变得更可解释了。如果两者都下降,大概率是数据或训练配置有问题。
6.4 第四阶段:再看能不能推广到开放场景
单一任务有效之后,很多人会直接跳到“所有图片都能处理”,这一步最容易翻车。建议先扩展到两个或三个相关任务,比如从“颜色识别”扩展到“颜色 + 材质识别”。
观察模型在未见过图片、新组合下的表现。如果升级任务后支持率明显下降,一般是因为证据定义太窄,或者训练数据里新任务的覆盖不足。这时候不要急着加更多网络模块,回到数据层面补充更多“证据清晰但答案容易猜错”的样本,往往效果更好。
踩过几次之后我发现,很多 VLM 幻觉问题不是模型能力不够,而是训练目标和评估方式一直在奖励语言先验。想让视觉推理真正依赖证据,关键不是用更大模型硬扛,而是把证据变成可标注、可训练、可校验的中间结果。从单任务实验开始,先把证据链路跑稳,再谈开放场景的泛化,这条路会踏实得多。