老魏是刑侦队里最有名的老侦探。他有个习惯:每到一个现场,先拍一张全景照片,再把目击者的证词逐句念一遍,然后对照照片“对口供”。有时候,证词和照片完全吻合,他点点头写“属实”;有时候,照片明明是晴天,证词却说在飘雪,他直接判“证词不实”;还有些时候,证词说“也许有人路过”,照片里根本看不清人影,他就只能写“无法核实”。这种“拿图文对照着判断关系”的本事,正是今天要讲的AI任务——视觉蕴含(Visual Entailment,简称VE)。VE让机器学会做同一件事:给它一张图像和一句文本,让它回答——这句话是能被图像“证明”(蕴含)、跟图像“顶撞”(矛盾),还是“说不准”(中立)。听起来简单,但要让机器真正“看懂”图像、读懂句子、再把两者仔细对照,背后是一整套多模态建模的功夫。这篇文章,我们就跟着老魏一路破案,把视觉蕴含的定义、三分类建模、图文融合、数据集、预训练方法和实际应用一次讲透。
学会视觉蕴含的判断思路与建模技巧,你能在内容审核、假新闻检测、图文匹配等业务中快速落地“图文是否一致”的自动化判别,成为多模态应用的实战型工程师。
目录
可视化演示
展示图文跨模态注意力融合与三分类判别过程,切换模式观察视觉蕴含推理的融合机制和分类结果。
本节配有交互动效(进入视口后自动加载,约 3KB)。
跨模态注意力融合 图像特征与文本特征通过Cross-Attention交互 注意力权重决定每个图像patch对文本token的贡献 attn=softmax(Q*K^T/d)*V 融合后的多模态表征用于三分类判别
什么是视觉蕴含:给图文“对口供”
老魏的办案台账上永远只有三行结论:属实、不实、待查。他拿起一张阳光沙滩的照片,又拿起一份写着“沙滩上阳光很好”的证词,两下一对,立马打钩“属实”;要是证词写的是“此刻正下暴雪”,他眉头一皱打上红叉;要是证词含含糊糊说“可能有人来过”,他就画个问号,注明“待查”。这三栏结论,正是视觉蕴含任务里三个类别的雏形。
视觉蕴含(Visual Entailment,简称 VE)要机器做一模一样的事:输入一张图像 $I$ 和一句自然语言描述 $T$,输出三选一的标签——蕴含(entailment)、矛盾(contradiction)、中立(neutral)。蕴含表示图像内容足以推出这句话;矛盾表示图像与这句话存在明确冲突;中立表示图像既不能证实也不能证伪这句话。本质上,VE 是一个图文一致性判别任务。
模型拿到图文对后,先分别提取视觉特征和文本特征,再通过融合模块判断关系,最后输出一个三分类标签。整个推理目标可以写成下面这个简洁的式子:模型在所有候选类别中计算条件概率,挑出概率最大的那个作为最终裁决。
你看,老魏的“属实、不实、待查”被数学化之后,就成了这样一个小公式。机器没有直觉,它只会老老实实给三种关系各打一个概率分,然后选最高的那个盖章。视觉蕴含的第一步,就是把这个“对口供”的任务定义清楚。
- 输入图文对$I$ 表示输入图像,$T$ 表示输入文本,两者组成模型要“对口供”的原始材料。
- 条件概率$P(y \mid I, T)$ 表示“看到这张图和这句话后,模型认为它属于类别 $y$ 的可能性”。
- 候选类别集合$y \in \{\text{蕴}, \text{矛}, \text{中}\}$ 限定裁决只有三种:蕴含、矛盾、中立。
- 取最大概率$\arg\max$ 表示“挑出概率最大的那个类别”,对应侦探最终盖下的那个章。
三分类建模:侦探的三种裁决
老魏下结论之前,心里其实在默默盘算:现场照片里,太阳、沙滩、遮阳伞,这些线索分别支持哪个结论?如果支持“属实”的线索压倒性占优,他就盖章属实;如果支持“不实”的线索更硬,他就盖章不实;若两边都模棱两可,他就写待查。所谓的“心里打分、取最高”,正是三分类模型的工作方式。
模型对每个类别都有一个原始打分,专业术语叫 logits,可以理解成“证据的毛坯分”。这个分数还不能直接当概率用——它可以是负数,也可以大于 1,三个类别的分加起来也不是 1。于是模型用 Softmax 函数把这些毛坯分“挤”成三个和为 1 的正概率。
Softmax 之后,分数最大的类别胜出。三类各自的判定标准是:蕴含——文本描述的信息能在图像中被直接观察,比如图像有太阳、文本说“阳光好”;矛盾——文本与图像的直接观察互相顶撞,比如图像是晴天、文本说“下雪”;中立——文本超出了图像能证明的范围,比如“可能有人路过”。训练时,模型用交叉熵损失让正确类别的概率不断变高。
老魏的三栏台账,在模型里变成了三个概率值。Softmax 保证三份概率加起来刚好等于 1,模型永远只挑最大那份盖章——这和侦探只允许盖一个结论章的习惯,如出一辙。
- 原始分数$z_j$ 是分类头给第 $j$ 个类别打出的原始分(logits),越大代表收集到的“证据”越多。
- 指数放大$e^{z_j}$ 把原始分数做指数变换,让正分数被放大、负分数被压缩,拉开差距。
- 归一化分母$\sum_{k=1}^{3} e^{z_k}$ 把三个类别的指数分全部加起来,作为“总证据量”。
- 得到概率两者相除后得到一个 0 到 1 之间的概率,三个类别的概率之和恰好等于 1。
视觉语言融合:把证词与现场仔细对照
老魏对口供时眼睛很忙:先扫一眼照片左上角的太阳,再跳回证词的“阳光”两个字,接着又去看照片里的树,回头找“树木”……他会把照片拆成一个个线索,和证词里的关键词逐一配对。真正会办案的 AI 也必须这样做,不能把整张图和整句话囫囵吞进一个袋子。
具体来说,视觉侧用 CNN 或 ViT 把照片编码成一组区域特征向量,每个向量代表照片里一个局部线索,比如“太阳区域”“树冠区域”;文本侧用 BERT 这类语言模型把句子编码成一组词特征向量,每个向量代表一个词的语义。随后,融合模块把两组向量一一对照、互相指认。
最常用的对照手段是注意力机制:对每一个图像区域,模型计算它与所有文本词的匹配度,再归一化成权重,决定这个区域应该“参考”哪几个词。第 $i$ 个图像区域分给第 $j$ 个词的注意力权重由下面这个式子给出:
加权融合就是把所有注意力权重汇总成一个“证据包”:图像区域的最终表示,是它对应的文本词表示的加权求和,权重正是 $\alpha_{ij}$。这些权重就像老魏在照片和证词之间画下的虚线:虚线越粗,说明这条线索越能相互印证。证据包随即交回三分类模块做最终裁决。融合这一步,决定了侦探到底有没有“真看”,还是只是装模作样。
- 图文特征向量$\mathbf{v}_i$ 是图像第 $i$ 个区域的特征,$\mathbf{t}_j$ 是文本第 $j$ 个词的特征。
- 点积相似度$\mathbf{v}_i^\top \mathbf{t}_j$ 是内积运算,衡量两个特征的匹配程度,值越大越相关。
- 指数化$\exp(\cdot)$ 保留差异并保证权重非负,放大“高匹配”线索的贡献。
- 归一化权重分母对所有词求和,把总分压成“谁占多少比例”,即归一化的注意力权重。
数据集与评测:侦探的办案档案库
老魏的徒弟是怎么练出对口供功夫的?靠的是档案库里成千上万份标注好的旧案卷宗:一张现场照片、一句目击证词、以及老魏亲手盖章的结论。VE 模型的“档案库”同样宝贵——它就是大名鼎鼎的 SNLI-VE 数据集。
SNLI-VE 是目前视觉蕴含研究最常用的基准:它把自然语言推理数据集 SNLI 中的句子,与图像数据集 Flickr30k 中的图片一一配成对,再由人工标注三个类别的关系标签,整体规模超过五十六万对图文样本。句子负责扮演“证词”,图片负责扮演“现场”,人工标签负责扮演“老魏的盖章”。
模型在这个档案库上训练之后,如何验收?指标简单直接——准确率:预测正确的样本数占总样本数的比例。公式如下:
档案库越大越干净,徒弟的本事就越扎实;SNLI-VE 就是 VE 领域的“标准档案库”。不过它也有自己的毛病:标注过程难免带偏见,模型可能靠投机取巧“刷”出高分。所以准确率这个数字,得带着怀疑去看——这点我们留到“常见误区”里细细讲。
- 样本总数$N$ 是评测集中图文对的总数,也就是“档案库”里待查验的卷宗数量。
- 指示函数$\mathbb{1}[\cdot]$ 在内部条件成立时取 1,否则取 0,用来“数对勾”。
- 判断正确$\hat{y}_n = y_n$ 表示第 $n$ 个样本的预测标签与人工标签一致。
- 求平均$\frac{1}{N} \sum$ 把正确个数转成比例,即准确率。
预训练方法:侦探学院的系统培训
一个顶级侦探不是只靠翻卷宗练成的。他先要进警校,学看图、学识物、学语言、学常识,这些“通识课”过关之后,才能跟着老魏看卷宗、学对口供。VE 模型也遵循同样的路径:先在海量图文对上进行预训练,再在 SNLI-VE 上微调上岗。
目前最流行的预训练思路是对比学习。它的目标简单粗暴:让“匹配的图文对”在特征空间里挨得近,让“不匹配的图文对”离得远。CLIP 就是这么训练出来的——一张照片配它的正确答案是正样本,配一堆无关句子是负样本,模型要在一大堆干扰项中把正确的描述“揪”出来。
除了对比学习,另一类常用预训练是掩码建模:像完形填空一样,随机遮住图像区域或文本词,让模型靠另一侧的信息补全,从而被迫学会跨模态对齐。ViLT 这类视觉语言 Transformer 就常采用类似思路。预训练结束后,再用 SNLI-VE 微调,把“通识能力”转化成“对口供”的专项技能,这就叫迁移学习。
预训练相当于侦探学院的通识课,微调则是老魏手把手的带教。没有通识课,徒弟看不懂照片、读不懂证词;没有带教,他也不知道“对口供”究竟要按哪三条规则裁决。两步缺一不可。
- 相似度函数$\mathrm{sim}(I, T^{+})$ 是图像与正样本文本的匹配分数,衡量“对口”程度。
- 温度系数$\tau$ 是温度系数,控制分数的“锐利程度”,越小模型越严苛。
- 正样本分子分子的指数项鼓励匹配对的分数尽量高,让“该靠近的靠得更近”。
- 全体分母分母把与 $K$ 个负样本的分数都算进去,强迫模型把正样本从噪声中“揪”出来。
- 负对数$-\log$ 把概率损失转成非负数值,损失越小代表正样本越突出。
应用与优化:把侦探派驻到各个岗位
老魏退休后,他的“对口供方法论”被推广到了三个单位:网监盯着内容审核,反诈中心盯着假新闻,电商平台盯着图文匹配。每个单位都拿到一份手册,再用自己的数据微调,训练出属于自己的“老魏分身”。
内容审核里,VE 用来识别“文案吹得天花乱坠、配图货不对板”的广告;反诈中心用 VE 核对新闻标题与配图是否张冠李戴,揪出“旧图新配”的谣言;电商平台则校验商品标题、卖点与主图是否一致,从源头减少“买家秀卖家秀”式的纠纷。三者本质都是同一件事:判断图文是否一致。
落地部署时,三个类别的错判代价并不相同:假新闻中漏掉“矛盾”后果严重,内容审核中误伤“中立”会引发投诉。因此工程上常用双阈值策略:对概率输出设置一个较高的置信门槛,只有蕴含和矛盾的概率分别超过门槛时才下结论,其余统统归入“中立”,送人工复核。判定规则如下:
老魏总说:“拿不准就写待查,别硬下结论。”双阈值策略正是这句话的工程化表达——机器只在证据十足时拍板,证据不足就把皮球踢给人类专家。从“对口供”到“上岗办案”,视觉蕴含的完整链路,到这里就闭环了。
- 高阈值$\theta_{\text{高}}$ 是人工设定的置信门槛,只有足够自信才允许下结论。
- 蕴含分支$P_{\text{蕴}} \ge \theta_{\text{高}}$ 时判定蕴含,对应“证据充分、盖章属实”。
- 矛盾分支$P_{\text{矛}} \ge \theta_{\text{高}}$ 时判定矛盾,对应“证据明确冲突、盖章不实”。
- 兜底中立两档都不满足时输出中立,对应“待查”,交给人工复核。
AI 应用场景
内容审核:识别“文案与配图打架”的广告
阶段:模型推理与业务规则联动
解决的问题:传统内容审核靠关键词黑名单,只能发现文本违规,发现不了“文案吹嘘纯棉、配图却是化纤”这类跨模态造假,审核员人工抽检成本高、漏检多。VE 模型能对图文对自动打标,把“矛盾”样本直接送入人工复核队列,相当于给审核团队配了一位不知疲倦的“老魏”。
具体案例:某电商平台每天新增数万条商品广告,接入 VE 模型后,对“标题+主图”做三分类筛查,矛盾类广告命中率显著提升,违规广告下架时间从小时级缩短到分钟级。
假新闻检测:核对标题与配图是否张冠李戴
阶段:多模态特征融合与证据链校验
解决的问题:假新闻常用“旧图新配”或“移花接木”,标题与配图驴唇不对马嘴。人工核实需要搜索原图、追查来源,时效差。VE 模型能快速判断“标题-配图”关系,输出“矛盾”告警,辅助辟谣平台优先复核高危险样本。
具体案例:某辟谣平台对热点新闻做 VE 初筛,发现一条“某地发生地震”的帖子配图实为一年前旧图,模型打出“矛盾”高分,人工复核后及时辟谣,阻止了谣言扩散。
电商图文匹配:校验商品标题与主图一致性
阶段:数据清洗与特征对齐
解决的问题:商品标题写“纯棉透气”,主图却是聚酯纤维材质,容易引发退货纠纷。VE 模型在商品上架前校验图文一致性,降低描述不符率,从源头提升购物体验。
具体案例:某服装电商用 VE 模型对商品“标题+首图”做一致性抽检,将描述不符商品召回并通知商家修改,售后纠纷率下降约两成。
Python 演示
"""视觉蕴含三分类演示:用CLIP预训练模型判断图文关系."""import torchfrom PIL import Imageimport clip DEVICE = "cuda" if torch.cuda.is_available() else "cpu" def load_model(): """加载CLIP预训练模型,相当于请出经过通识课训练的侦探.""" model, preprocess = clip.load("ViT-B/32", device=DEVICE) return model, preprocess def entailment_score(model, preprocess, image_path, statement): """将图文分别编码后计算匹配分数,即侦探对口供的环节.""" image = preprocess(Image.open(image_path).convert("RGB")).unsqueeze(0).to(DEVICE) text = clip.tokenize([statement]).to(DEVICE) with torch.no_grad(): logits_per_image, _ = model(image, text) return logits_per_image.item() def judge(score, high=8.0, low=-8.0): """根据双阈值做出三分类裁决:蕴含,矛盾,中立.""" if score > high: return "蕴含" if score < low: return "矛盾" return "中立" if __name__ == "__main__": model, preprocess = load_model() image_path = "beach.jpg" # 请替换为一张真实图片的本地路径 cases = [ "沙滩上有阳光和一把遮阳伞", "暴风雪正在席卷整座城市", "或许有人在海边漫步", ] for stmt in cases: s = entailment_score(model, preprocess, image_path, stmt) print(f"图片: {image_path}") print(f"文本: {stmt}") print(f"匹配分: {s:.2f} -> 判定: {judge(s)}\n")
model, preprocess = clip.load("ViT-B/32", device=DEVICE)加载在数亿图文对上预训练过的 CLIP 模型,相当于请来一位上过通识课的“侦探”。preprocess(Image.open(image_path).convert("RGB"))统一图像尺寸并转成模型能读的张量,相当于给照片“洗印归档”。clip.tokenize([statement])把证词切成词元编号并补上特殊标记,让语言侧也能进模型。logits_per_image, _ = model(image, text)图文同时过编码器,输出匹配分数,得分越高越像“对口”。judge(score, high=8.0, low=-8.0)双阈值三分类:高于上界定蕴含、低于下界定矛盾、中间归中立,对应“拿不准就待查”。
常见误区
误区我拿到 CLIP 分数,觉得 0.8 分就是蕴含,0.2 分就是矛盾,中间就算中立。分数越极端,结论就越肯定。
正解CLIP 分数衡量的是“匹配度”,不是“蕴含关系”。匹配度高只能说明图文相关,比如“阳光海滩”和“有人在海边度假”很匹配,但后者严格说是中立——图像证明不了“度假”这个行为。矛盾要求明确的语义冲突;而中立往往也表现为较低分数。所以要用阈值分区,而不是把低分自动归为矛盾。
为何常见:因为相似度是连续数值,人天然想把它“切成三段”,忽略了蕴含和矛盾在语义上是“可证”与“证伪”的差别。
误区都是输入图像加文本,输出一个结果,VE 就是固定选项的 VQA,好像没什么区别。
正解VQA 的目标是“回答问题”,答案空间开放,甚至可以生成句子;VE 的目标是“判断图文关系”,输出是固定的三分类标签。任务本质不同:VQA 考“知识检索+推理”,VE 考“一致性判别”。模型结构上,VQA 常带答案生成头,VE 则用一个三分类头收尾。
为何常见:两者都是“图+文进、标签出”的交互形式,输入输出长得太像,容易让人混淆。
误区照片是沙漠,证词说“沙漠里没有雪”,这不就是典型的矛盾吗?
正解照片是沙漠,图像本身就能推出“没有雪”(沙漠与雪互斥是常识),这其实是蕴含,不是矛盾。矛盾要求“图像内容与文本直接冲突”,比如照片明明在下雪,文本却说“没有雪”。否定词本身不构成矛盾,要看图像证据能否支持或推翻它。
为何常见:人容易只盯着文本的否定形式,却忽略了图像证据的推论作用——而“能否由图像推出”恰恰是蕴含判定的核心。
误区模型在测试集上准确率 90% 以上,说明它真的在看图、真的在推理图文关系。
正解SNLI-VE 存在明显的语言偏见:模型可能只靠句子就能猜出大部分标签(比如否定词、情感词与标签之间的相关性),根本不需要图像。很多研究显示,不看图像的纯文本基线也能达到较高准确率。所以上线前要做“图像擦除”对抗测试,确认模型真的在利用视觉信息,而不是在“背答案”。
为何常见:数据集与真实分布存在偏差,准确率又是单一指标,容易被“刷”出乐观数字,让人误以为模型学会了推理。
面试题
Q1. 视觉蕴含VE任务要求模型输出什么?
- A.一段对图像的自然语言描述
- B.图文关系三分类标签之一← 正确答案
- C.图像中所有物体的坐标框
- D.关于图像内容的开放答案
答案:B。VE 是判别式三分类任务,输出蕴含/矛盾/中立中的一个标签。A 是图像描述任务,C 是目标检测,D 更像是 VQA 的开放回答。只有 B 准确描述了 VE 的输出本质。
Q2. 照片是阳光沙滩,哪句证词应判定为“蕴含”?
- A.沙滩上正席卷暴风雪
- B.阳光把沙滩晒得发烫← 正确答案
- C.也许有人昨夜来过
- D.海边空气特别清新
答案:B。B 描述的事物能被图像直接推出,属于蕴含;A 与图像冲突应判矛盾;C 和 D 图像无法证实也无法推翻,应判中立。这就像老魏对口供:能证明的才盖章“属实”。
Q3. 对比学习预训练希望达到什么效果?
- A.拉近匹配图与文并推开不匹配对← 正确答案
- B.让图像被压缩成更小的数据量
- C.让文本生成更长的段落句子
- D.让模型记住训练集全部样本
答案:A。对比学习的核心是“匹配对靠近、不匹配对远离”,让图文在特征空间里对齐,这是 CLIP 等模型的基本功。B 是数据压缩的概念,C 是文本生成,D 是过拟合,都不是对比学习的目标。
Q4. 关于“中立”类别,下列说法正确的是?
- A.中立表示图文之间存在明显冲突
- B.中立表示图文特征完全相同
- C.中立表示图像无法证实文本信息← 正确答案
- D.中立表示文本一定是疑问句
答案:C。中立等于“证据不足”:图像既不能推出也不能推翻文本。A 描述的是矛盾;B 太绝对,特征相同不是中立的定义;D 与句式无关,陈述句同样可能中立。
Q5. SNLI-VE数据集的图文来源是?
- A.图像来自MS-COCO,文本来自SNLI
- B.图像来自Flickr30k,文本来自SNLI← 正确答案
- C.图像来自ImageNet,文本来自SQuAD
- D.图像来自MNIST,文本来自GLUE
答案:B。SNLI-VE 用 SNLI 的句子作为“证词”,配 Flickr30k 的图片作为“现场”,再人工标注三分类。A 的图像来源不对,C 的 SQuAD 是问答文本,D 的 MNIST 是手写数字集,都不构成图文对。
Q6. 注意力融合中 α_ij 表示什么?
- A.图像区域i对文本词j的关注权重← 正确答案
- B.图像区域i与区域j的颜色差值
- C.文本词j在句子里的词频占比
- D.图像和文本各自的特征维度
答案:A。注意力权重 α_ij 衡量第 i 个图像区域与第 j 个文本词的相关程度,用于加权汇总跨模态信息。B 描述的是像素差异,C 是词频统计,D 是特征维度,都与注意力无关。
Q7. 图像被“擦除”后模型准确率依然很高,说明什么?
- A.模型具有极强的视觉推理能力
- B.模型主要靠文本偏见在做预测← 正确答案
- C.测试集样本数量明显不足
- D.图像特征提取器工作异常
答案:B。图像被擦除后准确率不降,说明模型根本没在利用视觉信息,而是利用数据集的语言偏见(如否定词与标签的假相关)猜答案。这与“真会看图推理”背道而驰,是数据偏见的典型表现。
Q8. 双阈值策略中“拿不准就给中立”的目的是什么?
- A.提高模型在推理时的计算速度
- B.对低置信样本降级处理避免误判← 正确答案
- C.让三个类别的样本数完全相等
- D.使模型无法输出蕴含这一类别
答案:B。双阈值把低置信区域划给“中立”,让模型只在证据充分时才下结论,不确定的交给人工复核,从而降低误判代价。A 与速度无关,C 与类别均衡无关,D 违背三分类设计初衷。
Q9. 以下哪些是视觉蕴含的典型应用?
- A.审核广告文案与配图是否相符← 正确答案
- B.检测新闻标题与图片是否匹配← 正确答案
- C.校验商品卖点与主图是否一致← 正确答案
- D.预测用户下一件购买的商品
答案:ABC。前三项都属于“图文一致性判别”,是 VE 的典型场景;D 是推荐系统的行为预测,不涉及图文关系判断,不属于 VE 应用。
Q10. 下列哪些做法能提升VE模型的鲁棒性?
- A.在图文语料预训练后微调VE数据← 正确答案
- B.用图文擦除对抗样本做测试← 正确答案
- C.加入反向增强构造矛盾样本← 正确答案
- D.用纯文本模型替代多模态模型
答案:ABC。预训练+微调、图文擦除对抗测试、矛盾样本增强都能提升鲁棒性。D 用纯文本模型替代多模态模型等于放弃视觉信息,会加剧语言偏见,恰恰是鲁棒性的反方向。