跳转至

01 - 多模态大模型

⚠️ 时效性说明:本章涉及前沿模型/价格/榜单等信息,可能随版本快速变化;请以论文原文、官方发布页和 API 文档为准。

学习目标:深入理解多模态大模型的原理、架构和应用,掌握视觉-语言模型的核心技术。


1. 为什么需要多模态

1.1 人类认知的多模态本质

人类通过多种感官理解世界: - 视觉:看到物体的形状、颜色、场景 - 语言:描述、交流、推理 - 听觉:声音、音乐、语音 - 触觉:质地、温度、力度

关键洞察:真正的智能需要整合多种模态的信息。

1.2 单模态的局限性

Text Only
纯文本模型:
- 无法直接理解图像内容
- 需要复杂的文字描述才能"看到"
- 空间关系理解困难

纯视觉模型:
- 缺乏语义理解
- 无法推理和解释
- 难以进行复杂决策

1.3 多模态的优势

Text Only
1. 信息互补
   - 图像提供细节,文本提供抽象
   - 结合后理解更全面

2. 跨模态推理
   - "图中的人在做什么?"
   - "这段描述对应哪张图?"

3. 更自然的交互
   - 看图说话
   - 根据描述画图
   - 视觉问答

2. 多模态模型架构演进

2.1 架构演进时间线

Text Only
2019: ViLBERT / LXMERT (双塔结构)
2020: CLIP / ALIGN (对比学习)
2021: DALL-E / VQGAN (图像生成)
2022: Flamingo (上下文学习)
2023: GPT-4V / LLaVA / Qwen-VL (统一架构)
2024: Gemini / GPT-4o (原生多模态)

2.2 主要架构类型

类型 1 :双编码器( Dual Encoder )

Text Only
图像编码器          文本编码器
    ↓                  ↓
  [ViT]             [BERT]
    ↓                  ↓
 图像特征           文本特征
    ↓                  ↓
    └──── 对比学习 ────┘

代表:CLIP, ALIGN

特点:
- 分别编码,然后对齐
- 适合检索任务
- 推理效率高
- 不适合生成任务

类型 2 :融合编码器( Fusion Encoder )

Text Only
图像编码器          文本编码器
    ↓                  ↓
  [ViT]             [BERT]
    ↓                  ↓
    └──── 交叉注意力 ──┘
        融合特征
        [Transformer]
        输出

代表:ViLBERT, LXMERT

特点:
- 早期/中期融合
- 适合理解任务
- 计算量大

类型 3 :编码器-解码器( Encoder-Decoder )

Text Only
图像编码器
  [ViT/CNN]
 图像特征 ──────┐
文本编码器   [交叉注意力]
    ↓           ↓
 [BERT]      [解码器]
    └───────────┘
              输出

代表:BLIP, SimVLM

特点:
- 编码器理解输入
- 解码器生成输出
- 适合图像描述等生成任务

类型 4 :统一生成模型( Unified Generative Model )

Text Only
统一的Transformer架构
[模态无关的Token序列]
[图像Token | 文本Token | 音频Token]
    [Transformer]
[统一的输出空间]

代表:GPT-4o, Gemini, Chameleon

特点:
- 所有模态统一表示
- 原生多模态能力
- 可以任意模态输入输出
- 架构最简洁

3. 核心技术详解

3.1 视觉编码器

Vision Transformer (ViT)

Text Only
# ViT核心思想:将图像视为序列

图像 (H × W × C)
[Patch Embedding]  # 将图像切分为patches
[Flatten + Linear]  # 每个patch映射为向量
[Add CLS Token]     # 添加分类token
[Add Position Embedding]  # 添加位置信息
[Transformer Encoder] × N
特征表示

关键参数:
- Patch size: 16×16 或 14×14
- 对于224×224图像:
  - 16×16 patch → (224/16)² = 196个patch
  - 序列长度 = 196 + 1 (CLS) = 197

视觉编码器的变体

Text Only
1. ViT (Google, 2020)
   - 标准Transformer用于视觉
   - 需要大规模预训练

