【多模态实战系列·第 01 篇】CLIP 原理对比学习·双编码器·零样本迁移——多模态一切的起点多模态模型实战系列开篇。如果你只学一个多模态模型那必须是CLIP。2021 年 OpenAI 发表的 CLIPContrastive Language-Image Pre-training不是最强大的多模态模型但它是最基础的——它定义了图文对齐的基本范式双编码器架构Image Encoder Text Encoder把图像和文本映射到同一个共享嵌入空间对比学习Contrastive Learning让匹配的图文对靠近、不匹配的推远零样本迁移Zero-Shot Transfer让文本即分类器成为现实。CLIP 的影响力远超它本身LLaVA 直接复用 CLIP 的 ViT 作为视觉编码器BLIP-2 用 CLIP 的对齐特征桥接视觉和语言Stable Diffusion 用 CLIP 作为文本引导的奖励信号OpenCLIP/SigLIP/EVA-CLIP 在 CLIP 基础上持续演进。可以说CLIP 是多模态的ImageNet 时刻——它证明了大规模对比学习可以实现通用的视觉-语言对齐后续几乎所有多模态模型都站在 CLIP 的肩膀上。今天我们从双编码器架构、对比学习原理到零样本迁移与实战应用彻底掌握 CLIP。 文章目录️ 一、双编码器架构两种模态一个空间 二、对比学习配对训练的艺术️ 三、零样本迁移与实战应用️ 一、双编码器架构两种模态一个空间1.1 核心思想把图像和文本映射到同一个向量空间CLIP 的核心思想极其简洁训练两个编码器一个把图像编码为向量一个把文本编码为向量让匹配的图文对在向量空间中靠近不匹配的推远。这就像给图像和文本各配了一个翻译官——Image Encoder 把图像翻译成向量Text Encoder 把文本翻译成向量两个向量在同一个语义空间中可以直接比较。如果一张猫的图片和一只猫的文本向量很接近余弦相似度高说明它们语义匹配。图像 ──→ Image Encoder ──→ v_I ∈ R^d ↕ 余弦相似度 文本 ──→ Text Encoder ──→ v_T ∈ R^d两个编码器输出同一维度 d 的向量CLIP 默认 d512经过 L2 归一化后余弦相似度就是向量点积sim(v_I, v_T) v_I · v_T。1.2 Image Encoder从 ResNet 到 ViTCLIP 的 Image Encoder 有两种架构选择ResNet 系列经典的卷积网络CLIP 论文中测试了 ResNet-50、ResNet-101 等变体。ResNet 的优势是成熟稳定但在大规模数据上 ViT 表现更好。ViTVision Transformer系列这是 CLIP 的主力架构。ViT 将图像切分为 16×16 的 Patch线性投影后送入 Transformer 编码器取 [CLS] token 的输出作为图像表示。CLIP 论文中测试了 ViT-B/32、ViT-B/16、ViT-L/14 等变体其中 ViT-L/14 性能最强。# Image Encoder (ViT-B/32)importtorchfromtransformersimportCLIPVisionModel vision_modelCLIPVisionModel.from_pretrained(openai/clip-vit-base-patch32)# 输入: [batch, 3, 224, 224] 图像imagetorch.randn(1,3,224,224)outputsvision_model(pixel_valuesimage)# 输出: [batch, 768] 视觉特征 → 投影到 [batch, 512]image_featuresoutputs.last_hidden_state[:,0,:]# [CLS] tokenimage_featuresvision_model.visual_projection(image_features)# → [1, 512]ViT 的关键设计Patch Embedding图像→Patch→Token、[CLS] Token全局表示、Position Embedding位置信息、Transformer Encoder自注意力建模全局关系。1.3 Text EncoderTransformer 编码器CLIP 的 Text Encoder 是一个标准的 Transformer 编码器与 GPT-2 类似但使用因果注意力掩码输入文本经过 BPE 分词后送入 Transformer取最高层 [EOS] token 的输出作为文本表示。# Text EncoderfromtransformersimportCLIPTextModel text_modelCLIPTextModel.from_pretrained(openai/clip-vit-base-patch32)# 输入: [batch, seq_len] token IDs (最长77 tokens)texttokenizer([a photo of a cat,a photo of a dog],paddingTrue,return_tensorspt)outputstext_model(**text)# 输出: [batch, 512] 文本特征text_featuresoutputs.pooler_output# [EOS] token → 投影 → [batch, 512]Text Encoder 的关键设计BPE 分词与 GPT-2 相同的词表、77 token 上限CLIP 文本输入的最大长度、[EOS] Token取结束符作为全局表示、Causal Mask因果注意力防止看到未来 token。1.4 共享嵌入空间L2 归一化 余弦相似度两个编码器的输出都经过 L2 归一化映射到单位超球面上。这样余弦相似度就是向量点积计算高效且数值稳定。# 归一化image_featuresimage_features/image_features.norm(dim-1,keepdimTrue)text_featurestext_features/text_features.norm(dim-1,keepdimTrue)# 余弦相似度 点积 (归一化后)similarityimage_features text_features.T# [batch_i, batch_t]归一化的好处1相似度范围固定在 [-1, 1]2对比学习的温度参数 τ 可以直接控制分布的锐度3梯度更稳定。 二、对比学习配对训练的艺术2.1 核心思想正样本拉近负样本推远对比学习是 CLIP 的训练核心。给定一个 batch 的 N 个图文对 {(I₁,T₁), (I₂,T₂), …, (Iₙ,Tₙ)}CLIP 的目标是正样本同一对的图像和文本如 I₁ 和 T₁→ 拉近高相似度负样本不同对的图像和文本如 I₁ 和 T₂→ 推远低相似度一个 batch 中有 N 个正样本对和 N²-N 个负样本对。CLIP 的巧妙之处在于不需要人工标注负样本——同一个 batch 内非配对的图文对自动成为负样本。batch 越大负样本越多训练信号越强。CLIP 论文中 batch size 高达 32768。2.2 InfoNCE 损失对称的对比损失CLIP 使用对称的 InfoNCEInformation Noise Contrastive Estimation损失同时优化图像→文本和文本→图像两个方向图像→文本方向给定图像 Iᵢ在所有文本中找到匹配的 TᵢL_I→T -1/N * Σᵢ log[exp(sim(Iᵢ,Tᵢ)/τ) / Σⱼ exp(sim(Iᵢ,Tⱼ)/τ)]文本→图像方向给定文本 Tᵢ在所有图像中找到匹配的 IᵢL_T→I -1/N * Σᵢ log[exp(sim(Tᵢ,Iᵢ)/τ) / Σⱼ exp(sim(Tᵢ,Iⱼ)/τ)]总损失L (L_I→T L_T→I) / 2其中 τ 是可学习的温度参数logit_scale控制相似度分布的锐度。τ 越小分布越尖锐更关注最相似的样本τ 越大分布越平滑更均匀地关注所有样本。# CLIP 对比学习损失 (PyTorch)defclip_loss(image_features,text_features,logit_scale):# image_features: [N, d], text_features: [N, d] (已L2归一化)logit_scalelogit_scale.exp()# 可学习温度参数# 计算相似度矩阵 [N, N]logits_per_imagelogit_scale*image_features text_features.T logits_per_textlogits_per_image.T# 对称# 标签: 对角线为正样本labelstorch.arange(N,deviceimage_features.device)# 对称交叉熵损失loss_i2tF.cross_entropy(logits_per_image,labels)loss_t2iF.cross_entropy(logits_per_text,labels)return(loss_i2tloss_t2i)/22.3 相似度矩阵对角线高非对角线低训练好的 CLIP其相似度矩阵应该呈现对角线高、非对角线低的模式——正样本对的相似度远高于负样本对。这就是对比学习的目标让模型学会区分匹配和不匹配的图文对。2.4 训练数据4 亿图文对CLIP 的训练数据是WebImageText——从互联网上爬取的 4 亿个图文对。这个数据集的规模是 ImageNet100 万的 400 倍覆盖面极广。关键设计搜索查询构建用 Wikipedia 中的 50 万个查询词构建搜索确保数据多样性去重去除与评估数据集重叠的样本防止数据泄露类平衡每个查询最多保留 2 万个图文对防止某些类别过度代表4 亿图文对的意义对比学习需要大量负样本batch size 越大效果越好。WebImageText 的规模保证了训练的充分性。️ 三、零样本迁移与实战应用3.1 零样本分类文本即分类器CLIP 最惊艳的能力是零样本分类——不需要任何训练数据直接用文本 Prompt 做分类。原理将分类问题转化为图文匹配问题。给定一张图像和 K 个类别为每个类别构造文本 Prompt “a photo of a {class}”计算图像与每个文本的相似度取最高的作为预测类别。importtorchfromtransformersimportCLIPModel,CLIPProcessor modelCLIPModel.from_pretrained(openai/clip-vit-base-patch32)processorCLIPProcessor.from_pretrained(openai/clip-vit-base-patch32)# 零样本分类image...# 加载图像classes[cat,dog,bird,car,tree]texts[fa photo of a{c}forcinclasses]inputsprocessor(texttexts,imagesimage,return_tensorspt,paddingTrue)outputsmodel(**inputs)# 计算相似度logitsoutputs.logits_per_image# [1, K]probslogits.softmax(dim-1)# 概率分布predictedclasses[probs.argmax()]print(f预测:{predicted}, 概率:{probs.max():.2%})Prompt Engineering是零样本分类的关键技巧基础模板a photo of a {class}—— CLIP 论文默认领域模板a satellite photo of a {class}—— 遥感图像多模板集成用多个模板的嵌入取平均提升鲁棒性上下文增强a photo of a {class}, which is a type of animal—— 增加上下文3.2 图文检索以文搜图、以图搜文CLIP 的另一个直接应用是图文检索——用文本搜索图像或用图像搜索文本。# 构建图像索引image_features_list[]forimageinimage_database:inputsprocessor(imagesimage,return_tensorspt)withtorch.no_grad():featuresmodel.get_image_features(**inputs)featuresfeatures/features.norm(dim-1,keepdimTrue)image_features_list.append(features)image_featurestorch.cat(image_features_list)# [N, 512]# 文本→图像检索query一只在草地上奔跑的金毛犬inputsprocessor(textquery,return_tensorspt)withtorch.no_grad():text_featmodel.get_text_features(**inputs)text_feattext_feat/text_feat.norm(dim-1,keepdimTrue)scores(text_feat image_features.T).squeeze(0)top_k_indicesscores.argsort(descendingTrue)[:5]# 返回最相似的5张图像foridxintop_k_indices:print(f图像{idx}: 相似度{scores[idx]:.3f})图文检索的工业应用电商以图搜图、素材库以文搜图、视频关键帧检索、内容审核图文匹配度检测。3.3 CLIP 作为多模态基石CLIP 最重要的间接应用是作为后续多模态模型的视觉编码器LLaVACLIP ViT LLaMA → 视觉大语言模型CLIP 提供视觉 tokenBLIP-2CLIP Q-Former → 桥接视觉和语言CLIP 提供对齐特征OpenCLIPLAION-5B 数据集上的开源复现性能接近原版SigLIPSigmoid 损失替代 Softmax更好的对比学习EVA-CLIP增强视觉编码器更强的图像理解能力Stable DiffusionCLIP Text Encoder 提供文本引导信号CLIP 的视觉编码器之所以被广泛复用是因为它在大规模数据上学习了通用的视觉-语言对齐——这种对齐是后续多模态模型的地基。3.4 CLIP 的局限与改进方向CLIP 也有明显的局限细粒度理解不足CLIP 的全局向量表示丢失了空间信息难以理解猫在桌子上这类空间关系。后续的 GLIP、Grounding DINO 等模型通过引入区域级对齐来弥补。文本长度限制77 token 的上限限制了复杂文本的理解。长文本描述需要截断或压缩。组成性理解弱CLIP 难以理解红色方块在蓝色圆圈左边这类组合性描述。NegCLIP 等工作通过负样本增强来改进。数据偏见WebImageText 从互联网爬取包含社会偏见性别、种族等。FairCLIP 等工作致力于减轻偏见。计算成本大规模对比学习需要巨大的 batch size32768训练成本高昂。SigLIP 用 Sigmoid 损失降低了对 batch size 的依赖。多模态实战系列进度篇号主题核心内容状态01CLIP原理本文对比学习/双编码器/零样本迁移✅02BLIP-2Q-Former/视觉-语言桥接/高效预训练⏳ 下一篇03LLaVA视觉LLM/多模态指令/对话能力待写04图文对齐对齐方法演进/从全局到区域待写05多模态RAG图文混合检索/知识增强待写06视频理解时序空间/长视频/视频QA待写07音频理解语音声音/多模态融合待写08工业应用落地实战/端侧部署/业务集成待写一句话总结CLIP 三大维度双编码器架构Image Encoder ViT——图像→Patch→Transformer→[CLS]→投影→d维向量/Text Encoder Transformer——文本→BPE分词→Transformer→[EOS]→投影→d维向量/共享嵌入空间d512/L2归一化余弦相似度。双编码器的核心两种模态一个空间图像和文本在同一个语义空间中比较、对比学习InfoNCE对称损失——正样本(同一图文对)拉近/负样本(不同图文对)推远/batch内N个正样本N2-N个负样本/可学习温度参数τ控制分布锐度。训练数据4亿WebImageText图文对/batch size 32768。对比学习的核心配对训练让模型学会区分匹配和不匹配的图文对、零样本迁移与实战零样本分类——文本即分类器a photo of a {class}/Prompt Engineering领域模板多模板集成上下文增强。图文检索——以文搜图/以图搜文/电商素材库内容审核。多模态基石——CLIP ViT被LLaVA/BLIP-2/OpenCLIP/SigLIP/EVA-CLIP/Stable Diffusion复用。局限细粒度不足/77 token限制/组成性弱/数据偏见/计算成本高。CLIP的历史地位多模态的ImageNet时刻定义了图文对齐的基本范式后续模型几乎都站在CLIP的肩膀上。参考链接Learning Transferable Visual Models From Natural Language Supervision (CLIP) - OpenAICLIP GitHub - OpenAIOpenCLIP - LAIONSigLIP: Sigmoid Loss for Language Image Pre-TrainingEVA-CLIP