前言
本文是《从 CLIP 到 LLaVA:一文读懂视觉语言模型(VLM)的演进与核心数学公式》的配套专篇。主篇里只讲了 CLIP 的核心思想,本文把架构、每个公式的符号、温度参数 $\tau$ 的物理意义和正负样本矩阵完整拆开。
核心思想
CLIP(Contrastive Language-Image Pre-training) 由 OpenAI 在 2021 年提出。它的思路不要求模型把图像"说出来",只要求模型判断一对图文是否匹配。思想可以概括为,让配对的图像与文本在向量空间里互相靠近,不配对的互相远离。训练数据是从互联网抓取的海量图文对,弱标注、规模大,正好适合对比学习。
模型结构
CLIP 由两个编码器组成,训练完成后两者的输出落在同一个向量空间里。
- 视觉编码器(Vision Encoder) 把图像映射成图像特征向量。
- 文本编码器(Text Encoder) 把文本映射成文本特征向量。
- 两个编码器共享一个对比学习的目标,不要求图像特征还原文字,只要求"配对"的两者在空间中靠近。
视觉编码器
CLIP 论文里视觉编码器有两种可选实现。
ViT 实现。图像先切成固定大小的 Patch(如 $32 \times 32$ 像素),每个 Patch 展平成一个一维向量,经线性投影变成 token,加上位置编码后送入多层 Transformer 编码器。图像特征取 [class] token 位置的输出,经一个线性层映射到共享嵌入维度。(关于 ViT 的详细说明我想单独开一个post,由于比较懒这里就先不写了喵)

