ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

从CLIP到SigLIP再到VLM:视觉特征如何对齐到语言模型

从CLIP到SigLIP再到VLM:视觉特征如何对齐到语言模型

视觉大模型这几年迭代得非常快,从最早把图像和文本拉到同一个语义空间的 CLIP,到用 Sigmoid 损失把对比学习做得更干净的 SigLIP,再到现在动辄能"看图说话"的 VLM(视觉大语言模型),这条演进线其实回答了一个很朴素的问题:一张图,到底是怎么被塞进一个只会处理文字的大语言模型里的?很多人第一次接触 VLM 的时候,脑子里会冒出一堆问号——图像明明是像素矩阵,语言模型吃的是 token 序列,这两者中间到底发生了什么?视觉特征是怎么"翻译"成模型能理解的东西的?为什么有的方案要冻结视觉编码器,有的又要联合训练?我前后折腾过几套本地部署的视觉问答流程,也踩过不少坑,这篇就把 CLIP、SigLIP 到 VLM 这条链路拆开讲清楚,从对比学习的原理,到视觉特征如何对齐到文本空间,再到它怎么接进大语言模型,尽量把每一步的"为什么"都说明白。不管你是刚听说 CLIP 想搞懂它到底在干嘛,还是已经在做 VLM 微调想理清底层逻辑,应该都能从里面找到点有用的东西。

1. 先把 CLIP 这件事讲透:它到底对齐了什么

1.1 对比学习不是"分类",而是"配对打分"

很多人第一次看 CLIP,会下意识把它当成一个图像分类器,觉得它输出的就是"这是猫还是狗"。这个理解偏了。CLIP 的核心不是分类,而是判断一张图和一段文字是不是一对。它的训练数据是海量的(图像,文本)配对,比如一张狗的照片配上"一只在草地上奔跑的金毛"。训练目标很简单:让真正配对的图文对在特征空间里靠得近,让不配对的离得远。

具体怎么做的?一个 batch 里假设有 N 个图文对,CLIP 会分别用图像编码器和文本编码器把它们编码成 N 个图像向量和 N 个文本向量,然后算一个 N×N 的相似度矩阵。对角线上的 N 个是真实配对(正样本),其余 N²-N 个是错配(负样本)。训练就是让对角线上的相似度尽量高,非对角线尽量低。这就是所谓的InfoNCE 对比损失。

这个设计的关键在于:CLIP 从来不需要人工标注"这张图是猫",它只需要"这张图和这句话是一起的"。互联网上天然存在大量图文共现的数据,这让 CLIP 能吃到几乎无限规模的训练信号。这也是它泛化能力强的根本原因——它学到的不是某个固定类别的判别边界,而是一个图文共享的语义空间。

1.2 双塔结构:图像和文本各走各的路

CLIP 是典型的双塔(dual-encoder)结构。图像塔通常用 ViT 或者 ResNet,文本塔用 Transformer。两塔在训练时各自独立编码,最后只在算相似度的时候才"碰面"。这个设计带来一个非常实用的好处:图像特征可以预先算好缓存起来。做检索的时候,你不需要每次把图片重新过一遍编码器,只要把文本编码后去和缓存的图像向量做点积就行,速度极快。

但双塔也有代价。因为图像和文本在编码阶段完全没有交互,模型没法做细粒度的跨模态推理。比如你问"图中左边那只猫是什么颜色",CLIP 就很难精确回答,因为它压根没有"左边"这种空间关系的建模能力,它只知道整张图和整句话的全局相似度。这个局限,恰恰是后来 VLM 要解决的问题。

1.3 温度系数与 logit 缩放:一个容易被忽略的细节

CLIP 的相似度计算里有个可学习的温度系数(temperature),通常记作 τ。它作用在 softmax 之前,控制相似度分布的"尖锐程度"。温度低,分布尖锐,模型对正样本的置信度要求高;温度高,分布平缓,梯度更柔和。CLIP 把这个温度设成可学习参数,让模型自己在训练中找合适的尺度。

