上一讲第 15 讲:3D 视觉 下一讲第 17 讲:机器人学习

第 16 讲:视觉与语言

Vision and Language —— 本讲是客座讲座:来自华盛顿大学(UW)的 Ranjay Krishna 教授(RAIVN 实验室共同主任,曾于 2020、2021 年执教 CS231N)系统讲解多模态基础模型(multimodal foundation models)。主线是一条清晰的演进史:先从"一个任务训一个模型"讲到"一次预训练、处处适配"的基础模型范式;再看视觉侧的第一块基石——CLIP 如何把 SimCLR 的对比目标搬进图文联合空间、如何用文本编码器做零样本分类(zero-shot)、CoCa 又如何加上生成式描述目标;接着进入多模态大语言模型:LLaVA 的"CLIP 特征 + 线性投影 + LLM"、Flamingo 的门控交叉注意力与 Perceiver Resampler、交错图文数据的掩码训练;随后直面开源与闭源的巨大差距(LLaVA 约 43% vs GPT-4o 约 80%),以及老师自己团队的开源模型 Molmo 如何靠"指向(pointing)"与 70 万对人工精标数据追平 GPT-4o;最后把输出空间从文本扩展到掩码——SAM(Segment Anything Model),以及把一切模型串起来的"链式调用"(VisProg 视觉编程)。贯穿全讲的一个反复出现的主题:高质量数据是这些模型真正的秘诀

本讲概览:

老师开场指出:过去几年领域最大的变化,是从"为每个任务收集数据、训练专用模型、测试"的旧范式,转向基础模型(foundation model)——在多种技能、多种任务上大规模预训练,之后用极少(甚至零)数据适配新任务(GPT 即典型)。本讲按四条支线展开:(一)视觉侧的基础模型:CLIP 用双塔(图像编码器 + 文本编码器)和对称对比损失在 4 亿互联网图文对上训练,配合"a photo of a dog"式的提示工程即可零样本分类(本质是文本嵌入上的 1 近邻),在 ObjectNet 等分布外数据上远超 ImageNet 监督模型,被称为"第一个图像基础模型";CoCa 在对比损失之外再加一个生成式描述(captioning)解码器,各项平均提升约 10%,从此社区放弃了图像编码器的监督训练目标。但 CLIP 有硬伤:组合性缺失(分不清"草上的马克杯"和"马克杯里的草")、依赖超大 batch(如 32,000)与难负样本、缺少空间 grounding。(二)多模态大语言模型:LLaVA 把 CLIP 编码器倒数第二层的 patch 特征经一个可训练线性层投影成"图像 token",与文字一起喂给 LLM 自回归生成;Flamingo 则创新了融合方式——图像特征经 Perceiver Resampler 降采样后,通过门控交叉注意力(gated cross-attention)注入 LLM 的每一层(LLM 与视觉编码器全部冻结,只训新增模块),并用"图像-文本交错 + 注意力掩码"的数据让每个描述只看它对应的那张图,从而支持多轮对话、多图比较、上下文学习与少样本 OCR/数学。(三)开源追赶:GPT-4o、Gemini 1.5、Claude 等闭源模型在 11 个基准上平均约 80%,开源蒸馏模型(Qwen、InternVL、Phi)只有约 43%,且社区"只会蒸馏、不会从零造出";老师团队的 Molmo 以全开放(权重/数据/代码)、870 人 32.5 万次两两对比的用户研究(Elo 仅次于 GPT-4o 一分、胜过 Gemini 1.5 Pro 与 Claude 3.5)回应之,秘诀是让模型把决策落在像素上——先指出数的是什么再报数,以及 70 万对"说出来而非打出来"的高密度人工标注(相对位置、大小、材质、布局)对抗互联网文本的"附属性"。 (四)任意输出空间与链式调用:SAM 用"图像编码器 + 提示编码器(点/框/文本)+ 轻量掩码解码器"三件套和"一次输出三个粒度掩码、只惩罚最接近真值者"的歧义消解策略,配合把掩码数据扩 400 倍的人在环流水线,成为分割的基础模型;最后 VisProg(视觉编程,CVPR 2023 最佳论文)让 GPT 面对问题时生成调用检测器/分割器等工具的 Python 程序,实现单个模型做不到的计数、推理与图像编辑——这正是当下多模态智能体(agent)的雏形。

一、开场:从"一事一模型"到基础模型

本讲由客座讲者 Ranjay Krishna 主讲——他是华盛顿大学计算机科学与工程学院的助理教授、RAIVN 实验室共同主任,研究横跨计算机视觉、自然语言处理、机器人与人机交互;他曾在 2020、2021 年执教 CS231N,开课那年恰逢疫情,三周内把全部课程搬到了线上。今天的主题是多模态基础模型(multimodal foundation models)

他先回顾了本课程一直沿用的旧范式:为单个任务构建单个模型——收集一个训练集与测试集,训练一个非常专门的模型(图像分类器、作业里做过的图像描述模型),最后在测试集上评估。而最近几年领域发生的真正变化,是从这些"一事一模型"转向基础模型(foundation model):先在极其多样的技能与任务上预训练一个模型,之后再按需适配到具体任务。最熟悉的例子就是 GPT:它在互联网 Common Crawl 数据上训练,之后可以适配数学题、符号推理、问答琐事等各种任务,而且这种适配往往只需要极少量数据,甚至完全不需要新数据

