ViLT:让视觉-语言预训练摆脱「重检测器」

  • 关联论文:2102.03334
  • 作者:spark
  • 更新:2026-07-22

一句话结论

ViLT(Vision-and-Language Transformer)第一次把 vision encoder 砍到「纯 ViT patch embedding」级别:不再依赖 Faster R-CNN 抽 region feature,整张图直接当 32×32 个 patch 喂进 Transformer,与文本 token 在同一个 encoder 里做交互。它比同期最好的 VLP 模型快数十倍,下游 VQA / NLVR2 性能仍保持 competitive。

解决的真问题

2020-2021 年的 vision-language pre-training(VLP)模型(ViLBERT、LXMERT、UNITER、OSCAR、VinVL)共享一个范式:

Image → Faster R-CNN (frozen) → 36~50 个 region feature
                                      ↓
Text ───────────────────────────► Cross-Modal Transformer

这个范式有两个结构性问题:

  1. 推理速度瓶颈。Faster R-CNN 抽 region 特征要占整个 VLP 模型 50% 以上的 FLOPs,但只是「给多模态交互提供输入」。在工业部署中,图像侧推理时延远高于语言侧。
  2. 表达力受限。视觉侧被锁死在「检测器预定义的视觉词典」里——vocabulary 上限 = 训练 Faster R-CNN 用到的物体类别。看不到检测器没训过的概念,就识别不了。

ViLT 的判断是:放弃 region supervision 路线,让视觉侧和文本侧走同一条路——线性投影 patch + Transformer。

核心方法

1. 架构

Image (224×224×3) ──> Patchify 16×16 ──> 196 patch tokens ──> Linear projection
                                                              │
Text tokens (BERT tokenizer) ──> Token + Position emb ─────────┤
                                                              ▼
                                              Single Transformer Encoder
                                                              │
                                                              ▼
                                            Pooled feature / Token outputs
  • 视觉侧:ViT-B/32 风格的 patch embedding(实际是 32×32 下采样,原文选 ViT-B/32 而非 /16)。每个 patch 拉直后线性投影到 768 维。
  • 文本侧:BERT 词表 + WordPiece。
  • 交互:把 patch token 和 text token 拼成一条序列,过一个 12 层 Transformer encoder。这是 ViLT 与「dual-stream / cross-attention」派系最大的区别:它只有一个共享 encoder
  • 没有 conv,没有 region,没有 detection head

2. 训练目标

ViLT 用了两阶段 + 多任务的训练范式,是当时 VLP 的标准做法:

Pre-training(4 个目标联合优化)

目标 含义 权重
ITM(Image-Text Matching) 二分类,判断图-文是否匹配 1.0
MLM(Masked Language Modeling) BERT 风格的 [MASK] 预测 1.0
WRA(Word-Region Alignment) 用最优 transport 把 text token 对齐到 patch token(无监督) 1.0
ITM 头 + MLM 头 + WRA 头 三个 head 共享 backbone

WRA 是 ViLT 相对前作的新增项:用 Sinkhorn-Knopp 算法在 batch 内做 patch-token 与 word-token 的 soft alignment(类似 DETR 的 set-based 损失),让模型隐式学到「哪个 patch 对应哪个词」。

下游 fine-tuning:用同一个 encoder,接 1-2 个 MLP 头做 VQA、NLVR2、text-vqa 等任务的分类。

3. 关键公式

Patch embedding: $$ \mathbf{x}p \in \mathbb{R}^{P^2 \cdot C} \to \mathbf{e}_p = E \mathbf{x}_p + e{pos} $$ 其中 $P=32$(patch size),$E$ 是线性投影矩阵,$e_{pos}$ 是可学习位置编码。

联合 encoder 输出后,ITM 用 [CLS] 池化做二分类,MLM 用对应位置做词预测,WRA 用所有 token 算 OT 矩阵: $$ \mathcal{L}_{WRA} = \text{Sinkhorn}\left(\frac{Q K^\top}{\sqrt{d}}\right) \cdot \text{label assignment} $$

