视觉语言模型:ViT-MLP-LLM 模式


文档摘要

视觉语言模型:ViT-MLP-LLM 模式 本节摘要:视觉编码器把图像变成 token,一个 MLP 投影器把这些 token 映射进 LLM 的嵌入空间,剩下的交给语言模型——这套 ViT-MLP-LLM 模式就是 2026 年每个生产级 VLM。本节讲清三组件各自贡献,对比 Qwen3-VL、InternVL3.5、LLaVA-Next、GLM-4.6V 的参数量、上下文长度与基准表现;解释 DeepStack 为何用多层 ViT 特征比单用末层更贴近视语对齐;用跨模态错误率(CMER)在生产里量化幻觉并据此路由。读完本节,你理解了视觉问答、图表理解、GUI 智能体背后的同一架构,并能用 LoRA 在领域数据上微调一个 VLM。

视觉语言模型:ViT-MLP-LLM 模式

本节摘要:视觉编码器把图像变成 token,一个 MLP 投影器把这些 token 映射进 LLM 的嵌入空间,剩下的交给语言模型——这套 ViT-MLP-LLM 模式就是 2026 年每个生产级 VLM。本节讲清三组件各自贡献,对比 Qwen3-VL、InternVL3.5、LLaVA-Next、GLM-4.6V 的参数量、上下文长度与基准表现;解释 DeepStack 为何用多层 ViT 特征比单用末层更贴近视语对齐;用跨模态错误率(CMER)在生产里量化幻觉并据此路由。读完本节,你理解了视觉问答、图表理解、GUI 智能体背后的同一架构,并能用 LoRA 在领域数据上微调一个 VLM。

对应原课程:Phase 4 · Lesson 25 · vision-language-models(原英文 phases/04-computer-vision/25-vision-language-models/docs/en.md)。

学习目标

阅读完本节,你应当能够:

  1. 说出 ViT-MLP-LLM 架构,解释三组件各自贡献什么。
  2. 对比 Qwen3-VL、InternVL3.5、LLaVA-Next、GLM-4.6V 的参数量、上下文长度、基准表现。
  3. 解释 DeepStack:为何多层 ViT 特征比单用末层特征更贴近视语对齐。
  4. 跨模态错误率(CMER) 在生产中量化 VLM 幻觉,并据此行动。

一、问题与直觉

CLIP(第 18 节)给图像和文本一个共享嵌入空间,够做零样本分类和检索,但回答不了「这张图里有几辆红车?」,因为 CLIP 不生成文本,只打相似度分。

视觉语言模型(VLM)——Qwen3-VL、InternVL3.5、LLaVA-Next、GLM-4.6V——把 CLIP 系图像编码器接到一个完整语言模型上。模型看一张图加一个问题,生成答案。2026 年开源 VLM 在多模态基准(MMMU、MMBench、DocVQA、ChartQA、MathVista、OSWorld)上匹敌或超越 GPT-5 和 Gemini-2.5-Pro。

这三件(ViT、投影器、LLM)是标准。模型间差异在用哪个 ViT、哪个投影器、哪个 LLM、训练数据和对齐配方。一旦理解这个模式,换任何组件都是机械操作。

ViT-MLP-LLM 架构

  1. 视觉编码器——预训练 ViT(CLIP-L/14、SigLIP、DINOv3 或微调变体),产出 patch token。
  2. 投影器——小模块(2~4 层 MLP 或 Q-former),把视觉 token 映射到 LLM 嵌入维。大部分微调发生在这里。
  3. LLM——解码器语言模型(Qwen3、Llama、Mistral、GLM、InternLM),按序列读视觉+文本 token,生成文本。

三件原则上都可训。实践中视觉编码器和 LLM 基本冻结,只训投影器——几十亿参数的信号,成本很低。

DeepStack

朴素投影只用 ViT 末层。DeepStack(Qwen3-VL)从多个 ViT 深度采样特征并堆叠:深层带高层语义,浅层带细粒度空间和纹理信息。把两者都喂给 LLM,缩小了「图里有什么」(语义)与「到底在哪」(空间落地)之间的鸿沟。

三阶段训练

现代 VLM 分阶段训练:

  1. 对齐——冻结 ViT 和 LLM,只在图文对上训投影器,教投影器把视觉空间映到语言空间。
  2. 预训练——全部解冻,在大规模交错图文数据(5 亿+ 对)上训,构建模型视觉知识。
  3. 指令微调——在精选的(图,问题,答案)三元组上微调,教会对话行为和任务格式。这一步把「视觉感知 LM」变成可用助手。

多数 LoRA 微调瞄准第 3 阶段,用小标签集。

模型家族对比(2026 年初)

