【多模态实战系列·第 03 篇】LLaVA:视觉指令微调·多模态对话·视觉 LLM——多模态的“ChatGPT 时刻“
【多模态实战系列·第 03 篇】LLaVA:视觉指令微调·多模态对话·视觉 LLM——多模态的"ChatGPT 时刻"
系列回顾:第 01 篇 CLIP 定义了图文对齐的基本范式,第 02 篇 BLIP-2 用 Q-Former 高效桥接视觉与语言。但 BLIP-2 有一个根本局限:它不是对话模型——它只能做 VQA(视觉问答)和 Captioning(图像描述),不能像 ChatGPT 一样进行多轮对话、遵循复杂指令、进行视觉推理。2023 年,威斯康星大学麦迪逊分校的 Liu 等人发表了LLaVA(Large Language-and-Vision Assistant),用最简洁的架构实现了多模态对话:冻结 CLIP ViT + 2 层 MLP 投影 + 微调 LLM。LLaVA 的核心创新不是架构(它比 BLIP-2 更简单),而是视觉指令微调(Visual Instruction Tuning)——用 GPT-4 生成多模态指令数据,让 LLM 学会"看图对话"。LLaVA 证明了:数据质量 > 模型架构——用 15 万条高质量指令数据微调 7B LLM,就能在多模态推理任务上接近 GPT-4V 的水平。LLaVA 之后,LLaVA-1.5、LLaVA-NeXT、LLaVA-OneVision 持续演进,定义了开源多模态 LLM 的范式。InternVL、Qwen-VL、PhiVision 等模型都受其影响。今天,我们从架构设计、视觉指令微调到能力与影响,彻底掌握 LLaVA。
📑 文章目录
- 🏗️ 一、架构设计:ViT + MLP + LLM 三段式
- 📐 二、视觉指令微调:用 GPT-4 教 LLM 看图
- 🎯 三、能力、演进与影响:从 LLaVA 到开源多模态生态
🏗️ 一、架构设计:ViT + MLP + LLM 三段式
1.1 最简洁的多模态对话架构
LLaVA 的架构可以用三个词概括:ViT + MLP + LLM。没有 Q-Former 的信息瓶颈,没有 Cross-Attention 的复杂交互——LLaVA 用最直接的方式连接视觉和语言。
图像 ──→ CLIP ViT(冻结) ──→ Patch特征 ──→ MLP投影(训练) ──→ 视觉Token ──→ LLM(微调) ──→ 文本回答 ↑ 文本指令 ──→ Tokenizer ──→ 文本Token ────────────────────────────────────────────────┘视觉编码器(CLIP ViT):直接复用 CLIP 的 ViT-L/14(336×336 输入),完全冻结。ViT 将图像切分为 14×14 的 Patch,经过 Transformer 编码后输出 576 个 Patch 特征向量(24×24 网格),每个向量维度 1024。
投影层(2 层 MLP):这是 LLaVA 架构中最关键也最简洁的部分——一个 2 层 MLP,将 ViT 输出的 1024 维 Patch 特征映射到 LLM 的嵌入维度(如 4096 维)。MLP 用 GELU 激活函数,中间层维度与输入维度一致。投影后的每个 Patch 特征就是一个"视觉 Token"——LLM 把它当作普通文本 Token 一样处理。
语言模型(LLM):LLaVA 使用 Vicuna(基于 LLaMA 微调的对话模型)作为 LLM。视觉 Token 和文本 Token 拼接后一起输入 LLM,LLM 自回归地生成回答。
1.2 为什么 MLP 投影就够了?
BLIP-2 用了复杂的 Q-Former(188M 参数)来桥接视觉和语言,LLaVA 只用了 2 层 MLP(~20M 参数)——为什么更简单的架构反而效果更好?
关键差异在于训练策略:BLIP-2 冻结 LLM,只训练 Q-Former——所以 Q-Former 必须承担"翻译"的全部责任,需要足够复杂。LLaVA 微调 LLM——LLM 自己学会了理解视觉 Token,投影层只需要做简单的维度映射。
BLIP-2: ViT → Q-Former(翻译) → 冻结LLM(只读) LLaVA: ViT → MLP(映射) → 微调LLM(自己学理解)这就像学外语:BLIP-2 是"同声传译"模式(Q-Former 翻译给 LLM 听),LLaVA 是"沉浸式学习"模式(LLM 自己学会看图)。后者更自然,也更强大。
1.3 视觉 Token 的处理
LLaVA-1.5 使用 CLIP ViT-L/14@336,输出 24×24=576 个 Patch 特征。这些特征经过 MLP 投影后,变成 576 个视觉 Token,和文本 Token 拼接:
输入序列: [视觉Token_1, 视觉Token_2, ..., 视觉Token_576, 文本Token_1, 文本Token_2, ...]576 个视觉 Token 占据了相当大的序列长度(LLM 上下文窗口 2048 中占 28%),但 LLaVA-1.5 没有做压缩——每个 Patch 都保留了。LLaVA-NeXT 引入了动态池化(Pooling),将 576 个 Token 压缩为更少的数量,在保持性能的同时降低计算成本。
1.4 LLaVA 架构演进
| 版本 | 视觉编码器 | 投影层 | LLM | 分辨率 | 关键改进 |
|---|---|---|---|---|---|
| LLaVA-1.5 | CLIP ViT-L/14 | 2层MLP | Vicuna-7B/13B | 336×336 | 基础版 |
| LLaVA-NeXT | CLIP ViT-L/14 | MLP+动态池化 | LLaMA-8B/70B | 336~672 | AnyRes高分辨率 |
| LLaVA-OneVision | SigLIP ViT-SO400M | MLP+AnyRes | Qwen2-7B/72B | 任意 | 视频+多图+单图统一 |
📐 二、视觉指令微调:用 GPT-4 教 LLM 看图
2.1 核心创新:视觉指令数据
LLaVA 最大的贡献不是架构,而是**视觉指令微调(Visual Instruction Tuning)**的范式——用 GPT-4 生成多模态指令数据,让 LLM 学会看图对话。
在 LLaVA 之前,多模态模型的训练数据主要是"图像-文本对"(如 COCO Captions)——模型学会了描述图像,但不会回答问题、遵循指令、进行推理。LLaVA 的洞察是:要让模型学会对话,就必须用对话数据训练。
2.2 用 GPT-4 生成指令数据
LLaVA 的指令数据构建流程极其巧妙——用 GPT-4 作为"教师",生成多模态对话数据:
输入:一张图像 + 图像的文本描述(来自 COCO Captions 等)
Prompt 模板:将图像描述和精心设计的 Prompt 模板组合,让 GPT-4 生成多种类型的指令数据:
给定一张图片的描述:{caption} 请生成以下类型的对话: 1. 对话型(Conversation):关于图片内容的问答 2. 详细描述(Detail):对图片的详细描述 3. 复杂推理(Complex):需要逻辑推理的问题输出:GPT-4 生成三类指令数据:
| 类型 | 数量 | 示例 |
|---|---|---|
| 对话型 | 58K | Q: “图片里有什么?” A: “图片中有一只橘猫坐在沙发上…” |
| 详细描述 | 23K | Q: “描述这张图片的细节” A: “这张图片展示了一个阳光明媚的下午…” |
| 复杂推理 | 47K | Q: “为什么这个人要打伞?” A: “从图片中可以看到天空阴沉且正在下雨…” |
LLaVA-1.5 的数据扩展:LLaVA-1.5 将指令数据从 15 万扩展到 66.5 万,增加了 OCR、图表、文档、代码等领域的指令数据,大幅提升了模型的通用性。
2.3 两阶段训练
LLaVA 的训练分为两个阶段,与 BLIP-2 类似但更简洁:
Stage 1:特征对齐预训练
- 目标:让 MLP 投影层学会把视觉特征映射到 LLM 的语言空间
- 训练组件:只训练 MLP 投影层,冻结 ViT 和 LLM
- 数据:595K 图文对(CC3M + COCO + SBU + VG)
- 训练方式:图像描述任务——给定图像,生成描述文本
- 训练成本:8×A100 约 1-2 小时
# Stage 1: 只训练投影层model.vision_tower.requires_grad_(False)# 冻结ViTmodel.llm.requires_grad_(False)# 冻结LLMmodel.mm_projector.requires_grad_(True)# 训练MLPStage 2:视觉指令微调
- 目标:让 LLM 学会看图对话、遵循指令、进行推理
- 训练组件:训练 MLP 投影层 + LLM,冻结 ViT
- 数据:150K(LLaVA-1.5 扩展到 665K)视觉指令数据
- 训练方式:多模态对话任务——给定图像+指令,生成回答
- 训练成本:8×A100 约 20-40 小时
# Stage 2: 训练投影层+LLMmodel.vision_tower.requires_grad_(False)# 冻结ViTmodel.llm.requires_grad_(True)# 微调LLMmodel.mm_projector.requires_grad_(True)# 训练MLP2.4 为什么两阶段有效?
Stage 1 的作用:MLP 投影层是随机初始化的——如果直接用指令数据训练,LLM 会收到"噪声"视觉 Token,学不到有用的东西。Stage 1 先用大量图文对让 MLP 学会基本的视觉-语言映射,确保视觉 Token 对 LLM 来说"可理解"。
Stage 2 的作用:MLP 已经能产生"可理解"的视觉 Token 后,LLM 开始学习如何利用这些视觉信息来回答问题、遵循指令。指令数据的质量和多样性决定了模型的上限。
2.5 代码实战:LLaVA 推理
fromtransformersimportLlavaNextProcessor,LlavaNextForConditionalGenerationfromPILimportImageimporttorch# 加载模型和处理器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("example.jpg")# 构造输入conversation=[{"role":"user","content":[{"type":"image"},{"type":"text","text":"请描述这张图片中的场景,并分析可能发生的事情。"},],},]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=512)answer=processor.decode(output[0],skip_special_tokens=True)print(answer)🎯 三、能力、演进与影响:从 LLaVA 到开源多模态生态
3.1 LLaVA 的核心能力
LLaVA 在多模态推理任务上展现了强大的能力,接近 GPT-4V 的水平:
视觉理解:图像描述、目标识别、OCR、图表理解。LLaVA 可以准确描述图像内容,识别图中的物体和文字,解读图表数据。
视觉推理:逻辑推理、数学推理、代码生成、常识推理。LLaVA 不仅能"看到"图像内容,还能"理解"并"推理"——比如看到一个人在雨中打伞,能推理出"因为下雨"。
多轮对话:LLaVA 支持多轮对话,可以追问细节、修正理解、深入分析。这是 BLIP-2 等非对话模型无法做到的。
3.2 性能对比
| 基准 | LLaVA-1.5 7B | LLaVA-1.5 13B | LLaVA-NeXT 72B | GPT-4V |
|---|---|---|---|---|
| MME(感知) | 1510 | 1530 | 1630 | 1920 |
| MMBench | 64.3 | 67.7 | 83.3 | 88.2 |
| SEED-Bench | 58.6 | 61.6 | 76.0 | 81.2 |
| MM-Vet | 31.1 | 36.1 | 63.8 | 76.2 |
| ScienceQA | 66.8 | 71.6 | 86.3 | 88.9 |
| TextVQA | 58.2 | 61.3 | 82.0 | 78.0 |
LLaVA-NeXT 72B 在多个基准上接近 GPT-4V,证明了开源多模态 LLM 的可行性。
3.3 LLaVA 演进路线
LLaVA-1.5(2023.10):基础版——ViT-L/14 + 2层MLP + Vicuna-7B/13B,336×336 分辨率,665K 指令数据。定义了 ViT+MLP+LLM 的基本范式。
LLaVA-NeXT(2024.1):高分辨率版——引入 AnyRes 机制,支持 336×336 到 672×672 的动态分辨率。AnyRes 将高分辨率图像切分为多个 336×336 的子图,分别编码后拼接。同时引入 LoRA 微调 LLM,降低训练成本。支持 LLaMA-8B/70B。
LLaVA-OneVision(2024.9):统一版——用 SigLIP 替代 CLIP ViT,支持任意分辨率输入。最重要的改进是统一了单图、多图、视频三种输入——同一个模型可以处理一张图片、多张图片、或一段视频。基于 Qwen2-7B/72B。
3.4 LLaVA 的影响:定义开源多模态 LLM 范式
LLaVA 的影响力远超它本身的性能——它定义了开源多模态 LLM 的范式:
架构范式:ViT + 投影层 + LLM 成为标准架构。InternVL、Qwen-VL、PhiVision、Idefics、MiniGPT-4 都采用了类似的架构。
训练范式:视觉指令微调成为标配。用 GPT-4V 生成指令数据、两阶段训练(对齐+指令微调)成为多模态 LLM 的标准训练流程。
数据范式:LLaVA-CC665K 指令数据集被广泛使用和扩展。数据质量 > 数据量成为共识。
评估范式:MMBench、MM-Vet、MME 等基准成为多模态 LLM 的标准评估集。
3.5 LLaVA 的局限
幻觉问题:LLaVA 有时会"看到"图中不存在的东西——比如图中没有猫,但模型说"图中有一只猫"。这是多模态 LLM 的通病,源于 LLM 的"语言先验"——LLM 倾向于生成语言上合理但视觉上不存在的内容。
细粒度理解不足:对于需要精确空间理解的任务(如计数、定位),LLaVA 的表现仍有不足。576 个 Patch Token 可能丢失了细粒度的空间信息。
高分辨率计算成本:LLaVA-NeXT 的 AnyRes 机制虽然支持高分辨率,但计算成本随分辨率平方增长——4 倍分辨率意味着 16 倍计算量。
视频理解有限:LLaVA-1.5 和 LLaVA-NeXT 对视频的理解有限,LLaVA-OneVision 才原生支持视频,但效果仍有提升空间。
多模态实战系列进度
| 篇号 | 主题 | 核心内容 | 状态 |
|---|---|---|---|
| 01 | CLIP原理 | 对比学习/双编码器/零样本迁移 | ✅ |
| 02 | BLIP-2 | Q-Former/视觉-语言桥接/高效预训练 | ✅ |
| 03 | LLaVA(本文) | 视觉指令微调/多模态对话/视觉LLM | ✅ |
| 04 | 图文对齐 | 对齐方法演进/从全局到区域 | ⏳ 下一篇 |
| 05 | 多模态RAG | 图文混合检索/知识增强 | 待写 |
| 06 | 视频理解 | 时序+空间/长视频/视频QA | 待写 |
| 07 | 音频理解 | 语音+声音/多模态融合 | 待写 |
| 08 | 工业应用 | 落地实战/端侧部署/业务集成 | 待写 |
一句话总结
LLaVA 三大维度:架构设计(ViT+MLP+LLM三段式——冻结CLIP ViT提取576个Patch特征/2层MLP投影映射到LLM嵌入空间/微调Vicuna/LLaMA处理视觉+文本Token。vs BLIP-2=LLaVA更简洁但微调LLM所以更强。视觉Token=576个Patch特征经MLP投影后作为LLM输入。LLaVA的核心=用最简洁的架构实现多模态对话)、视觉指令微调(用GPT-4生成指令数据——对话型58K/详细描述23K/复杂推理47K。两阶段训练——Stage1特征对齐只训练MLP 595K图文对/Stage2指令微调训练MLP+LLM 150K-665K指令数据。数据质量>模型架构——用15万条高质量指令数据微调7B LLM接近GPT-4V水平。LLaVA的训练哲学=先对齐再指令数据质量决定上限)、能力与影响(视觉理解+视觉推理+多轮对话。LLaVA-1.5→LLaVA-NeXT→LLaVA-OneVision持续演进。定义开源多模态LLM范式——ViT+投影+LLM架构/视觉指令微调/数据质量优先。局限=幻觉/细粒度不足/高分辨率成本/视频有限。LLaVA的历史地位=多模态的ChatGPT时刻让多模态对话从研究走向实用)。
参考链接:
- Visual Instruction Tuning (LLaVA) - NeurIPS 2023
- Improved Baselines with Visual Instruction Tuning (LLaVA-1.5)
- LLaVA-NeXT: Improved Reasoning on High-Resolution Images
- LLaVA-OneVision
- LLaVA GitHub
