跳转至

VLM 架构选型:编码器、投影层、骨干网络

更新日期:2026-04-15


一、VLM 架构基本形态

flowchart LR
    img["Image"]
    venc["Vision Encoder<br/>(ViT/SigLIP/InternViT)"]
    proj["Projection<br/>(Linear/MLP/<br/>Q-Former/Perceiver)"]
    text["Text tokens"]
    llm["LLM Backbone<br/>(Qwen/Llama/Mistral)"]
    out["Output text"]

    img --> venc --> proj
    text --> llm
    proj --> llm --> out

    classDef stage fill:#fff,stroke:#cc785c,color:#1a1a1a;
    class img,venc,proj,text,llm,out stage

1.1 三大组件

组件 作用 主流选择
Vision Encoder 把图片编码成 patch latent ViT-L/14、SigLIP、InternViT、CLIP
Projection 把 visual latent 映射到 LLM 语义空间 Linear / MLP / Q-Former / Perceiver
LLM Backbone 文本 + 视觉 token 联合处理 Qwen2.5 / Llama 3 / Mistral

不同 VLM 的差异主要在三个组件的搭配训练阶段(freeze 哪个、何时解冻)。


二、视觉编码器深入

2.1 主流视觉编码器对比

编码器 参数 输入分辨率 训练目标 用例
CLIP ViT-L/14 304M 224² / 336² 图文对比学习 (LiT) LLaVA 1.5、早期 VLM
SigLIP-400M 400M 224² / 384² sigmoid 对比损失(比 softmax 快) LLaVA-NeXT、Qwen2-VL 起步版
SigLIP 2 400M-2B 256² / 384² / 1024² + 多语言 + 高分辨率 2024+ 主流
InternViT-300M 300M 448² 视觉对齐 + LLM 联合训练 InternVL 系列、MiniCPM-V
InternViT-6B 6B 448² 大规模图文对齐 InternVL2-Llama3-76B
DINOv2 1.1B 224²-518² 自监督(无文本) 视觉特征 / 检索
Eva-CLIP 18B 336² 大规模 CLIP LLaVA 1.6 等

2.2 视觉编码器选择原则

经验选择:


三、投影层深入

3.1 三种主流方案

flowchart LR
    p["Patch latent<br/>576 × d_v"]
    linear["Linear / MLP<br/>(1-2 层)"]
    qf["Q-Former<br/>(64 query token)"]
    perc["Perceiver<br/>(64-256 latent)"]

    p --> linear
    p --> qf
    p --> perc

    linear --> llm["→ LLM<br/>576 token"]
    qf --> llm2["→ LLM<br/>64 token"]
    perc --> llm3["→ LLM<br/>64-256 token"]

    classDef stage fill:#fff,stroke:#cc785c,color:#1a1a1a;
    class p,linear,qf,perc,llm,llm2,llm3 stage

3.2 对比

投影方案 代表 Token 数 计算成本 信息保留 训练难度
Linear / MLP LLaVA, Qwen2-VL 全保留(576+)
Q-Former BLIP-2, MiniGPT 固定(32-128) 中(信息瓶颈) 中(需 cross-attention 训练)
Perceiver Resampler Flamingo, IDEFICS 固定(64-256)

主流路线:Linear / MLP(信息无损)+ 想压缩时用 token pooling(2×2 pool 减 4×)。Q-Former 在 BLIP 时代流行但被 LLaVA-NeXT 等超越。

3.3 关键权衡:Token 数

以 336x336 图片、patch_size=14 为例:24x24 = 576 patches,每个 patch 对应一个 token。


四、LLM 骨干选择

4.1 常见 VLM 骨干配对

VLM 骨干 LLM 视觉 Encoder 投影
LLaVA-1.5 Vicuna 7B/13B CLIP ViT-L/14 MLP-2
LLaVA-NeXT Llama 3 8B/70B CLIP ViT-L/14 MLP-2 + AnyRes
Qwen2-VL Qwen 2 7B/72B DFN/SigLIP MLP + 2D-RoPE
InternVL 2 Llama 3 / InternLM2 InternViT-6B MLP
MiniCPM-V 2.6 Qwen2 7B SigLIP Resampler 64
Pixtral 12B Mistral 12B 自训 ViT MLP + 2D-RoPE
Llama 3.2 Vision Llama 3 11B/90B 自训 ViT Cross-attn
Cosmos-Reason1 Llama 3 56B NVIDIA Vid Encoder Custom

4.2 骨干大小与 VLM 上限

经验规律:VLM 的能力上限由 LLM 骨干决定。7B LLM 配任何编码器,都无法超越 GPT-4V 这种百亿级模型。


五、动态分辨率处理

问题:ViT 通常训练在固定分辨率 (224/336)。但真实图片大小各异,尤其文档/海报需要高分辨率才能 OCR。

5.1 AnyRes (LLaVA-NeXT)