模型 参数 视觉编码器 LLM 上下文 强项
Qwen3-VL-235B-A22B(MoE) 2350 亿(220 亿活跃) 自研 ViT + DeepStack Qwen3 256K 通用 SOTA、GUI 智能体
Qwen3-VL-30B-A3B(MoE) 300 亿(30 亿活跃) 自研 ViT + DeepStack Qwen3 256K 更小 MoE 替代
Qwen3-VL-8B(稠密) 80 亿 自研 ViT Qwen3 128K 生产稠密默认
InternVL3.5-38B 380 亿 InternViT-6B Qwen3 + GPT-OSS 128K MMBench / MMVet 强
InternVL3.5-241B-A28B 2410 亿(280 亿活跃) InternViT-6B Qwen3 128K 与 GPT-4o 竞争
LLaVA-Next 72B 720 亿 SigLIP Llama-3 32K 开放、易微调
GLM-4.6V ~700 亿 自研 GLM 64K 开源、OCR 强
MiniCPM-V-2.6 80 亿 SigLIP MiniCPM 32K 边缘友好

视觉智能体

Qwen3-VL-235B 在 OSWorld——操作 GUI(桌面、移动、网页)的视觉智能体基准——上达全球顶尖。模型看截图、理解 UI、发出动作(点击、输入、滚动),配合工具完成常见桌面任务。多数 2026「AI PC」演示底层跑的就是这个。

智能体能力 + RoPE 变体

VLM 需要知道一帧在视频里的何时。Qwen3-VL 从 T-RoPE(时间旋转位置嵌入)演进到基于文本的时间对齐——把显式时间戳文本 token 与视频帧交错。模型看到「<timestamp 00:32> 帧, 提示」,就能推理时间关系。

对齐问题

爬取数据集里约 12% 的图文对,描述未完全落地到图。在其上训的 VLM 会悄悄学会幻觉——捏造物体、误读数字、虚构关系。生产中这是主要失败模式。

Skywork.ai 引入跨模态错误率(CMER) 来追踪它:

CMER = 文本置信度高但图文相似度(经 CLIP 系检查器)低的输出比例

CMER 高表示模型自信地说着图中没有的事。监控 CMER 并当作生产 KPI,在他们部署里把幻觉率降了约 35%。诀窍不是「修模型」,而是「把高 CMER 输出路由到人工审核」。

用 LoRA / QLoRA 微调

700 亿 VLM 的全参微调多数团队够不着。注意力+投影器层上的 LoRA(秩 1664),或 4 位基础权重的 QLoRA,单张 A100/H100 就能跑。成本:500050000 样本、1005000 美元算力、210 小时训练。

空间推理仍弱

当前 VLM 在空间推理基准(上下、左右、计数、距离)上得分 50~60%。若你的用例依赖「哪个物体在哪个之上」,要重度验证——通用 VLM 性能低于人类。纯空间任务的优于 VLM 的替代:专用关键点/姿态估计器、深度模型、或带框几何后处理的检测模型。

二、从零实现

步骤 1:投影器

你最常训练的部分。2~4 层带 GELU 的 MLP。

import torch import torch.nn as nn class Projector(nn.Module): def __init__(self, vit_dim=768, llm_dim=4096, hidden=4096): super().__init__() self.net = nn.Sequential( nn.Linear(vit_dim, hidden), nn.GELU(), nn.Linear(hidden, llm_dim), ) def forward(self, x): return self.net(x)

输入是 (N_patches, d_vit) token 张量,输出 (N_patches, d_llm),LLM 把每行当又一个 token。

步骤 2:端到端组装 ViT-MLP-LLM

最小 VLM 前向的骨架。真实代码用 transformers;这是概念布局。

class MinimalVLM(nn.Module): def __init__(self, vit, projector, llm, image_token_id): super().__init__() self.vit = vit self.projector = projector self.llm = llm self.image_token_id = image_token_id # 文本提示里的占位 token def forward(self, image, input_ids, attention_mask): # 1. 视觉特征 vision_tokens = self.vit(image) # (B, N_patches, d_vit) vision_embeds = self.projector(vision_tokens) # (B, N_patches, d_llm) # 2. 文本嵌入 text_embeds = self.llm.get_input_embeddings()(input_ids) # (B, M, d_llm) # 3. 把图像占位 token 替换成视觉嵌入 merged = self._merge(text_embeds, vision_embeds, input_ids) # 4. 跑 LLM return self.llm(inputs_embeds=merged, attention_mask=attention_mask) def _merge(self, text_embeds, vision_embeds, input_ids): out = text_embeds.clone() expected = vision_embeds.size(1) for b in range(input_ids.size(0)): positions = (input_ids[b] == self.image_token_id).nonzero(as_tuple=True)[0] if len(positions) != expected: raise ValueError( f"批项 {b} 有 {len(positions)} 个图像 token,但 vision_embeds 有 {expected} 个 patch。" "批里每样本都必须预填充到相同数量的图像占位 token。") out[b, positions] = vision_embeds[b] return out

文本里的 <image> 占位 token 被替换成真实图像嵌入——LLaVA、Qwen-VL、InternVL 用的同一模式。

步骤 3:CMER 计算

一个轻量运行时检查。

import torch.nn.functional as F def cross_modal_error_rate(image_emb, text_emb, text_confidence, sim_threshold=0.25, conf_threshold=0.8): """ image_emb, text_emb: 图像和生成文本的嵌入(内部归一化) text_confidence: 每 token 平均概率,[0, 1] 返回: 高置信度但图文对齐低的输出比例 """ image_emb = F.normalize(image_emb, dim=-1) text_emb = F.normalize(text_emb, dim=-1) sim = (image_emb * text_emb).sum(dim=-1) # 余弦相似度 high_conf_low_sim = (text_confidence > conf_threshold) & (sim < sim_threshold) return high_conf_low_sim.float().mean().item()

