从零开始的完整讲解
两种模态为什么能用一个距离比较
图片是像素,文字是 token,原始表示不能直接做有意义的点积。CLIP 用图像编码器和文本编码器分别得到向量,再通过训练使配对图文在共享空间里更接近。这里的“共享”意味着可以用相同相似度函数比较,不意味着两种编码器结构相同。
例如猫的照片和“a photo of a cat”应比它与“a red bicycle”更匹配。训练利用大量图文配对提供这种相对监督,而不是为所有图片手工标一个固定类别。
把一个 batch 看成一道配对题
假设 batch 有 N 对图文,图像向量矩阵为 [N,d],文本向量也为 [N,d]。归一化后做矩阵乘法,得到 [N,N] 相似度表。第 i 行要找第 i 个文本,因此对角线是正确配对;转过来,每列也要找正确图片。
N=2 时,分数表若为 [[8,2],[3,7]],正确项都较高。图像到文本方向对每行算一次交叉熵,文本到图像方向对转置后的每行再算,再平均。下方 Notebook 展示完整双向 loss;只计算一行无法代表整个训练目标。
负样本并不总是真负例
一个 batch 里可能有两张猫图和两句近似描述。把非对角项全部当作错误配对,是训练目标的方便构造,但其中可能存在语义上合理的其他配对。这叫 false negative 问题。重复数据和泛化描述会影响训练信号,不能只追求 batch 越大越好而不检查数据。
温度调节相似度分布的尖锐程度。过尖锐时,少数难例或错误标签可能产生很强梯度;过平滑则区分信号变弱。温度不是检索质量的唯一旋钮,编码器、数据与负样本构成同样重要。
Zero-shot 分类如何从检索变出来
给每个类别写文本提示,编码成向量,再比较图片向量与各类别向量。最高分对应预测类别。这允许新类别不经过专门分类头训练就参与比较,但预测仍受提示措辞影响。
若候选只有“猫”和“狗”,即使输入是汽车,模型仍可能选其中一个。对候选分数做 softmax 得到的是这个候选集合下的相对分布,不能直接当作开放世界的置信度。增加一个类别后,原有类别的 softmax 概率也会变化。
内容理解为什么不能只靠全图一个向量
“红杯子在蓝盘子左边”和“蓝杯子在红盘子左边”包含相同对象与颜色词,但组合关系不同。全局 embedding 可能对主题很敏感,对计数、空间关系、否定和细粒度属性绑定则需要单独评估。
可以构造最小对照对:只交换左右,只改数量,或只改否定词。这样比随机查看十张图片更容易确定失效模式。若下游目标是商品检索,还要按新商品、细分类和同款不同色分别测量。
从本页实验过渡到真实模型
浏览器版用手工二维向量,便于你改变一个数就看懂 loss。它没有冒充 CLIP 预训练输出。完整 PyTorch 标签保留真实 CLIP 图像和文本编码、相似度矩阵与执行结果。先确认图片预处理与文本模板,再解释得分;不要把合成玩具实验上的低 loss 当成真实检索质量。
两个 encoder,一次配对任务
图像 encoder 与文本 encoder 各输出向量,投影到同一维度并归一化。一个 batch 有 B 个图文配对,矩阵 是 [B,B]。对角线是匹配对,其余位置通常作为 batch negatives。图找文与文找图分别做交叉熵,平均成对称目标。
一个重要陷阱:非对角线不一定语义错误。两张不同猫图可能都匹配“a cat”。False negatives 和重复 caption 会影响学习;batch 组织与数据清理是目标的一部分,不是只要公式写对就完成。
温度改变的是竞争强度
温度小会放大相似度差异,使分布更尖锐,梯度也随之变化。把全部相似度都乘以一个很大的数,训练可能更容易过度自信。训练中可学习的 logit scale 与推理时人为改阈值不是同一个动作。
import torch
import torch.nn.functional as F
image = F.normalize(torch.randn(4, 8), dim=-1)
text = F.normalize(torch.randn(4, 8), dim=-1)
s = image @ text.T / .07
y = torch.arange(4)
loss = (F.cross_entropy(s,y)+F.cross_entropy(s.T,y))/2
print(loss.item())
随机向量只能检查 shape 和 loss 实现。配套 Notebook 加载真实 CLIP,并对自己提供的图片和候选描述运行前向。
零样本分类为什么依赖候选集合?
把“a photo of a cat”等类别描述编码,与图像比较,softmax 后排序。概率是在这些候选标签之间归一化的相对得分;即使图片根本不属于任何一个类别,也会给出最大值。增加一个相似标签会改变归一化分母。Prompt wording、语言和类别粒度也影响排序。
内容理解还包括关系、数数、OCR、时间顺序与细粒度属性,整体图文相似并不能证明这些能力。应使用反事实描述,例如“人推车”与“车撞人”,检查是否仅靠对象词匹配。
自测
问题: 只有一个候选标签时,softmax 得 1,意味着模型确信吗?
展开答案
不是。单元素 softmax 永远是 1。需要原始分数、合适的拒识方法和独立验证集来判断未知类别。原始资料与继续阅读
资料核对:2026-09-10。教学示例不代表生产基准;框架 API 和模型支持请以所链接版本为准。
PYTHON · WEBASSEMBLY · NO GPU
改代码,再验证你的预测
真实 Python 在独立 Worker 中运行,只用标准库;60 秒自动终止。完整 PyTorch 和模型权重实验请打开 Notebook。
运行后显示实际输出。