这个细节在实际微调时很重要。我见过不少人微调 CLIP 时直接固定温度,结果模型收敛得很别扭。原因是不同数据集的相似度数值范围差别很大,固定温度会让 softmax 要么饱和要么过于平坦。建议微调时保留温度可学习,或者至少根据你的数据规模重新初始化一个合理的值。

2. SigLIP 改了什么:从 softmax 到 sigmoid 的那一步

2.1 softmax 对比损失的"全局归一化"之痛

CLIP 用的 softmax 对比损失有个隐含要求:它需要在整个 batch 内做归一化。也就是说,每个样本的损失都依赖于 batch 里其他所有样本。这带来两个实际问题。

第一,batch 必须足够大。batch 小的时候,负样本太少,对比信号弱,模型学不好。CLIP 当年用了三万多的 batch size,这个规模对绝大多数团队来说根本玩不起。第二,多卡训练时通信开销大。因为要跨卡做全局归一化,梯度同步和 all-gather 操作很重,扩展性受限。

2.2 sigmoid 损失:把"多分类"拆成"多个二分类"

SigLIP 的思路很直接:既然 softmax 需要全局归一化,那我干脆不用 softmax,改用sigmoid。具体来说,它不再把 N×N 的相似度矩阵当成一个多分类问题(每行选一个正确列),而是把每个格子当成一个独立的二分类问题——这个图文对是真配对还是假配对?正样本标签为 1,负样本标签为 0,各自算 binary cross-entropy,最后求和。

这个改动看似小,影响却很大。因为每个格子的损失只依赖它自己,不再需要跨样本的全局归一化。这意味着 batch 可以小很多,多卡训练时也不用做昂贵的全局同步。SigLIP 论文里明确说了,在小 batch 下它的表现明显优于 CLIP,而且训练更稳定。

2.3 实际选型:什么时候用 CLIP,什么时候用 SigLIP

从我自己的使用经验看,选型主要看两个维度:算力规模和下游任务。

维度CLIPSigLIP
训练 batch 需求大(数万级)小(数千级即可)
多卡扩展性一般,需全局归一化好,无全局依赖
小数据微调容易过拟合相对更稳
零样本分类成熟,生态全表现相当或更好
生态与工具链极丰富逐步完善

如果你是要做零样本分类、图文检索,而且手头有现成的 CLIP 权重和工具链,直接用 CLIP 系列完全没问题,生态成熟省事。如果你要自己从头训或者在小规模数据上微调,SigLIP 的 sigmoid 损失会让你省心很多,尤其是 batch 上不去的时候。现在不少开源 VLM 的视觉塔已经默认换成 SigLIP 了,比如一些主流的开源多模态模型,视觉编码器用的就是 SigLIP 的变体。

提示:SigLIP 的 sigmoid 损失在实现时要注意正负样本的平衡。如果负样本远多于正样本(N×N 矩阵里这是必然的),直接求和会让负样本主导梯度。常见做法是对正负样本的损失做加权,或者用 focal 式的调制。

3. 视觉特征怎么"翻译"成语言模型能吃的 token

3.1 投影层:一座必须存在的桥

CLIP 和 SigLIP 输出的图像特征是固定维度的向量序列,比如 ViT-L/14 输出的是 768 维。而大语言模型的输入是词嵌入,维度可能是 4096。这两者维度不一样,语义空间也不一样。所以中间必须有一个投影层(projection layer),把视觉特征映射到语言模型的嵌入空间。

这个投影层的形式有好几种。最简单的是一个线性层(Linear),直接把视觉维度映射到语言维度。稍微复杂点的是 MLP,比如两层带 GELU 激活的全连接。还有用Q-Former的,比如 BLIP-2 那套,用一组可学习的 query 向量去"查询"视觉特征,压缩成固定数量的视觉 token。不同方案各有取舍:线性层参数少、训练快,但表达能力有限;Q-Former 表达能力强,能把变长的视觉特征压成固定长度,但训练更复杂,需要额外的预训练阶段。

