ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

从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. 视觉特征怎么翻译成语言模型能吃的 token3.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×336patch 数就变成 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 不能只看 lossVLM 的训练 loss 和实际生成质量的相关性没那么强。loss 降了生成的可能还是胡言乱语。所以评估一定要用生成式指标比如人工评估、GPT 打分、或者任务特定的准确率。我习惯在训练过程中定期抽样生成人眼看几条比盯着 loss 曲线有用得多。7.3 视觉塔的选择不是越大越好ViT-L 比 ViT-B 大但不一定在你的任务上更好。大视觉塔需要更多数据才能训好小数据下反而容易过拟合。而且大视觉塔的推理延迟高本地部署时体验会打折。我的建议是先用中等规模的视觉塔跑通流程确认任务可行后再考虑升级。7.4 关于视觉特征增强的一个误区有人觉得视觉特征增强就是简单地把特征维度堆高、把 token 数加多。其实不然。特征的质量比数量重要。一个经过良好对齐的 64 维视觉 token可能比一堆没对齐的高维特征更有用。增强的核心是让视觉特征携带更多对下游任务有用的信息而不是单纯增加信息量。8. 写在折腾之后从 CLIP 到 SigLIP 再到 VLM这条线走下来我最大的体会是视觉进入语言模型这件事本质上是一个翻译问题。CLIP 和 SigLIP 解决的是把图像翻译成文本语义空间里的向量投影层解决的是把这个向量翻译成语言模型能吃的 token而 VLM 的训练范式解决的是让语言模型学会理解这种翻译后的输入。每一层翻译都会损失信息也会引入偏差理解这些损失和偏差在哪比记住某个模型的参数量更有用。实际做项目的时候我越来越倾向于够用就好的原则。不是每个任务都需要最大的视觉塔、最多的视觉 token、最复杂的训练范式。先跑通最小可行流程测出瓶颈在哪再针对性优化往往比一上来就堆配置更高效。视觉大语言模型这个方向还在快速演进今天的最佳实践明天可能就被推翻但底层的对齐逻辑和工程取舍短期内不会变。把这些搞明白换什么模型都能快速上手。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表