2. Swin Transformer (Microsoft, 2021)
   - 层次化结构
   -  shifted window注意力
   - 更适合检测/分割

3. ConvNeXt (Meta, 2022)
   - 纯CNN架构现代化
   - 性能媲美ViT

4. EVA-CLIP (BAAI, 2023)
   - 基于CLIP的视觉编码器
   - 强大的零样本能力

3.2 模态对齐技术

对比学习( Contrastive Learning )

Python
# CLIP的核心:对比学习

# 图像-文本对
images: [I1, I2, I3, ..., In]
texts:  [T1, T2, T3, ..., Tn]

# 编码
image_features = image_encoder(images)  # [n, d]
text_features = text_encoder(texts)      # [n, d]

# 归一化
image_features = normalize(image_features)
text_features = normalize(text_features)

# 计算相似度矩阵
logits = image_features @ text_features.T  # [n, n]
# 对角线是正样本,非对角线是负样本

# 对称损失
loss_i2t = cross_entropy(logits, labels)  # 图像→文本
loss_t2i = cross_entropy(logits.T, labels)  # 文本→图像
loss = (loss_i2t + loss_t2i) / 2

对比学习的直觉

Text Only
目标:让匹配的图像-文本对特征接近
       让不匹配的图像-文本对特征远离

温度参数τ:
- τ小:分布更尖锐, harder negative mining
- τ大:分布更平滑,训练更稳定

特征空间对齐

Text Only
方法1:线性投影
  图像特征 ──[Linear]──> 共享空间
  文本特征 ──[Linear]──> 共享空间

方法2:非线性投影
  图像特征 ──[MLP]──> 共享空间
  文本特征 ──[MLP]──> 共享空间

方法3:查询机制
  图像特征 ──[Query]──┐
                      ├──> 共享空间
  文本特征 ──[Key/Value]┘

3.3 视觉-语言预训练任务

任务 1 :图像-文本对比( ITC )

Text Only
目标:学习图像和文本的联合表示

输入:图像-文本对
输出:相似度分数

损失:对比损失

任务 2 :图像-文本匹配( ITM )

Text Only
目标:判断图像和文本是否匹配

输入:图像 + 文本
输出:二分类(匹配/不匹配)

实现:
  [图像特征] ──┐
               ├──> [Fusion] ──> [分类器]
  [文本特征] ──┘

任务 3 :掩码语言建模( MLM )

Text Only
目标:根据图像上下文预测被掩码的文本词

输入:图像 + 部分掩码的文本
输出:预测被掩码的词

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

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

Text Only
目标:生成描述图像的文本

输入:图像
输出:图像描述

实现:自回归生成
  P(yt | y1, ..., yt-1, image)

3.4 指令微调( Instruction Tuning )

为什么需要指令微调

Text Only
预训练模型:
- 学会了图像-文本关联
- 但不知道如何回答具体问题

指令微调:
- 教会模型遵循指令
- 学会问答格式
- 提升实用性

指令格式

JSON
{
  "instruction": "描述这张图片中的内容",
  "input": "<image>",
  "output": "图片中有一只橘色的猫坐在蓝色的沙发上,旁边有一个绿色的靠垫。"
}

{
  "instruction": "图中的人在做什么?",
  "input": "<image>",
  "output": "图中的人正在跑步,他穿着红色运动服,在公园的小路上。"
}

{
  "instruction": "这张图片可能是在哪个季节拍摄的?",
  "input": "<image>",
  "output": "这张图片可能是在秋天拍摄的,因为树叶呈现出金黄色和橙色。"
}

4. 代表性模型详解

4.1 CLIP (OpenAI, 2021)

核心创新

Text Only
1. 大规模对比学习
   - 4亿图像-文本对
   - 从互联网收集

2. 零样本分类
   - 不需要训练数据
   - 文本描述作为类别

3. 强大的迁移能力
   - 视觉编码器可用于下游任务

架构细节

