Skip to content

第十五章:多模态模型 — 从 CLIP 到 Omni Model ​

本章学习目标 ​

  在之前的十四章里,我们几乎所有内容都围绕纯文本的语言模型展开。然而人类接收信息的渠道远不止文字,视觉、听觉同样是智能体理解世界的重要接口。多模态模型(Multimodal Model) 正是要让模型具备"既会读文字,也会看图像,甚至能听声音"的能力。

完成本章学习后,你将能够:

  1. 理解多模态建模的根本动机:为什么需要从纯文本走向 Omni Model?Transformer 的统治地位与多模态扩展的挑战是什么?
  2. 掌握 CLIP/SigLIP 的对比学习范式:理解图像-文本对齐的数学原理、工程实现,以及后续的改进方向。
  3. 了解 Vision Transformer 的工作机制:为什么 ViT 能替代 ResNet 成为主流视觉编码器?
  4. 掌握 VLM 的标准范式:Vision Encoder + Adapter + LM 三段式架构的核心思想与训练流程。
  5. 了解代表性 VLM 系统的演进:LLaVA、Qwen-VL、Chameleon 等模型的关键技术创新。
  6. 理解连续表示与离散表示的路线之争:为什么扩散模型最终胜出?离散 token 化为什么在工程上不实用?

  本章作为课程最后一讲,承担着"承上启下"的角色,既是对前面所学语言模型知识的延伸,也是对当下主流多模态系统的全景式概览。


15.1 引言:为什么需要多模态 ​

  如果你从第一章一路学到这里,我们已经完整地讨论了语言模型从分词、架构、训练到对齐的全套工具链。但请停下来想一个问题:你用手机拍的一张照片,你身边朋友发的一段语音,这些信息能用纯文本 LLM(Large Language Model,大语言模型)处理吗?

  答案是不能。GLM-5.2 和 DeepSeek V4 这些模型虽然强大,但它们天生"听不懂、看不懂"图像和音频,它们只认识 token。这意味着如果想让 LLM 真正成为通用助手,就必须想办法把图像、音频这些非文本信号也"翻译"成 LLM 能理解的语言。这正是多模态建模的核心挑战。

在 GLM-5.2 和 DeepSeek V4 官网使用这些模型时,你可能发现能够输入图像,那是因为它们虽然不支持原生多模态,但是借助外部视觉模型(如 OCR 或视觉大模型)进行中转,将视觉信息转化为文本后再交由这些模型进行推理,同样实现了类似于原生多模态的效果

15.1.1 从纯文本到 Omni Model ​

  在 AI 业界,大家有一个"北极星"目标,即所谓的 Omni Model(全能模型):

  • 输入:任意模态的组合,可以是图、可以是视频、可以是语音,也可以是它们的混合,再加上一段文本指令;
  • 输出:任意模态的组合,既能生成文字回答,也能生成图像、音频甚至视频。

  当下无论是 Google 的 Gemini 还是 OpenAI 的 GPT 系列,都被宣传为"原生多模态"(natively multimodal),但具体实现细节并未公开。我们这一讲的目的,是拆解开源社区中那些已公开方案的设计思路,让你能看清多模态模型的内部构造。

图 15.1 多模态建模的全景:从纯文本到任意模态输入输出

15.1.2 两个核心问题 ​

  要实现 Omni Model,面临两个核心问题:

问题一:如何输入非文本数据?

  这是本讲的重点。文本天然有 BPE(Byte Pair Encoding,字节对编码)tokenizer(见第 2 章)把它切成 token,但像素、波形这些连续信号怎么变成 LLM 能"读"的向量?我们将看到两种主流路径:

  • 连续表示:用 Vision Encoder 把图像直接编码成连续向量,再注入 LLM(LLaVA、Qwen-VL);
  • 离散表示:先把图像切成离散 token,再把 token 序列丢给 LLM(Chameleon)。

问题二:如何输出非文本数据?

  本讲只做简要提及。当前主流方案是扩散模型(Diffusion Model),它能从纯噪声出发逐步去噪,最终生成图像、音频或视频。Transformer 在这里扮演"理解"和"控制信号生成"的角色,真正的"画笔"是扩散模型。这也是为什么本讲题目里强调 "Alignment"(对齐),即把语言模型的理解能力与扩散模型的生成能力对齐起来。

15.1.3 Token 概念的扩展 ​

  在第 2 章中我们学到,token 是文本的基本单位,一个 token 代表"某个有语义的信息单元"。一个单独的英文字母、一个单独的像素,本身都没有意义,必须组合起来才有信息。

  这个观察可以推广到所有模态:

模态最小单位token 化表示
文本字符词片段(BPE)
图像像素图像 patch(ViT)/ 离散 code(VQ-VAE)
音频波形采样点短时频谱帧、离散 code
视频单帧像素时空 patch

  多模态建模的核心哲学就是:把一切模态都"翻译"成 token,然后交给 Transformer 这个"统一接口"进行处理。这也是为什么 Transformer 在所有模态上都能 work,它不关心 token 来自哪里,只关心 token 之间的统计模式。


