在前面的内容中,我们已经了解了多模态嵌入模型的核心思想——将不同模态的数据映射到同一个向量空间,使得图像和文本可以直接进行语义比较。而CLIP(对比语言-图像预训练)正是这类模型中最具代表性的杰作。

现在,让我们深入CLIP的内部机制,并通过实际代码演示,亲眼见证它是如何实现跨模态对齐的。


1 CLIP的跨模态嵌入生成机制

从相似度分数到语义理解

在上一节的代码示例中,我们计算了小狗图像与描述文本“a puppy playing in the snow”之间的相似度分数,得到了约0.33的结果。这个数字本身意义不大,但当我们把它放在一个包含多个图像和多个文本的矩阵中时,它的真正价值就显现出来了。

图9-14展示了一个3×3的相似度矩阵:

图像 \ 文本 “A puppy playing in the snow” “A pixelated image of a cute cat” “A supercar on the road with the sunset in the background”
小狗雪地图 0.33 0.19 0.11
像素化猫图 0.15 0.35 0.09
超跑日落图 0.08 0.13 0.31

观察这个矩阵,我们可以得出两个关键结论:

  1. 对角线上的分数最高——每张图像与其正确描述的相似度都明显高于与其他文本的相似度。这说明CLIP成功地将匹配的图文对在向量空间中拉近了距离。

  2. 非对角线分数较低——不匹配的图文对相似度普遍偏低,表明模型学会了区分不同语义内容。

正是这种能力,让CLIP能够执行零样本分类:对于一张新图像,我们可以准备一组候选类别文本(如“狗”、“猫”、“汽车”),计算图像与每个类别文本的相似度,然后选择相似度最高的类别作为预测结果。整个过程完全不需要训练数据!


2 使用sentence-transformers轻松上手CLIP

虽然直接使用Transformers库调用CLIP已经相当简洁,但sentence-transformers库进一步封装了常用操作,让多模态嵌入的生成变得像“傻瓜式”一样简单。

安装与加载模型

python

# 安装sentence-transformers(如果尚未安装)
# pip install sentence-transformers

from sentence_transformers import SentenceTransformer, util
from PIL import Image
import urllib.request
import torch

# 加载预训练的CLIP模型(ViT-B/32版本)
model = SentenceTransformer("clip-ViT-B-32")

准备图像和文本数据

为了演示,我们使用三张图像和三段描述文本(与下图对应):

python

# 图像URL列表(实际使用时请替换为本地路径或有效URL)
image_urls = [
    "https://raw.githubusercontent.com/HandsOnLLM/Hands-On-Large-Language-Models/main/chapter09/images/puppy.png",
    "https://raw.githubusercontent.com/HandsOnLLM/Hands-On-Large-Language-Models/main/chapter09/images/cat_pixel.png",
    "https://raw.githubusercontent.com/HandsOnLLM/Hands-On-Large-Language-Models/main/chapter09/images/supercar.png"
]

# 加载图像
images = [Image.open(urllib.request.urlopen(url)).convert("RGB") for url in image_urls]

# 定义文本描述
captions = [
    "A puppy playing in the snow",
    "A pixelated image of a cute cat",
    "A supercar on the road with the sunset in the background"
]

生成嵌入并计算相似度矩阵

python

# 对图像进行编码
image_embeddings = model.encode(images, convert_to_tensor=True)

# 对文本进行编码
text_embeddings = model.encode(captions, convert_to_tensor=True)

# 计算余弦相似度矩阵
similarity_matrix = util.cos_sim(image_embeddings, text_embeddings)

# 打印结果
print(similarity_matrix)

输出结果应该类似于:

text

tensor([[0.33, 0.19, 0.11],
        [0.15, 0.35, 0.09],
        [0.08, 0.13, 0.31]])

与我们之前手动计算的矩阵完全一致。现在,我们可以轻松地用这个矩阵完成各种任务:

  • 图像检索:给定文本“a puppy playing in the snow”,找出相似度最高的图像(第一列的最大值对应第一行)。

  • 文本检索:给定图像,找出最匹配的描述(每行的最大值对应的列)。

  • 聚类:将图像和文本的嵌入拼接后,进行聚类分析,可以发现视觉与语义的潜在关联。


3 CLIP的应用场景再探索

除了零样本分类和跨模态检索,CLIP还催生了许多令人惊叹的应用:

1. 生成模型的“导航仪”

稳定扩散(Stable Diffusion)等文本生成图像模型,正是利用CLIP的文本编码器将用户输入的描述转换为向量,然后引导扩散过程生成符合语义的图像。CLIP在这里扮演了“语义理解”的角色,确保生成的图像与文本描述一致。

2. 图像与文本的联合聚类

将大规模图像库和对应的标签文本映射到同一空间后,我们可以进行联合聚类。例如,在电商平台上,商品图像和用户评论可以被聚类到相同的语义簇中,帮助发现“舒适的运动鞋”或“复古风格的连衣裙”等跨模态概念。

3. 自动化图像标注

对于无标签的图像,我们可以通过计算其与常见描述文本的相似度,自动生成候选标签。这种方法在构建大规模多模态数据集时特别有用。

4. 多模态搜索

在混合了图片和文档的知识库中,用户可以用文字搜索图片,也可以用图片搜索相关文档。CLIP让这一切成为可能。


4 为什么CLIP如此强大?

CLIP的成功可以归结为三个关键因素:

  1. 海量数据:CLIP在4亿个图文对上进行了训练,涵盖了互联网上各种各样的图像和文本,这使得它具备了极强的泛化能力。

  2. 对比学习目标:通过最大化匹配图文对的相似度、最小化不匹配对的相似度,模型学会了捕捉跨模态的语义一致性,而不是简单的表面模式。

  3. 双编码器架构:文本编码器和图像编码器各自独立,但在训练中协同优化。这种设计使得模型在推理时可以分别编码不同模态,并快速计算相似度,非常适合检索任务。


5 局限性与未来方向

尽管CLIP表现出色,但它并非万能:

  • 细粒度理解不足:CLIP擅长捕捉整体语义,但在精细的物体关系、计数、空间位置等方面表现不佳。

  • 社会偏见:训练数据来自互联网,不可避免地携带了各种偏见,这可能导致模型在敏感内容上产生不公平的结果。

  • 文本生成能力缺失:CLIP本身不能生成文本,它只是一个理解模型。

未来的多模态模型正在向统一生成方向发展,例如Flamingo、GPT-4V等,它们不仅能理解,还能生成跨模态内容,真正实现“所见即所得,所说即所画”。


总结

多模态嵌入模型,尤其是CLIP,为我们打开了一扇通往跨模态理解的大门。通过将图像和文本映射到同一个向量空间,我们第一次能够像比较文本与文本一样,直接比较图像与文本的语义相似性。

从技术角度看,CLIP的成功得益于视觉Transformer对图像的优雅处理、对比学习的高效训练,以及双编码器的灵活架构。从应用角度看,它为零样本分类、跨模态检索、生成模型引导等任务提供了强大而简洁的解决方案。

正如我们在本章所见,多模态能力的加入,让大语言模型从“语言高手”进化为“通感智者”。未来,随着技术的不断演进,我们将见证更多模态(如音频、视频、传感器数据)的融合,AI理解世界的方式也将越来越接近人类。

本文参考:图解大模型:生成式AI原理与实战

书籍pdf免费下载地址:https://pan.baidu.com/s/1mTaUQ5czcfGpBM8KvJuS2g?pwd=un44

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