Python
# 图像编码器选择
image_encoder = ResNet-50/101  # 或 ViT-B/32, ViT-B/16, ViT-L/14

# 文本编码器
text_encoder = Transformer  # 63M参数,12层,512维,8头

# 训练
batch_size = 32,768  # 超大batch
learning_rate = 5e-4
temperature = 0.07   # 可学习

零样本分类示例

Python
# 类别描述
texts = [
    "a photo of a dog",
    "a photo of a cat",
    "a photo of a bird"
]

# 编码
text_features = clip.encode_text(texts)
image_features = clip.encode_image(image)

# 计算相似度
similarities = image_features @ text_features.T

# 预测
predicted_class = argmax(similarities)

4.2 LLaVA (Microsoft, 2023)

架构

Text Only
图像编码器 (CLIP ViT-L/14)
投影层 (MLP)
LLM (Vicuna/Llama)
文本输出

特点:
- 简单高效
- 端到端训练
- 强大的指令跟随能力

训练流程

Text Only
阶段1:特征对齐预训练
  - 冻结视觉编码器和LLM
  - 只训练投影层
  - 数据:CC3M等图像-文本对
  - 目标:让视觉特征适配LLM

阶段2:端到端微调
  - 冻结视觉编码器
  - 训练投影层和LLM
  - 数据:指令跟随数据
  - 目标:学会多轮对话

4.3 GPT-4V / GPT-4o (OpenAI, 2023-2024)

技术特点

Text Only
1. 原生多模态
   - 不是拼接的模块
   - 统一架构处理所有模态

2. 强大的推理能力
   - 数学问题求解
   - 图表分析
   - 文档理解

3. 多模态上下文学习
   - 多图推理
   - 跨图比较

能力展示

Text Only
能力1:图像理解
  - 物体识别
  - 场景描述
  - 文字识别(OCR)

能力2:视觉推理
  - 数学问题(从图片)
  - 逻辑推理
  - 因果分析

能力3:多模态生成
  - GPT-4o支持语音/图像输出

4.4 Gemini (Google, 2023-2024)

技术架构

Text Only
原生多模态设计:
- 从预训练就是多模态
- 不是后期拼接

多尺度模型:
- Ultra: 最强能力
- Pro: 平衡性能
- Nano: 端侧部署

多语言支持:
- 100+语言

4.5 Qwen-VL (阿里巴巴, 2023)

特点

Text Only
1. 中英双语
   - 中文理解能力强
   - 中文场景优化

2. 检测框输出
   - 可以输出物体位置
   - 支持指代理解

3. 文档理解
   - 表格、图表
   - 多页文档

5. 多模态应用

5.1 图像描述( Image Captioning )

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

应用:
- 辅助视障人士
- 图像检索
- 内容审核

5.2 视觉问答( Visual Question Answering, VQA )

Text Only
输入:图像 + 问题
输出:答案

示例:
  Q: "图中有几个人?"
  A: "3个人"

  Q: "左边的人穿什么颜色?"
  A: "红色"

5.3 图文检索( Image-Text Retrieval )

Text Only
任务1:以图搜文
  输入:图像
  输出:相关文本描述

任务2:以文搜图
  输入:文本描述
  输出:相关图像

应用:搜索引擎、电商平台

5.4 指代表达理解( Referring Expression Comprehension )

Text Only
输入:图像 + 指代表达
输出:目标物体的边界框

示例:
  表达:"穿红色衣服的女孩"
  输出:[x, y, w, h]  # 边界框坐标

5.5 多模态对话

Text Only
用户:描述这张图片
模型:这是一张海滩照片,蓝天白云,有几个人在沙滩上玩耍。

用户:他们在做什么?
模型:他们似乎在打排球,周围还有一些人在晒太阳。

用户:天气看起来怎么样?
模型:天气看起来很好,阳光明媚,适合户外活动。

6. 评估与基准

6.1 主要基准测试