15.2 CLIP:对比语言-图像预训练 ​

  在多模态领域,CLIP(Contrastive Language-Image Pre-training) 是绕不开的开山之作。它由 OpenAI 在 2021 年提出,至今仍是现代 VLM(Vision-Language Model,视觉语言模型)的基础组件。理解 CLIP 的设计思想,是理解整个多模态生态的第一步。

15.2.1 历史背景:从 ImageNet 到基础模型时代 ​

  在 CLIP 出现之前,视觉领域的主流范式是这样的:研究人员人工标注一个超大规模分类数据集(如 ImageNet 有 120 万张图、1000 个类别),然后训练一个 ResNet(Residual Network,残差网络)去拟合这些标签。这是一个监督学习范式,标签是人工精心标注的、固定的。

  然而 2020 年前后,语言模型领域发生了范式转变:GPT-2、GPT-3 证明了只要从互联网上爬取海量文本,让模型自己预测下一个 token,就能学到惊人的语言能力。这种"基础模型"(Foundation Model)范式不再依赖精心标注的数据集。

  问题来了:对图像来说,"爬取互联网"的对应物是什么?

  OpenAI 的研究者们给出了一个巧妙的答案:互联网上天然存在大量"图像-文本配对"(image-text pairs)。网页上每张图几乎都配有一段说明文字、相邻的标题、alt 属性等。CLIP 正是利用了这种"自然标注"。

图 15.2 互联网上的图像-文本天然配对:每张图都被 alt 属性、caption、周围正文等多源文本"标注"

关键洞察:爬取 4 亿对 (图像, 文本),让模型学习"哪段文字描述了哪张图",比人工标注 120 万张图更便宜、更通用。

15.2.2 目标函数:n 路分类 ​

  CLIP 的训练目标出奇地简洁。给定一批 n 对 (image, text) 配对数据:

图 15.2 CLIP 架构:图像和文本分别编码后在共享空间做点积

  对每张图像 Ii,希望它与自己对应文本 Ti 的相似度远高于与其他 n−1 个文本 Tj 的相似度;反过来对每个文本也类似。这相当于:

  • 一个 n 路分类问题:对图像 Ii,从 n 个候选文本中选出正确的 Ti;
  • 另一个 n 路分类问题:对文本 Ti,从 n 个候选图像中选出正确的 Ii。

  两路损失加起来就是 CLIP 的总损失。本质上这就是把图文匹配建模为矩阵分类问题。

python
import torch
import torch.nn.functional as F

def clip_loss(image_embeds, text_embeds, temperature):
    """
    image_embeds: [n, d]  图像特征(已归一化)
    text_embeds:  [n, d]  文本特征(已归一化)
    temperature:  标量    温度参数(可学习)
    """
    # 相似度矩阵:[n, n]
    logits = image_embeds @ text_embeds.T * temperature.exp()

    # 标签:对角线为正例
    labels = torch.arange(logits.size(0), device=logits.device)

    # 两个方向的交叉熵
    loss_i2t = F.cross_entropy(logits, labels)        # 图像→文本
    loss_t2i = F.cross_entropy(logits.T, labels)      # 文本→图像
    return (loss_i2t + loss_t2i) / 2

图 15.3 CLIP 损失计算的核心代码:相似度矩阵 + 双向交叉熵

  注意一个关键细节:温度参数 τ(temperature)是可学习的。它控制了相似度分布的"尖锐程度"。小温度让分布更尖锐、强调最相似的对;大温度让分布更平滑、强调相对差异。CLIP 把温度放到 exp() 里,使其恒为正,避免手工调参。

为什么 batch size 必须大?

  CLIP 的损失是在整个 batch 内做 softmax。如果 batch size 是 1,那就只有一个候选,分类问题退化为平凡情况;batch size 越大,"负样本"越多,模型学到的对比信号就越强。CLIP 训练时常用的 batch size 是 32,768。这个数字在 2021 年是相当惊人的规模。

15.2.3 数据规模与处理 ​

  OpenAI 当时爬取了约 4 亿对 (图像, 文本) 数据。注意,这个数据集从未公开,引发了社区对"用私有数据训练闭源模型"的广泛讨论。作为回应,OpenCLIP 复现并扩展了 CLIP:

  • 数据源:LAION-5B(公开的 50 亿图文对);
  • 训练规模:在 5B 数据上训练,模型规模覆盖多个量级;
  • 工程上甚至用 CLIP 自己来过滤数据。具体来说,先用一个小 CLIP 给所有数据打分,只保留置信度高的部分训练大 CLIP。这种"自举"(bootstrapping)虽然有效,但也可能放大原始数据的偏差。

  图像预处理:

  神经网络不喜欢"动态"的东西,而图像的原始分辨率五花八门。CLIP 的处理方式很直接:

  1. 双三次插值(Bicubic)把短边缩放到 336px;
  2. 中心裁剪成 336×336 的正方形;
  3. 归一化后送入视觉编码器。

  这个流程对 ImageNet 风格的"主体居中"图像很有效,但对文档截图、卫星图等多内容图像会丢失细节。这一问题在 15.4 节的 LLaVA OneVision 中得到了解决。