ResNet 实现。图像经卷积网络逐层提取特征,最后用一个注意力池化(attention pooling)把空间特征汇聚成单一向量,再经线性层映射。 详细说明请见本站《为什么 ResNet 能训练 152 层——残差连接的直觉与数学》。(其实这个是AI写的,我后面再修改~)
两种实现的最终输出都会投影到同一个嵌入维度,和文本特征的维度一致。
文本编码器
文本编码器是一个带因果掩码的 Transformer,结构上接近 GPT。输入句子先切分成 token,每个 token 做嵌入并加上位置编码,逐层编码;最后取句末特殊 token(End-of-Text,EOT)位置的输出作为整个句子的特征。CLIP 的文本编码器最长处理 76 个 token。
共享空间与推理
两个编码器的最终输出都会做 L2 归一化,因此可以直接用点积比较任意图像与任意文本。零样本分类的做法是,把每个类别标签套进提示词模板得到句子,用文本编码器算出每个类别的文本特征;对一张测试图像,用图像编码器算出它的图像特征,与所有类别特征做点积,取得分最高的类别作为预测。这就是图 2 展示的完整流程。
余弦相似度
要衡量两个向量靠近还是远离,CLIP 使用余弦相似度。设图像特征向量为 $I$,文本特征向量为 $T$,相似度定义为
$$ s(I, T) = \frac{I \cdot T}{\|I\| \, \|T\|} $$- $I \cdot T$ 是点积,衡量两个向量的方向一致性。
- $\|I\|$ 和 $\|T\|$ 是向量的 L2 范数,即长度。
- 分子除以两个范数的乘积,把结果归一化到 $[-1, 1]$,只保留方向的相似,去掉长度的影响。
归一化后的点积就是余弦相似度
很多实现里并不显式写除法,而是先把向量做 L2 归一化,再算点积。把 $I$ 和 $T$ 各自除以自己的长度,得到单位向量
$$ \hat{I} = \frac{I}{\|I\|}, \qquad \hat{T} = \frac{T}{\|T\|} $$两个单位向量的点积展开后,分母正好约掉,结果就是原向量夹角的余弦值
$$ \hat{I} \cdot \hat{T} = \frac{I \cdot T}{\|I\| \, \|T\|} = \cos\theta $$其中 $\theta$ 是 $I$ 与 $T$ 在多维空间中的夹角。归一化后点积和余弦相似度是同一回事,只是写法不同。工程实现里通常先归一化再点积,省一次除法,也让后续计算更稳定。
几何直觉
从几何上看,相似度的取值有明确含义。
- 夹角 $\theta$ 接近 0,余弦值接近 1,两个向量方向高度一致,对应匹配的图文对(正样本)。
- 夹角接近 $90^\circ$,余弦值接近 0,两个向量近乎垂直,对应互不相关的图文。
- 夹角超过 $90^\circ$,余弦值为负,两个向量方向相反,对应明显不匹配的图文。
CLIP 训练的目标,就是让正样本对的余弦值尽量接近 1,让负样本对的余弦值尽量低。判断两个向量"像不像",看的就是它们夹角的余弦值。
InfoNCE 对比损失
有了相似度,还需要一个损失函数驱动训练。在一个包含 $N$ 个图文对的批次里,对第 $i$ 个图像特征 $I_i$ 而言,它的正样本是配对的文本特征 $T_i$,其余 $N-1$ 个文本特征都是负样本。图像到文本方向的 InfoNCE 损失定义为
$$ \mathcal{L}_{I \to T} = - \frac{1}{N} \sum_{i=1}^{N} \log \frac{\exp(s(I_i, T_i) / \tau)}{\sum_{j=1}^{N} \exp(s(I_i, T_j) / \tau)} $$- $N$ 是批次大小。
- $s(I_i, T_j)$ 是第 $i$ 个图像与第 $j$ 个文本的余弦相似度。
- $\exp(\cdot)$ 是指数函数,把相似度转成正的权重。
- $\tau$ 是温度参数(Temperature),作用下面单独讲。
- 分子是正样本的指数权重,分母是全部 $N$ 个样本的指数权重之和,两者相除得到一个归一化的概率。
- 外层取负对数再平均,最小化该损失等价于让正样本概率尽量接近 1。
为什么是这个公式?
事实上,InfoNCE 损失就是一个 Softmax + 交叉熵的组合。对每个图像来说,它的正样本是唯一的,负样本有 $N-1$ 个。训练目标是让模型在所有候选文本中选出正确的那个。
在 CLIP 的对比学习中,没有任何预先定义好的“猫狗分类标签”。InfoNCE 极其巧妙地把 Batch 里的其他文本当成了“类别”。
假设一个 batch 里有 $N$ 个图文对,那么对于第 $i$ 张图片 $I_i$ 来说:
- 正确类别(目标类):是它对应的那个文本 $T_i$。
- 错误类别(干扰类):是同一个 Batch 里的其他 $N-1$ 个文本 $T_j$(其中 $j \neq i$)。
让我们对比一下 Softmax 函数的标准形式
$$ \text{Softmax}(x_i) = \frac{\exp(x_i)}{\sum_{j=1}^{N} \exp(x_j)} $$可以发现,InfoNCE 正是对每个图像 $I_i$ 的相似度向量 $[s(I_i, T_1), s(I_i, T_2), \dots, s(I_i, T_N)]$ 做了 Softmax,然后取正样本的概率,再用交叉熵计算损失。通过最小化这个损失,模型被迫把正样本的相似度拉高,同时把负样本的相似度压低,从而学会区分匹配与不匹配的图文对。
为什么要双向计算
上面的 $\mathcal{L}_{I \to T}$ 只算了一个方向,让图像去找文本。CLIP 实际训练时把两个方向各算一次再取平均
$$ \mathcal{L} = \frac{1}{2} \left( \mathcal{L}_{I \to T} + \mathcal{L}_{T \to I} \right) $$只算一个方向够不够?不够,原因要从相似度矩阵的行和列来看。在第 $i$ 行里,图像 $I_i$ 和 $N$ 条文本做 softmax,是"图找文";在第 $j$ 列里,文本 $T_j$ 和 $N$ 张图像做 softmax,是"文找图"。只按行算损失,相当于只约束了行方向。
单向约束会留下一个漏洞,让模型可以"偷懒"。设想批次里有一条很泛化的文本,比如 “a photo of an object”(一张物体的照片)。它和很多图像都有不低的相似度。如果模型只需要在行方向把每张图配到最合适的文本,那些特征还不清晰的图像很容易都往这条泛化文本上靠,把它变成一个"万金油"式的中心,图像侧不需要区分物体就能压低损失。这个现象在多模态检索里有个名字,叫 Hubness 现象,指少数向量成为大量其他向量的共同近邻。
加上列方向的损失后,泛化文本必须在一整列图像里选出唯一正确的那张,它再也无法同时贴近所有图像,被迫退回到更具体的表示。两个方向互相制约,模型才不能靠投机取巧降低损失。数学上,双向计算对应着让图像和文本两个模态尽量互相预测对方,等价于最大化两者的互信息。
批次要足够大
批次大小不只是工程上的训练配置,它直接影响学到的特征质量。原因在于 CLIP 的负样本来自批次内部,即批次内负样本(In-Batch Negatives)。
批次小的时候,随机抽到的一个批次里,除了正样本,其余 $N-1$ 条文本大概率是汽车、咖啡这类和当前图像毫不相干的内容。模型只需要把"哈士奇有毛、汽车没毛"这种粗粒度区别学出来,就能轻松把它们推开,损失很快降到很低。但模型并没有学会细粒度区分,推理时遇到"哈士奇"和"阿拉斯加雪橇犬"就会困惑。
批次大的时候,数量让负样本的构成发生了质变。在一个包含数万条文本的大批次里,很可能同时出现“哈士奇”、“阿拉斯加雪橇犬”、“柴犬”这些高度相似的文本。对哈士奇图像来说,它不仅要推开汽车咖啡,还要在同一个小矩阵里努力和阿拉斯加雪橇犬的文本拉开距离。这种极其相似但又错误匹配的样本被称为困难负样本(Hard Negatives)。为了在大量干扰项里找出唯一正确的那个,模型被迫去学习最细微、最本质的特征差异,比如耳朵的形状、毛色的分布。CLIP 论文里用的批次规模是 32768,正是为了让每个批次里都能出现足够多的困难负样本。
从公式看,批次大小 $N$ 直接出现在分母的求和范围里。$N$ 越大,分母对"整个数据集的相似度分布"的近似越充分,模型在向量空间里对细粒度概念的排布就越精确。工程上的代价是显存,同时计算数万张图像和数万条文本的特征,再在 GPU 之间做跨卡特征收集来算损失,对算力要求很高,这也是 CLIP 需要大规模分布式训练的原因之一。
温度参数 τ 的物理意义
温度参数 $\tau$ 的物理意义在于控制分布的尖锐程度。$\tau$ 越小,$\exp(s / \tau)$ 拉开的差距越大,softmax 后的分布越尖锐,概率集中在相似度最高的少数负样本上,也就是最难区分的困难负样本上,训练梯度随之偏重它们;$\tau$ 越大,分布越平坦,所有负样本被一视同仁。$\tau$ 调节的正是模型对困难负样本的关注程度。$\tau$ 设置得过小会让训练对噪声敏感,过大则拉不开正负样本的距离,实践中常把它当作可学习参数。
正负样本矩阵
批次内的 $N$ 对图文组成一个 $N \times N$ 的相似度矩阵,对角线是 $N$ 个正样本对,其余位置都是负样本对