基准 任务类型 评估指标
COCO Captioning 图像描述 BLEU, METEOR, CIDEr, SPICE
VQA v2 视觉问答 准确率
GQA 组合式问答 准确率
Visual Genome 场景图生成 召回率、准确率
RefCOCO 指代表达 准确率( IoU )
MMBench 综合能力 准确率
MM-Vet 多任务 GPT-4 评估
SEED-Bench 多维度 准确率

6.2 评估挑战

Text Only
挑战1:主观性
  - 图像描述没有唯一正确答案
  - 需要语义相似度评估

挑战2:幻觉(Hallucination)
  - 模型生成不存在的内容
  - 需要专门检测方法

挑战3:细粒度理解
  - 小物体识别
  - 复杂关系理解

7. 前沿研究方向

7.1 视频理解

Text Only
挑战:
- 时序建模
- 长视频处理
- 计算效率

方法:
- 采样关键帧
- 时序注意力
- 视频-文本预训练

7.2 多模态大模型的效率优化

Text Only
方向1:模型压缩
  - 知识蒸馏
  - 量化
  - 剪枝

方向2:高效架构
  - 稀疏注意力
  - 状态空间模型
  - 混合专家

方向3:端侧部署
  - 移动端优化
  - NPU加速

7.3 世界模型( World Model )

Text Only
愿景:
- 理解物理世界
- 预测未来状态
- 支持规划和决策

技术路线:
- 结合视频生成
- 3D场景理解
- 具身智能

8. 动手实践

实践 1 :使用 CLIP 进行零样本分类

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)  # unsqueeze增加一个维度
texts = ["a photo of a cat", "a photo of a dog", "a photo of a bird"]
text_tokens = clip.tokenize(texts).to(device)  # .to(device)将数据移至GPU/CPU

# 编码
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)

# 输出结果
for i, text in enumerate(texts):  # enumerate同时获取索引和元素
    print(f"{text}: {similarity[0][i]:.2%}")

实践 2 :使用 LLaVA 进行视觉问答

Python
from llava.model.builder import load_pretrained_model
from llava.mm_utils import get_model_name_from_path
from llava.eval.run_llava import eval_model

# 加载模型
model_path = "liuhaotian/llava-v1.5-7b"
tokenizer, model, image_processor, context_len = load_pretrained_model(
    model_path=model_path,
    model_base=None,
    model_name=get_model_name_from_path(model_path)
)

# 准备输入
image_path = "example.jpg"
prompt = "What is in this image?"

# 推理
args = type('Args', (), {
    "model_path": model_path,
    "model_base": None,
    "model_name": get_model_name_from_path(model_path),
    "query": prompt,
    "conv_mode": None,
    "image_file": image_path,
    "sep": ",",
    "temperature": 0.2,
    "top_p": None,
    "num_beams": 1,
    "max_new_tokens": 512,
})()

eval_model(args)

实践 3 :构建自己的多模态数据集

Python
import json
from datasets import Dataset

# 创建指令跟随数据
data = [
    {
        "id": "001",
        "image": "images/001.jpg",
        "conversations": [
            {"from": "human", "value": "<image>\n描述这张图片"},
            {"from": "gpt", "value": "图片中有一只橘色的猫..."}
        ]
    },
    # ...
]

# 保存为JSON
with open("multimodal_data.json", "w") as f:  # with自动管理文件关闭
    json.dump(data, f, indent=2)

# 加载为HuggingFace Dataset
dataset = Dataset.from_json("multimodal_data.json")

9. 下一步

完成本节后,你应该: - [ ] 理解多模态的核心价值和架构演进 - [ ] 掌握视觉编码器( ViT 等)的原理 - [ ] 理解对比学习和模态对齐技术 - [ ] 了解主要的多模态预训练任务 - [ ] 熟悉代表性模型( CLIP, LLaVA, GPT-4V 等) - [ ] 能够使用开源模型进行视觉问答等任务

下一步02-智能体系统 - 学习如何让大模型使用工具、进行规划和决策


最后更新日期: 2026-02-12 适用版本: LLM 学习教程 v2026