想象你走进一家婚恋事务所:老红娘想教出全城最会牵线的实习生,但她不下发任何“最佳夫妇”的答案手册,而是甩给实习生整整 4 亿份从互联网上捞来的“照片 + 自荐信”档案,让 TA 自己从里面悟出什么叫般配。训练的方式也不是背题,而是一场场“百人选一”的宴席:拿出一张照片,让 TA 从一大堆候选档案里找出真正配对的一个人,找对了就表扬,找错了就挨罚。这个把“找对人”写成损失函数、把数亿份图文档案喂给双编码器的过程,就是 CLIP 预训练。这篇文章会沿着这条“红娘养成”之路,拆解 CLIP 的数据来源、数据清洗、InfoNCE 对比损失、batch 大小、训练超参数、双编码器架构与复现细节——让你不仅能看懂 CLIP,还能在自己的项目里照着练出一位合格的多模态“红娘”。
对 AI 从业者而言,理解 CLIP 预训练的数据管线和对比损失,是进入多模态检索、零样本分类、图文生成等方向的必修课,也是复现与调优自监督模型的基础功。
可视化演示
动态演示CLIP预训练的核心机制,通过开始/执行/监控/完成四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
CLIP预训练:CLIP CLIP的400M图文对数据集 数据过滤与清洗策略 核心机制可视化 CLIP预训练整体架构与关键组件
数据收集规模
想象一座城市里有一家野心勃勃的婚恋事务所,老红娘想培养一位“金牌实习生”。这位实习生不看人工整理的花名册,而是直接翻阅整个互联网上人们晒出的“照片 + 自我介绍”,从里面自学什么叫“般配”。它要读 4 亿份这样的档案——比人类红娘一辈子经手的相亲对象还要多出几个数量级。
这位“实习生”就是 CLIP。CLIP 预训练的第一步,是从公共网页上自动抓取“图文对”:一张图片,连同它旁边的标题、说明文字、alt 文本,打包成一条训练样本。它不需要任何人工标注——网页作者留下的字就是“免费标签”。
数据规模上,CLIP 用了约 4 亿(400M)个图文对,是 ImageNet 人工标注集(约 128 万张)的 300 倍以上。比规模更关键的是多样性:真实网页上的图片五花八门——风景、商品、表情包、医学影像、故障照片……没有谁会刻意把类别配平。这种“混乱而真实”的分布,正是 CLIP 之后能零样本地迁移到各种下游任务的本钱。当然,它的代价是噪声大、错配多,于是有了下一节的筛选。
量变尚未自动产生质变,但 4 亿份民间档案让实习生见了足够多的世面;接下来,老红娘要做的就是“去粗取精”。
数据过滤策略
档案堆成山之后,老红娘做的第一件事不是赶紧配对,而是先扔掉垃圾——有照片和文字完全对不上的、有同一份档案重复投递了八百遍的、也有纯粹是系统乱码的。她很清楚:喂给实习生的资料要是脏的,再聪明的脑袋也会学歪。
CLIP 论文正是把大量精力花在这一步。对比学习对“错配对”极其敏感:一个错配样本会被当成“正例”拉近,等于在训练数据里埋了一颗地雷。因此论文用一整套数据清洗流程来构造 WIT(WebImageText)数据集。
过滤策略分三个层次。其一是关键词过滤:先构造 500 个高频概念词表,用文本匹配筛出像“AI 生成”“广告”“导航”这类低质或与图片无关的网页文本。其二是近重复去重:对图片和文本分别做哈希或 embedding 近似去重,避免某个爆款表情包反复出现、主导整个表示空间。其三是质量筛选:训练一个小分类器判断“这段文本是否像图片的描述”,滤掉那些“只有图没有描述”或“描述驴唇不对马嘴”的样本。
三层筛完,档案库从“能用的”变成了“好用的”。老红娘这才放心地把这些干净档案交给实习生反复研读——数据这一步,决定了后续所有训练的上限。
对比损失原理
训练正式开始。老红娘摆下酒席:同时请来 N 位候选人,给实习生一张照片,让它从这 N 份档案里挑出“真命天子”。实习生对每个人都打一个“心动分”,分数最高的是对的那个人,就奖励它;认错了,就惩罚它。这个“多选一”的玩法,是整套方法的心脏。
评分不能凭感觉,得先统一语言。图片经过图像编码器变成向量 v_i,文本经过文本编码器变成向量 t_j,两者的“心动分”用余弦相似度衡量:
有了分数,还差“胜负”规则。InfoNCE 损失把这场选人游戏写成了一道数学题:对图片 i,正确的配对是第 i 个文本,其余 N-1 个都是“干扰项”。它要求正样本得分占总得分的比例尽量接近 1:
CLIP 实际用的是对称版本:除了“图片找文本”,还让“文本找图片”,两者损失相加取平均。公式里的 τ 是温度系数,控制红娘的“严苛程度”:τ 越小,softmax 分布越尖锐,模型越要死死咬住唯一正样本,对细微差异也更敏感。原版 CLIP 把温度的倒数 logit_scale 当成可学习参数,从一个小值慢慢学大。
就这样,每一轮酒席都是一次“百人选一”的残酷考试。实习生在一次次的认错中调整眼光,直到练出“一眼定终身”的火候。
- 分子正确配对的相似度经温度缩放后取指数,表示“对的人”拿到的相对分。
- 分母对 batch 内全部 N 个文本候选求指数和,表示“全场候选”的总分。
- 比值正样本得分占总分的比例,越接近 1 越好。
- 负对数把“好”变成“要小”的损失,比例越趋近 1,损失越趋近 0。
批次大小影响
酒席到底该摆多大?这是老红娘最纠结的问题。候选人太少,实习生闭着眼睛都能蒙对,学不到真本事;候选人越多,越是鱼龙混杂,越能逼出真功夫。
在 InfoNCE 里,酒席的大小就是 batch size。一个 batch 有 N 个图文对,对图片 i 来说,正样本是第 i 个文本,其余 N-1 个文本全部充当负样本:
所以,大 batch 在对比学习中不只是“加速训练”这么简单,它直接决定了学习信号的质量。CLIP 用了 batch size 32,768——一个 batch 里同时有 32767 个负样本,对比任务足够残酷,学到的表示足够细腻。当然,代价也直观:显存爆炸、分布式通信开销大,学习率还要随之线性放大,否则训练不稳定。
宴席越大,红娘越是在沙里淘金,练出的眼光也越毒——只是这场宴席的账单,也要按 G(显存)来付。
- batch 对数N 是当前 batch 内图文对的总数。
- 减一正样本占掉一个名额,其余都算负样本。
- 难度来源N 越大,softmax 分母项越多,模型必须把分数更精准地集中到正确项上。
训练超参数
培训实习生要有节奏。老红娘不会一上来就让她处理最难的单子,而是先做简单跟单(warmup 预热),然后逐渐加码,到后期再缓缓降强度,避免用力过猛闪了腰。
CLIP 的训练节奏正是如此。它用 Adam 优化器训练 32 个 epoch;学习率先做线性预热(前若干步从 0 涨到峰值),随后按余弦曲线平滑退火到接近 0:
优化器里也有讲究。Adam 的更新规则可以直观理解为“用梯度平均方向除以梯度波动尺度”:
CLIP 的 Adam 用 betas=(0.9, 0.98),weight decay 0.2;ViT 用 fp16、ResNet 用 bf16 混合精度训练以省显存提速;logit_scale(温度倒数)从 0(对应 τ 初始约 0.07)开始学习,之后随训练自然增大。
预热、退火、自适应优化器——老红娘的培训大纲精确到每一天的工作量,节奏对了,实习生才能“越练越稳”。
- 一阶矩梯度的指数移动平均,代表最近一段时间的平均方向。
- 二阶矩梯度平方的指数移动平均,反映梯度波动幅度。
- 归一化更新量方向除以尺度,让大梯度与小梯度都走得稳。
- 参数更新沿更新量走一步,步长由学习率 η 控制。
双编码器架构
事务所的架构其实很朴素:两个部门。图片部负责把照片读成一份“档案卡”,文字部负责把自荐信读成一份同规格的“档案卡”。两个部门互不串门,但最后交出来的卡片必须格式统一——这正是多模态牵线的秘密。
CLIP 由两个独立编码器组成,而不是把图文拼成一句喂给一个大模型。图像侧可以选 ResNet 或 ViT(原版最佳是 ViT-L/14),文本侧是一个约 6300 万参数的小型 Transformer。两个塔把各自输入映射到相同维度的向量空间,并各自做 L2 归一化。
相似度只比向量的夹角,不关心模长——所以推理时它支持任意图片和任意文本两两打分。这种“双塔解耦”带来两个工程红利:一是图片/文本特征可以离线预计算并建立 ANN 索引,检索时快如闪电;二是下游只需要一个塔的特征,就能做零样本分类、图文检索、特征增强等任务。训练时两个塔通过 InfoNCE 互相拉齐坐标系,一旦对齐,就形成“给图找话、给话找图”的通用接口。
图片部和文字部各管一摊,却共用同一套“档案编码”。红娘手里有卡,就能一眼比对全所档案——这就是双编码器架构的妙处。
复现注意事项
隔壁城市的分所想复制这套红娘培训法。他们拿到培训册子之后发现:光有公式远远不够,还得复刻 4 亿份档案库、一整套筛选流水线、以及 256 块顶级显卡日夜不停地烧半个月。少一样,出来的实习生就差一截火候。
论文中 400M 图文对的数据集(WIT)并未公开,这是复现最大的坎。开源社区常用 LAION-400M / LAION-5B 作为“代餐”,虽然数量够大,但分布和质量与 WIT 不完全一致,效果会有出入。因此想要接近原版成绩,必须自己动手复刻“关键词过滤 + 近重复去重 + 质量筛选”三步。
复现时还要盯住几个细节。算力:原版用 256 块 V100 训练约 14 天,预算不足就缩小 batch 并线性下调学习率,但负样本一少,效果会明显打折。评测:CLIP 以 36 个数据集的 zero-shot 分类准确率为准,prompt 模板要写死(如 "a photo of a {label}"),不得在测试时随意换写法。训练:混合精度、梯度累积、logit_scale 的学习方式都要与配置一致,否则相似度尺度错位,评测会崩。
红娘的本事是整个系统的产物——数据、算力、节奏、裁判,环环相扣。抄作业也得按章法来,少抄一环,学的都是皮毛。
AI 应用场景
电商以图搜物
阶段:预训练 + 零样本图文检索
解决的问题:传统以图搜图只认视觉相似,用户上传一张街拍图,系统分不清“同款”和“同风格”之间的语义差别。用 CLIP 把商品图和商品标题编码到同一空间,就能实现“看图找文案、看文找图”的语义检索。
具体案例:某服装电商用 CLIP 在 500 万商品库上离线编码商品图与标题,用户上传穿搭图,系统秒级返回风格相近的商品,并展示匹配到的标题片段。
内容平台自动打标与审核
阶段:预训练特征 + 零样本分类
解决的问题:人工审核成本高、新违禁类型层出不穷。CLIP 的图像塔输出特征可匹配“涉黄、暴力、广告”等文本描述,无需标注样本即可识别新形态违规内容。
具体案例:某 UGC 视频平台用 CLIP 对每日千万级封面图做“图→违规文案”相似度检测,命中后才转人工复核,审核量减少约 70%。
医疗影像图文检索
阶段:领域数据上的 CLIP 预训练
解决的问题:医疗影像与放射报告的配对数据稀缺且噪声大,传统方法难以利用文本信息。用 InfoNCE 在院内部署的“影像-报告”对上预训练,让影像塔学会“看图说话”的语义空间。
具体案例:研究团队用 30 万张 X 光片与报告训练 CLIP,医生输入一段异常描述(如“右下肺野片状高密度影”),系统在历史影像库中检索出相似病例用于参考。
Python 演示
import numpy as np def normalize(x): """L2 归一化,把向量缩放到单位长度。""" return x / np.maximum(np.linalg.norm(x, axis=1, keepdims=True), 1e-12) def log_softmax(logits): """数值稳定的 log_softmax,等价于 InfoNCE 分母的 log 形式。""" m = np.max(logits, axis=-1, keepdims=True) return logits - m - np.log(np.sum(np.exp(logits - m), axis=-1, keepdims=True)) def info_nce_loss(image_feats, text_feats, temperature=0.1): img = normalize(image_feats) txt = normalize(text_feats) logits = img @ txt.T / temperature labels = np.arange(logits.shape[0]) loss_i2t = -np.mean(log_softmax(logits)[labels, labels]) loss_t2i = -np.mean(log_softmax(logits.T)[labels, labels]) acc = np.mean(np.argmax(logits, axis=1) == labels) return 0.5 * (loss_i2t + loss_t2i), acc def train_step(image_feats, text_feats, temperature=0.1, lr=0.06): img = normalize(image_feats) txt = normalize(text_feats) logits = img @ txt.T / temperature p = np.exp(logits - np.max(logits, axis=1, keepdims=True)) p = p / p.sum(axis=1, keepdims=True) grad = (p - np.eye(logits.shape[0])) / temperature return image_feats - lr * (grad @ txt) def main(): np.random.seed(0) batch_size = 64 image_feats = np.random.randn(batch_size, 16) * 0.3 text_feats = np.random.randn(batch_size, 16) * 0.3 for step in range(60): loss, acc = info_nce_loss(image_feats, text_feats, 0.1) if step % 20 == 0: print(f"step={step:3d} loss={loss:.4f} acc={acc:.3f}") image_feats = train_step(image_feats, text_feats) print("last_acc=", acc) if __name__ == "__main__": main()
logits = img @ txt.T / temperature算出 N×N 相似度矩阵并除以温度,对应文中红娘的“心动分”。loss_i2t = -np.mean(log_softmax(logits)[labels, labels])取每行对角元素的 log-softmax,实现“图片找文本”方向的 InfoNCE。return 0.5 * (loss_i2t + loss_t2i), acc对称版 InfoNCE:文本找图片方向也计算一次,取平均。grad = (p - np.eye(logits.shape[0])) / temperature正样本处梯度是 p-1,负样本处是 p,推动模型“拉近对的、推开错的”。image_feats - lr * (grad @ txt)用梯度更新图片特征,等价于一次迷你 SGD 步。
常见误区
误区我一直以为 CLIP 和 ResNet 一样,是拿人标好的“图片-类别”对训练的,只是数据集更大一些。
正解CLIP 的训练数据是互联网上的(图片,文本)自然配对,没有人工类别标签。它学的是“这张图和这段话是否匹配”,而不是“这只猫是哪个品种”。这是一种弱监督/自监督的对比学习范式,文本只是扮演了天然标签的角色。
为何常见:因为 CLIP 最终能出色完成分类任务,初学者很容易用监督分类的老框架去脑补它的训练方式。
误区既然目标是让图片和它自己的描述靠近,那把所有正样本拉近不就够了吗?负样本看着很多余。
正解如果只有正样本,模型的最优解是把所有图片、所有文本都映射到同一个点——这就是表示坍缩。InfoNCE 的分母必须包含大量负样本,模型被迫在“谁该得高分”中做选择,才会学到能区分不同语义的精细结构。
为何常见:人眼天然盯着“该靠近的那一对”,容易忽略 softmax 分母里“该远离的一大片”,而后者恰恰是对比学习的灵魂。
误区把 batch size 调大,不就是让 GPU 一次多算点、训练跑快点吗?跟学得好不好关系不大。
正解在对比学习中,batch size 首先决定负样本数量,再决定任务难度和梯度质量。CLIP 用 32768 的大 batch,本质是拿到 32767 个优质负样本;同时它要求学习率随 batch 线性放大,否则训练不稳定。
为何常见:传统监督训练中 batch 主要影响优化稳定性与速度,这套直觉被照搬到了对比学习里,却没意识到负样本才是主角。
误区反正有 4 亿对样本,就算有些错配的,量大自然会把噪声“稀释”掉,直接训练就行。
正解错配的图文对被当成正例拉近,会直接污染语义空间;噪声越大,模型学出的“般配标准”越混乱。CLIP 的 WIT 构建用了关键词过滤、近重复去重、质量筛选三道工序,数据质量与数量共同决定上限。
为何常见:大数据本身自带光环,但对比学习对标签噪声极度敏感——噪声不会自动消失,只会被模型当成真理背下来。
面试题
Q1. CLIP 预训练的核心数据是哪种?
- A.人工标注的图片类别标签
- B.网页抓取的图文描述对← 正确答案
- C.纯文本的百科全书语料
- D.带字幕的视频帧序列
答案:B。CLIP 从互联网抓取图片与相邻文本组成配对,属于弱监督图文数据,而非人工类别标签。选项 A 是 ImageNet 的做法,C、D 与图文配对无关。
Q2. CLIP 用的图文对大约有多少?
- A.1 万对
- B.130 万对
- C.400 万对
- D.4 亿对← 正确答案
答案:D。WIT 数据集约 4 亿图文对,是 400M 规模,比 ImageNet 人工标注集大两个数量级,这是 CLIP 零样本能力的数据基础。
Q3. 计算图文相似度前,两个向量需要做什么?
- A.L2 归一化成单位向量← 正确答案
- B.减去均值再除以方差
- C.四舍五入成整数向量
- D.拼接后过全连接层
答案:A。余弦相似度只关心方向。将向量归一化成单位向量后,点积就等于余弦相似度,使相似度打分稳定在可控范围。
Q4. CLIP 数据过滤常包含哪些操作?
- A.关键词过滤低质文本← 正确答案
- B.移除近重复图文样本← 正确答案
- C.保留与图相关的描述← 正确答案
- D.人工逐张审核全部数据
答案:ABC。CLIP 用关键词过滤、近似去重、质量筛选三层流程构建 WIT。选项 D 在 4 亿规模下没有可行性,也不属于论文做法。
Q5. InfoNCE 分母对每个图片求和的是?
- A.当前 batch 全部文本候选← 正确答案
- B.数据集里所有图片向量
- C.仅正样本对应的文本
- D.随机采样一个负样本
答案:A。InfoNCE 分母对 batch 内 N 个文本求指数和,其中含一个正样本和 N-1 个负样本。因此 batch 变大,负样本数量随之变大。
Q6. 温度参数 τ 调小时,相似度分布会?
- A.变得更平坦
- B.变得更尖锐← 正确答案
- C.保持完全不变化
- D.变为负值分布
答案:B。τ 越小,exp 把相似度差距放大得越厉害,softmax 概率越集中在最大项上,模型对“唯一正确”越苛刻。
Q7. 大 batch size 在 CLIP 中的主要作用是?
- A.减少 GPU 显存占用
- B.增加负样本数量提升对比难度← 正确答案
- C.减小编码器参数量
- D.消除混合精度误差
答案:B。大 batch 直接决定负样本数量,从而决定对比任务难度与梯度信息量。CLIP 用 32768 的 batch 获得大量负样本,而不是为了省显存或减参数。
Q8. CLIP 训练常采用的策略包括?
- A.Adam 优化器← 正确答案
- B.线性预热加余弦退火← 正确答案
- C.混合精度加速训练← 正确答案
- D.固定学习率训练全程
答案:ABC。CLIP 使用 Adam(betas=0.9, 0.98)、线性预热 + 余弦退火的学习率调度,并用 fp16/bf16 混合精度加速。选项 D 与论文描述相反。
Q9. 复现 CLIP 时最难复刻的是?
- A.论文中的损失函数公式
- B.4 亿图文对的数据管线← 正确答案
- C.双编码器的参数数量
- D.温度系数的初始化方式
答案:B。损失函数公式简单可复现,但 4 亿图文对的数据集未公开,其爬取与三层过滤管线才是复现的最大障碍,选项 B 正确。
Q10. 训练时把温度设得过低可能导致?
- A.对比分布过于尖锐← 正确答案
- B.梯度不稳定训练震荡← 正确答案
- C.模型完全忽略负样本
- D.学习率自动变为零
答案:AB。τ 过小时,softmax 分布过尖,模型对细微噪声过度敏感,梯度易不稳定。它不会忽略负样本,反而会过度响应;学习率与温度无直接关系。