跳转至

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 Google 小时级视频理解,原生多模态推理
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)

Text Only
目标:学习图像和文本的联合表示
输入:图像-文本对
输出:相似度分数
损失:InfoNCE / 对称交叉熵损失

任务 2:图像-文本匹配(ITM, Image-Text Matching)

Text Only
目标:判断图像和文本是否语义匹配
输入:图像 + 文本
输出:二分类(匹配 / 不匹配)

实现:
  [图像特征] ──┐
               ├──> [跨模态融合] ──> [二分类器]
  [文本特征] ──┘

任务 3:掩码语言建模(MLM, Masked Language Modeling)

Text Only
目标:根据图像上下文预测被掩码的文本词
输入:图像 + 部分掩码的文本
输出:预测被掩码的词

示例:
  图像:[一只猫在沙发上]
  文本:"一只 [MASK] 在沙发上"
  预测:[MASK] = "猫"

关键:结合视觉信息辅助文本预测(比纯文本 MLM 更强)

任务 4:图像条件语言建模(LM, Language Modeling)

Text Only
目标:根据图像生成描述文本
输入:图像
输出:图像描述(自回归生成)

概率模型:
  P(y_t | y_1, ..., y_{t-1}, image)

这是最接近实际应用的预训练任务

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 Google 原生多模态预训练,多尺度版本
Qwen2.5-VL 阿里巴巴 中英双语,文档理解强
InternVL3 上海 AI Lab 开源大规模,学术友好

VLA 代表模型

模型 机构 特点
RT-2 Google DeepMind 视觉-语言-动作统一模型,泛化能力强
PaLM-E Google 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)

Text Only
输入:图像
输出:描述文本

典型应用:
- 辅助视障人士(实时场景描述)
- 图像检索(自动生成标签)
- 内容审核(自动描述 + 审核)
- 社交媒体(自动生成图片说明)

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-智能体系统 — 学习如何让大模型使用工具、进行规划和决策


📝 本章练习

🤔 思考题

  1. 模态对齐:CLIP 为什么选择对比学习(Contrastive Learning)而非生成式方法来对齐图像和文本?对比学习的局限性是什么?
  2. 视觉编码器:ViT 和 CNN 在图像特征提取上各有什么优劣?为什么现代多模态模型(如 LLaVA)选择 ViT 而非 CNN?
  3. LLaVA 架构:LLaVA 中的投影层(Projection Layer)有哪些设计选择?线性投影 vs MLP 投影对性能有什么影响?
  4. VLM vs VLA:视觉语言模型(VLM)和视觉语言行动模型(VLA)的核心区别是什么?VLA 的典型应用场景有哪些?
  5. 多模态评估:评估多模态模型的挑战有哪些?为什么文本评测的基准不能直接迁移到多模态领域?

💻 代码实践

  1. 入门:使用 CLIP 模型实现零样本图像分类,在 CIFAR-10 上测试准确率
  2. 进阶:用 LLaVA 对一组图片进行视觉问答,对比不同问题类型的回答质量
  3. 高级:实现一个简单的图文检索系统:用 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
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%}")
**实践 2:LLaVA 视觉问答**
Python
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")
**实践 3:图文检索系统**
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: 优化重复内容,新增多图像推理,更新视频理解内容,补充最新模型进展