3.2 视觉 token 的数量:一个被低估的工程问题

一张图经过 ViT 编码后,会产生多少个视觉 token?以 ViT-L/14 为例,输入 224×224 的图,patch size 是 14,那么 patch 数量是 (224/14)² = 256 个,加上一个 cls token 就是 257 个。如果输入分辨率提高到 336×336,patch 数就变成 576 个。这些 token 全都要送进语言模型,会占用大量上下文长度。

这是个很现实的工程问题。语言模型的上下文窗口是有限的,如果一张图就吃掉几百个 token,那多图输入或者长对话就很容易爆。所以实际系统里通常要做视觉 token 压缩。常见手段包括:用 Q-Former 压到固定的 32 或 64 个 token;用池化(pooling)对相邻 patch 特征做聚合;或者用 perceiver 式的交叉注意力做重采样。我实测下来,把视觉 token 从 576 压到 64,在多数问答任务上性能损失很小,但显存和延迟改善非常明显。

3.3 拼接方式:视觉 token 放在哪,影响很大

视觉 token 投影完之后,怎么和文本 token 拼在一起送进语言模型?这也有讲究。最常见的是前缀拼接:把视觉 token 放在文本 token 前面,形成 [视觉token][文本token] 的序列。语言模型的自注意力机制会让后面的文本 token 去 attend 前面的视觉 token,从而实现"看图"。

但前缀拼接有个问题:视觉 token 和文本 token 在语义上是有"断层"的,模型需要额外的训练才能学会跨越这个断层。有些方案会在视觉和文本之间插入特殊的分隔 token,或者用特殊的 attention mask 来控制可见性。还有的方案(比如一些早期工作)用交叉注意力层,让文本 token 通过 cross-attention 去查询视觉特征,而不是简单拼接。这两种路线各有拥趸,前缀拼接实现简单、易于扩展,交叉注意力则更接近"原生多模态"的设计。

4. VLM 的训练范式:冻结、对齐、联合,到底怎么选

4.1 三阶段训练:为什么不能一步到位

现在主流的 VLM 训练基本遵循一个多阶段范式,虽然具体划分各家不同,但核心逻辑类似。

第一阶段是视觉-语言对齐。这时候通常冻结视觉编码器和语言模型,只训练中间的投影层。目的是让投影层学会把视觉特征映射到语言模型能理解的语义空间。这个阶段数据量可以很大,但训练目标相对简单,就是图文对或者简单的描述生成。

第二阶段是指令微调。这时候会解冻语言模型(有时也解冻视觉塔的高层),用图文指令数据训练,让模型学会按照人类指令去描述图像、回答问题。这个阶段的数据质量比数量更重要,需要精心构造的问答对。

第三阶段是偏好对齐(可选)。用人类反馈或者 AI 反馈来进一步优化模型的输出风格和有用性,类似语言模型里的 RLHF/DPO。

为什么要分阶段?因为如果一上来就联合训练所有参数,视觉塔的梯度会非常嘈杂,容易把预训练好的视觉表征破坏掉。分阶段训练相当于先搭好桥,再让两岸的交通顺畅起来。

4.2 冻结视觉塔 vs 解冻:一个反复被讨论的取舍

视觉塔到底该不该解冻,这个问题在社区里争论了很久。我的经验是:看你的数据规模和任务类型。

如果你的下游任务和预训练视觉塔的领域差异很大(比如医学影像、遥感图像),那解冻视觉塔(至少解冻高层)是必要的,否则视觉特征根本不适配你的领域。但解冻的代价是显存占用上升、训练不稳定、容易过拟合。这时候通常用较小的学习率,配合 layer-wise learning rate decay。

