想象你经营着一家专做“图文配对”的红娘公司。客户把照片和文字交给你,你要判断它们是不是天生一对。CLIP 就是这家公司的王牌团队,而它麾下的视觉编码器 ViT,则是首席红娘手里那副神奇的“拆图眼镜”——戴上它,任何照片都会在一瞬间被拆成几十块整齐的小拼图,每块拼图都被编号、提炼出特征,再经过层层“头脑风暴”,最终凝聚成整张图的“印象笔记”。与此同时,文本部门也把一句描述转成同样格式的档案。两家部门经过海量“图+配文”的配对练习,终于学会一个技能:只要把两份档案往桌上一放,就能立刻打出“般配分”。本文就带你走进这家红娘公司,看看 ViT 怎么拆图、CLIP 怎么训练配对,以及你在实际项目中该如何选红娘、用红娘。
CLIP ViT 是当前多模态大模型的“视觉之眼”,掌握它的原理与工程细节,是成为多模态算法工程师的关键一步。
可视化演示
动态演示CLIP ViT视觉编码器深的核心机制,通过入门/进阶/实战/优化四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
CLIP ViT视觉编码器深:CLIP CLIP对比学习预训练的核心机 ViT在CLIP中的图像编码流 核心机制可视化 CLIP ViT视觉编码器深整体架构与关键组件
CLIP 整体认知
假设你开了一家“图文红娘公司”,主营业务是给照片和文字牵线。公司有两个部门:左边是“图像部”,负责把一张照片读成一份“特征档案”;右边是“文本部”,负责把一句话读成同样格式的“特征档案”。两个部门最后把档案放进同一个“语义社区”,档案越像,说明图与文越般配。CLIP 这家公司,正是在 4 亿张“图+配文”的相亲档案中培训出来的顶级团队——它就是 OpenAI 在 2021 年开山之作里定义的多模态预训练模型,也是如今几乎所有 VLM 的“视觉底座”。
技术上讲,CLIP 采用双塔结构:视觉编码器(ViT 或 ResNet)把图像编码为向量 $u$,文本编码器(Text Transformer)把文本编码为向量 $v$。训练时,同一批数据里每张图有一段配套文字,构成“正样本对”;其他图文组合自然成为“负样本对”。模型要学的,就是让正样本对的向量更近、负样本对更远。两个向量之间的“般配程度”用相似度打分来衡量。整份档案的格式统一,维度完全一致,这就是“维度对齐”的朴素含义。
打分公式是余弦相似度除以温度:
现在你应该明白了:CLIP 这家红娘公司既不教图像部“这是什么物体”、也不教文本部“语法对不对”,它只教一件事——“图和字,到底配不配”。这份“配对直觉”,正是接下来拆图与配对所有动作的底气。
- 图像向量 $u_i$视觉塔把第 i 张图编码成 d 维向量
- 文本向量 $v_j$文本塔把第 j 句编码成同维向量
- 点积相似度$u_i^\top v_j$ 衡量两向量方向的接近程度,值越大越般配
- 温度缩放除以 τ 调节分数分布的锐利程度
ViT 分块机制
红娘要判断般配,第一步就是把照片拆开看清楚。首席红娘戴上“拆图眼镜”,把一张 224×224 的照片按固定大小切成一块块正方形拼图块——就像把一幅巨型拼图板倒出来,铺满一桌。每一块拼图,都是一个独立的小零件。在 ViT 的术语里,这些拼图块叫 Patch。假如 patch 尺寸是 p×p,图像是 H×W,那么总共会得到 N 个 patch。
每块 patch 展平成像素向量后,要乘以一个可学习的线性投影矩阵 $W_e$,映射成 d 维的“token 特征卡”。这就是“展平映射”:把一块二维彩色拼图,翻译成一组能参与后续计算的数字。为了不让模型丢失拼图在原始画面中的位置,还要给每张特征卡盖上一个“位置戳”——可学习的位置编码(Position Embedding)。同时,序列开头还插一张特殊的“总览卡” CLS token,后面正式用它代表整幅图。
整个过程用公式表达:
一桌零散的拼图块被整整齐齐盖好了编号、装进了档案袋。CLS 这张“总览卡”是红娘的记事本,后面所有拼图的信息都会被汇总到它上面。拆图仪式的准备工作,宣告完成。
- 切分 patch图像被切成 N 个 p×p 的小块
- 展平每个 patch 展平成 $p^2 c$ 维像素向量(c 为通道数)
- 线性投影乘可学习矩阵 $W_e$ 得到 d 维 token
- 拼接 CLS 与位置编码头部拼上 CLS token,再整体加上位置编码
图像编码流程
拼图摊开后,红娘公司召开“头脑风暴会”:每块拼图都可以举手发言,告诉其他拼图“我看到了什么颜色、什么形状”,同时也要竖起耳朵听别人怎么说。这样来回讨论许多轮,每块拼图对整幅画面的理解就越来越全面。在技术层面,这场头脑风暴就是层层堆叠的 Transformer Block。每一层由多头自注意力(MSA)、多层感知机(MLP)、两次 LayerNorm(LN)和两个残差连接组成。
自注意力(MSA)让每个 token 都能“看到”序列里所有其他 token,从而建立全局联系,比如“门”的拼图能通过“门把手”拼图确认自己属于房子;MLP 则对每个 token 做一次非线性加工,相当于每个员工私下做功课。经过 L 层(ViT-B 为 12 层)的反复讨论后,CLS token 已经聚合了全图信息——它不再只是第一张卡片,而是整张照片的“浓缩印象”。
单层 Transformer 的计算过程:
头脑风暴结束后,红娘只需要翻看 CLS 那张“总览卡”,就能写出对整张照片的完整印象。最后再对这个印象做一次“格式化”——L2 归一化,把它摆到标准档案架(单位球面)上,方便和文本档案直接比对。
- 层归一化对输入做 LN,稳定训练、加速收敛
- 多头自注意力MSA 让每个 token 聚合全局信息
- 第一次残差连接与原始输入相加,防止深层梯度消失
- MLP 加工与第二次残差逐 token 前馈并再次残差
对比学习原理
训练红娘的核心,是一套“配对考试”。每次考试,公司拿出一批(B 张图,B 句话)的选手,要求红娘给每位图片选手找出正确搭档。第 i 张图的真命天子是第 i 句话(正样本),其他 B−1 句话都是干扰项(负样本)。考卷上的分数,就是前面算出的相似度矩阵。CLIP 希望第 i 张图与自己配套文本的相似度,在所有 B 个文本中排名第一——它不是在学“这张图是什么类别”,而是在学“这张图和哪句话最搭”。
为了让这个目标可优化,CLIP 用 InfoNCE 损失作为考试评分规则:分子把正样本分数指数放大,分母把 batch 内所有文本的指数分数求和,两者一比就是“正确配对在全部候选中的占比”,再取负对数。每考完一轮,调整一次眼光,让般配的人越走越近、不配的人越推越远。
经过 4 亿对图文的魔鬼训练,图像部与文本部终于住在同一个“语义社区”里,见面点头就能认出彼此。正样本像磁铁一样被吸到一起,负样本则被弹簧推开——最终形成一片井然有序的“图文户型图”。这就是零样本能力的神秘来源:类别不再是固定编号,而是任意一句话的坐标。
- 相似度矩阵先计算 batch 内每对图文相似度
- 分子正样本对的指数分数,越大越好
- 分母与 batch 内所有文本的指数分数之和,构成 softmax 归一化
- 取负对数最大化正样本概率,等价于最小化该损失
版本选型指南
红娘公司做大后,客户来咨询:我该请哪一位红娘?有的红娘(ViT-B/32)动作麻利、价格实惠,但眼光略粗;有的红娘(ViT-L/14)火眼金睛、精度极高,但收费贵、出场慢。选谁,要看你的活是什么。CLIP 官方提供了多个 ViT 版本,最常用的是 ViT-B/32 与 ViT-L/14。名字里的数字,就是 patch 尺寸 p:32 表示每块拼图 32×32 像素,14 表示每块 14×14 像素。
patch 越大,序列越短,计算越快,但空间细节丢失越多;patch 越小,序列越长,精度越高。ViT-L/14 还提供 336 分辨率变体(@336px),在更高分辨率上进一步微调,精度更好。参数量方面,ViT-B/32 视觉塔约 86M,ViT-L/14 约 304M,接近三倍差距——这还没算文本塔和投影层。选型时要在精度、显存、延迟之间做权衡。
patch 数量与分辨率的直接关系:
选型就像请红娘:追求实时响应的移动端 App,用 B/32 足够快;做高精度图文检索或给 VLM 当“眼睛”,L/14@336 更稳。记住:红娘的能力上限,取决于你给的活儿难度和预算——没有最好的红娘,只有最合适的红娘。
- 高与宽的 patch 数分别用 H 和 W 除以 p 取整
- 总数相乘得到序列长度
- 以 224 分辨率为例p=32 时 N=49,p=14 时 N=256
工程实践要点
选定红娘后,不能直接把她扔进战场。上岗前要做三件事:先学会看照片的“标准姿势”(预处理),再学会读档案的“标准动作”(特征提取),最后决定要不要按自家业务“培训”她(微调)。预处理上,CLIP 训练时把图像 resize 并 center-crop 到 224 或 336,像素值按预训练统计归一化——你私拉乱改照片比例,红娘就会看走眼。
特征提取时,encode_image 输出的向量要 L2 归一化,保证后续点积就是余弦相似度;文本侧同样归一化。微调时,如果数据量少,建议冻结 ViT backbone,只调投影层或加 LoRA,避免灾难性遗忘;数据量大且任务差异大,再考虑全量微调。推理时可用半精度、ONNX/TensorRT 加速,特征缓存能大幅降低在线开销。
零样本分类时,我们用文本模板构造候选句,与图像特征算 softmax 概率:
红娘上岗后,还会遇到各种“奇怪客户”——低分辨率老照片、艺术插画、专业医学影像。此时别急着怪红娘,先检查预处理姿势对不对、要不要请“导师”(微调)再培训。工程细节到位,红娘才能发挥真正的实力——所有翻车现场,九成都是因为“姿势不对”。
- 图像特征视觉塔输出并归一化
- 文本候选特征用模板如 "a photo of a {label}" 编码 K 个类别
- 余弦相似度之比对 K 个候选做 softmax 得到概率
AI 应用场景
零样本图像分类
阶段:推理与部署
解决的问题:传统分类需要收集大量标注数据并训练分类头,成本高、冷启动慢。CLIP ViT 无需训练,直接对候选文本标签打分即可分类,支持任意类别集合,类别可以随时换。
具体案例:某电商平台要对新上架商品做类目初筛,商品图直接与 "a photo of electronics"、“a photo of clothing“ 等文本比较,秒级完成粗分类,准确率不错且零标注成本。运营人员甚至可以直接新增”二手手机”类目,无需重新训练。
电商以文搜图 / 以图搜文
阶段:特征提取与向量检索
解决的问题:传统检索依赖人工打标或单模态特征,跨模态检索困难。CLIP 把图和文映射到同一向量空间,直接向量检索即可。
具体案例:某图片库平台让用户输入“雨天撑着红伞的少女”,系统用文本塔编码 query,与离线建好的 ViT 图像特征库做余弦相似度 Top-K 检索,返回最匹配图片;反过来用户选一张图,也能搜出风格相近的文案和标签。
多模态大模型(VLM)视觉底座
阶段:预训练与微调
解决的问题:VLM(如 LLaVA、Qwen-VL)需要视觉侧先产出高质量图像特征,再注入 LLM。CLIP ViT 是现成的、经过图文对齐的视觉编码器,省去从零训练视觉塔的成本。
具体案例:某创业团队做人机对话机器人,直接加载 ViT-L/14 权重,用 adapter 把图像特征映射到 LLM 的词嵌入空间,在少量图文对话数据上微调,快速做出能“看图说话”的 demo——整个过程不到一周。
Python 演示
"""Extract CLIP ViT image features and match with text."""import torchfrom PIL import Image, ImageDrawimport open_clip def load_clip(model_name="ViT-B-32"): model, _, preprocess = open_clip.create_model_and_transforms( model_name, pretrained="openai" ) tokenizer = open_clip.get_tokenizer(model_name) model.eval() return model, tokenizer, preprocess def make_demo_image(): """Draw a simple house image as test input.""" img = Image.new("RGB", (224, 224), "#f0f0f0") d = ImageDraw.Draw(img) d.rectangle([50, 100, 170, 180], fill="#818CF8") d.polygon([(30, 100), (110, 40), (190, 100)], fill="#F43F5E") d.ellipse([150, 30, 190, 70], fill="#10B981") return img def main(): model, tokenizer, preprocess = load_clip() image = preprocess(make_demo_image()).unsqueeze(0) texts = ["a house with a red roof", "a photo of a cat", "a blue sky"] text_tokens = tokenizer(texts) with torch.no_grad(): img_feat = model.encode_image(image) txt_feat = model.encode_text(text_tokens) img_feat = img_feat / img_feat.norm(dim=-1, keepdim=True) txt_feat = txt_feat / txt_feat.norm(dim=-1, keepdim=True) probs = (img_feat @ txt_feat.T).squeeze(0).softmax(dim=-1) print("CLIP ViT-B-32 image feature shape:", img_feat.shape) for text, p in zip(texts, probs.tolist()): print(f"match probability with [{text}]: {p:.2%}") if __name__ == "__main__": main()
model, _, preprocess = open_clip.create_model_and_transforms(...)一行同时拿到 ViT 模型与图像预处理管线。tokenizer = open_clip.get_tokenizer(model_name)获取配套文本分词器,保证图文同胚。image = preprocess(make_demo_image()).unsqueeze(0)图像按预训练标准 resize/归一化,并加 batch 维。img_feat = model.encode_image(image)视觉塔前向,输出(1, 512)的图像特征向量。txt_feat = model.encode_text(text_tokens)文本塔前向,输出(3, 512)的文本特征矩阵。img_feat = img_feat / img_feat.norm(dim=-1, keepdim=True)L2 归一化,让点积等价于余弦相似度。probs = (img_feat @ txt_feat.T).squeeze(0).softmax(dim=-1)相似度矩阵经 softmax 变成匹配概率。
常见误区
误区很多人以为“CLIP 里的 ViT 就是训好的图像分类模型,直接拿最后一层特征接个分类头就行”,于是跳过文本侧,只把 ViT 当特征提取器。
正解CLIP ViT 是在对比学习目标下训练的,它的特征空间是“图文对齐”的度量空间,而非类别边界。它擅长回答“这张图和这句话像不像”,不擅长直接输出类别。最佳实践是保留文本编码器做零样本打分,或用它初始化后做 VLM 微调。
为何常见:因为 ViT 本来就起源于图像分类,大家惯性思维以为它只能干分类,忽略了 CLIP 的“配对”本质。
误区“B/32 太慢,我把 patch 改成 16 试试?或者把 L/14 的 patch 改成 32,应该更快。”
正解patch size 决定序列长度和感受野,官方权重的位置编码和投影层都是按固定 patch size 训练的。直接改 patch 大小,等于让红娘戴着错位的眼镜看拼图,性能暴跌。想换精度,请直接换官方版本。
为何常见:patch size 看起来只是个超参数,小白认为改改没关系,忽略了模型权重与结构强绑定。
误区“CLIP 不是多模态吗?那我放大到 448×448 应该看得更清、效果更好。”
正解CLIP 预训练分辨率固定(224 或 336),位置编码数量与分辨率绑定。超分辨率输入会让位置编码失效、patch 分布偏移。需要高分辨率时,选官方微调过的 @336px 版本,或自己微调位置编码。
为何常见:直观上“分辨率越高越清楚”,但忽略了模型内部结构对输入尺寸的强假设。
误区“InfoNCE 损失就是在对 batch 里的 N 个文本做分类嘛,和交叉熵不是一回事吗?”
正解形式上确实像(softmax 分类),但本质不同:分类是学习固定类别边界,InfoNCE 学的是相对相似度排序,负样本是动态变化的,类别“字典”是非参数化的。这正让 CLIP 能零样本扩展到任意文本类别。
为何常见:softmax 的数学形式相似,容易让学生忽略两者的学习目标和泛化能力差异。
误区“微调 CLIP 就要把 ViT 和文本塔全部解冻,不然效果上不去。”
正解小数据全量微调极易破坏预训练图文对齐,造成灾难性遗忘。常见做法是冻结 ViT、只调投影层/文本侧,或用 LoRA 等参数高效微调。数据量很大且任务接近图文对齐时,才适合全量微调。
为何常见:习惯了“全量微调=效果好”的 CNN 时代经验,忽略了预训练大模型对灾难性遗忘的敏感性。
面试题
Q1. CLIP 视觉编码器的核心任务是?
- A.把图片压成极小的字节码
- B.把图片映射为语义特征向量← 正确答案
- C.把图片识别成固定类别
- D.把图片切割成多个文件
答案:B。CLIP 的视觉塔(ViT)把图像编码成语义向量,为后续与文本向量配对打分服务。它不是压缩算法、不是分类头、也不是文件切分工具。选项 B 准确描述了“编码器”的本质。
Q2. 224×224 图像按 16×16 patch 切分,token 序列长度(不含 CLS)是?
- A.一共 49 个序列单元
- B.一共 196 个序列单元← 正确答案
- C.一共 224 个序列单元
- D.一共 256 个序列单元
答案:B。224÷16=14,14×14=196 个 patch,所以序列长度是 196。49 是 patch size 为 32 时的数量,别混淆。CLIP 的 ViT-B/32 走的是 49 个 token 的轻量路线,ViT-L/14 则是 256 个 token 的精度路线。
Q3. ViT 中加到 token 上的位置编码作用是?
- A.加快模型训练的收敛速度
- B.保留 patch 空间顺序信息← 正确答案
- C.降低训练时的显存占用
- D.增加模型的总参数量
答案:B。Transformer 本身是“词袋”结构,天然不感知顺序。位置编码给每块拼图盖“位置戳”,告诉模型这是左上角还是右下角。虽然它客观上也会增加参数量,但那是副作用,不是目的。
Q4. 对比学习中“负样本对”指的是?
- A.语义完全一致的图文组合
- B.内容不匹配的图文组合← 正确答案
- C.属于同一类别的两幅图像
- D.同一条文本的两次编码结果
答案:B。在一个 batch 里,第 i 张图与第 i 句配套是正样本,与其余 B−1 句都是负样本。CLIP 通过“拉近正样本、推远负样本”学到判别性的图文对齐空间。语义一致或同类别属于正样本范畴。
Q5. CLIP 训练时把图文配对分数除以温度 τ 的目的是?
- A.让最终的损失值变小
- B.调节相似度分布锐利程度← 正确答案
- C.减少负样本的参与数量
- D.降低整体计算的复杂度
答案:B。τ 越小,分数差异越悬殊,softmax 输出越“尖锐”,模型训练时对难负样本更敏感;τ 越大,分布越平滑。它不改变计算量、不改变样本数量,只是缩放分数的标尺。
Q6. 关于 ViT-B/32 与 ViT-L/14 的说法,正确的是?
- A.B/32 的 patch 更大序列更短← 正确答案
- B.L/14 的 patch 更小序列更长← 正确答案
- C.B/32 的计算量通常比 L/14 大
- D.L/14 精度通常更好但更重← 正确答案
答案:ABD。patch 大则序列短,所以 B/32 的 49 个 token 比 L/14 的 256 个 token 轻量得多,计算量更小而非更大,C 错误。L/14 因更细的 patch 密度和更大的模型容量,精度更高、参数量和计算量也更大。
Q7. 使用 CLIP ViT 做特征提取时,正确的做法包括?
- A.对特征做 L2 归一化处理← 正确答案
- B.resize 到任意分辨率均可
- C.遵循预训练预处理统计← 正确答案
- D.直接用原始像素送入模型
答案:AC。特征 L2 归一化后点积即余弦相似度,是 CLIP 的标准姿势;预处理必须遵循预训练时的 resize、crop 和归一化统计,不能随意改分辨率,也不能拿原始像素直接进模型。B、D 会破坏训练分布。
Q8. 想零样本判断图中物体,正确做法是?
- A.重新训练一个全新分类头
- B.构造文本候选并计算相似度← 正确答案
- C.用聚类算法分割图像区域
- D.直接输出目标的坐标框
答案:B。零样本分类的秘诀是用模板把类别名变成句子(如 “a photo of a cat“),让文本塔编码后与图像特征算相似度,取最高分。重新训练分类头就谈不上”零样本”,聚类和检测定位也不是分类。
Q9. 关于 CLIP 的 InfoNCE 损失,正确的是?
- A.分母包含正样本和负样本← 正确答案
- B.分子拉近正样本分数← 正确答案
- C.只需要一张图一个文本
- D.温度越高分布越平滑← 正确答案
答案:ABD。InfoNCE 的分子是当前图文对的指数分数,分母是该图像与 batch 内所有文本的指数分数之和(含正负样本),通过 softmax 归一化实现“正样本排第一”。没有 batch 就没有负样本,C 错误;τ 越大分布越平滑,正确。
Q10. CLS token 最终输出的特征代表?
- A.图像中某个 patch 的局部内容
- B.整张图像的全局语义特征← 正确答案
- C.文本序列的上下文特征
- D.位置编码的权重数值
答案:B。CLS 是序列头部的特殊“总览卡”,经过多层 Transformer 自注意力后,它聚合了所有 patch 的信息,最终输出代表整幅图的全局特征。它不属于某个 patch、不是文本特征、也不是位置编码。