AI-For-Beginners 多模态网络实战:CLIP 对比学习、VQGAN+CLIP 图像生成与 DALL-E 全景解析

原创2026-10-03 13:40:42438 阅读
文章标签:教程人工智能机器学习深度学习

AI-For-Beginners 多模态网络实战:CLIP 对比学习、VQGAN+CLIP 图像生成与 DALL-E 全景解析

本文基于 AI-For-Beginners 课程(12 周、24 课时的人工智能入门教程)的《Multi-Modal Networks》一课,系统讲解 Transformer 架构在跨模态领域的延伸——OpenAI 的 CLIP 与 DALL-E。你将掌握 CLIP 的对比学习原理、零样本图像分类与文本驱动的图像检索方法,理解 VQGAN+CLIP 如何实现"按文字描述生成图片",并了解 DALL-E 1/2 的技术脉络。文末还会结合课程自带 Notebook 给出可复现的 PyTorch 代码示例,帮助你直接上手实验。

CLIP 架构:图像与文本被编码到同一语义空间并通过对比学习对齐

从 NLP 到多模态:Transformer 架构的跨界延伸

Transformer 模型在解决 NLP 任务上取得巨大成功后,相同或相似的架构也被逐步应用到计算机视觉任务中。学术界和工业界越来越关注构建同时具备视觉与自然语言能力的模型——这正是多模态网络(Multi-Modal Networks)的核心命题。OpenAI 的尝试就是本课的主角:CLIP 与 DALL-E。

在 AI-For-Beginners 的课程体系中,这一课属于"X-Extras"扩展部分,位于 NLP(5-NLP 章节)与视觉、生成模型等课程之后,读者可以结合前序课程中关于 CNN 卷积网络 与 GAN 生成对抗网络 的知识,更快理解本课涉及的生成模型细节。

对比图像预训练(CLIP)

核心思想:用文本提示衡量图像

CLIP(Contrastive Image Pre-Training,对比图像预训练)的核心思想是:将一段文本提示(text prompt)与一张图像进行比较,判断这张图像与提示的匹配程度。它把视觉和语言统一到一个共享的语义空间中,从而让"看图说话"与"按描述找图"变成同一个问题的两个方向。

对比学习与损失函数

CLIP 使用互联网上收集的海量图片及其描述文字(caption)进行预训练。在训练过程中,对于每一个 batch,模型取出 N 对 (图像, 文本) 数据,分别将其转换为向量表示:

  • 图像向量:I₁, I₂, ..., I_N
  • 文本向量:T₁, T₂, ..., T_N

随后这些表示被相互匹配。损失函数的设计是该方法的精髓:它被定义为——最大化属于同一对样本的向量之间的余弦相似度(例如 Iᵢ 与 Tᵢ),同时最小化所有其他配对组合之间的余弦相似度。也就是说,模型要学习"猫的图片"与"猫的文字描述"在向量空间中靠得更近,而"猫的图片"与"狗的图片"等其他组合要尽量远离。这正是该方法被称为**对比式(contrastive)**的原因。

预训练后的三种典型能力

一旦模型完成预训练,我们就可以向它同时传入一批图像和一批文本提示,它会返回一个包含匹配概率的张量。围绕这一机制,CLIP 可以用于多种任务:

1. 零样本图像分类

假设我们需要把图片区分为猫、狗和人三类。此时只需向模型传入一张图像,以及一组文本提示:"一张猫的图片"(a picture of a cat)、"一张狗的图片"(a picture of a dog)、"一张人的图片"(a picture of a human)。在返回的包含 3 个概率值的向量中,选择概率最高的索引对应的类别即可——整个过程不需要任何针对该任务的标注数据训练。

CLIP 零样本图像分类:同一图像与多个文本提示匹配并取最高概率索引

2. 基于文本的图像检索

反过来也一样:如果我们拥有一个图像集合,把整个集合传给模型并给出一个文本提示,模型会返回与提示最相似的图像。这使得"用一句自然语言在一堆照片里找目标"成为可能。

3. 图像生成中的语义引导

CLIP 还可以作为"语义裁判"参与图像生成过程(详见下文 VQGAN+CLIP 部分),用文字描述来引导生成器产出符合预期的图片。

动手实践:使用 Clip.ipynb 跑通零样本分类与图像检索

课程为这一节配套了完整的 Clip.ipynb Notebook,里面直接给出了可运行的 PyTorch 代码。Notebook 首先安装了 OpenAI 开源的 CLIP 库(在 Notebook 的第一格通过 pip 从 OpenAI 官方仓库安装,并需要 torch、Pillow、matplotlib 等依赖)。

加载模型与数据

Notebook 会优先检测 GPU 是否可用,然后加载官方预训练的 ViT-B/32 模型:

import torch
import clip
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
import os

device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-B/32", device=device)

之后 Notebook 会下载 Oxford-IIIT 宠物数据集的一个子集(缅因猫等图片)作为实验素材,并解压到本地 oxcats/ 目录。

零样本图像分类

下面这段代码把一张缅因猫图片与三句文本提示(企鹅、熊、猫)做匹配:

image = preprocess(Image.open("oxcats/Maine_Coon_1.jpg")).unsqueeze(0).to(device)
text = clip.tokenize(["a penguin", "a bear", "a cat"]).to(device)

with torch.no_grad():
    image_features = model.encode_image(image)
    text_features = model.encode_text(text)

    logits_per_image, logits_per_text = model(image, text)
    probs = logits_per_image.softmax(dim=-1).cpu().numpy()

print("Label probs:", probs)
# 输出示例:Label probs: [[0. 0. 1.]]

从输出可以看到,"a cat"(猫)对应的概率接近 1,其余两个接近 0——模型无需任何针对该数据集的训练就正确完成了分类,这就是**零样本(zero-shot)**能力的体现:因为 CLIP 已经在海量互联网图文对上完成过预训练。

