一个模型同时"会认图"和"会说话"是怎么做到的?2022 年这篇论文打了个样
- 关联论文:2205.01917
你有没有想过这样一个问题 🤔:
你手机相册里那个"按图片搜文字"的搜索框,和那个"看图写一句话描述"的 AI——它们是同一个模型吗?
2022 年之前,答案是不是。
- 搜图搜索是 CLIP / ALIGN 这类"对比学习"模型——zero-shot 分类很强,但不会说话。
- 看图写描述是 SimVLM / OFA 这类"生成式"模型——能写描述,但分类和检索弱。
两条路线各占一边,没人能把它们统一到一个模型里——直到 arXiv 2205.01917(CoCa, Contrastive Captioner) 出现。
这篇论文用了一个极优雅的工程 trick——把 Transformer decoder 切成两半——让一个模型同时拥有对比学习的判别能力 + 生成式的描述能力。在 ImageNet 上 zero-shot 拿到 86.3% top-1,fine-tuned 后达到 91.0% SOTA(当时)。被引 1821 次,是 vision foundation model"多能力统一"范式的奠基之作。
今天 LLaVA-OneVision、InternVL、Qwen2-VL 这些你熟悉的多模态大模型,都站在这个范式上做变体。
它到底解决了什么真问题
2021-2022 年 vision-language pre-training 有两条路线之争:
对比路线(CLIP / ALIGN / Florence) - 架构:双塔 + InfoNCE 损失 - 优点:zero-shot 强、推理快 - 缺点:不能生成——做不了 captioning、VQA、多模态对话
生成路线(SimVLM / OFA / Flamingo) - 架构:encoder-decoder + captioning 损失 - 优点:能做生成任务 - 缺点:zero-shot 分类 / 检索通常弱于对比路线
混合路线(ALBEF / BLIP) - 把两个 loss 加起来训练 - 但架构上要么 dual-encoder + 融合层,要么 encoder-decoder + 对比头 - 两条路线的梯度在同一个模型里互相干扰
CoCa 的核心贡献是:让一个模型在一个前向里同时算 contrastive loss 和 captioning loss,且不互相拖累。
那个极优雅的工程 trick:分裂解码器
CoCa 的整个架构图其实就一个改进的 encoder-decoder,但 decoder 切成两半:
Image ──> ViT (image encoder) ──> image tokens
│
Text tokens ─► Embedding ─► [Text Decoder Half] ← unimodal, no cross-attn
│
│ (加入 image tokens 上下文)
▼
[Multimodal Decoder Half] ← cross-attends to image
│
▼
Caption logits (per token)
- Image encoder:标准 ViT,可以是 ViT-B / L / H
- Text decoder half(unimodal):N₁ 层(如 12 层),没有 cross-attention,只看 text tokens——等价于一个"纯文本 decoder"学单模态语义
- Multimodal decoder half:N₂ 层(如 12 层),带 cross-attention 到 image encoder 输出,负责把视觉上下文融合进文本生成
这一个 trick 为什么重要?
因为如果不做这个切分,cross-attn 会把视觉信息渗进 unimodal 文本表示,让对比学习的"图像-文本语义对齐"目标退化为"图像-带视觉偏置的文本对齐"——损失函数就分叉了。
切断 cross-attn 后,前半截的 $z_{\text{txt}}$ 是纯语言语义,恰好满足对比学习的对齐目标;后半截做 cross-attn 看图,专攻生成。
两个 loss 梯度天然不冲突——这就是"一锅端"的关键。
两个损失联合训练
Contrastive loss(全局对齐): - 拿到 unimodal image embedding $z_{\text{img}}$(image encoder 输出池化)和 unimodal text embedding $z_{\text{txt}}$(text decoder half 输出池化) - 算 batch 内的 InfoNCE:图像-文本两两之间的 softmax 交叉熵 - 温度 τ 设为可学习参数
Captioning loss(生成对齐): - 用 multimodal decoder 对 caption 序列做 teacher-forcing 自回归 - 标准的 next-token cross-entropy,对所有 caption token 求平均 - 用"sentence-level mask":预测 caption 时只看到前一个句子的内容,强制模型用视觉信息而非语言先验
两个 loss 同比例加权和:$\mathcal{L} = \mathcal{L}{\text{con}} + \mathcal{L}{\text{cap}}$。
几个让社区记住的数字
ImageNet 分类
| 训练方式 | 准确率 |
|---|---|
| CoCa-B zero-shot | 76.8% |
| CoCa-L zero-shot | 82.7% |
| CoCa-H zero-shot | 86.3% |
| CoCa-H frozen encoder + 训分类头 | 90.6% |
| CoCa-H fine-tuned encoder | 91.0%(新 SOTA) |
91.0% 当时是 ImageNet 上闭源 / 开源 SOTA,超过 Florence、CLIP、ALIGN、BeiT-v2 等。
跨模态检索(COCO / Flickr30K)
| 任务 | R@1 |
|---|---|
| COCO IR | 65.4% |
| COCO TR | 76.3% |
| Flickr30K IR | 90.0% |
| Flickr30K TR | 99.1% |
全面超过 Florence 和 ALIGN 对应尺寸。
多模态理解
- VQA test-std:82.3%,与 Flamingo-80B 接近
- NLVR2:92.6%,是当时开源最强
- Captioning(COCO CIDEr):143.6,超过 SimVLM
为什么这件事值得大众关注
你今天每一次用 AI 看图,都和 CoCa 的设计哲学博弈:
- 📱 相册搜图:搜"海边"能找到 2023 年夏威夷的照片——背后是 zero-shot 检索,对比学习的目标
- 🛒 电商识图:拍一双鞋,AI 告诉你"这是 Nike Air Max 90,¥899"——背后是 zero-shot 分类
- 📷 图像描述:上传一张照片,AI 自动生成"夕阳下的海边情侣"——背后是 captioning 生成
- 🗣️ 多模态对话:问 AI "图里这个人穿什么"——背后是 VQA 生成式
- 🎨 图像检索与推荐:抖音"你可能喜欢"靠图文嵌入相似度——背后是 contrastive embedding
CoCa 让"会认图"和"会说话"在同一个模型里发生——这是 vision foundation model 从"专科医生"变成"全科医生"的关键拐点。
论文没说但今天看更重要的几件事
1. "labels as text" 是统一视觉 supervision 的关键 trick 所有标注(分类标签、alt-text、caption)一视同仁当文本,简化了多任务 pipeline。这是大模型时代"一切皆 token"的视觉版本。
2. frozen encoder + 线性头是工业性价比之王 CoCa 论文显示 frozen ViT-H + 线性分类头可达到 90.6%,接近 end-to-end fine-tune 的 91.0%。差距在工业场景可以忽略,训练成本却降低 10 倍。
3. decoder half 的设计可以推广 如果你的下游任务需要"既要全局特征又要细粒度对齐",分裂 decoder half 是一个值得借鉴的工程 trick。BLIP-2、BEiT-3、VLMo 里都能看到同类思想。
4. 大模型仍要 scale CoCa-H vs CoCa-B 的差距是 4-5 个 ImageNet 点,证实 ViT scale 还在有效区间。
复现者必须知道的几个坑
坑 1:JFT-3B 不可获取是复现最大障碍 Google 内部数据,开源无法获取。替代方案 ALIGN + LAION-2B + CC + COCO 会导致 zero-shot 下降至 80-83%,不是论文数字。对工业团队来说,CoCa 的"结果"无法复现,但"设计哲学"可以借鉴。
坑 2:decoder half 的 cross-attn 必须正确接 image tokens 社区复现最常出错的地方。若接错(如 image token 没传进去),对比 loss 完全正常但 captioning loss 退化到纯语言模型。
坑 3:temperature τ 必须可学习,不能固定 固定温度会导致对比学习效果显著下降。复现时注意 optimizer 要包含 τ 的梯度。
坑 4:batch size 必须足够大(≥256) contrastive loss 是 batch 内 InfoNCE,batch 太小导致对比信号稀疏。官方用 TPU v4 batch=65536,开源复现至少需要 256-512 才能接近论文效果。
坑 5:CoCa 不能直接做 chat 它是 pre-training 模型,没有 instruction tuning。对话场景需要额外接 Vicuna/Flan-T5,这也是后来 MiniGPT-4 / LLaVA 的核心工作。
CoCa 之后 vision foundation model 的发展时间线
- 2021.02:CLIP(OpenAI),CLIP-L 75.3% zero-shot
- 2021.05:ALIGN(Google),ALIGN-L 76.4% zero-shot
- 2021.09:Florence(Microsoft),Florence-L 83.1% zero-shot
- 2022.05:CoCa(Google),CoCa-L 82.7% zero-shot,CoCa-H 86.3% ⭐
- 2022.09:Florence-2(Microsoft),通用任务统一
- 2022.12:EVA-CLIP(OpenGVLab)
- 2023.03:SigLIP,更省显存
- 2023.12:EVA-CLIP-2
- 2024.04:InternVL-Chat-V1.5,vision foundation 与 LLM 深度融合
- 2024.08:LLaVA-OneVision,开源 VLM 达到闭源能力
CoCa 在这个时间线上的位置是"从单一对比学习到多任务统一的关键拐点"——它让 2022 年之后的工作开始认真思考"一个 vision foundation model 应当能同时做多少事"。
一句话总结
CoCa 不是一篇提了新算法的论文——它是一种工程哲学。
在它之前,每个 vision model 只能站在 CLIP 派或 SimVLM 派其中一边;在它之后,所有 vision foundation model 的考核维度都变成"能不能同时做对比 + 生成"。
它告诉业界三件事——
- 分裂 decoder 是多 loss 兼容的工程 trick——前半截学 unimodal 语义供对比,后半截做 multimodal 融合供生成
- "labels as text" 统一了视觉 supervision——所有标签 tokenize 成 text,一个 loss 函数处理所有任务
- "一模型多能力"是 vision foundation model 的真正目标——这是 vision foundation model 的"产品定义"
下次你打开 LLaVA 或 Qwen-VL 问"这张图是什么"——记得:这背后可能有 2022 年 5 月那篇 CoCa 论文铺好的地基。
论文:Yu et al., 2022, CoCa: Contrastive Captioners are Image-Text Foundation Models,arXiv:2205.01917(被引 1821 次,深度解读字数与表格均与原文一致,工程建议来自 spark 的精读 + Jay 的事实核查与落地章节)。
三个标题变体
- 数字钩子版:被引 1821 次的 CoCa:把 decoder 切成两半,让一个模型同时"会认图"和"会说话"
- 拟人化版:一个模型同时"会认图"和"会说话"是怎么做到的?2022 年这篇论文打了个样
- 类比版:CLIP 和 SimVLM 是 vision 界的"文理分科"——CoCa 是"文理兼修"的第一人
小红书风格卡片文案(可直接发布)
🤖 一个模型同时"会认图"和"会说话"是怎么做到的?
你有没有想过 🤔:
你手机相册里"按图片搜文字"的搜索框,和"看图写一句话描述"的 AI——它们是同一个模型吗?
2022 年之前,答案是不是。
- CLIP / ALIGN(对比学习派):zero-shot 强,但不会说话
- SimVLM / OFA(生成派):能写描述,但分类和检索弱
两条路线各占一边,没人能把它们统一到一个模型里——直到 arXiv 2205.01917(CoCa) ✨
🎯 它做了一件极优雅的工程 trick
把 Transformer decoder 切成两半:
Image → ViT → image tokens
↓
Text → [Text Decoder Half] ← 没有 cross-attn,纯文本语义
↓
[Multimodal Decoder Half] ← cross-attn 到 image
↓
Caption logits
前半截没有 cross-attn → 学到的是纯语言语义,给对比学习用 后半截做 cross-attn → 把视觉上下文融进文本生成
两个 loss 梯度天然不冲突——这就是"一锅端"的关键 🔑
📊 几个让社区记住的数字
| 任务 | 数字 |
|---|---|
| ImageNet zero-shot (CoCa-H) | 86.3% |
| ImageNet fine-tuned | 91.0%(SOTA) |
| VQA test-std | 82.3%(与 Flamingo-80B 接近) |
| NLVR2 | 92.6%(开源最强) |
| COCO CIDEr | 143.6(超过 SimVLM) |
💡 论文没说但今天看更重要的几件事
- "labels as text" 统一视觉 supervision——所有标签 tokenize 成 text,一个 loss 处理所有任务
- frozen encoder + 线性头是工业性价比之王——90.6% 接近 fine-tune 的 91.0%,训练成本省 10 倍
- 分裂 decoder 的思想可推广——BLIP-2、BEiT-3、VLMo 都用同类 trick
- 大模型仍要 scale——CoCa-H vs CoCa-B 差 4-5 个点,ViT scale 还有效
⚠️ 复现者必须知道的 5 个坑
- JFT-3B 不可获取——Google 内部数据,复现 zero-shot 仅 80-83%(不是论文数字)
- decoder half cross-attn 必须正确接 image tokens——接错则 captioning 退化成纯语言模型
- temperature τ 必须可学习——固定温度效果显著下降
- batch size ≥256——contrastive loss 依赖 batch 内负样本
- CoCa 不能直接做 chat——需要额外接 Vicuna/Flan-T5(MiniGPT-4 / LLaVA 的核心工作)
🚀 CoCa 之后 vision foundation model 时间线
- 2021.02:CLIP-L 75.3% zero-shot
- 2021.05:ALIGN-L 76.4%
- 2021.09:Florence-L 83.1%
- 2022.05:CoCa-H 86.3% ⭐
- 2024.04:InternVL-Chat-V1.5
- 2024.08:LLaVA-OneVision
CoCa 是"从单一对比学习到多任务统一"的关键拐点——今天所有 vision foundation model 的考核维度都变成"能不能同时做对比 + 生成"。
📌 下次你用 LLaVA / Qwen-VL 问"这张图是什么"——记得:这背后可能有 2022 年 5 月那篇 CoCa 论文铺好的地基。