15.2.4 视觉编码器:Vision Transformer(ViT) ​

  CLIP 团队实验了 ResNet 和 Vision Transformer 两种视觉骨干网络,结论是 ViT(Vision Transformer)效果更好。如今大家说 "CLIP" 默认指的就是 ViT 版本。

图 15.4 Vision Transformer 架构

  ViT 的核心思想是"把图像当成一串 token":

  1. 把图像切成固定大小的 patch(CLIP 默认是 14×14 像素);
  2. 每个 patch 线性投影成一个向量,这就是一个"视觉 token";
  3. 给所有 token 加上 1D 位置编码(实验证明 2D 位置编码相对 1D 并没有显著优势);
  4. 送入标准 Transformer encoder;
  5. 最后用一个 attention pooling 层把所有 token 聚合成一个向量。

什么是 Attention Pooling?

  简单的做法是对所有 token 取平均(mean pooling),但 CLIP 团队发现用一个可学习的 query 向量对所有 token 做 attention 效果更好。换句话说,模型可以学会"重点关注哪些 patch"。这相当于给视觉编码器加了一个"软注意力"的输出层。

  CLIP 的最佳配置:

  • 视觉端:ViT-L/14@336px(Large 规模、14×14 patch、336×336 输入);
  • 文本端:GPT-2 风格的 Transformer(约 6300 万参数),输入是 [BOS] + 文本 + [EOS],取 [EOS] 位置的最后一层激活作为整个文本的表示。

15.2.5 核心结果与意义 ​

  CLIP 最令人震撼的实验是 zero-shot ImageNet 分类:

  传统 ImageNet 训练需要 120 万张人工标注的图像和 1000 个类别标签;而 CLIP 用 4 亿对网络图文训练后,不做任何下游微调就能在 ImageNet 上超过专门训练的 ResNet,见图 15.2的(3).

  做法是构造 1000 个 prompt 模板(如 "a photo of a {class}"),把图像特征和这 1000 个文本特征做点积,选分数最高的类别。这一过程就是 zero-shot 分类。

图 15.5 对比学习 vs 直接生成文本:计算效率对比

  消融实验还揭示了一个反直觉的事实:让模型直接从图像生成完整 caption 文本,效果反而不如对比学习。这说明对于"获取图像的语义表示"这个目标,精确建模 token 序列并不重要,对比信号已经足够。

CLIP 的方法论遗产:

  1. 海量弱监督数据 > 人工精标数据;
  2. 对比学习是高效的"语义对齐"工具;
  3. 简单的 ViT 编码器足以胜任;
  4. 零样本能力是规模化的副产品。

15.2.6 CLIP 的局限 ​

  尽管 CLIP 影响深远,但它有几个明显短板:

  • 设计目标是图像分类,所以学到的特征偏"高层语义",对细粒度信息(如 OCR、计数、空间关系)不敏感;
  • 依赖超大 batch size(32K 级别),小 batch 下性能急剧下降;
  • softmax 跨整个 batch 计算,无法在数据子集上独立分解,并行化困难;
  • 对图像中的细粒度文本信息(如文档、表格、字幕)几乎无能为力。

  这些局限直接催生了下一节要介绍的 SigLIP,以及后续处理高分辨率的 AnyRes 等技术。


15.3 SigLIP:让 CLIP 更高效的工程改进 ​

  SigLIP(Sigmoid Loss for Language Image Pre-training)是 Google 在 2023 年提出的 CLIP 改进版。它在很多指标上和 CLIP 持平甚至更好,但工程上更友好。本节我们重点分析它做了哪些"小改动",为什么这些改动如此有效。

15.3.1 从 Softmax 到 Sigmoid Loss ​

  CLIP 的损失本质是一个 n 路 softmax 分类问题。SigLIP 把它换成了逐对的二分类问题:

图 15.6 SigLIP 损失:每对 (图像, 文本) 独立判定

  具体做法:

  • 对角线元素(正样本对)→ 标签 = +1
  • 非对角线元素(负样本对)→ 标签 = -1
  • 用 sigmoid 函数 + 二分类交叉熵逐对计算损失
python
def siglip_loss(image_embeds, text_embeds, temperature, bias):
    """
    与 CLIP 的关键区别:每对独立判定,无需 batch 内 softmax
    """
    logits = image_embeds @ text_embeds.T * temperature + bias
    targets = torch.diag(torch.full((logits.size(0),), -1.0))  # 反对角线
    targets.fill_diagonal_(1.0)  # 对角线为 +1
    loss = -F.logsigmoid(targets * logits)  # 每个元素独立算
    return loss.mean()

  这个改动的"代码量"很小,但带来三个深远影响:

维度CLIPSigLIP
损失类型跨 batch 的 softmax CE(Cross-Entropy)每对独立的 sigmoid CE
batch size 影响强耦合(改 batch = 改损失)完全解耦
计算分解性不可分解可按 pair 独立计算

15.3.2 Loss 与 batch size 解耦 ​

  CLIP 的"必须用大 batch"是它工程上的最大痛点。为什么会这样?因为 CLIP 的负样本来自同一个 batch,batch 越大负样本越多,损失函数本身就在变。

  SigLIP 的损失对 batch size 不敏感。原因是每对的损失是独立计算的,batch 只是把多个独立的 pair 堆在一起。实验发现:

  • 小 batch(<16K):SigLIP 远优于 CLIP;
  • 32K batch:两者性能相当;
  • 更大 batch:SigLIP 略优但提升放缓。

  这意味着对小团队、有限算力的研究者来说,SigLIP 是个"友好得多"的选择。

