多模态预训练这个词儿,这两年几乎是AI社区绕不开的热词。微信团队放出的《视觉语言预训练:基础、最新进展和未来趋势》这份102页综述,我前后精读了两遍,第一遍快速通读脉络,第二遍逐节抠细节,确实值得拿出来好好聊聊。它把VLP(Vision-Language Pretraining,视觉语言预训练)从萌芽期到现在的技术演进,按基础、最新进展、未来趋势三条线拆得很干净,而且不是那种简单罗列论文的综述,更像是一张带选型视角的技术地图。
这份材料适合三类人:一是正在做多模态算法研发的工程师,想找技术选型依据和对比基准;二是做搜索、推荐、内容理解相关业务的从业者,想看看视觉语言模型能怎么接进自己的系统;三是刚入门的研究生或者打算转岗做多模态方向的同学,需要一个体系化的知识框架,而不是零散刷论文。我在这里把收获拆开讲,同时结合自己实际复现和落地VLP时踩过的坑,尽量让不同基础的读者都能接得住。
1. 为什么VLP值得专门花102页去讲
1.1 VLP到底在解决什么问题
先说清楚VLP解决的痛点。过去很长一段时间,CV和NLP是两个几乎不相往来的领域:图像分类、目标检测用CNN那一套,文本理解靠RNN、Transformer那一套。但真实世界里的信息天然是跨模态的,一张商品图配一段描述,一条视频配一条弹幕,一个朋友圈九宫格配几句文案。传统做法是把图像打标签、把文本做关键词,然后在标签和关键词层面做匹配,但这种方式一旦遇到“穿着红色裙子的狗”“夕阳下的海边公路”这类语义组合查询,基本就失效了。
VLP的核心目标,是让模型在统一的表征空间里同时理解视觉和语言,学到跨模态的对齐关系。模型看过几亿对图文数据之后,能够做到给一张图,知道该配什么文字;给一句话,能召回最相关的图像;甚至完全没见过某个类别,也能靠文本描述做Zero-shot分类。典型任务包括图文检索(Image-Text Retrieval)、视觉问答(VQA)、图像描述(Captioning)、Zero-shot分类等。
微信团队出这份综述,其实也贴合他们自己的业务土壤。公众号文章、视频号、朋友圈,这些场景里有大量自然产生的图文内容和视频内容,多模态模型在内容理解、搜索推荐、审核分发上都有直接的用武之地。工业场景的强需求,正好是多模态技术最好的试金石,这也是为什么他们愿意花力气整理这样一份102页的体系化综述。
1.2 综述的定位与结构拆解
102页听起来挺吓人,但结构其实非常清爽,大体上是三段式:基础篇、进展篇、趋势篇。基础篇讲的是Transformer架构如何在CV和NLP两条线合流,预训练范式怎么从单模态迁移到多模态;进展篇按时间线梳理了CLIP、ALIGN、BEiT、SimVLM、CoCa、Flamingo、BLIP、BLIP-2等几代代表工作,每一代解决什么问题、代价是什么、留下了什么遗产;趋势篇则聚焦多模态大模型、视频语言理解、统一接口、评测体系这些正在发生的变化。
我读下来的感受是,这份综述更接近“产业视角的技术地图”。它不是把论文摘要抄一遍就完事,而是会告诉你:某个模型适合做检索但因为双塔结构牺牲了深度交互;某个模型理解能力强但生成能力弱;某个模型效果好但训练成本高到中小团队无法复现。读者可以作为“投资报告”来读,关注每条技术路线背后的取舍逻辑,而不是只记论文名字。我见过不少同学把CLIP和BLIP当成同一种东西,其实它们在任务范式、架构形态、适用场景上的差别非常大,这份综述对这类混淆有很好的纠偏作用。
2. VLP的技术底座:任务、架构、数据三条线
2.1 预训练任务的三代变迁
VLP的演进,本质上可以看成预训练任务设计的演进。第一代是对比学习范式,代表工作是CLIP和ALIGN。设计思路很直接:给定一批图文对,图像编码器和文本编码器把各自输入映射到同一个向量空间,然后让匹配的图文对在空间里距离更近,不匹配的距离更远。训练损失通常用InfoNCE,核心是算一个batch内所有图像和文本两两之间的相似度矩阵,对角线是正样本,其余是负样本,然后对行和列分别做softmax交叉熵。
我最初看对比损失总觉得有点玄,后来用一句话给自己解释明白了:它本质上是在做一个超大分类问题,每一张图要从batch里的文本中找到唯一正确的那一句。所以batch size对对比学习极其重要,CLIP原始实验里batch size拉到三万级别,就是因为负样本越多,模型越能学到细粒度的语义差别。代码层面核心逻辑其实很简洁:
import torch import torch.nn.functional as F def contrastive_loss(image_embeds, text_embeds, temperature=0.07): # image_embeds: [batch, dim] 图像编码器输出 # text_embeds: [batch, dim] 文本编码器输出 # 归一化到单位向量空间 image_embeds = F.normalize(image_embeds, dim=-1) text_embeds = F.normalize(text_embeds, dim=-1) logits = image_embeds @ text_embeds.T / temperature # [batch, batch] labels = torch.arange(logits.shape[0], device=logits.device) # 图像侧损失 + 文本侧损失,两边都约束 loss_i = F.cross_entropy(logits, labels) loss_t = F.cross_entropy(logits.T, labels) return (loss_i + loss_t) / 2第二代是掩码重建和生成范式,代表工作是VLMo、METER、SimVLM。思路从BERT那里借来的:把输入图像的一部分patch遮住,或者把文本token遮住,让模型根据可见部分还原被遮掉的内容。这种任务能让模型学到更深层的细粒度关联,而不是像对比学习那样只关注全局匹配。SimVLM更进一步,直接把预训练任务统一成了prefix language modeling,让模型自己生成被掩码的文本序列,相当于把多模态预训练接到了生成式框架里来。
第三代是统一生成范式,代表工作是CoCa和BEIIT-3。它们把对比学习和生成式目标捏进同一个模型,一个视觉编码器接两个头,一个头做对比学习用于检索,一个头做生成用于描述或问答。这个方向的本质是:既然检索和生成在实际业务里都要用,何必训练两套模型。用一个模型,多个任务头共享底层表征,效果不仅没降,反而因为多任务学习的正则在很多下游任务上表现更好。
2.2 单流与双流架构的取舍
预训练任务定完之后,下一个关键决策是模型架构选单流还是双流。这个选择题直接决定你的模型适合什么下游任务,不能拍脑袋。
双流架构的代表是CLIP。图像和文本各自走独立的编码器,只在最后算相似度时做一次交互。优点非常明显:两个编码器可以独立产出特征并提前索引,在线推理时文本特征预计算好,图像特征实时抽取,然后交给向量检索系统,吞吐量很高。适合大规模图文检索、相似度计算、召回场景。缺点也明显:文本和图像的交互太浅,模型能回答“这俩像不像”,但回答不了“图里那只狗是什么颜色”,因为细粒度推理需要视觉和文本在token级别深层交互。
单流架构的代表是VisualBERT、ViLT这类模型。图像token和文本token拼接后一起送进同一个Transformer encoder做多层自注意力交互,图文之间的信息可以充分融合。在VQA、视觉推理这类细粒度任务上优势明显。代价是每次推理都要把图文对拼一起重新算一遍前向,不太好做向量化预计算,计算成本高,不适合海量候选的召回场景。
后来逐渐出现混合架构。BLIP的MED架构值得单独说:它设计了三个功能不同的encoder,一个负责理解、一个负责检索、一个负责生成,但共享大部分参数。Flamingo则走另一条路,用Perceiver重采样器压缩图像特征,再插入到语言模型的交叉注意力层里,相当于给纯文本大模型装了一双可以随时睁开的眼睛。这类架构的巧思在于:不改变原有语言模型的结构,只通过外围模块注入视觉信息,所以能直接借用语言模型强大的推理和生成能力。读综述时看到这里,我的感受是架构层面的争议已经不再是单流还是双流,而是怎么在效率和交互深度之间找平衡点。
2.3 数据工程才是VLP的隐形护城河
大量文章讲VLP会聚焦在模型结构上,但我自己实际做下来,最大的感受是数据工程才是真正的隐形护城河。CLIP用了4亿图文对,ALIGN更是拉到18亿,很多人以为这就是“爬得多”,实际上数据清洗策略才是拉开差距的关键。
工业界一个很常见的数据清洗流水线是:先做文本语言过滤,只保留目标语言内容,再通过OCR抽取图像中的文字,剔除那些“图里全是字但文本描述对不上”的样本,接着用CLIP或者其他模型算一遍图文相似度,把相似度过低的噪声样本直接丢掉,最后做近似去重。每一步都会淘汰大量数据,最终留下来高质量子集可能只有原始数据的30%左右。数据质量对下游zero-shot效果的影响,经常比模型参数规模还大,我在实际项目中把同样的模型换到清洗前后的两版数据上训练,zero-shot准确率可以差出七八个点,这个差距不是靠调参能追回来的。
训练细节上还有几个容易被忽略的地方。分辨率会影响图像编码器提取细节的能力,CLIP训练时用了数据增强和随机裁剪,后来很多工作发现固定分辨率到224或者336各有利弊。温度系数也值得单独说,对比损失里的temperature控制了相似度分布的平滑程度,温度太高区分度不够,温度太低训练容易震荡,通常从0.07附近开始调。优化器、学习率调度、梯度裁剪这些细节,综述里没有展开讲,但实际复现时往往就是这些地方决定你能否训出可用的模型。
对于中小团队,我不建议一上来就冲几十亿数据。先把开源数据利用好,CC3M、CC12M、LAION-400M这些组合起来足够验证方案。关键是把清洗流程建起来,把数据配比调好,等方案跑通再考虑扩大数据规模。这个路线我走过,踩过不少坑,后面实操部分细说。
3. 从综述到落地:怎么把VLP思路用到自己的场景
3.1 落地先定范式:你需要的到底是哪种能力
读完整份综述之后,回到自己的业务场景,第一个动作不是打开代码仓库,而是先回答一个问题:我的场景需要哪种能力?这个问题的答案直接决定模型选型方向。
我习惯把VLP落地场景粗分成四类。检索匹配类,例如商品图搜同款、素材库图文检索,需要的是对比式双流模型,CLIP或其改进版本是最稳妥的选择。分类识别类,例如图片自动打标、违规内容粗筛,这类用zero-shot分类就能覆盖大部分需求,同样适合CLIP体系,必要时下游微调。细粒度理解类,例如视觉问答、版面分析、图像中的关系抽取,这类需要单流或者像BLIP-2这样的混合架构,因为模型必须看到视觉细节和语言上下文之间的深层关系。内容生成类,例如图像描述、多模态对话,需要生成式架构,CoCa这类统一模型或者接入Flamingo风格的模型是合理选择。
把需求对应到范式之后,再考虑工程约束。显存大小决定你能加载什么规模的模型,在线服务延迟要求决定能不能上几十亿参数的大家伙,数据是否允许出域决定要不要用开源预训练权重还是必须自己从头训。这些约束很多时候比模型效果优先级更高。
| 业务需求场景 | 推荐范式 | 代表模型 | 关键工程注意点 |
|---|---|---|---|
| 大规模图文检索召回 | 双流对比式 | CLIP、ALIGN | 特征向量化后接索引,注意向量检索库的选型和召回率评估 |
| 图片分类/打标/内容粗筛 | 对比式+Zero-shot | CLIP系列 | 类别文本模板设计影响效果,需要构建候选类别提示词集合 |
| 视觉问答/细粒度关系理解 | 单流融合式 | ViLT、BLIP | 推理代价高,优先评估吞吐量是否满足业务SLA |
| 图文生成/多模态对话 | 生成式统一模型 | CoCa、BLIP-2 | 关注生成质量、幻觉控制,需要设计评估集持续观测 |
| 视频-语言任务 | 视频-语言预训练 | VideoCLIP、InternVideo | 时序建模开销大,先抽帧特征再融合是常见降本方案 |
3.2 上手实操:用开源VLP模型做一个Zero-shot分类小工具
我分享一个可以直接跑的实操示例,假设场景是给一批商品图做粗粒度分类,类目有服装、数码、食品、家居四类。用open_clip加载预训练权重,几行代码就能完成:
import torch from PIL import Image import open_clip model, _, preprocess = open_clip.create_model_and_transforms( "ViT-B-32", pretrained="laion2b_s34b_b79k" ) tokenizer = open_clip.get_tokenizer("ViT-B-32") # 候选类别文本要写得让模型容易理解 class_names = ["clothing", "digital products", "food", "home furniture"] prompts = [f"a photo of {name}" for name in class_names] image = preprocess(Image.open("demo.jpg")).unsqueeze(0) with torch.no_grad(): image_features = model.encode_image(image) text_features = model.encode_text(tokenizer(prompts)) image_features /= image_features.norm(dim=-1, keepdim=True) text_features /= text_features.norm(dim=-1, keepdim=True) logits = 100.0 * image_features @ text_features.T probs = torch.softmax(logits, dim=-1) print(dict(zip(class_names, probs.tolist()[0])))这个示例里有几个小细节值得展开。第一,类别文本模板不是随便写的,模板措辞会影响结果,如果模型预训练数据里常见“a photo of something”这种句式,文本侧写成这个模板通常比直接写类名更稳。第二,相似度乘的100相当于温度0.01,属于经验值范围,实际使用时要看特征分布的尺度微调。第三,如果类目很多,比如上百个,建议先把文本特征批量算好存起来,在线推理时只跑图像编码器一次,再做一个矩阵乘,延迟完全可控。
分类场景要微调的话,我试过一个相对稳的方案:冻结图像编码器,只微调文本编码器或者投影层,用很小的学习率,大概1e-5量级,配合类别不均衡采样。最忌讳的是上来就全参数微调,小数据量下非常容易过拟合,而且破坏预训练学到的语义对齐能力,我在早期项目里就吃过这个亏,微调完zero-shot能力肉眼可见地退化。
3.3 我踩过的坑:数据配比、评测和部署
这部分是综述里不会写、但实操中一定会遇到的东西。第一个大坑是数据配比。混合数据集训练时,不同来源的图文对质量差异很大,简单的做法是按数据量比例采样,但这样会让低质量的大数据集压制高质量的小数据集。我后来按“每个数据源单独设定采样权重”来处理,权重和该数据源质量正相关,同时限制每个batch里单一数据源占比不超过40%,效果明显稳定很多。
第二个坑是评测指标被污染。图文检索任务常用Recall@K,但如果你用很大batch的同一批次图文对做评测,模型可能会记住统计规律,导致指标虚高。更隐蔽的问题是Coco这类经典数据集已经被刷得太狠,直接做参考意义在减弱。建议业务场景里构建一份贴合实际分布的评测集,哪怕只有几百条人工标注样本,也比直接套用学术benchmark更能反映真实效果。
第三个坑是部署阶段的特征漂移。线下验证时模型效果不错,上线后发现线上输入图像和训练数据分布差异大,尤其是电商场景,商品图底色、角度、遮挡情况都和自然图片差很多。我的处理办法是灰度阶段持续监控图像特征的分布和检索点击率,用KL散度对比线上特征和线下验证集特征的差异,超过阈值就触发告警。这类能力现在很多特征平台都有,但很多人落地时压根没做这一层。
4. 最新进展与我对未来趋势的判断
4.1 评测体系正在从“刷榜”走向“考逻辑”
综述最后一部分让我印象最深的是评测视角的变化。早期的VLP评测主要看ImageNet zero-shot准确率、COCO Caption的CIDEr分数、Flickr30K检索Recall,这些指标很快被刷到接近饱和,区分度越来越低。最近一年多的趋势是综合评测集的出现,比如多模态大模型之后涌现的MMMU、MMBench、SEED-Bench这类benchmark,开始考察模型的细粒度感知、多步推理、领域知识、中文理解等维度。
这类评测的价值不在于排名,而是逼着从业者思考一个问题:你的模型是真的理解了图文关系,还是仅仅在统计共现?举个例子,早期一些标题生成模型,看到“沙滩”就生成“度假”,看到“领带”就生成“商务”,本质是在套语言先验,根本没有细看图片。新评测把这类错误暴露得很彻底。对工业界的启发是:不要只盯单一指标,要构建多维度评测集,把感知、认知、推理分开测,才能知道模型的长板和短板。
4.2 统一多模态大模型是下一站
从一个更宏观的视角看,VLP正在被吸入一个更大的趋势里,或者说,VLP作为独立研究方向,其边界正在被多模态大模型吞并。传统VLP关注的是“如何让视觉特征和文本特征对齐”,而现在的多模态大模型关心的是“如何让模型基于视觉输入进行复杂推理并生成动作”,典型代表就是LLaVA、Qwen-VL、GPT-4V这些路线。
这种路线的核心做法是:用一个轻量视觉编码器抽取图像特征,通过投影层接入一个强大的LLM,让LLM学会理解视觉token并生成自然语言回答。相比经典VLP模型,这类模型的最大突破是继承了LLM的推理能力、世界知识和对话能力。代价是部署成本高,幻觉问题需要额外机制压制。结合微信团队综述里对未来趋势的研判,我认为后续的竞争点会聚焦在三件事上:视觉token的高效压缩,跨模态融合层的轻量化设计,以及评估体系能否跟上模型能力的发展。
视频-语言方向也值得重视。视频多了一维时间结构,任务从静态图文匹配扩展到时序理解、事件推理、音视频联合建模。目前视频语言模型还处在相对早期的阶段,计算开销大、公开高质量数据集少、时间建模方案没有统一答案。如果业务场景涉及视频号和短视频这类富媒体内容,这个方向值得提前布局。
4.3 读102页综述的私藏方法
最后分享一个我自己的阅读方法论。这类长综述,不建议一上来就从头到尾逐字读。我推荐三轮法:第一轮花半小时把所有图表、对比表格、架构图过一遍,建立全局坐标系;第二轮挑和自己工作相关的章节精读,比如我做检索场景就重点读对比学习、双流架构、数据清洗这几块;第三轮回到趋势部分,标记出和自己判断不一致的地方,再有针对性地找原论文对照读。
读的时候我会在手边放一个空白的表格文件,每读到一个模型就记三行:它的核心思路是什么、它的失效场景是什么、如果我要用它会牺牲什么。这三行笔记的价值远大于一堆摘要。遇到不理解的模块,比如Flamingo的Perceiver重采样器,就去翻原论文的实现部分,而不是停留在综述的概括描述里。综述的价值是帮你快速定位关键信息,但替代不了原论文的细节。
一些收尾的心里话
这份综述我前后读了两遍,每次收获不一样。第一次读的时候满脑子是模型和指标,第二遍再读,注意力全在那些“为什么这么选”的取舍逻辑上。我个人在实际项目里的体会是:多模态预训练这个领域更新极快,但底层的几根柱子没有变过——对比学习、生成式预训练、数据质量、架构上的交互深度设计。把这四件事想扎实,后面无论出现多少新模型,你都能快速看懂它到底做了什么改动、值不值得跟进。
实操上的一个小建议是:如果团队刚起步做多模态,不要贪多贪新,先用一个开源的双流模型把图文检索或zero-shot分类的链路跑通,把数据清洗、特征存储、评测回流这套基础设施建好,再逐步尝试更复杂的大模型方案。基础设施的复利效应非常大,而模型本身是可以随时替换的。
《视觉语言预训练》这102页,与其说是一份综述,不如说是一个阶段的快照。每过半年回看一次,对照自己的理解和实践,就会知道在这个快速变化的领域里,你是真在往前走,还是只是在原地刷论文。