视觉语言模型: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。
本节摘要:视觉编码器把图像变成 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)。
阅读完本节,你应当能够:
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、训练数据和对齐配方。一旦理解这个模式,换任何组件都是机械操作。
三件原则上都可训。实践中视觉编码器和 LLM 基本冻结,只训投影器——几十亿参数的信号,成本很低。
朴素投影只用 ViT 末层。DeepStack(Qwen3-VL)从多个 ViT 深度采样特征并堆叠:深层带高层语义,浅层带细粒度空间和纹理信息。把两者都喂给 LLM,缩小了「图里有什么」(语义)与「到底在哪」(空间落地)之间的鸿沟。
现代 VLM 分阶段训练:
多数 LoRA 微调瞄准第 3 阶段,用小标签集。
| 模型 | 参数 | 视觉编码器 | 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」演示底层跑的就是这个。
VLM 需要知道一帧在视频里的何时。Qwen3-VL 从 T-RoPE(时间旋转位置嵌入)演进到基于文本的时间对齐——把显式时间戳文本 token 与视频帧交错。模型看到「<timestamp 00:32> 帧, 提示」,就能推理时间关系。
爬取数据集里约 12% 的图文对,描述未完全落地到图。在其上训的 VLM 会悄悄学会幻觉——捏造物体、误读数字、虚构关系。生产中这是主要失败模式。
Skywork.ai 引入跨模态错误率(CMER) 来追踪它:
CMER = 文本置信度高但图文相似度(经 CLIP 系检查器)低的输出比例
CMER 高表示模型自信地说着图中没有的事。监控 CMER 并当作生产 KPI,在他们部署里把幻觉率降了约 35%。诀窍不是「修模型」,而是「把高 CMER 输出路由到人工审核」。
700 亿 VLM 的全参微调多数团队够不着。注意力+投影器层上的 LoRA(秩 1664),或 4 位基础权重的 QLoRA,单张 A100/H100 就能跑。成本:500050000 样本、1005000 美元算力、210 小时训练。
当前 VLM 在空间推理基准(上下、左右、计数、距离)上得分 50~60%。若你的用例依赖「哪个物体在哪个之上」,要重度验证——通用 VLM 性能低于人类。纯空间任务的优于 VLM 的替代:专用关键点/姿态估计器、深度模型、或带框几何后处理的检测模型。
你最常训练的部分。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。
最小 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 用的同一模式。
一个轻量运行时检查。
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 上升表示模型开始在某种输入分布上幻觉。
演示投影器能训。假「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 的三种方式:
transformers 和 vllm,完全控制,前期投入更高。vllm 或 TGI 服务。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 端点装上跨模态错误率、按端点仪表盘、告警阈值的代码。下一节进入单目深度——从单张 RGB 图估计每个像素到相机的距离,服务 AR、机器人、自动驾驶。