ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

视觉语言模型幻觉识别:用因果审计判断模型是否真在看图

2026/8/28 19:39:39 拓冰建站 浏览量
视觉语言模型幻觉识别:用因果审计判断模型是否真在看图 多模态视觉语言模型VLM在实际生产环境中越来越常见页面截图理解、商品图问答、文档信息抽取、缺陷检测报告、自动驾驶场景描述。很多团队在集成这类模型时都会遇到一个非常诡异的场景模型在演示时表现得像真的“看到了”图片但当你把图片换成一张不相关的图甚至换成一幅带噪声的干扰图问题的答案几乎没有变化。这个现象在论文和工程圈里通常被概括为“视觉工具使用的幻觉”The Illusion of Visual Tool-Use指的是模型在回答那些只有依赖图像信息才能正确回答的问题时并没有真正把图像内容当作推理的依据而是依靠语言先验、训练数据统计和文本捷径“想象”出一个答案。这篇文章要做的事情是把“模型到底有没有在用图像思考”这个问题转化为一组可运行的因果审计实验。全文会围绕一条主线展开如何通过输入扰动、反事实替换、视觉编码器干预和因果中介分析判断一个视觉语言模型在特定任务上是否真实依赖了视觉信息如何把审计结果转化为可落地的指标和检查清单以及在发现“伪视觉推理”之后应该往哪些方向调整数据和模型。适合正在做多模态模型评估、视觉问答、智能文档处理、模型可解释性或模型上线的工程师和算法同学阅读也适合刚接触 VLM 并希望深入理解其内部行为的开发者。1. 先厘清“视觉工具使用”到底审计什么1.1 一个典型现象换掉图片答案不变假设任务是一个典型的视觉问答给一张道路图问题为“车道线是什么颜色”模型回答“白色”。这个例子看起来很正常但真正需要警惕的是下面这种情况把道路图换成一只猫问题仍然保持不变模型依然回答“白色”。如果模型不是从猫的图像中推断出“白色”那么它大概率是通过训练语料中学到的“车道线通常是白色”这一文本先验来回答问题。这里的“视觉工具使用”就是幻觉式的模型表现得好像看到了图像并基于图像进行推理但真正驱动答案的却是语言层面的统计线索。这里要注意这属于典型现象描述不代表所有模型、所有问题都会这样。但工程中确实能稳定观察到这一类失败模式尤其是在问题中的答案与训练数据高度相关、图像信息又相对冗余时。1.2 视觉幻觉的三个层次要准确理解视觉工具使用的幻觉可以把问题拆成三个层次来看。第一层是特征层面的幻觉。视觉编码器确实对图像完成了前向计算也输出了视觉特征但这些特征在后续的融合与预测中几乎没有贡献。最终答案由文本 token 和语言模型参数中的先验决定。这一层的问题通过简单的图像扰动实验就能暴露出来。第二层是模块层面的幻觉。视觉模块参与了计算但它对最终预测的影响非常弱。即使向视觉特征注入较大噪声、把视觉 token 全部置零或者将图像换成完全不相关的图片模型输出的概率分布变化依然很小。这说明视觉模块只是“装饰性参与”并没有承担因果作用。第三层是行为层面的幻觉。从外部看模型正确回答了视觉问题甚至通过了准确率测试但从因果角度看正确性来源于数据集中的捷径而不是当下这一张图像的因果关系。这类幻觉最隐蔽因为它不会在普通准确率评估中暴露只会在分布变化、对抗图像、细粒度空间推理等场景中被逐渐放大。1.3 为什么普通准确率指标看不出来准确率指标只关心最终答案是否正确不关心答案是由哪条因果路径产生的。在训练集和测试集分布接近的情况下文本先验往往与图像信息指向同一个答案模型即使完全不看图像也能答对大多数问题。此时视觉幻觉被“分布内正确性”掩盖。真正出问题的场景是图像中的目标位置被调换、颜色被局部修改、目标被遮挡或者问题本身要求模型回答“左边还是右边”“第几个”“是否在遮挡物后面”这类必须依赖空间信息的问题。此时语言先验失效模型才暴露出没有真正使用视觉信息的问题。这也是因果审计的核心价值不能只问“答对了没有”而要问“答案是否因果地依赖于图像信息”。换句话说要审计的是“Thinking with Images”这个说法是否成立而不仅仅是“有没有图片输入”。2. 构建最小审计环境模型、依赖、基线任务2.1 选择一个能做因果干预的视觉语言模型结构做因果审计的前提是模型结构可以被拆分和干预。建议选择视觉编码器、连接投影模块、语言模型各部分可分开调用的开源 VLM比如 BLIP-2、InstructBLIP、LLaVA、Qwen-VL 这类常见框架。具体选择取决于你希望审计的模型版本以及你的显卡显存大小。代码层面建议从 Hugging Face transformers 提供的通用接口入手。不同模型的加载方式略有差异但整体结构相似处理器Processor负责把图像和文本变成输入张量视觉编码器提取图像 patch 特征连接层把视觉特征映射到语言模型的 token 空间语言模型负责生成答案。需要特别注意下面的示例代码以 transformers 的常见 VLM 接口为基准实际项目中使用哪个版本、哪个模型都要以对应模型的官方示例为准。2.2 环境准备和依赖推荐使用独立的 Python 虚拟环境Python 版本建议 3.10 以上。基础依赖包括python -m venv .venv source .venv/bin/activate pip install torch torchvision transformers pillow numpy scipy opencv-python如果审计的是大规模 VLM显存最好在 16GB 以上。条件有限时可以选择参数量更小的模型或者把图像分辨率调低。这里要区分学习环境和生产环境。在个人电脑上做审计时任务可以适当缩小比如只跑几十条问题在生产环境做模型发布前审计时则需要更完整的 GPU 资源、固定随机种子、统一模型版本和可复现的评估脚本。2.3 准备一个最小可审计数据集审计视觉工具使用的核心是“可控”。如果使用公开数据集例如 VQAv2、GQA、RefCOCO优点是场景真实、结论有说服力缺点是问题往往混有多种先验不容易确定某个问题是否真的必须依赖图像。更稳妥的做法是先构建一组合成数据作为最小闭环。合成图的优势在于我们自己知道“正确答案只可能来自图像”因此一旦模型出现“换图答案不变”的行为审计信号是非常清晰的。下面这段代码生成两种最简单的视觉问答图片左侧或右侧出现一个红色方形或者一个蓝色圆形。from PIL import Image, ImageDraw def make_vqa_image(sideleft, colorred, shapesquare): img Image.new(RGB, (224, 224), white) draw ImageDraw.Draw(img) if side left: box (20, 72, 80, 132) else: box (144, 72, 204, 132) if shape square: draw.rectangle(box, fillcolor) else: draw.ellipse(box, fillcolor) return img配套问题可以设计为“Which side is the red square on?” 正确答案为 “left” 或 “right”。这样的问题在真实世界中并不一定容易被小模型答对因此这里的作用是演示审计流程而不是承诺任何模型都能答对。对于已经训练好的较强 VLM这类简单空间问题通常可以作为审计基线。2.4 关键审计指标的定义要量化“是否真的在用图像思考”建议定义三个基础指标。视觉敏感度Visual Sensitivity ScoreVSS对输入图像施加扰动后模型输出分布与原始输出分布之间的距离通常用 Jensen-Shannon 散度或 KL 散度。VSS 越低说明视觉扰动对输出影响越小模型越像在无视图像。答案变化率Answer Variation RateAVR在反事实替换图像集上模型主答案发生变化的样本比例。AVR 越低说明答案越不随图像变化。反事实一致性Counterfactual ConsistencyCFC当图像改变导致正确答案改变时模型是否跟随正确标签变化的比率。CFC 比 AVR 更严格因为它要求变化方向正确而不是随便变一下就算通过。这些指标计算起来并不复杂但如果只用一个指标判断容易误伤或误放。实际审计中建议同时使用多个指标并按问题类型分组汇报。3. 视觉工具使用幻觉的量化实验3.1 实验一图像扰动审计图像扰动审计是最直接的实验。思路是如果模型真的依赖图像做推理那么破坏图像信息后模型输出分布应该发生明显变化如果模型只是在走文本捷径那么即使图像已经被扰动到不可辨认答案和置信度依然稳定。可以准备三类扰动模板高斯模糊、灰度化、加噪声。import numpy as np from PIL import Image, ImageFilter, ImageOps def perturb_image(image, modeblur, strength8): if mode blur: return image.filter(ImageFilter.GaussianBlur(strength)) if mode gray: return ImageOps.grayscale(image).convert(RGB) if mode noise: arr np.array(image).astype(np.float32) noise np.random.normal(0, strength, arr.shape) return Image.fromarray(np.clip(arr noise, 0, 255).astype(np.uint8)) return image接下来对同一个问题、同一张原始图分别跑原始输入和每一档扰动输入记录模型预测的答案和概率分布。def predict_with_distribution(model, processor, question, image): inputs processor(textquestion, imagesimage, return_tensorspt) outputs model.generate(**inputs, return_dict_in_generateTrue, output_scoresTrue, max_new_tokens16) return outputs.sequences, outputs.scores这里只是示例结构。不同模型生成的接口可能不同有的需要传入num_beams有的需要do_sample。为了指标稳定建议固定do_sampleFalse并在审计脚本里固定随机种子。实验结束后绘制一条“扰动强度-分布距离”曲线。正常情况下随着模糊半径或噪声强度增大输出分布距离应该逐渐拉大。如果你的模型在模糊半径已经很大、图像几乎变成色块时分布距离仍然接近 0说明该模型在这个问题上没有真正使用视觉信息。3.2 实验二视觉编码器后置干预图像扰动只能证明“输入图像被破坏后模型无感”还不能精确定位问题出在视觉特征上。要更接近内部机制可以对视觉编码器输出的特征直接做干预。常见做法是注册 forward hook。下面这段代码向视觉编码器输出张量注入高斯噪声import torch def register_visual_noise_hook(visual_encoder, std0.1): def hook(module, input, output): noise torch.randn_like(output) * std return output noise handle visual_encoder.register_forward_hook(hook) return handle实际模型的结构各不相同关键是找到“视觉特征进入跨模态融合之前”的那一层。不同 VLM 里这层可能是视觉 transformer 的最后一层输出也可能是连接投影层之后的视觉 token。需要先打印模型结构确定视觉编码器的输出张量形状再决定 hook 加在哪个位置。干预强度需要做阶梯测试。如果注入很小的噪声就导致输出完全崩溃说明模型对视觉特征非常敏感如果注入较强噪声后输出分布依然稳定说明视觉特征对决策的影响被语言分支稀释了。两种情况都需要记录并分别注明“视觉敏感”和“视觉不敏感”。3.3 实验三反事实图像归因反事实实验是因果审计的关键。反事实的思想很简单保持问题不变只改变图像中与答案相关的因素然后观察答案是否随之改变。合成数据上的反事实可以这样设计原图红色方形在左侧问题答案为 “left”。反事实图 1红色方形在右侧正确答案变为 “right”。反事实图 2红色方形在左侧但颜色改成蓝色如果问题问的是“红色方形在哪一侧”那么这张图会让问题答案失去依据。反事实图 3图像完全替换成一张猫图。接着批量统计答案变化率。def answer_variation_ratio(predict_fn, question, original_image, cf_images): original_answer, _ predict_fn(question, original_image) changed 0 for cf_img in cf_images: cf_answer, confidence predict_fn(question, cf_img) if cf_answer ! original_answer and confidence 0.3: changed 1 return changed / len(cf_images)这里的confidence过滤是为了避免把“模型已经懵了但随机换了一个答案”也算作有效变化。更严格的判断是计算生成序列的置信度或熵只统计高置信度、非随机变化的情况。如果一个模型在原图和反事实图上的答案变化率很低基本可以认为它没有把“当前这张图”作为决策的因果输入来源。3.4 实验四注意力归因与因果中介分析注意力归因是更细的观察手段。很多 VLM 在多模态融合层中会让文本 token 去关注视觉 token因此可以通过注意力权重看出模型“看向”了图像的哪个区域。常见做法是把最后一层或倒数第二层的注意力权重单独提取出来然后做平均或 rollout。但注意力归因只能作为线索不能直接等同于因果关系。视觉 token 的注意力高只说明信息被关注不代表最终答案真的因果地依赖了这些 token。更强的是因果中介分析。因果中介分析的核心思路是找到视觉信息流向语言模型的“中介变量”通常是某一层中的视觉 token 表示。然后做一次替换实验用原始图像前向一次记录指定层的视觉 token 表示。用反事实图像前向一次记录同样位置的反事实视觉 token 表示。在第三次前向中把原始图像前向的视觉 token 表示替换成反事实版本其他中间状态保持原始不变。观察最终输出分布是否发生明显改变。这段逻辑用伪代码描述更清楚def causal_mediation_eval(model, image, cf_image, prompt, swap_layer): h_orig extract_visual_representation(model, image, prompt, swap_layer) h_cf extract_visual_representation(model, cf_image, prompt, swap_layer) output_orig forward_with_swap(model, image, prompt, swap_layer, h_orig) output_cf forward_with_swap(model, image, prompt, swap_layer, h_cf) return distribution_distance(output_orig, output_cf)这里的forward_with_swap在 transformers 中通常需要自定义 forward 或者利用 hook 做变量替换不能直接运行需要针对具体模型实现。但它表达的判断逻辑是正确的如果替换视觉表示后输出分布剧烈变化说明视觉表示确实因果影响了答案如果替换前后几乎没有变化说明视觉信息在因果链上并不重要。3.5 实验结果怎么解读把所有实验汇总后可以按下面这张表的逻辑来做判断。审计实验信号表现审计结论图像扰动审计模糊/噪声强度增大但输出分布稳定模型可能忽略图像信息视觉编码器噪声注入注入较大噪声后分布距离很小视觉特征因果权重低反事实图像替换AVR 接近 0答案不随图像变化因果中介分析替换视觉表示后分布几乎不变对应层视觉信息未参与决策注意力归因注意力集中在答案无关区域存在走文本捷径的可能需要注意的是结论需要按问题类型分组。一个模型可能在“颜色识别”类问题上有强视觉依赖但在“空间位置”类问题上完全走捷径。只算整体指标会掩盖这种不均衡。4. 关键参数与实现细节4.1 扰动强度的梯度设计扰动强度不是越大越好。强度过小模型还可能通过残余信息回答问题强度过大把图像变成纯噪声任何模型都会输出崩溃反而看不出“是否依赖视觉”。建议采用多档强度阶梯扰动方式建议强度档位说明高斯模糊半径2, 4, 8, 16半径 8 以上通常已破坏细粒度空间信息高斯噪声标准差5, 10, 20, 4040 时图像已经接近噪点图灰度化仅一档用于测试颜色信息是否被使用局部遮挡比例25%, 50%, 75%用于测试关键区域依赖每一档建议重复 5 到 10 次取平均分布距离降低采样随机性。4.2 因果中介分析的 token 对齐因果中介分析要替换的是视觉 token 表示因此必须保证原始图和反事实图在视觉编码器中的 token 排列是一致的。常见 VLM 会先把图像切分成固定大小的 patch然后按顺序展平。只要两张图尺寸一致、patch 切分方式一致token 对齐就能成立。如果图像来自检测框裁剪或者模型使用了可变分辨率切图token 对齐会变得复杂。这时要仔细观察预处理逻辑不要把来自不同位置的 token 错位替换否则实验结论会受到污染。4.3 生成和采样的稳定性VLM 的生成过程有随机性。审计时必须固定随机种子关闭采样或将temperature设为 0。分布距离计算建议在 logits 层面完成而不是在最终生成的 token 层面完成。只在 token 层面比较会丢失概率分布中的信息。建议记录以下信息模型权重文件 hash、模型版本、预处理版本、随机种子、每个采样重复次数。这样审计报告才能被复现。4.4 不同审计方法的定位用下面的表格快速选择适合的审计方法方法干预位置成本作用边界图像扰动输入图像低判断整体视觉依赖是否存在局部掩蔽输入图像区域中判断关键区域是否被使用视觉特征噪声视觉编码器输出中判断视觉特征对决策的因果权重反事实替换输入图像低判断答案是否随任务相关因素变化因果中介分析指定中间层高定位承载视觉因果关系的层注意力归因注意力权重低提供解释线索不能单独作为因果证据生产环境建议先用低成本的图像扰动和反事实替换做初筛发现问题后再用因果中介分析定位具体层。5. 常见问题排查5.1 模型对随机噪声图仍然给出高置信度答案现象输入一张接近纯噪声的图像模型不仅没有拒绝回答反而给出一个非常具体的颜色、物体或位置答案。可能原因语言先验过强视觉编码器的输出被语言分支忽略也可能噪声图像被模型误认为某种特殊纹理。检查方式对比“纯白图”“噪声图”“真实图”三者的视觉特征输出 norm再看视觉特征注入噪声后输出分布是否变化。如果视觉特征被修改后答案依然稳定说明问题出在融合链路而不是输入本身。处理建议增加“视觉不确定时应拒绝回答”的训练约束在服务层设置答案置信度门槛对低视觉置信度的问题回退到人工处理。5.2 图像扰动后输出几乎不变现象高斯模糊半径已经调到 16答案和置信度依旧没有变化。可能原因扰动强度仍然不够问题本身可以通过文本先验回答模型对该问题走的是纯语言捷径。检查方式把问题换成明确依赖图像的合成题例如“红色方块在左侧还是右侧”继续增大扰动强度确认“强度-分布距离”曲线是否依然平坦。处理建议如果换成强视觉依赖问题后曲线有明显变化说明模型不是完全不用图像而是在某些问题上不需要图像。定义任务类别分别统计敏感度。5.3 反事实指标和人类判断冲突现象模型在反事实图像上改变了答案但改到了错误方向。例如正方形从左侧移到右侧模型却从“left”变成“up”。可能原因模型可能依赖于颜色、形状或其他误导性线索而不是空间关系。它确实“随图像变化”但没有随“正确答案”变化。检查方式只统计能明确判断正确答案的反事实样本计算 CFC 而不是只看 AVR。如果 AVR 很高但 CFC 很低说明模型对图像的敏感是杂乱的不是真正的视觉理解。处理建议把 AVR 和 CFC 一起写入审计报告避免把“变了但变错”当成“使用了图像”。5.4 视觉编码器干预无效现象向视觉编码器输出注入噪声后输出分布完全不变。可能原因干预层选错了。视觉信息可能在更早或更晚的层中被吸收也可能连接投影层把视觉特征压得太弱。检查方式在多层位置分别做干预绘制“层编号-输出分布距离”曲线。找到对输出影响最大的层。处理建议不要只在一个固定层上做因果分析。对多模态模型视觉信息通常要流经多个 transformer 层真正的因果瓶颈可能不在视觉编码器出口。5.5 注意力归因结果不稳定现象多次运行注意力归因指向的图像区域每次都不一样。可能原因注意力权重是动态计算的也受生成过程随机性影响直接平均多个 head 会损失信息。检查方式把单次采样改为多次采样使用注意力 rollout 或对多个 head 做加权处理同时用因果中介分析交叉验证。处理建议注意力归因更适合作为“线索”不适合单独作为“是否使用图像”的判据。真正做发布决策时优先依赖反事实和中介分析。6. 生产环境下的视觉工具使用质量保障6.1 发布前的因果审计清单在生产环境上线一个 VLM 之前建议至少准备一份因果审计清单下面这些项目可以按实际情况裁剪。准备至少 50 到 100 条必须依赖图像才能回答的 golden 问题覆盖颜色、位置、数量、存在性、空间关系等基础视觉能力。每条问题配套原始图、反事实图、扰动图三类输入。设置审计阈值AVR 低于阈值的模型或任务不允许直接上线。按任务类型分别计算指标而不是只输出整体得分。保留审计输入输出快照、模型版本和预处理版本方便后续回归。对高置信度错误样本做人工复核形成“伪视觉推理”案例库。配置一个示例阈值表指标示例阈值触发动作答案变化率 AVR低于 0.4需要补充视觉依赖训练数据反事实一致性 CFC低于 0.7需要检查空间与属性推理能力视觉噪声敏感度输出分布距离长期为 0需要检查视觉融合链路关键问题人工通过率低于 90%不允许直接全量发布这里的阈值只是示例真正落地时应根据业务场景和模型能力反复调整。6.2 把审计做成持续集成的一部分模型迭代频繁时人工审计不现实。可以把最小审计集做成 CI 任务每次模型权重更新后自动运行。一个简单的 GitHub Actions 配置如下name: visual-audit on: pull_request: paths: - models/** - eval/** jobs: audit: runs-on: [self-hosted, gpu] steps: - uses: actions/checkoutv4 - name: Run visual audit run: python audit_runner.py --task golden --threshold 0.6这里的audit_runner.py负责加载新 checkpoint、跑最小审计集、生成 JSON 报告。如果指标低于阈值CI 直接失败阻止模型合并进发布分支。审计任务需要控制运行时长建议把推理 batch size 调到合适范围避免每次代码提交都要等半小时。6.3 与人工评估和在线指标配合离线审计只能证明模型在固定样本上具有视觉因果依赖不能完全代表线上效果。上线后还需要监控三类在线信号图片质量退化报警线上图像出现压缩、模糊、裁剪异常时模型是否开始出现“答非所图”的回答。用户反馈中“根据图片不应该这样回答”的投诉比例。同图不同问题之间的答案一致性例如两个问题指向同一物体但模型给出互相矛盾的属性。离线审计分数和在线指标最好能建立关联。如果审计分数下降在线投诉比例同步上升说明审计指标是有效的如果审计分数下降但线上表现正常则要考虑审计集是否和线上分布偏离。6.4 持续监控视觉退化数据漂移会让视觉工具使用的质量缓慢退化。线上图像的风格变化、分辨率变化、目标大小变化都可能导致模型从“真正看图像”退化成“依赖文本先验”。建议定期用一组代表线上分布的图片跑一次 VSS 和 AVR 指标加入巡检任务。观察指标趋势而不是只看单次值。出现持续下降时及时回滚到上一个达标模型或触发补充训练。7. 从“审计”到“改进”理解之后能做什么7.1 找到“伪视觉推理”后的调整方向审计的价值不只是发现问题而是为改进提供依据。如果审计发现模型在空间位置类问题上走文本捷径可以从三个方向调整。数据层面增加需要空间关系、颜色、细粒度属性才能回答的训练样本同时减少“问题加标准答案”中隐含的语言捷径。反事实数据增强是直接手段把同一问题中的物体位置、颜色、数量随机变换让模型必须依赖图像变化才能回答。模型层面引入视觉置信门控。当视觉证据不足或视觉模块敏感度较低时模型可以输出“视觉证据不足”而不是强行给一个答案也可以增加视觉条件分支的梯度路径让语言模型不能只依赖文本先验。评估层面在模型卡和技术文档中同时报告“准确率”和“视觉敏感度”两类指标避免只靠准确率判断模型能力。这样下游使用方才能知道这个模型到底在什么场景下可信。7.2 对当前方法的边界判断需要承认因果审计方法本身也有局限。以因果中介分析为例它建立在“替换中间表示不会影响其他变量”的假设上但 transformer 的残差连接和层间依赖让这个假设很难严格成立。扰动审计能提供较强的“下界证据”如果扰动图像后输出完全不变几乎可以肯定没有强视觉因果但反过来输出变化也不能保证模型就是按人类理解的语义来使用图像的。因此审计结论更适合用于筛选、预警和模型对比而不是对单个模型做出绝对的“有没有视觉能力”的断言。工程上应该把它当作质量门禁而不是科学判断题。7.3 下一步扩展方向这一思路可以向多个方向延伸。对视频输入可以审计时间连续性是否被真正使用。把视频帧顺序打乱后模型输出应该发生变化如果不变说明模型只是从单帧或文本摘要中获取信息。对多模态智能体可以审计“工具调用”是否真实。模型声称调用了图像放大、OCR、目标检测等视觉工具但因果审计可以检查工具返回的结果是否真的改变了后续决策。如果工具输出被替换为随机值后最终回答依然不变那么工具调用同样是一种幻觉。对训练策略可以在训练时引入“视觉因果一致性”正则项让模型在反事实图像变化时产生正确的答案迁移。这类方法目前还在快速发展中但审计指标已经可以提前介入作为训练过程中是否真正学会视觉推理的监控信号。视觉工具使用的审计不是一次性工作。模型每迭代一次、数据分布每变化一次都应该重新跑一遍最小审计集。只有把“是否真的在用图像思考”变成可量化、可回归、可拦截的工程指标多模态模型才能真正在需要视觉因果推理的业务场景中站住脚。