18 CLIP 论文精读:ViT 如何走向图文多模态?(Learning Transferable Visual Models From Natural Language Supervision)
在前几篇文章中,我们围绕 ViT 的自监督预训练路线进行了连续梳理。
MAE 的核心思想是:遮住大部分图像 patch,让模型重建被遮挡区域的像素。
BEiT 的核心思想是:先用视觉 tokenizer 把图像转换成离散 visual token,再让模型预测被 mask 位置对应的 visual token。
DINO 的核心思想是:不使用人工标签,也不重建图像,而是通过 teacher-student 自蒸馏,让 ViT 学到稳定的语义表示。
这些方法虽然形式不同,但它们本质上都在回答同一个问题:
没有人工类别标签时,ViT 如何从图像本身学习视觉表示?
而 CLIP 开始回答另一个更大的问题:
能不能直接利用互联网上大量的图像和文本描述,让模型学会把图像和语言对齐
这意味着,ViT 不再只是一个图像分类 backbone,而开始进入 图文多模态预训练 阶段。
CLIP 对应的论文是 Learning Transferable Visual Models From Natural Language Supervision,由 Alec Radford 等人提出,发表于 ICML 2021。论文提出使用 4 亿个互联网图文对进行预训练,通过“判断哪张图和哪句话匹配”的对比学习任务,学习可迁移的视觉表示,并支持 zero-shot 图像分类。
一、为什么需要 CLIP?
传统图像分类模型通常依赖固定类别标签。
例如 ImageNet 分类模型的训练方式是:
输入图像 → 输出 1000 个类别中的一个
这种范式非常成功,但也有明显限制。
第一,类别空间固定。模型只能预测训练集中定义好的类别。如果我们想让模型识别新的概念,就需要重新收集数据、标注数据、训练模型。
第二,人工标注成本很高。大规模高质量图像分类数据集需要大量人工标注,而现实世界中的视觉概念远远超过几个固定数据集的类别范围。
第三,模型泛化能力有限。很多监督训练模型在标准测试集上表现很好,但遇到分布变化、不同风格图像、不同拍摄条件时,性能可能明显下降。OpenAI 在 CLIP 博客中也强调,传统视觉数据集标注成本高、概念范围窄,并且标准视觉模型通常只能完成特定任务。
CLIP 的出发点是:互联网上天然存在大量图像和文本配对数据。
例如:
一张狗的图片 + “a dog playing on the grass”
一张汽车图片 + “a red car parked on the street”
一张食物图片 + “a plate of sushi”
这些文本不一定是人工精心标注的类别标签,但它们提供了非常丰富的自然语言监督信号。
所以 CLIP 的核心思想可以概括为:不再把图像强行限制到固定类别标签中,而是直接学习图像和自然语言之间的对应关系。
这就是 CLIP 中 “Natural Language Supervision” 的含义。
二、CLIP 想解决什么问题?
CLIP 的目标不是训练一个普通分类器。普通分类器学习的是:
图像 → 类别 ID
例如:
dog image → class 207
cat image → class 281
这种类别 ID 对人来说没有语义,类别集合也是固定的。
CLIP 学习的是:图像表示 ↔ 文本表示
也就是说,CLIP 希望把图像和文本映射到同一个特征空间中。如果一张图像和一句文本描述的是同一个内容,那么它们的特征应该接近。如果一张图像和一句文本描述的内容不匹配,那么它们的特征应该远离。
例如:
图像:一只狗在草地上奔跑
文本 1:“a dog running on the grass” → 应该接近
文本 2:“a plane flying in the sky” → 应该远离
文本 3:“a bowl of noodles on the table” → 应该远离
因此,CLIP 不是让模型记住一个固定类别表,而是让模型学会:哪些图像和哪些语言描述在语义上是匹配的。这就是 CLIP 后来能够进行 zero-shot 分类、图文检索、开放词表识别的基础。
三、CLIP 的整体框架:双塔结构
CLIP 的结构非常简洁,可以称为 双塔结构。
它包含两个编码器:
| 模块 | 作用 |
|---|---|
| Image Encoder | 编码图像,得到图像特征 |
| Text Encoder | 编码文本,得到文本特征 |
| Projection Layer | 将图像特征和文本特征投影到同一个 embedding 空间 |
| Contrastive Loss | 拉近匹配图文对,推远不匹配图文对 |
整体流程如下:
图像 I_i → Image Encoder → 图像特征 → 投影 → 图像 embedding
文本 T_i → Text Encoder → 文本特征 → 投影 → 文本 embedding
图像 embedding 和文本 embedding 计算相似度
CLIP 论文和官方模型卡都说明,图像编码器可以使用 ResNet,也可以使用 Vision Transformer;文本编码器使用 Transformer。两个编码器通过对比损失训练,使匹配的图像和文本具有更高相似度。
对于我们这个 ViT 专栏来说,最重要的是:CLIP 证明了 ViT 不只能处理图像分类,还可以作为图文对齐模型中的 image encoder。也就是说,ViT 在 CLIP 中的角色是:
图像 → ViT → 图像语义 embedding
而文本 Transformer 的角色是:
文本描述 → Text Transformer → 文本语义 embedding
二者最终进入同一个多模态语义空间。
四、Image Encoder:CLIP 中的视觉编码器
CLIP 的 image encoder 有两类版本。
第一类是 ResNet 系列。
第二类是 Vision Transformer 系列。
官方模型卡中提到,最初发布的 CLIP 包括 RN50 和 ViT-B/32,后续还发布了 RN101、RN50x4、RN50x16、ViT-B/16、ViT-L/14、ViT-L/14@336px 等模型版本。
对于 ViT 版本,图像处理流程与标准 ViT 类似:
输入图像
↓
切分为 patch
↓
patch embedding
↓
加入位置编码
↓
Transformer Encoder
↓
得到图像全局表示
↓
投影到多模态 embedding 空间
例如 ViT-B/32 表示:
Base 规模的 ViT,patch size 为 32×32
ViT-B/16 表示:
Base 规模的 ViT,patch size 为 16×16
patch size 越小,图像被切得越细,token 数量越多,计算成本越高,但空间细节通常更丰富。对于 224×224 图像:
ViT-B/32:224 / 32 = 7,因此有 7×7 = 49 个 patch ViT-B/16:224 / 16 = 14,因此有 14×14 = 196 个 patch
所以 ViT-B/16 通常比 ViT-B/32 具有更细粒度的视觉表达能力,但计算量也更大。CLIP 使用 ViT 的意义在于:ViT 可以把图像转换成一个全局语义向量,这个向量不再只服务于分类头,而是要与文本语义向量对齐。
五、Text Encoder:CLIP 中的文本编码器
CLIP 的 text encoder 是一个 Transformer。它的输入不是类别 ID,而是一段自然语言文本。
例如:
a photo of a dog
a photo of a cat
a photo of a red car
文本首先会经过 tokenizer,变成 token 序列,然后输入 Transformer,最后得到文本整体表示。
可以写成:
文本句子
↓
文本 tokenizer
↓
token ID 序列
↓
Text Transformer
↓
文本全局表示
↓
投影到多模态 embedding 空间
这里需要注意一点:CLIP 中的文本 token 和我们前面讲的 visual token 不是一回事。文本 token 来自自然语言 tokenizer,例如单词、子词或 BPE token。而 visual token 通常来自图像 tokenizer 或视觉 codebook,例如 BEiT 中 dVAE tokenizer 输出的离散视觉编号。CLIP 的文本侧是真正的语言 token;图像侧在 ViT 中是 patch embedding,不是 BEiT 那种 visual token 预测目标。
六、CLIP 的核心:图文对比学习
CLIP 最核心的地方不是模型结构复杂,而是训练目标设计得非常简洁。
给定一个 batch,里面有 N 对图文样本:
(I_1, T_1), (I_2, T_2), ..., (I_N, T_N)
其中:
I_i 表示第 i 张图像
T_i 表示与第 i 张图像匹配的文本
在这个 batch 中,正确匹配关系是:
I_1 ↔ T_1
I_2 ↔ T_2
...
I_N ↔ T_N
而错误匹配关系包括:
I_1 ↔ T_2
I_1 ↔ T_3
...
I_2 ↔ T_1
I_2 ↔ T_3
...
也就是说,一个 batch 中有 N 个正样本图文对,同时有大量负样本图文对。
CLIP 的训练目标就是:让正确图文对的相似度尽可能高,让错误图文对的相似度尽可能低。
论文中也明确描述:CLIP 通过联合训练图像编码器和文本编码器,使 batch 中 N 个真实图文对的 cosine similarity 最大,同时使其余 N²−N 个错误图文配对的 cosine similarity 最小。
七、图像 embedding 和文本 embedding 如何计算?
设图像编码器为:
文本编码器为:
对于第 i个图文对:
图像编码器输出图像特征:
文本编码器输出文本特征:
然后分别通过线性投影矩阵,把二者映射到同一个 embedding 空间:
接着,CLIP 会对 embedding 做 L2 归一化:
归一化之后,向量长度都变成 1。这样两个向量的点积就等价于 cosine similarity:
八、相似度矩阵:CLIP 损失函数的关键
对于一个 batch 中的 N 张图像和 N 条文本,CLIP 会计算所有图像和所有文本之间的两两相似度。
这样可以得到一个 N×N 的相似度矩阵:
其中第 i行表示:第 i 张图像与所有文本的相似度。
第 j 列表示:第 j 条文本与所有图像的相似度。
正确匹配的图文对位于矩阵对角线上:
错误匹配位于非对角线位置。所以 CLIP 的目标可以直观理解为:
让相似度矩阵的对角线尽可能大,让非对角线尽可能小。
例如 batch size 为 4 时,相似度矩阵可以理解为:
| 文本 T1 | 文本 T2 | 文本 T3 | 文本 T4 | |
|---|---|---|---|---|
| 图像 I1 | 正样本 | 负样本 | 负样本 | 负样本 |
| 图像 I2 | 负样本 | 正样本 | 负样本 | 负样本 |
| 图像 I3 | 负样本 | 负样本 | 正样本 | 负样本 |
| 图像 I4 | 负样本 | 负样本 | 负样本 | 正样本 |
这就是 CLIP 对比学习的核心。
九、Image-to-Text 损失:给图像找正确文本
现在先从图像到文本的方向看损失函数。对于第 i 张图像 ,它需要在 N 条文本中找到正确匹配的文本
。
因此可以定义一个概率:
这个式子的含义是:在给定图像的情况下,文本
是正确匹配文本的概率。其中分母是第 i 张图像与所有文本的相似度 softmax。正确答案应该是 j=i,所以图像到文本方向的 loss 为:
这个公式可以这样理解:对于每一张图像:
把这张图像当作 query
把 batch 中所有文本当作候选答案
要求模型把正确文本排在最高
所以这是一个 N 类分类问题。类别数不是固定数据集类别,而是当前 batch 中的 N 条文本。
十、Text-to-Image 损失:给文本找正确图像
CLIP 不是只做图像到文本的匹配,还会反过来做文本到图像的匹配。对于第 i 条文本,它需要在 N 张图像中找到正确匹配的图像
。
因此定义:
这里要注意索引方向。因为表示:第 j 张图像和第 i 条文本的相似度.
因此文本到图像方向的 loss 为:
这个公式可以理解为:对于每一条文本:
把这条文本当作 query
把 batch 中所有图像当作候选答案
要求模型把正确图像排在最高
十一、CLIP 的最终损失函数:对称交叉熵
CLIP 最终使用的是图像到文本和文本到图像两个方向 loss 的平均:
这就是 CLIP 的 symmetric contrastive loss,也可以理解为双向 InfoNCE 损失。它的直观含义是:
图像应该能找到对应文本
文本也应该能找到对应图像
为什么要对称?
因为图文对齐是双向的。如果只训练图像找文本,模型可能更偏向图像检索文本。如果只训练文本找图像,模型可能更偏向文本检索图像。而 CLIP 希望图像和文本在共享空间中真正对齐,所以同时优化两个方向。论文中的伪代码也体现了这一点:先计算归一化后的 image embedding 和 text embedding,再得到 pairwise cosine similarity logits,最后分别计算 image 方向和 text 方向的交叉熵损失并取平均。
十二、CLIP 和传统图像分类有什么本质区别?
传统图像分类训练的是一个固定分类头:图像特征 → 分类器 → 固定类别概率。
例如 ImageNet 模型最后一层通常是:Linear(hidden_dim, 1000)。
也就是说,类别数被固定为 1000。而 CLIP 没有固定分类头。
它训练的是:图像编码器 + 文本编码器 + 共享语义空间。
分类时,类别名称本身会被写成文本,再通过 text encoder 得到类别 embedding。
例如对 ImageNet 分类,可以构造文本:
a photo of a dog
a photo of a cat
a photo of a car
...
然后比较图像 embedding 和每个类别文本 embedding 的相似度。因此 CLIP 的分类器不是固定参数矩阵,而是由自然语言动态构造出来的。这就是 CLIP zero-shot 能力的根源。
十三、CLIP 如何做 zero-shot classification?
Zero-shot classification 是 CLIP 最经典的能力。
它不需要在目标数据集上重新训练分类头,而是直接使用类别名称构造文本 prompt。假设现在有一张待分类图像 I,候选类别为:
dog
cat
car
bird
第一步,把类别名称写成自然语言 prompt:
a photo of a dog
a photo of a cat
a photo of a car
a photo of a bird
第二步,用 text encoder 得到每个类别的文本 embedding:
第三步,用 image encoder 得到图像 embedding:
第四步,计算图像 embedding 和所有类别文本 embedding 的相似度:
第五步,选择相似度最高的类别:
这就是 CLIP zero-shot 分类的完整过程。重点在于:
CLIP 不需要重新训练分类器,只需要把类别名称变成文本描述。OpenAI 官方博客也强调,CLIP 可以通过提供视觉类别名称来应用到图像分类 benchmark 上,方式类似 GPT-2/GPT-3 的 zero-shot 能力。
十四、为什么 prompt 很重要?
在 CLIP 中,类别名称通常不会直接使用单个词,而是会放进一句自然语言模板中。例如不用:dog。而用:a photo of a dog。为什么?因为 CLIP 预训练时看到的大多是自然语言描述,而不是孤立类别词。如果推理时只输入一个单词:dog。它和训练阶段的文本分布可能存在差异。而:a photo of a dog。更像真实图像描述,也能减少歧义。例如 “crane” 既可以表示“鹤”,也可以表示“起重机”。如果写成:a photo of a crane, a type of bird。就会明显减少歧义。所以 prompt 的作用是:把类别名称转化为更接近训练语料的自然语言描述。对于不同任务,prompt 可以包含任务先验。例如宠物分类:a photo of a {label}, a type of pet。食物分类:a photo of {label}, a type of food。场景分类:a photo of a {label} scene。这说明 CLIP 的 zero-shot 能力不仅来自模型本身,也和 prompt 构造方式密切相关。
十五、CLIP 的训练数据:为什么自然语言监督有优势?
CLIP 使用的是大规模互联网图文对。论文摘要中提到,CLIP 从 4 亿个 image-text pairs 上训练,并在超过 30 个视觉数据集上评估,涉及 OCR、动作识别、地理定位、细粒度分类等任务。
自然语言监督相比传统类别标签有几个优势。
第一,文本描述更丰富。
传统标签可能只有:
dog
自然语言描述可能是:
a golden retriever running through a field
后者包含了类别、颜色、动作、场景等更多信息。
第二,文本可以表达开放概念。
传统类别集合是固定的,而自然语言可以描述几乎无限的视觉概念。
第三,文本监督更容易扩展。
互联网上本来就有大量图文共现数据,不需要像传统分类数据集一样为每张图人工标注固定类别。
这也是 CLIP 能够获得较强迁移能力的重要原因。
十六、CLIP 的实验结果应该怎么看?
CLIP 的实验重点不是在单个数据集上刷最高精度,而是验证:自然语言监督预训练能否学习可迁移视觉模型。
论文报告,CLIP 在 30 多个现有视觉数据集上进行测试,zero-shot 迁移到多数任务时都有非平凡表现,并且在 ImageNet 上 zero-shot 匹配原始 ResNet-50 的准确率,而不需要使用 ImageNet 的 128 万训练样本。
OpenAI 博客还强调,CLIP 在 ImageNet 上 zero-shot 匹配 ResNet-50 的同时,没有直接使用 ImageNet 的 128 万标注样本,并且在分布变化下能够缩小部分 robustness gap。
这说明 CLIP 的意义不只是“分类准确率不错”,而是:它展示了自然语言监督可以训练出具有开放迁移能力的视觉模型。
对于 ViT 发展路线来说,这一点非常重要。因为从 CLIP 开始,ViT 不再只是面向固定类别分类,而是开始成为多模态基础模型中的视觉编码器。
十七、CLIP 与 MAE、BEiT、DINO 的区别
现在我们可以把 CLIP 和前面几篇文章放在一起比较。
| 方法 | 监督信号 | 训练目标 | 是否需要文本 | 是否需要标签 | 核心特点 |
|---|---|---|---|---|---|
| MAE | 图像自身 | 重建 masked pixels | 否 | 否 | 高比例遮挡 + 像素重建 |
| BEiT | 图像 tokenizer | 预测 visual token | 否 | 否 | 图像版 BERT |
| DINO | teacher 网络 | 对齐 teacher-student 输出 | 否 | 否 | 无标签自蒸馏 |
| CLIP | 图文配对 | 对齐图像和文本 embedding | 是 | 不需要人工类别标签 | 图文对比学习 |
可以看出:
MAE、BEiT、DINO 都是视觉内部自监督学习。CLIP 则引入了语言作为监督信号。这使得 CLIP 学到的视觉表示天然带有语言语义。例如,普通自监督 ViT 可能学到“这两个图像区域语义相似”,但 CLIP 进一步学到:
这个视觉概念可以用 natural language 表达为 “a dog”
这个视觉概念可以用 natural language 表达为 “a red car”
这个视觉概念可以用 natural language 表达为 “a satellite photo”
所以 CLIP 的重要性在于:它把视觉表示学习从“图像内部结构建模”推进到了“图像—语言语义对齐”。
十八、CLIP 和生成模型有什么关系?
CLIP 本身不是图像生成模型。
它不会直接生成图像,也不会像扩散模型那样逐步去噪。
但 CLIP 学到的图文对齐空间,对后续生成模型影响很大。
原因在于:如果一个模型能够判断“图像是否符合文本描述”,那么它就可以作为文本图像对齐的监督信号或评价信号。
早期一些文本生成图像方法会使用 CLIP 来衡量生成图像和文本 prompt 的匹配程度。
后来的大规模文本到图像模型虽然不一定直接使用 CLIP loss 训练全部系统,但 CLIP 所代表的思想非常重要:把图像和文本映射到统一语义空间。这成为多模态生成、跨模态检索、开放词表识别等方向的重要基础。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)