VLM 算法知识与面经汇总
面向 2025-2026 年 Vision-Language Model 方向求职者的全面复习指南
一、VLM 核心知识体系
1.1 视觉编码器 (Visual Encoder)
Vision Transformer (ViT)
- 将图像切分为固定大小的 patch(通常 14×14 或 16×16 像素)
- 每个 patch 通过线性投影得到一个 token embedding
- 添加位置编码(positional embedding)保留空间信息
- 经过标准 Transformer Encoder 层(Self-Attention + FFN)
- 输出:一组 patch 特征向量(如 224×224 图像 + 14×14 patch = 256 个 token)
CLIP Visual Encoder
- 在 400M+ 图文对上通过对比学习训练
- 使用 ViT-L/14 架构(304M 参数)
- Softmax-based InfoNCE Loss:对 batch 中 N 个图文对构建 N×N 相似度矩阵
- 生成与语言语义对齐的视觉特征
SigLIP (Sigmoid Loss for Image-Language Pre-training)
核心区别
用 sigmoid 二分类 loss 替代 softmax 对比 loss。每对图文独立判断是否匹配,无需全局归一化。对 batch size 不敏感,分布式训练更友好。
典型架构:SigLIP-SO400M/14。使用模型:PaLI-X, Gemini, LLaVA-1.6+, InternVL2
EVA-CLIP
- 两阶段:先用 Masked Image Modeling (MIM) 预训练 ViT,再做 CLIP 对比学习
- EVA-02 使用 RoPE + SwiGLU FFN
- 使用模型:Qwen-VL (EVA-CLIP-14B), InternVL (InternViT-6B)
1.2 VLM 主流架构
| 架构类型 | 代表模型 | Visual Token 开销 | LLM 修改 | 优劣势 |
|---|---|---|---|---|
| Cross-Attention | Flamingo, Otter | 无(独立通道) | 新增 Cross-Attn 层 | 模块化;不占上下文长度 / 复杂度高 |
| Decoder-Only + Tokens | LLaVA, Qwen-VL, InternVL | 是(占上下文) | 无 | 简单高效;2024-2025 主流 / Token 占序列 |
| Encoder-Decoder | PaLI, CoCa | 编码器输出 | 完整 E-D 结构 | 完整架构 / 不够灵活 |
Decoder-Only + Visual Tokens(主流方案)
[BOS] [IMG_1] [IMG_2] ... [IMG_256] [User query tokens] [Response tokens]
视觉特征投影到 LLM embedding 空间后与文本 token 拼接,由标准 decoder-only transformer 统一处理。
1.3 视觉-语言对齐 (Visual-Language Alignment)
连接器模块 (Connector/Projector)
| 模块 | 机制 | 输出 Token 数 | 代表模型 |
|---|---|---|---|
| Linear Projection | 单层线性映射 | 与 ViT 输出相同 | LLaVA v1 |
| MLP Projector | 2层 MLP + GELU | 与 ViT 输出相同 | LLaVA-1.5, LLaVA-NeXT |
| Q-Former | 32 可学习 query + 交叉注意力 | 固定 32 | BLIP-2, InstructBLIP |
| Perceiver Resampler | latent tokens + 交叉注意力 | 固定 64/128 | Flamingo, Idefics |
| C-Abstractor | 卷积 + 注意力压缩 | 可配置 | Honeybee |
| Spatial Merge | 相邻 2×2 token 合并 | 1/4 输入 | Qwen2-VL |
关键结论 (LLaVA-1.5)
当视觉编码器和 LLM 都足够强时,简单的 MLP projector 即可达到最优效果。过度设计的连接器(如 Q-Former)可能形成信息瓶颈。
1.4 训练阶段 (Training Stages)
| 阶段 | 目标 | 数据 | 可训练模块 |
|---|---|---|---|
| Stage 1: 预训练 | 跨模态对齐 | 大规模图文对 (CC3M, LAION) | 仅 Connector |
| Stage 2: 指令微调 | 多模态指令跟随 | 高质量指令数据 (665K) | Connector + LLM |
| Stage 3: RLHF/DPO | 减少幻觉,提升对齐 | 偏好对数据 | 全模型 |
| Stage 4: 高分辨率适配 | 细粒度视觉理解 | 文档/图表/高分辨率数据 | 可能解冻 ViT |
1.5 分辨率处理 (Resolution Handling)
Dynamic Tiling / AnyRes(主流方案)
Native Dynamic Resolution (Qwen2-VL)
- 使用 2D-RoPE 替代绝对位置编码 → 天然支持任意分辨率
- Spatial Merge (2×2→1):减少 4× token 数
- 无需 tiling,更优雅
1.6 Mixture-of-Experts (MoE) 在 VLM 中的应用
核心思想
用多个"专家"FFN 替代单个 dense FFN,路由器为每个 token 选择 top-k 专家。只有被选中的专家参与计算 → 大容量 + 低计算量。
| 模型 | 总参数 | 激活参数 | 效果 |
|---|---|---|---|
| Qwen3-VL-30B-A3B | 30B | 3B | 媲美 10B+ 密集模型 |
| Qwen3-VL-235B-A22B | 235B | 22B | 前沿水平 |
| DeepSeek-VL2 | 27B (MoE) | ~5B | 竞争力强 |
二、2025-2026 最新进展
2.1 重要模型发布
闭源模型
| 模型 | 时间 | 关键特性 |
|---|---|---|
| GPT-4o | 2024.05 | 原生多模态,统一文本/图像/音频 |
| o3 / o4-mini | 2025.04 | 多模态推理,"看图思考" CoT |
| GPT-5 | 2025.08 | 400K 上下文,MMMU 79.1% |
| GPT-5.5 | 2026.04 | 1M 上下文,首个"完全推理"模型 |
| Gemini 2.5 Pro | 2025.03 | 内置 thinking,MMMU-Pro 领先 |
| Gemini 3 Pro | 2026.03 | 像素精准定位,10FPS 视频分析 |
开源模型
| 模型 | 时间 | 关键创新 |
|---|---|---|
| Qwen2.5-VL | 2025.01 | 原生动态分辨率 ViT,Dynamic FPS |
| Qwen3-VL | 2025.10 | Interleaved-MRoPE, DeepStack, MoE |
| InternVL3 | 2025 | RL 训练管线,MMMU 72.2% |
| InternVL3.5 | 2025 | Cascade RL (MPO+GSPO),MMMU 77.7% |
| DeepSeek-VL2 | 2024.12 | MoE backbone,动态 tiling |
| LLaVA-OneVision | 2024.08 | 统一图像/视频/多图理解 |
| SmolVLM | 2025 | 2B SOTA 小模型 |
2.2 架构创新
原生多模态 vs 模块化
- 模块化(主流):ViT + Connector + LLM — 利用预训练组件
- 原生(新兴):从 raw token 级别统一训练 — Gemini, Chameleon, Emu3.5
- NaViL (ICCV 2025) 发现:原生模型在适当 scaling 下效率更高
- M-RoPE → Interleaved-MRoPE:分离/交错时空维度的位置编码
- DeepStack (Qwen3-VL):视觉特征深度集成到 LLM 各层
- Cascade RL (InternVL3.5):离线 MPO + 在线 GSPO
- Visual Token 压缩:Dynamic-VLM (ICCV 2025) 减少 50-75% token
2.3 训练范式变化
VLM 强化学习(最大范式转变)
- GRPO for VLMs:扩展 DeepSeek GRPO 到多模态(InternVL3, Qwen3-VL)
- DPO for VLMs:Direct Preference Optimization 应用于视觉语言任务
- OPA-DPO (CVPR 2025):Object-presence-aware DPO 针对幻觉
Thinking / Test-Time Compute
- "Thinking" 变体成为标准:Qwen3-VL-Thinking, Gemini 2.5 Pro, o3/o4
- Temporal Chain of Thought (NeurIPS 2025):逐帧推理长视频
多模态 Scaling Laws
MoE scaling 更高效:N ∝ C0.36 (MoE) vs C0.53 (Dense)
视觉编码器比 LLM 更快饱和。最优 ViT 大小与 LLM backbone 呈对数线性关系。
2.4 Benchmark 趋势
MMMU (截至 2026.05)
| 模型 | 分数 | 类型 |
|---|---|---|
| o4-mini High | 79.2% | 闭源 |
| GPT-5 | 79.1% | 闭源 |
| Qwen3.5-122B-A10B | 78.1% | 开源 |
| Qwen3-VL-32B-Thinking | 78.1% | 开源 |
| InternVL3.5-78B | 77.7% | 开源 |
关键趋势
- 开源与闭源差距缩小至 1-2%
- "Thinking" 变体持续优于非 thinking 版本
- MoE 以更少激活参数达到前沿性能
2.5 新兴研究方向
| 方向 | 关键进展 |
|---|---|
| 长视频理解 | Agentic 选择性关注、Temporal CoT、Dynamic FPS |
| 3D/空间推理 | GR3D (CVPR 2026)、Gemini 3 Pro 像素精准定位 |
| 具身智能 | VLA 模型、VLM 作为机器人感知骨干 |
| Agent VLM | GUI Agent、Computer Use、视觉 grounding + RL |
| 长上下文视觉 | 256K→400K→1M tokens |
| VLM 可解释性 | Circuit Tracing (CVPR 2026) |
三、面试高频问答
Q1: CLIP 和 SigLIP 的核心区别?
| 维度 | CLIP | SigLIP |
|---|---|---|
| Loss | Softmax InfoNCE (N-way 分类) | Sigmoid 二分类 (per-pair) |
| Batch 依赖 | 需要大 batch (32K+) | 小 batch 也可 |
| 分布式训练 | 需 all-gather 全局 softmax | 无需跨设备通信 |
| 内存 | O(N²) 相似度矩阵 | O(N) per-pair |
| 稳定性 | τ 敏感 | 更稳定 |
# CLIP Loss
logits = image_embeds @ text_embeds.T * exp(log_temperature) # NxN
labels = torch.arange(N)
loss = (F.cross_entropy(logits, labels) + F.cross_entropy(logits.T, labels)) / 2
# SigLIP Loss
logits = image_embeds @ text_embeds.T * exp(log_temperature) + bias
labels = 2 * torch.eye(N) - 1 # +1 匹配, -1 不匹配
loss = -F.logsigmoid(labels * logits).sum() / N
Q2: LLaVA 训练流水线详解
| 版本 | 架构 | 关键改进 |
|---|---|---|
| LLaVA-1.0 | CLIP-ViT-L/14 → Linear → Vicuna | 开创性 visual instruction tuning |
| LLaVA-1.5 | CLIP@336px → 2-layer MLP → Vicuna-1.5 | MLP > 复杂 connector;加入 VQA 数据 |
| LLaVA-NeXT | AnyRes tiling + 更强 LLM | 动态高分辨率 + 1.2M 数据 |
| LLaVA-OneVision | SigLIP-SO400M + Qwen2 | 统一 image/video/multi-image |
核心 Takeaway
LLaVA 的成功证明:简单 MLP + 高质量数据 可以打败复杂架构设计。这是"less is more"的有力证据。
Q3: Visual Connector 的作用?为什么 MLP 就够了?
三个核心功能:维度对齐 (ViT dim → LLM dim)、模态桥接、Token 压缩(可选)
为什么简单 MLP 就够:当 ViT 和 LLM 都是强预训练模型时,projector 只需做"翻译"。Q-Former 等复杂设计可能因 query 数量不足而成为信息瓶颈。对需要细粒度空间理解的任务 (OCR, grounding),保留全部 token 的 MLP 更优。
Q4: VLM 如何处理高分辨率图像?
核心挑战: ViT 注意力 O(n²),分辨率翻倍则 patch 数翻 4 倍。
# Dynamic Tiling (AnyRes) - 主流方案
def tile_image(image, base_res=336, max_tiles=12):
cols, rows = find_best_grid(W, H, base_res, max_tiles)
resized = resize(image, (rows*base_res, cols*base_res))
tiles = split_into_grid(resized, cols, rows)
thumbnail = resize(image, (base_res, base_res))
return tiles + [thumbnail] # 每个独立编码后拼接
Qwen2-VL 方案:2D-RoPE + Spatial Merge (2×2→1),无需 tiling。
Q5: Visual Grounding 如何实现?
# 主流方法:坐标 Token 化
User: 图中的狗在哪里?
Model: <box>(234, 156, 567, 489)</box>
# 坐标归一化到 [0, 1000],LLM 自回归生成
训练数据:RefCOCO, Visual Genome。挑战:坐标幻觉、多相似物体歧义。
Q6: MoE 如何应用于 VLM?
Input Token → Router → Top-K 专家 → 加权求和
核心优势:3-7× 参数只用 1.5-2× 计算。VLM 特有挑战:视觉 token 导致负载不均衡、需要模态平衡的辅助 loss。
Q7: 视频理解的核心挑战?
| 挑战 | 原因 |
|---|---|
| 时序建模 | ViT 处理静态图像,缺乏时间归纳偏置 |
| Token 爆炸 | 30fps × 10s = 300帧 × 256 = 76,800 tokens |
| 时序推理弱 | 排序、因果、持续时间估计仍困难 |
方案:均匀采样、关键帧选择、时序池化、Dynamic FPS (Qwen2.5-VL)、分层编码。长视频前沿:Agentic 方法 + Temporal CoT。
Q8: VLM 的 RLHF/DPO 与纯文本有何不同?
VLM 特有挑战
- 视觉幻觉是核心失败模式,比文本错误更难检测
- 偏好数据成本 高 3-5×(标注员需对照图像判断)
- Reward Model 需要视觉能力(纯文本 RM 无法判断视觉忠实性)
- 粒度问题:回答可能部分正确(物体对但关系错)
最新方法:OPA-DPO, S2H-DPO, RA-DPO, POVID
Q9: 如何减少 VLM 幻觉?
| 阶段 | 方法 |
|---|---|
| 训练时 | 高质量数据、负样本、对比训练、DPO/RLHF、Grounding 监督 |
| 推理时 | Contrastive Decoding (VCD)、OPERA、DoLa、CoT、Self-verify |
| 架构层 | 高分辨率、保留空间 token、多尺度特征 |
# Contrastive Decoding 核心思想
logits_final = logits_with_image - α * logits_without_image
# 惩罚不看图也能生成的 token(文本先验偏置)
Q10: 设计多模态 RAG 系统
关键点:ColPali/ColQwen per-patch 检索、混合检索 scoring、强制引用来源减少幻觉。
Q11: 如何高效部署 VLM?
| 优化方向 | 方法 |
|---|---|
| Visual Encoding | Embedding 缓存、Batch 编码、Tile 并行 |
| KV-Cache | PagedAttention (vLLM)、推理 Token 剪枝 (FastV) |
| 模型优化 | INT4/INT8 量化 (GPTQ, AWQ)、Flash Attention |
| Serving | vLLM、SGLang (RadixAttention)、TensorRT-LLM |
| 成本优化 | 路由策略 (简单→7B, 复杂→70B+)、自适应分辨率 |
四、代码实现题
4.1 实现 Visual Projector
import torch
import torch.nn as nn
class MLPProjector(nn.Module):
"""LLaVA-style 2-layer MLP projector."""
def __init__(self, visual_dim: int, llm_dim: int, hidden_dim: int = None):
super().__init__()
hidden_dim = hidden_dim or llm_dim
self.projector = nn.Sequential(
nn.Linear(visual_dim, hidden_dim),
nn.GELU(),
nn.Linear(hidden_dim, llm_dim),
)
def forward(self, visual_features: torch.Tensor) -> torch.Tensor:
# (batch, num_patches, visual_dim) → (batch, num_patches, llm_dim)
return self.projector(visual_features)
class PerceiverResampler(nn.Module):
"""Flamingo-style: 变长视觉特征 → 固定 num_latents 个 token"""
def __init__(self, visual_dim, llm_dim, num_latents=64, num_heads=16, num_layers=6):
super().__init__()
self.latents = nn.Parameter(torch.randn(num_latents, llm_dim) * 0.02)
self.input_proj = nn.Linear(visual_dim, llm_dim)
self.layers = nn.ModuleList([
PerceiverLayer(llm_dim, num_heads) for _ in range(num_layers)
])
self.norm = nn.LayerNorm(llm_dim)
def forward(self, visual_features):
B = visual_features.shape[0]
x = self.input_proj(visual_features)
latents = self.latents.unsqueeze(0).expand(B, -1, -1)
for layer in self.layers:
latents = layer(latents, x)
return self.norm(latents)
class PerceiverLayer(nn.Module):
def __init__(self, dim, num_heads):
super().__init__()
self.self_attn = nn.MultiheadAttention(dim, num_heads, batch_first=True)
self.cross_attn = nn.MultiheadAttention(dim, num_heads, batch_first=True)
self.ffn = nn.Sequential(nn.Linear(dim, dim*4), nn.GELU(), nn.Linear(dim*4, dim))
self.norm1 = nn.LayerNorm(dim)
self.norm2 = nn.LayerNorm(dim)
self.norm3 = nn.LayerNorm(dim)
def forward(self, latents, context):
x = self.norm1(latents)
latents = latents + self.self_attn(x, x, x)[0]
x = self.norm2(latents)
latents = latents + self.cross_attn(x, context, context)[0]
latents = latents + self.ffn(self.norm3(latents))
return latents
4.2 交错图文输入的 Attention Mask
import torch
from typing import List
def create_interleaved_attention_mask(
seq_len: int,
image_regions: List[tuple], # [(start, end), ...]
dtype=torch.float32,
) -> torch.Tensor:
"""
规则:
1. 整体 causal mask(每个 token 只能看前面的)
2. 同一图像内 token 双向注意
3. 不同图像 token 不能直接注意
"""
# 标准下三角 causal mask
causal = torch.tril(torch.ones(seq_len, seq_len, dtype=torch.bool))
# 同一图像内允许双向注意
for start, end in image_regions:
causal[start:end, start:end] = True
# 转为 float: 0=可注意, -inf=mask
mask = torch.zeros(seq_len, seq_len, dtype=dtype)
mask.masked_fill_(~causal, float('-inf'))
return mask.unsqueeze(0).unsqueeze(0) # (1, 1, seq_len, seq_len)
# 使用示例:
# 序列: [text:10] [image_0:256] [text:15] [image_1:256] [text:20]
mask = create_interleaved_attention_mask(557, [(10, 266), (281, 537)])
4.3 图像 Tiling(高分辨率输入)
import torch
import torch.nn.functional as F
import math
def find_best_grid(width, height, base_res=336, max_tiles=12):
"""找到最匹配宽高比的网格配置"""
aspect = width / height
best_grid, best_score = (1, 1), float('inf')
for total in range(1, max_tiles + 1):
for cols in range(1, total + 1):
rows = total // cols
if rows * cols != total or rows == 0:
continue
score = abs(math.log(cols/rows) - math.log(aspect)) + 0.01 * total
if score < best_score:
best_score = score
best_grid = (cols, rows)
return best_grid
def tile_image(image: torch.Tensor, base_res=336, max_tiles=12):
"""
Args: image (C, H, W)
Returns: tiles (N+1, C, base_res, base_res), grid (cols, rows)
"""
C, H, W = image.shape
cols, rows = find_best_grid(W, H, base_res, max_tiles)
# Resize to fit grid
resized = F.interpolate(
image.unsqueeze(0), (rows*base_res, cols*base_res),
mode='bicubic', align_corners=False
).squeeze(0)
# Split into tiles
tiles = []
for r in range(rows):
for c in range(cols):
tiles.append(resized[:, r*base_res:(r+1)*base_res, c*base_res:(c+1)*base_res])
# Thumbnail (全局视图)
thumb = F.interpolate(image.unsqueeze(0), (base_res, base_res),
mode='bicubic', align_corners=False).squeeze(0)
tiles.append(thumb)
return torch.stack(tiles), (cols, rows)
# Example
image = torch.randn(3, 1920, 1080)
tiles, grid = tile_image(image)
print(f"Grid: {grid[0]}×{grid[1]}, Total tiles: {tiles.shape[0]}")
# Grid: 3×5, Total tiles: 16 (15 tiles + 1 thumbnail)
五、必知论文清单
| 论文 | 核心贡献 | 年份 |
|---|---|---|
| LLaVA | 开创性 visual instruction tuning | 2023 |
| LLaVA-1.5 | MLP > 复杂 connector 的实证 | 2023 |
| BLIP-2 | Q-Former 连接器设计 | 2023 |
| LLaVA-NeXT | AnyRes 动态分辨率 | 2024 |
| InternVL 2/2.5 | 6B ViT, progressive training | 2024 |
| Qwen2-VL | Native Dynamic Resolution + M-RoPE | 2024 |
| LLaVA-OneVision | 统一 image/video/multi-image | 2024 |
| Cambrian-1 | Connector 消融, 多编码器 | 2024 |
| DeepSeek-VL2 | MoE + VLM | 2024 |
| Qwen3-VL | Interleaved-MRoPE, DeepStack | 2025 |
| InternVL3.5 | Cascade RL, MMMU 77.7% | 2025 |
| OPA-DPO (CVPR 2025) | 针对幻觉的对齐方法 | 2025 |
| NaViL (ICCV 2025) | Native MLLM Scaling Laws | 2025 |
| GR3D (CVPR 2026) | 3D Spatial VLM | 2026 |
六、面试准备要点总结
八大核心知识点
- 架构:ViT-Connector-LLM vs 原生多模态,MoE 应用
- 动态分辨率:Tiling (AnyRes)、Native Resolution (2D-RoPE)、Token 压缩
- 训练:多阶段 PT→SFT→RL,GRPO/DPO for VLM,Thinking 变体
- Scaling:ViT 比 LLM 更快饱和,MoE 比 Dense 更高效
- 推理+视觉:o 系列 "thinking with images" 范式
- 效率:Token 压缩、MoE、小模型 (SmolVLM, Moondream) 是部署关键
- Agent + 具身:VLM as GUI Agent / 机器人感知骨干
- 开源追平闭源:MMMU 差距仅 1-2%