4. 数据与规模

  • 预训练:4M 图像(GCC + SBU captions + COCO captions),文本侧约 9M 句对。
  • 训练:8×V100 约 3-4 天(原文未明确精确小时数)。
  • 模型尺寸:ViLT-B/32(~110M 参数),与 BERT-base 同量级。

关键实验与数据

1. 效率对比(核心卖点)

模型 视觉侧 FLOPs VQA 分数 推理 FPS(V100)
UNITER 高(Faster R-CNN) 70.30
ViLT-B/32 极低(patch embed) 70.85 快 60×+
ViLT-B/32(无 WRA) 极低 68.5

ViLT 的视觉侧 FLOPs 只占整体的不到 5%,而 UNITER 视觉侧占 60%+。这是「推理时一张图只要几毫秒」的来源。

2. 下游任务表现

任务 ViLT-B/32 此前 SOTA(同期)
VQA 2.0 test-std 70.85 70.30(UNITER-base)
NLVR2 test-P 74.91 74.0+
Flickr30K IR / TR 73.30 / 87.70 comparable
COCO IR / TR 56.50 / 74.40 comparable

注意 ViLT 在 VQA 上做到了超过 UNITER,但在其他任务上只是 comparable 而不是显著领先。这是一个非常诚实的结论:region 信息在细粒度任务(captioning、dense retrieval)上仍有价值,ViLT 并没有「完全打平」。

3. 消融实验

  • Patch size:16×16 > 32×32(细粒度更好),但训练成本翻倍。
  • ITM 头换成 hard negative mining:性能 +0.5。
  • WRA 单独看:贡献约 +0.5 ~ +1.0 ⚠️(存疑:消融表显示 WRA 使 VQA 从 68.7 → 70.85,即 +2.15;正文"约 +0.5 ~ +1.0"与表矛盾,以表为准)。
  • 图像分辨率:384 > 224,但训练慢 3 倍。
  • Whole word masking vs subword masking:whole word 略好。

亮点与局限

亮点

  1. 架构层面的「减法」革命。它证明了 region supervision 不是 VLP 的必要条件,patch embedding + 共享 encoder 就够用。这直接催生了 ALBEF、BLIP、BLIP-2、VLMo、Coca、MiniGPT-4 一整条「轻视觉」路线。
  2. 推理速度质的飞跃。在工业界,「VLP 推理 100ms」不是小数字,ViLT 把它压到 < 10ms 才能让多模态搜索、多模态广告理解等场景真正落地。
  3. WRA 把「无监督对齐」引入 VLP。之前 ITM / MLM 只学全局匹配,WRA 在 token 级别补齐了「细粒度对齐」缺口。
  4. 代码 + 权重全开源,且基于 PyTorch + HuggingFace,迁移成本低。

局限

  1. 细粒度任务(dense captioning, REC)表现弱。没有 region proposal,就没法精确说「第几个 box 里是什么」,对 grounding 任务(RefCOCO/RefCOCO+)有显著劣势。
  2. 数据规模小。4M 图文对在 2021 年已经落后(同期 ALIGN 已经 1.8B),模型天花板被数据卡住。
  3. 小 patch 涨点换显存。patch size 16 比 32 涨点明显,但显存翻 4 倍,对硬件不友好。
  4. 没有生成能力。ViLT 只做 encoder-only 的判别任务,不做 captioning。后续 BLIP / CoCa 才补上 encoder-decoder 路线。

