CLIP 和 SigLIP 都是目前多模态领域特别是图文对齐和生成任务中极其重要的视觉-语言基础模型。它们的核心目标一致但在底层的优化逻辑和工程扩展性上有着决定性的差异。以下是对这两者的详细解析、联系与区别1. 什么是 CLIPCLIP (Contrastive Language-Image Pre-training)是 OpenAI 于 2021 年提出的一种基于对比学习的多模态预训练模型。架构采用双塔结构Dual-encoder即一个图像编码器如 ViT 或 ResNet和一个文本编码器如 Transformer。核心机制通过海量的“图像-文本对”进行预训练。在训练时它将一个 Batch 内的NNN张图像和NNN段文本分别编码成特征向量并计算它们两两之间的余弦相似度形成一个N×NN \times NN×N的相似度矩阵。损失函数使用基于Softmax 的 InfoNCE 损失。模型被训练来最大化对角线上正样本对匹配的图文的相似度同时最小化非对角线上N2−NN^2 - NN2−N个负样本对不匹配的图文的相似度。2. 什么是 SigLIPSigLIP (Sigmoid Loss for Language Image Pre-Training)是 Google 提出的一种对 CLIP 改进的模型。核心痛点解决传统的 CLIP 高度依赖极大的 Batch Size例如 32k 甚至更大来提供足够的负样本以保证对比学习的效果。但在分布式训练中计算全局 Softmax 需要在所有 GPU/TPU 之间频繁通信All-gather 操作这成为了扩展模型规模的巨大工程瓶颈。核心机制SigLIP 的架构与 CLIP 相同但它摒弃了 Softmax 对比损失改用简单的 Sigmoid 二元分类损失。损失函数它将图文对齐任务转化为一系列独立的二分类问题。对于每一个“图像-文本”对模型只需判断它们“是否匹配”正样本标为111负样本标为−1-1−1而不再需要计算当前样本与整个 Batch 中所有其他样本的相对概率。3. 二者的联系目标一致都是为了实现跨模态对齐Cross-modal Alignment构建强大的视觉和语言的联合特征空间。架构相同都采用了对称的双塔模型Image Encoder Text Encoder推理阶段可以独立提取特征非常高效。下游应用重合度高在多模态生成如作为 Diffusion 模型的条件编码器、Zero-shot 图像分类、图文检索等任务中SigLIP 基本可以作为 CLIP 的直接上位替代Drop-in replacement。4. 二者的核心区别维度CLIP (Softmax)SigLIP (Sigmoid)损失函数性质全局对比Global Contrastive。每个样本的损失依赖于 Batch 内所有其他样本的特征。局部独立分类Pairwise Binary Classification。每个图文对的损失独立计算。通信开销极高。需要跨设备的All-gather操作来收集所有设备的特征以计算分母。极低。各设备只需计算本地 chunk 的特征内积无需跨设备同步整个特征矩阵。对 Batch Size 的依赖强。Batch Size 越大负样本越多效果越好通常需要极大的显存支持。弱。在较小的 Batch Size 下依然能保持优秀性能且更容易扩展到超大 Batch。数学表达差异LCLIP∝−log⁡esim(Ii,Ti)∑jesim(Ii,Tj)\mathcal{L}_{CLIP} \propto - \log \frac{e^{sim(I_i, T_i)}}{\sum_{j} e^{sim(I_i, T_j)}}LCLIP​∝−log∑j​esim(Ii​,Tj​)esim(Ii​,Ti​)​LSigLIP∝−∑jlog⁡σ(zij⋅sim(Ii,Tj))\mathcal{L}_{SigLIP} \propto - \sum_{j} \log \sigma(z_{ij} \cdot sim(I_i, T_j))LSigLIP​∝−j∑​logσ(zij​⋅sim(Ii​,Tj​))(其中匹配时zij1z_{ij}1zij​1不匹配时zij−1z_{ij}-1zij​−1)性能表现在零样本分类和检索上表现优秀是早期的行业标准。在同等计算资源下通常能达到更高的零样本准确率并且能更高效地扩大模型参数和数据规模。总结你可以将 CLIP 理解为在一场几万人的大型考试中要求模型不仅要知道哪份试卷是自己的还要知道它相对于其他所有人试卷的排名需要看完全局才能打分。而 SigLIP 则是将这场大考拆解成了无数个“判断题”模型只需要看眼前的任意一张脸和一份卷子回答“是”或“不是”即可。这种视角的转换完美解绑了多模态训练中的通信瓶颈使得 SigLIP 能够以更优雅的方式冲击更大的模型规模和更优的表征能力。1. 什么是 InfoNCEInfoNCE (Information Noise-Contrastive Estimation)是对比学习Contrastive Learning中最核心、最常用的损失函数。它最早由 DeepMind 在 CPC (Contrastive Predictive Coding) 模型中提出。CLIP 采用的正是 InfoNCE 损失函数。你可以把它理解为一个多选题的评分系统假设你在做一道多选题有111个正确答案正样本和KKK个干扰选项负样本。InfoNCE 的目标就是训练模型让它给“正确答案”打极高的分同时给所有的“干扰选项”打极低的分。在数学本质上InfoNCE 就是将对比学习任务转化为了一个带有温度系数的多分类交叉熵损失 (Categorical Cross-Entropy Loss)。2. InfoNCE 的公式给定一个锚点查询特征qqq一个匹配的正样本特征kk^k以及KKK个不匹配的负样本特征kik_iki​总共有NK1N K1NK1个候选样本InfoNCE 的公式如下LInfoNCE−log⁡exp⁡(sim(q,k)/τ)∑i1Nexp⁡(sim(q,ki)/τ)\mathcal{L}_{InfoNCE} - \log \frac{\exp(sim(q, k^) / \tau)}{\sum_{i1}^{N} \exp(sim(q, k_i) / \tau)}LInfoNCE​−log∑i1N​exp(sim(q,ki​)/τ)exp(sim(q,k)/τ)​公式参数解析sim(u,v)sim(u, v)sim(u,v)相似度度量函数通常是余弦相似度点积表示两个特征向量在空间中的距离有多近。分子exp⁡(sim(q,k)/τ)\exp(sim(q, k^) / \tau)exp(sim(q,k)/τ)只关注正样本对如匹配的图文的相似度模型希望这个值越大越好。分母∑i1Nexp⁡(sim(q,ki)/τ)\sum_{i1}^{N} \exp(sim(q, k_i) / \tau)∑i1N​exp(sim(q,ki​)/τ)计算当前qqq与所有样本包括正样本和所有的负样本相似度的总和。这是 Softmax 的归一化操作。τ\tauτ(Temperature)温度超参数。这是一个标量用来控制模型对“困难负样本”那些和正样本很像的错误答案的惩罚力度。τ\tauτ越小模型越会集中精力去区分那些最难分辨的负样本。3. PyTorch 代码怎么写在实际的图文对比学习如 CLIP中正负样本通常来自同一个 Batch。Batch 内的对角线元素是正样本对非对角线元素是负样本对。由于它本质上就是 Softmax Cross-Entropy代码非常简洁importtorchimporttorch.nn.functionalasFdefinfonce_loss(image_features,text_features,temperature0.07): 计算基于 Batch 的对称 InfoNCE 损失 (类似于 CLIP 的做法) 参数: image_features: [batch_size, hidden_dim], 图像特征 text_features: [batch_size, hidden_dim], 文本特征 temperature: float 或可学习的参数, 温度系数 # 1. 对特征进行 L2 归一化这样点积就等价于余弦相似度image_featuresF.normalize(image_features,dim-1)text_featuresF.normalize(text_features,dim-1)# 2. 计算相似度矩阵 (Logits)# logits 形状: [batch_size, batch_size]logitstorch.matmul(image_features,text_features.T)/temperature# 3. 构造 Labels# 因为对角线上的图文是匹配的所以正确答案的索引就是 0, 1, 2... batch_size-1batch_sizeimage_features.shape[0]labelstorch.arange(batch_size,deviceimage_features.device)# 4. 计算交叉熵损失# 图像到文本的 Loss (给定图像找对应文本)loss_i2tF.cross_entropy(logits,labels)# 文本到图像的 Loss (给定文本找对应图像)# 注意这里需要对 logits 转置loss_t2iF.cross_entropy(logits.T,labels)# 5. 返回对称平均 Lossreturn(loss_i2tloss_t2i)/2# 测试代码 batch_size4hidden_dim128img_featstorch.randn(batch_size,hidden_dim)txt_featstorch.randn(batch_size,hidden_dim)lossinfonce_loss(img_feats,txt_feats)print(fInfoNCE Loss:{loss.item():.4f})4. 对应的 SigLIP 中有类似的概念吗有对应概念但本质逻辑被彻底替换了。SigLIP 最大的贡献就是干掉了 InfoNCE用Sigmoid 二元分类损失取代了它。为什么 SigLIP 要抛弃 InfoNCE看看上面 InfoNCE 的公式分母∑\sum∑你会发现为了计算这一个 batch_size 中某一张图片的 loss你需要知道它和当前 batch 内所有文本的相似度。在分布式训练中为了获得足够多的负样本比如 32000 的 batch size数百张显卡之间必须通过All-gather疯狂通信把其他卡的特征同步过来这成了极大的性能瓶颈。SigLIP 的解法 (Sigmoid Loss)SigLIP 放弃了“多选题”模式Softmax改成了**“判断题”模式Sigmoid。对于N×NN \times NN×N个图文组合SigLIP 不再做全局对比而是独立做N2N^2N2次二分类“这幅图和这段字匹配吗”**它的公式变为了简写LSigLIP−∑i,jlog⁡σ(zij⋅sim(Ii,Tj))\mathcal{L}_{SigLIP} - \sum_{i,j} \log \sigma(z_{ij} \cdot sim(I_i, T_j))LSigLIP​−i,j∑​logσ(zij​⋅sim(Ii​,Tj​))其中σ\sigmaσ是 Sigmoid 函数zijz_{ij}zij​为标签匹配为111不匹配为−1-1−1对比总结InfoNCE (CLIP)强制要求计算概率分布的归一化分母是一个互斥的操作如果拉近一对必然要推远其他所有对。SigLIP Loss完全解耦了样本对各个图文对独立计算 Sigmoid不需要计算分母。因此它不需要跨 GPU 收集特征去除了通信瓶颈这就是它能在显存有限的情况下大幅扩展 Batch Size 和模型规模的根本原因。