5.2 多模态扩展 Transformer 架构的伟大之处在于其天然的可扩展性——它不仅能处理文本,还能处理图像、音频、视频等多种模态。从 2020 年 Vision Transformer(ViT)横空出世,到 CLIP 实现图文跨模态理解,再到 BLIP 统一视觉理解和生成,Transformer 已成为多模态 AI 的统一架构。 5.2.1 Vision Transformer(ViT) 图像转序列 ViT 的核心思想极其优雅:将图像切分为固定大小的 patch,每个 patch 展平后视为一个 token,然后直接使用标准 Transformer Encoder 处理。
Transformer 架构的伟大之处在于其天然的可扩展性——它不仅能处理文本,还能处理图像、音频、视频等多种模态。从 2020 年 Vision Transformer(ViT)横空出世,到 CLIP 实现图文跨模态理解,再到 BLIP 统一视觉理解和生成,Transformer 已成为多模态 AI 的统一架构。
ViT 的核心思想极其优雅:将图像切分为固定大小的 patch,每个 patch 展平后视为一个 token,然后直接使用标准 Transformer Encoder 处理。
具体流程如下:
输入图像 224×224×3 ↓ 切分为 16×16 patches 196 个 patch × 768 维 ↓ 加入 [CLS] token 和位置编码 197 个 token × 768 维 ↓ 12 层 Transformer Encoder 197 个 token × 768 维 ↓ 取 [CLS] token 输出 → MLP Head 分类结果
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 相比传统 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 通过两个创新解决了 ViT 在密集预测任务中的不足:
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, )
CLIP(Contrastive Language-Image Pre-training)由 OpenAI 于 2021 年发布,通过对比学习同时训练图像编码器和文本编码器,使模型能够理解图像和文本之间的语义对应关系。
训练过程:
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 最令人惊叹的能力是零样本分类——不需要任何训练数据,仅通过文本描述就能识别图像类别:
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 可以在任何领域进行分类,无需收集标注数据,极大降低了部署成本。
对于中文场景,可以使用开源的 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 = ["夕阳下的海滩", "繁忙的城市街道", "宁静的山间小屋"] # ... 推理流程同英文版本
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}")
从单模态到多模态的扩展是 Transformer 生态最重要的趋势之一。当前的发展脉络清晰可见:
第一阶段:单模态王者:BERT 文本理解、GPT 文本生成、ViT 图像分类各自独立发展。
第二阶段:跨模态对齐:CLIP 通过对比学习实现图文对齐,打通视觉和语言的桥梁。
第三阶段:统一模型:GPT-4V、Gemini 等大模型同时理解文本和图像,甚至视频和音频。单一模型处理所有模态成为现实。
第四阶段:多模态生成:DALL-E、Stable Diffusion、Sora 等模型从文本生成图像、视频,实现了跨模态生成。
对于开发者而言,HuggingFace Transformers 提供了统一的多模态 API,无论是 ViT、CLIP 还是 BLIP,都可以用相同的 AutoModel 和 pipeline 接口调用,极大地降低了多模态开发门槛。
从 NLP 到多模态,Transformer 证明了自己作为通用 AI 架构的巨大潜力。掌握多模态技术,是紧跟 AI 发展趋势的必备技能。