论文解读与源码复现|NegBench:视觉语言模型其实不懂"否定"(CVPR 2025)
论文首页题目与摘要截图
一、前言
"检索一张没有人的海滩"、"查询无证据显示肺炎的胸片"——否定(negation)是自然语言里最平常不过的构造,也是检索、内容审核、医学影像查询的真实需求。MIT 与 OpenAI、牛津的这项研究给出的诊断却令人咋舌:CLIP 系模型把"a dog"和"no dog"嵌入到几乎相同的位置。在四选一的 MCQ 任务上,多数模型贴着 25% 的随机基线;专攻组合性的 NegCLIP 在困难负例检索上反而暴跌 23%;医学 VLM(CONCH)在否定问题上的跌幅高达 33.2%——在"有无病灶"就是诊断结论的场景里,这是致命的。
既有基准(CREPE、CC-Neg)依赖模板化例句,覆盖不了真实查询里否定词的多样性。这篇 CVPR 2025 论文的三步走是:NegBench(18 个任务变体、79k 样本、覆盖图像/视频/医学影像的否定评测)→ 诊断(确认"肯定偏置"与嵌入空间坍缩)→ 解决(CC12M-NegCap/NegMCQ 两个千万级合成数据集微调,否定检索召回 +10%、否定 MCQ 准确率 +28%)。
二、方法解析
2.1 NegBench:两级评测管线
模仿真实检索系统的"粗召回 → 精排序"结构设计两个任务:
- Retrieval-Neg(粗粒度):把原 caption 改写为混合肯定与否定的查询——"There is no x in the image. [原caption]"或"[原caption]. There is no x",再经LLaMA 3.1 改写增加语言多样性;模型需按"有 A 且无 B"检索 top-5。
- MCQ-Neg(细粒度):每图一道四选题,正确答案与三个硬负例只在"肯定/否定"上不同。三种模板:肯定("This image includes A")、否定("does not include B")、混合("includes A but not B")。错误选项的设计直击要害:False Affirmation(把图里没有的说成有)与 False Negation(把图里有的说成没有)。
数据适配的通用性:图像(COCO/VOC2007)、视频(MSR-VTT,物体与动作都可被否定)、医学(CheXpert——两个二分类任务:肯定控制组 vs 否定理解组)。有物体标注用标注、没有就从 caption 用 LLaMA 3.1 抽取正/负概念,负概念再用开放词汇检测器(OWL-ViT)核验确实不存在——避免给模型喂错误的否定监督。
图片源自论文 Figure 2:NegBench 构建管线。从视觉数据集抽取正概念 → LLM 提议负概念 → 检测器核验 → 模板生成否定 caption → LLM 改写。
另有HardNeg-Syn合成评测集:Stable Diffusion 生成 10,000 对"仅差一个物体"的图像对,OWL-ViT 验证存在/缺席——把混淆变量压到最小。
2.2 数据中心的修复:两个千万级合成数据集
从 CC12M(约 10M 图文对)扩增,三步流水线(LLM 抽对象 → 检测器视觉核验 → LLM 生成自然否定 caption)产出:
- CC12M-NegCap:每图 3 条否定 caption,约 3000 万条,用标准 CLIP 对比损失训练——教"宽谱"的否定表达;
- CC12M-NegMCQ:每图 4 条(1 正确 + 3 硬负例),约 4000 万条,用 MCQ 交叉熵损失(论文式 1)——教"细粒度"的否定分辨;
- CC12M-NegFull:两者合并,总损失 $L_{Total} = \alpha L_{CLIP} + (1-\alpha) L_{MCQ}$(论文式 2)。
三、数据集与实验设置
- 评测模型:OpenAI CLIP、CLIP-laion400m、CLIP-datacomp(预训练数据对照);NegCLIP(组合性)、ConCLIP(否定特训)——5 个 ViT-B/32;规模扫描 ViT-B→L→H;新架构 SigLIP(ViT-L)、AIMV2(LiT);医学 VLM BioMedCLIP、CONCH。
- 评测数据:COCO、VOC2007、MSR-VTT(4 帧均匀采样平均嵌入)、CheXpert(Lung Opacity)、HardNeg-Syn。
- 微调协议:OpenAI CLIP 与 NegCLIP 分别在 CC12M(对照)/NegCap/NegFull 上微调,隔离否定数据的净效应。
四、关键实验结果
1. 检索:否定查询全线崩溃(Figure 3)。COCO 上 recall@5 掉 6.8–7.7%;HardNeg-Syn(硬负例)上更惨——NegCLIP 掉 23.0%、专攻否定的 ConCLIP 也掉 18.0%。
2. MCQ:贴着随机基线(Figure 4a)。五模型在 MCQ-Neg 上全部 ≤39%(最好成绩是 CLIP 在 COCO 的 39%),多数低于 25% 的随机线或仅略高——NegCLIP 与 ConCLIP 均未超过原始 CLIP。
3. 越大更新≠更懂否定(Figure 4b):ViT-B→L→H 缩放无改善;SigLIP 与 AIMV2(写作时多个 VLM 榜单的 SOTA)同样不及格——这是架构/目标函数层面的盲区,不是规模问题。
4. 医学场景高危(Figure 4c):CheXpert 上 BioMedCLIP 与 CONCH 引入否定后分别跌15.8% 与 33.2%——"does not show Lung Opacity"这类关键表述被误读的风险真实存在。
5. 根因:肯定偏置与嵌入坍缩(Figure 5/6):
- 分模板统计:CLIP 在 VOC2007 肯定 MCQ 上 82%、否定 MCQ 上仅3%——模型的策略是"默认选否定句"(因为 67% 的题目没有正确肯定项),完全忽略"no"这个词的语义;
- 嵌入 PCA:CLIP/NegCLIP 的肯定与否定 caption 嵌入重叠(bag-of-words 捷径);ConCLIP 把所有否定 caption 坍缩到同一点(学到了"见否定就压"的新捷径);文本侧 Sentence Transformer 则沿"物体类型 × 否定"两轴完美分离——理想表征的参照系。
6. 合成数据有效(Table 1,COCO):
| 微调数据 | R@5 | R-Neg@5 | MCQ |
|---|---|---|---|
| CLIP 无微调 | 54.8 | 48.0 | 39.2 |
| CC12M(对照) | 58.8 | 54.5 | 34.7 (↓4.5) |
| CC12M-NegCap | 58.5 | 57.8 | 47.3 (↑8.1) |
| CC12M-NegFull | 54.2 | 51.9 | 54.4 (↑15.2) |
| NegCLIP + NegFull | 69.0 | 67.0 | 56.2 (↑27.6) |
否定 MCQ 相对提升最高+27.6;MSR-VTT 上同趋势。α 消融显示权衡:α=1 保检索(R@5 58.5)牺牲 MCQ,α=0 反之(MCQ 59.4、R@5 33.9)——对比损失与 MCQ 损失需要配平。
五、机制解释与讨论
为什么 CLIP 学不会否定?对比学习的训练信号是"图文是否匹配"——而 web 数据的 caption 几乎全是肯定句。对模型而言,"no dog"与"dog"与图像的匹配分数几乎相同,梯度从不惩罚这种混淆,于是编码器学成了 bag-of-words:否定词被当作可忽略的停止词。ConCLIP 的教训是反向的:只用模板化否定数据训练,模型把"所有否定句坍缩到一个点"——过拟合模板而非理解语义。修复的关键是 NegCap(多样性)+ NegMCQ(判别性)的组合:前者铺开否定的语言流形,后者在流形上画出决策边界。
具体发现 → 凝练结论:
- 具体发现一:否定 MCQ 全线 ≤39%、医学 VLM 跌 33% —— 结论:肯定偏置是 CLIP 系的系统性缺陷,规模与新架构均未触及;
- 具体发现二:CC12M 对照微调让 MCQ 不升反降(-4.5) —— 结论:问题确实出在数据构成而非微调本身,"多见文本"救不了"缺否定";
- 具体发现三:α 的权衡 —— 结论:粗粒度检索与细粒度判别在损失层面存在张力,实际部署需按下游任务配比。
六、局限与工程启示
局限:
- 合成数据的否定概念来自 LLM 提议 + 检测器核验,长尾概念与抽象概念(情绪、风格类否定)覆盖不足;
- 修复以微调 CLIP 系为限,对生成式 VLM(LLaVA 等)的否定理解未评估;
- 嵌入坍缩的分析(Figure 6)是诊断性的,尚无针对性的损失设计(如否定感知对比损失)。
工程启示:
- 任何"自然语言过滤"类产品都必须测否定:内容审核("无暴力的图")、医学检索("无肺炎征象")、电商("不含坚果的食品图")——用 NegBench 的管线可以直接对自家模型体检;
- 数据审计视角:检查预训练/微调语料中否定句的占比——大概率低得惊人,这本身就是改进的起点;
- 合成数据闭环的配方可复用:LLM 提议 → 检测器/视觉模型核验→ LLM 改写——"核验"一步是避免把错误监督喂给模型的命门;
- 医学 VLM 的部署方应把否定表述作为专项回归测试,CONCH 的 33% 跌幅说明现有医学基础模型不可直接信任。
七、源码复现
- 官方仓库:https://github.com/m1k2zoo/negbench
- 项目主页:https://NegBench.github.io
- 本地目录:
复现代码/2708-NegBench/ - 官方提供:评测基准(benchmarks/)、合成数据构建脚本(synthetic_datasets/)、全部评测结果 CSV(results/)、微调模型与数据集说明(models.md / datasets.md)
⚠️ 复现路径/未运行:以下为源码结构与预期运行路径分析,非实际运行结果。评测与微调均需 GPU 与 CLIP 权重。
7.1 仓库目录结构(实际下载内容)
2708-NegBench/ ├── README.md / datasets.md / models.md # 数据准备与模型下载说明 ├── results/mcq/ # 论文数字(含 2025-03 归一化 bugfix 后更新值) │ ├── 1_baseline_total.csv / 2_scaling_clip_total.csv / 3_finetuned_total.csv ├── benchmarks/ # NegBench 评测框架(基于 open_clip) │ ├── src/{evaluation, open_clip, training} │ └── scripts/{evaluate_images.sh, evaluate_videos.sh, run_openai_clip.sh, ...} └── synthetic_datasets/ ├── evaluation/{create_mcq.py, paraphrase_captions.py, process_caption_objects.py, ...} └── finetuning/{create_mcq.py, generate_negative_captions.py, filter_negative_objects.py, ...}7.2 关键代码片段(摘自synthetic_datasets/finetuning/create_mcq.py)
MCQ 生成:对每图按正/负对象采样,从三种模板(positive/negative/hybrid)随机选正确答案模板并随机打乱选项位置——对应论文 3.1 节的 MCQ-Neg 构造:
# synthetic_datasets/finetuning/create_mcq.py(节选) templates = ["positive", "negative", "hybrid"] for _, row in test_df.iterrows(): positive_objects = eval(row['extracted_objects']) negative_objects = eval(row['negative_objects']) if len(positive_objects) < 2: # 正对象不足时限定模板,避免"includes A and B"无法成立 A = positive_objects[0] if len(positive_objects) == 1 else None allowed_templates = ["negative", "hybrid", "modified_positive"] else: A, B = random.sample(positive_objects, 2) # 两个正对象 allowed_templates = templates if len(negative_objects) == 0: continue # 无负对象则跳过 N = random.choice(negative_objects) right_template = random.choice(allowed_templates) # 生成 1 正确 + 3 硬负例,random.shuffle 打乱选项 ...(评测侧注意:2025-03 的官方 bugfix 在 MCQ 评测中加入了图像/文本嵌入的 L2 归一化后再算点积——复现 Figure 4 数字请拉取最新代码,结果见results/mcq/*.csv。)
7.3 复现步骤
- 环境:
benchmarks/下按requirements.txt安装(open_clip 生态)。 - 数据准备:按
datasets.md下载 COCO/VOC2007/MSR-VTT/CheXpert;按models.md下载 OpenAI CLIP / NegCLIP / SigLIP / AIMV2 / BioMedCLIP / CONCH 权重。 - 评测:
bash benchmarks/scripts/run_openai_clip.sh # 基线 MCQ/检索评测 bash benchmarks/scripts/evaluate_images.sh # 图像 Retrieval-Neg + MCQ-Neg bash benchmarks/scripts/evaluate_videos.sh # MSR-VTT(4 帧平均嵌入)- 合成数据构建(CC12M-NegFull):
synthetic_datasets/下依次运行对象抽取(LLaMA 3.1)→filter_negative_objects.py(OWL-ViT 核验)→create_mcq.py/paraphrase_captions.py(模板 + LLM 改写);官方将放出全部对象标注与生成 caption。 - 微调:NegCap 用标准 CLIP 对比损失、NegFull 用 $L_{Total} = \alpha L_{CLIP} + (1-\alpha)L_{MCQ}$(扫 α ∈ {0, 0.5, 0.9, 0.99, 1}),对照 Table 1 与 α 消融表。
- 嵌入诊断:按论文 4.1 节用 24 肯定 + 24 否定模板每对象生成 48 条 caption,编码后 PCA 复现 Figure 6 的坍缩/分离现象。
7.4 如何构造不被模板投机的否定评测
否定理解评测容易被表面词频和答案分布污染。若正确答案总落在固定选项位置,模型可以靠位置先验得分;若正例与负例只使用单一模板,模型也可能记住句式而非组合语义。复现时应检查答案位置是否均衡、肯定/否定/混合模板是否覆盖充分,并按错误类型分别统计 False Affirmation 与 False Negation。前者反映模型把不存在的概念判为存在,后者反映模型忽略真实存在的概念;两类错误在内容检索和医学应用中的风险并不相同。
负概念的真实性是数据质量关键。由语言模型提出“图中没有什么”并不保证它确实缺席,因此论文再用开放词汇检测器核验候选负对象。检测器本身也有漏检和类别覆盖边界,所以核验不是绝对真值,特别是在遮挡、视角变化和细粒度类别上。数据集构建时可以对部分样本做人工抽查,报告负概念的核验通过率与错误类型;否则模型的低分可能混杂了理解失败与错误标签惩罚。
7.5 微调改进不等于普遍理解否定
CC12M-NegCap 与 NegMCQ 分别提供更丰富的否定描述和直接的选择判别监督。两种目标侧重点不同:只加强对比式检索可能让模型更会匹配否定文本,却不一定能在四选一里稳定比较细微语义;只加强 MCQ 则可能牺牲普通图文检索表现。论文的 α 消融体现了这种任务权衡。迁移到具体产品时,应依据真实流量中检索与判别的占比选择损失权重,并同时验证普通肯定查询没有明显退化。
评测覆盖图像、视频和医学影像是重要进展,但对开放式生成式 VLM、长句范围否定、双重否定、反事实表达及抽象概念否定仍不能由现有结果直接下结论。特别是医学影像,论文揭示的是模型对否定文本条件的脆弱性,并非临床安全性验证。任何临床使用都需要独立的病例级评测与医生审核;模型输出不应被当作诊断结论。
八、总结
NegBench 用一个设计干净的基准把"VLM 不懂否定"从趣闻变成定量事实:79k 样本、18 个变体、三个模态上,CLIP 系集体贴着随机基线,规模与新架构都救不了,嵌入空间里肯定与否定句根本没分开——根因是训练数据里否定句的系统性缺席。而修复同样朴素:3000–4000 万条经视觉核验的合成否定数据,一句对比损失加一句 MCQ 损失,就把否定 MCQ 抬升最多 27.6 个点。对做检索、审核、医疗影像查询的团队,这篇论文同时是体检报告和治疗处方。
延伸阅读建议:CLIP 与 open_clip(评测框架基础)、NegCLIP/CoNCLIP(组合性与否定的先行微调)、CREPE/CC-Neg(模板化否定基准的局限)、SigLIP/AIMV2(新一代联合嵌入)、CheXpert 与医学报告否定检测(NegEx 等临床 NLP 传统)、Sentence Transformer(嵌入分离的参照系)。
九、引用信息
论文引用:
Kumail Alhamoud, Shaden Alshammari, Yonglong Tian, Guohao Li, Philip H.S. Torr, Yoon Kim, Marzyeh Ghassemi. Vision-Language Models Do Not Understand Negation. CVPR, 2025.
论文 PDF:https://openaccess.thecvf.com/content/CVPR2025/papers/Alhamoud_Vision-Language_Models_Do_Not_Understand_Negation_CVPR_2025_paper.pdf
官方仓库:https://github.com/m1k2zoo/negbench