基础模型并没有统一的定义(社区对"什么算基础模型"常有分歧),但通常有几个共性:对许多不同任务都稳健且通用(同一模型可用于各种场景);参数量巨大训练数据海量;且通常用某种自监督目标训练。本讲的路线图是四类多模态相关的基础模型:其一,为图像分类构建的基础模型(CLIP、CoCa);其二,把课上讲过的语言模型与视觉基础模型组合成能解决各种任务的多模态基础模型;其三,让模型的输出不再限于文本,还能输出分割掩码、图像;其四,链式调用(chaining)——把一堆基础模型串起来做全新的任务。语言类基础模型(ELMo、BERT、GPT、T5)本讲不展开。

二、CLIP:把对比学习搬进图文空间

2.1 从 SimCLR 到"给表示空间加上文本"

记得几讲之前的自监督学习:SimCLR 用对比目标(contrastive objective)训练——同一张图的两个增强版本在特征空间里被拉近,与批内其他图像(狗、猴子)的表示被推远。希望在于:学到的表示足够一般化,以至于看到新的东西(比如猫的素描)时,它仍会把素描嵌到与照片猫相近的位置,让概念依旧容易分类。

走向多模态的想法非常自然:如果往这个表示空间里加入文本会怎样?假设文本 "a cute fluffy cat"(一只可爱的毛茸茸的猫)的嵌入恰好落在猫图像表示的附近,"my favorite dog is a golden retriever"(我最喜欢的狗是金毛寻回犬)的嵌入更靠近金毛而不是别的狗,那么我们就可以同时用图像和文本两种方式查询这个空间。这就是把自监督目标扩展到文本与其他模态的总体思路。

2.2 双塔结构与对称对比损失

CLIP(OpenAI,2021)的结构是"双塔":左边仍是图像编码器,右边换成一个文本编码器,文本编码器嵌入的是每张图的描述。训练方式与 SimCLR 完全同构:收集海量图文对(image-text pairs),按 mini-batch 喂入,批内做对比。设一个 batch 有 \(N\) 对样本,图像嵌入为 \(I_1, \ldots, I_N\),文本嵌入为 \(T_1, \ldots, T_N\),计算所有图像-文本的相似度(如余弦相似度,除以温度 \(\tau\)),得到一个 \(N \times N\) 相似度矩阵,其中对角线是配对的正样本,其余为负样本。目标是双向对称的:

$$L_{i2t} = -\frac{1}{N} \sum_{i=1}^{N} \log \frac{\exp(I_i \cdot T_i / \tau)}{\sum_{j=1}^{N} \exp(I_i \cdot T_j / \tau)}$$
$$L = L_{i2t} + L_{t2i}$$

第一个损失让每张图的嵌入最接近它自己的描述、远离批内其他文本;第二个损失对称地让每段文本最接近它对应的图像、远离其他图像嵌入(即在相似度矩阵的列方向上再做一次同样的交叉熵)。两个模态之间由此形成互补对称的损失

算个例子

用一个 \(N=4\) 的小 batch 走一遍损失。设四对样本为(狗图,"a dog")、(猫图,"a cat")、(卡车图,"a truck")、(香蕉图,"a banana")。看"狗图"这一行(已除以温度 \(\tau\)):与四个文本的相似度为 \(s = (8, 2, 5, 3)\)。softmax 之后:\(\exp(8) \approx 2981\),\(\exp(2) \approx 7.4\),\(\exp(5) \approx 148\),\(\exp(3) \approx 20\),归一化后狗图分给自己文本的概率约 \(2981/3156 \approx\) \(94.5\%\),交叉熵损失 \(-\log(0.945) \approx 0.057\),已经很小。现在换成"难负样本"的情形:若批里恰好还有一只长得很像的猫,相似度变成 \((8, \mathbf{7}, 5, 3)\),则 \(\exp(7) \approx 1097\),狗图给自己文本的概率跌到约 \(2981/4246 \approx\) \(70\%\),损失升到 0.35 左右——梯度会全力把狗和这只难猫推开。这正是后面讲"为什么 CLIP 需要超大 batch"的直觉:负样本越多、越难,推得越细。列方向(文本找图)的计算完全对称。

CLIP 最大的优势之一是训练数据唾手可得:互联网上有海量图文配对,下载下来就能以非常大的规模训练。OpenAI 在 2021 年发布的 CLIP 正是这么做的:从互联网收集大量图文对,用对比目标训练。训练完,走大家熟悉的两阶段流水线:第一步预训练;第二步把图像编码器拿出来,在其上接一个线性层适配图像分类或检测任务,或接一个解码器输出语义分割图——很多任务都因这个预训练初始化而受益。论文发布时最激动人心的结果就是:仅加一个线性分类器(linear probe)就在大量分类数据集的平均性能上取得巨大提升(图中红色的 CLIP 系列全部位于顶端),且训练图像越多性能越好——人们由此确信:找到了一个真正可规模化的预训练目标,而互联网上的图文对近乎无限。

三、CLIP 的零样本分类:让文本编码器当"分类器"

3.1 语言模型的启示:一切任务都是自动补全