| 图像/文本 | T1 | T2 | … | TN |
|---|---|---|---|---|
| I1 | 正样本 | 负样本 | … | 负样本 |
| I2 | 负样本 | 正样本 | … | 负样本 |
| … | … | … | … | … |
| IN | 负样本 | 负样本 | … | 正样本 |
训练的目标,就是让对角线上的相似度高于同行、同列的其他位置。
两个编码器为什么能对齐
到这里可能会有一个疑问。图像是像素,文本是字符,两个结构完全不同的编码器各走各的路,凭什么训练之后它们的输出就落在同一个向量空间里,损失还能一直降下去?严格来说,没有任何机制能在一开始就保证它们对齐,最终收敛靠的是结构设计、模型的拟合能力和对比学习机制一起作用。可以从四个方面理解。
统一的投影层
虽然两个编码器内部结构不同,提取的特征维度也不一定一样,但在各自输出的最后,都接了一个线性投影层(Linear Projection)。这两个投影层把不同维度的图像特征和文本特征,强行映射到同一个维度(比如 512 维),为计算相似度提供了一个统一的比较空间。这个"强行对齐维度"的步骤是前提,没有它,两个编码器的输出连做点积的资格都没有。
神经网络的拟合能力
神经网络是一个含上亿可调参数的复合函数。理论上,只要参数足够多,它可以拟合任意复杂的映射关系,这个性质称为万能逼近(Universal Approximation)。训练开始时参数随机,图像向量和文本向量毫无意义,损失非常大。但一旦损失变大,反向传播就会产生梯度,同时去修改两个编码器内部的参数。经过大量迭代,参数被逐步调整到能表达"像素规律和字符规律之间的对应关系",模型被"逼"着找到了这条等价映射。
对比学习防止模型退化
如果训练目标只是让正样本靠近,模型有一个偷懒的解法,把任何输入都映射成同一个常量向量。这样一来所有正样本的相似度都最高,损失瞬间降到接近 0,但特征完全失去了区分度,这个现象叫表示坍缩(Representation Collapse)。CLIP 能学到有意义的特征,靠的是对比损失同时要求把负样本推开。一个批次里有数万对图文,模型要让正确的 1 对互相靠近,还必须同时把另外数万对错误配对推开。这种排斥力迫使两个编码器去提取有区分度的特征,否则无法在巨大的负样本矩阵里把损失降下来。
高维空间的容量
对齐发生在高维空间里,不是二维平面。512 维甚至更高的空间有大量的方向可供分配,模型可以把"猫"的特征放在一个区域,把"狗"放在相邻区域,把"汽车"推到很远的另一个方向,不同概念之间互不冲突。如果只在二维空间里排列上万种物体,几乎不可能做到;而高维空间给了模型足够的"地方"去容纳这些区分的概念。这也是为什么 CLIP 最终能把图像和文本对齐到同一语义空间,而不是混成一团。
把四点连起来看,对齐的成立靠三样东西。约 4 亿对图文数据提供了真实的配对规律,庞大的参数量提供了拟合这些规律的能力,对比学习的"拉近正样本、推开负样本"机制作为指挥棒,强迫两个本来互不相关的编码器走向同一个语义空间。
应用场景
CLIP 训练完成后可以做零样本分类,即不针对具体类别微调,直接用预训练好的文本编码器构造分类器。

