在前几篇文章中,我们围绕 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 如何计算?

设图像编码器为:

                            f_I(\cdot)

文本编码器为:

                         f_T(\cdot)

对于第 i个图文对:

                          I_i, T_i

图像编码器输出图像特征:

                       h_i^I = f_I(I_i)

文本编码器输出文本特征:

                     h_i^T = f_T(T_i)

然后分别通过线性投影矩阵,把二者映射到同一个 embedding 空间:

                                       z_i^I = h_i^I W_I

                                       z_i^T = h_i^T W_T

接着,CLIP 会对 embedding 做 L2 归一化:

                                             v_i = \frac{z_i^I}{\| z_i^I \|} \\ u_i = \frac{z_i^T}{\| z_i^T \|}

归一化之后,向量长度都变成 1。这样两个向量的点积就等价于 cosine similarity:

                                             s_{ij} = v_i^\top u_j

八、相似度矩阵:CLIP 损失函数的关键

对于一个 batch 中的 N 张图像和 N 条文本,CLIP 会计算所有图像和所有文本之间的两两相似度。

这样可以得到一个 N×N 的相似度矩阵:

                                       S = \begin{bmatrix} s_{11} & s_{12} & \cdots & s_{1N} \\ s_{21} & s_{22} & \cdots & s_{2N} \\ \vdots & \vdots & \ddots & \vdots \\ s_{N1} & s_{N2} & \cdots & s_{NN} \end{bmatrix}

其中第 i行表示:第 i 张图像与所有文本的相似度。

第 j 列表示:第 j 条文本与所有图像的相似度。

正确匹配的图文对位于矩阵对角线上:

                 s_{11}, s_{22}, \ldots, s_{NN}

错误匹配位于非对角线位置。所以 CLIP 的目标可以直观理解为:

让相似度矩阵的对角线尽可能大,让非对角线尽可能小。

例如 batch size 为 4 时,相似度矩阵可以理解为:

文本 T1 文本 T2 文本 T3 文本 T4
图像 I1 正样本 负样本 负样本 负样本
图像 I2 负样本 正样本 负样本 负样本
图像 I3 负样本 负样本 正样本 负样本
图像 I4 负样本 负样本 负样本 正样本

这就是 CLIP 对比学习的核心。

九、Image-to-Text 损失:给图像找正确文本

现在先从图像到文本的方向看损失函数。对于第 i 张图像 I_i,它需要在 N 条文本中找到正确匹配的文本 T_i

因此可以定义一个概率:

                            p_{i \to j}^{I \to T} = \frac{\exp(s_{ij} / \tau)}{\sum_{k=1}^N \exp(s_{ik} / \tau)}

这个式子的含义是:在给定图像I_i的情况下,文本T_i是正确匹配文本的概率。其中分母是第 i 张图像与所有文本的相似度 softmax。正确答案应该是 j=i,所以图像到文本方向的 loss 为:

                          \mathcal{L}{I \to T} = -\frac{1}{N} \sum{i=1}^N \log \frac{\exp(s{ii} / \tau)}{\sum{k=1}^N \exp(s_{ik} / \tau)}

这个公式可以这样理解:对于每一张图像:

把这张图像当作 query
把 batch 中所有文本当作候选答案
要求模型把正确文本排在最高

所以这是一个 N 类分类问题。类别数不是固定数据集类别,而是当前 batch 中的 N 条文本。

十、Text-to-Image 损失:给文本找正确图像

CLIP 不是只做图像到文本的匹配,还会反过来做文本到图像的匹配。对于第 i 条文本T_i,它需要在 N 张图像中找到正确匹配的图像 I_i

因此定义:

                         p_{i \to j}^{T \to I} = \frac{\exp(s_{ji} / \tau)}{\sum_{k=1}^N \exp(s_{ki} / \tau)}

这里要注意索引方向。因为s_{ji}表示:第 j 张图像和第 i 条文本的相似度.

因此文本到图像方向的 loss 为:

                                     \mathcal{L}_{T \to I} = -\frac{1}{N} \sum_{i=1}^N \log \frac{\exp(s_{ii} / \tau)}{\sum_{k=1}^N \exp(s_{ki} / \tau)}

这个公式可以理解为:对于每一条文本:

把这条文本当作 query
把 batch 中所有图像当作候选答案
要求模型把正确图像排在最高

十一、CLIP 的最终损失函数:对称交叉熵

CLIP 最终使用的是图像到文本和文本到图像两个方向 loss 的平均:

                                  \mathcal{L} = \frac{1}{2} (\mathcal{L}_{I \to T} + \mathcal{L}_{T \to I})

这就是 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:

                                    u_{\text{dog}}, u_{\text{cat}}, u_{\text{car}}, u_{\text{bird}}

第三步,用 image encoder 得到图像 embedding:

                                                    v

第四步,计算图像 embedding 和所有类别文本 embedding 的相似度:

                                                s_c = v^T u_c

第五步,选择相似度最高的类别:

                                               \hat{y} = \arg\max_c s_c

这就是 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 所代表的思想非常重要:把图像和文本映射到统一语义空间。这成为多模态生成、跨模态检索、开放词表识别等方向的重要基础。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