如果下游任务是通用的图文问答,而且数据量不大,那冻结视觉塔、只训投影层和语言模型,往往性价比最高。我做过对比实验,在几万条通用 VQA 数据上,冻结视觉塔的方案和全解冻方案性能差距在 1-2 个点以内,但训练成本差了好几倍。

4.3 数据配比:视觉指令数据的"隐形陷阱"

做 VLM 微调,数据配比是个大坑。很多人把大量纯文本指令数据和图文指令数据混在一起训,结果发现模型的语言能力没退化,但视觉能力提升很慢。原因在于图文数据的比例被稀释了。

我的建议是,在视觉指令微调阶段,图文数据应该占主导,纯文本数据只保留一小部分用来防止语言能力灾难性遗忘。具体比例没有定论,但图文:纯文本在 4:1 到 10:1 之间是比较常见的区间。另外,图文数据的任务多样性比单一任务的数据量更重要。描述、问答、推理、定位,这几类任务都要有,否则模型容易偏科。

5. 本地部署 VLM 时踩过的那些坑

5.1 显存不够:视觉塔和语言模型谁更吃显存

本地部署 VLM,第一个拦路虎就是显存。很多人以为语言模型是大头,其实视觉塔在高分辨率下也很吃显存。ViT 的注意力是 patch 数量的平方复杂度,分辨率翻倍,patch 数翻四倍,注意力矩阵就翻十六倍。所以如果你要处理高分辨率图像,视觉塔的显存占用可能超出预期。

实操上,几个有效的省显存手段:降低输入分辨率(但会损失细节)、用梯度检查点(gradient checkpointing)、把视觉塔量化到 FP16 或 INT8。我实测下来,把视觉塔单独量化到 INT8,精度损失很小,但显存能省下不少。

5.2 图像预处理:被忽视的"对齐"问题

CLIP 和 SigLIP 在训练时对图像做了特定的预处理:resize 到固定尺寸、归一化用的均值和方差也是固定的。如果你部署时预处理不一致,视觉特征就会偏移,下游表现会明显下降。这个坑我踩过——当时用了默认的图像加载库,归一化参数和训练时不一致,结果模型回答质量肉眼可见地变差。后来统一了预处理流程,问题就消失了。

注意:不同视觉塔的预处理参数不一样。CLIP 用的是 OpenAI 那套均值和方差,SigLIP 用的是另一套。部署前一定要查清楚你用的权重对应哪套预处理,别想当然。

5.3 视觉 token 与上下文长度的博弈

前面提过视觉 token 会占用上下文。本地部署时,如果你的推理框架对上下文长度有限制,多图输入或者高分辨率输入很容易触发截断。这时候要么压缩视觉 token,要么增大上下文窗口(但显存会涨)。我的做法是根据任务动态调整:单图问答用较高分辨率,多图对比用较低分辨率加 token 压缩,在效果和资源之间找平衡。

5.4 配置文件格式:YAML 还是别的

现在不少本地部署工具用 YAML 来管理配置参数,模型路径、量化方式、上下文长度、采样参数都写在里面。YAML 的好处是可读性好、层级清晰,改起来直观。但要注意 YAML 对缩进极其敏感,一个空格错了整个配置就废了。我建议改配置时用带 YAML 校验的编辑器,改完先跑一遍语法检查再启动,能省不少排查时间。

6. 从特征对齐到真正"看懂":还差什么

6.1 对比学习学到的是"全局相似",不是"细粒度理解"

回到最开始的问题:CLIP 和 SigLIP 把视觉特征对齐到了文本空间,但这个对齐是全局的、粗粒度的。它们擅长判断"这张图整体上是不是关于这个主题",但不擅长回答"图中第三个物体是什么颜色"这种需要空间和关系推理的问题。VLM 通过把视觉特征接进语言模型,借助语言模型的推理能力,在一定程度上弥补了这个短板。但要注意,视觉塔本身的能力上限,决定了 VLM 的视觉理解上限。如果视觉塔压根没编码某个细节,语言模型再强也推理不出来。