但故事没完。理想情况下我们希望拿到 CLIP 就直接用(out of the box),而不是总要再适配。想想语言模型:它用"自动补全(autocomplete)"预训练——输入 "I love",模型补出下一个词(如 "cake")。第二阶段适配新任务时,语言模型从不需要重新训练:每个任务都可以写成语言,因而每个任务都能被当成自动补全。CLIP 的问题在于它没有自动补全过程:对比目标训出来的模型,换新任务仍需要训练数据和线性层。于是大家开始琢磨怎么直接用它。

3.2 零样本分类 = 文本空间上的 1 近邻

人们想出的聪明技巧是:用文本编码器引导模型泛化到任何下游分类任务。流程:把新数据集的所有类别——比如 plane、dog、bird——逐个喂进文本编码器,得到"plane 向量""dog 向量""bird 向量";新图像来了,用图像编码器嵌入,然后找最近邻:哪类文本向量与图像嵌入相似度最高,就分成哪类(例子中狗图与 dog 向量相似度最高,判为狗)。整个流程可以看成构造了一个"单近邻(one nearest neighbor)算法":文本空间里预先生成的一组嵌入充当类别中心,新图像嵌入过来做一次最近邻检索即可。取哪个向量取决于架构:ResNet 取最终的特征向量;Transformer/ViT 编码器通常取 CLS token

3.3 提示工程与提示集成:一个短语值 1.3 个点

单个词往往得不到好的词向量——因为 CLIP 是用互联网短语训练的,网上很少出现孤零零的单词。所以更好的做法是用短语:把类别改成 "a photo of a plane" / "a photo of a dog" / "a photo of a bird"。就这么一个小改动,ImageNet 上立刻提升约 \(1.3\%\)。当然,挑出"对的短语"本身很难,所以常见做法是提示集成(prompt ensemble):为每个类别想很多短语——"a photo of a dog"、"a drawing of a dog" 等——把它们的向量取平均,得到该类的均值向量,然后照旧做 1 近邻。

3.4 为什么 CLIP 泛化得这么好?

老师现场提问:为什么 CLIP 比 ImageNet 监督训练泛化好得多?他认可同学给出的回答:互联网文本远比类别标签丰富——它包含大量结构信息,关于形状、颜色的信息,这些都进入并表示之中,使模型面对略分布外、长得略不一样的物体时仍有其他线索可依。第二个原因是数据规模:ImageNet 只有约 130 万张图,而互联网上有数亿到数十亿可以轻松下载的图文对——模型见过的数据多了太多,适配自然容易。人们随后在各种泛化任务上验证:素描数据集、对抗样本数据集上表现都很稳健。在 CLIP 之后发布的 ObjectNet 是个好例子:里面是人们把物品放在非常奇怪的位置拍的照片——香蕉扔在地上、烂香蕉特写,即"非典型形态"。ImageNet 训练的模型在 ObjectNet 上表现很差(ImageNet 里每个类别几乎都是最典型的形态),而 CLIP 表现依旧好——对一个完全没见过、甚至有点域外的数据集的这种泛化能力让所有人兴奋。零样本(zero-shot)与线性探针(linear probe)的对比也显示:多数数据集上训练线性层有帮助,但有些任务 CLIP 零样本直接就非常好。这就是为什么很多人把 CLIP 称为第一个图像基础模型

3.5 CLIP 为什么能成:模型与数据的规模化

CLIP 本身没有任何"真标签"——只是下载图文关联。它能成,靠两件事:模型规模化(架构从 ResNet 换成 ViT,用约 3.07 亿参数的 Transformer 训练)与数据规模化(从 ImageNet 的约 120 万张图,跳到从互联网下载的约 4 亿图文对)。两者叠加带来了巨大性能提升。

3.6 CoCa:对比之外再加上"把图说清楚"

CLIP 出来后社区立刻开始各种变体,其中 2022 年的 CoCa(Contrastive Captioners)最为突出。CoCa 保留了完全相同的对比部分——图像一边编码、文本一边编码、之间对比损失——但额外加了一个解码器:取图像编码器的特征,通过交叉注意力(cross-attention)喂给解码器,让它生成图像的描述(captioning)。动机是一个假设:只判断"这是猫还是狗"不够,要用文本把图描述出来,需要模型学到多得多的信息,因此是更强的学习目标,能学出更好的特征。结果证明确实如此:CoCa 相比 CLIP 在所有 ImageNet 变体上大幅提升,跨数据集平均提升约 10%。老师认为这是一个转折点:基础模型第一次全面超过了监督学习训练出来的模型;在线排行榜上性能逐年上扬,从那以后,大家放弃了为图像编码器训练监督目标,转而专注于用互联网数据做自监督/多模态预训练。

拓展

CLIP 的家族与遗产。CLIP 之后涌现了一大批"对比式图文模型":OpenCLIP 社区复现并公开了各种规模的训练配方;SigLIP(2023)把 softmax 对比换成逐对的 sigmoid 损失,不再要求整个 batch 做全局归一化,小 batch 下更高效,已成为许多 VLM 的默认视觉编码器;EVA-CLIPDFN-CLIP(Data Filtering Networks)等则证明老师提到的"数据过滤"是核心杠杆——用已有 CLIP 给互联网数据打分、只保留高质量子集再训练,性能显著提升。另一个方向是提示学习(prompt tuning):CoOp/CoCoOp 把手写提示换成可学习的连续向量,让零样本分类器可以小样本微调。今天几乎所有多模态大模型(包括本讲后面的 LLaVA、Molmo)的视觉端,仍然直接或间接地站在 CLIP 这块基石上。