def any_res(image, base_resolution=336, max_tiles=6):
    W, H = image.size
    # 找最优分割: grid (rows, cols) 使得总 tiles ≤ max_tiles
    best_grid = find_best_grid(W, H, base_resolution, max_tiles)
    # 例: 1344×672 → grid (4, 2) = 8 tiles 超限 → (2, 1) 或更小

    # 生成两种视图:
    # 1. 全局: resize 到 base × base → 1 个低分辨率 tile
    global_tile = resize(image, (base_resolution, base_resolution))

    # 2. 局部: 按 grid 切分 → 多个高分辨率 tiles
    local_tiles = [crop(image, r, c, base_resolution) 
                   for r in range(best_grid[0]) 
                   for c in range(best_grid[1])]

    return [global_tile] + local_tiles
    # 总 visual tokens = 576 × (1 + n_local_tiles)

5.2 Native Dynamic (Qwen2-VL)

# Qwen2-VL 更优雅: 直接让 ViT 处理任意尺寸
# 用 2D-RoPE 代替固定的绝对位置编码
# ViT 自然支持任意分辨率, 不需要 tiling

def qwen2vl_process(image):
    # 1. Smart resize: 保持宽高比, 对齐到 patch_size 的倍数
    H, W = smart_resize(image, min_pixels=2562828, max_pixels=12802828)
    image = resize(image, (H, W))

    # 2. Patch embedding
    patches = patch_embed(image)  # (H/14) × (W/14) patches

    # 3. 2D-RoPE 位置编码 (支持任意尺寸)
    positions_2d = make_2d_positions(H//14, W//14)
    patches = apply_2d_rope(patches, positions_2d)

    # 4. 2×2 pooling → 减少 4x tokens
    patches = pool_2x2(patches)

    return patches  # (H/28) × (W/28) tokens

5.3 对比

方案 代表 灵活性 Token 效率 训练难度 极端高分辨率
AnyRes (tiling) LLaVA-NeXT, MiniCPM-V 中(grid 离散) 中(多 tile 多 token) 限制(max_tiles)
Native Dynamic Qwen2-VL, Pixtral, Llama 3.2 高(任意尺寸) 高(pooling 减 4×) 中(需 2D-RoPE) 强(128k+ 视觉 token)
固定尺寸 LLaVA 1.5 不能

主流趋势:从 AnyRes(2024 SOTA)转向 Native Dynamic(Qwen2-VL 后),后者是 1M context VLM 的基础。


六、架构选型决策

flowchart TB
    start["要做 VLM"]
    q1{"目标用例"}
    q2{"算力 / 上下文"}

    start --> q1

    q1 -->|"OCR / 文档"| doc["SigLIP 2 + Qwen2-VL native dyn<br/>+ 长 context"]
    q1 -->|"通用图文 QA"| ga["SigLIP / InternViT + LLaVA-NeXT 范式"]
    q1 -->|"端侧 / 手机"| edge["MiniCPM-V SigLIP + Resampler 64<br/>(token 压到 64)"]
    q1 -->|"视频"| vid["SigLIP + 时序 RoPE<br/>(Qwen2.5-VL / InternVL Video)"]
    q1 -->|"机器人 / 具身"| robot["Cosmos-Reason / OpenVLA 风<br/>+ action head"]

    classDef stage fill:#fff,stroke:#cc785c,color:#1a1a1a;
    classDef decision fill:#f5f3eb,stroke:#bdb9ab,color:#1a1a1a;
    class start,doc,ga,edge,vid,robot stage
    class q1 decision

简化口诀:

  • 现成最强:Qwen2-VL 7B/72B(开源 + native dynamic)
  • 想自训 + 中文 OCR 强:InternVL 2 + InternViT
  • 端侧:MiniCPM-V 系列(结构最优)
  • 视频长:先看 Qwen2.5-VL(128k 上下文)

七、追问延伸

问题 方向 详见
视觉编码器要不要冻结? 阶段 1 冻结, 阶段 2-3 可解冻 F2
视频如何扩展 VLM? 帧采样 + 时序 RoPE F3
为什么不用 Diffusion 做视觉 encoder? Diffusion 擅长生成, 不擅长理解 F5
视觉 token 在 MoE 里怎么路由? 模态感知路由 A3

参考文献

  • [1] Dosovitskiy et al. ViT. 2020. 论文

  • [2] Radford et al. CLIP. 2021. 论文

  • [3] Zhai et al. SigLIP. 2023. 论文

  • [4] Oquab et al. DINOv2. 2023. 论文

  • [5] Liu et al. LLaVA (Visual Instruction Tuning). NeurIPS 2023. 论文

  • [6] Bai et al. Qwen2-VL. 2024. 论文

  • [7] Chen et al. InternVL. 2023. 论文

  • [8] Li et al. BLIP-2 (Q-Former). 2023. 论文

  • [9] Alayrac et al. Flamingo. 2022. 论文


上级 · F. 多模态 VLM