15.3.3 并行策略与训练效率 ​

  CLIP 的损失需要把整个 batch 的相似度矩阵算出来才能做 softmax,这在大规模分布式训练中是个瓶颈,因为所有 GPU 之间的 embedding 都要互相"看到"。

  SigLIP 的天然分解性让类似 DDP(Distributed Data Parallel)的并行策略成为可能:

图 15.7 SigLIP 跨设备并行:每个设备只算自己那部分 pair

  具体做法:

  1. 每个 GPU 只算自己那部分 (image, text) pair 的 embedding;
  2. 通过 all-gather 或 轮转(shuffle) 通信,让每个 GPU 拿到所有 pair 的 embedding;
  3. 每个 GPU 独立计算自己那部分 pair 的 sigmoid 损失。

  训练效率的对比:

模型硬件训练时间
CLIP256 × TPUv310 天
SigLIP32 × TPUv45 天

  TPUv4 单卡算力其实不如 TPUv3,但 SigLIP 训练时间反而减半。原因是 SigLIP 用 32 卡就能跑出 CLIP 256 卡的效果(因为不需要那么大的 batch),整体通信开销和能耗都大幅下降。

  数据集(WebLI):

  Google 训练 SigLIP 用的是 WebLI(Web Language Image dataset) 数据集:

  • 规模:O(billion)(数十亿)对图文;
  • 预处理:自动 OCR 提取图像中的文字;用模型打分保留 top 10% 高质量数据;
  • 多语言:覆盖 100 种语言,这是 SigLIP 相对 CLIP 的另一个优势。

为什么 SigLIP 重要?

  它证明了对比学习的目标函数还有优化空间。CLIP 的 softmax 不是"唯一正确"的选择,sigmoid 这种更简单的损失在工程上反而更友好。这种"小改动带来大收益"是值得借鉴的工程哲学。


15.4 VLM 架构:将图像注入语言模型 ​

  CLIP 学到了"图像-文本"的联合空间,但它的能力仅限于匹配和分类。换句话说,它不会"读图说话"。

  VLM(Vision-Language Model) 才是当下多模态对话系统的标准形态。它的核心思想是:

把图像编码成向量,然后"塞进"语言模型,让语言模型基于图像内容生成自然语言回答。

  这一节我们以 LLaVA 系列为例,拆解 VLM 的标准范式。

15.4.1 标准范式:Encoder + Adapter + LM ​

  几乎所有主流 VLM 都遵循一个三段式架构:

┌──────────────┐    ┌────────────┐    ┌──────────────────┐
│  Vision      │    │            │    │  Language        │
│  Encoder     │ ─► │  Adapter   │ ─► │  Model (LLM)     │
│  (CLIP/SigLIP)│   │  (W)       │    │  (Vicuna/Qwen)   │
└──────────────┘    └────────────┘    └──────────────────┘
   图像 → 视觉向量   维度对齐/特征转换   基于视觉条件生成文本

  每个组件的角色:

  1. Vision Encoder:把图像编码成一系列向量(通常是几百个 patch token)。一般直接用现成的 CLIP 或 SigLIP 权重,冻结不训练;
  2. Adapter/Projector:一个小型的"桥梁"模块(线性层、MLP 或 cross-attention),把视觉向量"翻译"成 LLM 能理解的"伪文本 token";
  3. Language Model:预训练好的 LLM,接收"文本 token + 视觉 token"的混合序列,自回归生成回答。

  这其实是一种**"mid-training"或"post-training"**。具体做法是:我们不动两个已经预训练好的大模块,只在中间"接一根线",训练成本远低于从零训练一个多模态模型。

15.4.2 LLaVA:奠基性开源 VLM ​

  LLaVA(Large Language and Vision Assistant) 是 2023 年由微软和威斯康星大学联合发布的开源 VLM。它本身性能不如 GPT-4V,但完整开源了模型权重和训练数据,让社区第一次看清了 VLM 的内部结构。

图 15.8 LLaVA 架构:CLIP + 线性投影 + Vicuna

  LLaVA 的三组件选择:

组件选择说明
Vision EncoderCLIP ViT-L/14当时最强开源视觉编码器
Projector单层线性矩阵 W最简单的"翻译器"
Language ModelVicunaLLaMA 在 ShareGPT 对话数据上的微调版

  训练数据生成(关键创新):

  LLaVA 团队面临一个尴尬的难题:互联网上"图文对话"数据非常稀缺,因为大部分图文配对都是"图片 + 单句 caption",没有"问-答"对话。

  他们用了一个巧妙的方案:用 GPT-4 合成对话数据。

