ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

多模态大模型对齐幻觉:从表示错位到视觉消融测试的工程实践

多模态大模型对齐幻觉:从表示错位到视觉消融测试的工程实践 1. 这个标题到底在说什么从“对齐幻觉”说起第一次看到“对齐幻觉”这个词我脑子里蹦出来的不是学术定义而是一个特别具体的画面你给一个多模态大模型看一张图问它“图里那只猫是什么颜色的”它答得头头是道颜色、姿态、背景全对。然后你换一张图只把猫换成狗其他构图、色调、背景几乎不变再问同样的问题它居然还能把刚才那只猫的描述原封不动搬出来。模型看起来“看懂”了图片实际上它可能压根没认真看只是在靠语言先验和训练集里的统计规律在“编”。这就是“对齐幻觉”最朴素的表现形式。NeurIPS 2026 上这个方向之所以被拎出来讨论是因为它戳中了一个大家心照不宣但很少被系统研究的痛点多模态大模型在视觉表示和语言表示之间建立的对齐关系很多时候是虚假的、脆弱的、甚至是完全错位的。相似的表示不等于用对了图片这句话是整个问题的核心。我先把结论撂在这儿多模态大模型的对齐目前主流做法是把图像编码器输出的视觉特征通过一个投影层映射到语言模型的嵌入空间然后让语言模型基于这些“伪词元”去生成回答。问题在于这个投影层学到的映射关系很可能只是让视觉特征在数值分布上接近某些文本嵌入而不是真正建立了“这张图里有什么”和“我该说什么”之间的因果联系。模型可以做到表示空间里余弦相似度很高但生成的内容和图片实际内容南辕北辙。这个项目标题适合谁来读如果你在做多模态相关的工程落地比如图文问答、视觉指令微调、多模态 RAG或者你正在训练自己的小规模多模态模型那这篇内容会帮你省下大量试错时间。如果你只是对多模态大模型感兴趣想搞明白为什么有时候模型会“睁眼说瞎话”那也能从这里找到答案。接下来我会从设计思路、核心细节、实操过程和问题排查四个层面把这个“对齐幻觉”拆开揉碎讲清楚。2. 多模态对齐的整体设计与思路拆解2.1 主流多模态架构的对齐链路是怎么走的现在市面上能见到的多模态大模型十有八九走的是“视觉编码器 投影层 语言模型”这条路线。视觉编码器负责把图片变成一串特征向量投影层负责把这串向量的维度、分布调整到语言模型能接受的范围语言模型负责基于这些视觉特征和文本指令生成回答。整个链路里投影层是唯一一个专门为“对齐”而存在的模块也是问题最容易出在这里。我拿一个典型的开源架构举例。视觉编码器用 ViT 或者 SigLIP输出 576 个 token 的视觉特征每个特征 1024 维。语言模型的嵌入空间是 4096 维。投影层通常是一个两层 MLP把 1024 维映射到 4096 维。训练的时候冻结视觉编码器和语言模型只训练投影层或者再加上语言模型的部分参数。损失函数就是标准的自回归语言建模损失让模型根据视觉特征和文本指令预测下一个文本 token。这个设计看起来没什么毛病但它隐含了一个非常强的假设只要投影后的视觉特征在语言模型的嵌入空间里“看起来像”某些文本嵌入语言模型就能正确使用这些信息。这个假设在训练数据分布内可能成立一旦遇到分布外的图片或者指令就会崩掉。因为投影层学到的映射本质上是在拟合训练集里“图片-文本对”的统计相关性而不是在建立真正的视觉 grounding。2.2 为什么“相似的表示”会骗过模型要理解这个问题得先搞清楚语言模型是怎么“看待”视觉特征的。在语言模型眼里投影后的视觉特征就是一堆特殊的词元嵌入和文本词元嵌入拼在一起一起做自注意力。语言模型并不区分哪些位置是视觉词元、哪些是文本词元它只关心这些嵌入向量之间的注意力权重和上下文关系。问题来了如果投影层把一张“狗”的图片映射到了和“猫”这个词的嵌入非常接近的位置语言模型在生成的时候就会倾向于输出和猫相关的内容。因为从语言模型的角度看它接收到的视觉信息在表示空间里就是“猫”。但图片明明是狗。这就是“对齐幻觉”的典型场景表示空间里对齐了语义空间里完全错位。更麻烦的是这种错位在训练集里可能被掩盖了。因为训练集里的图片-文本对通常是高度匹配的投影层只需要学会把“狗”的图片映射到“狗”的文本嵌入附近就行。但一旦遇到训练集里没见过的组合比如“一只穿着宇航服的狗在月球上”投影层就可能把视觉特征映射到一个模棱两可的位置语言模型只能靠语言先验去补全生成的内容就和图片脱节了。2.3 对齐幻觉和普通幻觉的区别在哪里普通的多模态幻觉通常是指模型生成了图片里不存在的内容比如图片里只有一只猫模型却说有两只。这种幻觉的根源可能是视觉编码器漏掉了信息或者语言模型过度依赖语言先验。对齐幻觉不一样它的根源在表示层面模型在表示空间里建立了错误的对应关系导致后续的生成过程从一开始就建立在错误的基础上。我打个比方。普通幻觉像是你看着一张菜单点菜菜单上明明没有红烧肉你却非说看到了。对齐幻觉像是你拿错了菜单你以为自己看的是中餐菜单实际上拿的是西餐菜单然后你根据西餐菜单点了一道“宫保鸡丁”还觉得自己点得挺对。问题不出在你看菜单的方式而出在你拿错了菜单。这个区别很重要因为解决思路完全不同。普通幻觉可以通过更好的视觉编码器、更强的语言模型、更多的训练数据来缓解。对齐幻觉需要从表示层面入手要么改进投影层的训练方式要么在推理阶段引入额外的校验机制要么重新设计视觉和语言的融合方式。2.4 当前主流方案在哪些场景下最容易翻车根据我自己的实测和社区里的反馈对齐幻觉在以下几种场景里特别容易触发。第一种是细粒度视觉任务比如让你数图里有几个苹果、识别某个小物体的颜色、判断两个物体的相对位置。这些任务要求模型真正关注图片的局部细节但投影层往往把整张图压缩成了一个粗糙的语义向量细节信息在投影过程中丢失了。第二种是反事实图片比如把常见物体的颜色、大小、位置做非常规修改。模型在训练集里见惯了“红色的苹果”突然看到“蓝色的苹果”投影层可能还是把视觉特征映射到“红色”附近因为训练集里“苹果”和“红色”的共现频率太高了。第三种是复杂指令比如“忽略图片里的文字只描述背景”。模型需要理解指令的否定和筛选逻辑但投影层只负责把视觉特征映射到语言空间不负责理解指令的语义。结果就是模型可能把图片里的文字也描述了一遍因为它没学会根据指令动态调整对视觉特征的注意力。3. 核心细节解析与实操要点3.1 投影层的训练目标决定了对齐的上限投影层的训练目标直接决定了它学到的对齐关系是“真对齐”还是“假对齐”。目前主流做法是用自回归语言建模损失让模型根据视觉特征生成对应的文本描述。这个损失函数只关心生成的文本对不对不关心模型到底有没有“看”图片。只要生成的文本和训练集里的标注足够接近损失就能降下来哪怕模型是靠语言先验猜出来的。我试过一个小实验把视觉特征全部置零只给语言模型文本指令让它生成回答。在有些数据集上模型居然能靠纯语言先验拿到不低的分数。这说明什么说明模型在训练过程中可能压根没怎么依赖视觉特征而是把语言建模能力直接迁移过来了。投影层学到的映射可能只是让视觉特征“不捣乱”而不是让视觉特征“起作用”。要解决这个问题训练目标需要引入更强的视觉 grounding 信号。比如对比学习损失让匹配的图片-文本对的表示更接近不匹配的更远。或者引入视觉问答的辅助任务强制模型关注图片里的特定区域。再或者用因果干预的方法在训练时随机遮挡图片的某些区域看模型的输出是否相应变化如果不变说明模型没在用视觉信息。3.2 视觉编码器的输出粒度直接影响对齐难度视觉编码器的输出粒度是另一个容易被忽视但非常关键的因素。ViT 类编码器通常输出固定数量的 token比如 576 个或者 256 个。每个 token 对应图片的一个 patch。如果 patch 太大比如 32x32 像素那细粒度信息在编码阶段就丢了。投影层再厉害也没法从粗粒度的特征里恢复出细粒度的细节。我实测下来对于需要识别小物体或者精细纹理的任务用高分辨率输入加上小 patch 的编码器效果明显更好。但代价是 token 数量暴增语言模型的处理成本直线上升。所以这里有一个权衡token 太少细粒度信息丢失对齐幻觉严重token 太多计算成本高训练和推理都慢。一个折中方案是用动态分辨率或者多尺度特征。比如先把图片切成多个子图分别编码再拼在一起。或者用特征金字塔把不同尺度的特征融合起来。这样既保留了细粒度信息又不会让 token 数量失控。我在一个图文问答项目里试过这个方案把 336x336 的输入改成 672x672 加上 2x2 的子图切分细粒度问题的准确率提升了将近 15 个百分点。3.3 语言模型的注意力机制如何“偷懒”语言模型在处理视觉特征的时候注意力机制会自然地把权重分配给那些和当前生成任务最相关的 token。但问题是语言模型并不知道哪些视觉 token 是真正重要的它只能根据训练过程中学到的统计规律来分配注意力。如果训练集里某些视觉 token 和某些文本 token 的共现频率特别高语言模型就会倾向于关注这些 token忽略其他 token。这种“偷懒”行为在对齐幻觉里扮演了重要角色。比如图片里有一只猫和一棵树问题是“猫在做什么”。理想情况下语言模型应该把注意力集中在猫对应的视觉 token 上。但如果训练集里“猫”和“树”经常一起出现语言模型可能把注意力分散到树对应的 token 上导致生成的内容里混入了和树相关的描述。要缓解这个问题可以在训练时引入注意力监督信号告诉模型应该关注哪些区域。或者用更细粒度的视觉特征让每个 token 的语义更明确减少语言模型“猜”的空间。再或者用 prompt engineering 的方式在指令里明确告诉模型“只关注猫”引导注意力分配。3.4 对齐幻觉的量化评估怎么做评估对齐幻觉不能只看生成文本的准确率因为准确率高不代表模型真的用了图片。我常用的评估方法是“视觉消融测试”把图片替换成纯噪声、纯色块、或者另一张完全不相关的图片看模型的输出变化有多大。如果输出几乎不变说明模型没怎么依赖视觉信息对齐是假的。如果输出剧烈变化说明模型确实在用图片对齐是真的。另一个方法是“视觉敏感度分析”对图片做微小扰动比如改变某个物体的颜色、移动某个物体的位置看模型的输出是否相应变化。如果模型对微小扰动不敏感说明它的视觉表示太粗糙对齐粒度不够。如果模型对微小扰动过度敏感说明它的视觉表示太脆弱对齐不稳定。我还试过用“表示相似度矩阵”来可视化对齐质量。把一批图片的视觉特征和对应的文本特征分别算出来然后算它们之间的余弦相似度矩阵。理想情况下匹配的图片-文本对的相似度应该明显高于不匹配的。如果相似度矩阵接近均匀分布说明对齐没学好。如果相似度矩阵对角线特别强但非对角线也有不少高值说明对齐有混淆。4. 实操过程与核心环节实现4.1 搭建一个最小可复现的对齐幻觉检测环境要复现对齐幻觉不需要从头训练一个多模态大模型。你可以直接用开源的模型比如 LLaVA、Qwen-VL、InternVL然后设计一组测试用例来探测对齐质量。我自己的做法是准备三组图片第一组是标准图片第二组是反事实图片比如把常见物体的颜色改掉第三组是噪声图片纯色块或者随机噪声。然后对每组图片问同样的问题比较模型的回答。具体操作上我用 Python 写了一个简单的测试脚本。先加载模型和处理器然后定义一组问题和对应的图片路径。对于每张图片生成回答保存下来。最后人工或者用另一个语言模型来评估回答的质量。重点看模型在噪声图片上的表现如果模型在噪声图片上也能生成看似合理的回答说明它严重依赖语言先验对齐幻觉很严重。from transformers import AutoProcessor, AutoModelForVision2Seq from PIL import Image import torch model_id llava-hf/llava-1.5-7b-hf processor AutoProcessor.from_pretrained(model_id) model AutoModelForVision2Seq.from_pretrained( model_id, torch_dtypetorch.float16, device_mapauto ) def ask(image_path, question): image Image.open(image_path).convert(RGB) prompt fUSER: image\n{question}\nASSISTANT: inputs processor(prompt, image, return_tensorspt).to(model.device) output model.generate(**inputs, max_new_tokens100) return processor.decode(output[0], skip_special_tokensTrue) questions [ What color is the main object in the image?, How many objects are in the image?, Describe the spatial relationship between objects., ] for q in questions: print(fQ: {q}) print(fStandard: {ask(standard.jpg, q)}) print(fCounterfactual: {ask(counterfactual.jpg, q)}) print(fNoise: {ask(noise.jpg, q)}) print(---)这个脚本跑下来你会看到一些很有意思的现象。比如在噪声图片上模型可能会说“图片里有一只猫”因为问题里提到了“object”而训练集里“object”和“猫”的共现频率很高。这就是典型的对齐幻觉模型没在看图片只是在根据问题猜答案。4.2 用注意力可视化定位对齐失败的环节要定位对齐失败到底出在视觉编码器、投影层还是语言模型注意力可视化是一个很实用的工具。我通常会把语言模型最后一层的注意力权重拿出来看它在生成每个 token 的时候把注意力分配给了哪些视觉 token。如果注意力权重集中在少数几个视觉 token 上而且这些 token 对应的图片区域和生成内容相关说明对齐是好的。如果注意力权重分散或者集中在不相关的区域说明对齐有问题。具体实现上可以用 hooks 把注意力权重抓出来。不同的模型架构抓取方式不一样但思路是一样的找到语言模型里负责跨模态注意力的层把注意力矩阵保存下来然后可视化。我一般会用 matplotlib 画一个热力图横轴是视觉 token 的索引纵轴是生成的文本 token 的索引颜色深浅代表注意力权重。import matplotlib.pyplot as plt import numpy as np # 假设 attention_weights 是一个 [num_text_tokens, num_vision_tokens] 的矩阵 # 这是从模型里抓出来的跨模态注意力权重 attention_weights get_cross_attention_weights(model, inputs) plt.figure(figsize(12, 8)) plt.imshow(attention_weights, aspectauto, cmaphot) plt.xlabel(Vision Token Index) plt.ylabel(Text Token Index) plt.colorbar(labelAttention Weight) plt.title(Cross-Modal Attention Distribution) plt.savefig(attention_heatmap.png, dpi150)看这个热力图的时候重点关注几个地方。第一生成和图片内容相关的 token 时注意力是否集中在对应的视觉 token 上。第二生成和图片无关的 token比如“的”、“是”这类功能词时注意力是否分散。第三不同文本 token 的注意力分布是否有区分度。如果所有文本 token 的注意力分布都差不多说明模型没有根据生成内容动态调整对视觉信息的关注对齐是静态的、僵化的。4.3 改进对齐质量的几个实操方向如果你发现自己的模型对齐幻觉很严重可以从以下几个方向入手改进。第一个方向是改进投影层的训练数据。不要只用标准的图片-文本对要加入反事实样本、细粒度标注、空间关系描述。比如同一张图片配多个不同角度的描述让投影层学会从同一个视觉特征里提取不同的语义信息。第二个方向是引入视觉对比学习。在训练投影层的时候除了语言建模损失再加一个对比损失让匹配的图片-文本对的表示更接近不匹配的更远。这个对比损失可以在 batch 内构造负样本也可以用额外的负样本库。我试过在 LLaVA 的投影层训练里加一个 InfoNCE 损失权重设为 0.1对齐质量有明显提升。第三个方向是动态视觉 token 选择。不要让语言模型处理所有的视觉 token而是根据当前指令动态选择最相关的视觉 token。比如用一个轻量的选择网络根据文本指令给每个视觉 token 打分只保留 top-k 个。这样既减少了计算量又让语言模型把注意力集中在真正相关的视觉信息上。第四个方向是推理阶段的校验。在模型生成回答之后用一个独立的视觉问答模型或者目标检测模型来校验回答里提到的物体是否真的在图片里。如果校验不通过就重新生成或者给出警告。这个方案会增加推理成本但对于高可靠性要求的场景是值得的。4.4 训练数据配比对对齐质量的影响训练数据里图片-文本对的配比对对齐质量的影响比很多人想象的要大。如果训练数据里大部分是“图片描述”任务模型会倾向于生成泛泛的描述忽略细节。如果加入更多的“视觉问答”任务模型会被迫关注图片里的特定信息。如果加入“视觉推理”任务比如“图里的猫比狗大吗”模型会学会比较和判断。我自己的经验是图片描述、视觉问答、视觉推理三类任务的比例控制在 3:5:2 左右比较合适。图片描述任务帮模型建立基本的视觉-语言对应关系视觉问答任务强化细粒度 grounding视觉推理任务提升复杂场景下的对齐稳定性。如果只有图片描述任务模型容易学会“套模板”对齐幻觉会很严重。另外负样本的质量也很关键。负样本不能只是随机换一张图片那样太容易区分了。要用“hard negative”比如同一张图片但文本描述只改了一个关键词或者不同图片但文本描述非常相似。这样投影层才能学到细粒度的对齐关系而不是粗粒度的“图片 vs 文本”匹配。5. 常见问题与排查技巧实录5.1 模型在噪声图片上也能生成合理回答怎么办这是对齐幻觉最典型的表现。模型在纯噪声图片上依然能根据问题生成看似合理的回答。排查思路是先确认模型是否真的接收到了视觉输入。检查一下 processor 的输出看看 pixel_values 是否正常视觉 token 是否被正确拼接到了输入序列里。有时候是代码 bug 导致视觉输入被忽略了模型只看到了文本。如果视觉输入正常那就是模型过度依赖语言先验。解决办法是在训练时加入噪声图片作为负样本让模型学会在视觉信息不可用时说“我看不清”或者“图片信息不足”。也可以在推理时加一个视觉信息量检测模块如果检测到图片信息量太低就降低语言模型的生成置信度或者直接拒绝回答。我试过一个简单粗暴的方法在 prompt 里明确告诉模型“如果图片信息不足请回答‘无法判断’”。然后在训练数据里加入一些噪声图片和对应的“无法判断”标注。这样模型会学会在视觉信息不足时主动放弃而不是硬编一个答案。5.2 细粒度问题准确率低但整体指标正常怎么排查这种情况通常说明模型在粗粒度任务上表现不错但细粒度对齐没学好。排查方法是把细粒度问题单独拎出来按类别分析。比如颜色识别、数量统计、空间关系判断分别看准确率。如果某一类特别低就针对性地补充训练数据。我遇到过一个案例模型在“图里有几只猫”这种数量统计问题上准确率只有 40%但在“图里有什么动物”这种粗粒度问题上准确率 90% 以上。后来发现是视觉编码器的 patch 太大小物体在编码阶段就被平均掉了。换成更小 patch 的编码器数量统计准确率提升到了 75%。另一个常见原因是语言模型在生成数字的时候倾向于输出训练集里常见的数字而不是根据图片实际数量来。比如训练集里“两只猫”的样本特别多模型就会倾向于输出“两只”哪怕图片里只有一只。解决办法是在训练数据里平衡不同数量的样本或者在推理时用专门的计数模块来辅助。5.3 对齐幻觉的常见问题速查表问题现象可能原因排查方法解决方向噪声图片上生成合理回答语言先验过强视觉输入被忽略检查视觉 token 是否正常拼接做视觉消融测试加入噪声负样本训练模型说“无法判断”细粒度问题准确率低视觉编码器粒度太粗投影层丢失细节按问题类别分析准确率可视化注意力分布换小 patch 编码器加入细粒度训练数据反事实图片上输出训练集常见答案投影层过拟合训练集统计规律构造反事实测试集看输出是否随图片变化加入反事实训练样本引入对比学习损失复杂指令下忽略否定和筛选语言模型不理解指令语义只做表面匹配设计指令遵循测试看模型是否按指令调整加入指令遵循训练数据用 prompt 明确约束注意力分布均匀无区分度语言模型没学会动态关注视觉信息可视化跨模态注意力看是否有区分度引入注意力监督用动态 token 选择同一图片不同问题输出相同模型没根据问题调整视觉信息提取对同一图片问不同问题比较输出加入多问题训练数据强制模型关注不同区域5.4 几个我踩过的坑和对应的避坑技巧第一个坑是过度依赖开源模型的默认配置。很多开源多模态模型在发布时投影层是在特定数据集上训练的换一个领域的数据对齐质量可能急剧下降。我的建议是不管你用哪个开源模型都要在自己的数据上做一轮对齐质量评估不要假设默认配置就能用。第二个坑是忽略图片预处理。图片的尺寸、归一化方式、颜色空间都会影响视觉编码器的输出。如果训练和推理时的预处理不一致对齐质量会明显下降。我一般会把预处理参数固定下来写成一个配置文件训练和推理都从同一个配置里读。第三个坑是训练数据里的文本描述太单一。如果每张图片只有一句描述投影层学到的对齐关系会很粗糙。我试过给每张图片配 5 到 10 句不同角度的描述对齐质量提升很明显。这些描述可以是用大模型生成的也可以是人工标注的关键是覆盖不同的语义维度。第四个坑是评估指标选错了。用 BLEU、ROUGE 这类文本生成指标来评估多模态模型很容易被语言先验骗过去。模型生成的文本和标注文本很像但可能完全没看图片。我现在的做法是文本生成指标只作为参考主要看视觉消融测试和视觉敏感度分析的结果。5.5 对齐幻觉的长期改进思路从长期来看对齐幻觉的根治需要从架构层面入手。现在的“视觉编码器 投影层 语言模型”范式本质上是在做一个单向的映射把视觉信息压缩成语言模型能理解的表示。这个过程中信息损失是不可避免的。未来的方向可能是双向的、迭代的对齐语言模型不仅能读取视觉信息还能主动向视觉编码器提问要求它提供更细粒度的信息。另一个方向是引入外部知识。语言模型在生成回答的时候可以查询外部知识库来校验视觉信息。比如模型看到一张图片初步判断是“猫”然后查询知识库确认“猫”的视觉特征再回头和图片特征做比对。这样可以在推理阶段动态修正对齐错误。还有一个方向是让用户参与对齐。在交互式场景里模型可以主动询问用户“你问的是左边那只还是右边那只”通过用户的反馈来动态调整对视觉信息的关注。这样既提升了准确性又增强了用户体验。我个人在实际操作中的体会是对齐幻觉不是一个能一次性解决的问题而是一个需要持续监控和迭代的质量维度。每次换模型、换数据、换任务都要重新评估对齐质量。把视觉消融测试和注意力可视化做成常规的评估流程比事后补救要有效得多。最后再分享一个小技巧在训练投影层的时候把学习率设小一点迭代轮数设多一点让投影层慢慢学不要急着收敛。我试过把学习率从 1e-3 降到 1e-4训练轮数翻倍对齐质量提升很明显而且训练过程更稳定。
返回列表