问题与目标
图像编码器和文本编码器原本输出不同空间的向量。CLIP 用配对图文进行对比学习,让正确图文更接近、批次内错误组合更远。本篇用小型向量例子验证归一化、相似度矩阵与零样本分类。
核心概念

设批次中有 N 对图文,归一化后的图像矩阵 I 与文本矩阵 T 计算:
text
logits = I @ T.T / temperature
理想情况下对角线是正确配对。训练同时计算图找文和文找图的交叉熵。推理时可把类别写成文本描述,比较图片与各类别文本的相似度,实现零样本分类。
可运行实现
python
import math
def normalize(vector):
length = math.sqrt(sum(value * value for value in vector))
if length == 0:
raise ValueError("零向量不能归一化")
return [value / length for value in vector]
def cosine(left, right):
return sum(a * b for a, b in zip(normalize(left), normalize(right)))
image = [0.90, 0.10, 0.00] # 示例视觉编码,不是手工像素
texts = {
"设备指示灯为绿色": [0.85, 0.15, 0.00],
"设备指示灯为红色": [0.05, 0.90, 0.05],
"一只动物": [0.00, 0.10, 0.90],
}
scores = {label: round(cosine(image, vector), 4) for label, vector in texts.items()}
print(scores)
print(max(scores, key=scores.get))
真实 CLIP 用模型编码图片和文本;这个离线例子只隔离并验证检索层数学。实际评估应保存每个候选分数,而不只保存 Top-1。
类别描述会影响结果。“红灯”与“一张红色故障指示灯的设备照片”可能产生不同向量。使用多个模板集成时,要在固定验证集上选择,不能针对单张图片修改到命中为止。
常见问题与排查
忘记归一化向量
点积会混入向量长度影响。确认模型 API 是否已归一化,避免重复或遗漏。
一个 Batch 没有有效负样本
重复或近义图文会产生假负样本。检查配对数据、批次组成和同义标签。
零样本分类没有“其他”类别
模型总会从候选中选一个。加入未知/其他处理,并用分数间隔或阈值触发拒答。
CLIP 能直接生成图片描述
CLIP 主要提供图文表征与相似度。图生文还需要语言解码器或视觉语言模型。
小结
CLIP 把图文任务转换为共享向量空间中的匹配问题。归一化、温度、负样本和文本模板共同影响结果,零样本并不等于零评估。
License: CC BY-NC 4.0
Updated 2 hours ago
Was this article helpful? Give it a like.
0 comments


