LAVIS 数据集全解析:SNLI-VE 视觉蕴含任务的数据构成、评测指标与 ALBEF 实战
2026/9/23 11:03:30 网站建设 项目流程

LAVIS 数据集全解析:SNLI-VE 视觉蕴含任务的数据构成、评测指标与 ALBEF 实战

【免费下载链接】LAVISLAVIS - A One-stop Library for Language-Vision Intelligence项目地址: https://gitcode.com/gh_mirrors/la/LAVIS

SNLI-VE(Stanford Natural Language Inference - Visual Entailment)是 LAVIS 仓库内置支持的一个经典视觉语言推理数据集:它要求模型以一张图片作为前提(premise),判断一句自然语言假设(hypothesis)与图片之间的蕴含、中立或矛盾关系。本文以 dataset_card/snli_visual_entailment.md 数据集卡片为骨架,结合仓库内的数据集源码、配置 YAML 与训练/评测脚本,完整梳理 SNLI-VE 的任务定义、数据统计、评测方式,并给出在 LAVIS 中从数据下载到 ALBEF 微调与评测的端到端实战方案。

SNLI-VE 是什么:视觉蕴含(Visual Entailment)任务定义

SNLI-VE 由 Xie 等人提出(arXiv:1811.10582),其核心目标是推理图片前提 P_image 与文本假设 H_text 之间的关系。任务设定如下:

  • 给定一张图片作为前提(premise),给定一句自然语言句子作为假设(hypothesis);
  • 根据 (P_image, H_text) 所表达的关系,为样本分配三种标签之一:
    • entailment(蕴含):P_image 中存在足够证据可以断定 H_text 为真;
    • contradiction(矛盾):P_image 中存在足够证据可以断定 H_text 为假;
    • neutral(中立):P_image 中的证据不足以对 H_text 的真伪做出结论。

如上图所示,同一张前提图片可以对应多个假设句,例如“两个穿棕色衬衫的人带着女人和两条黑狗站在户外”这一前提,可派生出蕴含、中立、矛盾三种不同标签的样本——这正是视觉蕴含与图像分类、检索等任务的本质区别:它考验模型基于视觉证据做细粒度逻辑推理的能力。

值得注意的是,数据集卡片中明确强调:SNLI-VE 建立在 Flickr30k 之上,即复用 Flickr30k 的图片,外加人工构造的蕴含标注。这一点在仓库的配置文件中有直接体现(详见下文“数据在 LAVIS 中的实现”一节)。

数据构成与统计分析

SNLI-VE 划分为 train、dev、test 三个 split,三个标签(entailment、neutral、contradiction)在每一个 split 内都近似均匀分布。数据集卡片给出的详细统计如下:

TrainDevTest
#Image2978310001000
#Entailment17693259595973
#Neutral17604559605964
#Contradiction17655059395964
Vocabulary Size2955065766592

从中可以看出几个关键事实:

  • 训练集规模大、标注充分:训练集约 3 万张图片、近 53 万条样本,每个标签约 17.6 万条,标签分布基本均衡,无需做类别重加权;
  • 同一图片对应多条假设:图片数远小于样本数,说明每张前提图片平均派生约 18 条假设标注,这与上一节“前提-多假设”的示例一致;
  • 测试集相对精简:dev/test 各 1000 张图片、约 1.8 万条样本,适合作为快速验证与提交基准。

仓库 defaults.yaml 中分别给出了三个 split 的标注文件映射:train →snli/annotations/ve_train.json、val →snli/annotations/ve_dev.json、test →snli/annotations/ve_test.json,而图片统一指向flickr30k/images/flickr30k-images,再次印证了 SNLI-VE 与 Flickr30k 图片共享的关系。

评测指标与模型排行榜

SNLI-VE 的官方评测指标为Accuracy(准确率),即预测标签与真实标签一致的样本占比。由于三个标签在各 split 中近似均匀分布,Accuracy 可以直接反映模型的真实判别能力,无需引入 macro/micro 等加权处理。

