5.2 多模态扩展


文档摘要

5.2 多模态扩展 Transformer 架构的伟大之处在于其天然的可扩展性——它不仅能处理文本,还能处理图像、音频、视频等多种模态。从 2020 年 Vision Transformer(ViT)横空出世,到 CLIP 实现图文跨模态理解,再到 BLIP 统一视觉理解和生成,Transformer 已成为多模态 AI 的统一架构。 5.2.1 Vision Transformer(ViT) 图像转序列 ViT 的核心思想极其优雅:将图像切分为固定大小的 patch,每个 patch 展平后视为一个 token,然后直接使用标准 Transformer Encoder 处理。

5.2 多模态扩展

Transformer 架构的伟大之处在于其天然的可扩展性——它不仅能处理文本,还能处理图像、音频、视频等多种模态。从 2020 年 Vision Transformer(ViT)横空出世,到 CLIP 实现图文跨模态理解,再到 BLIP 统一视觉理解和生成,Transformer 已成为多模态 AI 的统一架构。

5.2.1 Vision Transformer(ViT)

图像转序列

ViT 的核心思想极其优雅:将图像切分为固定大小的 patch,每个 patch 展平后视为一个 token,然后直接使用标准 Transformer Encoder 处理。

具体流程如下:

  1. 切分 Patch:将 224×224 的图像切分为 16×16 的小块,得到 196 个 patch
  2. 线性投影:每个 16×16×3 的 patch 通过线性映射变为 768 维向量
  3. 位置编码:加入可学习的位置嵌入,保留空间位置信息
  4. [CLS] Token:添加一个可学习的分类 token,用于最终分类决策
  5. Transformer Encoder:标准的 12 层 Transformer 编码器处理整个序列
输入图像 224×224×3 ↓ 切分为 16×16 patches 196 个 patch × 768 维 ↓ 加入 [CLS] token 和位置编码 197 个 token × 768 维 ↓ 12 层 Transformer Encoder 197 个 token × 768 维 ↓ 取 [CLS] token 输出 → MLP Head 分类结果

ViT 代码示例

from transformers import ViTImageProcessor, ViTForImageClassification from PIL import Image import requests # 加载预训练的 ViT 模型 feature_extractor = ViTImageProcessor.from_pretrained( "google/vit-base-patch16-224" ) model = ViTForImageClassification.from_pretrained( "google/vit-base-patch16-224" ) # 图像预处理 url = "https://example.com/cat.jpg" image = Image.open(requests.get(url, stream=True).raw) inputs = feature_extractor(images=image, return_tensors="pt") # 推理 outputs = model(**inputs) logits = outputs.logits predicted_class = model.config.id2label[logits.argmax(-1).item()] print(f"预测类别: {predicted_class}")

ViT vs CNN

ViT 相比传统 CNN(如 ResNet)有几个关键差异:

全局感受野:ViT 从第一层就拥有全局感受野(通过自注意力),而 CNN 需要通过多层堆叠逐步扩大感受野。这使得 ViT 更擅长捕捉长距离依赖。

数据效率:ViT 在小数据集上不如 CNN(因为缺乏归纳偏置),但在大数据集(ImageNet-21K、JFT-300M)上预训练后,ViT 能超越 CNN。

可扩展性:ViT 的性能随模型规模增大而持续提升(scaling law 更好),而 CNN 在达到一定规模后容易出现饱和。

计算效率:ViT 的自注意力计算复杂度为 O(n²),对高分辨率图像的计算开销较大。为此,Swin Transformer 引入了分层结构和滑动窗口注意力,将复杂度降为 O(n)。

Swin Transformer

Swin Transformer 通过两个创新解决了 ViT 在密集预测任务中的不足:

  1. 滑动窗口注意力:在局部窗口内计算自注意力,计算量从 O(n²) 降到 O(n)
  2. 跨窗口连接:交替使用常规窗口和移位窗口,实现跨窗口信息传递
from transformers import SwinModel, SwinConfig # Swin Transformer 配置 config = SwinConfig( image_size=224, patch_size=4, num_layers=[2, 2, 18, 2], # 分层架构,不同阶段层数不同 num_heads=[4, 8, 16, 32], # 不同阶段注意力头数不同 embed_dim=128, )

5.2.2 CLIP:图文跨模态理解

CLIP 原理

CLIP(Contrastive Language-Image Pre-training)由 OpenAI 于 2021 年发布,通过对比学习同时训练图像编码器和文本编码器,使模型能够理解图像和文本之间的语义对应关系。

训练过程

  1. 准备 4 亿对图像-文本对(从互联网收集的图像及其 alt-text 描述)
  2. 图像编码器(ViT 或 ResNet)将图像编码为向量
  3. 文本编码器(Transformer)将文本编码为向量
  4. 使用对比损失最大化匹配对的相似度,最小化不匹配对的相似度