图 15.9 LLaVA 的数据生成流程:基于 COCO 标注 + GPT-4 合成

  具体步骤:

  1. 以 MS COCO 数据集为基础(已有高质量的物体框 + caption);
  2. 把每个图像的标注(类别、位置、关系、caption)打包成 prompt;
  3. 让 GPT-4 基于这些信息生成三类对话:
    • Conversation:基于 caption 的日常问答;
    • Detailed Description:比 caption 更详细的描述;
    • Complex Reasoning:需要逻辑推理的问题。

  最终得到 158K 条合成对话,用于训练 LLaVA。

关于"用 GPT-4 合成数据"

  这在 2023 年引发了广泛讨论。LLaVA 团队坦承"unabashedly distilling GPT-4",并不避讳用最强闭源模型的能力来训练开源模型。从工程角度看这是务实的;但从研究角度看,这也是为什么开源 VLM 的能力上限至今仍受制于闭源模型。

  两阶段训练:

阶段训练目标冻结部分
Stage 1(对齐)让图像向量"看起来像"自然语言 tokenVision Encoder + LM
Stage 2(指令微调)在多模态对话上微调Vision Encoder

  Stage 1 只训练线性投影 W,相当于教它"图像向量和文本向量在空间上要对齐";Stage 2 解冻 LM,让它学会"看到图像后怎么回答问题"。

图 15.10 LLaVA 推理示例:识别"不寻常"的内容

  LLaVA 论文里有一个经典示例:用户问 "What's unusual about this image?"(一张在小货车后面熨衣服的照片),模型回答 "a man ironing on the back of a minivan is unusual"。重点是用户并没有明确问"哪里不寻常",但模型主动识别了反常点。这种主动观察能力在当时相当惊艳。

15.4.3 LLaVA OneVision:多图与视频 ​

  LLaVA 1.5 和 LLaVA-Next 是渐进式改进。2024 年发布的 LLaVA OneVision 则把目标扩大:处理多张图像、视频等更复杂的输入。

图 15.11 LLaVA OneVision 架构:SigLIP + 2层MLP + Qwen-2

  关键升级:

组件LLaVALLaVA OneVision
Vision EncoderCLIP ViT-L/14SigLIP
Projector线性层2 层 MLP
Language ModelVicuna (13B)Qwen-2 72B
支持输入单图单图 / 多图 / 视频

  AnyRes:高分辨率处理的核心创新

  LLaVA OneVision 最值得关注的工程创新是 AnyRes。动机如下:

  回想 CLIP,它把图像缩放到 336×336 再裁成正方形。这对"主体居中"的 ImageNet 风格图像没问题,但对文档截图、图表、长图来说就糟糕了,因为文字会小到无法辨认。

图 15.12 AnyRes 原理:全局 + 多个 336×336 切片

  AnyRes 的做法:

  1. 一路:把整张图像 downsampled 编码(捕获全局信息);
  2. 多路:把原图切成最多 9 个 336×336 的 chunk,分别用 vision encoder 编码;
  3. 拼接:把全局特征 + 切片特征拼成 token 序列;
  4. 降采样:如果 token 太多,用 bilinear interpolation 降采样,控制总长度。

  三种模态的分辨率策略:

图 15.13 LLaVA OneVision 对单图 / 多图 / 视频的差异化处理

  术语说明:这里提到的 crop 和 tile 含义相近——都是指把高分辨率图切成的一个固定大小(通常 336×336)的子图块。每个 crop / tile 单独送进 vision encoder 编码,得到一组视觉 token。区别只是叫法习惯:CLIP 时代多用 "crop",LLaVA OneVision 论文里偏好 "tile"。

输入类型策略原因
单张图像高分辨率(full + 最多 9 个 crop)单图独享 token 预算,可以"看仔细"
多张图像每张较少 tile(如 1-4 个)token 预算被均分,要让多张图都进入上下文
视频低分辨率/稀疏帧(最多 32 帧)视频很长,避免重复帧主导训练

  数据与训练:

  LLaVA OneVision 仍然坚持"质量 > 数量"的哲学:

图 15.14 LLaVA OneVision 的数据构成

  训练流程分三阶段:

图 15.15 LLaVA OneVision 的三阶段训练流程

  1. Stage 1(对齐):仅训练 projector,锁住其他;
  2. Stage 2(知识注入):高质量知识数据,训练更多参数;
  3. Stage 3(任务微调):下游任务数据,全模型训练。

15.4.4 跨模态迁移:涌现的泛化能力 ​

  LLaVA OneVision 最有趣的发现是跨模态迁移(Cross-Modal Transfer):

图 15.16 跨模态迁移示例:训练用单图,测试时能做多图任务

  具体例子:

  • 图表+表格联合推理:训练数据里只有"单张图表"或"单张表格",但模型在测试时能对"图表 + 表格组合"做对话;
  • GUI Agent:训练数据里只有"单图 OCR + 关系推理",但模型能分析多步骤的截屏、做界面操作;
  • 视频物体追踪:训练数据里只有"单图 visual prompting(圈出目标)",但模型能对视频做持续追踪。

图 15.17 GUI Agent 能力:单图 OCR 训练 → 多步截屏分析

图 15.18 视频物体追踪:单图 visual prompting → 视频跨帧跟踪