6.2 视觉特征增强:几个实用的方向

如果你想让 VLM 的视觉理解更强,除了换更大的视觉塔,还有几个方向可以试。一是多尺度特征融合,把不同分辨率的视觉特征拼起来,兼顾全局和细节。二是区域级特征,先用检测或分割模型框出感兴趣区域,再对每个区域单独编码,喂给语言模型。三是视觉 token 的层次化组织,让语言模型能按需关注不同粒度的视觉信息。这几个方向在近期的研究里都有不少探索,实际效果因任务而异。

6.3 一个常被问的问题:VLM 能替代专用视觉模型吗

经常有人问,有了 VLM,是不是就不用单独训练检测、分割模型了。我的看法是:短期内不能替代,但能互补。VLM 强在开放域的问答和推理,弱在精确定位和密集预测。检测和分割任务需要像素级的输出,VLM 的输出是文本 token,天然不适合。但 VLM 可以作为"调度器",理解用户意图后调用专用的视觉模型,这种组合在实际系统里越来越常见。

7. 一些实操层面的经验补充

7.1 微调 CLIP 时学习率怎么设

微调 CLIP 的视觉塔,学习率通常要比从头训练小一到两个数量级。我一般从 1e-5 到 5e-6 起步,配合 warmup。文本塔的学习率可以稍大一点,因为文本塔的预训练表征相对更"通用",微调空间更大。如果只训投影层,学习率可以到 1e-4 甚至更高,因为投影层是随机初始化的,需要快速收敛。

7.2 评估 VLM 不能只看 loss

VLM 的训练 loss 和实际生成质量的相关性没那么强。loss 降了,生成的可能还是胡言乱语。所以评估一定要用生成式指标,比如人工评估、GPT 打分、或者任务特定的准确率。我习惯在训练过程中定期抽样生成,人眼看几条,比盯着 loss 曲线有用得多。

7.3 视觉塔的选择:不是越大越好

ViT-L 比 ViT-B 大,但不一定在你的任务上更好。大视觉塔需要更多数据才能训好,小数据下反而容易过拟合。而且大视觉塔的推理延迟高,本地部署时体验会打折。我的建议是先用中等规模的视觉塔跑通流程,确认任务可行后再考虑升级。

7.4 关于"视觉特征增强"的一个误区

有人觉得视觉特征增强就是简单地把特征维度堆高、把 token 数加多。其实不然。特征的质量比数量重要。一个经过良好对齐的 64 维视觉 token,可能比一堆没对齐的高维特征更有用。增强的核心是让视觉特征携带更多对下游任务有用的信息,而不是单纯增加信息量。

8. 写在折腾之后

从 CLIP 到 SigLIP 再到 VLM,这条线走下来,我最大的体会是:视觉进入语言模型这件事,本质上是一个"翻译"问题。CLIP 和 SigLIP 解决的是"把图像翻译成文本语义空间里的向量",投影层解决的是"把这个向量翻译成语言模型能吃的 token",而 VLM 的训练范式解决的是"让语言模型学会理解这种翻译后的输入"。每一层翻译都会损失信息,也会引入偏差,理解这些损失和偏差在哪,比记住某个模型的参数量更有用。

实际做项目的时候,我越来越倾向于"够用就好"的原则。不是每个任务都需要最大的视觉塔、最多的视觉 token、最复杂的训练范式。先跑通最小可行流程,测出瓶颈在哪,再针对性优化,往往比一上来就堆配置更高效。视觉大语言模型这个方向还在快速演进,今天的最佳实践明天可能就被推翻,但底层的对齐逻辑和工程取舍,短期内不会变。把这些搞明白,换什么模型都能快速上手。

返回列表