前面已经掌握了RAG和微调,那多模态就是技术栈的自然延伸。简单来说,多模态就是让模型能够理解和处理多种类型的数据——文本、图像、音频、视频等,并且能在这些模态之间建立联系。这不是简单地把不同模型拼在一起,而是要让模型真正理解"一张猫的图片"和"cat"这个词描述的是同一个概念。

核心概念与架构设计

多模态模型的关键在于如何将不同模态的数据映射到同一个语义空间。最经典的架构是双塔模型(Dual Encoder),比如CLIP就是这个思路的代表作。

它用一个图像编码器(通常是Vision Transformer)和一个文本编码器(通常是Transformer)分别处理图像和文本,然后通过对比学习让相关的图文对在嵌入空间中距离更近。训练目标很直接:一个batch里如果有N对图文数据,那每张图片应该和它对应的文字最相似,和其他N-1个文字都不相似。这种方法的优势是可扩展性强,你可以独立地对图像或文本做检索,但缺点是图文之间没有深度交互。

另一种架构是融合编码器(Fusion Encoder),比如VisualBERT或LXMERT。这类模型会让图像特征和文本特征在transformer层里做交叉注意力,让它们可以互相"看到"对方。这样图像的某个区域可以关注到文本中相关的词,文本的某个词也可以关注到图像的相关区域。这种深度交互对于需要精细理解的任务(比如视觉问答VQA)效果更好,但计算成本也更高,而且不太适合做大规模检索。

现在最流行的是统一的生成式架构,像GPT-4V、Gemini这些。它们本质上是把图像也当作一种"token序列"来处理。具体做法是用一个视觉编码器(比如CLIP的图像编码器)把图像转成一组向量,然后通过一个projector投影到语言模型的embedding空间,之后就可以和文本token一起喂给大语言模型。这样做的好处是可以复用强大的语言模型能力,而且可以处理任意长度的多模态上下文——几张图片穿插着文字提问都没问题。

训练策略与数据处理

多模态训练最关键的是数据对齐。需要大量的配对数据,比如图片-文字对、视频-字幕对、音频-转录对等。但不同来源的数据质量差异很大:网络爬取的alt-text往往很嘈杂,可能只是"image001.jpg"这种无用信息;专门标注的数据质量高但规模小成本大。实践中通常会混合使用,用海量的弱监督数据做预训练(比如从网页爬取的几亿图文对),然后用高质量数据做精调。

训练过程一般分阶段进行。第一阶段是对齐预训练(Alignment Pretraining),目标是让视觉编码器输出的特征能和语言模型的embedding空间对齐。这个阶段通常只训练那个projector,冻结视觉编码器和语言模型,用图像-描述对做训练,让模型学会把图像"翻译"成语言模型能理解的表示。第二阶段是指令微调(Instruction Tuning),这时候会构造各种多模态任务,比如"描述这张图片"、"这张图里有几只猫"、"图中的人在做什么"等等,用这些指令-回答对来教模型理解用户意图。有些工作还会加入第三阶段的强化学习,用人类反馈来进一步优化输出质量。

数据增强在多模态训练中也很重要。对于图像,常规的crop、flip、color jittering都会用,但要注意不能破坏图文对应关系——比如你把图片水平翻转了,如果文字里说"左边有一棵树",那就对不上了。更高级的做法是用文本引导的数据增强,比如如果描述提到"晴天",就增强图片的亮度和对比度;如果提到"雨天",就加一些模糊和暗化。音频数据的增强包括变速、加噪、时域掩码等,但同样要考虑和文本的一致性。

与RAG和微调的结合

既然熟悉RAG,那多模态RAG就是一个自然的扩展方向。传统RAG只检索文本,但很多知识是以图表、图片、视频形式存在的。多模态RAG的核心是要建立跨模态的检索索引。一种做法是用CLIP这样的模型把所有数据(文本、图片、甚至视频帧)都编码到同一个向量空间,然后用户的查询(可以是文本也可以是图片)也编码成向量去检索。比如用户问"如何更换汽车轮胎",系统不仅可以检索到文字教程,还能找到相关的示意图和操作视频。

实现时有几个技术细节要注意。首先是分块策略:文本可以按段落或句子分块,但图像怎么分块?一种方法是提取图像的多个局部特征(比如用目标检测找到图中的物体),为每个局部区域建索引。另一种是为每张图生成详细的文字描述(用图像描述模型),然后对这些描述建索引。视频更复杂,通常会抽取关键帧或者固定间隔采样帧,同时考虑音频转录和字幕信息。

