第10章 · 多模态学习 · 阶段测试题答案¶
一 · 单选 (8 题)¶
1.1 B - CLIP 通过对比学习对齐图像-文本。
1.2 A - VLM = Vision Language Model。
1.3 C - ViT 把图像分成 patch。
1.4 B - BLIP-2 用 Q-Former 连接冻结的视觉编码器和 LLM。
1.5 A - VQ-VAE 把图像离散化为 token。
1.6 C - Stable Diffusion 是潜在扩散。
1.7 B - 多模态对齐指不同模态在统一空间。
1.8 A - 跨模态检索是 VLM 典型应用。
二 · 多选 (4 题)¶
2.1 ABCD - 都是多模态任务。
2.2 ABD - C 错: LLaVA 是 VLM, 不是 ASR。
2.3 ABC - 都是多模态对齐方法。
2.4 ABCD - 4 大模态类型。
三 · 简答 (5 题)¶
3.1 CLIP 训练¶
训练: 大规模 (图像, 文本) 对, 对比学习 - 同一对的图像-文本 → 拉近 - 不同对 → 拉远 - 损失: InfoNCE
应用: - 零样本分类 (文本 prompt) - 图像检索 - 作为 VLM 的视觉编码器
3.2 VLM 三种架构¶
| 架构 | 代表 | 特点 |
|---|---|---|
| 双塔 | CLIP / ALIGN | 独立编码 + 对比 |
| 融合 | ViLBERT / LXMERT | 跨模态 attention |
| LLM 中心 | LLaVA / BLIP-2 | 视觉编码器 → 投影 → LLM |
LLM 中心是当前主流 (GPT-4V, Claude 3.5 Sonnet 都类似)。
3.3 图像 Token 化¶
VQ-VAE / VQ-VAE-2: - 编码器: 图像 → 离散 token - Codebook: K 个离散向量 - 解码器: token → 图像
意义: 让图像成为"视觉词汇", 可用 GPT 类模型生成图像
应用: DALL-E 1, Parti, Muse
3.4 视觉问答 (VQA)¶
任务: 给图像 + 问题, 输出答案 模型: - 早期: CNN + LSTM + 注意力 - 当前: VLM (LLaVA / Qwen-VL / GPT-4V)
评估: VQA accuracy + 推理能力
3.5 跨模态生成¶
任务: - 文本 → 图像 (Stable Diffusion / DALL-E) - 文本 → 视频 (Sora / Veo / Kling) - 图像 → 文本 (BLIP / LLaVA) - 音频 → 视频
核心技术: Diffusion / VQ-Token / Cross-Attention
四 · 编程 (2 题)¶
4.1 CLIP 零样本¶
from transformers import CLIPProcessor, CLIPModel
from PIL import Image
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
image = Image.open("cat.jpg")
texts = ["a photo of a cat", "a photo of a dog", "a photo of a car"]
inputs = processor(text=texts, images=image, return_tensors="pt", padding=True)
outputs = model(**inputs)
logits_per_image = outputs.logits_per_image
probs = logits_per_image.softmax(dim=1)
print(probs) # cat 概率最高
4.2 LLaVA 推理¶
from transformers import LlavaNextProcessor, LlavaNextForConditionalGeneration
processor = LlavaNextProcessor.from_pretrained("llava-hf/llava-v1.6-mistral-7b-hf")
model = LlavaNextForConditionalGeneration.from_pretrained("llava-hf/llava-v1.6-mistral-7b-hf")
conversation = [{"role": "user", "content": [{"type": "image"}, {"type": "text", "text": "描述这张图"}]}]
prompt = processor.apply_chat_template(conversation, add_generation_prompt=True)
inputs = processor(images=image, text=prompt, return_tensors="pt").to("cuda")
output = model.generate(**inputs, max_new_tokens=100)
print(processor.decode(output[0], skip_special_tokens=True))