CoCa — 把对比和生成两种多模态训练目标合到一个模型里
是什么
CoCa(Contrastive Captioner)是 Google 2022 年训出来的多模态基础模型,把两种过去分家走的训练目标揉在一起:
- 对比目标(CLIP 那一派)——让配对的图和文在向量空间靠拢
- 生成目标(SimVLM 那一派)——让模型看图把 caption 一字一字写出来
日常类比:之前训视觉模型像两条独立产线,一条只学”判断这两个东西配不配”(判别式),另一条只学”看着图把话写出来”(生成式)。CoCa 改造产线,让一份原料同时走过这两个工位,只多花 5% 算力就两种能力都拿到。
训完之后效果:单个模型在 ImageNet zero-shot 拿到 86.3%、frozen 编码器 + 分类头 90.6%、finetune 后 91.0%(当时 SOTA),同时还能直接生成 image caption、做 VQA、做检索。
为什么重要
不理解 CoCa,下面这些事都没法解释:
- 为什么 2023 年之后多模态模型几乎不再”只对比”或”只生成”——大家都在拼联合目标
- 为什么 blip2-2023 / Flamingo / GPT-4V 这一波都强调”既能匹配也能描述”——CoCa 是第一个把这两件事在一份预训练里跑通的
- 为什么”判别式 vs 生成式”在 NLP 已被 bert vs GPT 之争消解,在 CV 这一年才被 CoCa 真正消解
- 为什么大厂愿意为多模态预训练堆几千卡——单模型三种用法(分类 / 检索 / caption),算力摊销才划算
核心要点
CoCa 的设计可以拆成 三步:
-
解耦文本解码器:标准 encoder-decoder Transformer 里每层 decoder 都 cross-attend 图像。CoCa 把 decoder 砍成两半——前半层不看图,纯当文本 encoder 用,输出”unimodal text embedding”;后半层照常 cross-attend 图像,输出”multimodal embedding”。
-
两份损失共用一次前向:
- 对比损失:取前半层输出的文本 embedding 和图像编码器输出的图 embedding,做 InfoNCE(和 clip 一样)
- Captioning 损失:取后半层 multimodal 输出,autoregressive 预测下一个 token(和 GPT 一样)
- 两份 loss 直接相加,反向一次更新
-
所有监督都当文本看:JFT-3B 的类别标签(“golden retriever”)和 ALIGN 1.8B 的 alt-text caption(“a dog playing in snow”)都喂同一个文本编码器,不区分精标和弱监督——把所有标签视为自然语言。
三步合起来叫 Contrastive Captioner,单模型 2.1B 参数(image encoder 1B + text decoder 1.1B)。
整个流程的关键洞察是:一份图文对,两份 loss 共享一次前向。下图把数据流画清楚:
image ─────► image encoder ─────► image embedding ─┐ │ ├─ 对比损失(InfoNCE) │text ─► [前半 decoder(无 cross-attn)] ─► text embedding ─┘ │ ▼ [后半 decoder(带 cross-attn 看图)] ─► multimodal output │ ▼ captioning 损失(CE)这种设计让对比 loss 和 captioning loss 拿到不同层的输出——一个用浅层、一个用深层,互不干扰。
实践案例
案例 1:同一个 checkpoint 三种用法
训完一份 CoCa,下游想做什么任务,看用哪部分输出:
图像分类(ImageNet) → 用 image encoder + unimodal text encoder → 走 CLIP 那套 zero-shot 流程
图文检索(COCO) → 同样用两个 unimodal 塔 → 算余弦相似度排序
Image captioning(COCO Captions) → 用 image encoder + multimodal decoder → autoregressive 生成 caption
VQA / NLVR2 → multimodal decoder 接小 head 微调一份预训练权重,四种下游任务不重训主体。
案例 2:为什么”砍掉前半层 cross-attention”是关键
如果让所有 decoder 层都 cross-attend 图像,那 decoder 输出就永远依赖图,不能单独当”纯文本 embedding”用——也就没法做对比损失(对比要求图、文两侧独立编码)。
CoCa 的做法是让前半层 decoder 退化成 BERT-like 文本编码器,后半层才”接上图像信号”。这等于在一个网络里同时塞了 clip 的双塔结构 + 一个 captioner,两者共享底层文本表示。
案例 3:把分类标签当 caption 喂
JFT-3B 是 Google 的私有 30 亿张图分类数据集。传统做法是把标签 one-hot 喂分类 head。CoCa 直接把 "golden retriever" 当文本编码——和 alt-text "a golden retriever playing fetch" 走完全相同的处理路径。这样精标和弱监督混在一起就能联训,不需要两套 head。
具体到一个 batch:
- 50% 样本来自 JFT-3B(精标,文本是单个类别词)
- 50% 来自 ALIGN(弱标,文本是网页 alt 属性,质量参差)
- 两边样本对模型来说没有任何区别,前向、损失、反向完全一致
这种”标签即文本”的范式后来成为多模态预训练标配——CLIP 也用了类似想法,但 CoCa 把它推到 30 亿规模。
踩过的坑
-
算力门槛极高:2.1B 参数、4096 batch size、500K steps,TPUv4 训了几周。学术界基本无法复现,开源版本(OpenCoCa 等)规模都小一两个数量级,效果有 5-10 点 gap。
-
前半层 / 后半层切分点是超参:论文用 12/12 切分(解码器 24 层,前 12 当 text encoder)。切多了 captioning 弱,切少了对比 embedding 弱。这个切点没有理论指导,靠实验试。
-
两份 loss 权重需要平衡:对比 loss 和 captioning loss 量级不同(前者是 batch-wise softmax,后者是 token-wise CE),论文用经验权重 1:2。换数据集要重调,比例失衡时一个 loss 会”压住”另一个。
-
生成质量依然落后专门的 captioner:CoCa 在 COCO Captioning 上分数高,但生成的 caption 偏”安全短句”(“a dog on a beach”),细节丰富度不如同期专门做 caption 的 blip2-2023 / OFA。联合训练有 trade-off。
适用 vs 不适用场景
适用:
- 想用一份预训练 checkpoint 同时支持分类 / 检索 / captioning / VQA
- 算力充足、有几千 GPU/TPU 可以堆——CoCa 的优势在 scale
- 多模态系统里”视觉接入口 + caption 能力”两件事都要
不适用:
- 资源受限的研究 / 工业场景——直接拿 CLIP 或 SigLIP 性价比更高
- 只需要 caption / VQA 单一能力——专门模型(BLIP-2 / OFA / LLaVA)做得更精
- 需要长 caption 或复杂推理——CoCa decoder 容量比 LLM 小很多
- 想做开放对话——CoCa 不是 LLM,没指令跟随能力
历史小故事(可跳过)
- 2021-01:clip 发布,确立”对比损失 + 互联网级图文对”的判别式范式
- 2021-12:SimVLM(Wang et al.)证明纯生成式 captioning 也能 scale,但没有 zero-shot 分类能力
- 2022-05:CoCa 论文出来,第一句话就是”我们 subsume CLIP 和 SimVLM”——明确把两条线合到一起
- 2022-下半年:BLIP / Flamingo 沿”图像编码器 + LLM”路线展开;CoCa 路线被 PaLI 系列继承
- 2023:BLIP-2 / Kosmos / GPT-4V 确立”frozen 视觉编码器 + LLM”成为主流,CoCa 这种 from-scratch 联训在工业界少见,但其”对比 + 生成”双 loss 思想被广泛吸收
CoCa 的真正价值不在 SOTA 数字(很快被刷掉),而在提出”判别式 + 生成式可以无痛合并”这件事——后续多模态模型设计基本绕不开它的损失组合。
学到什么
- 训练目标可以拼装——对比拉近向量空间,生成约束序列建模,两件事不冲突
- 网络结构可以为损失服务——CoCa 砍掉前半层 cross-attention 不是为了快,是为了让对比 loss 拿得到”unimodal embedding”
- 多任务联训的关键是共享前向——两份 loss 跑一次反向,只比单 loss 多 5% 算力,这才是工程上能 scale 的前提
- 把所有标签当文本看统一了精标和弱监督的处理路径,是这一代基础模型的共同范式
- 第一个把两条范式合并的工作,价值在于”提出合并是可行的”——后人会改进数字,但基本架构已经定下
延伸阅读
- 论文 PDF:Yu et al. 2022(19 页,前 8 页讲方法和损失,后面是大量 ablation)
- 解读视频:Yannic Kilcher — CoCa(论文逐节讲解)
- 开源复现:lucidrains/CoCa-pytorch(小规模、便于读代码理解结构)
- clip —— CoCa 的对比损失分支直接继承自 CLIP
- blip2-2023 —— 同年另一条多模态路线,主张”frozen 模块 + 小桥接器”
- align-2021 —— CoCa 训练数据之一,规模化 alt-text 的代表
关联
- clip —— 判别式分支的来源;CoCa 把它和生成式合二为一
- align-2021 —— 训练数据贡献者,证明 alt-text 噪声可以靠规模压住
- attention —— CoCa 的所有计算都在 Transformer 注意力上做
- vit —— CoCa 的图像编码器主体
- bert —— 前半层 decoder 退化成 BERT-like 文本编码器的灵感来源
- blip2-2023 —— 后续路线选择”冻结大模块 + 小桥接”,与 CoCa 形成对照
反向链接
- align-2021 —— ALIGN — 用 18 亿条脏图文对训练,证明数据规模能压住噪声
- attention —— Attention Is All You Need
- bert —— BERT — 双向 Transformer 预训练
- blip2-2023 —— BLIP-2 — 用 188M 小桥接器把冻结的视觉模型和大语言模型拼起来
- clip —— CLIP — Contrastive Language-Image Pre-training
- vit —— ViT — Vision Transformer