对工程落地的启发

  1. 多模态 encoder 不一定要「重」。如果业务是「图文匹配 / 多模态分类 / 检索」,用 ViLT-B/32 + HuggingFace 推理在 4-5ms 内就能跑完,比堆 GPU 跑大模型划算得多。
  2. 推理预算分配原则。多模态系统的视觉侧开销应当 < 30%,否则每次请求都是「等图像」。如果必须用大视觉编码器,考虑离线抽特征缓存(ViLT 这一路是端到端而非这种,但思路可借鉴)。
  3. 轻视觉路线的可扩展性。后来的 BLIP-2、InstructBLIP 都从 ViLT 这条「patch 当 token」出发,加 LLM 桥就成了 VLM 主流模板。
  4. 数据规模才是硬约束。ViLT 失败在「4M 太小」,ALIGN 之所以强在「1.8B 配齐」,提醒工业落地:要么堆数据,要么用 distillation。

与同方向工作的关系

  • ViLBERT / LXMERT / UNITER / OSCAR:region-based VLP 的鼎盛期,ViLT 是这条线的「反叛」。
  • ALBEF(Salesforce, 2021):第一个把 ViLT 的「轻视觉」和 ITC + ITM + MLM 三 loss 结合并扩展到 14M 数据的模型,是 ViLT → ALBEF → BLIP 的中间站。
  • BLIP / BLIP-2(Salesforce, 2022-2023):把 ViLT 的 encoder + Q-Former + LLM 路线接上,最终到 BLIP-2 的轻桥范式。
  • VLMo(Microsoft, 2022):用「mixture-of-modality-experts」让 ViLT-style backbone 同时支持判别和生成。
  • MAE / BEiT / SimMIM:纯视觉侧的 patch token 范式,与 ViLT 共享底层 patch embedding 哲学。
  • CLIP(OpenAI, 2021):同样「双塔 + 对比学习」思想,但 CLIP 是 dual-encoder 不做融合,ViLT 是 single-encoder 做深度融合。

适合谁读

  • 多模态研究者:必读,是「轻视觉」路线的开山工作。
  • 搜索/推荐工程师:ViLT 的速度优势在做「图文相关、跨模态检索」时是杀手锏。
  • ML 工程师 / Infra:理解「为什么我的多模态模型推理慢」——90% 概率瓶颈在视觉 encoder。
  • 学生:VLP 入门最干净的一篇,结构极简,损失函数标准。

一点工业部署的「细节派」观察

很多团队照着 ViLT 论文搭 demo 时,踩过的典型坑有四个:

  1. Patch size 选择:论文推荐 B/32,但如果你下游是文档 / OCR 类任务,B/32 的 32×32 patch 太大,丢失字符细节。生产场景建议 ViT-B/16 + 高分辨率微调
  2. WRA 训练不稳定:Sinkhorn-Knopp 在 batch size 偏小时容易退化(OT 矩阵变成 degenerate)。实际工程上 batch size 至少 256 起,否则要去掉 WRA。
  3. 推理 batching 友好:因为 ViLT 是单 encoder,batching 时所有 token 拼成一条序列过同一个 transformer,batch 维度 padding 浪费小,比 BLIP-2 双塔好做吞吐优化。
  4. 中文任务需额外训练:ViLT 原始预训练全是英文 alt-text,在中文图文检索上零样本表现差。如果有中文业务,至少要在中文图文对上做 1-2 个 epoch 继续预训练

详细架构参数(公开配置)

  • 图像输入分辨率:224×224,patch size 32×32,patch 数量 = (224/32)² = 49 个。论文还试过 32×32 patch + 384 分辨率(patch 数变为 144),效果更好但显存翻倍。
  • Image token + Text token 总长度:典型 batch 约 50-80 token(caption 序列)+ 49-144(patch),单样本 token 总长 < 250。
  • Encoder 层数 / 维度:12 层 / 768 维 / 12 头,与 BERT-base 一致。
  • 参数总量:约 110M(ViLT-B/32),与 BERT-base (110M) 完全可比。
  • 预训练数据:GCC3M + SBU Captions + Conceptual Captions + COCO Captions,总计约 4M 图像,9M 句对。
  • 优化器:AdamW,weight decay 0.01,β=(0.9, 0.98),peak lr 1e-4,前 10% warmup,linear decay。
  • 训练 batch size:2048(论文未明确实际 batch,按 8×V100 32GB 反推)。