图 15.19 LLaVA OneVision 在不同训练阶段的能力曲线

  这种现象是 VLM 区别于传统监督学习的核心特征:任务之间会自发迁移。如果某个能力在足够多相关任务上被训练过,它就能"外推"到新场景。这正是基础模型范式的魅力所在。


15.5 Qwen-VL 系列:工业级 VLM 的演进 ​

  如果说 LLaVA 是"学术界的开源示范",那么 Qwen-VL 系列 就是"工业界持续打磨的代表"。从 2023 年至今,Qwen 团队几乎每 6-12 个月发布一个新版本,每个版本都带来工程细节上的显著优化。本节按时间顺序梳理其技术演进。

15.5.1 Qwen-VL:跨注意力适配器 ​

图 15.20 Qwen-VL 的三阶段训练总览

  架构:

组件选择
Vision EncoderOpenCLIP ViT-bigG(14×14 patch)
Adapter单层 cross-attention + 2D 位置编码 → 固定 256 tokens
Language ModelQwen-7B
特殊 token<img>、<box>、<ref>

  LLaVA 的 Adapter 是简单线性投影,Qwen-VL 改成了单层 cross-attention。具体而言,把视觉向量作为 key/value,用一组可学习 query(数量固定为 256)去"查询"视觉信息。这样无论输入图像多大,最后都压缩成 256 个固定长度的 token,方便和文本拼接。

  特殊 token 的设计是 Qwen-VL 的特色:

  • <img>:标记图像边界;
  • <box>:在文本中嵌入检测框坐标("图中的 <box>cat</box> 在哪里");
  • <ref>:跨图引用("图1中的物体,在图2中变成什么样了?")。

  这些特殊 token 让模型能"画"检测框、做跨图对话。这类细粒度能力在早期 VLM 中比较少见。

  三阶段训练:

图 15.21 Qwen-VL 阶段 1 细节

图 15.22 Qwen-VL 阶段 2 细节

  1. Stage 1:大规模低质量数据;冻结 LM,训练 vision encoder + adapter;
  2. Stage 2:高质量任务数据(VQA、chart QA 等);全参数训练;
  3. Stage 3:指令微调;冻结 vision encoder,训练 adapter + LM。

  能力展示:

图 15.23 Qwen-VL 的能力展示:中英双语、代码理解、目标检测、OCR

15.5.2 Qwen2-VL:动态分辨率与 M-RoPE ​

  Qwen2-VL(2024 年)在 Qwen-VL 基础上做了三项关键升级。

  升级 1:更大的视觉骨干

  视觉编码器从 ViT-bigG 升级到 675M 参数的 ViT,规模显著增大。

  升级 2:动态分辨率

  之前 VLM 都把图像缩放到固定大小(336×336、448×448 等),Qwen2-VL 引入了动态分辨率机制:

  • 每个 224×224 patch 单独用 ViT 编码;
  • 每 2×2 个 patch 在通道维度压缩 → 每组产生 66 个 token;
  • 不同分辨率的图像产生不同数量的视觉 token,但下采样率固定为每组 4 个 patch 对应 66 token。

图 15.24 Qwen2-VL 架构:动态分辨率 + M-RoPE

  升级 3:M-RoPE(Multimodal Rotary Position Embedding,多模态旋转位置编码)

  这是 Qwen2-VL 最核心的创新。在第 4 章我们学过 RoPE(Rotary Position Embedding)。它的核心性质是让 attention 内积只取决于 token 之间的相对距离。传统 RoPE 是 1D 的,按 token 在序列中的位置编码。

  但多模态输入有二维甚至三维结构:

  • 图像有 (高, 宽);
  • 视频有 (时间, 高, 宽)。

  M-RoPE 把 RoPE 推广到多维:对每个 patch/token,位置变成三元组 (t,h,w),分别对应时间、高、宽。在每个维度上分别计算 RoPE,然后拼接。

图 15.25 M-RoPE 原理:3D 位置编码 (时间, 高, 宽)

  直觉上,M-RoPE 让模型能自然地区分"空间上相邻但时间上不同"的两个 patch(比如视频中两帧相同位置的像素),这在传统 1D 位置编码下是无法表达的。

  视频支持:

  Qwen2-VL 支持 2 fps 采样、最多 16,384 个视频 token,足以覆盖几分钟的视频。

图 15.26 Qwen2-VL 的能力展示

15.5.3 Qwen3-VL:交错 M-RoPE 与 DeepStack ​

  Qwen3-VL(2025 年)的改进重点不是"大刀阔斧的架构变化",而是一系列工程精修。Liang 在原讲中特别强调:"这些不是结构上的大变化,但确实影响模型质量。"

  五项关键改进:

图 15.27 Qwen3-VL 概览

改进 1:更强的 LM 基座

  Qwen-3 系列(Dense/MoE(Mixture of Experts,混合专家模型),最高 235B-A22B),支持 256K 上下文。这一点对于长视频、长文档的处理至关重要。

改进 2:SigLIP-2 视觉编码器

  架构与 SigLIP 相同,但用了更新版本的数据与训练配方。关键优势:向后兼容 SigLIP,可以无缝替换。