四、CLIP 的优势与硬伤

4.1 优点:好训、快推、开放词表、可链式组合

4.2 组合性缺失:分不清"杯子里的草"

接下来是坏消息。CLIP 分不清这两张图:"草地上的马克杯"(mug in grass)与"马克杯里装的草"(grass in some mug)——两者概念相同(mug、grass),但关系组合不同,CLIP 完全无法区分。这被称为缺乏组合性(compositionality):把概念与其相互关系组合起来的能力在表示中是缺失的。Winoground、CREPE、ARO 等一系列基准反复验证了这一点——老师特别提到其中不少基准就出自他自己的实验室,它们一次又一次地发现 CLIP 有大量做不到的事。

4.3 batch size、难负样本与"柯基困境"

机制

为什么 CLIP 的学习目标依赖 batch size?如果 batch 不够大,批内其他元素很可能提供不了任何有用的监督:如果你的负样本永远是"猫 vs 卡车"这种悬殊对比,你其实学不到猫的精细表示,只会得到一个"高层还行"的表示。增大 batch,才更可能撞上与猫相似的其他动物——这些难负样本(hard negatives)逼迫模型真正学习。把 batch 拉到 32,000、跨许多 GPU 训练,模型突然开始学到非常好的表示,甚至能分清威尔士柯基与另一种柯基——这只有巨型 batch 才可能,因为需要批里恰好存在足够近的难负样本。但即便如此,增大 batch 也不保证学到好表示:你仍然受制于训练数据采样的随机性;而 32,000 的 batch 对绝大多数实验室来说大到不现实。社区的对策是手工构造含难负样本的 batch(放一只柯基就再放另一只柯基)——"难负样本训练"火爆了整整一年,直到老师团队发布后续论文指出:用难负样本训练,反而会让模型"忘掉"很多语义,在不同环境与数据集上的泛化显著变差(原因至今没有理论解释)。如何构造正确的数据集、正确的 batch 与训练信号,仍是很远的前沿。

4.4 grounding 缺失与数据不够

此外,图像级描述仍然不够:我们不仅想知道"有人过马路",还想知道人在哪个位置、车在哪、街道在哪——这些定位/接地(grounding)信息在 CLIP 中完全缺失(理想的数据集与模型都应能推理这类信息)。最后,无论数据集多大——哪怕收集超过 50 亿张图——仍然不足以覆盖所有重要事物,因此数据过滤(data filtering)(如何从互联网筛出最好的训练数据)成了当今该领域研究的前沿之一。

五、多模态大语言模型:LLaVA 与 Flamingo

5.1 动机与一段前史

接下来是第二类基础模型:近两三年流行起来的多模态语言模型(multimodal language models),常被称为视觉-语言模型(VLM)。动机:语言模型的下一 token 预测(自动补全)过程非常擅长适配大量新任务——那图像模型能不能也这么做?给它一张图,让它以类似自回归的方式进行各种推理?这催生了 VLM 这类模型。不过历史上得说清楚:这个想法并非 2022 年才出现——2019 年的 ViLBERT 就把图像模型与语言模型拼在一起追求跨任务泛化,只是当时还在前 Transformer 时代、大多用 LSTM。现在的"重生"(LLaVA 等)换上了更好的架构、更好的目标,不再针对单个任务训练,而是用互联网预训练目标在多种任务的地基上训练。

5.2 从自回归的视角理解 VLM

先回到 Transformer 的自注意力:语言模型做的是"关注过去(attend over the past)"——输入一串词,比如 "cats are so",模型在历史上下文上做注意力,生成下一个词 "cute"。所谓视觉-语言模型,通常指给对话补充额外的上下文:把我们所关心的图像"接地"进来——把图像以某种方式 token 化,把图像 token 与文字历史("cats are so …")一起喂给语言模型,让它自动补全关于这张图的后续文字。这就是 LLaVA 的基本思想:图像 token 与已生成的词一起持续喂入,不断生成更多关于这张图的词。

5.3 LLaVA:CLIP 特征 + 线性投影 + LLM

核心问题变成:图像 token 怎么定义?LLaVA 的方案是直接用 CLIP 图像编码器。CLIP 的 ViT 把图像切成 patch,每个 patch 得到一个表示进入 Transformer,经过多层处理,最后每个 patch 位置各有一个 token,外加一个 CLS token。到此为止我们只用过 CLS token(对比目标监督的正是它),而其余 patch token 从未被任何目标监督过——它们可能不含多少有用信息,实证上确实也不太好用。但经验发现:往前退一层,取倒数第二层(penultimate layer)的特征非常好用——这些特征本就用于生成最终 CLIP 嵌入,同时保留了大量空间信息(物体在图里的位置)。这正是大家把 CLIP 编码器与 LLM 组合时的标准做法。