检索到多模态内容后,如何喂给语言模型也有讲究。如果检索到的是图片,你需要确保你的语言模型支持视觉输入,或者把图片转成详细的文字描述再输入。如果检索到的是视频片段,可能需要提取关键帧+音频转录的组合。上下文窗口的管理也更复杂了,因为一张图片可能相当于几百个token,你需要在信息丰富度和成本之间权衡。

在微调方面,多模态微调的挑战在于需要同时优化多个组件。如果你的基座模型是GPT-4V这种闭源API,那只能在prompt层面做优化,也就是少样本学习或者思维链提示。如果是开源模型比如LLaVA,你可以做LoRA这种参数高效微调,只更新一小部分参数。通常的策略是冻结视觉编码器(因为它已经在大规模图像数据上预训练过了),只微调projector和语言模型,或者用LoRA只更新语言模型的一部分层。

针对特定领域做多模态微调时,数据构造是关键。比如你要做医疗影像问答,就需要收集X光片、CT扫描等配上医生的诊断报告。数据可能不需要很多——几千到几万对高质量的领域数据,配合好的基座模型,就能达到不错的效果。你可以让医生写问答对,或者从病历中自动提取"影像-诊断"对,或者用GPT-4这样的强模型对现有数据做改写和扩充。

常见任务与评估方法

多模态模型可以处理很多任务类型。图像描述(Image Captioning)是最基础的,给定图片生成描述性文字。视觉问答(VQA)是给定图片和问题,生成答案,问题可能关于物体("图中有几个人")、属性("天空是什么颜色")、关系("猫在沙发的哪边")或者需要推理("这个人看起来开心吗")。文生图(Text-to-Image)是反向任务,根据文字描述生成图像,这是DALL-E、Stable Diffusion这些模型做的事。还有图像编辑、视频理解、音频-视觉对齐等更复杂的任务。

评估多模态模型比纯文本模型复杂得多。对于生成任务,你不能只看BLEU或ROUGE这种基于n-gram匹配的指标,因为描述同一张图的方式可以千变万化。更好的评估方式包括:CLIPScore(用CLIP模型计算生成文本和图像的相似度)、人工评估(让人类打分判断描述是否准确、流畅)、基于GPT-4的自动评估(让强模型来判断生成质量)。对于检索任务,标准的Recall@K、MRR等指标仍然适用。

对于分类或问答这种有明确答案的任务,可以用准确率评估。但要注意数据集的偏差问题——很多VQA数据集存在语言偏差,模型不看图也能猜对很多答案(比如"有多少"的问题答案经常是"2")。所以要用对抗性的测试集或者需要多步推理的hard cases来真正测试模型能力。

实际应用中的坑和技巧

在实际项目中部署多模态模型,有一些常见的坑要注意。首先是延迟问题:处理一张图片可能需要几百毫秒甚至更久,如果你的应用需要实时响应(比如AR应用),就得做优化,可能需要模型量化、pruning或者用更小的模型。其次是成本:如果你用GPT-4V这种API,每张图片的token消耗是很大的,大规模应用成本会很高。

处理不同分辨率和长宽比的图片也是个挑战。很多模型训练时用的是固定尺寸(比如224x224或336x336),实际应用中图片千奇百怪。简单resize会丢失细节或扭曲画面,更好的做法是用adaptive cropping或者切分成多个patch分别处理。对于文档图片、截图这种包含大量文字的图像,OCR+多模态模型组合使用效果会更好。

多语言和跨文化也是要考虑的。大部分多模态模型都是在英文数据上训练的,处理中文图文对时效果可能打折扣。而且图像的文化含义也不同——同一个手势在不同文化里意思可能完全不同。如果你的应用面向全球用户,需要额外准备多语言的训练数据,或者至少在目标语言上做微调。

最后说一个实用技巧:多模态模型的prompt工程非常重要。对于同一张图片,"描述这张图"和"详细描述这张图片中的所有元素,包括物体、人物、场景、颜色和氛围"会得到完全不同的结果。你可以通过prompt控制输出的详细程度、风格、关注点等。对于复杂任务,可以用思维链(Chain-of-Thought)提示,让模型先分析图像的各个部分,再综合给出答案,这通常能提高准确率。

多模态是个快速发展的领域,新的模型和技术层出不穷。但核心思想是相通的:找到合适的方式把不同模态的信息对齐和融合,让模型能够像人类一样理解这个多彩的世界。结合已有的RAG和微调经验,你完全可以构建出强大的多模态应用。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