01 - 多模态大模型¶
⚠️ 时效性说明:本章涉及前沿模型/价格/榜单等信息,可能随版本快速变化;请以论文原文、官方发布页和 API 文档为准。
学习目标:深入理解多模态大模型的原理、架构和应用,掌握视觉-语言模型的核心技术。
1. 为什么需要多模态?¶
1.1 人类认知的多模态本质¶
人类通过多种感官理解世界: - 视觉:看到物体的形状、颜色、场景 - 语言:描述、交流、推理 - 听觉:声音、音乐、语音 - 触觉:质地、温度、力度
关键洞察:真正的智能需要整合多种模态的信息。
1.2 单模态的局限性¶
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)¶
任务2:图像-文本匹配(ITM)¶
任务3:掩码语言建模(MLM)¶
Text Only
目标:根据图像上下文预测被掩码的文本词
输入:图像 + 部分掩码的文本
输出:预测被掩码的词
示例:
图像:[一只猫在沙发上]
文本:"一只[MASK]在沙发上"
预测:[MASK] = "猫"
任务4:图像条件语言建模(LM)¶
3.4 指令微调(Instruction Tuning)¶
为什么需要指令微调?¶
指令格式¶
JSON
{
"instruction": "描述这张图片中的内容",
"input": "<image>",
"output": "图片中有一只橘色的猫坐在蓝色的沙发上,旁边有一个绿色的靠垫。"
}
{
"instruction": "图中的人在做什么?",
"input": "<image>",
"output": "图中的人正在跑步,他穿着红色运动服,在公园的小路上。"
}
{
"instruction": "这张图片可能是在哪个季节拍摄的?",
"input": "<image>",
"output": "这张图片可能是在秋天拍摄的,因为树叶呈现出金黄色和橙色。"
}
4. 代表性模型详解¶
4.1 CLIP (OpenAI, 2021)¶
核心创新¶
架构细节¶
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)¶
特点¶
5. 多模态应用¶
5.1 图像描述(Image Captioning)¶
5.2 视觉问答(Visual Question Answering, VQA)¶
5.3 图文检索(Image-Text Retrieval)¶
5.4 指代表达理解(Referring Expression Comprehension)¶
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 视频理解¶
7.2 多模态大模型的效率优化¶
7.3 世界模型(World Model)¶
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