于是 LLaVA 的完整架构是:图像 → 预训练 CLIP 编码器 → 取倒数第二层的一堆特征 → 经过一个需要训练的线性层 → 得到 LLM 能理解的 token → 与文字一起喂入语言模型,模型即可围绕图像展开对话。线性层的作用就是把 CLIP 表示翻译成 LLM 的"语言"。

5.4 Flamingo:把视觉特征注入 LLM 的每一层

LLaVA 之后(按老师讲课的顺序;历史上 Flamingo 发表于 2022 年、略早于 2023 年的 LLaVA,老师此处按影响力叙述),Google 很快发布了 Flamingo。它同样组合视觉编码器特征与大语言模型,但创新点在"如何融合":LLaVA 是特征过线性层后作为输入的一部分;Flamingo 则把视觉特征喂进 LLM 的每一层,为此对 LLM 架构本身做了修改:

机制

门控交叉注意力长什么样?在每个 LLM 层之前插入一个交叉注意力组件:它对图像特征做注意力(决定这一层需要保留图像的哪些部分、哪些对语言模型有用),随后接一个 tanh 非线性门——tanh 输出在 \((-1, 1)\) 之间,起到"决定保留哪些成分、遗忘哪些成分"的门控作用;接着过一个全连接层微调表示,再接一个 tanh 门再次筛选;每个组件都带残差连接。之后才进入正常的语言模型层继续生成。有趣的是,这个改动写成代码只有两三行(加一个交叉注意力层 + tanh 门),但对模型而言是巨大变化——它获得了在每一层自主决定何时、以何种方式关注视觉特征的能力。训练上的关键设计:语言模型与视觉编码器的权重全部冻结,只训练 Perceiver Resampler 和这些新加的交叉注意力层。

5.5 Flamingo 的训练:交错图文数据 + 注意力掩码

Flamingo 的训练数据不是孤立的一图一句,而是把多张图与多段文字串接成交错序列(interleaved image-text):开头一句"这里是我宠物们的可爱照片",然后第一张图 + 对它的描述,第二张图 + 对它的描述…… 模型被训练成自动补全对最后一张图的描述。这里有一个精心的掩码方案(masking scheme):生成某张图的描述时,只允许注意那张图的视觉特征,不许看其他图——描述"我的小狗坐在草地上"时只看小狗图的特征,描述猫时只看猫图。但整体训练时模型仍能看到完整上下文。为什么要这样?因为它直接解锁了多图多轮的应用(下一小节)。有同学问"是不是把图也拼进输入序列"?老师澄清:技术上图像 token 是经 Perceiver Sampler 进入 LLM 每一层的,真正被拼接送进输入的只有文本,模型自行选择何时关注图像的哪部分。另一个幕后细节:网页界面上多轮对话看似每次只给增量,实际上服务端会缓存模型状态(假设用户还会继续说),随时准备接受更多 token;若不缓存,就要整段对话重新作为输入跑一遍。

5.6 Flamingo 能做什么:多轮对话、多图、上下文学习

Flamingo 展示的三类能力都围绕"多图/多轮"展开:

Flamingo 的影响超出单项成绩:很多过去必须费力适配 CLIP 才能做的难任务,它零样本/少样本就能做,各基准出现巨幅提升。老师认为正是从这时起,领域从只报告几个分类基准,转向报告任何理解任务——只要能表述成问答过程,就能为各种技能建基准,这已成为近两年视觉领域的常态。

拓展

连接器的演进与高分辨率。Flamingo 的"Perceiver Resampler + 门控交叉注意力"后来被 BLIP-2(2023)的 Q-Former 继承发展:用一组可学习的查询向量从冻结的图像编码器里"压榨"出固定数量的视觉 token;而 LLaVA-1.5(2023)证明简单的两层 MLP 投影就足够好,成为开源 VLM 的事实标配——本讲 Molmo 用的也正是"CLIP + 线性连接器 + LLM"这一简单配方。另一个工程重点是分辨率:老师答复提问时提到,如今可以用类似 NaViT 的机制(无需把图 resize 到固定尺寸,位置嵌入随图像尺寸插值变化)让模型支持任意分辨率输入并在新尺度上正确指向;LLaVA-NeXT / InternVL 的 AnyRes、Qwen-VL 的动态分辨率都是这一思路的产物,高分辨率切块再合并已成为细粒度 OCR 与文档理解的标配。此外,把同样的"视觉 token + 自回归"配方扩展到视频(如 Video-LLaVA、Qwen2.5-VL 对视频的时空 token 化)是 2024 年以来的另一条主线。

六、闭源巨头、开源差距与 Molmo 的逆袭

6.1 11 个基准上的鸿沟与"只会蒸馏"的困境

时间来到去年:看到 LLaVA 的成功,各公司重金投入,陆续发布了一批 API 模型:GPT-4o、GPT-4V、Gemini 1.5 Pro、Gemini 1.5 Flash,Anthropic 也带着 Claude 3 Opus 入场(老师补充:现在 Claude 4 Opus 也已发布)。下图是 11 个流行视觉理解基准的平均性能,差距是断层式的:开源的 LLaVA 平均只有约 43% 准确率,而 GPT 等模型在 75–80% 上下。看到差距后,大家立刻开始把 GPT 和 Gemini 蒸馏成开源变体:阿里的 QwenInternVLPhi 等模型接连出现,全都蒸馏自 GPT(否则就是 Gemini)。