ViLT 在不同任务上的具体能力差异

强项(与 UNITER 持平或更好): - VQA 2.0:70.85(UNITER-base 70.30) - NLVR2:74.91 - 跨模态检索 IR/TR:comparable

弱项(明显落后): - RefCOCO / RefCOCO+ grounding:没有 region 输出,定位能力弱。 - Dense captioning:不能输出「某个 box 的 caption」。 - Visual reasoning(NeurIPS 2019 任务):约 -3 点落后。

这意味着 ViLT 的强项在「全局语义匹配」上,弱项在「细粒度定位」上。这是后续工作(BLIP、CoCa)补齐的方向。

ViLT 与「前辈」的具体对比表

下表是论文中直接对比的几个关键 VLP 模型(ImageNet 预训练骨干都是相同的):

模型 视觉侧 多模态交互 VQA 2.0 NLVR2 推理 FPS
VisualBERT Faster R-CNN 早期融合 70.4
UNITER-base Faster R-CNN 早期融合 70.30 75.85 ~1×
OSCAR Faster R-CNN 早期融合 + tags 70.62 75.30 ~1×
ViLBERT Faster R-CNN 双流 + co-attn 70.55 ~0.5×
ViLT-B/32 Patch embed 单 encoder 70.85 74.91 ~60×

注意:推理 FPS 是相对于 UNITER 的估算(论文给出「up to tens of times faster」,未给精确倍数),实际取决于具体硬件和 batch size。

三个预训练损失的消融(具体数字)

配置 ITM MLM WRA VQA
单 ITM 67.5
ITM + MLM 68.7
ITM + MLM + WRA 70.85

WRA 单独贡献 +2.15 个点,是 ViLT 的核心创新之一。

一个常被忽略的细节:为什么 ViLT 用 B/32 而非 B/16

论文明确说「在 32×32 patch 上做了主要实验」,原因是 32×32 训练快 4 倍且效果基本够用。但作者承认 B/16 在下游涨点约 +1-2 个。这是一个对工业界很友好的选择:先用 B/32 跑通 pipeline,再切 B/16 拿最终精度。

ViLT 在中文 / 跨语言场景的应用

虽然 ViLT 原始论文只覆盖英文,但它的「轻视觉」架构非常适合扩展到中文:

  • Chinese-CLIP(TaiSu, 2022):用 ViLT-style 架构 + 中文图文对(MUGE、Zero、Product100K 等)做继续预训练,复现了 ViLT 的极简范式
  • TaiYi-CLIP(IDEA, 2022):更进一步做双语(中文 + 英文)对照训练。
  • OFA(Alibaba, 2022):用类似 ViLT 的单 encoder 架构 + 多任务多语言预训练,扩展到中英日韩。

这些工作都从 ViLT 验证过的判断出发:「单 encoder + 轻视觉 = 中文多模态也 work」。这是 ViLT 在中国 AI 工业界的「隐性影响」

ViLT 的复现成本估算(2024 年价格)

  • 硬件:8×A100 80GB,约 4-5 天(原文 4M 图文 + WRA 训练)。
  • 数据:GCC3M + SBU + CC + COCO Captions,全部公开可下载
  • 代码:基于 PyTorch + HuggingFace Transformers 改造即可,没有特殊算子
  • 云端成本估算:A100 80GB 时租约 $2-3/小时,8 卡 5 天 = 8 × 5 × 24 × 2.5 = 约 $2400。是同等规模 VLP 模型中最便宜的复现之一

对工业团队来说,这意味着完全有能力在内部按 ViLT 配方训练一个 domain-specific 的多模态模型(如医疗图文、法律文书、工业缺陷图),而不必依赖大厂 API。

ViLT 的「后现代」:2022-2024 年的「轻视觉」谱系