数据集卡片给出了按 dev 集准确率排序的公开排行榜(节选核心模型):

RankModeldevtest
1CoCa87.087.1
2SimVLM86.286.3
3SOHO85.085.0
4ALBEF80.880.9
5VILLA80.280.0
6UNITER79.479.4
7LXMERT72.472.5
8BUTD65.365.7

排行榜展示了视觉蕴含任务从自底向上注意力(BUTD)到大规模预训练视觉语言模型(CoCa、SimVLM)的演进轨迹,也说明该任务对跨模态对齐与推理能力的要求较高。ALBEF 以 80.8/80.9 的成绩位居第四,而 ALBEF 正是 LAVIS 仓库中为该任务提供完整训练/评测管线的主力模型(见下文)。

数据获取:自动下载脚本

数据集卡片给出了最简明的数据获取方式——运行仓库内置的 Flickr30k 下载脚本:

cd lavis/datasets/download_scripts && python download_flickr.py

该脚本位于 download_flickr.py,负责下载 SNLI-VE 复用的 Flickr30k 图片。需要说明的是:

  • 标注文件(ve_train.json / ve_dev.json / ve_test.json)与图片的存放位置由 defaults.yaml 的build_info控制,其中storage字段定义了相对存储路径;
  • snli_ve_instruct配置(defaults_instruct.yaml)中,三个 split 的标注文件提供了可直接拉取的公开下载地址,图片则指向flickr30k/images/flickr30k-images或本地路径,方便不同网络环境的用户选用;
  • 使用load_dataset时,LAVIS 会依据build_info自动完成下载、存储与读取。

数据在 LAVIS 中的实现:源码解读

SNLI-VE 在仓库中的核心实现位于 snli_ve_datasets.py,包含两个数据集类。

分类数据集 SNLIVisualEntialmentDataset

该类继承自 MultimodalClassificationDataset(后者又是 BaseDataset 的子类),核心逻辑如下:

  • 类别映射_build_class_labels()将三个标签映射为数值索引{"contradiction": 0, "neutral": 1, "entailment": 2},这也是分类头输出维度num_classes=3的来源;
  • 样本读取__getitem__根据标注中的image字段拼接图片路径os.path.join(self.vis_root, "%s.jpg" % image_id),经 PIL 打开并转为 RGB 后送入vis_processor做图像预处理;假设句ann["sentence"]text_processor处理;
  • 返回结构:每个样本返回imagetext_input、数值化的labelimage_idinstance_id,其中image_id指向 Flickr30k 图片编号,instance_id是样本级唯一标识;
  • 可视化调试:内置displ_item混入类,可返回filesentencelabelimage的 OrderedDict,便于在 dataset_browser 等工具中展示样本。

指令微调数据集 SNLIVisualEntialmentInstructDataset

snli_ve_instruct变体(对应 defaults_instruct.yaml)将三分类任务改写为指令问答形式,适配 InstructBLIP 类生成式模型:

  • classnames被替换为['no', 'maybe', 'yes'],分别对应 contradiction / neutral / entailment;
  • 每条样本自动生成提示词"based on the given the image is {} true?",并把标签字符串作为answerlabel返回,question_id复用instance_id

从源码结构看,这种设计让同一份 SNLI-VE 数据既能驱动判别式三分类模型,也能驱动生成式指令模型,体现了 LAVIS“一库多用”的数据层抽象。

配置文件详解:图像与文本预处理

SNLI-VE 在 LAVIS 中默认采用 CLIP 风格预处理(instruct 变体)或 BLIP 风格预处理(ALBEF 微调配置),两者都值得关注。

以 defaults_instruct.yaml 为例:

  • vis_processor:train 与 eval 均使用clip_image_train/clip_image_eval,图像尺寸image_size: 224
  • text_processor:train/eval 均使用blip_caption,负责对假设句做统一规范化;
  • data_typeimages,即按静态图片而非视频/特征处理。

