跳转至

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)

Python
# 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