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