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
这个范式有两个结构性问题:
- 推理速度瓶颈。Faster R-CNN 抽 region 特征要占整个 VLP 模型 50% 以上的 FLOPs,但只是「给多模态交互提供输入」。在工业部署中,图像侧推理时延远高于语言侧。
- 表达力受限。视觉侧被锁死在「检测器预定义的视觉词典」里——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 略好。
亮点与局限
亮点
- 架构层面的「减法」革命。它证明了 region supervision 不是 VLP 的必要条件,patch embedding + 共享 encoder 就够用。这直接催生了 ALBEF、BLIP、BLIP-2、VLMo、Coca、MiniGPT-4 一整条「轻视觉」路线。
- 推理速度质的飞跃。在工业界,「VLP 推理 100ms」不是小数字,ViLT 把它压到 < 10ms 才能让多模态搜索、多模态广告理解等场景真正落地。
- WRA 把「无监督对齐」引入 VLP。之前 ITM / MLM 只学全局匹配,WRA 在 token 级别补齐了「细粒度对齐」缺口。
- 代码 + 权重全开源,且基于 PyTorch + HuggingFace,迁移成本低。
局限
- 细粒度任务(dense captioning, REC)表现弱。没有 region proposal,就没法精确说「第几个 box 里是什么」,对 grounding 任务(RefCOCO/RefCOCO+)有显著劣势。
- 数据规模小。4M 图文对在 2021 年已经落后(同期 ALIGN 已经 1.8B),模型天花板被数据卡住。
- 小 patch 涨点换显存。patch size 16 比 32 涨点明显,但显存翻 4 倍,对硬件不友好。
- 没有生成能力。ViLT 只做 encoder-only 的判别任务,不做 captioning。后续 BLIP / CoCa 才补上 encoder-decoder 路线。
对工程落地的启发
- 多模态 encoder 不一定要「重」。如果业务是「图文匹配 / 多模态分类 / 检索」,用 ViLT-B/32 + HuggingFace 推理在 4-5ms 内就能跑完,比堆 GPU 跑大模型划算得多。
- 推理预算分配原则。多模态系统的视觉侧开销应当 < 30%,否则每次请求都是「等图像」。如果必须用大视觉编码器,考虑离线抽特征缓存(ViLT 这一路是端到端而非这种,但思路可借鉴)。
- 轻视觉路线的可扩展性。后来的 BLIP-2、InstructBLIP 都从 ViLT 这条「patch 当 token」出发,加 LLM 桥就成了 VLM 主流模板。
- 数据规模才是硬约束。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 时,踩过的典型坑有四个:
- Patch size 选择:论文推荐 B/32,但如果你下游是文档 / OCR 类任务,B/32 的 32×32 patch 太大,丢失字符细节。生产场景建议 ViT-B/16 + 高分辨率微调。
- WRA 训练不稳定:Sinkhorn-Knopp 在 batch size 偏小时容易退化(OT 矩阵变成 degenerate)。实际工程上 batch size 至少 256 起,否则要去掉 WRA。
- 推理 batching 友好:因为 ViLT 是单 encoder,batching 时所有 token 拼成一条序列过同一个 transformer,batch 维度 padding 浪费小,比 BLIP-2 双塔好做吞吐优化。
- 中文任务需额外训练: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 | — | 1× |
| 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 现在还值不值得读」
绝对值得。原因有四:
- 它是「从零开始理解 VLP」的最佳入门。没有 Q-Former 也没有 captioning head,所有 loss 都是教科书级的(ITM / MLM / OT alignment),可以一晚上读完整篇论文 + 跑通 baseline。
- 它的工程范式是工业界「快糙猛 demo」的标准模板。CLIP + Linear Projection + BERT-style loss,任何 4-5 个人的 AI 团队都能在 2 周内搭出一个能用 VLP。
- 它是后续所有「VLM 大厦」的地基。不理解 ViLT 的「单 encoder + 轻视觉」哲学,就很难理解为什么 BLIP-2 / LLaVA / InternVL 都在这条路上继续走。
- 它留下了一个仍然未解决的问题:「没有 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 个点
坑位清单
-
Patch size 32 在文档 / OCR 场景不 work:32×32 patch 对应 224/32=7px/patch,中文小字 OCR / 表格识别几乎必然失败。如果做中文文档理解,上 B/16(16×16 patch = 14px)并微调。
-
WRA batch size 不足会导致训练崩溃:当 batch < 128 时,Sinkhorn 迭代后 OT 矩阵趋于均匀分布,WRA 梯度清零,模型退化为仅靠 ITM+MLM 学图文对齐。如果复现时发现 WRA 贡献为 0,先检查 batch size。
-
HuggingFace vilt-b32-mlm 是 MLM 头版本,不是 ITM 头版本:用于图文匹配任务时需要下载
vilt-b32-finetuned(fine-tuned on VQA)并替换头权重。直接用vilt-b32-mlm做 ITM 任务是错误用法。 -
中文零样本极差:预训练数据 GCC+SBU+COCO 全英文,中文图片 + 中文 alt-text 的图文匹配几乎等于随机。业务若涉及中文图片,必须做继续预训练(continued pretraining),至少 1-2 个 epoch。
-
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