改进 3:Interleaved M-RoPE

  Qwen2-VL 的 M-RoPE 是分段排列的,比如某个 token 内部的 RoPE 分量是 [t,t,t,t,w,w,w,w,h,h,h,h]——时间维度全在低频、空间维度全在高频。

  Qwen3-VL 改为交错排列:[t,w,h,t,w,h,t,w,h,t,w,h]。这样所有维度都"暴露"在低频和高频下,模型对所有位置信息都更敏感。

改进 4:显式视频时间戳

  之前视频时间戳是隐含在位置编码里的。Qwen3-VL 把"0 秒"、"2 秒"做成实际可引用的 token。用户可以直接问"2 秒后发生了什么?"。

改进 5:DeepStack Adapter

  传统 VLM 架构是"vision encoder → projector → LM",vision encoder 的信息只通过 projector 一次性注入 LM。Qwen3-VL 引入 DeepStack:把 vision encoder 的多层输出分别注入 LM 的不同层。

图 15.28 Qwen3-VL 预训练 4 阶段 + 后训练 3 阶段

  动机是:vision encoder 不同层学到不同抽象程度的特征(浅层=边缘/纹理,深层=语义),不同 LM 层需要的视觉信息粒度也不同。DeepStack 让"细粒度视觉"和"粗粒度语义"在 LM 内部多次融合,比一次性注入更灵活。

改进 6:平方根归一化的 per-token loss

  视频样本往往非常长(数千 token),如果用标准 cross-entropy,一个视频样本对总损失的贡献远超一个短文本样本,会让训练数据分布严重偏向视频。

  Qwen3-VL 引入 1/length 的归一化因子,让长样本的 per-token 损失被降权,避免数据不平衡。

  训练流程(7 阶段!):

  Qwen3-VL 的训练流程非常复杂:

  • 预训练 4 阶段:训练 adapter → 8K 全参数 → 32K 全参数 → 256K 全参数;
  • 后训练 3 阶段:长 CoT(Chain of Thought,思维链)SFT → 知识蒸馏 → 强化学习。

图 15.29 Qwen3-VL 评测结果

  Liang 在原讲中感慨:"Pipeline 现在变得相当复杂了。如果你看最终结果,这确实是一个相当好的模型。Qwen 模型实际上非常强。"

  这一节给我们的启示:

  VLM 领域的进步越来越依赖系统性的工程优化,具体体现在从数据、训练流程到 loss 设计的每一步精细调整上。单纯改变架构已很难带来质变,打磨细节才是制胜关键。


15.6 Chameleon:离散化路线的探索 ​

  到目前为止我们看到的 VLM 都是混合架构。视觉端用专门的 Vision Encoder,文本端用 LLM,中间用一个 Adapter 桥接。

  Chameleon(Meta,2024)提出了一个截然不同的思路:

能不能把图像和文本都当成"同一种东西"——离散 token?

  如果成功,整个模型就是一个标准的 Transformer,从图像生成、文本生成到图文混合生成,全程统一架构,统一训练。

15.6.1 全 Token 化的哲学 ​

图 15.30 Chameleon 概念图:图像和文本都变成离散 token

  这种哲学的背后是 Omni Model 的愿景:文本、图像、音频、视频共享同一个 token 空间,模型不再区分"模态",只看到"token 序列"。这种统一在美感上确实让人向往。

图 15.31 Chameleon 生成的图文混合示例

15.6.2 VQ-VAE:图像离散化的关键组件 ​

  要把图像变成离散 token,需要 VQ-VAE(Vector Quantized Variational Autoencoder)这种工具:

图 15.32 VQ-VAE 架构:Encoder + 量化 + Decoder

  VQ-VAE 的工作流程:

  1. Encoder:图像 → 一组连续向量;
  2. 向量量化:每个连续向量被"四舍五入"到最近的 codebook entry(codebook 大小约 8192);
  3. Decoder:从离散 code 重建图像;
  4. 训练目标:最小化重建误差(+ 用 straight-through estimator 等技巧处理量化步骤的不可导性)。

  关键参数:

  • 一张 512×512 的图像被切分成 1024 个 token;
  • 每个 token 来自 8192 大小的词表;
  • 整个训练语料(文本 + 图像)需要重新训练 BPE tokenizer,因为图像 token 完全是新东西。

  训练流程和标准 LM 一样,也是 next-token prediction,没有 Adapter,没有单独的 vision encoder。从这个角度看,Chameleon 比 LLaVA、Qwen-VL 简单得多。

15.6.3 训练不稳定性 ​

  然而实际训练中,Chameleon 遇到了严重的不稳定问题:

"Text and images, despite occupying the same space, just behave very differently. Just calling things discrete tokens isn't hiding the fact that there's an image living there."

  造成问题的根本原因是两类 token 的熵差异:

  • 文本 token:低熵——大多数词在上下文中是可预测的,模型很快就能学到;
  • 图像 token:高熵——"我完全不知道这一小块 patch 的具体颜色",不确定性大得多。

  后果是训练过程中:

  • 参数范数(norm)不断膨胀;
  • logits 出现 drift(漂移);
  • loss 震荡甚至发散。

  缓解措施:QK Norm(query/key 上的层归一化)+ Z-loss(logits 的额外正则项)。这些技巧能让训练勉强收敛,但代价是不优雅。