这带来一个大问题,也是老师自己研究议程的核心:整个研究社区其实并不知道怎么从零构建高性能视觉-语言模型。那些"配方"只掌握在 OpenAI、Google 这些团队手里;开源社区只能蒸馏——模型看起来不错,但"并不真正开放":我们能生产它们,却不能复现它们。一旦 GPT 不存在,我们并不知道怎么造出这些模型。老师团队近一两年的工作就是缩小这个差距、把构建高性能多模态模型的知识扩散给整个社区。

6.2 Molmo:权重、数据、代码全开放

成果就是 Molmo(图表最顶端)。它与所有其他模型的区别是完全开放开放权重(可下载模型)、开放数据(可下载训练集与评测集)、开放代码(家里 GPU 够多就能自己训一个 Molmo,也能评测、加新评测、适配各种新用途)。学术基准之外,团队更关心"人们会不会真的用它、会不会愿意用它而不是 GPT",于是发布了 Playground 并做了大规模用户研究:约 870 名用户、约 32.5 万次两两对比(让用户在两个模型的输出里挑更喜欢的)。结果:Molmo 的 Elo 评分排名第二,与 GPT-4o 只差 1 分——基本是"掷硬币"级别的偏好差距;已经胜过 Gemini 1.5 Pro 和 Claude 3.5。考虑到这是一个小型学术实验室对抗 Google、Anthropic 数十亿美元投入并追平 GPT,非常振奋。团队还发布了紧跟其后的 70 亿参数模型——可以放进单张 GPU,让很多人都能拿去微调各种视觉任务。模型于 9 月 25 日发布后社区反响热烈,反复涌现的一个用例是机器人应用(下一讲正题,此处先给预告);连 NVIDIA 的人也在讨论"无论私下做多少模型开发,永远不要和开源对赌——开源社区迟早追上来"。Molmo 发布后,Meta 很快响应式地发布了 Llama 3.2(字幕作 LLaVA 3.2),而在多份对比评测中 Molmo 依旧占优。

6.3 Molmo 的秘诀:把决策落在像素上

Molmo 为什么这么好?诀窍是让模型的决策"落地"(ground)在像素本身。以计数为例:通常问模型"图里有几艘船",它会吐一个数,而且经常幻觉(hallucinate);Molmo 的不同在于它先把要数的东西逐个指出来——在每艘船上生成一个点——然后才输出最终数字。决策过程有像素级证据支撑。更反直觉的是数据:Meta 的模型用了约 60 亿图文对训练,而 Molmo 只用了 70 万图文对——最大的差别在于这 70 万对是人工精心挑选与标注(hand-curated)的。

为什么互联网数据不行?因为互联网文本是"附带的(incidental)":图像旁边的文字往往描述上传者的主观感受,很少真正描述图像内容本身。而 Molmo 的数据是图像实际内容的稠密描述,并且包含大量人们在互联网上永远不会说的信息:没有人会写"A 在 B 的左边"——这太显然了,谁会去交流这种信息?但这类信息(相对位置大小——large、形状——rectangular、材质——polished、布局——"横贯画面水平方向")恰恰是模型需要的。再如一张平板/手机屏幕的照片,标注会写出"这是一台平板设备、当前时间是多少、剩余电量是多少"——这类能真正帮到用户的信息,互联网上根本没人写。

数据工程

怎么把这些"没人会说"的信息引导出来?团队花了两年做各类引导式标注(elicitation)研究,设计大量问题,搞清楚互联网上缺失哪些信息、如何最有效地引导标注者说出它们。其中一个关键决定:让标注者不要打字,而是"说"出描述——开口描述会自动打破许多围绕格赖斯会话准则(Gricean maxims)的惯性(比如"不废话"的默契),人们会说出许多平时绝不会打出来的内容。至于模型本身:架构与 LLaVA 一模一样——CLIP 编码器进来,一个线性层做连接器,LLM 接收全部 token 后输出任何你想要的东西。最大的差别在数据——数据的质量与密度。这与 Flamingo、SAM 的故事指向同一个结论:真正高质量的数据,才是这些模型高性能的关键;而很多视觉任务的数据在互联网上完全缺失,必须自己出去收集。

6.4 指向能力带来的应用

因为有了指向(pointing)能力,Molmo 能做许多其他模型做不到的事:指到菜单项(告诉你那个菜单位置在哪)、指到"我在哪里设置搜索选项"、指到中等大小的数据集选项并告诉你该挪哪个;除了"指着数数",还能做细粒度任务——问"这辆公交的路线号是多少",Molmo 不是只报答案,而是先指出号码在图中的位置,再返回号码;还能推理"左边的车多还是右边的车多",能在深度图、俯拍图、拥挤的体育场馆上推理。被反复问到的分辨率问题,老师答复:如今可以把这类模型适配到任意分辨率——存在类似 NaViT 的机制允许任意尺寸图像输入,位置嵌入随图像大小变化,模型通常能良好泛化,在新尺度上照样指向。