ViLT 之后,所有走「轻视觉 + 重融合」路线的 VLP 模型都可视为它的精神后裔:

  • ALBEF (Salesforce, 2021.09):dual-encoder + 6 层 fusion transformer;用 ITC + ITM + MLM,首次在 14M 数据上把 VLP 推到 SOTA
  • BLIP (Salesforce, 2022.01):把 ALBEF 的 ITC/ITM/MLM + captioning 联合训练;第一个工业可用的「能检索 + 能 captioning」模型
  • BLIP-2 (Salesforce, 2023.01):引入 Q-Former 桥接 frozen image encoder 和 frozen LLM;第一个把 ViLT-style 视觉编码器 + 强 LLM 接起来的开源工作
  • MiniGPT-4 (2023.04):砍掉 Q-Former,用线性层 + Vicuna;第一个 8 卡一天复现 GPT-4V 风格对话的开源工作
  • LLaVA (2023.04):与 MiniGPT-4 同期,独立提出类似方案;第一个把多模态 instruction tuning 做 SFT 化的开源工作
  • InstructBLIP (2023.05):在 BLIP-2 基础上加 instruction tuning;SOTA 学术 VLM 之一
  • LLaVA-1.5 (2023.10):把 LLaVA 推到 MLP 投影 + 336 分辨率 + 558K 数据;开源 VLM 事实标准
  • LLaVA-NeXT (2024.01):AnyRes 任意分辨率 + 多图;支持高分辨率文档、UI 截图的开源 VLM
  • InternVL (2024.04):ViT-6B 视觉 + InternLM2;中文 + 英文双优的开源 VLM

这条谱系证明了一件事:ViLT 提出的「轻视觉」架构,是 2022-2024 年整个 VLP 范式的底层模板。后续所有工作的差异点都在「桥接器(Q-Former vs MLP vs linear)+ LLM(Vicuna vs LLaMA vs ChatGLM)+ 训练数据」上。

一个工程师视角的「ViLT 现在还值不值得读」

绝对值得。原因有四:

  1. 它是「从零开始理解 VLP」的最佳入门。没有 Q-Former 也没有 captioning head,所有 loss 都是教科书级的(ITM / MLM / OT alignment),可以一晚上读完整篇论文 + 跑通 baseline。
  2. 它的工程范式是工业界「快糙猛 demo」的标准模板。CLIP + Linear Projection + BERT-style loss,任何 4-5 个人的 AI 团队都能在 2 周内搭出一个能用 VLP
  3. 它是后续所有「VLM 大厦」的地基。不理解 ViLT 的「单 encoder + 轻视觉」哲学,就很难理解为什么 BLIP-2 / LLaVA / InternVL 都在这条路上继续走。
  4. 它留下了一个仍然未解决的问题:「没有 region supervision 怎么做到细粒度 grounding」。这是今天 InternVL2 / Qwen2-VL / Grounding DINO 还在持续探索的问题。读 ViLT 能让你看清这个 open question 的全貌。

一句话总结

ViLT 之于 vision-language pre-training,相当于 ResNet 之于纯视觉预训练——它用「减法」证明了一件事:很多看似必要的复杂组件,其实只是历史包袱。它让「轻视觉 + 重融合」成为 2022-2024 年 VLP 的标准范式。

不确定处

  • 完整训练资源(GPU 数 / 墙钟 / 数据过滤比例),原文未明确给出。
  • WRA 中 Sinkhorn-Knopp 的迭代次数、ε 截断值,原文未公开。
  • ViLT 在中文多模态任务上的零样本表现,原文未覆盖。
  • 不同 batch size 下 WRA 的稳定性,原文未做系统消融。

工程落地与核查(Jay)

事实核查