Batch of N images → Image Encoder → N image embeddings ↘ Cosine Similarity → Contrastive Loss ↗ Batch of N texts → Text Encoder → N text embeddings

对比损失

对于 N 对图像-文本(本例中 N=32K),计算 N×N 的相似度矩阵。对角线上的 N 个正样本对的相似度应该最大化,非对角线上的负样本对的相似度应该最小化。

CLIP 零样本分类

CLIP 最令人惊叹的能力是零样本分类——不需要任何训练数据,仅通过文本描述就能识别图像类别:

from transformers import CLIPProcessor, CLIPModel from PIL import Image import torch model = CLIPModel.from_pretrained("openai/clip-vit-large-patch14") processor = CLIPProcessor.from_pretrained("openai/clip-vit-large-patch14") image = Image.open("example.jpg") # 定义候选类别(无需训练数据!) labels = ["一只猫", "一只狗", "一只鸟", "一条鱼", "一匹马"] inputs = processor( text=labels, images=image, return_tensors="pt", padding=True, ) outputs = model(**inputs) logits_per_image = outputs.logits_per_image # 图像-文本相似度 probs = logits_per_image.softmax(dim=1) # 输出每个类别的概率 for label, prob in zip(labels, probs[0]): print(f"{label}: {prob:.4f}")

这种零样本能力使得 CLIP 可以在任何领域进行分类,无需收集标注数据,极大降低了部署成本。

中文 CLIP

对于中文场景,可以使用开源的 Chinese-CLIP 模型:

# 中文 CLIP 由 OFA-Sys 开源 from transformers import CLIPModel, CLIPProcessor model = CLIPModel.from_pretrained("OFA-Sys/chinese-clip-vit-large-patch14") processor = CLIPProcessor.from_pretrained("OFA-Sys/chinese-clip-vit-large-patch14") # 中文零样本分类 labels = ["夕阳下的海滩", "繁忙的城市街道", "宁静的山间小屋"] # ... 推理流程同英文版本

5.2.3 BLIP:视觉语言理解与生成

BLIP 架构

BLIP(Bootstrapping Language-Image Pre-training)由 Salesforce Research 于 2022 年提出,统一了视觉理解和视觉生成两大任务。BLIP 的核心创新是:

视觉编码器(Visual Encoder):使用预训练的 ViT 提取图像特征。

文本编码器(Text Encoder):BERT 风格的双向编码器,用于理解文本。

文本解码器(Text Decoder):自回归解码器,用于生成描述文本。

图像-文本融合层(Image-Text Fusion):使用额外的 Cross-Attention 层,将图像特征与文本特征深度交互融合。

视觉问答

from transformers import BlipProcessor, BlipForQuestionAnswering processor = BlipProcessor.from_pretrained("Salesforce/blip-vqa-base") model = BlipForQuestionAnswering.from_pretrained("Salesforce/blip-vqa-base") image = Image.open("example.jpg") question = "图片中有几个人?" inputs = processor(image, question, return_tensors="pt") outputs = model.generate(**inputs) answer = processor.decode(outputs[0], skip_special_tokens=True) print(f"问题: {question}") print(f"答案: {answer}")

图像描述生成

from transformers import BlipProcessor, BlipForConditionalGeneration processor = BlipProcessor.from_pretrained("Salesforce/blip-image-captioning-base") model = BlipForConditionalGeneration.from_pretrained( "Salesforce/blip-image-captioning-base" ) image = Image.open("example.jpg") inputs = processor(image, return_tensors="pt") output = model.generate(**inputs) caption = processor.decode(output[0], skip_special_tokens=True) print(f"图像描述: {caption}")

5.2.4 多模态发展趋势

从单模态到多模态的扩展是 Transformer 生态最重要的趋势之一。当前的发展脉络清晰可见:

第一阶段:单模态王者:BERT 文本理解、GPT 文本生成、ViT 图像分类各自独立发展。

第二阶段:跨模态对齐:CLIP 通过对比学习实现图文对齐,打通视觉和语言的桥梁。

第三阶段:统一模型:GPT-4V、Gemini 等大模型同时理解文本和图像,甚至视频和音频。单一模型处理所有模态成为现实。

第四阶段:多模态生成:DALL-E、Stable Diffusion、Sora 等模型从文本生成图像、视频,实现了跨模态生成。

对于开发者而言,HuggingFace Transformers 提供了统一的多模态 API,无论是 ViT、CLIP 还是 BLIP,都可以用相同的 AutoModelpipeline 接口调用,极大地降低了多模态开发门槛。

从 NLP 到多模态,Transformer 证明了自己作为通用 AI 架构的巨大潜力。掌握多模态技术,是紧跟 AI 发展趋势的必备技能。


发布者: 作者: 转发
评论区 (0)
U