CLIP模型手算实测:AI胶体性能精准对比
摘要
CLIP模型使用4亿图文对训练,文本编码器采用掩码自注意力Transformer提取EOStoken特征,图像编
我们先来聊聊一个经典的问题:传统的图像分类模型,像大家熟悉的 CNN,本质上其实是个“死记硬背”的高手。你给它看一百万张猫的照片,它能精准认出猫;但要是突然扔给它一张“米粉”的图,而训练集里从没见过这玩意儿——它直接就傻眼了。更让人头疼的是,每次想让它认识新物种,就得重新收集数据、打标签、重新训练一轮。这套流程下来,费时费力,扩展性也差得不行。
那么,有没有什么办法,能让模型像我们人类一样,面对未知的事物也能“心里有个谱”,猜个八九不离十?
OpenAI 的 CLIP 模型团队,就给出了一个很有意思的答案。他们的想法很直白:与其让模型死记图片的类别标签,不如直接让它在自然语言描述中学习图片的含义。毕竟,互联网上这类“一张图配一句话”的数据简直不要太多。于是,OpenAI 的研究者们从网上收集了 4 亿个图文对作为训练素材。每一份数据,就是一张图片加上一句简短的文字描述。有了这么大规模的数据,模型也许就能学会:图片里的视觉元素,和文字背后的语义,到底是怎么“对上号”的。


文本编码器
网络结构
| 项目 | 官方数值 | 对应结构图位置 |
| 模型总参数量 | 63M | 完整文本塔 |
| Transformer 堆叠层数 | 12 层 | 图左侧 12x,重复堆叠 12 次同一个模块 |
| 特征隐藏维度(宽度) | d_model=512 | 所有向量统一 512 维 |
| 注意力头数 | 8 头 | Masked Multi Self Attention |
| 最大文本序列长度 | 77 | 输入 [SOS]文本[EOS] 总长度 |
| MLP 前馈中间维度 | 10656 | Feed Forward 层 |
输入[SOS]词嵌入 → 位置编码Position Embedding
→ 12层Transformer块(掩码自注意力+残差→LayerNorm→FFN前馈+残差→LayerNorm)
→ 提取最后[EOS]token特征 → 输出文本特征
为了能手动推敲一下,我们来构建一个“迷你版”的 CLIP 文本编码器。它的结构和官方的完全一样,只是把数字缩小了方便计算:隐藏维度 d_model=2(官方的 512,逻辑一致)、Transformer 层数为 1 层(官方 12 层,只是重复 12 次这套计算)、注意力头为 1 头(官方 8 头,分 8 份再拼回来)、最大序列长度为 3 个 token(官方 77):[SOS]、cat、[EOS]、MLP 中间维度为 4(官方 10656,对应关系是迷你 2→4,官方 512→10656),最后把每个 token 转为 2 维向量。

然后加上位置编码 Position Embedding(固定位置向量)。

二者相加,就得到了 Transformer 的输入。

接下来是 Masked Multi Self Attention,也就是掩码多头自注意力。这里的“掩码”含义是:每个 token 只能看到它前面的 token,看不到后面的(这就是因果掩码)。

然后进行 LayerNorm 层归一化,再通过 Feed Forward 前馈网络。

最终用于图文对齐的文本特征,来源只有一个:最后一个 [EOS] token 的输出。
后续操作流程如下:
输入文字
↓
12 层 Masked Self-Attention (类 Decoder 结构)
↓
取最后 [EOS] 位置的输出 → 512 维
↓
可学习线性层 (512 → 512)
↓
L2 单位归一化
↓
最终文本特征向量 t̂ (模长 = 1)

图片编码器
网络结构
| 部分 | 文本编码器 | 图像编码器 |
| 架构 | Decoder(带掩码单向注意力) | ViT Encoder(双向无掩码) |
| 层数 | 12 层 | 12 层 |
| 隐藏维 | 512 | 512 |
| FFN 中间维 | 10656 | 10656 |
| 全局特征来源 | 最后一位 EOS token | 第一位 CLS token |
| 原始空间 | 语言私有空间 | 视觉私有空间 |
| 投影层 | Text Projection Wt | Image Projection Wi |
| 最终特征 | 512 共享空间文本特征 | 512 共享空间图像特征 |
具体流程如下:
原始图片
(224, 224, 3)
↓
切成 32×32 的 Patch,共 49 个
(49, 3072) ← 49 个 patch,每个拉平是 32×32×3 = 3072
↓
线性投影 (3072 → 768)
(49, 768)
↓
+ 1 个 [CLS] token
(50, 768)
↓
+ Positional Embedding
(50, 768)
↓
× 12 层 Self-Attention
(50, 768)
↓
取 [CLS] 位置的向量
(768,)
↓
线性层 (768 → 512)
(512,)
↓
L2 归一化
(512,) ← 最终图像特征 î

