跳转到内容
English

CLIP 系列:图文对齐、OpenCLIP 与 SigLIP

交互教程

沿双编码器走到相似度矩阵,再分清损失、数据与训练配方各自的变化。

前置阅读:ViT · 语义表征

固定分类器为每个训练类别学习一个权重向量。CLIP 则从配对的图像与描述中学习 image encoder 和 text encoder,之后可以把新的类别描述编码为分类器权重。此前已有工作连接语言和图像;CLIP 把简单的对比目标、广泛配对数据和模型扩展结合起来。它的 image encoder 可以是改进 ResNet 或 ViT。本页主图采用 ViT 分支,并不意味着所有 CLIP 都是 ViT。

阅读顺序从左到右。点击模块,将它与计算和代码对应。代码为教学伪代码;来源链接提供论文方法或已核查的实现。

自然语言改变监督接口

固定分类器为每个训练类别学习一个权重向量。CLIP 则从配对的图像与描述中学习 image encoder 和 text encoder,之后可以把新的类别描述编码为分类器权重。此前已有工作连接语言和图像;CLIP 把简单的对比目标、广泛配对数据和模型扩展结合起来。它的 image encoder 可以是改进 ResNet 或 ViT。本页主图采用 ViT 分支,并不意味着所有 CLIP 都是 ViT。

# Teaching pseudocode; not a complete training implementation.
images, captions = paired_batch()
image_features = image_encoder(images)
text_features = text_encoder(captions)

训练状态:训练与推理角色在下文分别解释。

逐步讲解:自然语言改变监督接口

双塔在共享 embedding 空间中相遇

图像塔汇聚图像特征,再投影到 d 维;文本塔将描述分词,经过 causal Transformer,选择结束 token 的表示,也投影到 d 维。将二者归一化为单位向量后,点积就是余弦相似度。输出维度相同,不意味着两塔共享 encoder 权重。原始 CLIP 学习正值 logit scale。在这条双编码器路径中,图像 patches 与词语之间没有 cross-attention。

# Teaching pseudocode; not a complete training implementation.
U = l2_normalize(image_projection(image_features))
V = l2_normalize(text_projection(eos_features))
S = exp(logit_scale) * U @ V.T

训练状态:训练与推理角色在下文分别解释。

ui=Wvfv(xi)∥Wvfv(xi)∥2,vj=Wtft(tj)∥Wtft(tj)∥2,Sij=eauiTvju_i=\frac{W_vf_v(x_i)}{\|W_vf_v(x_i)\|_2},\quad v_j=\frac{W_tf_t(t_j)}{\|W_tf_t(t_j)\|_2},\quad S_{ij}=e^a u_i^Tv_j

逐步讲解:双塔在共享 embedding 空间中相遇

一个 batch 变成 B×B 个匹配问题

把 B 对图文按相同顺序排列。第 i 行将图像 i 与所有文本比较;第 j 列将文本 j 与所有图像比较。对角线是配对正例。Image-to-text 交叉熵逐行归一化,text-to-image 则逐列归一化,最后平均两个方向。增大一个负例分数会改变同行或同列其他项的 softmax 概率。未配对项被当作负例,即便内容实际上兼容,因此噪声描述与重复内容会影响目标。

# Teaching pseudocode; not a complete training implementation.
labels = arange(batch_size)
row_loss = cross_entropy(S, labels)
column_loss = cross_entropy(S.T, labels)
loss = (row_loss + column_loss) / 2

训练状态:训练与推理角色在下文分别解释。

LCLIP=−12B∑i[log⁡eSii∑jeSij+log⁡eSii∑jeSji]\mathcal L_{CLIP}=-\frac{1}{2B}\sum_i\left[\log\frac{e^{S_{ii}}}{\sum_j e^{S_{ij}}}+\log\frac{e^{S_{ii}}}{\sum_j e^{S_{ji}}}\right]

逐步讲解:一个 batch 变成 B×B 个匹配问题

零样本分类复用文本塔

为每个候选类别写一个 prompt,例如 “a photo of a dog”。编码并归一化这些 prompt,它们就构成分类器的列向量。将新图像向量与所有候选比较,选择最大分数。概率取决于候选列表、prompt 措辞和 scale,不是世界中该类别存在的无条件概率。Prompt ensemble 将同一类别的归一化描述做平均,再归一化类别向量。完成这个判断不需要图像 decoder,也不需要自回归文本生成器。

# Teaching pseudocode; not a complete training implementation.
class_vectors = encode_and_normalize(class_prompts)
image_vector = encode_and_normalize(image)
prediction = argmax(image_vector @ class_vectors.T)

训练状态:训练与推理角色在下文分别解释。

y^=arg⁡max⁡c u(x)Tv(tc)\hat y=\arg\max_c\,u(x)^Tv(t_c)

逐步讲解:零样本分类复用文本塔

查看固定版本来源

ui=Wvfv(xi)∥Wvfv(xi)∥2,vj=Wtft(tj)∥Wtft(tj)∥2,Sij=eauiTvju_i=\frac{W_vf_v(x_i)}{\|W_vf_v(x_i)\|_2},\quad v_j=\frac{W_tf_t(t_j)}{\|W_tf_t(t_j)\|_2},\quad S_{ij}=e^a u_i^Tv_j

图像塔汇聚图像特征,再投影到 d 维;文本塔将描述分词,经过 causal Transformer,选择结束 token 的表示,也投影到 d 维。将二者归一化为单位向量后,点积就是余弦相似度。输出维度相同,不意味着两塔共享 encoder 权重。原始 CLIP 学习正值 logit scale。在这条双编码器路径中,图像 patches 与词语之间没有 cross-attention。