而在 ALBEF 的训练配置(snli_ve_ft.yaml)中,图像预处理切换为blip_image_train/blip_image_eval,文本处理器同样为blip_caption。两种配置一脉相承,只是处理器名称与模型架构不同。

实战:用 ALBEF 在 SNLI-VE 上微调与评测

LAVIS 仓库为 SNLI-VE 提供了开箱即用的 ALBEF 三分类模型(架构注册名为albef_classification,模型类型ve),对应配置 albef_classification_ve.yaml。关键参数如下:

参数取值说明
num_classes3对应 entailment / neutral / contradiction
use_distillTrue启用动量蒸馏(momentum distillation)
momentum0.995动量编码器更新系数
alpha0.4蒸馏损失权重上限
image_size384输入图像分辨率
vit_typebaseVision Transformer 主干
med_config_pathconfigs/models/med_config_albef.json文本/多模态编码器配置

模型实现位于 albef_classification.py,值得关注的实现细节:

  • 分类头cls_headLinear(hidden_size, hidden_size) → ReLU → Linear(hidden_size, num_classes)组成,作用在文本编码器输出last_hidden_state[:, 0, :](即 [CLS] 位置)之上;
  • 动量蒸馏:训练时以动量更新方式维护一份编码器副本,loss = (1 - alpha) * CrossEntropy + alpha * KL(softmax(prediction), softmax(prediction_m))alpha随训练进度由_rampup_factor从 0 线性爬坡到 0.4,这与 ALBEF 论文中的动量蒸馏策略一致;
  • 推理模式forward(is_train=False)仅返回predictionstargets,供评测阶段计算 Accuracy。

微调命令

仓库提供了 train_ve_albef.sh:

python -m torch.distributed.run --nproc_per_node=8 train.py --cfg-path lavis/projects/albef/train/snli_ve_ft.yaml

对应训练配置 snli_ve_ft.yaml 中的关键超参数:任务multimodal_classification、学习率调度linear_warmup_cosine_lrinit_lr: 2e-5weight_decay: 0.05max_epoch: 10batch_size_train: 32batch_size_eval: 64,训练 split 为["train"],验证用["val"],输出目录output/ALBEF/SNLI_VE

评测命令

仓库提供了 eval_albef_ve.sh:

python -m torch.distributed.run --nproc_per_node=16 evaluate.py --cfg-path lavis/projects/albef/eval/snli_ve_eval.yaml

对应评测配置 snli_ve_eval.yaml:evaluate: Truetest_splits: ["val", "test"],并可直接加载 albef_classification_ve.yaml 中声明的 ALBEF SNLI-VE 微调权重(load_finetuned: True)。评测输出即模型在 dev/test 上的 Accuracy,与数据集卡片排行榜口径一致,可复现 ALBEF 约 80.8/80.9 的水平。

小结与扩展阅读

SNLI-VE 以“图片前提 + 文本假设 + 三分类标签”的形式,为视觉语言模型提供了细粒度的逻辑推理测试床。围绕这一数据集,LAVIS 仓库形成了从数据卡片、下载脚本、数据集类、配置体系到模型训练/评测脚本的完整闭环:

  • 数据集卡片:snli_visual_entailment.md(含示例图 snli_ve.png);
  • 数据实现:snli_ve_datasets.py;
  • 数据配置:defaults.yaml、defaults_instruct.yaml;
  • 模型与训练/评测: albef_classification.py、albef_classification_ve.yaml、snli_ve_ft.yaml、snli_ve_eval.yaml。

读者既可以直接复用仓库脚本完成 ALBEF 的 SNLI-VE 微调与评测,也可以基于SNLIVisualEntialmentDatasetSNLIVisualEntialmentInstructDataset的源码,将该数据集适配到自定义的判别式或生成式模型中。

【免费下载链接】LAVISLAVIS - A One-stop Library for Language-Vision Intelligence项目地址: https://gitcode.com/gh_mirrors/la/LAVIS

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询