跳转至

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 学习"将视觉特征翻译成语言模型能理解的形式"。

training_template = """
{image_placeholder}
USER: {question}
ASSISTANT: {caption}"""

为什么只训 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