
【斯坦福CS231n 学习笔记12】Vision and Language
学习了视觉语言模型的基本发展过程。
目前为止,前面所学习的内容的解决思路都是先将问题拆分成一个个独立的任务,然后为每个任务各自收集数据、训练一个高度专门化的模型、最后在该任务的测试集上做评测。这个流程在工程上是可控的,但是也天然将模型的能力锁死在任务边界中,只要换了一个数据域、换了一种问题表述、换了一套标签体系,一切都要重新来过。
过去两三年的一个明显变化就是开始训练基础模型,先使用大规模、强多样性的预训练把通用表征/通用技能压缩进同一个模型中,再使用 fine-tuning/few-shot/zero-shot 等轻量适配将其迁移到下游任务上,与其为每个任务从零训练,不如将训练成本集中在一次大预训练上,然后让下游任务都去复用这份能力底座。
一个基础模型的特征大体如下:
- 几乎总是泛化与鲁棒:同一个模型能够覆盖许多不同任务/用例,而不是只能在单一 benchmark 上刷分。
- 经常会规模很大:参数量大、训练数据大、很多能力依靠规模。
- 自监督目标:训练信号来自数据内部结构或跨模态对齐,而不是依赖昂贵的人工标签。
目前基础模型可划分如下:
而我们主要关注的是与视觉相关的。
- 视觉分类底座:例如 CLIP/CoCa 这一类将图像表征做成可检索、可开放词表的模型范式。
- 视觉+语言:将视觉 token 接到语言模型上,形成可对话、能推理、能上下文的多模态语言模型。
- 不同输出形态:不仅能够输出文本,还能够输出 segmentation masks,甚至生成图像。
- Chaining:将多个模型像工具一样串联起来,组合出单一模型做不到的能力。
Classification
从 SimCLR 到 CLIP
在 SimCLR 的视角中,对一个 batch 中的样本 ,做两次随机增强 得到两张视图 ,,编码器 后面通常接上一个投影头 输出向量,并且进行归一化:
然后把 当作 positive pair,batch 里其他样本的视图当作 negatives,用 InfoNCE 这类对比目标去实现“拉近 / 推远”的几何约束。例如 batch中含有猫狗等动物,那么两种猫的增强应该彼此更近,而与狗、猴子之类的表示保持距离。
如果这个空间真的学习到了语义,而不是学习某种脆弱的像素统计,那么当输入变成猫的素描或者狗的素描时,其仍然应该落到猫/狗各自的簇附近,从而让下游线性分类或最近邻检索变得容易。
这种对比学习实际上是在对齐同一语义的不同视角,那么除了图像增强,文本也应该能够作为同一语义的另一种视角。例如如果能把短语 “a cute fluffy cat”的文本向量嵌到同一个空间里,并且它靠近猫图像的表示,那么就可以用文本去查询图像;如果能把 “my favorite dog is a golden retriever”嵌进去,并且它靠近金毛图像的表示、远离其他狗,那么语义检索/开放词表分类就自然出现了。
SimCLR 左右两边都是 image encoder,而图文对齐的版本只需要保留左侧 image encoder,将右侧换位 text encoder,然后在同一个 batch 内进行对比学习即可,这样就得到了 CLIP:
- 左塔:图像编码器 ,将图像 编码为向量 。
- 右塔:文本编码器 ,将文本 编码为一个向量 。
训练时取一个 batch 的配对数据 , 分别得到
然后构造一个 的相似度矩阵:
其中 是温度系数,用于控制 softmax 的尖锐程度。
本质上是对比学习,因此匹配的图文被拉近到分子中,其他不匹配的都在分母中被推远,将其写成公式,常见的做法是两条交叉熵:
- Image → Text:
- Text → Image:
最后总损失通常取两者平均:
因为不仅希望图像最接近它自己的文本并远离其他文本,也希望文本最接近它自己的图像并且远离其他图像,因此需要对称性。如果只做单向,模型仍然可能在另一个方向上出现几何退化,例如本文空间坍塌或出现奇怪的非对称邻域结构,而对称损失等价于将跨模态检索作为训练期就要满足的双向约束。
CLIP 能训练的另一个关键因素就是数据来源较为廉价,互联网天然就有大量图像及其伴随文本,因此可以将训练的规模堆得很大。
在训练结束以后,模型能够直接输出任意图像与任意文本之间的相似度分数,将视觉模型的接口从固定类别的分类器改写成了可自由组合的语义匹配器,下游任务只要能够改写为找到最匹配的文本,就能够将问题落到相似度空间中解决。
Zero-shot CLIP 分类
传统的分类中,最后一层的 softmax 分类器本质上是一组固定的权重向量 ,每个类别一个向量;预测时对图像特征 做 得到 logit,然后 softmax。而 CLIP 训练结束后会得到一个图像编码器和一个文本编码器,它们已经被对比学习对齐到同一语义空间当中,类别向量不需要通过监督学习再训练,而是直接由文本编码器从自然语言生成,分类变成了一个图像与类别描述文本的匹配问题。
假设下游任务(比如 ImageNet 分类)有 个类别 。不再随机初始化一个 并通过梯度下降来训练它,而是利用预训练好的文本编码器 来生成这些权重。对于每一个类别标签 ,将其填入一个提示模板,例如 "a photo of a {label}"。这样做的目的是为了解决多义词问题(比如 “boxer” 既可以是拳击手也可以是狗,加上 “a photo of a” 限定了这是视觉描述),并弥补预训练数据分布(通常是句子)与单独单词之间的差异。
生成的文本描述 被送入文本编码器:
将所有 个类别的向量堆叠起来,就得到了临时的分类器权重矩阵 。
对于一张测试图像 ,通过图像编码器提取特征:
然后计算图像特征与所有类别文本特征的余弦相似度(即点积,因为已归一化),并缩放温度系数 :
最后通过 Softmax 得到属于每个类别的概率:
零样本能够在下游任务中,模型不需要针对该任务的训练集进行任何微调,也不需要见过该任务特定的类别标签,就能够直接进行分类。传统监督学习模型在 ImageNet 上训练后,如果测试集变成了素描图或渲染图,性能会大幅下降,因为模型过拟合了特定的像素统计特征,而 CLIP 学习的是语义,因此其准确率能够与传统监督学习模型相当且在分布外的数据也能表现良好,通过自然语言作为监督信号,模型学习到了更本质的视觉概念。此外,由于 CLIP 对文本输入敏感,因此使用单一的提示词可能效果不好,使用 "a photo of a {label}" 比单独使用 {label} 准确率提升显著。如果同时使用多个模板(如 "a photo of a big {label}", "a drawing of a {label}")并对生成的文本向量取平均,还能进一步提升分类性能。这是在不改变模型权重的情况下,仅通过调整输入来提升效果的早期形式。
CoCa
CLIP 的本质上是判别式的对齐,给定一批图像和文本,学会把正确匹配的相似度拉高,而 CoCa 的关键改动是保留 CLIP 的图文对比损失,再引入一条生成式路径,引入一个 decoder,将图像编码器的特征通过 cross-attention 给到 decoder,让模型生成/补全图像描述,这样对比损失仍然存在,并且图像描述的过程能够让模型学习到更多丰富的信息。
CoCa 的架构在 CLIP 的基础上进行了不对称的改造:
- Image Encoder:标准的 ViT,输出视觉特征。
- Text Encoder:被拆分为两部分
- Unimodal Text Decoder:仅处理文本输入,不看图像,这部分的输出用于和图像特征做对比损失,类似与 CLIP。
- Multimodal Text Decoder:在文本特征的基础上,通过 Cross-Attention 引入图像特征,这部分的输出用于预测下一个 Token,即生成损失。
CoCa 的训练目标是两个 Loss 的加权和:
其中 : 确保图像向量和文本向量在全局空间对齐(CLIP 目标),而 : 标准的自回归语言建模目标(Next Token Prediction),。
CLIP 风格的模型的主要优势是训练目标简单,推理很快;尤其是当整个数据集都被嵌入到向量空间后,分类可以退化成“最近邻检索”,所以不仅能做分类,也天然适合 search / retrieval。更重要的是 open-vocabulary:任何文本描述都可以作为查询,因而能横跨很多不同的域。
但是也有其缺点:对比损失函数的有效性高度依赖于极大的 Batch Size,因为只有足够多的负样本才能提供充分的判别信号,这导致了高昂的计算成本与显存门槛。其次,CLIP 的文本编码器表现出明显的“词袋”特性,虽然能敏锐捕捉物体是否存在,却极度缺乏组合性与句法理解能力,例如它难以区分“mug in grass”与“grass in mug”这类包含相同名词但逻辑关系相反的场景;此外,由于对比目标仅追求全局语义对齐,图像特征在经过编码与池化后丢失了大量像素级的空间结构信息,导致模型在处理方位关系或精细计数任务时表现拙劣;最后,对比损失本质上是一种弱监督信号,仅要求模型区分正负样本而无需重构细节,限制了模型的输出形式,使其无法进行开放式的对话或描述,这直接推动了领域向结合了 LLM 推理与生成能力的 VLM 演进。
LM+Vision
LLaVA
最早的视觉语言模型不是 LLaVA,而是 ViLBERT。
但是 ViLBERT 需要对每个任务单独进行微调,而 LLaVA 则不再为特定的视觉任务训练专用头部,而是将视觉理解转化为语言生成任务,利用 LLM 强大的下一个 Token 预测能力来实现通用的视觉推理。
传统的语言模型通过注意力机制回顾历史文本上下文来预测下一个词,例如输入"Cats are so",模型预测 “cute” 。而LLaVA 则是将图像翻译为 LLM 能够理解的 Token 序列,并将其作为额外的上下文输入给模型。
于是目标就变成了寻找带语义、带空间结构且能够被 LM 消化的视觉特征,如果直接使用 CLIP ViT 末层的 patch tokens 作为图像 token,其效果并不好,CLIP 的对比学习主要监督的是 CLS Token 去对齐文本,而其他的 patch token 在目标函数中并没有被明确要求携带可用信息。因此通常选择往回退一层。
CLIP 编码器倒数第二层的特征保留了 Patch 级别的空间网格信息,对于理解物体在图像中的具体位置和细节至关重要。为了将这一层特征输入到 LLM 中,LLaVA 引入了一个简单的可训练线性层作为连接器,其将视觉特征的维度投影到 LLM 的词嵌入空间中,经过投影后,视觉特征在数学表示上就等同与文本的 Word Tokens,LLM 无法区分这些向量最初是来自像素还是单次,从而实现统一处理。投影后的视觉 Token 与用户输入的文本 Tokens 被拼接到一起,输入到 LLM 中。
LLaVA 通常冻结视觉编码器和 LLM 的大部分参数,主要训练这个线性连接层(以及部分 LLM 参数,视具体设置而定),使其学会根据视觉输入进行对话。
Flamingo
Flamingo 的设计历年不再简单地将图像 Token 拼接在输入端,而是通过一种复杂的交叉注意力机制将视觉信息注入到大语言模型的每一层中。
为了保留预训练模型中蕴含的丰富知识并降低训练成本,Flamingo 采取了严格的冻结策略,使用预训练的视觉编码器(冻结)提取特征以及预训练的大语言模型(冻结),仅训练新插入的连接模块。
- Perceiver Resampler:不同的图像可能有不同的分辨率,且特征图的大小可能很大,直接输入 LLM 会导致计算量激增,于是引入 Perceiver Resampler,其是一个小型的 Transformer 模块,能够将任意大小的视觉特征图转换为固定数量的视觉 token,这不仅统一了输入维度,还显著降低了计算复杂度。
- GATED XATTN-DENSE:在 LLM 的每一层 Self-Attention 之前,插入一个 Cross-Attention 层。该层使用文本 Token 作为 Query,视觉 Token 作为 Key 和 Value,从而让语言模型查询视觉信息。为了防止初始训练时视觉噪音破坏 LLM 原有的语言能力,该模块的输出经过一个 tanh 门控机制,门控参数初始化为 0,这意味着在训练初期,模型只依赖纯语言能力(即跳过视觉信息),随着训练进行,门控逐渐打开,引入视觉特征。
Flamingo 使用的训练数据主要有交织数据格式与因果掩码机制。
- Interleaved Image-Text Data:训练数据不是简单的单图-单文对,而是图像-文本-图像-文本的长序列,这种格式模拟了网页的结构,其中图像和文本交替出现:
- Causal Masking:为了确保生成的逻辑性,Flamingo 设计了特殊的掩码方案。当模型生成 Image 1 的描述时,其只能够通过 Cross-Attention 看到 Image 1 的视觉特征,而被禁止看到 Image 2 及之后的图像。而 LLM 的 Self-Attention 允许模型看到之前所有的文本历史,这种设计使得模型能够基于之前的对话历史进行推理,同时精确地将描述对应到特定的图像上。
得益于上述的架构和数据策略,Flamingo 得到了多模态领域下的类似 GPT-3 的上下文学习能力。用户可以通过在提示词中提供几个示例来教模型执行新任务,而无需更新模型权重。
开源社区突破与 Momo
在 LLaVA 之后,虽然开源社区涌现了大量模型,但直到 2024-2025 年间,开源模型(如 LLaVA)与闭源商业模型(如 GPT-4V, Gemini 1.5 Pro)之间仍存在巨大的性能鸿沟。在 11 个主流视觉理解 Benchmark 上,早期 LLaVA 的平均准确率约为 43%,而 GPT-4V 等模型则高达 70%-80%。许多开源模型实际上是“蒸馏”模型,即使用 GPT-4V 生成的数据进行训练。这意味着社区并没有真正掌握从头构建高性能 VLM 的方法,一旦闭源模型停止服务,开源界将无法复现其能力。
Momo 模型的出现旨在填补这一空白,其核心贡献不在于架构的复杂化,而是数据质量与 Grounding。
开源社区在追赶闭源模型(如 GPT-4V)的过程中,Momo 模型揭示了一个关键的“以数据为中心”的范式转变,即数据的质量远重于数量。传统观点往往迷信于暴力扩展数据规模,例如 Meta 使用了 60 亿图文对,而 Momo 仅凭 70 万条精标数据就达到了与之持平的竞技场表现。这种反直觉的结果源于对互联网原始数据“伴生性”缺陷的修正:网络上的 Alt-text 往往充斥着用户的主观感受或背景故事,忽略了颜色、纹理、绝对空间位置等显性视觉信息;为此,Momo 团队构建了包含精确空间关系和细粒度属性的“高密度描述”数据,并采用了口述而非打字的采集策略以保留更详尽的视觉颗粒度,证明了高质量数据才是提升模型视觉理解力的核心。
为了解决视觉语言模型普遍存在的幻觉问题,Momo 引入了像素级Grounding机制,强制改变模型的输出空间以实现决策的“实证化”。这意味着模型在生成文本回复的同时,必须输出对应的像素坐标,例如在执行计数任务时,模型不仅要给出数字,还必须在图像上逐一标记出物体的位置。这种“指称”机制迫使模型在生成文本前必须寻找确凿的视觉证据,如果模型无法在像素层面定位物体,就难以编造虚假的描述,从而显著降低了幻觉率,确保了生成的文本是严格基于图像像素内容的。
与许多仅公开权重甚至仅是“蒸馏”自闭源模型的开源工作不同,Momo 强调了权重、代码与数据的全栈开源,尤其是那 70 万条核心数据资产的公开为社区提供了从头复现高性能模型的路径。这不仅证明了 7B 参数量的小模型在高质量数据驱动下完全可以匹敌庞大的闭源模型,而且由于其可以在单张 GPU 上高效运行,Momo 迅速成为了机器人感知层与多模型串联系统中的标准本地化底座,为具身智能等下游应用提供了可控且高性能的视觉理解支持。
Segement Anything Model(SAM)
传统模型通常受限于封闭的类别集合,例如只分割“人”、“车”等预定义类别。SAM 视图实现两个层面的泛化:
- 类别泛化:能够分割从未见过的物体。
- 交互泛化:能够响应用户的任意意图提示,包括指出、框选或文本描述。
这两个泛化目标面临着两个问题:歧义性,即分割意图往往是模糊的;数据稀缺,互联网上缺乏大规模的高质量掩码数据。
为了解决歧义性,SAM 设计了统一的 Prompt 接口:文本/点/框都可以作为 prompt 输入:
SAM 可以抽象成 Image Encoder、Prompt Encoder 以及 Lightweight Mask Decoder。其中 Image Encoder 将图像编码成稠密特征图 ,可以是 MAE 或 CLIP 变体,这部分的计算量较大,但是对每张图只计算一次。Prompt Encoder 将用户提供的 Prompt 编码为 Token ,prompt 的形态可以文本、点、框等。Lightweight Mask Decoder 用一个相对轻量的编码器,将 映射为 mask。
在交互式分割中,歧义性、是无法通过 Prompt 本身完全消除的物理属性。例如,当用户在一个像素点上点击时,数学上无法确定用户是指该点所属的子部件 (Sub-part)(如剪刀的手柄)、物体本身 (Part)(如整把剪刀),还是包含该物体的整体 (Whole)(如桌子)。如果强制模型只输出一个“正确”答案,模型往往会陷入混乱,输出一个模糊的平均结果。SAM 通过以下机制解决这一问题:
- 一图三掩码: SAM 放弃了单输出假设,而是让 Mask Decoder 默认同时输出 3 个掩码。这三个输出头在设计上是相同的,但在训练过程中会自动分化,通常对应三个不同的语义粒度:Whole、Part、Sub-part。这种设计涵盖了绝大多数情况下的潜在意图。
- 赢家通吃训练策略: 为了让这三个头真正学会输出不同粒度的掩码,而不是坍缩成三个一样的结果,SAM 采用了一种特殊的训练策略:对于每个训练样本(包含图片、提示点、Ground Truth),模型生成 3 个预测掩码。计算这 3 个掩码与 Ground Truth 的损失。仅选择损失最小(即与 GT 最接近)的那个掩码来进行反向传播,忽略另外两个掩码的误差。这种“只奖励最优解”的机制鼓励了多样性,使得模型不仅不惧怕歧义,反而能够枚举出所有合理的解释。
- 置信度排序:为了在推理时帮助用户选择,SAM 还会并行预测每个掩码的 IoU 分数。这代表了模型对该掩码质量的置信度,用于对这三个输出进行排序,或在自动模式下自动选择最高分的那个掩码 。
而为了解决数据稀缺的问题,SAM 团队构建了一个数据引擎,通过“人机回环”的方式制造数据。该引擎分为三个阶段:首先是利用现有模型辅助人工标注,点击生成掩码后人工修正。而后是模型自动分割高置信度物体,人工专注于标注困难物体。最终模型足够强大,对 1100 万张图像进行全自动分割,生成了 11 亿 个掩码,构成了 SA-1B 数据集。
Chaining
随着基础模型数量的增加,单一模型往往难以解决复杂的、多步骤的推理任务。Chaining 的核心思想就是将不同的基础模型(如 LLM、CLIP、SAM、Object Detectors)像积木一样串联起来,利用大语言模型作为控制器或者大脑来调度这些工具,从而涌现出单一模型所不具备的复杂能力。
Knowledge Chaining
这是一种利用 LLM 的世界知识来增强视觉分类器(如 CLIP)的方法。CLIP 是基于互联网图文对训练的,对于极其生僻或细粒度的类别(例如一种名为 “Morima” 的花),CLIP 可能因从未在训练数据中见过该标签而无法分类。虽然 CLIP 没见过 “Morima” 的图片,但 LLM(如 GPT)在文本语料中读过它的描述。于是可以让 GPT 生成该类别的视觉描述(例如:“一种有紫色花瓣和黄色花蕊的花”)。将生成的描述作为 Prompt 输入给 CLIP 的文本编码器,与图像特征进行匹配。这样通过组合 LLM 的知识库与 CLIP 的视觉匹配能力,就能够实现对未见类别的零样本分类。
Visual Programming & Agents
对于涉及逻辑运算、计数或多步推理的复杂问题(例如:“这两艘船上总共有多少人?”),直接让 VLM 回答容易产生幻觉。
不再让 LLM 直接输出答案,而是让 LLM 生成一段可执行的程序,LLM 接收自然语言指令(如“统计两张图的人数之和”),LLM 生成调用特定视觉 API 的代码。例如:
系统执行这段代码,调用专门的物体检测模型(Object Detector)来获取精确的 n1 和 n2 。最终返回计算结果。这种方法将 LLM 视为一个智能代理。它不需要自己看图,而是负责任务分解和工具调度 (Tool Dispatching),将感知任务外包给最擅长的专用模型(如检测器、OCR、SAM 等)。
参考如下:
https://cs231n.stanford.edu/index.html