ui=Wvfv(xi)∥Wvfv(xi)∥2,vj=Wtft(tj)∥Wtft(tj)∥2,Sij=eauiTvju_i=\frac{W_vf_v(x_i)}{\|W_vf_v(x_i)\|_2},\quad v_j=\frac{W_tf_t(t_j)}{\|W_tf_t(t_j)\|_2},\quad S_{ij}=e^a u_i^Tv_j
训练架构与参数更新
训练架构与参数更新 原创教学图;具体配置和简化边界见正文。 · 论文来源小屏可左右滚动;点击查看全尺寸。

将架构与公式结合阅读。每个版本改变的是学习系统中的具体部分。

把 B 对图文按相同顺序排列。第 i 行将图像 i 与所有文本比较;第 j 列将文本 j 与所有图像比较。对角线是配对正例。Image-to-text 交叉熵逐行归一化,text-to-image 则逐列归一化,最后平均两个方向。增大一个负例分数会改变同行或同列其他项的 softmax 概率。未配对项被当作负例,即便内容实际上兼容,因此噪声描述与重复内容会影响目标。

LCLIP=−12B∑i[log⁡eSii∑jeSij+log⁡eSii∑jeSji]\mathcal L_{CLIP}=-\frac{1}{2B}\sum_i\left[\log\frac{e^{S_{ii}}}{\sum_j e^{S_{ij}}}+\log\frac{e^{S_{ii}}}{\sum_j e^{S_{ji}}}\right]

OpenCLIP 是开放实现、训练工具和 checkpoint 集合,并不是一个替换 CLIP 的单一新损失。可复现规模化研究保留对比目标,改变模型大小、LAION 数据规模和训练所见样本数。数据集大小与所见样本数是不同量,因为训练可能重复读取样本。比较时要同时报告架构与训练数据标签:仅写 ViT-L/14,并不能确定唯一的 embedding 分布或权重。

SigLIP 把每个图文对当作二分类样本:对角线 yij=+1,其余为 −1。可学习 scale 与 bias 产生 logit,再对每个有标签的 pair 独立应用 log-sigmoid,不使用行或列 softmax 分母。它仍然使用负例,遍历所有 pairs 时数量仍为平方级。原论文用 B 除成对损失总和,而不是 B²。成对形式支持分块计算,不需要全局 softmax 归一化,但不同 pair 仍通过共享模型参数耦合。

LSigLIP=−1B∑i,jlog⁡σ ⁣(yij(eauiTvj+b))\mathcal L_{SigLIP}=-\frac1B\sum_{i,j}\log\sigma\!\left(y_{ij}(e^a u_i^Tv_j+b)\right)
系列变化的结构对照
系列变化的结构对照 原创教学图;具体配置和简化边界见正文。 · 论文来源小屏可左右滚动;点击查看全尺寸。
目标函数的局部结构
目标函数的局部结构 原创教学图;具体配置和简化边界见正文。 · 论文来源小屏可左右滚动;点击查看全尺寸。

同一相似度矩阵,两种目标

固定的教学向量,只计算概率和损失。数值变化不能证明训练会更稳定或模型效果更好。

三张图的单位向量角度为 0°、75°、150°;三条描述为 10°、65°、160°。切换查看相似度和概率;行是图像,列是文本。

Image / text012
00.94320.05670.0001
10.05610.93340.0105
20.00020.01110.9887

I→T: 0.0463 · T→I: 0.0463

CLIP: 0.0463 · SigLIP: 1.2550

SigLIP 按原论文以 batch 大小 B 除总成对损失,而非 B²。两种损失尺度不同,不能用较小数值判断谁更好。

为每个候选类别写一个 prompt,例如 “a photo of a dog”。编码并归一化这些 prompt,它们就构成分类器的列向量。将新图像向量与所有候选比较,选择最大分数。概率取决于候选列表、prompt 措辞和 scale,不是世界中该类别存在的无条件概率。Prompt ensemble 将同一类别的归一化描述做平均,再归一化类别向量。完成这个判断不需要图像 decoder,也不需要自回归文本生成器。

y^=arg⁡max⁡c u(x)Tv(tc)\hat y=\arg\max_c\,u(x)^Tv(t_c)

SigLIP 2 同时改进全局与局部特征

Section titled “SigLIP 2 同时改进全局与局部特征”

SigLIP 2 结合 sigmoid 图文训练与仅在训练时使用的描述、定位 decoder,之后加入自蒸馏和 masked patch prediction。发布的 vision encoder 不是那个 caption decoder。池化向量支持图文匹配;未池化 patch 特征支持稠密任务与视觉语言接口。固定分辨率版本和 NaFlex 的配方不同。NaFlex 近似保留长宽比,加入 patch 坐标与 padding mask,支持多种序列长度;为控制成本,其适配阶段省略了自蒸馏与 masked-prediction 损失。

VLM 从 CLIP 家族编码器中取走什么

Section titled “VLM 从 CLIP 家族编码器中取走什么”

多模态语言模型经常使用全局池化前的 patch 特征,再用 connector 改变宽度或空间位置数。文本词表属于 text tokenizer,不是这些视觉向量的码本。Qwen3-VL 会继续训练由 SigLIP 2 初始化的视觉塔,因此最终表示不等于原始对比学习 checkpoint。用于重建时,RAE decoder 还需学习从选定特征回到像素。图文对齐好,并不保证小文字、几何和纹理都被完整保留。

这些特征就是离散重建码吗?

不是。Backbone 输出连续特征。预测原型或文本 ID 不会把它们变成 VQ 码本;重建需要另行定义 decoder 与训练目标。

返回学习地图

自绘图和伪代码用于教学;原论文图片单独标注来源。论文报告、固定实现观察和解析示例分别标记;未运行研究模型。