最后是指向与链式调用的结合(预告第七节):把 Molmo 的输出接给 SAM 2——让 Molmo 指向板球拍,把这个点喂给做分割的 SAM 2,就能对板球拍做跨时间的分割。团队还在办公室玩了个机器人 demo:让 Molmo 指向水瓶在哪,用简单的运动规划器把机器人挪过去;再让它把水瓶挪到"脏盘子"那里——模型指向水槽,机器人过去;再指向水槽里的空位,把瓶子放进那个位置。把能力组合起来,就能自动化许多机器人应用——把视觉-语言模型的泛化能力带进物理世界,正是老师课题组现在的重点方向之一。

拓展

2025–2026 年的开源 VLM 格局。Molmo 之后,"开放数据 + 高质量人工标注"的路线被广泛验证:团队后续公开了 PixMo 数据集(Molmo 的全部标注来源),社区在其上继续训练;阿里的 Qwen2.5-VL / Qwen3-VL、上海人工智能实验室的 InternVL 2.5/3、Meta 的 Llama 3.2 Vision 等陆续把开源平均分推到与闭源第一梯队互有胜负的水平,文档/图表理解、视频理解、GUI Agent(让模型用指向操作屏幕元素)成为新的主战场——Molmo 的"指向"设计正是 GUI Agent 与机器人操控接口的先声。另一个值得注意的趋势是"大一统":GPT-4o、Gemini 2.x 等原生多模态模型不再采用"视觉编码器 + 连接器 + LLM"的拼接,而是让多种模态从头在同一个 Transformer 里联合训练;而老师在本讲强调的判断——封闭团队掌握配方、开源靠数据与开放追赶——依然是这个领域最重要的结构性事实。

七、SAM:把输出空间推广到掩码

7.1 目标:任意类别 + 用户想要什么就分割什么

最后二十分钟,老师把基础模型推广到"任意输出空间"。这一支的代表是 Segment Anything Model(SAM,分割一切模型,2023):目标是做一个面向所有分割任务的的基础模型。两个目标:(1)泛化到任意类别——超越固定类别数,用户指什么就能对什么输出掩码;(2)精确输出用户真正关心的东西。两个目标对应两个挑战:如何收集覆盖海量类别的数据;如何设计一个能"掐准用户意图"的架构。

7.2 架构:图像编码器 + 提示编码器 + 轻量解码器

先看架构(针对第二个挑战)。要指定"我要什么",光打字是不够的——需求本身常常有歧义:图里有两只猫,用户说"我要猫的分割",到底要哪只?如果用户能点一下想要的那只猫,再按点出掩码,歧义就小多了。SAM 因此由三个组件构成:

7.3 一个点仍嫌歧义:一次输出三个掩码

机制

即便用户点了点,歧义仍在。用户点在剪刀上要掩码:这个点可能指整把剪刀、可能只指可以握的环状部分、也可能只指其中一个环。这种歧义极难消解,而你不想因为模型选了"错"的那个就惩罚它。SAM 的做法:不是输出一个掩码,而是输出三个不同粒度(granularity)的掩码(整体/部分/子部分),训练时只挑与真值最匹配的那个来计算损失,不惩罚其余。期望模型随时间学会输出各种粒度的掩码,由用户选择哪个最适合自己的用途。这是一个很干净的"歧义消解进损失"的设计。

7.4 数据:图像 6 倍、掩码 400 倍、人在回路

架构齐了,剩下的就是数据——需要横跨海量类别的大量数据。问题在于 2023 年 SAM 出现之前,分割数据集都极小。作者们把当时已有的分割数据规模一口气放大:图像约 6 倍、掩码约 400 倍,最终达到数百万张图像。怎么做出来的?一个人在环(human-in-the-loop)/ 模型在环的流水线:先标注少量数据 → 用它训练模型 → 用模型去提议(propose)更多数据的分割 → 人工修正模型的分割 → 迭代往复。数据长这样:一张蔬菜图里每一种蔬菜都有各自独立的掩码,非常昂贵;伞群、水下场景、甚至油画都有分割。这一切加在一起,才成就了这个"分割的基础模型"。老师再次强调与 Flamingo、Molmo 一致的信息:要真正高质量的数据,才能把模型做到尽可能好;而很多视觉任务的数据在互联网上完全缺失,必须自己出去找、去收。

拓展

从 SAM 到 SAM 2。2024 年的 SAM 2 把"分割一切"推广到视频:在流式记忆(streaming memory)的支持下,只需在某一帧点一下,就能在整段视频中跟踪并分割该目标——这正是本讲"Molmo 指向 → SAM 2 分割板球拍跨时间"链条的由来。围绕 SAM 还生长出一整个生态:Grounded SAM(DINO 检测 + SAM 分割实现文本到掩码)、 医疗垂直领域的 MedSAM、以及把 SAM 掩码作为像素级"工具"接入多模态大模型的众多方案——第六讲的教训(高质量数据)加上本讲的"可提示(promptable)"设计,使分割从专项任务变成了基础模型能力。

八、链式调用:把模型串成程序

8.1 课堂练习:GPT 描述 + CLIP 分类

