01. 多模态大模型¶
⚠️ 时效性说明:本章涉及前沿模型/价格/榜单等信息,可能随版本快速变化;请以论文原文、官方发布页和 API 文档为准。
学习目标:深入理解多模态大模型的原理、架构和应用,掌握视觉-语言模型的核心技术,了解 VLM 与 VLA 的关键区别。
目录¶
1. 为什么需要多模态¶
1.1 人类认知的多模态本质¶
人类通过多种感官理解世界:
- 视觉:看到物体的形状、颜色、空间关系
- 语言:描述、交流、逻辑推理
- 听觉:声音、音乐、语音语调
- 触觉:质地、温度、力度
关键洞察:真正的智能需要整合多种模态的信息。单一模态只能感知世界的"一个侧面",而多模态融合才能获得完整的认知。
1.2 单模态的局限性¶
Text Only
纯文本模型:
- 无法直接理解图像内容("百闻不如一见")
- 需要极其复杂的文字描述才能传达视觉信息
- 空间关系、颜色、布局等理解困难
纯视觉模型:
- 缺乏语义理解和逻辑推理能力
- 无法用自然语言解释所见内容
- 难以进行复杂的多步决策
1.3 多模态的优势¶
Text Only
1. 信息互补
- 图像提供细节感知,文本提供抽象语义
- 结合后理解更全面、更准确
2. 跨模态推理
- "图中的人在做什么?" → 视觉感知 + 语义推理
- "这段描述对应哪张图?" → 文本理解 + 图像匹配
3. 更自然的交互
- 看图说话(Image Captioning)
- 根据描述搜索图像(Text-to-Image Retrieval)
- 视觉问答(Visual Question Answering)
- 视频理解与对话(Video Understanding)
2. 多模态模型架构演进¶
2.1 架构演进时间线¶
Text Only
2019: ViLBERT / LXMERT → 双塔融合结构,早期跨模态交互
2020: CLIP / ALIGN → 对比学习范式,大规模图文对齐
2021: DALL-E / VQGAN → 图像生成,文本到图像
2022: Flamingo / OFA → 上下文学习,统一序列建模
2023: GPT-4V / LLaVA / Qwen-VL → 统一架构,视觉-语言深度融合
2024: Gemini 2.0 / GPT-4o → 原生多模态,端到端训练
2025: Gemini 2.5 Pro / GPT-5.4 → 多模态推理 + 长视频理解
2026: 多模态 Agent 全面落地 → 视觉理解 + 推理 + 行动闭环
2025-2026 年最新进展:
| 模型 | 机构 | 核心突破 |
|---|---|---|
| GPT-5.4 | OpenAI | 多模态深度融合,实时视频理解与工具调用 |
| Claude 4.6 Opus / Sonnet | Anthropic | 超长上下文图像序列处理 |
| Gemini 2.5 Pro / Flash | 小时级视频理解,原生多模态推理 | |
| Qwen2.5-VL | 阿里巴巴 | 端侧部署优化,中文场景领先 |
| InternVL3 | 上海 AI Lab | 国产开源旗舰,多项 SOTA |
| LLaVA-Video | 社区 | 开源视频对话模型 |
2.2 主要架构类型¶
类型 1:双编码器(Dual Encoder)¶
Text Only
图像编码器 文本编码器
↓ ↓
[ViT] [BERT]
↓ ↓
图像特征 文本特征
↓ ↓
└──── 对比学习 ────┘
代表:CLIP, ALIGN, SigLIP
特点:
✅ 分别编码后对齐,推理效率高
✅ 适合检索任务(以图搜文 / 以文搜图)
❌ 不适合生成任务(缺乏跨模态深度融合)
类型 2:融合编码器(Fusion Encoder)¶
Text Only
图像编码器 文本编码器
↓ ↓
[ViT] [BERT]
↓ ↓
└──── 交叉注意力 ──┘
↓
融合特征
↓
[Transformer]
↓
输出
代表:ViLBERT, LXMERT, ALBEF
特点:
✅ 早期/中期融合,跨模态交互充分
✅ 适合理解任务(VQA、视觉推理)
❌ 计算量大,不适合大规模部署
类型 3:编码器-解码器(Encoder-Decoder)¶
Text Only
图像编码器
↓
[ViT/CNN]
↓
图像特征 ──────┐
↓
文本编码器 [交叉注意力]
↓ ↓
[BERT] [解码器]
└───────────┘
↓
输出
代表:BLIP, BLIP-2, SimVLM, InstructBLIP
特点:
✅ 编码器理解输入,解码器生成输出
✅ 适合图像描述、VQA 等生成任务
✅ BLIP-2 引入 Q-Former 架构,高效桥接冻结 LLM
类型 4:统一生成模型(Unified Generative Model)¶
Text Only
统一的 Transformer 架构
↓
[模态无关的 Token 序列]
↓
[图像Token | 文本Token | 音频Token]
↓
[Transformer]
↓
[统一的输出空间]
代表:GPT-4o → GPT-5.4, Gemini 2.5, Claude 4.6, Chameleon
特点:
✅ 所有模态统一表示,架构最简洁
✅ 原生多模态能力,可任意模态输入输出
✅ 训练效率高,无需额外对齐模块
⚠️ 需要海量多模态数据支撑
3. 核心技术详解¶
3.1 视觉编码器¶
Vision Transformer (ViT)¶
Text Only
ViT 核心思想:将图像视为 Token 序列(与 NLP 对齐)
图像 (H × W × C)
↓
[Patch Embedding] # 将图像切分为固定大小的 patch
↓
[Flatten + Linear] # 每个 patch 线性映射为向量
↓
[Add CLS Token] # 添加分类 token(类似 BERT 的 [CLS])
↓
[Add Position Embedding] # 添加位置信息(ViT 本身无位置感知)
↓
[Transformer Encoder] × N # N 个标准 Transformer 层
↓
特征表示
关键参数:
- Patch size: 16×16 或 14×14
- 对于 224×224 图像:
- 16×16 patch → (224/16)² = 196 个 patch
- 序列长度 = 196 + 1 (CLS) = 197
视觉编码器的变体¶
| 编码器 | 机构/年份 | 核心创新 | 适用场景 |
|---|---|---|---|
| ViT | Google, 2020 | 标准 Transformer 用于视觉,需大规模预训练 | 通用视觉特征提取 |
| Swin Transformer | Microsoft, 2021 | 层次化结构 + shifted window 注意力 | 检测/分割(PaddleDetection 等) |
| ConvNeXt | Meta, 2022 | 纯 CNN 架构现代化,性能媲美 ViT | 需要归纳偏置的场景 |
| EVA-CLIP | BAAI, 2023 | 基于 CLIP 的增强视觉编码器 | 零样本分类、多模态预训练 |
| InternViT-6B | 上海 AI Lab, 2024 | 6B 参数视觉编码器 | 大规模视觉理解 |
3.2 模态对齐技术¶
对比学习(Contrastive Learning)¶
CLIP 的核心思想是:通过对比学习让匹配的图像-文本对在特征空间中靠近,不匹配的对远离。
Python
import torch
import torch.nn.functional as F
def contrastive_loss(image_features, text_features, temperature=0.07):
"""
CLIP 对比学习损失函数
Args:
image_features: [batch_size, dim] 图像特征
text_features: [batch_size, dim] 文本特征
temperature: 温度参数,控制分布尖锐程度
Returns:
loss: 标量损失值
"""
# L2 归一化
image_features = F.normalize(image_features, dim=-1)
text_features = F.normalize(text_features, dim=-1)
# 计算相似度矩阵 [batch, batch]
logits = (image_features @ text_features.T) / temperature
# 标签:对角线为正样本(第 i 张图对应第 i 段文本)
labels = torch.arange(logits.size(0), device=logits.device)
# 对称损失:图像→文本 + 文本→图像
loss_i2t = F.cross_entropy(logits, labels) # 图像找文本
loss_t2i = F.cross_entropy(logits.T, labels) # 文本找图像
return (loss_i2t + loss_t2i) / 2
温度参数 τ 的直觉:
Text Only
τ 小 → 分布更尖锐 → 更关注 hard negative(难区分的负样本)
τ 大 → 分布更平滑 → 训练更稳定,但区分度降低
CLIP 中 τ 设为可学习参数,初始值 0.07,训练中自动调整
特征空间对齐的三种方式¶
Text Only
方法1:线性投影(LLaVA v1)
图像特征 ──[Linear]──> 共享空间
文本特征 ──[已对齐]──> 共享空间
特点:简单高效,参数少
方法2:非线性投影(LLaVA v1.5+)
图像特征 ──[MLP]──> 共享空间
文本特征 ──[已对齐]──> 共享空间
特点:更强的表达能力
方法3:查询机制(BLIP-2 的 Q-Former)
图像特征 ──[可学习 Query]──┐
├──> 共享空间
文本特征 ──[Key/Value]─────┘
特点:冻结 LLM 和视觉编码器,只训练 Q-Former
3.3 视觉-语言预训练任务¶
任务 1:图像-文本对比(ITC, Image-Text Contrastive)¶
任务 2:图像-文本匹配(ITM, Image-Text Matching)¶
Text Only
目标:判断图像和文本是否语义匹配
输入:图像 + 文本
输出:二分类(匹配 / 不匹配)
实现:
[图像特征] ──┐
├──> [跨模态融合] ──> [二分类器]
[文本特征] ──┘
任务 3:掩码语言建模(MLM, Masked Language Modeling)¶
Text Only
目标:根据图像上下文预测被掩码的文本词
输入:图像 + 部分掩码的文本
输出:预测被掩码的词
示例:
图像:[一只猫在沙发上]
文本:"一只 [MASK] 在沙发上"
预测:[MASK] = "猫"
关键:结合视觉信息辅助文本预测(比纯文本 MLM 更强)
任务 4:图像条件语言建模(LM, Language Modeling)¶
3.4 指令微调(Instruction Tuning)¶
为什么需要指令微调¶
Text Only
预训练模型:
- 学会了图像-文本关联
- 但不知道如何遵循用户指令回答问题
- 输出格式不可控
指令微调:
- 教会模型遵循指令("描述这张图片" vs "图中有什么危险")
- 学会多轮对话格式
- 提升实用性和可控性
指令格式示例¶
JSON
[
{
"instruction": "描述这张图片中的内容",
"input": "<image>",
"output": "图片中有一只橘色的猫坐在蓝色的沙发上,旁边有一个绿色的靠垫。"
},
{
"instruction": "图中的人在做什么?",
"input": "<image>",
"output": "图中的人正在跑步,他穿着红色运动服,在公园的小路上。"
},
{
"instruction": "这张图片可能是在哪个季节拍摄的?请说明理由。",
"input": "<image>",
"output": "这张图片可能是在秋天拍摄的,因为树叶呈现出金黄色和橙色,地面有落叶覆盖。"
}
]
4. 代表性模型详解¶
4.1 CLIP (OpenAI, 2021)¶
核心创新¶
Text Only
1. 大规模对比学习
- 4 亿图像-文本对,从互联网收集
- 证明了对标学习 + 大数据的强大威力
2. 零样本分类(Zero-shot Classification)
- 不需要任何训练数据
- 用文本描述作为类别标签即可分类
3. 强大的迁移能力
- 视觉编码器可直接用于下游任务
- 成为后续 VLM 的标准视觉骨干
架构细节¶
Python
# CLIP 模型配置
image_encoder = "ViT-B/32" # 或 ViT-B/16, ViT-L/14, ResNet-50/101
text_encoder = Transformer( # 文本编码器
vocab_size=49408,
width=512,
layers=12,
heads=8,
output_dim=512
)
# 训练超参数
batch_size = 32768 # 超大 batch 是 CLIP 成功的关键
learning_rate = 5e-4
temperature = 0.07 # 可学习参数
零样本分类完整示例¶
Python
import torch
import clip
from PIL import Image
# 加载模型
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-B/32", device=device)
# 准备图像
image = preprocess(Image.open("cat.jpg")).unsqueeze(0).to(device)
# 用自然语言定义类别(零样本分类的核心)
text_descriptions = [
"a photo of a cat",
"a photo of a dog",
"a photo of a bird",
"a photo of a car"
]
text_tokens = clip.tokenize(text_descriptions).to(device)
# 推理
with torch.no_grad():
image_features = model.encode_image(image)
text_features = model.encode_text(text_tokens)
# 归一化后计算余弦相似度
image_features /= image_features.norm(dim=-1, keepdim=True)
text_features /= text_features.norm(dim=-1, keepdim=True)
similarity = (100.0 * image_features @ text_features.T).softmax(dim=-1)
# 输出结果
values, indices = similarity[0].topk(4)
for value, idx in zip(values, indices):
print(f"{text_descriptions[idx]}: {value.item():.2%}")
4.2 LLaVA (Microsoft, 2023)¶
架构¶
Text Only
图像编码器 (CLIP ViT-L/14 @ 336px)
↓
投影层 (两层 MLP)
↓
大语言模型 (Vicuna-7B / 13B)
↓
文本输出
核心思想:将视觉 Token 当作"外语"输入给 LLM
- 简单高效,仅需训练投影层
- 充分利用预训练 LLM 的推理能力
- 开源友好,社区生态丰富
两阶段训练流程¶
Text Only
阶段 1:特征对齐预训练
- 冻结视觉编码器和 LLM
- 只训练投影层(MLP)
- 数据:CC3M 等 ~595K 图像-文本对
- 目标:让视觉特征适配 LLM 的输入空间
- 训练成本:约 1-2 小时(8×A100)
阶段 2:端到端指令微调
- 冻结视觉编码器
- 训练投影层 + LLM
- 数据:158K 指令跟随数据(LLaVA-Instruct)
- 目标:学会多轮对话和复杂推理
- 训练成本:约 3-4 小时(8×A100)
4.3 BLIP-2 (Salesforce, 2023)¶
核心创新:Q-Former 桥接架构¶
Text Only
冻结的视觉编码器 (ViT)
↓
[Q-Former] ← 可学习的 Query 向量
↓ ↓
[与图像交叉注意力] [与文本自注意力]
↓
冻结的 LLM (Flan-T5 / OPT)
↓
文本输出
关键优势:
- 视觉编码器和 LLM 都冻结,只训练 Q-Former(~188M 参数)
- 大幅降低训练成本
- 可灵活切换不同 LLM 骨干
4.4 GPT-4V / GPT-4o / GPT-5.4 (OpenAI, 2023-2026)¶
说明:GPT-4V → GPT-4o → GPT-4.1 → GPT-5.4 是 OpenAI 原生多模态演进的关键里程碑。截至 2026-03-26,新项目应以 GPT-5.4 / GPT-5-mini 作为默认参考。
技术特点¶
Text Only
1. 原生多模态(Native Multimodal)
- 不是后期拼接的模块,而是统一架构处理所有模态
- GPT-4o 开始实现真正的端到端多模态训练
2. 强大的视觉推理能力
- 数学问题求解(从图片读取题目并解答)
- 图表数据分析(理解趋势、比较、异常)
- 文档理解(OCR + 结构化提取)
3. 多模态上下文学习
- 多图推理(比较两张图的异同)
- 跨图推理(基于多张图进行逻辑推理)
- 视频理解(GPT-5.4 支持实时视频流)
4.5 Gemini (Google, 2023-2026)¶
技术架构¶
Text Only
原生多模态设计:
- 从预训练阶段就是多模态(非后期拼接)
- 图像、视频、音频、文本统一建模
多尺度模型家族:
- Ultra: 最强能力,复杂推理任务
- Pro: 平衡性能与成本,通用场景
- Flash: 高速推理,实时应用
- Nano: 端侧部署,移动设备
2025-2026 关键进展:
- Gemini 2.5 Pro: 小时级视频理解 + 原生多模态推理
- Gemini 2.5 Flash: 高性价比多模态推理
- 100+ 语言支持,多语言多模态能力领先
4.6 Qwen-VL 系列 (阿里巴巴, 2023-2026)¶
特点¶
Text Only
1. 中英双语优势
- 中文理解能力强,中文场景优化
- 同时保持英文能力
2. 多粒度视觉理解
- 检测框输出(Bounding Box)
- 指代表达理解(Referring Expression)
- 文档 OCR + 结构化理解
3. Qwen2.5-VL (2025)
- 支持超过 1 小时的长视频理解
- 端侧部署优化(Qwen2.5-VL-3B/7B)
- 多图像比较与推理
4.7 VLA 与 VLM:视觉-语言-动作模型¶
在多模态模型的发展中,VLM(Vision-Language Model)和 VLA(Vision-Language-Action)是两个重要但定位不同的范式。
VLM vs VLA 定位对比¶
Text Only
VLM:输入 → [视觉 + 文本] → 输出 → [文本/描述]
↑ ↑
└── 理解世界(感知)─────────┘
VLA:输入 → [视觉 + 文本 + 状态] → 输出 → [文本/动作指令]
↑ ↑
└── 理解世界(感知) ──→ 决策 ──→ 执行 ──→ ┘
VLM 代表模型¶
| 模型 | 机构 | 特点 |
|---|---|---|
| CLIP | OpenAI | 对比学习预训练,零样本图像分类 |
| LLaVA | Microsoft | 开源友好,指令微调 |
| GPT-4V | OpenAI | 强大推理,原生多模态 |
| Gemini | 原生多模态预训练,多尺度版本 | |
| Qwen2.5-VL | 阿里巴巴 | 中英双语,文档理解强 |
| InternVL3 | 上海 AI Lab | 开源大规模,学术友好 |
VLA 代表模型¶
| 模型 | 机构 | 特点 |
|---|---|---|
| RT-2 | Google DeepMind | 视觉-语言-动作统一模型,泛化能力强 |
| PaLM-E | 77B 参数,结合语言模型与机器人经验 | |
| OpenVLA | Stanford | 开源 VLA,7B 参数,可微调部署 |
| π₀ | Physical Intelligence | 通用机器人大模型,双臂操作 |
| RT-X | Google DeepMind | RT-2 后续,跨机器人泛化 |
VLM vs VLA 详细对比¶
| 维度 | VLM | VLA |
|---|---|---|
| 输入模态 | 图像/视频 + 文本 | 图像/视频 + 文本 + 机器人状态/传感器 |
| 输出模态 | 文本(描述、回答、标签) | 文本 + 动作指令(关节角度、坐标、控制信号) |
| 训练目标 | 视觉-语言对齐、指令跟随 | 视觉-语言-动作对齐、策略学习 |
| 动作空间 | 无 | 离散或连续动作空间(7D 机械臂、方向盘等) |
| 典型应用 | 图像描述、VQA、文档理解 | 机器人控制、自动驾驶、无人机 |
| 实时性要求 | 中等(秒级响应) | 高(毫秒级控制) |
| 闭环反馈 | 开环(一次性输出) | 闭环(观测→决策→执行→反馈) |
| 训练数据 | 图文对、指令数据 | 机器人轨迹、动作标注、人机示范 |
| 评估指标 | 准确率、BLEU、CIDEr | 任务成功率、轨迹误差 |
技术演进趋势¶
Text Only
VLM → VLA 的演进逻辑:
1. 理解 → 行动
VLM:"我看到了一个红色的杯子"
VLA:"我看到了一个红色的杯子 → 伸手 → 抓住它"
2. 感知 → 决策 → 执行
- 感知层:视觉编码器理解环境
- 决策层:语言模型推理任务
- 执行层:动作解码器输出控制信号
3. 关键突破
- RT-2 (2023):首次将 VLM 能力泛化到机器人控制
- PaLM-E (2023):77B 参数模型接入机器人经验
- OpenVLA (2024):开源 VLA,推动学术研究
- π₀ (2024):通用机器人大模型,处理多任务
5. 多模态应用¶
5.1 图像描述(Image Captioning)¶
5.2 视觉问答(Visual Question Answering, VQA)¶
Text Only
输入:图像 + 自然语言问题
输出:答案
示例:
Q: "图中有几个人?"
A: "3 个人"
Q: "左边的人穿什么颜色?"
A: "红色"
Q: "这张图是在室内还是室外?"
A: "室外,可以看到天空和树木"
5.3 图文检索(Image-Text Retrieval)¶
Text Only
任务 1:以图搜文(Image-to-Text Retrieval)
输入:图像
输出:最相关的文本描述
任务 2:以文搜图(Text-to-Image Retrieval)
输入:文本描述
输出:最相关的图像
典型应用:
- 搜索引擎(Google Images, 百度识图)
- 电商平台(拍照购物)
- 素材库管理(智能标签 + 搜索)
5.4 指代表达理解(Referring Expression Comprehension)¶
Text Only
输入:图像 + 指代表达(自然语言描述)
输出:目标物体的边界框
示例:
表达:"穿红色衣服的女孩"
输出:[x, y, w, h] # 边界框坐标
应用:
- 智能相册("找到所有包含猫的照片")
- 机器人抓取("拿起桌上的红色杯子")
5.5 多模态对话¶
Text Only
用户:描述这张图片
模型:这是一张海滩照片,蓝天白云,有几个人在沙滩上玩耍。
用户:他们在做什么?
模型:他们似乎在打排球,周围还有一些人在晒太阳。
用户:天气看起来怎么样?
模型:天气看起来很好,阳光明媚,适合户外活动。从光影角度判断,可能是下午 3-4 点。
5.6 文档理解(Document Understanding)¶
Text Only
输入:文档图像(PDF、扫描件、照片)
输出:结构化信息提取
能力:
- OCR:文字识别(多语言、手写体)
- 表格理解:提取表格结构和数据
- 图表分析:理解柱状图、折线图、饼图
- 版面分析:识别标题、正文、注释、页眉页脚
代表模型:
- GPT-5.4:复杂文档推理
- Qwen2.5-VL:中文文档理解领先
- Gemini 2.5 Pro:多页文档处理
6. 评估与基准¶
6.1 主要基准测试¶
| 基准 | 任务类型 | 评估指标 | 说明 |
|---|---|---|---|
| COCO Captioning | 图像描述 | BLEU, METEOR, CIDEr, SPICE | 最经典的图像描述基准 |
| VQA v2 | 视觉问答 | 准确率 | 平衡了先验知识的 VQA |
| GQA | 组合式问答 | 准确率 | 测试空间关系和逻辑推理 |
| Visual Genome | 场景图生成 | 召回率、准确率 | 细粒度视觉关系理解 |
| RefCOCO/+/g | 指代表达 | 准确率(IoU) | 定位指定物体 |
| MMBench | 综合能力 | 准确率 | 多维度多模态评测 |
| MM-Vet | 多任务 | GPT-4 评估 | 综合能力评估 |
| SEED-Bench | 多维度 | 准确率 | 涵盖空间、时间等多维度 |
| MathVista | 数学视觉推理 | 准确率 | 图表/图形中的数学推理 |
| DocVQA | 文档理解 | ANLS | 文档图像问答 |
| Video-MME | 视频理解 | 准确率 | 综合视频理解基准 |
6.2 评估挑战¶
Text Only
挑战 1:主观性
- 图像描述没有唯一正确答案
- 需要语义相似度评估(CIDEr, SPICE)
挑战 2:幻觉(Hallucination)
- 模型生成图像中不存在的内容
- 例如:图中只有 2 只猫,模型说"3 只猫"
- 需要专门检测方法(CHAIR, POPE)
挑战 3:细粒度理解
- 小物体识别(远处的文字、微小物体)
- 复杂空间关系理解("A 在 B 的左上方")
挑战 4:多图推理
- 跨图比较和推理
- 时序理解(视频帧之间的关系)
7. 前沿研究方向¶
7.1 视频理解¶
Text Only
核心挑战:
- 时序建模:理解动作、事件的时间演变
- 长视频处理:分钟级甚至小时级视频
- 计算效率:视频帧数远多于图像(1 分钟 = 1800 帧@30fps)
- 多模态融合:视频 + 音频 + 字幕 + 文本
主要方法:
- 采样关键帧:均匀采样、场景检测采样、自适应采样
- 时序注意力:Temporal Attention, TimeSformer, VideoMAE
- 视频-文本预训练:WebVid, InternVid, HD-VILA
- 3D ViT:将视频视为时空立方体
2025-2026 最新进展:
- Gemini 2.5 Pro: 原生支持小时级视频理解
- Qwen2.5-VL: 超过 1 小时视频理解
- LLaVA-Video: 开源视频对话模型
- GPT-5.4: 实时视频流理解 + 工具调用
7.2 多图像与跨图推理¶
Text Only
核心能力:
- 多图像比较:找出两张图的异同
- 跨图推理:基于多张图进行逻辑推理
- 相册理解:分析图片之间的关系和故事线
技术实现:
1. 图像拼接:将多图拼接为网格(简单但有效)
2. 独立编码:每张图独立提取特征后交互
3. 交叉注意力:图间信息交互(计算量大但效果好)
4. 序列建模:多图作为有序序列处理
应用场景:
- 医疗影像对比(CT/MRI 序列对比分析)
- 卫星图时序分析(变化检测)
- 漫画/表情包理解(多图叙事)
- 图表跨年份对比(趋势分析)
7.3 多模态大模型的效率优化¶
Text Only
方向 1:模型压缩
- 知识蒸馏(大 VLM → 小 VLM)
- 量化(INT8/INT4 推理)
- 剪枝(结构化/非结构化剪枝)
方向 2:高效架构
- 稀疏注意力(减少视觉 Token 数量)
- 状态空间模型(Mamba 替代 Transformer)
- 混合专家(MoE,只激活部分参数)
- Token 压缩(PruMerge, ToMe 等方法)
方向 3:端侧部署
- 移动端优化(Qwen2.5-VL-3B 可在手机运行)
- NPU 加速(利用手机端 AI 芯片)
- 模型量化 + 编译优化
7.4 世界模型(World Model)¶
Text Only
愿景:构建能够理解和预测物理世界的模型
核心能力:
- 理解物理规律(重力、碰撞、遮挡)
- 预测未来状态(视频预测、场景推演)
- 支持规划和决策(具身智能)
技术路线:
- 视频生成模型(Sora, Genie, VideoPoet)
- 3D 场景理解(NeRF, 3D Gaussian Splatting)
- 具身智能(VLA 模型 + 世界模型)
- 仿真环境(Isaac Sim, Habitat)
2025-2026 进展:
- 视频生成质量大幅提升(Sora, Kling, Gen-3)
- 世界模型开始用于机器人训练(减少真实世界数据需求)
- 3D 理解与生成融合(LRM, InstantMesh)
8. 动手实践¶
实践 1:使用 CLIP 进行零样本分类¶
Python
"""
使用 CLIP 对图像进行零样本分类
无需训练数据,仅用自然语言描述即可分类
依赖安装:pip install torch clip Pillow
"""
import torch
import clip
from PIL import Image
def zero_shot_classify(image_path: str, categories: list[str]) -> dict:
"""
使用 CLIP 进行零样本图像分类
Args:
image_path: 图像文件路径
categories: 类别描述列表
Returns:
各类别的概率分布
"""
# 加载模型
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-B/32", device=device)
# 准备图像和文本
image = preprocess(Image.open(image_path)).unsqueeze(0).to(device)
text_descriptions = [f"a photo of a {cat}" for cat in categories]
text_tokens = clip.tokenize(text_descriptions).to(device)
# 编码并计算相似度
with torch.no_grad():
image_features = model.encode_image(image)
text_features = model.encode_text(text_tokens)
# 归一化
image_features /= image_features.norm(dim=-1, keepdim=True)
text_features /= text_features.norm(dim=-1, keepdim=True)
# 计算余弦相似度并 softmax
similarity = (100.0 * image_features @ text_features.T).softmax(dim=-1)
# 输出结果
results = {}
for i, cat in enumerate(categories):
prob = similarity[0][i].item()
results[cat] = prob
print(f" {cat}: {prob:.2%}")
return results
# 使用示例
if __name__ == "__main__":
categories = ["cat", "dog", "bird", "car", "flower"]
results = zero_shot_classify("test_image.jpg", categories)
best = max(results, key=results.get)
print(f"\n预测结果: {best} (置信度: {results[best]:.2%})")
实践 2:使用 Hugging Face Transformers 进行视觉问答¶
Python
"""
使用 Hugging Face Transformers 加载 LLaVA 进行视觉问答
展示了从模型加载到推理的完整流程
依赖安装:pip install transformers torch Pillow
"""
from transformers import LlavaNextProcessor, LlavaNextForConditionalGeneration
from PIL import Image
import torch
def visual_qa(image_path: str, question: str) -> str:
"""
使用 LLaVA-NeXT 进行视觉问答
Args:
image_path: 图像文件路径
question: 自然语言问题
Returns:
模型的回答
"""
# 加载模型和处理器
model_id = "llava-hf/llava-v1.6-mistral-7b-hf"
processor = LlavaNextProcessor.from_pretrained(model_id)
model = LlavaNextForConditionalGeneration.from_pretrained(
model_id,
torch_dtype=torch.float16,
device_map="auto" # 自动分配 GPU/CPU
)
# 准备输入
image = Image.open(image_path)
prompt = f"[INST] <image>\n{question} [/INST]"
inputs = processor(prompt, image, return_tensors="pt").to(model.device)
# 生成回答
output = model.generate(
**inputs,
max_new_tokens=256,
temperature=0.2,
do_sample=False
)
# 解码输出(跳过输入部分)
answer = processor.decode(output[0], skip_special_tokens=True)
# 提取模型回答部分
answer = answer.split("[/INST]")[-1].strip()
return answer
# 使用示例
if __name__ == "__main__":
answer = visual_qa("example.jpg", "What objects are visible in this image?")
print(f"回答: {answer}")
实践 3:构建多模态指令数据集¶
Python
"""
构建多模态指令跟随数据集
用于 VLM 的指令微调(Instruction Tuning)
数据格式遵循 LLaVA 训练数据规范
"""
import json
from pathlib import Path
def create_multimodal_dataset(output_path: str = "multimodal_data.json"):
"""
创建多模态指令跟随数据集
数据格式:
- 每条数据包含图像路径和多轮对话
- 对话格式遵循 LLaVA 规范
"""
data = [
{
"id": "001",
"image": "images/001.jpg",
"conversations": [
{
"from": "human",
"value": "<image>\n请描述这张图片中的主要内容"
},
{
"from": "gpt",
"value": "图片中有一只橘色的猫坐在蓝色的沙发上,"
"旁边有一个绿色的靠垫。猫看起来很放松,"
"眼睛半闭,似乎在享受午后的阳光。"
}
]
},
{
"id": "002",
"image": "images/002.jpg",
"conversations": [
{
"from": "human",
"value": "<image>\n这张图片中有哪些安全隐患?"
},
{
"from": "gpt",
"value": "我注意到以下安全隐患:\n"
"1. 电线散落在地面上,可能导致绊倒\n"
"2. 桌上的热水杯靠近边缘,有倾倒风险\n"
"3. 窗户没有防护栏,对儿童存在危险"
}
]
},
]
# 保存为 JSON
output = Path(output_path)
output.write_text(json.dumps(data, indent=2, ensure_ascii=False), encoding="utf-8")
print(f"数据集已保存到 {output_path},共 {len(data)} 条数据")
return data
if __name__ == "__main__":
dataset = create_multimodal_dataset()
# 统计信息
total_conversations = sum(len(item["conversations"]) for item in dataset)
print(f"总对话轮数: {total_conversations}")
print(f"平均每条数据对话轮数: {total_conversations / len(dataset):.1f}")
9. 面试常见问题¶
Q1: CLIP 的对比学习为什么有效?温度参数有什么作用?¶
Text Only
答:
CLIP 的对比学习有效的原因:
1. 大规模数据(4 亿图文对)提供了丰富的负样本
2. InfoNCE 损失天然支持多分类对比
3. 双编码器结构使推理高效(预计算特征)
温度参数 τ 的作用:
- τ 控制 softmax 分布的尖锐程度
- τ 小:更关注 hard negative,但训练不稳定
- τ 大:训练稳定,但区分度降低
- CLIP 将 τ 设为可学习参数,自动寻找最优值
Q2: LLaVA 的两阶段训练为什么有效?能否跳过第一阶段?¶
Text Only
答:
两阶段训练有效的原因:
1. 阶段 1(特征对齐):让视觉特征适配 LLM 输入空间
- 只训练投影层,成本低(~1 小时)
- 相当于教 LLM "看懂"图像
2. 阶段 2(指令微调):教会模型遵循指令
- 训练投影层 + LLM,提升对话能力
- 相当于教模型 "回答问题"
不能跳过第一阶段:
- 直接训练会导致视觉特征和语言空间不匹配
- LLM 无法理解输入的视觉 Token
- 训练不稳定,容易发散
Q3: VLM 和 VLA 的核心区别是什么?VLA 有哪些独特挑战?¶
Text Only
答:
核心区别:
- VLM 输出文本,VLA 输出动作指令
- VLM 是开环(一次性输出),VLA 是闭环(观测→决策→执行→反馈)
- VLA 需要实时性(毫秒级控制),VLM 通常秒级响应
VLA 的独特挑战:
1. 数据稀缺:机器人轨迹数据远少于图文对
2. 安全性:错误动作可能导致物理损坏
3. 实时性:需要毫秒级推理延迟
4. 泛化性:从训练环境迁移到新环境困难
5. 多任务:同一模型需处理不同机器人和任务
Q4: 如何评估多模态模型的幻觉问题?¶
Text Only
答:
多模态幻觉的主要类型:
1. 描述了图像中不存在的物体
2. 错误描述了物体的属性(颜色、数量、位置)
评估方法:
1. CHAIR (Caption Hallucination Assessment for Image Description)
- 计算描述中包含的幻觉物体比例
2. POPE (Polling-based Object Probing Evaluation)
- 询问模型图像中是否存在特定物体
3. LLaVA-Bench / MMHal-Bench
- 专门的多模态幻觉评测基准
缓解方法:
- 使用更精确的指令微调数据
- 引入对象级别的监督信号
- 后处理验证(用检测器验证描述中的物体)
10. 下一步¶
完成本节后,你应该:
- 理解多模态的核心价值和架构演进路径
- 掌握视觉编码器(ViT 等)的原理和变体
- 理解对比学习和模态对齐技术(CLIP 核心)
- 了解主要的多模态预训练任务(ITC, ITM, MLM, LM)
- 熟悉代表性模型(CLIP, LLaVA, BLIP-2, GPT 系列, Gemini)
- 理解 VLM 与 VLA 的关键区别和应用场景
- 能够使用开源模型进行零样本分类和视觉问答
下一步:02-智能体系统 — 学习如何让大模型使用工具、进行规划和决策
📝 本章练习¶
🤔 思考题¶
- 模态对齐:CLIP 为什么选择对比学习(Contrastive Learning)而非生成式方法来对齐图像和文本?对比学习的局限性是什么?
- 视觉编码器:ViT 和 CNN 在图像特征提取上各有什么优劣?为什么现代多模态模型(如 LLaVA)选择 ViT 而非 CNN?
- LLaVA 架构:LLaVA 中的投影层(Projection Layer)有哪些设计选择?线性投影 vs MLP 投影对性能有什么影响?
- VLM vs VLA:视觉语言模型(VLM)和视觉语言行动模型(VLA)的核心区别是什么?VLA 的典型应用场景有哪些?
- 多模态评估:评估多模态模型的挑战有哪些?为什么文本评测的基准不能直接迁移到多模态领域?
💻 代码实践¶
- 入门:使用 CLIP 模型实现零样本图像分类,在 CIFAR-10 上测试准确率
- 进阶:用 LLaVA 对一组图片进行视觉问答,对比不同问题类型的回答质量
- 高级:实现一个简单的图文检索系统:用 CLIP 编码图片库和文本查询,计算相似度排序
💡 参考答案
#### 思考题参考答案 **1. 模态对齐** CLIP 选择对比学习的原因: - **效率**:对比学习只需区分正负对,不需要生成完整的目标文本,训练效率高 - **规模**:4 亿图文对的数据规模下,对比学习比生成式方法更容易扩展 - **对齐质量**:InfoNCE 损失直接优化图文嵌入空间的相似度,语义对齐效果好 局限性: - **细粒度不足**:对比学习只保证图文整体语义相似,不保证词-区域级别的精确对齐 - **负样本依赖**:Batch 内负样本数量影响对比学习效果 - **无法生成**:CLIP 只能做检索和分类,不能生成图像描述 **2. ViT vs CNN** | 维度 | ViT | CNN | |------|-----|-----| | 全局信息 | 自注意力天然捕获全局关系 | 需要深层网络才能获得大感受野 | | 归纳偏置 | 弱(数据驱动学习空间关系) | 强(平移不变性、局部性) | | 数据需求 | 大量数据时表现优异 | 小数据也能表现不错 | | Patch 处理 | 将图像切分为固定大小 Patch | 逐层提取特征 | | 与 LLM 兼容 | 输出序列格式天然兼容 Transformer | 需要额外适配 | 现代多模态模型选择 ViT 的原因:与 LLM 的 Transformer 架构天然兼容,且在大规模数据预训练后性能超越 CNN。 **3. LLaVA 投影层** - **线性投影**:`W ∈ R^(d_visual × d_llm)`,简单高效,参数少 - **MLP 投影**:两层或多层全连接 + GELU,表达能力更强 - **Q-Former(BLIP-2)**:使用可学习 Query 从视觉编码器中提取固定数量的 Token 性能影响:MLP 投影通常比线性投影效果好 2-5%(在 MMBench 等基准上),但参数量增加。实践中两层的 MLP 是较好的平衡点。 **4. VLM vs VLA** - **VLM(视觉语言模型)**:理解图像内容并生成文本描述/回答。典型:LLaVA、GPT-4V - **VLA(视觉语言行动模型)**:不仅理解图像,还能输出具体的行动指令(如机器人控制信号)。典型:RT-2、Octo VLA 应用场景:机器人操作、自动驾驶决策、工业自动化、具身智能。 **5. 多模态评估挑战** - **缺乏统一基准**:不同能力(OCR、图表理解、空间推理)需要不同评测 - **主观性**:图像描述质量难以自动评估 - **多维度**:需同时评估视觉理解和语言生成 - **幻觉问题**:模型可能"看到"图片中不存在的内容 - **基准覆盖**:现有基准(VQAv2、GQA、TextVQA、MathVista)各有侧重,难以全面评估 #### 代码实践参考答案 **实践 1:CLIP 零样本分类**Python
**实践 2:LLaVA 视觉问答** import torch
from PIL import Image
from transformers import CLIPProcessor, CLIPModel
from torchvision.datasets import CIFAR10
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
# CIFAR-10 类别名
class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',
'dog', 'frog', 'horse', 'ship', 'truck']
text_inputs = [f"a photo of a {name}" for name in class_names]
dataset = CIFAR10(root="./data", train=False, download=True)
correct = 0
total = 500 # 测试前 500 张
for i in range(total):
image = Image.fromarray(dataset.data[i])
inputs = processor(text=text_inputs, images=image, return_tensors="pt", padding=True)
with torch.no_grad():
outputs = model(**inputs)
pred = outputs.logits_per_image.argmax(dim=1).item()
if class_names[pred] == class_names[dataset.targets[i]]:
correct += 1
print(f"CLIP 零样本准确率: {correct/total:.2%}")
Python
**实践 3:图文检索系统** from transformers import LlavaNextProcessor, LlavaNextForConditionalGeneration
from PIL import Image
import requests
processor = LlavaNextProcessor.from_pretrained("llava-hf/llava-v1.6-mistral-7b-hf")
model = LlavaNextForConditionalGeneration.from_pretrained(
"llava-hf/llava-v1.6-mistral-7b-hf", torch_dtype=torch.float16, device_map="auto"
)
image = Image.open("test_image.jpg")
questions = [
"Describe this image in detail.",
"What objects can you identify?",
"What is the main activity happening here?"
]
for q in questions:
conversation = [{"role": "user", "content": [{"type": "image"}, {"type": "text", "text": q}]}]
prompt = processor.apply_chat_template(conversation, add_generation_prompt=True)
inputs = processor(images=image, text=prompt, return_tensors="pt").to(model.device)
output = model.generate(**inputs, max_new_tokens=256)
answer = processor.decode(output[0], skip_special_tokens=True)
print(f"Q: {q}\nA: {answer}\n")
Python
import torch
import numpy as np
from transformers import CLIPModel, CLIPProcessor
from PIL import Image
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
def build_image_index(image_paths):
"""构建图片嵌入索引"""
embeddings = []
for path in image_paths:
image = Image.open(path)
inputs = processor(images=image, return_tensors="pt")
with torch.no_grad():
emb = model.get_image_features(**inputs)
embeddings.append(emb / emb.norm(dim=-1, keepdim=True))
return torch.cat(embeddings)
def search(query_text, image_index, image_paths, top_k=5):
"""文本查询检索图片"""
inputs = processor(text=query_text, return_tensors="pt")
with torch.no_grad():
text_emb = model.get_text_features(**inputs)
text_emb = text_emb / text_emb.norm(dim=-1, keepdim=True)
similarities = (text_emb @ image_index.T).squeeze(0)
top_indices = similarities.argsort(descending=True)[:top_k]
results = [(image_paths[i], similarities[i].item()) for i in top_indices]
for path, score in results:
print(f" [{score:.3f}] {path}")
return results
# 使用示例
# image_paths = ["img1.jpg", "img2.jpg", ...]
# index = build_image_index(image_paths)
# search("a cat sitting on a sofa", index, image_paths)
最后更新日期:2026-04-21 适用版本:LLM 学习教程 v2026.04
审查记录: - 2026-04-20: 全面重写 — 修复重复编号(两个 7.2),完善代码示例为可运行版本,新增 BLIP-2 模型详解,新增面试常见问题章节,新增文档理解和 MathVista 等评估基准,深化 VLA 内容,更新 2025-2026 最新进展 - 2026-03-26: 优化重复内容,新增多图像推理,更新视频理解内容,补充最新模型进展