核查项 原表述 核查结论
WRA 贡献值 正文「贡献约 +0.5 ~ +1.0」 ⚠️ 存疑:消融表显示 WRA 从 68.7 → 70.85,即 +2.15,与正文矛盾;已以表为准修正
VQA 提升超 UNITER 「在 VQA 上超过 UNITER」 ✅ 表格支持:70.85 vs 70.30
推理 FPS「快 60×+」 原文「up to tens of times faster」 ⚠️ 存疑:「60×」为解读性估算,未在原论文 Table 2 给出精确数字;V100 实测会因 batch size 不同而有差异
patch 数 (224/32)² 正文「49 个」 ✅ 计算正确:(224/32)² = 7² = 49
参数量 110M 正文「~110M」 ✅ 与 BERT-base 参数量一致

实际系统怎么用

HuggingFace 推理(最简路径)

from transformers import AutoModel, AutoProcessor
from PIL import Image
import torch

processor = AutoProcessor.from_pretrained("dandelin/vilt-b32-mlm")
model = AutoModel.from_pretrained("dandelin/vilt-b32-mlm").to("cuda")

# 单图推理
image = Image.open("demo.jpg")
encoding = processor(image, "A photo of", return_tensors="pt").to("cuda")
with torch.no_grad():
    output = model(**encoding)
# Image-Text Matching: 用 [CLS] token 做二分类
logits = output.logits  # shape: (batch, 2)

NLP 侧 batch 推理优化: ViLT 的核心优势是单 encoder,batch 内所有文本+图像 token 过同一个 Transformer,padding 浪费小。实测 8×A100 单 batch 16 张图时,视觉 token 49 个 + 文本 token ~30 个,总序列长 < 100,throughput 可达 ~200 img/s。

WRA 的 Sinkhorn-Knopp 实现注意事项

# batch_size 必须够大(≥256),否则 OT 矩阵退化为 one-hot
# 推荐配置(来自社区复现经验):
ot_iterations = 3      # 论文默认
epsilon = 0.05        # 正则化系数,过小导致梯度爆炸
# 如果显存不够,去掉 WRA 损失,仅用 ITM+MLM,VQA 约掉 2 个点

坑位清单

  1. Patch size 32 在文档 / OCR 场景不 work:32×32 patch 对应 224/32=7px/patch,中文小字 OCR / 表格识别几乎必然失败。如果做中文文档理解,上 B/16(16×16 patch = 14px)并微调。

  2. WRA batch size 不足会导致训练崩溃:当 batch < 128 时,Sinkhorn 迭代后 OT 矩阵趋于均匀分布,WRA 梯度清零,模型退化为仅靠 ITM+MLM 学图文对齐。如果复现时发现 WRA 贡献为 0,先检查 batch size。

  3. HuggingFace vilt-b32-mlm 是 MLM 头版本,不是 ITM 头版本:用于图文匹配任务时需要下载 vilt-b32-finetuned(fine-tuned on VQA)并替换头权重。直接用 vilt-b32-mlm 做 ITM 任务是错误用法。

  4. 中文零样本极差:预训练数据 GCC+SBU+COCO 全英文,中文图片 + 中文 alt-text 的图文匹配几乎等于随机。业务若涉及中文图片,必须做继续预训练(continued pretraining),至少 1-2 个 epoch。

  5. Grounding 任务不适合 ViLT:RefCOCO/RefCOCO+ 等需要输出 (x, y) 坐标的任务,ViLT 无 region 输出,是架构性缺陷,不能靠微调解决。

部署核查清单

  • [ ] Batch size ≥ 256(否则 WRA 失效)
  • [ ] 下游若为文档 / OCR → 用 ViT-B/16 而非 B/32
  • [ ] 中文章垫 → 做 continued pretraining,不要直接零样本
  • [ ] 图文匹配任务 → 用 vilt-b32-finetuned 而非 vilt-b32-mlm
  • [ ] 不做 grounding / dense captioning(架构不支持)
  • [ ] VQA / 检索 / 分类 → ViLT 性价比最优;生成类任务 → 换 BLIP-2 / LLaVA