第14课结束的时候有个同学在问卷里写了这么一句“视觉模型我们学了检测、分割、跟踪下一步是不是该看看大模型了”我当时只回了一个字是。于是 Course15 被正式排进课表主题就是视觉大模型与多模态理解。这门课面向的群体很明确已经掌握传统视觉任务、但对“预训练-微调”和跨模态建模还比较模糊的算法工程师和研究生目标只有一个把视觉大模型的概念、原理、实验和落地路径一次讲透。这篇内容也不只适合做图像的人做文本、做搜索、做推荐的团队同样可以参考。多模态理解这个方向看起来门槛很高但拆开以后其实就是几件事用什么结构编码图像用什么方式对齐文本怎么把对齐好的表征用到真实任务以及怎么让它稳定上线。把这几个问题搞明白后面再接触生成式多模态、视频理解、端侧多模态都能很快上手。作为一门以实战为主的技术课我的讲法跟大学课堂不太一样。我不会先甩一大堆数学公式而是先讲清楚“为什么这么做”再带你过一遍真实项目的完整流程最后把所有试错过程里踩过的坑摊开讲。这篇文章就是 Course15 的完整复盘你可以把它当成一节课的讲义也可以当成一个多模态项目从 0 到 1 的实践经验清单。1. 视觉大模型到底在解决什么问题1.1 从“看得出”到“看得懂”传统视觉任务都很“老实”分类告诉你是猫还是狗检测给你框出目标分割把每个像素标好。这些任务有一个共同点它们都是特化模型。你做猫狗分类做出再好的权重拿去做医疗影像几乎等于从头学检测器里调好的锚点参数换一个数据集可能就失效。大模型试图解决的就是这口“特化”的气能不能训练一个通用特征提取器不管遇到什么下游任务稍微调整一下就能用。所以在 Course15 里我先把概念掰正视觉大模型不是“一个特别大的分类网络”而是一套“大规模预训练 通用表征 下游任务轻量适配”的范式。它的特征是参数规模大、训练数据大、学习范式从“人工标注”转向了“自监督”和“对比学习”。“看得懂”这三个字是关键。给一张“一个人在咖啡店里用笔记本电脑办公”的图片传统视觉会输出人、杯子、电脑、桌子几个框但大模型的目标是理解这是“办公场景”是“正在进行远程会议”甚至能回答“这个人能不能看到窗外”这种关联性问题。用生活类比解释就是传统视觉像拿尺子量身高能告诉你这个人一米七五而多模态理解像是读一个人的档案你能知道他的职业、性格、最近在忙什么。身高是看得出的档案是需要理解的。两者不是替代关系但一旦进入多模态理解阶段模型就必须建立图像内元素的时空关系和因果推理这让任务定义完全改变。1.2 为什么偏偏是现在才爆发两三年前我们做一个视觉项目标准流程还是“用某个预训练卷积网络做骨干然后接任务头”。那时不是不想做大模型而是三个条件没凑齐数据不够算力太贵预训练方法没找到。现在凑齐了。先说数据互联网上有海量的图文对不需要人工画框写标签天然就有“图片 文字说明”。这种数据虽然嘈杂但数量大足够支撑大规模预训练。再说方法两类自监督范式被验证有效一类是对比学习让模型学会把“同一张图的两种视角”拉近把“不同图片”推开另一类是基于重建的掩码建模把图片一部分遮挡住让模型猜被遮住的内容。这两个范式绕开了“人工标注”这个最大瓶颈。最后是架构。Transformer 把视觉和文本都变成了“序列问题”图片切成 patch 当 token文本按词切 token两种模态第一次可以用同一套框架建模跨模态才有了统一的基础。这也是“多模态理解”能火的底层原因不是模型多了个接口而是底层表征统一了。一个合适的类比以前让模型认识一只猫你要给它看带标签的猫照片现在模型刷了几亿张图不需要标签它自己就总结出“猫都有尖耳朵、圆眼睛、长胡子”这类特征。等到下游任务来的时候它只需要很少的样本就能学会说“这是猫”。这不是模型变聪明了而是学习范式变了。2. 多模态理解视觉与语言之间的桥梁2.1 图文对齐的本质把苹果和“苹果”放进同一个坐标系视觉和文本本身是两种完全不同的信号要让模型理解“图片里的猫”和文字里的“猫”是同一个概念必须让它们在一个共同的表征空间里“见面”。这个空间就是向量空间本质上是把一张图压缩成一个向量把一句话也压缩成一个向量然后让配对图文在向量空间里的距离变近不配对的变远。这就是图文对齐也是多模态理解最基础的一步。实际训练时正样本就是“图 其对应文本”负样本则通常来自同一个 batch 里的其他样本也就是 in-batch negatives不需要额外构造。但这里有个关键问题为什么对比学习里 batch size 要尽量大因为负样本越多模型越难偷懒它不能靠“随机猜”来蒙混过关学出来的表征空间越均匀越不容易出现所有向量挤在一起、区分不开的极端情况。光有大 batch 还不够。在真实业务里随机负样本往往是“苹果图 vs 汽车文本”这种样本太容易区分了模型根本不需要理解语义细节就能做对。真正难的是“印着猫的 T 恤”和“猫”这两个概念。一个是商品一个是动物随机采样时它们很少出现在同一个 batch 里模型就学不到这么细的边界。所以实践上一定要做难负例挖掘人为把相似但不匹配的图文对放进训练数据里逼着模型去理解细粒度差异。为什么不直接做一个图像字幕生成模型让模型把图和文字直接衔接起来因为对齐这件事在不同场景下的需求不一样。双塔结构的优势是检索效率极高适合海量图库的召回而直接生成文本的链路适合内容生成和复杂推理。两者不是谁替代谁而是取舍。2.2 理解任务的三种形态检索、推理、定位多模态理解听起来很玄但落到任务上主要就是三种形态这三种形态我在课程里分别用了一个小实验来演示。第一种是图文检索。给你一句话从图库里找最匹配的图或者给你一张图找最匹配的文本。这适合素材管理、电商搜索、以图搜图等场景。检索任务的难点在于查询语句往往是短促、口语化的比如“蓝色保温杯带杯盖”而图库里的商品标题往往是一长串属性词模型必须学会从长文本里抓出关键属性再跟图片特征对齐。第二种是视觉问答。图像 问题输入给模型模型输出一个答案。比如“这幅图里有几个人”或者“这个人的表情说明他开心吗”这种任务已经跨入推理范畴因为模型不能只看局部特征还要把多个目标的位置关系、甚至人的表情和场景背景综合起来判断通常需要融合编码器和生成解码器配合完成。第三种是视觉定位。文本描述某个目标模型要在图像中框出或分割出目标。比如“戴红色帽子、站在左边的那个人”模型必须理解“红色帽子”“左边”这些空间属性再回归到像素坐标。自动驾驶和机器人抓取是典型应用场景。这三种任务对视觉表征的精细程度要求完全不同。检索要求整体语义强、粒度适中问答要求跨模态逻辑推理定位则要求像素级空间信息不丢失。因此一个通用的视觉编码器不能只保留最后一层全局向量实践上我们会从模型的多个中间层抽取特征兼顾高层语义和底层细节。很多项目一开始只取最后一层特征做检索细粒度查询的效果往往很差就是这个原因。3. 核心技术拆解数据、结构、训练策略3.1 数据决定上限先别急着换模型多模态项目的第一个分水岭不在模型而在数据。很多团队一上来就找最新的开源模型下载完就微调结果效果不如预期然后开始怀疑模型能力。实际上多模态模型对数据质量的敏感度远高于传统单模态模型。清洗经验里最重要的一条是去重。训练数据里如果同一张图出现几十次模型会记住这些样本而不是学到通用语义表现就是训练 loss 下降很快但验证指标原地踏步。去重不只是做 MD5 哈希像素级重复会影响加了水印、调过颜色、裁剪过的图片哈希值已经变了需要用特征向量做相似度去重把特征距离较近的样本聚成一簇每簇只保留有代表性的几条。第二个重点是过滤弱相关图文对。很多网页图片的文本描述是“这张图片真好看”“来自某网站的分享”这种文本跟图片内容几乎无关模型从中只能学到“图片和废话对应”对齐效果会严重稀释。过滤方式可以用一个已经训练好的小模型做初筛人工抽检再根据阈值调整。第三个重点是难负例这是业务微调里收益最高的一步。举个例子如果业务是电商商品检索正例是“带杯套的保温杯”图片和文本难负例就要包括“没有杯套的保温杯”“杯套单独在售的图片”“相似品牌但不同型号的保温杯”。模型在这种数据上才会被迫去理解“有没有杯套”这个属性。有一个误区是觉得数据越多越好。我在若干次实验中得到的结论是5000 对高质量、难例充足的微调数据效果往往好于 5 万对弱相关数据。数据质量是一切效果的上限模型结构只是逼近这个上限的手段。这个道理很像做饭食材不新鲜菜谱再讲究也做不出好菜。3.2 模型结构上的几个关键设计编码器、融合层、损失函数视觉大模型的底层结构选择直接决定了后续所有工作的复杂度。视觉编码器主要有两条路线一条是基于卷积网络的骨干保留较强的局部先验和分辨率扩展能力工程部署比较成熟另一条是纯 Transformer 结构用自注意力建模全局依赖长距离关系处理得更干净但计算量大、显存占用高。选哪条路取决于你的数据量和推理硬件并没有绝对优劣。多模态融合是另一个容易踩坑的地方。双塔结构把图像和文本各自编码最后只算相似度结构简单、检索效率高但缺点是图文之间的深层交互不够只能做“像不像”的判断难以做“为什么像”的推理。融合编码器则把图文 token 拼在一起过 Transformer交互充分但推理慢、显存占用高。工程上最常用的折中方案是“双塔召回 融合重排”先用双塔结构快速过滤出几百个候选再用单塔结构对候选做精细打分既保证了速度又提高了精度。损失函数的选择也常被忽略。检索任务用对比损失问答生成类任务用自回归的交叉熵损失。一个常见误区是当训练数据同时包含检索和问答任务时有团队把两类损失简单相加结果两个任务都学不好。正确做法是多任务平衡可以给不同损失分支设置可学习的权重也可以手动调整不同分支的学习率让模型在预训练特性不被破坏的前提下慢慢偏向新任务。3.3 训练参数的实操经验学习率、分辨率、混合精度微调视觉大模型不是把学习率设成 0.001 就能跑通的尤其是同时训练两个模态时不同模块的合理学习率可能差一个数量级。下面这张表是我在课程实验里反复验证过的一套初始策略可以直接抄作业参数建议值或策略原因骨干网络学习率1e-5 到 5e-5预训练权重已经很成熟学习率过大会破坏已有表征融合层/新模块学习率1e-4 到 3e-4新初始化的参数需要更大的更新幅度才能快速收敛输入分辨率224/336 起步微调阶段可尝试 448大分辨率有助细粒度识别但显存和耗时也同步翻倍对比学习 batch size至少 256负样本数量不够时表征容易坍缩收敛空洞梯度裁剪1.0防止图文两个编码器更新方向冲突导致的梯度爆炸混合精度bf16/amp显存减半训练速度提升明显但损失函数出现 NaN 时要检查关于分辨率值得多说一句。很多人以为把输入图片放大模型就能看得更细于是无脑调到 512、640结果显存爆了、训练也变慢了。提高分辨率的同时往往需要调整图像切块的大小或对位置编码做插值否则模型会“水土不服”。在课程实验里把分辨率从 224 提升到 336细粒度检索 Recall1 提升了约 5 个点再提到 448提升就只有 1 个点训练耗时却翻倍。收益递减很明显要根据业务需求决定要不要冲这个性价比。4. 从课程实验到真实项目落地一次完整的微调过程4.1 场景与数据准备给商品图做语义搜索为了演示从理论到落地的完整链路我在课程里设计了一个模拟项目某电商平台的素材库需要支持“带杯套的保温杯”“绿色复古相机”“户外折叠椅”这一类细粒度描述检索。这类查询用传统文本搜索做不了因为商品标题里可能根本没有“杯套”两个字必须靠视觉理解来匹配。数据集准备分三步走。第一步从商品库里筛选 5000 对图文文本由运营团队按统一模板生成要求必须包含颜色、材质、功能、场景四类属性比如“带杯套的黑色 304 不锈钢保温杯适合户外徒步使用”。模板化文本的好处是训练时减少了语言多样性带来的扰动让模型把注意力集中在视觉属性上。第二步是难负例挖掘。我把“带杯套的保温杯”和“不带杯套的保温杯”“杯套单独在售图”全部放进同一个负例集合里确保模型每次都能看到“差一点点”的样本。这一步流程上并不复杂难点在于运营团队一开始不理解为什么要这样做他们觉得“这不是同一件商品吗为什么要当负样本”我需要解释模型不是一个搜索引擎它需要理解属性边界而属性边界只能靠负例划出来。第三步是划分训练集和验证集。我按商品类目划分而不是按图片随机划分。如果同一件商品的多张图片同时出现在训练和验证集里模型很容易“记住”这件商品验证指标虚高上线后立刻现原形。这一步很多人会忽略等上线效果掉下来了才回头找原因。4.2 五步微调法从加载权重到上线整个微调流程我总结成五步每一步都有实际意义不是走形式。第一步加载预训练权重。这一步的第一件事不是直接训练而是打印各层参数名和结构跟预训练权重逐一对上。很多报错都来自权重名称不匹配、层名带前缀不带前缀的差异花十分钟核对结构能省掉后面好几个小时的排查。第二步冻结与解冻策略。我先冻结整个视觉编码器主干只训练文本塔和最后面的投影层。这样做的好处是显存占用低、训练速度快而且预训练视觉特征不会在初期被噪声数据带偏。等 loss 下降到平稳后再解冻视觉编码器的最后两层用极小的学习率做二次微调。第三步数据加载与难负例构造。我在每个 batch 内不仅放正样本还人为把难负例插进去。实现细节是负样本图文对和正样本图文对在加载时要有标识loss 计算时不能把正样本误当负样本。难负例比例一般控制在负样本总量的 20% 到 30%太少没效果太多模型会变得过于保守把同一类物品的全部图片都判定为不匹配。第四步训练与验证。我每隔固定步数保存一个检查点并且在保存后用固定的查询集合做验证不要每次随机抽查询否则不同检查点之间的指标没有可比性。主指标用 RecallK同时观察图文相似度分布的均值和方差防止模型把所有样本的相似度都推到同一个值。第五步模型导出与部署。我们方案的核心是先导出双塔模型的两个推理服务一个向量化图片一个向量化文本然后把图片向量全部入库查询时用文本向量做向量检索召回再用融合层对召回结果做重排。这五个步骤缺一不可尤其是最后的重排这一步是细粒度精度的最后保障。4.3 效果评估微调前后到底差多少在模拟项目里我用同一套评估集合对比了微调前后的效果四项指标全部有提升指标微调前微调后变化整体图文检索 Recall142.6%61.3%18.7%细粒度属性查询颜色、材质28.4%55.2%26.8%相似商品区隔有无杯套31.0%57.5%26.5%检索结果平均相关度0.680.810.13可以看到细粒度属性查询的提升幅度远大于整体检索这正是难负例和模板化文本带来的。它说明模型真正开始“关注”区隔细节而不是只凭整体构图做匹配。评估时不能只看 Recall1。真实业务里用户可能点第三、第四个搜索结果所以我会同时看 Recall5、Recall10 和 MRR。一个比较隐蔽的问题是微调后模型的相似度分数整体被“拉宽”了导致原本阈值 0.5 可以用的场景全部失效所以调完模型后阈值也要重新标定这个细节会在上线时体现出来。5. 踩坑实录视觉大模型微调中的五个经典问题5.1 loss 不下降 / 难以收敛这种问题出现时先别急着改模型结构按顺序排查数据、参数、损失函数。我见过太多人一看到 loss 不动就开始换网络结果换了三次还是那个样子。第一个检查点是数据。图文对是否真的匹配文本是不是过于模板化比如每一句都是“图上有某某某某很漂亮”这种句子区分度太低模型根本不知道要学什么。第二个检查点是 loss 曲线形态。如果 loss 在几十步内直接降到接近零多半是负样本出了问题模型找到了比理解语义简单得多的捷径如果 loss 在一个高处震荡不降通常是正负样本构造有问题尤其是难负例中混入了“伪负例”本来该是正样本的图文对被当成负样本模型每次看到都一脸困惑。还有一个很容易被忽略的参数是温度系数。温度太小模型会被负样本逼得过紧训练不稳定温度太大正负样本的分数差异被压平模型失去学习动力。我们实际调参时把温度从 0.05 调到 0.2效果经常天差地别。5.2 模型“幻觉”严重让它承认不知道在图文检索里幻觉问题还不明显一旦进入视觉问答和多模态生成模型就会一本正经地描述图里不存在的东西。比如给一张只有一杯咖啡的桌面图问“桌上有笔记本电脑吗”模型可能回答“有电脑放在咖啡杯旁边”。幻觉的根源有两层。第一层是训练数据里有图文不一致的样本比如文本描述写得很丰富图片里的信息根本对应不上模型学到了“只要句式像就可以生成”。第二层是解码时的过度自信模型宁可生成有信息量的错误答案也不愿意说“不知道”。解决手段里最立竿见影的不是换更大的模型而是数据清洗和负向指令。数据清洗时做图文一致性校验把明显不一致的样本剔除。训练时加入大量“无法回答”样本问题跟图片无关时标准答案直接是“图中未出现相关信息”。我在实验中发现给推理提示词加上“如果图中没有相关内容必须直接回答未在图中出现”这句话能显著降低幻觉率。这个操作成本极低效果却非常明显。5.3 同义词与多义词为什么搜“跑鞋”找不到“运动鞋”图文对齐依赖训练语料里的用词分布。如果预训练语料中“跑步鞋”反复出现“运动鞋”几乎没有那模型可能没学会两者是同一个概念的两种叫法。微调时如果业务数据里只用“跑鞋”一种说法即便模型已经把图编码得很好用户查询“运动鞋”时匹配度依然偏低。解决同义词问题最直接的方法是构建同义词词典在训练时对文本做同义词替换增强。简单来说把“跑鞋”替换成“运动鞋”“跑步鞋”“慢跑鞋”作为新的文本输入模型就会知道这些词指向同类物体。这个增强成本很低但要注意不能把所有同义词全部随机替换否则会破坏模板文本的统一性。多义词要复杂得多。“苹果”既可能是水果也可能是电子品牌甚至可能是一家公司名。图文模型没法只看一个词判断含义必须依赖上下文。我们在实际业务里的做法是对查询做一次意图分类把“苹果”这类词带上的语境信息写进查询模板比如“苹果水果”“苹果手机壳”再送入检索模型。5.4 灾难性遗忘微调后旧能力没了多模态微调最常见的隐性问题是模型在业务数据上变好了但在通用场景上明显退化。我们曾经在商品图上微调后模型对自然风景图的检索能力急剧下降这不是个别现象而是微调数据分布跟预训练语料差异太大导致的灾难性遗忘。对策有三种。第一种最简单也最有效在微调数据里按比例混入一部分通用图文数据比如 20% 通用数据 80% 业务数据模型在学业务特征的同时依然能维持住原有语义空间。第二种是参数冻结只解冻最后几层从源头减少权重波动。第三种是蒸馏式回放用微调前模型对通用数据产生的输出来约束微调后模型的输出二者差异过大就增加惩罚。我强烈建议从第一种和第二种做起。它们对结果的影响最可控调试成本低。等团队资源充裕了再考虑引入持续学习框架但那是锦上添花不是必需品。5.5 显存与延迟双塔模型也要上量化很多人以为双塔模型很轻其实视觉编码器和文本编码器加起来仍然可能占几个 GB 显存。尤其在生产环境里图片推理要走整条预处理链路输入尺寸一大GPU 吞吐立刻下降。我们实测下来448×448 的图过视觉编码器单张耗时几十毫秒起每秒吞吐只有二三十张这在电商图库规模下完全不够用。解决方案是三步第一步把图像编码器和文本编码器分别部署、分别扩缩容避免互相拖累第二步导出 ONNX 或 TensorRT 格式开启动态 batch把 GPU 利用率提上去第三步做 INT8 量化这步通常会让 Recall10 掉 1 到 2 个点但显存可以减少一半以上工程收益非常大。量化时有一个经验先量化融合层和注意力层保留视觉编码器较高精度因为视觉特征的冗余度相对更高对量化更敏感。如果量化后出现明显的指标抖动可以用少量校准数据重新统计各层激活值的分布让量化参数更贴近真实推理时的数值范围。6. 一些可复用的资源和建议6.1 数据从哪来公开数据集与自建数据的取舍公开图文数据集能快速验证整套 pipeline适合课程学习和原型验证。但公域数据跟真实业务场景通常有偏差噪声也不小所以如果你做的是某个垂直领域至少要留出两周时间去自建数据。自建数据时标注规范要提前写清楚。比如“带杯套的保温杯”杯套具体是指什么硅胶套算不算包装盒上的保温杯带杯套算不算这些问题不写清楚标注人员就会按各自理解标数据一致性崩了再好的模型也救不回来。规范写好后建议做双人抽检抽检比例不低于 10%。预算有限时优先做难负例而不是一味增加正例。5000 对带高质量难负例的数据效果大概率好于 20000 对只做简单清洗的数据。这个反直觉的结论已经被我的多个项目反复验证过。6.2 团队怎么协作算法、标注、评测三线并行多模态项目不适合算法工程师单打独斗。我在课程里反复强调一个原则评测集先定标注规范先写bad case 复盘会每周开。评测集没有定下来后面所有调参都是盲调标注规范不写清楚数据质量不可控bad case 不复盘问题只会反复出现。算法团队内部还需要有一个懂向量检索的人。模型只是决定了特征精度最后能不能流畅跑起来取决于向量检索链路。很多人把精力全放在模型上最后发现瓶颈在召回策略、索引参数甚至只是向量归一化的方式不对。6.3 学习路线别一上来就碰生成式如果你是从传统视觉转过来的学习顺序相当重要。我的建议是先补 Transformer 基础搞清楚自注意力、位置编码这些底子然后跑通一个图文双塔检索项目掌握对比学习和向量检索再做一个视觉问答的小型生成项目理解解码器和损失函数怎么配合最后才碰多模态大模型的微调和量化。不要一上来就追各种最新模型。基础链路没打通时换再新的模型都只是把 bug 从 A 搬到了 B。这一课之所以叫 Course15就是因为前 14 课已经把卷积、Transformer、检测、分割这些地基都打完了。地基够深多模态大模型这栋楼才立得稳。每次上完这一课我最后都会讲同一句话多模态理解这个方向模型结构带来的红利在快速缩小真正的区分度在数据和对业务的理解上。你自己动手跑一遍把双塔模型微调好再让它去回答一个具体业务问题这种“预训练通用能力 领域数据微调”的组合拳才是大多数团队真正用得上的东西。如果你也准备开这个坑建议从小数据、小模型、小场景起步先跑通链路再谈规模。你会发现原来视觉大模型不是玄学它就是一条需要耐心铺的路。
阅读完成 · 觉得有帮助?