VLM 训练三阶段完整 Recipe¶
更新日期:2026-04-15
一、三阶段训练流程¶
flowchart LR
s1["Stage 1<br/>Feature Alignment<br/>仅训 Projector"]
s2["Stage 2<br/>Visual Pretraining<br/>解冻 + 大规模图文对"]
s3["Stage 3<br/>Visual SFT / RLHF<br/>指令对齐 + 偏好"]
s1 --> s2 --> s3
classDef stage fill:#fff,stroke:#cc785c,color:#1a1a1a;
class s1,s2,s3 stage
| 阶段 | 解冻参数 | 数据规模 | 数据类型 | 目标 |
|---|---|---|---|---|
| Stage 1 | 仅 Projector | ~1M 图文对 | LAION / CC3M caption | 投影空间对齐 |
| Stage 2 | Projector + LLM | 100M-1B+ 图文对 | 网络爬取 + OCR + Doc | 视觉知识灌注 |
| Stage 3 | 全部(lr 小) | ~100K-1M | 指令数据 + 多轮对话 | 指令遵循 + 安全 |
二、Stage 1: Feature Alignment(特征对齐)¶
2.1 目标¶
让 Projector 学会将视觉特征映射到 LLM 的 embedding 空间。
2.2 数据源¶
2.3 Stage 1 模板¶
输入格式: <image_tokens> + "\n" + "Describe the image in detail." + </response> + caption
训练 loss 只计算 caption 部分,视觉 token 的 loss 被 mask(不计算)。这样 projector 学习"将视觉特征翻译成语言模型能理解的形式"。
为什么只训 Projector? - LLM 已经是 SOTA,不需要改 - Vision Encoder 已经在 CLIP 等任务上预训练 - 缺的是两者之间的"翻译层"
三、Stage 2: Visual Instruction Tuning(视觉指令微调)¶
3.1 目标¶
让 VLM 学会根据图像回答各种指令(VQA、描述、推理、定位等)。
3.2 数据源¶
3.3 数据混合策略¶
# LLaVA-1.5 的经典配比 (665K 总样本)
mix = {
'llava_instruct_150k': 158k, # 23.7%
'sharegpt4v': 100k, # 15.0%
'vqav2': 83k, # 12.4%
'gqa': 72k, # 10.8%
'ocrvqa': 80k, # 12.0%
'textvqa': 22k, # 3.3%
'a_okvqa': 50k, # 7.5%
'refcoco': 48k, # 7.2%
'vg': 86k, # 13.0% (visual genome)
'dvqa/chartqa/...': ~30k, # 4.5%
'shareGPT (text-only)': 40k, # 6% 纯文本, 保持语言能力!
}
关键技巧:混入 5-10% 的纯文本指令数据,防止模型在视觉任务上过拟合导致语言能力退化。
3.4 训练模板¶
# 多轮视觉对话
template = """
{image}
USER: {question_1}
ASSISTANT: {answer_1}
USER: {question_2}
ASSISTANT: {answer_2}
"""
# 特殊 token:
# <image> 或 <vision_start>...<vision_end> 标记视觉区域
# Loss 只计算 assistant 部分
四、Stage 3: 高质量微调(可选)¶
4.1 目标¶
特定能力增强:OCR、Grounding、Long VQA、Math/Code understanding。
4.2 策略¶
4.3 Grounding 能力训练¶
# 让 VLM 学会输出 bounding box
# 训练数据: (image, "where is the dog?", [0.12, 0.34, 0.56, 0.78])
# 训练样本格式:
{
"image": "...",
"question": "Where is the red car in the image?",
"answer": "The red car is located at <box>0.25, 0.40, 0.55, 0.70</box>."
}
# 模型学会:
# 1. 理解空间描述 ("left", "top corner", etc.)
# 2. 输出精确坐标 (归一化到 [0,1])
# 3. 组合描述和坐标
# 进阶: 像素级分割 (LISA)
# 输出 <seg> token, 后接 segmentation head
五、视频 VLM 的特殊考虑¶
参考 F3 详细文档 视频 VLM 训练阶段: 视频数据来源: VideoChat2 / ActivityNet、WebVid-10M、InternVid、合成视频 caption
视频 token 处理:
-
8-16 帧均匀采样
-
每帧 576 tokens,总计 4600-9200 tokens
-
或用 pixel shuffle 压缩到 1200-2400 tokens
六、评测¶
6.1 标准 VLM Benchmarks¶
6.2 训练中的监控¶
# 每 1000 步运行一次轻量评估
light_evals = [
('MMBench-dev', 200), # 200 样本快速测
('TextVQA', 300), # OCR 能力
('RefCOCO', 200), # Grounding
('pure-text-MMLU', 100), # 语言能力没退化
]
七、LLaVA-1.5 精简 Recipe¶
最小可行方案,复现 VLM SOTA(在 7B 规模)。
# 硬件: 8× A100 80GB
# 时间: ~2 天
# Stage 1: Feature Alignment
stage1 = {
'vision_encoder': 'openai/clip-vit-large-patch14-336 (frozen)',
'llm': 'lmsys/vicuna-7b-v1.5 (frozen)',
'projector': 'MLP (trainable)',
'data': 'LLaVA-CC3M-Pretrain-595K',
'lr': 1e-3, 'epochs': 1, 'batch': 256,
'time': '~4 hours on 8×A100',
}
# Stage 2: Visual Instruction Tuning
stage2 = {
'vision_encoder': 'frozen',
'llm': 'trainable',
'projector': 'trainable',
'data': 'LLaVA-v1.5-mix665k',
'lr': 2e-5, 'epochs': 1, 'batch': 128,
'time': '~24 hours on 8×A100',
}
# Total: ~28 hours on 8×A100, <$500 cost
参考文献¶
-
[1] Liu et al. LLaVA (Visual Instruction Tuning). NeurIPS 2023. 论文
-
[2] Liu et al. LLaVA-1.5. 2023. 论文
-
[3] Liu et al. LLaVA-NeXT. 2024. 论文
-
[4] Bai et al. Qwen-VL. 2023. 论文
-
[5] Bai et al. Qwen2-VL. 2024. 论文
-
[6] Chen et al. InternVL. 2023. 论文
-
[7] Chen et al. ShareGPT4V. 2023. 论文
-
[8] LLaVA-1.5 训练代码
↑ 上级 · F. 多模态 VLM