跳转到内容

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 的设计可以拆成 三步

  1. 解耦文本解码器:标准 encoder-decoder Transformer 里每层 decoder 都 cross-attend 图像。CoCa 把 decoder 砍成两半——前半层看图,纯当文本 encoder 用,输出”unimodal text embedding”;后半层照常 cross-attend 图像,输出”multimodal embedding”。

  2. 两份损失共用一次前向

    • 对比损失:取前半层输出的文本 embedding 和图像编码器输出的图 embedding,做 InfoNCE(和 clip 一样)
    • Captioning 损失:取后半层 multimodal 输出,autoregressive 预测下一个 token(和 GPT 一样)
    • 两份 loss 直接相加,反向一次更新
  3. 所有监督都当文本看: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 亿规模。

踩过的坑

  1. 算力门槛极高:2.1B 参数、4096 batch size、500K steps,TPUv4 训了几周。学术界基本无法复现,开源版本(OpenCoCa 等)规模都小一两个数量级,效果有 5-10 点 gap。

  2. 前半层 / 后半层切分点是超参:论文用 12/12 切分(解码器 24 层,前 12 当 text encoder)。切多了 captioning 弱,切少了对比 embedding 弱。这个切点没有理论指导,靠实验试。

  3. 两份 loss 权重需要平衡:对比 loss 和 captioning loss 量级不同(前者是 batch-wise softmax,后者是 token-wise CE),论文用经验权重 1:2。换数据集要重调,比例失衡时一个 loss 会”压住”另一个。

  4. 生成质量依然落后专门的 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-01clip 发布,确立”对比损失 + 互联网级图文对”的判别式范式
  • 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 数字(很快被刷掉),而在提出”判别式 + 生成式可以无痛合并”这件事——后续多模态模型设计基本绕不开它的损失组合。

学到什么

  1. 训练目标可以拼装——对比拉近向量空间,生成约束序列建模,两件事不冲突
  2. 网络结构可以为损失服务——CoCa 砍掉前半层 cross-attention 不是为了快,是为了让对比 loss 拿得到”unimodal embedding”
  3. 多任务联训的关键是共享前向——两份 loss 跑一次反向,只比单 loss 多 5% 算力,这才是工程上能 scale 的前提
  4. 把所有标签当文本看统一了精标和弱监督的处理路径,是这一代基础模型的共同范式
  5. 第一个把两条范式合并的工作,价值在于”提出合并是可行的”——后人会改进数字,但基本架构已经定下

延伸阅读

  • 论文 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