零样本图像分类
CLIP 用一句话就可以描述分类流程,把每个类别套进提示词模板,模板化文本过一遍文本编码器,得到的文本特征就是该类别的"分类器权重"。
对一张测试图像,图像编码器算出它的特征,再与所有类别的文本特征做点积,得分最高的类别就是预测结果。整个过程不需要针对新数据集训练分类头,类别集合可以随时换,换数据集只需要重新生成一遍文本特征。这是 CLIP 最出名也最实用的能力,ImageNet 上的零样本分类准确率在模型规模扩大后可以超过 76%。
图文检索
零样本分类相当于"图找最匹配的一段文字"。把思路倒过来,CLIP 还能做图文双向检索。给定一张图像,在所有候选文本里找点积最高的那条,是图搜文;给定一句描述,在所有候选图像里找点积最高的那张,是文搜图。检索时同样只需要离线把文本库或图像库编码好,查询时算一次点积即可。这让 CLIP 常用在图片库管理、数据集去重和相似图片匹配里。
作为 VLM 的视觉底座
CLIP 训练结束后,它的视觉编码器已经把图像映射进和文本共享的向量空间,这个现成的"图像语义特征"很适合直接交给大语言模型使用。主篇里讲的 LLaVA 就是这么做的,它直接复用 CLIP 的视觉编码器提取图像特征,再经投影层送入语言模型。相比从零训练一个视觉编码器,复用 CLIP 省掉了大量数据和算力,这也是 CLIP 对 VLM 生态最重要的贡献之一。
用动画走一遍 CLIP 全流程
下面用一只柴犬的照片和一句英文描述 “a photo of a dog” 做例子,把 CLIP 从输入到输出的完整过程逐步演示。点"下一步"逐步观看,或点"自动播放"连贯浏览。
参考
- CLIP: Learning Transferable Visual Models From Natural Language Supervision,Radford et al., 2021
- An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale(ViT),Dosovitskiy et al., 2020
- Illustrated Guide to CLIP,Lilian Weng,2021
- 本站《从 CLIP 到 LLaVA:一文读懂视觉语言模型(VLM)的演进与核心数学公式》