VLM 算法知识与面经汇总

面向 2025-2026 年 Vision-Language Model 方向求职者的全面复习指南

架构演进 训练范式 最新进展 面试问答 代码实现 系统设计

一、VLM 核心知识体系

1.1 视觉编码器 (Visual Encoder)

Vision Transformer (ViT)

CLIP Visual Encoder

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

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 Projector2层 MLP + GELU与 ViT 输出相同LLaVA-1.5, LLaVA-NeXT
Q-Former32 可学习 query + 交叉注意力固定 32BLIP-2, InstructBLIP
Perceiver Resamplerlatent tokens + 交叉注意力固定 64/128Flamingo, 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(主流方案)

输入: 1344×896 图像, tile_size=336 1. 确定最佳网格: 1344/336=4 列, 896/336≈3 行 → 4×3 网格 2. Resize 到 1344×1008 适配网格 3. 切分为 12 个 336×336 tiles 4. 创建 1 个 336×336 缩略图(全局视图) 5. 每个 tile + 缩略图独立编码 6. 拼接: 12 tiles + 1 thumbnail = 13 × 256 = 3328 visual tokens

Native Dynamic Resolution (Qwen2-VL)

1.6 Mixture-of-Experts (MoE) 在 VLM 中的应用

核心思想

用多个"专家"FFN 替代单个 dense FFN,路由器为每个 token 选择 top-k 专家。只有被选中的专家参与计算 → 大容量 + 低计算量

模型总参数激活参数效果
Qwen3-VL-30B-A3B30B3B媲美 10B+ 密集模型
Qwen3-VL-235B-A22B235B22B前沿水平
DeepSeek-VL227B (MoE)~5B竞争力强

二、2025-2026 最新进展

2.1 重要模型发布

闭源模型

模型时间关键特性
GPT-4o2024.05原生多模态,统一文本/图像/音频
o3 / o4-mini2025.04多模态推理,"看图思考" CoT
GPT-52025.08400K 上下文,MMMU 79.1%
GPT-5.52026.041M 上下文,首个"完全推理"模型
Gemini 2.5 Pro2025.03内置 thinking,MMMU-Pro 领先
Gemini 3 Pro2026.03像素精准定位,10FPS 视频分析

开源模型

模型时间关键创新
Qwen2.5-VL2025.01原生动态分辨率 ViT,Dynamic FPS
Qwen3-VL2025.10Interleaved-MRoPE, DeepStack, MoE
InternVL32025RL 训练管线,MMMU 72.2%
InternVL3.52025Cascade RL (MPO+GSPO),MMMU 77.7%
DeepSeek-VL22024.12MoE backbone,动态 tiling
LLaVA-OneVision2024.08统一图像/视频/多图理解
SmolVLM20252B SOTA 小模型

2.2 架构创新

原生多模态 vs 模块化

2.3 训练范式变化

VLM 强化学习(最大范式转变)

Thinking / Test-Time Compute

多模态 Scaling Laws

MoE scaling 更高效:N ∝ C0.36 (MoE) vs C0.53 (Dense)

视觉编码器比 LLM 更快饱和。最优 ViT 大小与 LLM backbone 呈对数线性关系。

2.4 Benchmark 趋势

MMMU (截至 2026.05)

模型分数类型
o4-mini High79.2%闭源
GPT-579.1%闭源
Qwen3.5-122B-A10B78.1%开源
Qwen3-VL-32B-Thinking78.1%开源
InternVL3.5-78B77.7%开源

关键趋势

2.5 新兴研究方向

方向关键进展
长视频理解Agentic 选择性关注、Temporal CoT、Dynamic FPS
3D/空间推理GR3D (CVPR 2026)、Gemini 3 Pro 像素精准定位
具身智能VLA 模型、VLM 作为机器人感知骨干
Agent VLMGUI Agent、Computer Use、视觉 grounding + RL
长上下文视觉256K→400K→1M tokens
VLM 可解释性Circuit Tracing (CVPR 2026)

三、面试高频问答

Q1: CLIP 和 SigLIP 的核心区别?

维度CLIPSigLIP
LossSoftmax 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.0CLIP-ViT-L/14 → Linear → Vicuna开创性 visual instruction tuning
LLaVA-1.5CLIP@336px → 2-layer MLP → Vicuna-1.5MLP > 复杂 connector;加入 VQA 数据
LLaVA-NeXTAnyRes tiling + 更强 LLM动态高分辨率 + 1.2M 数据
LLaVA-OneVisionSigLIP-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 特有挑战

最新方法: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 系统

┌─────────────────────────────────────┐ │ Query Processing │ │ 用户查询 → 查询分析 → 多模态编码 │ └──────────────┬──────────────────────┘ ↓ ┌─────────────────────────────────────┐ │ Multi-Modal Retrieval │ │ Text (BM25+Dense) + Visual (CLIP) │ │ → Hybrid Re-ranking │ └──────────────┬──────────────────────┘ ↓ ┌─────────────────────────────────────┐ │ Context Assembly │ │ 检索文本 + 图像 + 元数据 │ └──────────────┬──────────────────────┘ ↓ ┌─────────────────────────────────────┐ │ VLM Generation │ │ 多模态上下文 → VLM → 带引用的回答 │ └─────────────────────────────────────┘

关键点:ColPali/ColQwen per-patch 检索、混合检索 scoring、强制引用来源减少幻觉。

Q11: 如何高效部署 VLM?

优化方向方法
Visual EncodingEmbedding 缓存、Batch 编码、Tile 并行
KV-CachePagedAttention (vLLM)、推理 Token 剪枝 (FastV)
模型优化INT4/INT8 量化 (GPTQ, AWQ)、Flash Attention
ServingvLLM、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 tuning2023
LLaVA-1.5MLP > 复杂 connector 的实证2023
BLIP-2Q-Former 连接器设计2023
LLaVA-NeXTAnyRes 动态分辨率2024
InternVL 2/2.56B ViT, progressive training2024
Qwen2-VLNative Dynamic Resolution + M-RoPE2024
LLaVA-OneVision统一 image/video/multi-image2024
Cambrian-1Connector 消融, 多编码器2024
DeepSeek-VL2MoE + VLM2024
Qwen3-VLInterleaved-MRoPE, DeepStack2025
InternVL3.5Cascade RL, MMMU 77.7%2025
OPA-DPO (CVPR 2025)针对幻觉的对齐方法2025
NaViL (ICCV 2025)Native MLLM Scaling Laws2025
GR3D (CVPR 2026)3D Spatial VLM2026

六、面试准备要点总结

八大核心知识点

  1. 架构:ViT-Connector-LLM vs 原生多模态,MoE 应用
  2. 动态分辨率:Tiling (AnyRes)、Native Resolution (2D-RoPE)、Token 压缩
  3. 训练:多阶段 PT→SFT→RL,GRPO/DPO for VLM,Thinking 变体
  4. Scaling:ViT 比 LLM 更快饱和,MoE 比 Dense 更高效
  5. 推理+视觉:o 系列 "thinking with images" 范式
  6. 效率:Token 压缩、MoE、小模型 (SmolVLM, Moondream) 是部署关键
  7. Agent + 具身:VLM as GUI Agent / 机器人感知骨干
  8. 开源追平闭源:MMMU 差距仅 1-2%