基于文本的图像检索

再来看反向用法:对一堆猫的图片,用一句更模糊的文本描述"a very fat gray cat"(一只很胖的灰色猫)去检索最匹配的一张:

cats_img = [ Image.open(os.path.join("oxcats", x)) for x in os.listdir("oxcats") ]
cats = torch.cat([ preprocess(i).unsqueeze(0) for i in cats_img ]).to(device)
text = clip.tokenize(["a very fat gray cat"]).to(device)

with torch.no_grad():
    logits_per_image, logits_per_text = model(cats, text)
    res = logits_per_text.softmax(dim=-1).argmax().cpu().numpy()

print("Img Index:", res)  # 输出示例:Img Index: 97
plt.imshow(cats_img[res])

代码对每个候选图像与文本提示计算匹配分数,取分数最高(argmax)的图像索引并可视化展示。Notebook 的最终结论(Takeaway)值得强调:预训练的 CLIP 可以无需领域专属训练就完成常见物体的图像分类,并且能够考虑图像中物体的空间配置,实现更灵活的分类与检索;另一个激动人心的应用方向就是下文要介绍的 VQGAN+CLIP。

用 VQGAN+CLIP 进行文本驱动的图像生成

为什么需要生成器模型

CLIP 本身不会"画图",要实现根据文本提示生成图像,我们需要一个能够根据向量输入生成图像的生成器模型。课程选用的代表模型是 VQGAN(Vector-Quantized GAN,向量量化生成对抗网络)。

VQGAN 与普通 GAN 的两点关键区别

结合课程前序的 GAN 章节 可知,传统 GAN 由生成器与判别器相互对抗训练。VQGAN 与普通 GAN 的主要区别在于:

  • 使用自回归 Transformer 架构:VQGAN 不是直接生成整张图像,而是用自回归 Transformer 生成一串"富含上下文信息的视觉部件"序列,再由这些部件组合成完整的图像;而这些视觉部件(视觉 token)由 CNN 卷积网络 负责学习。
  • 使用子图像判别器(sub-image discriminator):传统 GAN 的判别器是"全有或全无"地判断整张图真假,而 VQGAN 的判别器关注图像的局部区域,判断图像的各个部分是否为"真实"或"伪造"。

CLIP 如何引导生成过程

VQGAN 与普通 GAN 还有一个重要差异:普通 GAN 从任意输入向量都能生成一张还算合理的图像,而 VQGAN 很可能生成不连贯(incoherent)的图像。因此,生成过程需要额外的引导,而 CLIP 恰好能承担这个"引导者"的角色。整体工作流如下:

  1. 从一个随机的编码向量出发;
  2. 将该向量送入 VQGAN 生成一幅图像;
  3. 用 CLIP 计算一个损失函数,衡量"当前图像与文本提示的匹配程度";
  4. 目标是最小化这个损失——通过**反向传播(backpropagation)**调整输入向量的参数,循环迭代,让图像逐步逼近文字描述。

VQGAN+CLIP 生成流程:随机编码向量经 VQGAN 生成图像,CLIP 提供损失引导反向传播调整输入

实现 VQGAN+CLIP 的优秀开源库是 Pixray。课程展示了 Pixray 产出的三张示例图像,它们均来自 Dmitry Soshnikov 的 Artificial Teachers 系列——分别由以下三条提示生成:

提示文本 效果
一张年轻男文学教师手持书本的特写水彩肖像 水彩风格人像
一张年轻女计算机科学教师与电脑的特写油画肖像 油画风格人像
一张老男数学教师在黑板前的特写油画肖像 黑板背景油画人像

这些示例直观说明:只要提示写得足够具体(包含画种、构图、主体、道具、背景等要素),VQGAN+CLIP 就能生成风格与内容高度吻合的图像。

DALL-E:把文本与图像当成一个 Token 流

如果说 CLIP 是"理解"跨模态语义,那么 DALL-E 则是 OpenAI 在"生成"方向上的代表作。

DALL-E 1

DALL-E 1 是 GPT-3 的一个版本,专门训练用于从提示(prompt)生成图像,其参数量达到 120 亿(12-billion)。与 CLIP 最大的不同在于输入方式:DALL-E 1 将文本和图像同时作为单一 Token 流处理——图像与文字被统一编码进同一种序列表示中。正因为这样,它能够根据一段(甚至多段)提示文本生成相应的图像。

DALL-E 2

DALL-E 2 与 DALL-E 1 的主要区别是:生成更逼真的图像与艺术作品。课程同样用三条与上面一致的提示(水彩文学教师、油画计算机教师、黑板前数学教师)展示了 DALL-E 的高质量生成结果。

参考资料与延伸学习

本课在 References 部分给出了两个奠基性论文,也是理解多模态网络的必读材料:

  • VQGAN 论文:《Taming Transformers for High-Resolution Image Synthesis》(驯服 Transformer 用于高分辨率图像合成)——介绍如何用自回归 Transformer 实现高分辨率图像合成;
  • CLIP 论文:《Learning Transferable Visual Models From Natural Language Supervision》(从自然语言监督中学习可迁移的视觉模型)——系统阐述 CLIP 的对比学习方法与迁移能力。

如果想在课程内继续深入,建议按顺序回顾:

小结:CLIP 用对比学习把图像与文本拉进同一个语义空间,解锁了零样本分类与文本检索;VQGAN+CLIP 用"生成器 + 语义裁判"的组合实现了可控的文本生成图像;DALL-E 则通过统一 Token 流直接端到端生成。三者共同勾勒出多模态 AI 从"理解"到"创造"的完整能力图谱。

登录后查看全文
AI-For-Beginners