总结一下关键区别:图像编码器 = ViT Encoder,输出的是 CLS token;文本编码器 = Masked Decoder,输出的是 EOS token;然后各自通过投影层进入同一个共享空间,做归一化,再进行图文对比学习。
图文相似度计算
接下来这一步很关键:计算每张图片和每段文字之间的相似度。

假设一个 batch 里有 3 个图文对:
| 描述 | |
| 图像 î₁ | 一只猫 |
| 图像 î₂ | 一只狗 |
| 图像 î₃ | 一辆车 |
对应的文本是:
| 描述 | |
| 文本 t̂₁ | "a cat" |
| 文本 t̂₂ | "a dog" |
| 文本 t̂₃ | "a car" |
相似度矩阵
因为两个特征都做了 L2 归一化,所以可以直接用点积来表示余弦相似度:

在这个矩阵中,绿色的对角线位置就是正确的配对,其值应该尽量大;其余位置是负样本,值则应该尽量小。
乘以温度系数 τ
直接用原始相似度来训练可能会不稳定,所以 CLIP 引入了一个可学习的温度系数 τ,初始化为 0.07:

这个 τ 的作用是放大相似度的差异,让正样本更突出,负样本差距拉得更开。τ 越小,区分度越强;τ 越大,就越平滑。
双向对比损失(Contrastive Loss)
在 CLIP 的训练过程中,一个 Batch 包含 N 张图像和 N 段对应的文本。图像经过 ViT Encoder 编码,得到 N×D 的图像特征矩阵 image_features;文本经过 Masked Decoder 编码,得到 N×D 的文本特征矩阵 text_features。这两个矩阵是后续计算 N×N 相似度矩阵和双向对比损失的基础。

得到图文特征矩阵后,CLIP 通过矩阵乘法计算双向相似度:
- 计算 图像对文本 的相似度矩阵
logits_per_image(形状 N×N),其中每一行代表一张图对所有文本的相似度得分; - 计算 文本对图像 的相似度矩阵
logits_per_text(形状 N×N),其中每一行代表一段文本对所有图片的相似度得分。

可以这样理解:上面的矩阵是“图找所有文”的相似度,下面的是“文找所有图”的相似度。这两个矩阵互为转置(行列互换),是完全对称的。

具体来说:上图把“图片匹配文本”视为一个“N 分类任务”,类别就是 batch 里的所有文本;下图把“文本匹配图片”视为另一个“N 分类任务”,类别是 batch 里的所有图片。这两个都是标准的交叉熵分类损失,合在一起就是 CLIP 的双向对比损失。模型的目标就是:让两个分类任务都能精准选中对角线上的正样本配对。

整个流程可以概括为:先计算图像 - 文本双向相似度矩阵;设定分类标签 targets,对角线位置为正样本;分别对两个相似度矩阵计算交叉熵损失;CLIP 最终的损失 = 图像方向损失 + 文本方向损失。

CLIP 推理阶段:Zero-Shot 预测
到了推理阶段,CLIP 的能力就体现出来了。对于一张图片,它会和所有候选的类别文本描述(比如“A photo of a dog.”)计算余弦相似度,然后取 argmax,找出得分最高的那个类别。最终输出就是自然语言的类别,比如 “A photo of a dog.”。

CLIP 的应用
聊完了原理,我们来看看 CLIP 到底能用在哪些地方。
图文检索
这是最直观的应用场景。比如,你可以用自然语言查询:
| 文本查询 | 检索结果 |
| "A bicyclist with a blue shirt" | 找到了路口骑蓝色上衣自行车的人 |
| "A white car" | 找到了画面中央的白色轿车 |
| "A truck with the text 'JCN'" | 找到了带有 JCN 字样的货车 |
它的输入是两路:文本端是一条自然语言查询,在线实时输入;图像端是监控视频拆出的所有图像帧(数据库),通常离线预先编码好。输出就是数据库中与查询文本余弦相似度最高的那张图像。

其他的应用
当然,CLIP 的应用远不止图文检索,它在多个方向上都发挥着重要作用:
| 应用方向 | 一句话说明 | 是否需要微调 CLIP |
| 零样本图像分类 | 不用训练,直接用文字描述类别给图片分类 | ❌ 零样本,完全不用微调 |
| 图文检索 | 文字搜图片、图片搜文字 | ❌ 零样本推理 |
| 开放词汇检测分割 | 识别任意新词物体,不用标注训练 | ⚠️ 少量微调下游头 |
| AIGC 生成打分引导 | 控制文生图图文匹配度 | ❌ 直接复用特征 |
| 视频动作识别 | 零样本识别视频动作 | ⚠️ 简单下游适配 |
| 多模态大模型底座 | 几乎所有图文大模型的基础组件 | ✅ 后续二次开发微调 |

来源:互联网
本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。