多模态语言模型的最后一块拼图是链式调用(chaining):把不同模型组合起来,实现单个模型做不到的事。老师现场做了个小练习:给出四张图与四个类别,这些类别有些同学都没见过,也是 CLIP 没见过的——CLIP 直接失败,完全不知道哪个对应哪个。现场互动中,同学们认出了 marimba(马林巴琴)是第二张图,也认出了相对容易的 viaduct(高架桥)。接着老师给出这些词的描述——突然之间,把每个类别与正确的图配对变得非常容易。这就是链式调用的核心思想:即使 CLIP 没见过这些图像,这些概念大概率在互联网上被谈论过,GPT 很可能能描述它们;而 CLIP 见过海量"描述",于是 GPT 生成的描述就成了极好的分类依据。这样就能对大量 CLIP 中没有训练数据的类别做分类——各种细分的花、汽车、物种、宠物——在细粒度、专业化类别的数据集上看到明显提升。这背后是"取一个模型之长(GPT 的世界知识),补另一个模型之短(CLIP 只认得见过的概念)"。

8.2 VisProg:让 GPT 写程序调用视觉模型

链式调用的范式化成果,是去年拿下最佳论文奖VisProg(Visual Programming,视觉编程)。想法:对任何问题——任何关于图像的问题——让模型生成一个程序:程序里写"对图 1 回答某事、对图 2 回答某事,再把答案组合起来"。程序是一个 Python 函数,函数内部是对一个个现成模型的调用。例一(计数):"船上有三个人吗?"——不必直接问多模态语言模型,可以调用课上学过的目标检测器:检出三个人的三个框,三个检测 ⇒ 三个人。例二(多图推理):"两张船上一共有六个人吗?"——程序对图 1 做检测、对图 2 做检测,再把检测数加起来。例三(判断题):判断"左右两图总共包含六个人和两艘船"是否成立,可以让 GPT 写一个程序来回答,再取程序输出。要让 GPT 写出正确的程序,需要把可用的"函数"告诉它——你可以用目标检测器定位物体、可以用人脸检测器定位人脸,等等;也可以给它程序的上下文示例(in-context examples),展示别的函数怎么用,模型能泛化到新问题并灵活组合已有功能。

8.3 示例怎么选、代价是什么、往哪走

选择上下文示例有两种方式:静态——尽量给多样的示例、祈祷泛化;动态——针对当前问题检索最合适的示例再让它生成程序,效果通常更好,但前提是有一个好的检索系统。有同学问代价:确实不小——调 GPT 要走 API,各个模型要依次加载进显存并串行执行,整体可能比单模型贵得多。因此当下(2025 年)研究的重点之一是:能否把这些能力蒸馏进单一模型;当然,如何有效地做链式调用本身也仍是热点。另有同学提议"可以把它看成智能体(agent)"——老师认同:这就是一个 agent,决定"给定问题,我需要哪些模型帮忙、怎么把它们缝起来完成新能力"。

8.4 一个图像编辑的例子

链式调用还能做图像编辑:想把沙漠里的沙地替换成茂盛的绿草。直接编辑模型仍处幼年期,更稳的做法是——先调用分割模型识别出沙漠区域,只把这些像素替换成草,再把结果合成(composite)回原图,得到新图。

拓展

从视觉编程到多模态智能体。VisProg 之后,ViperGPT(用 GPT-4 写 Python 调用工具)、Chameleon(GPT-4 与专家模型即插即用协作)迅速跟进,"LLM 当规划器 + 视觉模型当工具"成为标准架构。它与当下大热的 tool use / function calling / agent 是同一件事:模型不再只被链式调用,而是自己决定调用顺序、读取中间结果、必要时自造工具。老师在本讲结尾问答中提到的"系统能自动收集训练数据、为新能力自建工具"的初步实验,正是这条线的前沿;而本讲的伏笔——Molmo 的指向接 SAM 2、指向接机器人——则说明视觉基础模型的输出(点、框、掩码、程序)正在成为智能体的"手"。下一讲的机器人学习会正式接上这条线。

九、收尾总结与问答

老师总结本讲:所谓基础模型,说到底是为一个任务训练模型,再从这单一任务泛化到许多下游应用的能力。具体地:分类上,可以从互联网取海量图文对、一起训练,泛化到现实中可能没有标签、甚至不存在的数据集;与语言模型组合后,可以训练它做上下文示例的描述、计数、OCR 等各种能力;输出也不必是语言或类别,还可以是分割掩码(随用户输入不同而不同);更进一步,把许多基础模型(甚至小模型)通过程序组合起来,又能做出全新的事情。

问:幻觉(hallucination)怎么办?老师坦言幻觉在所有模型里都普遍存在;他们的结果显示指向确实能明显减少幻觉——因为生成必须先找到像素层面的证据;但这没有保证,模型完全可能指错。应对方向:其一是收集更多与目标推理相关的数据;更好的是建立验证(verification)机制——依据点判断输出是否可信。大型公司的做法通常不是单一模型直接出答案,而是把输出再经过一层层验证器才送到用户面前,能缓解部分问题;如何降低幻觉并提高真实准确率,仍是活跃的研究线。

问:当能力需要模型没有的工具时,它能自造工具吗?可以。已有一些初步实验:告诉模型"我想要这个能力",系统能自动收集训练数据、为特定用途构建工具——这条线仍处幼年,正是团队在做的方向,很多研究者都对它感到兴奋。

十、本讲要点回顾

上一讲第 15 讲:3D 视觉 下一讲第 17 讲:机器人学习