把 CMER 当生产 KPI,按端点、按提示类型、按客户监控。CMER 上升表示模型开始在某种输入分布上幻觉。

步骤 4:玩具 VLM 分类器(可运行)

演示投影器能训。假「ViT 特征」进,一个微型 LLM 式 token 预测类别。

class ToyVLM(nn.Module): def __init__(self, vit_dim=32, llm_dim=64, num_classes=5): super().__init__() self.projector = Projector(vit_dim, llm_dim, hidden=64) self.head = nn.Linear(llm_dim, num_classes) def forward(self, vision_tokens): projected = self.projector(vision_tokens) pooled = projected.mean(dim=1) return self.head(pooled)

可在合成的(特征, 类)对上 200 步内拟合,足以证明投影器模式有效。

三、框架对比

2026 年生产团队用 VLM 的三种方式:

  • 托管 API——OpenAI Vision、Anthropic Claude Vision、Google Gemini Vision,零基建,有厂商风险。
  • 开源自托管——Qwen3-VL 或 InternVL3.5 经 transformersvllm,完全控制,前期投入更高。
  • 领域微调——加载 Qwen2.5-VL-7B 或 LLaVA-1.6-7B,在 5k~50k 自定义样本上 LoRA,用 vllmTGI 服务。
from transformers import AutoProcessor, AutoModelForVision2Seq import torch from PIL import Image model_id = "Qwen/Qwen3-VL-8B-Instruct" processor = AutoProcessor.from_pretrained(model_id) model = AutoModelForVision2Seq.from_pretrained(model_id, torch_dtype=torch.bfloat16, device_map="auto") messages = [{ "role": "user", "content": [ {"type": "image", "image": Image.open("plot.png")}, {"type": "text", "text": "What does this chart show?"}, ], }] inputs = processor.apply_chat_template(messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt").to("cuda") generated = model.generate(**inputs, max_new_tokens=256) answer = processor.decode(generated[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True)

apply_chat_template 隐藏 <image> 占位分词,模型内部处理合并。

四、可复用产物

本节产出两个可复用文件(位于原课程 outputs/):

  • prompt-vlm-selector.md:按精度、延迟、上下文长度、预算,在 Qwen3-VL / InternVL3.5 / LLaVA-Next / API 间挑。
  • skill-cmer-monitor.md:产出给生产 VLM 端点装上跨模态错误率、按端点仪表盘、告警阈值的代码。

五、练习

  1. (简单) 把三个提示(「这是什么?」「数物体」「描述场景」)在任一开源 VLM 上对 5 张图各跑一遍,手判每答正确/部分正确/幻觉,算一个初版 CMER 类比率。
  2. (中等) 用 LoRA(秩 16)在目标领域 500 张带 caption 图上微调 Qwen2.5-VL-3B 或 LLaVA-1.6-7B,对比零样本与微调后的 MMBench 风格精度。
  3. (困难) 把 VLM 的图像编码器从默认 SigLIP/CLIP 换成 DINOv3,只重训投影器(冻结 LLM + 冻结 DINOv3),测量密集预测任务(计数、空间推理)是否改善。

本节要点回顾

  1. ViT-MLP-LLM 是 2026 每个 VLM 的模式——视觉编码器 + 投影器 + 语言模型,换组件是机械操作。
  2. 三件:ViT(产 patch token)、投影器(2~4 层 MLP 映到 LLM 维,微调集中地)、LLM(读视语 token 序列生成文本)。
  3. DeepStack——多层 ViT 特征堆叠比单末层更贴近语义+空间对齐(Qwen3-VL)。
  4. 三阶段训练:对齐(冻 ViT/LLM 训投影器)、预训练(全解冻 5 亿+对)、指令微调(教对话/任务格式)。
  5. 2026 模型版图:Qwen3-VL(通用 SOTA/GUI 智能体)、InternVL3.5(MMBench 强)、LLaVA-Next(开放易微调)、GLM-4.6V(OCR 强)、MiniCPM-V(边缘)。
  6. 视觉智能体——VLM 操作 GUI(OSWorld),发点击/输入/滚动动作,「AI PC」底层。
  7. 时间对齐——从 T-RoPE 演进到时间戳文本 token 与帧交错。
  8. 对齐问题致幻觉——12% 爬取对未落地,CMER(高文本置信+低图文相似)当 KPI 监控,降 35% 幻觉;高 CMER 路由人工。
  9. LoRA/QLoRA 微调——秩 1664 或 4 位基,单 A100/H100,5k50k 样本。
  10. 空间推理仍弱(50~60%)——纯空间任务用专用关键点/深度/检测模型更靠谱。

下一节进入单目深度——从单张 RGB 图估计每个像素到相机的距离,服务 AR、机器人、自动驾驶。


发布者: 作者: Rohit Gupta 转发
评论区 (0)
U