15.6.4 Chameleon 的局限与最终格局 ​

性能层面:Chameleon 最终的模型性能不如同时期的混合架构 VLM。一个关键原因是离散化必然丢失信息。VQ-VAE 把连续色彩量化到 8192 个 code,重建的图像本身就有损;OCR 这种细粒度任务更是几乎不可用。

范式层面:VQ-VAE 路线在图像生成领域曾经很主流(早期 Stable Diffusion 的 latent 就是 VQ 化的)。但 2022 年后,扩散模型 在生成质量上全面超越自回归 + VQ 的组合:

  • 扩散模型直接在连续 latent 空间去噪;
  • 不需要量化步骤,信息损失为零;
  • 生成质量上限更高。

  最终格局:

"The current best combination is: continuous encoders + Transformer + diffusion models for generation." ——Liang 在原讲中的总结

  这就是当下几乎所有前沿多模态系统(GPT-4V、Gemini、Qwen-VL、InternVL 等)的共同范式:

模块主流选择
视觉输入连续向量编码器(SigLIP、CLIP)
核心架构Transformer(自回归语言模型)
视觉输出扩散模型(Stable Diffusion、Imagen、DALL-E 3)
训练范式大规模多模态预训练 + 指令微调 + RLHF/RLVR(Reinforcement Learning from Human/Verifiable Rewards)

  Chameleon 的"全离散 token 化"虽然没能成为主流,但它的探索揭示了统一多模态架构的难度。原因是文本和图像的统计性质差异太大,强行统一反而引入训练难题。


15.7 总结与思考 ​

  本讲是 CS336 课程的最后一节,我们从最基础的"为什么需要多模态"出发,一路走到了工业级 VLM 的最前沿。回顾整章内容,几个关键洞察值得反复咀嚼:

  1. Transformer 是当之无愧的"统一接口"

  无论文本、图像、音频还是视频,Transformer 都是大规模下的"最优解"。多模态建模的核心挑战不是"用什么架构",而是"如何把非文本模态塞进 Transformer"。

  2. CLIP 的方法论影响深远

  5 年前提出的对比学习 + 海量弱监督数据 + 零样本能力这套范式,至今仍是 VLM 的基石。SigLIP 的工程改进、Qwen-VL 的视觉编码器选择,都延续了这条路线。

  3. VLM = Encoder + Adapter + LM

  这个三段式范式统治了当前的开源 VLM 生态。LLaVA、Qwen-VL、InternVL 等模型虽然具体细节不同,但骨架高度相似。差异化竞争主要在数据工程、训练流程、loss 设计这些"软"层面。

  4. 理解与生成存在张力

  CLIP/SigLIP 只需要"高层语义",所以 336×336 的低分辨率就够;但 OCR、文档分析需要"细粒度信息",必须用 AnyRes 这样的高分辨率方案。同样,生成端不能简单用 VQ 离散化,必须用扩散模型保持连续信息。没有一种万能方案能同时满足所有需求。

  5. 离散化路线虽优雅但不实用

  Chameleon 的尝试让我们看清"全统一"的代价。文本和图像的统计差异太大,强行离散化会引入训练不稳定和信息损失。连续表示 + 扩散生成的组合在当下是更务实的选择。

  6. 数据是真正的护城河

  无论是 OpenAI 的 CLIP(4 亿未公开数据)、LLaVA 的 158K 合成对话、还是 Qwen 的多阶段训练数据,数据规模和数据质量始终是 VLM 性能的决定性因素。架构可以开源,训练细节可以复现,但高质量数据往往是各家的核心机密。

  7. 跨模态迁移是涌现现象

  LLaVA OneVision 展示的"单图训练 → 多图任务"、"单图 OCR → GUI Agent"等迁移能力,是基础模型范式最迷人的地方。只要任务足够多、足够广,模型能自发学到跨任务的通用能力。这与传统监督学习"一个模型一个任务"的范式形成鲜明对比。

  8. 工业级 VLM 越来越复杂

  Qwen3-VL 的 7 阶段训练、DeepStack 跨层注入、Interleaved M-RoPE……这些工程细节堆叠起来,已经让一个完整 VLM 的训练 pipeline 比早期 LLM 还要复杂。未来多模态领域的突破,很可能来自这些系统性的工程优化,而非单一架构创新。


思考题 ​

  在学完本章后,不妨思考以下问题:

  1. 如果让你从零设计一个 VLM,你会选择连续表示(CLIP 路线)还是离散表示(Chameleon 路线)?为什么?
  2. CLIP 的对比损失和生成式 caption 损失哪个更高效?为什么?(提示:考虑负样本数量与计算复杂度)
  3. SigLIP 为什么能在小 batch 下 work? 从损失函数的角度解释。
  4. AnyRes 的局限是什么? 如果一张超高分辨率的图像被切成了几十个 patch,token 数量会不会爆炸?
  5. DeepStack 把视觉信息注入 LM 的不同层。这和"通过 Adapter 一次性注入"相比,有什么潜在问题?
  6. Chameleon 训练不稳定的根源是文本和图像的熵差异。如果让你设计一个 loss 来缓解,你会怎么做?

参考文献与延伸阅读 ​